summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichel Dänzer <michel.daenzer@amd.com>2018-02-15 18:37:09 +0100
committerMichel Dänzer <michel@daenzer.net>2018-02-15 18:37:09 +0100
commitf5ac5f385f41d1547cfd7ccc8bb35a537a8fffeb (patch)
tree9b0d3cfb094953fd76b50981baf17bbb29147a37
parent37c7260bdef3a53b0f0295a531f33938e9aad8cf (diff)
Don't bail from drmmode_set_desired_modes immediately
If we fail to find or set the mode for a CRTC, keep trying for the remaining CRTCs, and only return FALSE if we failed for all CRTCs that should be on. Reviewed-by: Alex Deucher <alexander.deucher@amd.com> Acked-by: Harry Wentland <harry.wentland@amd.com>
-rw-r--r--src/drmmode_display.c34
1 files changed, 25 insertions, 9 deletions
diff --git a/src/drmmode_display.c b/src/drmmode_display.c
index 8ccbf73..a179098 100644
--- a/src/drmmode_display.c
+++ b/src/drmmode_display.c
@@ -2523,6 +2523,7 @@ Bool drmmode_set_desired_modes(ScrnInfoPtr pScrn, drmmode_ptr drmmode,
{
xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn);
AMDGPUEntPtr pAMDGPUEnt = AMDGPUEntPriv(pScrn);
+ unsigned num_desired = 0, num_on = 0;
int c;
for (c = 0; c < config->num_crtc; c++) {
@@ -2557,6 +2558,8 @@ Bool drmmode_set_desired_modes(ScrnInfoPtr pScrn, drmmode_ptr drmmode,
if (!output)
continue;
+ num_desired++;
+
/* Mark that we'll need to re-set the mode for sure */
memset(&crtc->mode, 0, sizeof(crtc->mode));
if (!crtc->desiredMode.CrtcHDisplay) {
@@ -2564,8 +2567,11 @@ Bool drmmode_set_desired_modes(ScrnInfoPtr pScrn, drmmode_ptr drmmode,
pScrn->
currentMode);
- if (!mode)
- return FALSE;
+ if (!mode) {
+ xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
+ "Failed to find mode for CRTC %d\n", c);
+ continue;
+ }
crtc->desiredMode = *mode;
crtc->desiredRotation = RR_Rotate_0;
crtc->desiredX = 0;
@@ -2573,20 +2579,30 @@ Bool drmmode_set_desired_modes(ScrnInfoPtr pScrn, drmmode_ptr drmmode,
}
if (set_hw) {
- if (!crtc->funcs->set_mode_major(crtc, &crtc->desiredMode,
- crtc->desiredRotation,
- crtc->desiredX,
- crtc->desiredY))
- return FALSE;
+ if (crtc->funcs->set_mode_major(crtc, &crtc->desiredMode,
+ crtc->desiredRotation,
+ crtc->desiredX,
+ crtc->desiredY)) {
+ num_on++;
+ } else {
+ xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
+ "Failed to set mode on CRTC %d\n", c);
+ }
} else {
crtc->mode = crtc->desiredMode;
crtc->rotation = crtc->desiredRotation;
crtc->x = crtc->desiredX;
crtc->y = crtc->desiredY;
- if (!drmmode_handle_transform(crtc))
- return FALSE;
+ if (drmmode_handle_transform(crtc))
+ num_on++;
}
}
+
+ if (num_on == 0 && num_desired > 0) {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Failed to enable any CRTC\n");
+ return FALSE;
+ }
+
return TRUE;
}