Commit 98c64b33 authored by Maarten Lankhorst's avatar Maarten Lankhorst

lib/igt_kms: Drop all stale events on first commit.

I've been trying to make kms_cursor_legacy work when subtests fail.
Other subtests will start failing too because of expired events or
stale pipe crc. The latter can be resolved in the test, but the former
could affect other tests
Signed-off-by: default avatarMaarten Lankhorst <maarten.lankhorst@linux.intel.com>
[mlankhorst: Change return status to int, so callers can see how many events are swallowed.]
Reviewed-by: Chris Wilson's avatarChris Wilson <chris@chris-wilson.co.uk>
parent 4cd4cc48
......@@ -2943,7 +2943,10 @@ display_commit_changed(igt_display_t *display, enum igt_commit_style s)
output->changed &= 1 << IGT_CONNECTOR_CRTC_ID;
}
display->first_commit = false;
if (display->first_commit) {
igt_display_drop_events(display);
display->first_commit = false;
}
}
/*
......@@ -3024,6 +3027,10 @@ int igt_display_try_commit_atomic(igt_display_t *display, uint32_t flags, void *
if (ret || (flags & DRM_MODE_ATOMIC_TEST_ONLY))
return ret;
if (display->first_commit)
igt_fail_on_f(flags & (DRM_MODE_PAGE_FLIP_EVENT | DRM_MODE_ATOMIC_NONBLOCK),
"First commit has to drop all stale events\n");
display_commit_changed(display, COMMIT_ATOMIC);
igt_debug_wait_for_keypress("modeset");
......@@ -3121,6 +3128,43 @@ int igt_display_commit(igt_display_t *display)
return igt_display_commit2(display, COMMIT_LEGACY);
}
/**
* igt_display_drop_events:
* @display: DRM device handle
*
* Nonblockingly reads all current events and drops them, for highest
* reliablility, call igt_display_commit2() first to flush all outstanding
* events.
*
* This will be called on the first commit after igt_display_reset() too,
* to make sure any stale events are flushed.
*
* Returns: Number of dropped events.
*/
int igt_display_drop_events(igt_display_t *display)
{
int ret = 0;
/* Clear all events from drm fd. */
struct pollfd pfd = {
.fd = display->drm_fd,
.events = POLLIN
};
while (poll(&pfd, 1, 0) > 0) {
struct drm_event ev;
char buf[128];
read(display->drm_fd, &ev, sizeof(ev));
igt_info("Dropping event type %u length %u\n", ev.type, ev.length);
igt_assert(ev.length <= sizeof(buf));
read(display->drm_fd, buf, ev.length);
ret++;
}
return ret;
}
const char *igt_output_name(igt_output_t *output)
{
return output->name;
......
......@@ -365,6 +365,7 @@ int igt_display_commit(igt_display_t *display);
int igt_display_try_commit_atomic(igt_display_t *display, uint32_t flags, void *user_data);
void igt_display_commit_atomic(igt_display_t *display, uint32_t flags, void *user_data);
int igt_display_try_commit2(igt_display_t *display, enum igt_commit_style s);
int igt_display_drop_events(igt_display_t *display);
int igt_display_get_n_pipes(igt_display_t *display);
void igt_display_require_output(igt_display_t *display);
void igt_display_require_output_on_pipe(igt_display_t *display, enum pipe pipe);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment