modesetting: Extract flip failure logging to a single place

Reviewed-by: Eero Tamminen <eero.t.tamminen@intel.com>
Signed-off-by: Povilas Kanapickas <povilas@radix.lt>
This commit is contained in:
Povilas Kanapickas 2021-04-16 16:15:34 +03:00
parent 9adb13e296
commit 9992245c5f

View File

@ -167,7 +167,14 @@ do_queue_flip_on_crtc(modesettingPtr ms, xf86CrtcPtr crtc,
(void *) (uintptr_t) seq); (void *) (uintptr_t) seq);
} }
static Bool enum queue_flip_status {
QUEUE_FLIP_SUCCESS,
QUEUE_FLIP_ALLOC_FAILED,
QUEUE_FLIP_QUEUE_ALLOC_FAILED,
QUEUE_FLIP_DRM_FLUSH_FAILED,
};
static int
queue_flip_on_crtc(ScreenPtr screen, xf86CrtcPtr crtc, queue_flip_on_crtc(ScreenPtr screen, xf86CrtcPtr crtc,
struct ms_flipdata *flipdata, struct ms_flipdata *flipdata,
int ref_crtc_vblank_pipe, uint32_t flags) int ref_crtc_vblank_pipe, uint32_t flags)
@ -177,13 +184,10 @@ queue_flip_on_crtc(ScreenPtr screen, xf86CrtcPtr crtc,
drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private; drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
struct ms_crtc_pageflip *flip; struct ms_crtc_pageflip *flip;
uint32_t seq; uint32_t seq;
int err;
flip = calloc(1, sizeof(struct ms_crtc_pageflip)); flip = calloc(1, sizeof(struct ms_crtc_pageflip));
if (flip == NULL) { if (flip == NULL) {
xf86DrvMsg(scrn->scrnIndex, X_WARNING, return QUEUE_FLIP_ALLOC_FAILED;
"flip queue: carrier alloc failed.\n");
return FALSE;
} }
/* Only the reference crtc will finally deliver its page flip /* Only the reference crtc will finally deliver its page flip
@ -195,24 +199,21 @@ queue_flip_on_crtc(ScreenPtr screen, xf86CrtcPtr crtc,
seq = ms_drm_queue_alloc(crtc, flip, ms_pageflip_handler, ms_pageflip_abort); seq = ms_drm_queue_alloc(crtc, flip, ms_pageflip_handler, ms_pageflip_abort);
if (!seq) { if (!seq) {
free(flip); free(flip);
return FALSE; return QUEUE_FLIP_QUEUE_ALLOC_FAILED;
} }
/* take a reference on flipdata for use in flip */ /* take a reference on flipdata for use in flip */
flipdata->flip_count++; flipdata->flip_count++;
while (do_queue_flip_on_crtc(ms, crtc, flags, seq)) { while (do_queue_flip_on_crtc(ms, crtc, flags, seq)) {
err = errno;
/* We may have failed because the event queue was full. Flush it /* We may have failed because the event queue was full. Flush it
* and retry. If there was nothing to flush, then we failed for * and retry. If there was nothing to flush, then we failed for
* some other reason and should just return an error. * some other reason and should just return an error.
*/ */
if (ms_flush_drm_events(screen) <= 0) { if (ms_flush_drm_events(screen) <= 0) {
xf86DrvMsg(scrn->scrnIndex, X_WARNING,
"flip queue failed: %s\n", strerror(err));
/* Aborting will also decrement flip_count and free(flip). */ /* Aborting will also decrement flip_count and free(flip). */
ms_drm_abort_seq(scrn, seq); ms_drm_abort_seq(scrn, seq);
return FALSE; return QUEUE_FLIP_DRM_FLUSH_FAILED;
} }
/* We flushed some events, so try again. */ /* We flushed some events, so try again. */
@ -220,7 +221,7 @@ queue_flip_on_crtc(ScreenPtr screen, xf86CrtcPtr crtc,
} }
/* The page flip succeeded. */ /* The page flip succeeded. */
return TRUE; return QUEUE_FLIP_SUCCESS;
} }
@ -311,18 +312,34 @@ ms_do_pageflip(ScreenPtr screen,
* may never complete; this is a configuration error. * may never complete; this is a configuration error.
*/ */
for (i = 0; i < config->num_crtc; i++) { for (i = 0; i < config->num_crtc; i++) {
enum queue_flip_status flip_status;
xf86CrtcPtr crtc = config->crtc[i]; xf86CrtcPtr crtc = config->crtc[i];
if (!xf86_crtc_on(crtc)) if (!xf86_crtc_on(crtc))
continue; continue;
if (!queue_flip_on_crtc(screen, crtc, flipdata, flip_status = queue_flip_on_crtc(screen, crtc, flipdata,
ref_crtc_vblank_pipe, ref_crtc_vblank_pipe,
flags)) { flags);
xf86DrvMsg(scrn->scrnIndex, X_WARNING,
"%s: Queue flip on CRTC %d failed: %s\n", switch (flip_status) {
log_prefix, i, strerror(errno)); case QUEUE_FLIP_ALLOC_FAILED:
goto error_undo; xf86DrvMsg(scrn->scrnIndex, X_WARNING,
"%s: carrier alloc for queue flip on CRTC %d failed.\n",
log_prefix, i);
goto error_undo;
case QUEUE_FLIP_QUEUE_ALLOC_FAILED:
xf86DrvMsg(scrn->scrnIndex, X_WARNING,
"%s: entry alloc for queue flip on CRTC %d failed.\n",
log_prefix, i);
goto error_undo;
case QUEUE_FLIP_DRM_FLUSH_FAILED:
xf86DrvMsg(scrn->scrnIndex, X_WARNING,
"%s: queue flip during flip on CRTC %d failed: %s\n",
log_prefix, i, strerror(errno));
goto error_undo;
case QUEUE_FLIP_SUCCESS:
break;
} }
} }