[PATCH 22/24] drm/amd/display: Fix HPD after gpu reset

Mario Limonciello mario.limonciello at amd.com
Fri Feb 21 16:34:06 UTC 2025


On 2/21/2025 10:01, Zaeem Mohamed wrote:
> From: Roman Li <Roman.Li at amd.com>
> 
> [Why]
> DC is not using amdgpu_irq_get/put to manage the HPD interrupt refcounts.
> So when amdgpu_irq_gpu_reset_resume_helper() reprograms all of the IRQs,
> HPD gets disabled.
> 
> [How]
> Use amdgpu_irq_get/put() for HPD init/fini in DM in order to sync refcounts
> 
> Reviewed-by: Mario Limonciello <mario.limonciello at amd.com>
> Reviewed-by: Aurabindo Pillai <aurabindo.pillai at amd.com>
> Signed-off-by: Roman Li <Roman.Li at amd.com>
> Signed-off-by: Zaeem Mohamed <zaeem.mohamed at amd.com>

We probably want this one stable too, it's actively got issues in the field.

Cc: stable at vger.kernel.org
Closes: https://gitlab.freedesktop.org/drm/amd/-/issues/3808

> ---
>   .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_irq.c  | 14 ++++++++++++++
>   1 file changed, 14 insertions(+)
> 
> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_irq.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_irq.c
> index 3390f0d8420a..c4a7fd453e5f 100644
> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_irq.c
> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_irq.c
> @@ -894,6 +894,7 @@ void amdgpu_dm_hpd_init(struct amdgpu_device *adev)
>   	struct drm_device *dev = adev_to_drm(adev);
>   	struct drm_connector *connector;
>   	struct drm_connector_list_iter iter;
> +	int i;
>   
>   	drm_connector_list_iter_begin(dev, &iter);
>   	drm_for_each_connector_iter(connector, &iter) {
> @@ -920,6 +921,12 @@ void amdgpu_dm_hpd_init(struct amdgpu_device *adev)
>   		}
>   	}
>   	drm_connector_list_iter_end(&iter);
> +
> +	/* Update reference counts for HPDs */
> +	for (i = DC_IRQ_SOURCE_HPD1; i <= adev->mode_info.num_hpd; i++) {
> +		if (amdgpu_irq_get(adev, &adev->hpd_irq, i - DC_IRQ_SOURCE_HPD1))
> +			drm_err(dev, "DM_IRQ: Failed get HPD for source=%d)!\n", i);
> +	}
>   }
>   
>   /**
> @@ -935,6 +942,7 @@ void amdgpu_dm_hpd_fini(struct amdgpu_device *adev)
>   	struct drm_device *dev = adev_to_drm(adev);
>   	struct drm_connector *connector;
>   	struct drm_connector_list_iter iter;
> +	int i;
>   
>   	drm_connector_list_iter_begin(dev, &iter);
>   	drm_for_each_connector_iter(connector, &iter) {
> @@ -960,4 +968,10 @@ void amdgpu_dm_hpd_fini(struct amdgpu_device *adev)
>   		}
>   	}
>   	drm_connector_list_iter_end(&iter);
> +
> +	/* Update reference counts for HPDs */
> +	for (i = DC_IRQ_SOURCE_HPD1; i <= adev->mode_info.num_hpd; i++) {
> +		if (amdgpu_irq_put(adev, &adev->hpd_irq, i - DC_IRQ_SOURCE_HPD1))
> +			drm_err(dev, "DM_IRQ: Failed put HPD for source=%d!\n", i);
> +	}
>   }



More information about the amd-gfx mailing list