On 2018-02-15 12:49 PM, Michel Dänzer wrote: > From: Michel Dänzer <michel.daenzer at amd.com> > > 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. > > Signed-off-by: Michel Dänzer <michel.daenzer at amd.com> Thanks. This should help when bandwidth checks in DC fail. Acked-by: Harry Wentland <harry.wentland at amd.com> Harry > --- > > v2: > Print warning messages for trouble with a particular CRTC, and an error > message only when returning FALSE. > > src/drmmode_display.c | 34 +++++++++++++++++++++++++--------- > 1 file changed, 25 insertions(+), 9 deletions(-) > > diff --git a/src/drmmode_display.c b/src/drmmode_display.c > index 8ccbf735d..a17909876 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; > } > >