diff options
author | Michel Dänzer <michel.daenzer@amd.com> | 2018-02-16 17:15:24 +0100 |
---|---|---|
committer | Michel Dänzer <michel@daenzer.net> | 2018-02-16 17:15:24 +0100 |
commit | e3aae7a24296f640c0153d1459f3e0820485468a (patch) | |
tree | 1f02062426798d300c0ecd8cd7b81d589c5dbf0f | |
parent | f5ac5f385f41d1547cfd7ccc8bb35a537a8fffeb (diff) |
Disable all unused CRTCs before setting desired modes
This might avoid modeset failures in some cases where a CRTC which isn't
used by Xorg was enabled before.
-rw-r--r-- | src/drmmode_display.c | 33 |
1 files changed, 21 insertions, 12 deletions
diff --git a/src/drmmode_display.c b/src/drmmode_display.c index a179098..db4f15c 100644 --- a/src/drmmode_display.c +++ b/src/drmmode_display.c @@ -2526,24 +2526,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(pAMDGPUEnt->fd, + drmmode_crtc->mode_crtc->crtc_id, + 0, 0, 0, NULL, 0, NULL); + drmmode_fb_reference(pAMDGPUEnt->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(pAMDGPUEnt->fd, - drmmode_crtc->mode_crtc->crtc_id, - 0, 0, 0, NULL, 0, NULL); - drmmode_fb_reference(pAMDGPUEnt->fd, - &drmmode_crtc->fb, NULL); - } + if (!crtc->enabled) continue; - } if (config->output[config->compat_output]->crtc == crtc) output = config->output[config->compat_output]; |