Re: [RFC PATCH 5/5] drm/i915/display: skip HPD polling if PME is supported

[email protected]
Newsgroups org.freedesktop.lists.intel-xe,org.freedesktop.lists.intel-gfx
Message-ID <[email protected]>
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [High] Skipping `intel_hpd_init()` on runtime resume for PME-capable devices leaves hardware HPD interrupts permanently disabled, breaking hotplug detection while the device is awake.
--

--- Patch [5]: [RFC PATCH 5/5] drm/i915/display: skip HPD polling if PME is supported ---
commit f6a80f590c41d181052f2d40a190e9c030e50eb2
Author: Vinod Govindapillai <[email protected]>
drm/i915/display: skip HPD polling if PME is supported

This commit prevents the display driver from enabling HPD polling during
runtime suspend if the device supports PM_PME. It also updates the resume
path to selectively initialize HPD only if polling was actually enabled.

> diff --git a/drivers/gpu/drm/i915/display/intel_display_driver.c b/drivers/gpu/drm/i915/display/intel_display_driver.c
> index 70d112fd4287a..b7e25b7ea32ed 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_driver.c
> +++ b/drivers/gpu/drm/i915/display/intel_display_driver.c

[ ... ]

> @@ -951,10 +956,20 @@ void intel_display_driver_pm_runtime_resume(struct intel_display *display)
>  	 * power well, so hpd is reinitialized from there. For
>  	 * everyone else do it here.
>  	 */
> -	if (!display->platform.valleyview && !display->platform.cherryview) {
> +	if (display->platform.valleyview || display->platform.cherryview)
> +		goto out;
> +
> +	/* For PME capable devices we would not have resorted into HPD polling */
> +	if (intel_hpd_polling_enabled(display))
>  		intel_hpd_init(display);

[Severity: High]
Does skipping intel_hpd_init() here permanently break hardware hotplug
detection for PME-capable devices?

When a PME-capable device enters runtime suspend, it skips
intel_hpd_poll_enable(), so intel_hpd_polling_enabled() will return false. 
On resume, this condition causes intel_hpd_init() to be skipped.

However, looking at intel_hpd_init() in intel_hotplug.c, it does more than
just polling setup. It also programs the hardware registers to re-enable
hardware interrupts:

void intel_hpd_init(struct intel_display *display)
{
    ...
	spin_lock_irq(&display->irq.lock);
	intel_hpd_irq_setup(display);
	spin_unlock_irq(&display->irq.lock);
}

Without calling intel_hpd_irq_setup(), the hardware HPD interrupts will
remain masked. Will any subsequent monitor hotplugs or unplugs that happen
while the device is awake be silently ignored?

> -		intel_hpd_poll_disable(display);
> -	}
>  
> +	/*
> +	 * Regardless of PME capable path, call the HPD polling disable, the
> +	 * poll_init_work, i915_hpd_poll_detect_connectors reprobe catches the
> +	 * hotplug that occurred while suspended
> +	 */
> +	intel_hpd_poll_disable(display);
> +
> +out:
>  	skl_watermark_ipc_update(display);
>  }

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/[email protected]?part=5
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.