[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