summaryrefslogtreecommitdiff
path: root/extra/xf86-video-ati/0001-Handle-CRTC-DPMS-from-output-DPMS-hooks.patch
diff options
context:
space:
mode:
Diffstat (limited to 'extra/xf86-video-ati/0001-Handle-CRTC-DPMS-from-output-DPMS-hooks.patch')
-rw-r--r--extra/xf86-video-ati/0001-Handle-CRTC-DPMS-from-output-DPMS-hooks.patch78
1 files changed, 78 insertions, 0 deletions
diff --git a/extra/xf86-video-ati/0001-Handle-CRTC-DPMS-from-output-DPMS-hooks.patch b/extra/xf86-video-ati/0001-Handle-CRTC-DPMS-from-output-DPMS-hooks.patch
new file mode 100644
index 000000000..31ef61690
--- /dev/null
+++ b/extra/xf86-video-ati/0001-Handle-CRTC-DPMS-from-output-DPMS-hooks.patch
@@ -0,0 +1,78 @@
+From c4ae0e2cbcc0e2ebf9f13ee92d59b5120254a1dc Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Michel=20D=C3=A4nzer?= <michel.daenzer@amd.com>
+Date: Mon, 30 Jun 2014 10:20:12 +0900
+Subject: [PATCH] Handle CRTC DPMS from output DPMS hooks
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+This fixes at least two issues:
+
+The CRTC DPMS hook isn't called after a modeset, so the vertical blank
+interrupt emulation code considered the CRTC disabled after a modeset. As
+a side effect, page flipping was no longer used after a modeset.
+
+This change also makes sure the vertical blank interrupt emulation code
+runs before the hardware CRTC is disabled and after it's enabled from the
+output DPMS hook. The wrong order could cause gnome-shell to hang after
+a suspend/resume and/or DPMS off/on cycle.
+
+Signed-off-by: Michel Dänzer <michel.daenzer@amd.com>
+Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
+---
+ src/drmmode_display.c | 16 ++++++++++++++--
+ 1 file changed, 14 insertions(+), 2 deletions(-)
+
+diff --git a/src/drmmode_display.c b/src/drmmode_display.c
+index bd8e701..c366203 100644
+--- a/src/drmmode_display.c
++++ b/src/drmmode_display.c
+@@ -247,7 +247,7 @@ int drmmode_get_current_ust(int drm_fd, CARD64 *ust)
+ }
+
+ static void
+-drmmode_crtc_dpms(xf86CrtcPtr crtc, int mode)
++drmmode_do_crtc_dpms(xf86CrtcPtr crtc, int mode)
+ {
+ drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
+ ScrnInfoPtr scrn = crtc->scrn;
+@@ -308,6 +308,12 @@ drmmode_crtc_dpms(xf86CrtcPtr crtc, int mode)
+ drmmode_crtc->dpms_mode = mode;
+ }
+
++static void
++drmmode_crtc_dpms(xf86CrtcPtr crtc, int mode)
++{
++ /* Nothing to do. drmmode_do_crtc_dpms() is called as appropriate */
++}
++
+ static PixmapPtr
+ create_pixmap_for_fbcon(drmmode_ptr drmmode,
+ ScrnInfoPtr pScrn, int fbcon_id)
+@@ -973,9 +979,14 @@ drmmode_output_dpms(xf86OutputPtr output, int mode)
+ drmModeConnectorPtr koutput = drmmode_output->mode_output;
+ drmmode_ptr drmmode = drmmode_output->drmmode;
+
++ if (mode != DPMSModeOn && output->crtc)
++ drmmode_do_crtc_dpms(output->crtc, mode);
++
+ drmModeConnectorSetProperty(drmmode->fd, koutput->connector_id,
+ drmmode_output->dpms_enum_id, mode);
+- return;
++
++ if (mode == DPMSModeOn && output->crtc)
++ drmmode_do_crtc_dpms(output->crtc, mode);
+ }
+
+
+@@ -1833,6 +1844,7 @@ Bool drmmode_set_desired_modes(ScrnInfoPtr pScrn, drmmode_ptr drmmode)
+
+ /* Skip disabled CRTCs */
+ if (!crtc->enabled) {
++ drmmode_do_crtc_dpms(crtc, DPMSModeOff);
+ drmModeSetCrtc(drmmode->fd, drmmode_crtc->mode_crtc->crtc_id,
+ 0, 0, 0, NULL, 0, NULL);
+ continue;
+--
+2.0.1
+