To make exploration of different sorting orders and presentation of the engines via the uabi easier, wrap the basic engine registration into a mock (aka standalone) selftest. Signed-off-by: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx> Cc: Tvrtko Ursulin <tvrtko.ursulin@xxxxxxxxx> --- drivers/gpu/drm/i915/gt/intel_engine_user.c | 4 + .../gpu/drm/i915/gt/selftest_engine_user.c | 86 +++++++++++++++++++ .../drm/i915/selftests/i915_mock_selftests.h | 3 +- 3 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 drivers/gpu/drm/i915/gt/selftest_engine_user.c diff --git a/drivers/gpu/drm/i915/gt/intel_engine_user.c b/drivers/gpu/drm/i915/gt/intel_engine_user.c index 7f7150a733f4..15bb05aa1986 100644 --- a/drivers/gpu/drm/i915/gt/intel_engine_user.c +++ b/drivers/gpu/drm/i915/gt/intel_engine_user.c @@ -293,3 +293,7 @@ unsigned int intel_engines_has_context_isolation(struct drm_i915_private *i915) return which; } + +#if IS_ENABLED(CONFIG_DRM_I915_SELFTEST) +#include "selftest_engine_user.c" +#endif diff --git a/drivers/gpu/drm/i915/gt/selftest_engine_user.c b/drivers/gpu/drm/i915/gt/selftest_engine_user.c new file mode 100644 index 000000000000..d11cc6a4af09 --- /dev/null +++ b/drivers/gpu/drm/i915/gt/selftest_engine_user.c @@ -0,0 +1,86 @@ +/* + * SPDX-License-Identifier: MIT + * + * Copyright © 2019 Intel Corporation + */ + +#include "i915_drv.h" + +static void destroy_engines(struct drm_i915_private *i915) +{ + struct intel_engine_cs *engine, *next; + + rbtree_postorder_for_each_entry_safe(engine, next, + &i915->uabi_engines, uabi_node) + kfree(engine); +} + +static int mock_uabi_engines(void *arg) +{ + static const u8 limits[] = { + [RENDER_CLASS] = 1, + [COPY_ENGINE_CLASS] = 1, + [VIDEO_DECODE_CLASS] = I915_MAX_VCS, + [VIDEO_ENHANCEMENT_CLASS] = I915_MAX_VECS, + }; + struct intel_engine_cs *engine; + struct drm_i915_private *i915; + unsigned long num_engines; + unsigned long found; + int c, i; + int err = 0; + + i915 = kzalloc(sizeof(*i915), GFP_KERNEL); + if (!i915) + return -ENOMEM; + + num_engines = 0; + for (c = 0; c < ARRAY_SIZE(limits); c++) { + for (i = 0; i < limits[c]; i++) { + engine = kzalloc(sizeof(*engine), GFP_KERNEL); + if (!engine) + goto err; + + engine->i915 = i915; + + engine->class = c; + engine->instance = i; + + intel_engine_add_user(engine); + num_engines++; + } + } + +err: + /* Check as far as we got up to -- will explode if not quite right */ + intel_engines_driver_register(i915); + + found = 0; + for_each_uabi_engine(engine, i915) { + pr_info("%s (%d, %d) -> [%d, %d]\n", + engine->name, + engine->uabi_class, + engine->uabi_instance, + engine->class, + engine->instance); + found++; + } + if (found != num_engines) { + pr_err("Registered %lu engines; only found %lu uABI engines\n", + num_engines, found); + err = -EINVAL; + } + + destroy_engines(i915); + kfree(i915); + return err; +} + +int intel_engine_user_mock_selftests(void) +{ + static const struct i915_subtest tests[] = { + SUBTEST(mock_uabi_engines), + }; + + return i915_subtests(tests, NULL); +} diff --git a/drivers/gpu/drm/i915/selftests/i915_mock_selftests.h b/drivers/gpu/drm/i915/selftests/i915_mock_selftests.h index aa5a0e7f5d9e..9a2dd8350650 100644 --- a/drivers/gpu/drm/i915/selftests/i915_mock_selftests.h +++ b/drivers/gpu/drm/i915/selftests/i915_mock_selftests.h @@ -14,7 +14,8 @@ selftest(fence, i915_sw_fence_mock_selftests) selftest(scatterlist, scatterlist_mock_selftests) selftest(syncmap, i915_syncmap_mock_selftests) selftest(uncore, intel_uncore_mock_selftests) -selftest(engine, intel_engine_cs_mock_selftests) +selftest(engine_cs, intel_engine_cs_mock_selftests) +selftest(engine_user, intel_engine_user_mock_selftests) selftest(timelines, intel_timeline_mock_selftests) selftest(requests, i915_request_mock_selftests) selftest(objects, i915_gem_object_mock_selftests) -- 2.24.0.rc0 _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx