igt/gem_exec_suspend: Check with both cached/uncached objects

Keep an eye on domain tracking for both cached/uncached objects across
suspend.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
This commit is contained in:
Chris Wilson 2016-03-04 20:28:28 +00:00
parent 697c3f5550
commit d8842d385c

View File

@ -30,13 +30,15 @@
#include "igt.h" #include "igt.h"
#include "igt_gt.h" #include "igt_gt.h"
enum mode { #define NOSLEEP 0
NOSLEEP = 0, #define SUSPEND 1
SUSPEND, #define HIBERNATE 2
HIBERNATE, #define mode(x) ((x) & 0xff)
};
static void run_test(int fd, unsigned ring, enum mode mode); #define UNCACHED (0<<8)
#define CACHED (1<<8)
static void run_test(int fd, unsigned ring, unsigned flags);
static void check_bo(int fd, uint32_t handle) static void check_bo(int fd, uint32_t handle)
{ {
@ -51,15 +53,15 @@ static void check_bo(int fd, uint32_t handle)
munmap(map, 4096); munmap(map, 4096);
} }
static void test_all(int fd) static void test_all(int fd, unsigned flags)
{ {
unsigned engine; unsigned engine;
for_each_engine(fd, engine) for_each_engine(fd, engine)
run_test(fd, engine, NOSLEEP); run_test(fd, engine, flags & ~0xff);
} }
static void run_test(int fd, unsigned ring, enum mode mode) static void run_test(int fd, unsigned ring, unsigned flags)
{ {
const int gen = intel_gen(intel_get_drm_devid(fd)); const int gen = intel_gen(intel_get_drm_devid(fd));
const uint32_t bbe = MI_BATCH_BUFFER_END; const uint32_t bbe = MI_BATCH_BUFFER_END;
@ -72,8 +74,8 @@ static void run_test(int fd, unsigned ring, enum mode mode)
"MI_STORE_DATA broken on gen6 bsd\n"); "MI_STORE_DATA broken on gen6 bsd\n");
/* Before suspending, check normal operation */ /* Before suspending, check normal operation */
if (mode != NOSLEEP) if (mode(flags) != NOSLEEP)
test_all(fd); test_all(fd, flags);
gem_quiescent_gpu(fd); gem_quiescent_gpu(fd);
@ -86,6 +88,7 @@ static void run_test(int fd, unsigned ring, enum mode mode)
memset(obj, 0, sizeof(obj)); memset(obj, 0, sizeof(obj));
obj[0].handle = gem_create(fd, 4096); obj[0].handle = gem_create(fd, 4096);
gem_set_caching(fd, obj[0].handle, !!(flags & CACHED));
obj[0].flags |= EXEC_OBJECT_WRITE; obj[0].flags |= EXEC_OBJECT_WRITE;
obj[1].handle = gem_create(fd, 4096); obj[1].handle = gem_create(fd, 4096);
gem_write(fd, obj[1].handle, 0, &bbe, sizeof(bbe)); gem_write(fd, obj[1].handle, 0, &bbe, sizeof(bbe));
@ -134,7 +137,7 @@ static void run_test(int fd, unsigned ring, enum mode mode)
gem_close(fd, obj[1].handle); gem_close(fd, obj[1].handle);
} }
switch (mode) { switch (mode(flags)) {
case NOSLEEP: case NOSLEEP:
break; break;
@ -153,15 +156,15 @@ static void run_test(int fd, unsigned ring, enum mode mode)
gem_quiescent_gpu(fd); gem_quiescent_gpu(fd);
/* After resume, make sure it still works */ /* After resume, make sure it still works */
if (mode != NOSLEEP) if (mode(flags) != NOSLEEP)
test_all(fd); test_all(fd, flags);
} }
igt_main igt_main
{ {
const struct { const struct {
const char *suffix; const char *suffix;
enum mode mode; unsigned mode;
} modes[] = { } modes[] = {
{ "", NOSLEEP }, { "", NOSLEEP },
{ "-S3", SUSPEND }, { "-S3", SUSPEND },
@ -176,8 +179,12 @@ igt_main
for (e = intel_execution_engines; e->name; e++) { for (e = intel_execution_engines; e->name; e++) {
for (m = modes; m->suffix; m++) { for (m = modes; m->suffix; m++) {
igt_subtest_f("%s%s", e->name, m->suffix) igt_subtest_f("%s-uncached%s", e->name, m->suffix)
run_test(fd, e->exec_id | e->flags, m->mode); run_test(fd, e->exec_id | e->flags,
m->mode | UNCACHED);
igt_subtest_f("%s-cached%s", e->name, m->suffix)
run_test(fd, e->exec_id | e->flags,
m->mode | CACHED);
} }
} }