]>
git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/blob - drivers/gpu/drm/i915/gem/selftests/i915_gem_execbuffer.c
57c14d3340cde50d456b3d123ca7392556a797ff
1 // SPDX-License-Identifier: MIT
3 * Copyright © 2020 Intel Corporation
6 #include "i915_selftest.h"
8 #include "gt/intel_engine_pm.h"
9 #include "selftests/igt_flush_test.h"
11 static u64
read_reloc(const u32
*map
, int x
, const u64 mask
)
15 memcpy(&reloc
, &map
[x
], sizeof(reloc
));
19 static int __igt_gpu_reloc(struct i915_execbuffer
*eb
,
20 struct drm_i915_gem_object
*obj
)
22 const unsigned int offsets
[] = { 8, 3, 0 };
24 GENMASK_ULL(eb
->reloc_cache
.use_64bit_reloc
? 63 : 31, 0);
25 const u32
*map
= page_mask_bits(obj
->mm
.mapping
);
26 struct i915_request
*rq
;
31 vma
= i915_vma_instance(obj
, eb
->context
->vm
, NULL
);
35 err
= i915_vma_pin(vma
, 0, 0, PIN_USER
| PIN_HIGH
);
40 err
= __reloc_entry_gpu(eb
, vma
, offsets
[0] * sizeof(u32
), 0);
45 err
= __reloc_entry_gpu(eb
, vma
, offsets
[1] * sizeof(u32
), 1);
49 /* Skip to the end of the cmd page */
50 i
= PAGE_SIZE
/ sizeof(u32
) - RELOC_TAIL
- 1;
51 i
-= eb
->reloc_cache
.rq_size
;
52 memset32(eb
->reloc_cache
.rq_cmd
+ eb
->reloc_cache
.rq_size
,
54 eb
->reloc_cache
.rq_size
+= i
;
56 /* Force batch chaining */
57 err
= __reloc_entry_gpu(eb
, vma
, offsets
[2] * sizeof(u32
), 2);
61 GEM_BUG_ON(!eb
->reloc_cache
.rq
);
62 rq
= i915_request_get(eb
->reloc_cache
.rq
);
63 err
= reloc_gpu_flush(&eb
->reloc_cache
);
66 GEM_BUG_ON(eb
->reloc_cache
.rq
);
68 err
= i915_gem_object_wait(obj
, I915_WAIT_INTERRUPTIBLE
, HZ
/ 2);
70 intel_gt_set_wedged(eb
->engine
->gt
);
74 if (!i915_request_completed(rq
)) {
75 pr_err("%s: did not wait for relocations!\n", eb
->engine
->name
);
80 for (i
= 0; i
< ARRAY_SIZE(offsets
); i
++) {
81 u64 reloc
= read_reloc(map
, offsets
[i
], mask
);
84 pr_err("%s[%d]: map[%d] %llx != %x\n",
85 eb
->engine
->name
, i
, offsets
[i
], reloc
, i
);
90 igt_hexdump(map
, 4096);
99 static int igt_gpu_reloc(void *arg
)
101 struct i915_execbuffer eb
;
102 struct drm_i915_gem_object
*scratch
;
108 scratch
= i915_gem_object_create_internal(eb
.i915
, 4096);
110 return PTR_ERR(scratch
);
112 map
= i915_gem_object_pin_map(scratch
, I915_MAP_WC
);
118 for_each_uabi_engine(eb
.engine
, eb
.i915
) {
119 reloc_cache_init(&eb
.reloc_cache
, eb
.i915
);
120 memset(map
, POISON_INUSE
, 4096);
122 intel_engine_pm_get(eb
.engine
);
123 eb
.context
= intel_context_create(eb
.engine
);
124 if (IS_ERR(eb
.context
)) {
125 err
= PTR_ERR(eb
.context
);
129 err
= intel_context_pin(eb
.context
);
133 err
= __igt_gpu_reloc(&eb
, scratch
);
135 intel_context_unpin(eb
.context
);
137 intel_context_put(eb
.context
);
139 intel_engine_pm_put(eb
.engine
);
144 if (igt_flush_test(eb
.i915
))
148 i915_gem_object_put(scratch
);
152 int i915_gem_execbuffer_live_selftests(struct drm_i915_private
*i915
)
154 static const struct i915_subtest tests
[] = {
155 SUBTEST(igt_gpu_reloc
),
158 if (intel_gt_is_wedged(&i915
->gt
))
161 return i915_live_subtests(tests
, i915
);