[igt-dev] [PATCH i-g-t] tests/i915/gem_exec_suspend: Add support for local memory
Zbigniew Kempczyński
zbigniew.kempczynski at intel.com
Thu Nov 25 17:54:04 UTC 2021
On Mon, Nov 22, 2021 at 01:06:28PM +0530, sai.gowtham.ch at intel.com wrote:
> From: Ch Sai Gowtham <sai.gowtham.ch at intel.com>
>
> Add support for local memory region (Device memory)
>
> Signed-off-by: Ch Sai Gowtham <sai.gowtham.ch at intel.com>
> Cc: Zbigniew Kempczyński <zbigniew.kempczynski at intel.com>
> ---
> tests/i915/gem_exec_suspend.c | 186 +++++++++++++++++++++++++++-------
> 1 file changed, 148 insertions(+), 38 deletions(-)
>
> diff --git a/tests/i915/gem_exec_suspend.c b/tests/i915/gem_exec_suspend.c
> index 887bb735..f22981fd 100644
> --- a/tests/i915/gem_exec_suspend.c
> +++ b/tests/i915/gem_exec_suspend.c
> @@ -51,8 +51,19 @@
> #define CACHED (1<<8)
> #define HANG (2<<8)
>
> +static uint32_t batch_create(int fd, uint32_t batch_size, uint32_t region)
> +{
> + const uint32_t bbe = MI_BATCH_BUFFER_END;
> + uint32_t handle;
> +
> + handle = gem_create_in_memory_regions(fd, batch_size, region);
> + gem_write(fd, handle, 0, &bbe, sizeof(bbe));
> +
> + return handle;
> +}
> +
> static void run_test(int fd, const intel_ctx_t *ctx,
> - unsigned engine, unsigned flags);
> + unsigned engine, unsigned flags, uint32_t region);
>
> static void check_bo(int fd, uint32_t handle)
> {
> @@ -67,16 +78,15 @@ static void check_bo(int fd, uint32_t handle)
> munmap(map, 4096);
> }
>
> -static void test_all(int fd, const intel_ctx_t *ctx, unsigned flags)
> +static void test_all(int fd, const intel_ctx_t *ctx, unsigned flags, uint32_t region)
> {
> - run_test(fd, ctx, ALL_ENGINES, flags & ~0xff);
> + run_test(fd, ctx, ALL_ENGINES, flags & ~0xff, region);
> }
>
> static void run_test(int fd, const intel_ctx_t *ctx,
> - unsigned engine, unsigned flags)
> + unsigned engine, unsigned flags, uint32_t region)
> {
> const unsigned int gen = intel_gen(intel_get_drm_devid(fd));
> - const uint32_t bbe = MI_BATCH_BUFFER_END;
> struct drm_i915_gem_exec_object2 obj[2];
> struct drm_i915_gem_relocation_entry reloc;
> struct drm_i915_gem_execbuffer2 execbuf;
> @@ -100,7 +110,7 @@ static void run_test(int fd, const intel_ctx_t *ctx,
>
> /* Before suspending, check normal operation */
> if (mode(flags) != NOSLEEP)
> - test_all(fd, ctx, flags);
> + test_all(fd, ctx, flags, region);
>
> gem_quiescent_gpu(fd);
>
> @@ -113,12 +123,11 @@ static void run_test(int fd, const intel_ctx_t *ctx,
> execbuf.rsvd1 = ctx->id;
>
> memset(obj, 0, sizeof(obj));
> - obj[0].handle = gem_create(fd, 4096);
> + obj[0].handle = gem_create_in_memory_regions(fd, 4096, region);
> if (!gem_has_lmem(fd))
> gem_set_caching(fd, obj[0].handle, !!(flags & CACHED));
> obj[0].flags |= EXEC_OBJECT_WRITE;
> - obj[1].handle = gem_create(fd, 4096);
> - gem_write(fd, obj[1].handle, 0, &bbe, sizeof(bbe));
> + obj[1].handle = batch_create(fd, 4096, region);
> igt_require(__gem_execbuf(fd, &execbuf) == 0);
> gem_close(fd, obj[1].handle);
>
> @@ -222,7 +231,7 @@ static void run_test(int fd, const intel_ctx_t *ctx,
>
> /* After resume, make sure it still works */
> if (mode(flags) != NOSLEEP)
> - test_all(fd, ctx, flags);
> + test_all(fd, ctx, flags, region);
> }
>
> struct battery_sample {
> @@ -250,7 +259,7 @@ static double d_time(const struct battery_sample *after,
> }
>
> static void power_test(int i915, const intel_ctx_t *ctx,
> - unsigned engine, unsigned flags)
> + unsigned engine, unsigned flags, uint32_t region)
> {
> struct battery_sample before, after;
> char *status;
> @@ -270,7 +279,7 @@ static void power_test(int i915, const intel_ctx_t *ctx,
> igt_set_autoresume_delay(5 * 60); /* 5 minutes; longer == more stable */
>
> igt_assert(get_power(dir, &before));
> - run_test(i915, ctx, engine, flags);
> + run_test(i915, ctx, engine, flags, region);
> igt_assert(get_power(dir, &after));
>
> igt_set_autoresume_delay(0);
> @@ -296,6 +305,10 @@ igt_main
> igt_hang_t hang;
> const intel_ctx_t *ctx;
> int fd;
> + char *sub_name;
> + uint32_t region;
> + struct drm_i915_query_memory_regions *query_info;
> + struct igt_collection *set, *regions;
>
> igt_fixture {
> fd = drm_open_driver_master(DRIVER_INTEL);
> @@ -304,20 +317,73 @@ igt_main
> ctx = intel_ctx_create_all_physical(fd);
>
> igt_fork_hang_detector(fd);
> + query_info = gem_get_query_memory_regions(fd);
> + igt_assert(query_info);
> +
> + set = get_memory_region_set(query_info,
> + I915_SYSTEM_MEMORY,
> + I915_DEVICE_MEMORY);
> + }
> +
> + igt_subtest_with_dynamic("basic") {
> + for_each_combination(regions, 1, set) {
> + sub_name = memregion_dynamic_subtest_name(regions);
> + region = igt_collection_get_value(regions, 0);
> + igt_dynamic_f("%s", sub_name)
> + run_test(fd, ctx, ALL_ENGINES, NOSLEEP, region);
> + free(sub_name);
> + }
> }
>
> - igt_subtest("basic")
> - run_test(fd, ctx, ALL_ENGINES, NOSLEEP);
> - igt_subtest("basic-S0")
> - run_test(fd, ctx, ALL_ENGINES, IDLE);
> - igt_subtest("basic-S3-devices")
> - run_test(fd, ctx, ALL_ENGINES, SUSPEND_DEVICES);
> - igt_subtest("basic-S3")
> - run_test(fd, ctx, ALL_ENGINES, SUSPEND);
> - igt_subtest("basic-S4-devices")
> - run_test(fd, ctx, ALL_ENGINES, HIBERNATE_DEVICES);
> - igt_subtest("basic-S4")
> - run_test(fd, ctx, ALL_ENGINES, HIBERNATE);
> + igt_subtest_with_dynamic("basic-S0") {
> + for_each_combination(regions, 1, set) {
> + sub_name = memregion_dynamic_subtest_name(regions);
> + region = igt_collection_get_value(regions, 0);
> + igt_dynamic_f("%s", sub_name)
> + run_test(fd, ctx, ALL_ENGINES, IDLE, region);
> + free(sub_name);
> + }
> + }
> +
> + igt_subtest_with_dynamic("basic-S3-devices") {
> + for_each_combination(regions, 1, set) {
> + sub_name = memregion_dynamic_subtest_name(regions);
> + region = igt_collection_get_value(regions, 0);
> + igt_dynamic_f("%s", sub_name)
> + run_test(fd, ctx, ALL_ENGINES, SUSPEND_DEVICES, region);
> + free(sub_name);
> + }
> + }
> +
> + igt_subtest_with_dynamic("basic-S3") {
> + for_each_combination(regions, 1, set) {
> + sub_name = memregion_dynamic_subtest_name(regions);
> + region = igt_collection_get_value(regions, 0);
> + igt_dynamic_f("%s", sub_name)
> + run_test(fd, ctx, ALL_ENGINES, SUSPEND, region);
> + free(sub_name);
> + }
> + }
> +
> + igt_subtest_with_dynamic("basic-S4-devices") {
> + for_each_combination(regions, 1, set) {
> + sub_name = memregion_dynamic_subtest_name(regions);
> + region = igt_collection_get_value(regions, 0);
> + igt_dynamic_f("%s", sub_name)
> + run_test(fd, ctx, ALL_ENGINES, HIBERNATE_DEVICES, region);
> + free(sub_name);
> + }
> + }
> +
> + igt_subtest_with_dynamic("basic-S4") {
> + for_each_combination(regions, 1, set) {
> + sub_name = memregion_dynamic_subtest_name(regions);
> + region = igt_collection_get_value(regions, 0);
> + igt_dynamic_f("%s", sub_name)
> + run_test(fd, ctx, ALL_ENGINES, HIBERNATE, region);
> + free(sub_name);
> + }
> + }
>
> for (m = modes; m->suffix; m++) {
> igt_subtest_with_dynamic_f("fixed%s", m->suffix) {
> @@ -325,8 +391,12 @@ igt_main
> for_each_ctx_engine(fd, ctx, e) {
> if (!gem_class_can_store_dword(fd, e->class))
> continue;
> - igt_dynamic_f("%s", e->name)
> - run_test(fd, ctx, e->flags, m->mode);
> + for_each_combination(regions, 1, set) {
> + sub_name = memregion_dynamic_subtest_name(regions);
> + region = igt_collection_get_value(regions, 0);
> + igt_dynamic_f("%s-%s", e->name, sub_name)
> + run_test(fd, ctx, e->flags, m->mode, region);
> + }
> }
> }
>
> @@ -335,8 +405,12 @@ igt_main
> for_each_ctx_engine(fd, ctx, e) {
> if (!gem_class_can_store_dword(fd, e->class))
> continue;
> - igt_dynamic_f("%s", e->name)
> - run_test(fd, ctx, e->flags, m->mode | UNCACHED);
> + for_each_combination(regions, 1, set) {
> + sub_name = memregion_dynamic_subtest_name(regions);
> + region = igt_collection_get_value(regions, 0);
> + igt_dynamic_f("%s-%s", e->name, sub_name)
> + run_test(fd, ctx, e->flags, m->mode | UNCACHED, region);
> + }
> }
> }
>
> @@ -345,8 +419,12 @@ igt_main
> for_each_ctx_engine(fd, ctx, e) {
> if (!gem_class_can_store_dword(fd, e->class))
> continue;
> - igt_dynamic_f("%s", e->name)
> - run_test(fd, ctx, e->flags, m->mode | CACHED);
> + for_each_combination(regions, 1, set) {
> + sub_name = memregion_dynamic_subtest_name(regions);
> + region = igt_collection_get_value(regions, 0);
> + igt_dynamic_f("%s-%s", e->name, sub_name)
> + run_test(fd, ctx, e->flags, m->mode | CACHED, region);
> + }
> }
> }
> }
> @@ -356,17 +434,49 @@ igt_main
> hang = igt_allow_hang(fd, 0, 0);
> }
>
> - igt_subtest("hang-S3")
> - run_test(fd, intel_ctx_0(fd), 0, SUSPEND | HANG);
> - igt_subtest("hang-S4")
> - run_test(fd, intel_ctx_0(fd), 0, HIBERNATE | HANG);
> + igt_subtest_with_dynamic("hang-S3") {
> + for_each_combination(regions, 1, set) {
> + sub_name = memregion_dynamic_subtest_name(regions);
> + region = igt_collection_get_value(regions, 0);
> + igt_dynamic_f("%s", sub_name)
> + run_test(fd, intel_ctx_0(fd), 0, SUSPEND | HANG, region);
> + free(sub_name);
> + }
> + }
>
> - igt_subtest("power-S0")
> - power_test(fd, intel_ctx_0(fd), 0, IDLE);
> - igt_subtest("power-S3")
> - power_test(fd, intel_ctx_0(fd), 0, SUSPEND);
> + igt_subtest_with_dynamic("hang-S4") {
> + for_each_combination(regions, 1, set) {
> + sub_name = memregion_dynamic_subtest_name(regions);
> + region = igt_collection_get_value(regions, 0);
> + igt_dynamic_f("%s", sub_name)
> + run_test(fd, intel_ctx_0(fd), 0, HIBERNATE | HANG, region);
> + free(sub_name);
> + }
> + }
> +
> + igt_subtest_with_dynamic("power-S0") {
> + for_each_combination(regions, 1, set) {
> + sub_name = memregion_dynamic_subtest_name(regions);
> + region = igt_collection_get_value(regions, 0);
> + igt_dynamic_f("%s", sub_name)
> + power_test(fd, intel_ctx_0(fd), 0, IDLE, region);
> + free(sub_name);
> + }
> + }
> +
> + igt_subtest_with_dynamic("power-S3") {
> + for_each_combination(regions, 1, set) {
> + sub_name = memregion_dynamic_subtest_name(regions);
> + region = igt_collection_get_value(regions, 0);
> + igt_dynamic_f("%s", sub_name)
> + power_test(fd, intel_ctx_0(fd), 0, SUSPEND, region);
> + free(sub_name);
> + }
> + }
>
> igt_fixture {
> + free(query_info);
> + igt_collection_destroy(set);
> igt_disallow_hang(fd, hang);
> intel_ctx_destroy(fd, ctx);
> close(fd);
> --
> 2.32.0
>
What would you say for something like this:
igt_main
{
const struct {
const char *suffix;
unsigned mode;
} modes[] = {
{ "", NOSLEEP },
{ "-S3", SUSPEND },
{ "-S4", HIBERNATE },
{ NULL, 0 }
}, *m;
struct test {
const char *name;
unsigned int flags;
void (*fn)(int, const intel_ctx_t *, unsigned, unsigned, uint32_t);
} *test, tests_all_engines[] = {
{ "basic", NOSLEEP, run_test },
{ "basic-S0", IDLE, run_test },
{ "basic-S3-devices", SUSPEND_DEVICES, run_test },
{ "basic-S3", SUSPEND, run_test },
{ "basic-S4-devices", HIBERNATE_DEVICES, run_test },
{ "basic-S4", HIBERNATE, run_test },
{ }
}, tests_power_hang[] = {
{ "hang-S3", SUSPEND | HANG, run_test },
{ "hang-S4", HIBERNATE | HANG, run_test },
{ "power-S0", IDLE, power_test },
{ "power-S3", SUSPEND, power_test },
{ }
};
const struct intel_execution_engine2 *e;
igt_hang_t hang;
const intel_ctx_t *ctx;
int fd;
char *sub_name;
uint32_t region;
struct drm_i915_query_memory_regions *query_info;
struct igt_collection *set, *regions;
igt_fixture {
fd = drm_open_driver_master(DRIVER_INTEL);
igt_require_gem(fd);
igt_require(gem_can_store_dword(fd, 0));
ctx = intel_ctx_create_all_physical(fd);
igt_fork_hang_detector(fd);
query_info = gem_get_query_memory_regions(fd);
igt_assert(query_info);
set = get_memory_region_set(query_info,
I915_SYSTEM_MEMORY,
I915_DEVICE_MEMORY);
}
#define subtest_for_each_combination(__name, __ctx, __flags, __fn) \
igt_subtest_with_dynamic(__name) { \
for_each_combination(regions, 1, set) { \
sub_name = memregion_dynamic_subtest_name(regions); \
region = igt_collection_get_value(regions, 0); \
igt_dynamic_f("%s", sub_name) \
(__fn)(fd, (__ctx), ALL_ENGINES, (__flags), region); \
free(sub_name); \
} \
}
#define for_each_ctx_engine_combination(__mode) \
for_each_ctx_engine(fd, ctx, e) { \
if (!gem_class_can_store_dword(fd, e->class)) \
continue; \
for_each_combination(regions, 1, set) { \
sub_name = memregion_dynamic_subtest_name(regions); \
region = igt_collection_get_value(regions, 0); \
igt_dynamic_f("%s-%s", e->name, sub_name) \
run_test(fd, ctx, e->flags, (__mode), region); \
free(sub_name); \
} \
}
for (test = tests_all_engines; test->name; test++)
subtest_for_each_combination(test->name, ctx, test->flags, test->fn);
for (m = modes; m->suffix; m++) {
igt_subtest_with_dynamic_f("fixed%s", m->suffix) {
igt_require(gem_has_lmem(fd));
for_each_ctx_engine_combination(m->mode);
}
igt_subtest_with_dynamic_f("uncached%s", m->suffix) {
igt_require(!gem_has_lmem(fd));
for_each_ctx_engine_combination(m->mode | UNCACHED);
}
igt_subtest_with_dynamic_f("cached%s", m->suffix) {
igt_require(!gem_has_lmem(fd));
for_each_ctx_engine_combination(m->mode | CACHED);
}
}
igt_fixture {
igt_stop_hang_detector();
hang = igt_allow_hang(fd, 0, 0);
}
for (test = tests_power_hang; test->name; test++)
subtest_for_each_combination(test->name, ctx, test->flags, test->fn);
igt_fixture {
free(query_info);
igt_collection_destroy(set);
igt_disallow_hang(fd, hang);
intel_ctx_destroy(fd, ctx);
close(fd);
}
}
Please verify I haven't mixed any flags/modes.
--
Zbigniew
More information about the igt-dev
mailing list