Exercise filling different pages of the GTT Signed-off-by: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx> --- drivers/gpu/drm/i915/selftests/i915_gem_gtt.c | 130 ++++++++++++++++++++++++++ 1 file changed, 130 insertions(+) diff --git a/drivers/gpu/drm/i915/selftests/i915_gem_gtt.c b/drivers/gpu/drm/i915/selftests/i915_gem_gtt.c index 8ed88f438eef..68f7bfb7502e 100644 --- a/drivers/gpu/drm/i915/selftests/i915_gem_gtt.c +++ b/drivers/gpu/drm/i915/selftests/i915_gem_gtt.c @@ -231,6 +231,65 @@ static int fill_hole(struct drm_i915_private *i915, return err; } +static int walk_hole(struct drm_i915_private *i915, + struct i915_address_space *vm, + u64 hole_start, u64 hole_end) +{ + I915_SELFTEST_TIMEOUT(end_time); + struct drm_i915_gem_object *obj; + struct i915_vma *vma; + u64 addr; + int err; + + obj = i915_gem_object_create_internal(i915, PAGE_SIZE); + if (IS_ERR(obj)) + return PTR_ERR(obj); + + vma = vma_lookup(obj, vm); + if (IS_ERR(vma)) { + err = PTR_ERR(vma); + goto err; + } + + for (addr = hole_start; addr < hole_end; addr += PAGE_SIZE) { + cond_resched(); + + err = i915_vma_pin(vma, 0, 0, + addr | PIN_OFFSET_FIXED | PIN_USER); + if (err) { + pr_err("Walk bind failed at %llx with err=%d\n", + addr, err); + break; + } + i915_vma_unpin(vma); + + if (!drm_mm_node_allocated(&vma->node) || + i915_vma_misplaced(vma, 0, 0, addr | PIN_OFFSET_FIXED)) { + pr_err("Walk incorrect at %llx\n", addr); + err = -EINVAL; + break; + } + + err = i915_vma_unbind(vma); + if (err) { + pr_err("Walk unbind failed at %llx with err=%d\n", + addr, err); + break; + } + + if (time_after(jiffies, end_time)) { + pr_warn("Walk timed out at %llx\n", addr); + break; + } + } + + if (!i915_vma_is_ggtt(vma)) + i915_vma_close(vma); +err: + i915_gem_object_put(obj); + return err; +} + static int igt_ppgtt_fill(void *arg) { struct drm_i915_private *dev_priv = arg; @@ -264,6 +323,39 @@ static int igt_ppgtt_fill(void *arg) return err; } +static int igt_ppgtt_walk(void *arg) +{ + struct drm_i915_private *dev_priv = arg; + struct drm_file *file; + struct i915_hw_ppgtt *ppgtt; + int err; + + if (!USES_FULL_PPGTT(dev_priv)) + return 0; + + file = fake_file(dev_priv); + if (IS_ERR(file)) + return PTR_ERR(file); + + mutex_lock(&dev_priv->drm.struct_mutex); + ppgtt = i915_ppgtt_create(dev_priv, file->driver_priv, "mock"); + if (IS_ERR(ppgtt)) { + err = PTR_ERR(ppgtt); + goto err_unlock; + } + GEM_BUG_ON(ppgtt->base.total & ~PAGE_MASK); + + err = walk_hole(dev_priv, &ppgtt->base, 0, ppgtt->base.total); + + i915_ppgtt_close(&ppgtt->base); + i915_ppgtt_put(ppgtt); +err_unlock: + mutex_unlock(&dev_priv->drm.struct_mutex); + + fake_file_free(dev_priv, file); + return err; +} + static int igt_ggtt_fill(void *arg) { struct drm_i915_private *i915 = arg; @@ -300,11 +392,49 @@ static int igt_ggtt_fill(void *arg) return err; } +static int igt_ggtt_walk(void *arg) +{ + struct drm_i915_private *i915 = arg; + struct i915_ggtt *ggtt = &i915->ggtt; + u64 hole_start = U64_MAX, hole_end = 0, hole_size = 0; + u64 this_start, this_end; + struct drm_mm_node *node; + int err; + + GEM_BUG_ON(ggtt->base.total & ~PAGE_MASK); + + mutex_lock(&i915->drm.struct_mutex); + drm_mm_for_each_hole(node, &ggtt->base.mm, this_start, this_end) { + u64 this_size; + + if (ggtt->base.mm.color_adjust) + ggtt->base. mm.color_adjust(node, 0, + &this_start, &this_end); + + this_size = this_end - this_start; + if (this_size > hole_size) { + hole_size = this_size; + hole_start = this_start; + hole_end = this_end; + } + } + pr_info("Found GGTT hole [%llx, %llx], size %llx\n", + hole_start, hole_end, hole_size); + GEM_BUG_ON(hole_start >= hole_end); + + err = walk_hole(i915, &ggtt->base, hole_start, hole_end); + mutex_unlock(&i915->drm.struct_mutex); + + return err; +} + int i915_gem_gtt_live_selftests(struct drm_i915_private *i915) { static const struct i915_subtest tests[] = { SUBTEST(igt_ppgtt_alloc), + SUBTEST(igt_ppgtt_walk), SUBTEST(igt_ppgtt_fill), + SUBTEST(igt_ggtt_walk), SUBTEST(igt_ggtt_fill), }; -- 2.11.0 _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx