Some of the selftests reference a GGTT via to_gt(i915)->ggtt. This is only incidentally correct on single-gt platforms and on MTL and ARL, which have two GTs sharing the same GGTT. In principle, however, different GTs could have different GGTTs associated with them. Have the tests reflect that scenario by switching to a specific gt instead of using the to_gt() macro when appropriate.
Signed-off-by: Krzysztof Niemiec <[email protected]> --- Same separate-GGTT assumption as in patch 3, however, this entire change pertains only to this, so if that assumption can be relaxed, the entire patch can be probably be dropped from the series (maybe save for the engine->gt == gt check, but that can be squashed into another patch then) .../i915/gem/selftests/i915_gem_client_blt.c | 29 +++++-- drivers/gpu/drm/i915/selftests/i915_gem.c | 79 +++++++++++-------- drivers/gpu/drm/i915/selftests/i915_vma.c | 16 +++- 3 files changed, 80 insertions(+), 44 deletions(-) diff --git a/drivers/gpu/drm/i915/gem/selftests/i915_gem_client_blt.c b/drivers/gpu/drm/i915/gem/selftests/i915_gem_client_blt.c index 1d4d7cfb3f9c..938185274e29 100644 --- a/drivers/gpu/drm/i915/gem/selftests/i915_gem_client_blt.c +++ b/drivers/gpu/drm/i915/gem/selftests/i915_gem_client_blt.c @@ -688,11 +688,11 @@ static bool has_bit17_swizzle(int sw) sw == I915_BIT_6_SWIZZLE_9_17); } -static bool bad_swizzling(struct drm_i915_private *i915) +static bool bad_swizzling(struct intel_gt *gt) { - struct i915_ggtt *ggtt = to_gt(i915)->ggtt; + struct i915_ggtt *ggtt = gt->ggtt; - if (i915->gem_quirks & GEM_QUIRK_PIN_SWIZZLED_PAGES) + if (gt->i915->gem_quirks & GEM_QUIRK_PIN_SWIZZLED_PAGES) return true; if (has_bit17_swizzle(ggtt->bit_6_swizzle_x) || @@ -704,7 +704,8 @@ static bool bad_swizzling(struct drm_i915_private *i915) static int igt_client_tiled_blits(void *arg) { - struct drm_i915_private *i915 = arg; + struct intel_gt *gt = arg; + struct drm_i915_private *i915 = gt->i915; I915_RND_STATE(prng); int inst = 0; @@ -712,7 +713,7 @@ static int igt_client_tiled_blits(void *arg) if (GRAPHICS_VER(i915) < 4) return 0; - if (bad_swizzling(i915)) /* Requires sane (sub-page) swizzling */ + if (bad_swizzling(gt)) /* Requires sane (sub-page) swizzling */ return 0; do { @@ -725,6 +726,9 @@ static int igt_client_tiled_blits(void *arg) if (!engine) return 0; + if (engine->gt != gt) + continue; + err = __igt_client_tiled_blits(engine, &prng); if (err == -ENODEV) err = 0; @@ -738,9 +742,18 @@ int i915_gem_client_blt_live_selftests(struct drm_i915_private *i915) static const struct i915_subtest tests[] = { SUBTEST(igt_client_tiled_blits), }; + struct intel_gt *gt; + unsigned int id; + int err; - if (intel_gt_is_wedged(to_gt(i915))) - return 0; + for_each_gt(gt, i915, id) { + if (intel_gt_is_wedged(gt)) + return 0; - return i915_live_subtests(tests, i915); + err = intel_gt_live_subtests(tests, gt); + if (err) + return err; + } + + return 0; } diff --git a/drivers/gpu/drm/i915/selftests/i915_gem.c b/drivers/gpu/drm/i915/selftests/i915_gem.c index ad650f67114a..8f72fd1af8d6 100644 --- a/drivers/gpu/drm/i915/selftests/i915_gem.c +++ b/drivers/gpu/drm/i915/selftests/i915_gem.c @@ -40,9 +40,10 @@ static int switch_to_context(struct i915_gem_context *ctx) return err; } -static void trash_stolen(struct drm_i915_private *i915) +static void trash_stolen(struct intel_gt *gt) { - struct i915_ggtt *ggtt = to_gt(i915)->ggtt; + struct drm_i915_private *i915 = gt->i915; + struct i915_ggtt *ggtt = gt->ggtt; const u64 slot = ggtt->error_capture.start; const resource_size_t size = resource_size(&i915->dsm.stolen); struct rnd_state prng; @@ -74,11 +75,11 @@ static void trash_stolen(struct drm_i915_private *i915) ggtt->vm.clear_range(&ggtt->vm, slot, PAGE_SIZE); } -static void simulate_hibernate(struct drm_i915_private *i915) +static void simulate_hibernate(struct intel_gt *gt) { intel_wakeref_t wakeref; - wakeref = intel_runtime_pm_get(&i915->runtime_pm); + wakeref = intel_runtime_pm_get(>->i915->runtime_pm); /* * As a final string in the tail, invalidate stolen. Under a real S4, @@ -87,9 +88,9 @@ static void simulate_hibernate(struct drm_i915_private *i915) * for automated testing across a cluster), so to simulate the effect * of stolen being trashed across S4, we trash it ourselves. */ - trash_stolen(i915); + trash_stolen(gt); - intel_runtime_pm_put(&i915->runtime_pm, wakeref); + intel_runtime_pm_put(>->i915->runtime_pm, wakeref); } static int igt_pm_prepare(struct drm_i915_private *i915) @@ -99,29 +100,29 @@ static int igt_pm_prepare(struct drm_i915_private *i915) return 0; } -static void igt_pm_suspend(struct drm_i915_private *i915) +static void igt_pm_suspend(struct intel_gt *gt) { intel_wakeref_t wakeref; - with_intel_runtime_pm(&i915->runtime_pm, wakeref) { - i915_ggtt_suspend(to_gt(i915)->ggtt); - i915_gem_suspend_late(i915); + with_intel_runtime_pm(>->i915->runtime_pm, wakeref) { + i915_ggtt_suspend(gt->ggtt); + i915_gem_suspend_late(gt->i915); } } -static void igt_pm_hibernate(struct drm_i915_private *i915) +static void igt_pm_hibernate(struct intel_gt *gt) { intel_wakeref_t wakeref; - with_intel_runtime_pm(&i915->runtime_pm, wakeref) { - i915_ggtt_suspend(to_gt(i915)->ggtt); + with_intel_runtime_pm(>->i915->runtime_pm, wakeref) { + i915_ggtt_suspend(gt->ggtt); - i915_gem_freeze(i915); - i915_gem_freeze_late(i915); + i915_gem_freeze(gt->i915); + i915_gem_freeze_late(gt->i915); } } -static void igt_pm_resume(struct drm_i915_private *i915) +static void igt_pm_resume(struct intel_gt *gt) { intel_wakeref_t wakeref; @@ -129,17 +130,18 @@ static void igt_pm_resume(struct drm_i915_private *i915) * Both suspend and hibernate follow the same wakeup path and assume * that runtime-pm just works. */ - with_intel_runtime_pm(&i915->runtime_pm, wakeref) { - i915_ggtt_resume(to_gt(i915)->ggtt); - if (GRAPHICS_VER(i915) >= 8) - setup_private_pat(to_gt(i915)); - i915_gem_resume(i915); + with_intel_runtime_pm(>->i915->runtime_pm, wakeref) { + i915_ggtt_resume(gt->ggtt); + if (GRAPHICS_VER(gt->i915) >= 8) + setup_private_pat(gt); + i915_gem_resume(gt->i915); } } static int igt_gem_suspend(void *arg) { - struct drm_i915_private *i915 = arg; + struct intel_gt *gt = arg; + struct drm_i915_private *i915 = gt->i915; struct i915_gem_context *ctx; struct file *file; int err; @@ -159,12 +161,12 @@ static int igt_gem_suspend(void *arg) if (err) goto out; - igt_pm_suspend(i915); + igt_pm_suspend(gt); /* Here be dragons! Note that with S3RST any S3 may become S4! */ - simulate_hibernate(i915); + simulate_hibernate(gt); - igt_pm_resume(i915); + igt_pm_resume(gt); err = switch_to_context(ctx); out: @@ -174,7 +176,8 @@ static int igt_gem_suspend(void *arg) static int igt_gem_hibernate(void *arg) { - struct drm_i915_private *i915 = arg; + struct intel_gt *gt = arg; + struct drm_i915_private *i915 = gt->i915; struct i915_gem_context *ctx; struct file *file; int err; @@ -194,12 +197,12 @@ static int igt_gem_hibernate(void *arg) if (err) goto out; - igt_pm_hibernate(i915); + igt_pm_hibernate(gt); /* Here be dragons! */ - simulate_hibernate(i915); + simulate_hibernate(gt); - igt_pm_resume(i915); + igt_pm_resume(gt); err = switch_to_context(ctx); out: @@ -209,7 +212,8 @@ static int igt_gem_hibernate(void *arg) static int igt_gem_ww_ctx(void *arg) { - struct drm_i915_private *i915 = arg; + struct intel_gt *gt = arg; + struct drm_i915_private *i915 = gt->i915; struct drm_i915_gem_object *obj, *obj2; struct i915_gem_ww_ctx ww; int err = 0; @@ -254,9 +258,18 @@ int i915_gem_live_selftests(struct drm_i915_private *i915) SUBTEST(igt_gem_hibernate), SUBTEST(igt_gem_ww_ctx), }; + struct intel_gt *gt; + unsigned int id; + int err; + + for_each_gt(gt, i915, id) { + if (intel_gt_is_wedged(gt)) + return 0; - if (intel_gt_is_wedged(to_gt(i915))) - return 0; + err = intel_gt_live_subtests(tests, gt); + if (err) + return err; + } - return i915_live_subtests(tests, i915); + return 0; } diff --git a/drivers/gpu/drm/i915/selftests/i915_vma.c b/drivers/gpu/drm/i915/selftests/i915_vma.c index fc068dab27f4..3231025a7b7f 100644 --- a/drivers/gpu/drm/i915/selftests/i915_vma.c +++ b/drivers/gpu/drm/i915/selftests/i915_vma.c @@ -957,7 +957,8 @@ int i915_vma_mock_selftests(void) static int igt_vma_remapped_gtt(void *arg) { - struct drm_i915_private *i915 = arg; + struct intel_gt *gt = arg; + struct drm_i915_private *i915 = gt->i915; const struct intel_remapped_plane_info planes[] = { { .width = 1, .height = 1, .src_stride = 1 }, { .width = 2, .height = 2, .src_stride = 2 }, @@ -990,7 +991,7 @@ static int igt_vma_remapped_gtt(void *arg) intel_wakeref_t wakeref; int err = 0; - if (!i915_ggtt_has_aperture(to_gt(i915)->ggtt)) + if (!i915_ggtt_has_aperture(gt->ggtt)) return 0; obj = i915_gem_object_create_internal(i915, 10 * 10 * PAGE_SIZE); @@ -1107,6 +1108,15 @@ int i915_vma_live_selftests(struct drm_i915_private *i915) static const struct i915_subtest tests[] = { SUBTEST(igt_vma_remapped_gtt), }; + struct intel_gt *gt; + unsigned int id; + int err; + + for_each_gt(gt, i915, id) { + err = intel_gt_live_subtests(tests, gt); + if (err) + return err; + } - return i915_live_subtests(tests, i915); + return 0; } -- 2.55.0
