From: Michel Dänzer <michel.daen...@amd.com>

This might avoid modeset failures in some cases where a CRTC which isn't
used by Xorg was enabled before.

(Ported from amdgpu commit e3aae7a24296f640c0153d1459f3e0820485468a)

Signed-off-by: Michel Dänzer <michel.daen...@amd.com>
---
 src/drmmode_display.c | 33 +++++++++++++++++++++------------
 1 file changed, 21 insertions(+), 12 deletions(-)

diff --git a/src/drmmode_display.c b/src/drmmode_display.c
index 517ec8fbe..d8bb9cc9a 100644
--- a/src/drmmode_display.c
+++ b/src/drmmode_display.c
@@ -2720,24 +2720,33 @@ Bool drmmode_set_desired_modes(ScrnInfoPtr pScrn, 
drmmode_ptr drmmode,
        unsigned num_desired = 0, num_on = 0;
        int c;
 
+       /* First, disable all unused CRTCs */
+       if (set_hw) {
+               for (c = 0; c < config->num_crtc; c++) {
+                       xf86CrtcPtr crtc = config->crtc[c];
+                       drmmode_crtc_private_ptr drmmode_crtc = 
crtc->driver_private;
+
+                       /* Skip disabled CRTCs */
+                       if (crtc->enabled)
+                               continue;
+
+                       drmmode_do_crtc_dpms(crtc, DPMSModeOff);
+                       drmModeSetCrtc(pRADEONEnt->fd,
+                                      drmmode_crtc->mode_crtc->crtc_id,
+                                      0, 0, 0, NULL, 0, NULL);
+                       drmmode_fb_reference(pRADEONEnt->fd,
+                                            &drmmode_crtc->fb, NULL);
+               }
+       }
+
+       /* Then, try setting the chosen mode on each CRTC */
        for (c = 0; c < config->num_crtc; c++) {
                xf86CrtcPtr     crtc = config->crtc[c];
-               drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
                xf86OutputPtr   output = NULL;
                int             o;
 
-               /* Skip disabled CRTCs */
-               if (!crtc->enabled) {
-                       if (set_hw) {
-                               drmmode_do_crtc_dpms(crtc, DPMSModeOff);
-                               drmModeSetCrtc(pRADEONEnt->fd,
-                                              drmmode_crtc->mode_crtc->crtc_id,
-                                              0, 0, 0, NULL, 0, NULL);
-                               drmmode_fb_reference(pRADEONEnt->fd,
-                                                    &drmmode_crtc->fb, NULL);
-                       }
+               if (!crtc->enabled)
                        continue;
-               }
 
                if (config->output[config->compat_output]->crtc == crtc)
                        output = config->output[config->compat_output];
-- 
2.16.1

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to