diff options
Diffstat (limited to 'common/recipes-kernel/linux/files/0892-drm-amd-dal-enable-hpd-rx-irqs-earlier-on-resume.patch')
-rw-r--r-- | common/recipes-kernel/linux/files/0892-drm-amd-dal-enable-hpd-rx-irqs-earlier-on-resume.patch | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/files/0892-drm-amd-dal-enable-hpd-rx-irqs-earlier-on-resume.patch b/common/recipes-kernel/linux/files/0892-drm-amd-dal-enable-hpd-rx-irqs-earlier-on-resume.patch new file mode 100644 index 00000000..aaf9e23b --- /dev/null +++ b/common/recipes-kernel/linux/files/0892-drm-amd-dal-enable-hpd-rx-irqs-earlier-on-resume.patch @@ -0,0 +1,109 @@ +From 692020a27565d2c20016de433e81108e48bbdd20 Mon Sep 17 00:00:00 2001 +From: Mykola Lysenko <Mykola.Lysenko@amd.com> +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 <Mykola.Lysenko@amd.com> +Acked-by: Harry Wentland <harry.wentland@amd.com> +Signed-off-by: Alex Deucher <alexander.deucher@amd.com> +--- + 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 + |