From 7fc5e9dac2171926402cea6bfc9f7dab53486fc0 Mon Sep 17 00:00:00 2001 From: Niranjana Vishwanathapura Date: Tue, 22 Sep 2020 11:13:02 -0700 Subject: tests/i915/vm_bind: Add userptr subtest Add userptr object type to vm_bind_basic test. Signed-off-by: Niranjana Vishwanathapura --- tests/i915/i915_vm_bind_basic.c | 63 +++++++++++++++++++++++++++++++++++------ 1 file 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); } } -- cgit v1.2.3