]> www.infradead.org Git - users/willy/xarray.git/commitdiff
drm/i915/gt: Provide a utility to create a scratch buffer
authorChris Wilson <chris@chris-wilson.co.uk>
Sat, 19 Dec 2020 02:03:43 +0000 (02:03 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Mon, 21 Dec 2020 09:53:52 +0000 (09:53 +0000)
Primarily used by selftests, but also by runtime debugging of engine
w/a, is a routine to create a temporarily bound buffer for readback.
Almagamate the duplicated routines into one.

Suggested-by: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20201219020343.22681-2-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/gt/intel_gtt.c
drivers/gpu/drm/i915/gt/intel_gtt.h
drivers/gpu/drm/i915/gt/intel_workarounds.c
drivers/gpu/drm/i915/gt/selftest_execlists.c
drivers/gpu/drm/i915/gt/selftest_lrc.c
drivers/gpu/drm/i915/gt/selftest_mocs.c
drivers/gpu/drm/i915/gt/selftest_workarounds.c

index 7bfe9072be9af69ecf4aa492b460f638209d41c2..04aa6601e984932a6269e9317da40919a96125d1 100644 (file)
@@ -422,6 +422,35 @@ void setup_private_pat(struct intel_uncore *uncore)
                bdw_setup_private_ppat(uncore);
 }
 
+struct i915_vma *
+__vm_create_scratch_for_read(struct i915_address_space *vm, unsigned long size)
+{
+       struct drm_i915_gem_object *obj;
+       struct i915_vma *vma;
+       int err;
+
+       obj = i915_gem_object_create_internal(vm->i915, PAGE_ALIGN(size));
+       if (IS_ERR(obj))
+               return ERR_CAST(obj);
+
+       i915_gem_object_set_cache_coherency(obj, I915_CACHING_CACHED);
+
+       vma = i915_vma_instance(obj, vm, NULL);
+       if (IS_ERR(vma)) {
+               i915_gem_object_put(obj);
+               return vma;
+       }
+
+       err = i915_vma_pin(vma, 0, 0,
+                          i915_vma_is_ggtt(vma) ? PIN_GLOBAL : PIN_USER);
+       if (err) {
+               i915_vma_put(vma);
+               return ERR_PTR(err);
+       }
+
+       return vma;
+}
+
 #if IS_ENABLED(CONFIG_DRM_I915_SELFTEST)
 #include "selftests/mock_gtt.c"
 #endif
index 8a33940a71f3760c169db0283b8a0d2b94129e51..29c10fde8ce3f5eafbe3e3b9cd36117a43cda766 100644 (file)
@@ -573,6 +573,9 @@ int i915_vm_pin_pt_stash(struct i915_address_space *vm,
 void i915_vm_free_pt_stash(struct i915_address_space *vm,
                           struct i915_vm_pt_stash *stash);
 
+struct i915_vma *
+__vm_create_scratch_for_read(struct i915_address_space *vm, unsigned long size);
+
 static inline struct sgt_dma {
        struct scatterlist *sg;
        dma_addr_t dma, max;
index 38868c5c038ed05c4132c25043886dd8b5170fc4..42d320e68b60e1432aed02d5d5b5a7fc506067c1 100644 (file)
@@ -2086,39 +2086,6 @@ void intel_engine_apply_workarounds(struct intel_engine_cs *engine)
        wa_list_apply(engine->uncore, &engine->wa_list);
 }
 
-static struct i915_vma *
-create_scratch(struct i915_address_space *vm, int count)
-{
-       struct drm_i915_gem_object *obj;
-       struct i915_vma *vma;
-       unsigned int size;
-       int err;
-
-       size = round_up(count * sizeof(u32), PAGE_SIZE);
-       obj = i915_gem_object_create_internal(vm->i915, size);
-       if (IS_ERR(obj))
-               return ERR_CAST(obj);
-
-       i915_gem_object_set_cache_coherency(obj, I915_CACHE_LLC);
-
-       vma = i915_vma_instance(obj, vm, NULL);
-       if (IS_ERR(vma)) {
-               err = PTR_ERR(vma);
-               goto err_obj;
-       }
-
-       err = i915_vma_pin(vma, 0, 0,
-                          i915_vma_is_ggtt(vma) ? PIN_GLOBAL : PIN_USER);
-       if (err)
-               goto err_obj;
-
-       return vma;
-
-err_obj:
-       i915_gem_object_put(obj);
-       return ERR_PTR(err);
-}
-
 struct mcr_range {
        u32 start;
        u32 end;
@@ -2221,7 +2188,8 @@ static int engine_wa_list_verify(struct intel_context *ce,
        if (!wal->count)
                return 0;
 
-       vma = create_scratch(&ce->engine->gt->ggtt->vm, wal->count);
+       vma = __vm_create_scratch_for_read(&ce->engine->gt->ggtt->vm,
+                                          wal->count * sizeof(u32));
        if (IS_ERR(vma))
                return PTR_ERR(vma);
 
index 34c2bb8313ebf52181388e91a76f8cc8bd56a2c0..7f2a6421f22073590c5a677da4e0da768d65162e 100644 (file)
 #define NUM_GPR 16
 #define NUM_GPR_DW (NUM_GPR * 2) /* each GPR is 2 dwords */
 
-static struct i915_vma *create_scratch(struct intel_gt *gt)
-{
-       struct drm_i915_gem_object *obj;
-       struct i915_vma *vma;
-       int err;
-
-       obj = i915_gem_object_create_internal(gt->i915, PAGE_SIZE);
-       if (IS_ERR(obj))
-               return ERR_CAST(obj);
-
-       i915_gem_object_set_cache_coherency(obj, I915_CACHING_CACHED);
-
-       vma = i915_vma_instance(obj, &gt->ggtt->vm, NULL);
-       if (IS_ERR(vma)) {
-               i915_gem_object_put(obj);
-               return vma;
-       }
-
-       err = i915_vma_pin(vma, 0, 0, PIN_GLOBAL);
-       if (err) {
-               i915_gem_object_put(obj);
-               return ERR_PTR(err);
-       }
-
-       return vma;
-}
-
 static bool is_active(struct i915_request *rq)
 {
        if (i915_request_is_active(rq))
@@ -4167,7 +4140,8 @@ static int preserved_virtual_engine(struct intel_gt *gt,
        int err = 0;
        u32 *cs;
 
-       scratch = create_scratch(siblings[0]->gt);
+       scratch = __vm_create_scratch_for_read(&siblings[0]->gt->ggtt->vm,
+                                              PAGE_SIZE);
        if (IS_ERR(scratch))
                return PTR_ERR(scratch);
 
index b7617731d2cd8c1a33a068cdf7f5aa7dc0e5b885..6f21cdfd09039b41bf992461b947a159e65e6a3d 100644 (file)
 
 static struct i915_vma *create_scratch(struct intel_gt *gt)
 {
-       struct drm_i915_gem_object *obj;
-       struct i915_vma *vma;
-       int err;
-
-       obj = i915_gem_object_create_internal(gt->i915, PAGE_SIZE);
-       if (IS_ERR(obj))
-               return ERR_CAST(obj);
-
-       i915_gem_object_set_cache_coherency(obj, I915_CACHING_CACHED);
-
-       vma = i915_vma_instance(obj, &gt->ggtt->vm, NULL);
-       if (IS_ERR(vma)) {
-               i915_gem_object_put(obj);
-               return vma;
-       }
-
-       err = i915_vma_pin(vma, 0, 0, PIN_GLOBAL);
-       if (err) {
-               i915_gem_object_put(obj);
-               return ERR_PTR(err);
-       }
-
-       return vma;
+       return __vm_create_scratch_for_read(&gt->ggtt->vm, PAGE_SIZE);
 }
 
 static bool is_active(struct i915_request *rq)
index 37b066dca52cc7683ea1bf4dd5abe4adcebbf374..ca72894918bac6a6b5c1951753c102d44b1ba5d8 100644 (file)
@@ -57,33 +57,6 @@ static int request_add_spin(struct i915_request *rq, struct igt_spinner *spin)
        return err;
 }
 
-static struct i915_vma *create_scratch(struct intel_gt *gt)
-{
-       struct drm_i915_gem_object *obj;
-       struct i915_vma *vma;
-       int err;
-
-       obj = i915_gem_object_create_internal(gt->i915, PAGE_SIZE);
-       if (IS_ERR(obj))
-               return ERR_CAST(obj);
-
-       i915_gem_object_set_cache_coherency(obj, I915_CACHING_CACHED);
-
-       vma = i915_vma_instance(obj, &gt->ggtt->vm, NULL);
-       if (IS_ERR(vma)) {
-               i915_gem_object_put(obj);
-               return vma;
-       }
-
-       err = i915_vma_pin(vma, 0, 0, PIN_GLOBAL);
-       if (err) {
-               i915_gem_object_put(obj);
-               return ERR_PTR(err);
-       }
-
-       return vma;
-}
-
 static int live_mocs_init(struct live_mocs *arg, struct intel_gt *gt)
 {
        struct drm_i915_mocs_table table;
@@ -102,7 +75,7 @@ static int live_mocs_init(struct live_mocs *arg, struct intel_gt *gt)
        if (flags & (HAS_GLOBAL_MOCS | HAS_ENGINE_MOCS))
                arg->mocs = table;
 
-       arg->scratch = create_scratch(gt);
+       arg->scratch = __vm_create_scratch_for_read(&gt->ggtt->vm, PAGE_SIZE);
        if (IS_ERR(arg->scratch))
                return PTR_ERR(arg->scratch);
 
index 703b77207a47b36cdae02a2564fed34aa6d17d99..2070b91cb6077a7814eea7c40587d76b4b186735 100644 (file)
@@ -486,10 +486,11 @@ static int check_dirty_whitelist(struct intel_context *ce)
        struct intel_engine_cs *engine = ce->engine;
        struct i915_vma *scratch;
        struct i915_vma *batch;
-       int err = 0, i, v;
+       int err = 0, i, v, sz;
        u32 *cs, *results;
 
-       scratch = create_scratch(ce->vm, 2 * ARRAY_SIZE(values) + 1);
+       sz = (2 * ARRAY_SIZE(values) + 1) * sizeof(u32);
+       scratch = __vm_create_scratch_for_read(ce->vm, sz);
        if (IS_ERR(scratch))
                return PTR_ERR(scratch);
 
@@ -1028,13 +1029,15 @@ static int live_isolated_whitelist(void *arg)
                return 0;
 
        for (i = 0; i < ARRAY_SIZE(client); i++) {
-               client[i].scratch[0] = create_scratch(gt->vm, 1024);
+               client[i].scratch[0] =
+                       __vm_create_scratch_for_read(gt->vm, 4096);
                if (IS_ERR(client[i].scratch[0])) {
                        err = PTR_ERR(client[i].scratch[0]);
                        goto err;
                }
 
-               client[i].scratch[1] = create_scratch(gt->vm, 1024);
+               client[i].scratch[1] =
+                       __vm_create_scratch_for_read(gt->vm, 4096);
                if (IS_ERR(client[i].scratch[1])) {
                        err = PTR_ERR(client[i].scratch[1]);
                        i915_vma_unpin_and_release(&client[i].scratch[0], 0);