xf86-video-amdgpu: Branch 'master'

Michel Dänzer daenzer at kemper.freedesktop.org
Wed Jun 24 19:00:44 PDT 2015


 src/drmmode_display.c |   17 +++++++++++++++--
 1 file changed, 15 insertions(+), 2 deletions(-)

New commits:
commit d94d4a609c593b46ab718544ee24c25530732f22
Author: Michel Dänzer <michel.daenzer at amd.com>
Date:   Thu Jun 11 17:49:33 2015 +0900

    Handle CRTC DPMS from output DPMS hooks
    
    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.
    
    (Ported from radeon commit c4ae0e2cbcc0e2ebf9f13ee92d59b5120254a1dc)
    
    Reviewed-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/src/drmmode_display.c b/src/drmmode_display.c
index 19f0f19..c418dfd 100644
--- a/src/drmmode_display.c
+++ b/src/drmmode_display.c
@@ -235,7 +235,8 @@ int drmmode_crtc_get_ust_msc(xf86CrtcPtr crtc, CARD64 *ust, CARD64 *msc)
 	return Success;
 }
 
-static void drmmode_crtc_dpms(xf86CrtcPtr crtc, int mode)
+static void
+drmmode_do_crtc_dpms(xf86CrtcPtr crtc, int mode)
 {
 	drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
 	ScrnInfoPtr scrn = crtc->scrn;
@@ -296,6 +297,12 @@ static void 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 */
+}
+
 /* TODO: currently this function only clear the front buffer to zero */
 /* Moving forward, we might to look into making the copy with glamor instead */
 void drmmode_copy_fb(ScrnInfoPtr pScrn, drmmode_ptr drmmode)
@@ -959,9 +966,14 @@ static void 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);
 }
 
 static Bool drmmode_property_ignore(drmModePropertyPtr prop)
@@ -1681,6 +1693,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);


More information about the xorg-commit mailing list