From 692020a27565d2c20016de433e81108e48bbdd20 Mon Sep 17 00:00:00 2001 From: Mykola Lysenko Date: Wed, 9 Mar 2016 01:15:00 -0500 Subject: [PATCH 0892/1110] drm/amd/dal: enable hpd rx irqs earlier on resume This is needed to correctly process MST mode set Signed-off-by: Mykola Lysenko Acked-by: Harry Wentland Signed-off-by: Alex Deucher --- drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm.c | 12 ++++++++--- drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_irq.c | 26 +++++++++++++++++++++-- drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_irq.h | 8 +++---- 3 files changed, 37 insertions(+), 9 deletions(-) diff --git a/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm.c index bf4ad69..c06f126 100644 --- a/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm.c +++ b/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm.c @@ -583,6 +583,15 @@ int amdgpu_dm_display_resume(struct amdgpu_device *adev ) struct drm_connector *connector; int ret = 0; + /* program HPD filter */ + dc_resume(dm->dc); + + /* + * early enable HPD Rx IRQ, should be done before set mode as short + * pulse interrupts are used for MST + */ + amdgpu_dm_irq_resume_early(adev); + /* Do detection*/ list_for_each_entry(connector, &ddev->mode_config.connector_list, head) { @@ -606,9 +615,6 @@ int amdgpu_dm_display_resume(struct amdgpu_device *adev ) drm_kms_helper_hotplug_event(ddev); - /* program HPD filter*/ - dc_resume(dm->dc); - /* resume IRQ */ amdgpu_dm_irq_resume(adev); return ret; diff --git a/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_irq.c b/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_irq.c index 2757c5c..f6d7920 100644 --- a/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_irq.c +++ b/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_irq.c @@ -522,8 +522,30 @@ int amdgpu_dm_irq_suspend( return 0; } -int amdgpu_dm_irq_resume( - struct amdgpu_device *adev) +int amdgpu_dm_irq_resume_early(struct amdgpu_device *adev) +{ + int src; + struct list_head *hnd_list_h, *hnd_list_l; + unsigned long irq_table_flags; + + DM_IRQ_TABLE_LOCK(adev, irq_table_flags); + + DRM_DEBUG_KMS("DM_IRQ: early resume\n"); + + /* re-enable short pulse interrupts HW interrupt */ + for (src = DC_IRQ_SOURCE_HPD1RX; src < DC_IRQ_SOURCE_HPD6RX + 1; src++) { + hnd_list_l = &adev->dm.irq_handler_list_low_tab[src].head; + hnd_list_h = &adev->dm.irq_handler_list_high_tab[src]; + if (!list_empty(hnd_list_l) || !list_empty(hnd_list_h)) + dc_interrupt_set(adev->dm.dc, src, true); + } + + DM_IRQ_TABLE_UNLOCK(adev, irq_table_flags); + + return 0; +} + +int amdgpu_dm_irq_resume(struct amdgpu_device *adev) { int src; struct list_head *hnd_list_h, *hnd_list_l; diff --git a/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_irq.h b/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_irq.h index afedb50..9339861 100644 --- a/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_irq.h +++ b/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_irq.h @@ -109,14 +109,14 @@ void amdgpu_dm_hpd_fini(struct amdgpu_device *adev); * amdgpu_dm_irq_suspend - disable ASIC interrupt during suspend. * */ -int amdgpu_dm_irq_suspend( - struct amdgpu_device *adev); +int amdgpu_dm_irq_suspend(struct amdgpu_device *adev); /** + * amdgpu_dm_irq_resume_early - enable HPDRX ASIC interrupts during resume. * amdgpu_dm_irq_resume - enable ASIC interrupt during resume. * */ -int amdgpu_dm_irq_resume( - struct amdgpu_device *adev); +int amdgpu_dm_irq_resume_early(struct amdgpu_device *adev); +int amdgpu_dm_irq_resume(struct amdgpu_device *adev); #endif /* __AMDGPU_DM_IRQ_H__ */ -- 2.7.4