aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/files/0892-drm-amd-dal-enable-hpd-rx-irqs-earlier-on-resume.patch
diff options
context:
space:
mode:
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.patch109
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
+