[PATCH v2 xf86-video-amdgpu] Don't bail from drmmode_set_desired_modes immediately
Alex Deucher
alexdeucher at gmail.com
Thu Feb 15 20:43:16 UTC 2018
On Thu, Feb 15, 2018 at 12:49 PM, Michel Dänzer <michel at daenzer.net> 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>
Reviewed-by: Alex Deucher <alexander.deucher at amd.com>
> ---
>
> 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;
> }
>
> --
> 2.16.1
>
> _______________________________________________
> amd-gfx mailing list
> amd-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
More information about the amd-gfx
mailing list