summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichel Dänzer <michel.daenzer@amd.com>2018-02-16 17:15:24 +0100
committerMichel Dänzer <michel@daenzer.net>2018-02-16 17:15:24 +0100
commite3aae7a24296f640c0153d1459f3e0820485468a (patch)
tree1f02062426798d300c0ecd8cd7b81d589c5dbf0f
parentf5ac5f385f41d1547cfd7ccc8bb35a537a8fffeb (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.c33
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];