summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNiranjana Vishwanathapura <niranjana.vishwanathapura@intel.com>2020-09-22 11:13:02 -0700
committerNiranjana Vishwanathapura <niranjana.vishwanathapura@intel.com>2022-06-17 21:27:58 +0000
commit7fc5e9dac2171926402cea6bfc9f7dab53486fc0 (patch)
treea3a9e39911f870e4ddf721b80901daee9da61c5f
parent4e7ed448e8ff21343e01470b8f66afc2a02832ac (diff)
tests/i915/vm_bind: Add userptr subtestigt_vm_bind_upstream_7
Add userptr object type to vm_bind_basic test. Signed-off-by: Niranjana Vishwanathapura <niranjana.vishwanathapura@intel.com>
-rw-r--r--tests/i915/i915_vm_bind_basic.c63
1 files changed, 54 insertions, 9 deletions
diff --git a/tests/i915/i915_vm_bind_basic.c b/tests/i915/i915_vm_bind_basic.c
index 00ab0da238d0..280f02343eeb 100644
--- a/tests/i915/i915_vm_bind_basic.c
+++ b/tests/i915/i915_vm_bind_basic.c
@@ -72,10 +72,12 @@ struct mapping {
#define RT_SMEM BIT(0)
#define RT_SKIP_UNBIND BIT(1)
#define RT_SHARE_VM BIT(2)
+#define RT_USERPTR BIT(3)
#define rt_lmem(rcfg) (!((rcfg)->flags & RT_SMEM))
#define rt_unbind(rcfg) (!((rcfg)->flags & RT_SKIP_UNBIND))
#define rt_share_vm(rcfg) ((rcfg)->flags & RT_SHARE_VM)
+#define rt_userptr(rcfg) ((rcfg)->flags & RT_USERPTR)
struct rt_cfg {
const char *name;
@@ -215,13 +217,21 @@ static void create_src_objs(int fd, struct rt_cfg *rcfg, uint32_t src[], uint32_
uint32_t num_cmds, void *src_addr[])
{
int i;
- struct igt_collection *set = get_region_set(fd, rcfg);
- uint32_t region;
- for (i = 0; i < num_cmds; i++) {
- region = igt_collection_get_value(set, i % set->size);
- src[i] = gem_create_in_memory_regions(fd, size, region);
- src_addr[i] = gem_mmap__cpu(fd, src[i], 0, size, PROT_WRITE);
+ if (rt_userptr(rcfg)) {
+ for (i = 0; i < num_cmds; i++) {
+ igt_assert(posix_memalign(&src_addr[i], SZ_2M, size) == 0);
+ gem_userptr(fd, src_addr[i], size, 0, 0, &src[i]);
+ }
+ } else {
+ struct igt_collection *set = get_region_set(fd, rcfg);
+ uint32_t region;
+
+ for (i = 0; i < num_cmds; i++) {
+ region = igt_collection_get_value(set, i % set->size);
+ src[i] = gem_create_in_memory_regions(fd, size, region);
+ src_addr[i] = gem_mmap__cpu(fd, src[i], 0, size, PROT_WRITE);
+ }
}
}
@@ -234,16 +244,25 @@ static void destroy_src_objs(int fd, struct rt_cfg *rcfg, uint32_t src[], uint32
igt_assert(gem_munmap(src_addr[i], size) == 0);
vm_bind_debug("Closing object 0x%x\n", src[i]);
gem_close(fd, src[i]);
+ if (rt_userptr(rcfg))
+ free(src_addr[i]);
}
}
static uint32_t create_dst_obj(int fd, struct rt_cfg *rcfg, uint32_t size, void **dst_addr)
{
uint32_t dst;
- struct igt_collection *set = get_region_set(fd, rcfg);
- dst = gem_create_in_memory_regions(fd, size, igt_collection_get_value(set, 0));
- *dst_addr = gem_mmap__cpu(fd, dst, 0, size, PROT_WRITE);
+ if (rt_userptr(rcfg)) {
+ igt_assert(posix_memalign(dst_addr, SZ_2M, size) == 0);
+
+ gem_userptr(fd, *dst_addr, size, 0, 0, &dst);
+ } else {
+ struct igt_collection *set = get_region_set(fd, rcfg);
+
+ dst = gem_create_in_memory_regions(fd, size, igt_collection_get_value(set, 0));
+ *dst_addr = gem_mmap__cpu(fd, dst, 0, size, PROT_WRITE);
+ }
return dst;
}
@@ -253,6 +272,9 @@ static void destroy_dst_obj(int fd, struct rt_cfg *rcfg, uint32_t dst, uint32_t
igt_assert(gem_munmap(dst_addr, size) == 0);
vm_bind_debug("Closing object 0x%x\n", dst);
gem_close(fd, dst);
+
+ if (rt_userptr(rcfg))
+ free(dst_addr);
}
static void pattern_fill_buf(void *src_addr[], uint32_t size, uint32_t num_cmds, uint32_t npages)
@@ -406,6 +428,25 @@ static void run_rt(int fd, const intel_ctx_t *base_ctx, struct rt_cfg *rcfg,
gem_vm_destroy(fd, shared_vm_id);
}
+static int has_userptr(int fd)
+{
+ uint32_t handle = 0;
+ void *ptr;
+ int ret;
+
+ assert(posix_memalign(&ptr, PAGE_SIZE, PAGE_SIZE) == 0);
+ ret = __gem_userptr(fd, ptr, PAGE_SIZE, 0, 0, &handle);
+ if (ret != 0) {
+ free(ptr);
+ return 0;
+ }
+
+ gem_close(fd, handle);
+ free(ptr);
+
+ return handle != 0;
+}
+
igt_main
{
struct rt_cfg *r, rt_tests[] = {
@@ -419,6 +460,7 @@ igt_main
{"rt_2M", SZ_2M, 1, 1, 0},
{"rt_smem", 0, 1, 1, RT_SMEM},
{"rt_smem_multi_cmds", 0, MAX_CMDS, 1, RT_SMEM},
+ {"rt_userptr", 0, 1, 1, RT_USERPTR},
{ }
};
int fd;
@@ -448,6 +490,9 @@ igt_main
for_each_ctx_engine(fd, ctx, e) {
if (e->class == I915_ENGINE_CLASS_COPY) {
igt_dynamic(e->name) {
+ if (rt_userptr(r))
+ igt_require(has_userptr(fd));
+
run_rt(fd, ctx, r, e);
}
}