Re: [Intel-gfx] [PATCH 1/2] drm/i915/selftests: Extract spinner code

2018-11-30 Thread Chris Wilson
Quoting Tvrtko Ursulin (2018-11-30 08:02:53)
> From: Tvrtko Ursulin 
> 
> Pull out spinner code to a standalone file to enable it to be shortly used
> by other and new test cases.
> 
> Plain code movement - no functional changes.
> 
> Signed-off-by: Tvrtko Ursulin 

Shiver me conflicts.
Reviewed-by: Chris Wilson 
-Chris
___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 1/2] drm/i915/selftests: Extract spinner code

2018-11-30 Thread Tvrtko Ursulin
From: Tvrtko Ursulin 

Pull out spinner code to a standalone file to enable it to be shortly used
by other and new test cases.

Plain code movement - no functional changes.

Signed-off-by: Tvrtko Ursulin 
---
 drivers/gpu/drm/i915/Makefile|   3 +-
 drivers/gpu/drm/i915/selftests/igt_spinner.c | 199 
 drivers/gpu/drm/i915/selftests/igt_spinner.h |  37 +++
 drivers/gpu/drm/i915/selftests/intel_lrc.c   | 301 ---
 4 files changed, 290 insertions(+), 250 deletions(-)
 create mode 100644 drivers/gpu/drm/i915/selftests/igt_spinner.c
 create mode 100644 drivers/gpu/drm/i915/selftests/igt_spinner.h

diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile
index 0ff878c994e2..e56370b046b4 100644
--- a/drivers/gpu/drm/i915/Makefile
+++ b/drivers/gpu/drm/i915/Makefile
@@ -164,7 +164,8 @@ i915-$(CONFIG_DRM_I915_CAPTURE_ERROR) += i915_gpu_error.o
 i915-$(CONFIG_DRM_I915_SELFTEST) += \
selftests/i915_random.o \
selftests/i915_selftest.o \
-   selftests/igt_flush_test.o
+   selftests/igt_flush_test.o \
+   selftests/igt_spinner.o
 
 # virtual gpu code
 i915-y += i915_vgpu.o
diff --git a/drivers/gpu/drm/i915/selftests/igt_spinner.c 
b/drivers/gpu/drm/i915/selftests/igt_spinner.c
new file mode 100644
index ..8cd34f6e6859
--- /dev/null
+++ b/drivers/gpu/drm/i915/selftests/igt_spinner.c
@@ -0,0 +1,199 @@
+/*
+ * SPDX-License-Identifier: MIT
+ *
+ * Copyright © 2018 Intel Corporation
+ */
+
+#include "igt_spinner.h"
+
+int igt_spinner_init(struct igt_spinner *spin, struct drm_i915_private *i915)
+{
+   unsigned int mode;
+   void *vaddr;
+   int err;
+
+   GEM_BUG_ON(INTEL_GEN(i915) < 8);
+
+   memset(spin, 0, sizeof(*spin));
+   spin->i915 = i915;
+
+   spin->hws = i915_gem_object_create_internal(i915, PAGE_SIZE);
+   if (IS_ERR(spin->hws)) {
+   err = PTR_ERR(spin->hws);
+   goto err;
+   }
+
+   spin->obj = i915_gem_object_create_internal(i915, PAGE_SIZE);
+   if (IS_ERR(spin->obj)) {
+   err = PTR_ERR(spin->obj);
+   goto err_hws;
+   }
+
+   i915_gem_object_set_cache_level(spin->hws, I915_CACHE_LLC);
+   vaddr = i915_gem_object_pin_map(spin->hws, I915_MAP_WB);
+   if (IS_ERR(vaddr)) {
+   err = PTR_ERR(vaddr);
+   goto err_obj;
+   }
+   spin->seqno = memset(vaddr, 0xff, PAGE_SIZE);
+
+   mode = i915_coherent_map_type(i915);
+   vaddr = i915_gem_object_pin_map(spin->obj, mode);
+   if (IS_ERR(vaddr)) {
+   err = PTR_ERR(vaddr);
+   goto err_unpin_hws;
+   }
+   spin->batch = vaddr;
+
+   return 0;
+
+err_unpin_hws:
+   i915_gem_object_unpin_map(spin->hws);
+err_obj:
+   i915_gem_object_put(spin->obj);
+err_hws:
+   i915_gem_object_put(spin->hws);
+err:
+   return err;
+}
+
+static unsigned int seqno_offset(u64 fence)
+{
+   return offset_in_page(sizeof(u32) * fence);
+}
+
+static u64 hws_address(const struct i915_vma *hws,
+  const struct i915_request *rq)
+{
+   return hws->node.start + seqno_offset(rq->fence.context);
+}
+
+static int emit_recurse_batch(struct igt_spinner *spin,
+ struct i915_request *rq,
+ u32 arbitration_command)
+{
+   struct i915_address_space *vm = >gem_context->ppgtt->vm;
+   struct i915_vma *hws, *vma;
+   u32 *batch;
+   int err;
+
+   vma = i915_vma_instance(spin->obj, vm, NULL);
+   if (IS_ERR(vma))
+   return PTR_ERR(vma);
+
+   hws = i915_vma_instance(spin->hws, vm, NULL);
+   if (IS_ERR(hws))
+   return PTR_ERR(hws);
+
+   err = i915_vma_pin(vma, 0, 0, PIN_USER);
+   if (err)
+   return err;
+
+   err = i915_vma_pin(hws, 0, 0, PIN_USER);
+   if (err)
+   goto unpin_vma;
+
+   err = i915_vma_move_to_active(vma, rq, 0);
+   if (err)
+   goto unpin_hws;
+
+   if (!i915_gem_object_has_active_reference(vma->obj)) {
+   i915_gem_object_get(vma->obj);
+   i915_gem_object_set_active_reference(vma->obj);
+   }
+
+   err = i915_vma_move_to_active(hws, rq, 0);
+   if (err)
+   goto unpin_hws;
+
+   if (!i915_gem_object_has_active_reference(hws->obj)) {
+   i915_gem_object_get(hws->obj);
+   i915_gem_object_set_active_reference(hws->obj);
+   }
+
+   batch = spin->batch;
+
+   *batch++ = MI_STORE_DWORD_IMM_GEN4;
+   *batch++ = lower_32_bits(hws_address(hws, rq));
+   *batch++ = upper_32_bits(hws_address(hws, rq));
+   *batch++ = rq->fence.seqno;
+
+   *batch++ = arbitration_command;
+
+   *batch++ = MI_BATCH_BUFFER_START | 1 << 8 | 1;
+   *batch++ = lower_32_bits(vma->node.start);
+   *batch++ = upper_32_bits(vma->node.start);
+   *batch++ = MI_BATCH_BUFFER_END; /* not reached */
+
+