[Intel-gfx] [PATCH] selftests/i915_gem_gtt: Create igt_ggtt_scratch subtest
Ewelina Musial
ewelina.musial at intel.com
Wed Apr 11 08:27:12 UTC 2018
Test have similar functionality that gem_cs_prefetch IGT test
but gem_cs_prefetch is not up to date and there was an idea
to move this test to kselftests so this is respond for this
request.
There is another patch on igt_dev which is removing gem_cs_prefetch
test from IGT.
---
drivers/gpu/drm/i915/selftests/i915_gem_gtt.c | 134 ++++++++++++++++++++++++++
1 file changed, 134 insertions(+)
diff --git a/drivers/gpu/drm/i915/selftests/i915_gem_gtt.c b/drivers/gpu/drm/i915/selftests/i915_gem_gtt.c
index 89b6ca9b14a7..42403da610c6 100644
--- a/drivers/gpu/drm/i915/selftests/i915_gem_gtt.c
+++ b/drivers/gpu/drm/i915/selftests/i915_gem_gtt.c
@@ -1625,6 +1625,139 @@ static int igt_gtt_insert(void *arg)
return err;
}
+#define COUNT 10
+static int igt_ggtt_scratch(void *arg)
+{
+ static struct insert_mode {
+ const char *name;
+ enum drm_mm_insert_mode mode;
+ } modes[] = {
+ { "bottom-up", DRM_MM_INSERT_LOW },
+ { "top-down", DRM_MM_INSERT_HIGH },
+ {}
+ };
+
+ I915_RND_STATE(prng);
+
+ struct insert_mode *mode;
+ struct drm_i915_private *i915 = arg;
+ struct i915_ggtt *ggtt = &i915->ggtt;
+ struct drm_i915_gem_object *obj;
+ struct drm_mm_node *node;
+ struct drm_mm_node tmp[COUNT];
+ unsigned int *order;
+ int err = 0;
+ int n, m;
+ u64 hole_start, hole_end = 0;
+ u64 offset;
+ u32 __iomem *vaddr;
+ u32 val;
+
+ mutex_lock(&i915->drm.struct_mutex);
+
+ for (mode = modes; mode->name; mode++) {
+ order = i915_random_order(COUNT, &prng);
+ if (!order) {
+ err = -ENOMEM;
+ }
+
+ obj = i915_gem_object_create_internal(i915, PAGE_SIZE);
+ if (IS_ERR(obj)) {
+ err = PTR_ERR(obj);
+ goto out_unlock;
+ }
+
+ drm_mm_for_each_hole(node, &ggtt->base.mm, hole_start, hole_end) {
+
+ err = i915_gem_object_pin_pages(obj);
+ if (err)
+ goto out_free;
+
+ intel_runtime_pm_get(i915);
+ for (m = 0; m < COUNT; m++) {
+ memset(&tmp[order[m]], 0, sizeof(tmp[order[m]]));
+
+ err = drm_mm_insert_node_in_range(&ggtt->base.mm, &tmp[order[m]],
+ 3 * PAGE_SIZE, 0,
+ I915_COLOR_UNEVICTABLE,
+ 0, ggtt->mappable_end,
+ mode->mode);
+ if (err)
+ goto out_unpin;
+
+ offset = tmp[order[m]].start;
+ ggtt->base.insert_page(&ggtt->base,
+ i915_gem_object_get_dma_address(obj, 0),
+ offset + PAGE_SIZE, I915_CACHE_NONE, 0);
+ }
+
+ i915_random_reorder(order, COUNT, &prng);
+
+ for (m = 0; m < COUNT; m++) {
+ for ( n = 0; n <= 2; n++)
+ {
+ offset = tmp[order[m]].start + n * PAGE_SIZE;
+ vaddr = io_mapping_map_atomic_wc(&ggtt->iomap, offset);
+ iowrite32(n, vaddr);
+ io_mapping_unmap_atomic(vaddr);
+ }
+
+ i915_gem_flush_ggtt_writes(i915);
+
+ for ( n = 0; n <= 2; n++)
+ {
+ offset = tmp[order[m]].start + n * PAGE_SIZE;
+ vaddr = io_mapping_map_atomic_wc(&ggtt->iomap, offset);
+ val = ioread32(vaddr);
+ io_mapping_unmap_atomic(vaddr);
+
+ if ((n != 1) && (val != 2)) {
+ pr_err("insert page failed: found %d, expected %d\n",
+ val, 2);
+ err = -EINVAL;
+ break;
+ } else if ((n == 1) && (val != n)) {
+ pr_err("insert page failed: found %d, expected %d\n",
+ val, n);
+ err = -EINVAL;
+ break;
+ }
+ }
+
+ ggtt->base.clear_range(&ggtt->base, tmp[order[m]].start, tmp[order[m]].size);
+ ggtt->invalidate(i915);
+
+ for ( n = 0; n <= 2; n++)
+ {
+ offset = tmp[order[m]].start + n * PAGE_SIZE;
+ vaddr = io_mapping_map_atomic_wc(&ggtt->iomap, offset);
+ val = ioread32(vaddr);
+ io_mapping_unmap_atomic(vaddr);
+
+ if (val != 2) {
+ pr_err("insert page failed: found %d, expected %d\n",
+ val, 2);
+ err = -EINVAL;
+ break;
+ }
+ }
+ }
+ for (m = 0; m < COUNT; m++) {
+ drm_mm_remove_node(&tmp[m]);
+ }
+out_unpin:
+ intel_runtime_pm_put(i915);
+ i915_gem_object_unpin_pages(obj);
+ }
+out_free:
+ i915_gem_object_put(obj);
+ kfree(order);
+ }
+out_unlock:
+ mutex_unlock(&i915->drm.struct_mutex);
+ return err;
+}
+
int i915_gem_gtt_mock_selftests(void)
{
static const struct i915_subtest tests[] = {
@@ -1667,6 +1800,7 @@ int i915_gem_gtt_live_selftests(struct drm_i915_private *i915)
SUBTEST(igt_ggtt_pot),
SUBTEST(igt_ggtt_fill),
SUBTEST(igt_ggtt_page),
+ SUBTEST(igt_ggtt_scratch),
};
GEM_BUG_ON(offset_in_page(i915->ggtt.base.total));
--
2.14.3
More information about the Intel-gfx
mailing list