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:
parent
9adb13e296
commit
9992245c5f
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue