diff options
author | Adam Miszczak <adam.miszczak@linux.intel.com> | 2020-10-15 09:00:50 +0200 |
---|---|---|
committer | Niranjana Vishwanathapura <niranjana.vishwanathapura@intel.com> | 2022-06-17 21:27:58 +0000 |
commit | 5417d8f44d3afc35683351a3ef658bf4fe41fe88 (patch) | |
tree | c7a079e80e1e17d6e0d9fa96eea09c4ca18d5163 | |
parent | 37ae32cab9029979191a6ca92af2450d46cca168 (diff) |
lib/vm_bind: Add interface to support VM_BIND
Add required library interfaces to support Virtual Manager Bind
(VM_BIND) functionality.
Signed-off-by: Niranjana Vishwanathapura <niranjana.vishwanathapura@intel.com>
Signed-off-by: Anshuman Gupta <anshuman.gupta@intel.com>
-rw-r--r-- | lib/i915/gem_context.c | 24 | ||||
-rw-r--r-- | lib/i915/gem_context.h | 3 | ||||
-rw-r--r-- | lib/i915/gem_vm.c | 31 | ||||
-rw-r--r-- | lib/i915/gem_vm.h | 3 | ||||
-rw-r--r-- | lib/i915/intel_memory_region.c | 14 | ||||
-rw-r--r-- | lib/i915/intel_memory_region.h | 18 | ||||
-rw-r--r-- | lib/ioctl_wrappers.c | 114 | ||||
-rw-r--r-- | lib/ioctl_wrappers.h | 12 | ||||
-rw-r--r-- | tests/i915/gem_eio.c | 2 | ||||
-rw-r--r-- | tests/i915/gem_lmem_swapping.c | 2 | ||||
-rw-r--r-- | tests/i915/i915_pm_rpm.c | 2 |
11 files changed, 209 insertions, 16 deletions
diff --git a/lib/i915/gem_context.c b/lib/i915/gem_context.c index fe989a8d1c77..2d06b4198024 100644 --- a/lib/i915/gem_context.c +++ b/lib/i915/gem_context.c @@ -517,3 +517,27 @@ uint32_t gem_context_create_for_class(int i915, *count = i; return p.ctx_id; } + +uint32_t gem_context_get_vm(int fd, uint32_t ctx_id) +{ + struct drm_i915_gem_context_param p = { + .param = I915_CONTEXT_PARAM_VM, + .ctx_id = ctx_id, + }; + + gem_context_get_param(fd, &p); + igt_assert(p.value); + + return p.value; +} + +void gem_context_set_vm(int fd, uint32_t ctx_id, uint32_t vm_id) +{ + struct drm_i915_gem_context_param p = { + .param = I915_CONTEXT_PARAM_VM, + .ctx_id = ctx_id, + .value = vm_id, + }; + + gem_context_set_param(fd, &p); +} diff --git a/lib/i915/gem_context.h b/lib/i915/gem_context.h index 505d55724e0a..2a2247fe108c 100644 --- a/lib/i915/gem_context.h +++ b/lib/i915/gem_context.h @@ -63,4 +63,7 @@ void gem_context_set_persistence(int i915, uint32_t ctx, bool state); bool gem_context_has_engine(int fd, uint32_t ctx, uint64_t engine); +uint32_t gem_context_get_vm(int fd, uint32_t ctx_id); +void gem_context_set_vm(int fd, uint32_t ctx_id, uint32_t vm_id); + #endif /* GEM_CONTEXT_H */ diff --git a/lib/i915/gem_vm.c b/lib/i915/gem_vm.c index 9a022a56c797..ee3c65d06e74 100644 --- a/lib/i915/gem_vm.c +++ b/lib/i915/gem_vm.c @@ -48,7 +48,7 @@ bool gem_has_vm(int i915) { uint32_t vm_id = 0; - __gem_vm_create(i915, &vm_id); + __gem_vm_create(i915, 0, &vm_id); if (vm_id) gem_vm_destroy(i915, vm_id); @@ -67,9 +67,9 @@ void gem_require_vm(int i915) igt_require(gem_has_vm(i915)); } -int __gem_vm_create(int i915, uint32_t *vm_id) +int __gem_vm_create(int i915, uint32_t flags, uint32_t *vm_id) { - struct drm_i915_gem_vm_control ctl = {}; + struct drm_i915_gem_vm_control ctl = { .flags = flags }; int err = 0; if (igt_ioctl(i915, DRM_IOCTL_I915_GEM_VM_CREATE, &ctl) == 0) { @@ -88,7 +88,8 @@ int __gem_vm_create(int i915, uint32_t *vm_id) * @i915: open i915 drm file descriptor * * This wraps the VM_CREATE ioctl, which is used to allocate a new - * address space for use with GEM contexts. + * address space for use with GEM contexts, with legacy execbuff + * method of binding. * * Returns: The id of the allocated address space. */ @@ -96,7 +97,27 @@ uint32_t gem_vm_create(int i915) { uint32_t vm_id; - igt_assert_eq(__gem_vm_create(i915, &vm_id), 0); + igt_assert_eq(__gem_vm_create(i915, 0, &vm_id), 0); + igt_assert(vm_id != 0); + + return vm_id; +} + +/** + * gem_vm_create_in_vm_bind_mode: + * @i915: open i915 drm file descriptor + * + * This wraps the VM_CREATE ioctl with I915_VM_CREATE_FLAGS_USE_VM_BIND, + * flag which is used to allocate a new address space for use with GEM contexts + * with vm_bind mode of binding. + * + * Returns: The id of the allocated address space. + */ +uint32_t gem_vm_create_in_vm_bind_mode(int i915) +{ + uint32_t vm_id; + + igt_assert_eq(__gem_vm_create(i915, I915_VM_CREATE_FLAGS_USE_VM_BIND, &vm_id), 0); igt_assert(vm_id != 0); return vm_id; diff --git a/lib/i915/gem_vm.h b/lib/i915/gem_vm.h index acbb663e65d9..6cf46d887612 100644 --- a/lib/i915/gem_vm.h +++ b/lib/i915/gem_vm.h @@ -31,7 +31,8 @@ bool gem_has_vm(int i915); void gem_require_vm(int i915); uint32_t gem_vm_create(int i915); -int __gem_vm_create(int i915, uint32_t *vm_id); +uint32_t gem_vm_create_in_vm_bind_mode(int i915); +int __gem_vm_create(int i915, uint32_t flags, uint32_t *vm_id); void gem_vm_destroy(int i915, uint32_t vm_id); int __gem_vm_destroy(int i915, uint32_t vm_id); diff --git a/lib/i915/intel_memory_region.c b/lib/i915/intel_memory_region.c index 593f4bedc874..28f1743dc7f2 100644 --- a/lib/i915/intel_memory_region.c +++ b/lib/i915/intel_memory_region.c @@ -197,10 +197,14 @@ bool gem_has_lmem(int fd) /* A version of gem_create_in_memory_region_list which can be allowed to fail so that the object creation can be retried */ -int __gem_create_in_memory_region_list(int fd, uint32_t *handle, uint64_t *size, +int __gem_create_in_memory_region_list(int fd, uint32_t *handle, uint64_t *size, uint32_t vm_id, struct drm_i915_gem_memory_class_instance *mem_regions, int num_regions) { + struct drm_i915_gem_create_ext_vm_private vm_priv = { + .base = { .name = I915_GEM_CREATE_EXT_VM_PRIVATE }, + .vm_id = vm_id, + }; struct drm_i915_gem_create_ext_memory_regions ext_regions = { .base = { .name = I915_GEM_CREATE_EXT_MEMORY_REGIONS }, .num_regions = num_regions, @@ -208,6 +212,9 @@ int __gem_create_in_memory_region_list(int fd, uint32_t *handle, uint64_t *size, }; int ret; + if (vm_id) + ext_regions.base.next_extension = to_user_pointer(&vm_priv.base); + ret = __gem_create_ext(fd, size, handle, &ext_regions.base); /* @@ -228,15 +235,16 @@ int __gem_create_in_memory_region_list(int fd, uint32_t *handle, uint64_t *size, /* gem_create_in_memory_region_list: * @fd: opened i915 drm file descriptor * @size: requested size of the buffer + * @vm_id: vm_id for VM private Objects. 0 for non-private Objects. * @mem_regions: memory regions array (priority list) * @num_regions: @mem_regions length */ -uint32_t gem_create_in_memory_region_list(int fd, uint64_t size, +uint32_t gem_create_in_memory_region_list(int fd, uint64_t size, uint32_t vm_id, struct drm_i915_gem_memory_class_instance *mem_regions, int num_regions) { uint32_t handle; - int ret = __gem_create_in_memory_region_list(fd, &handle, &size, + int ret = __gem_create_in_memory_region_list(fd, &handle, &size, vm_id, mem_regions, num_regions); igt_assert_eq(ret, 0); return handle; diff --git a/lib/i915/intel_memory_region.h b/lib/i915/intel_memory_region.h index f9af9401ea1e..bdac97d64e44 100644 --- a/lib/i915/intel_memory_region.h +++ b/lib/i915/intel_memory_region.h @@ -64,11 +64,11 @@ bool gem_has_lmem(int fd); struct drm_i915_gem_memory_class_instance; -int __gem_create_in_memory_region_list(int fd, uint32_t *handle, uint64_t *size, +int __gem_create_in_memory_region_list(int fd, uint32_t *handle, uint64_t *size, uint32_t vm_id, struct drm_i915_gem_memory_class_instance *mem_regions, int num_regions); -uint32_t gem_create_in_memory_region_list(int fd, uint64_t size, +uint32_t gem_create_in_memory_region_list(int fd, uint64_t size, uint32_t vm_id, struct drm_i915_gem_memory_class_instance *mem_regions, int num_regions); @@ -84,7 +84,7 @@ uint32_t gem_create_in_memory_region_list(int fd, uint64_t size, arr_query__[i__].memory_class = MEMORY_TYPE_FROM_REGION(arr__[i__]); \ arr_query__[i__].memory_instance = MEMORY_INSTANCE_FROM_REGION(arr__[i__]); \ } \ - __gem_create_in_memory_region_list(fd, handle, size, arr_query__, ARRAY_SIZE(arr_query__)); \ + __gem_create_in_memory_region_list(fd, handle, size, 0, arr_query__, ARRAY_SIZE(arr_query__)); \ }) #define gem_create_in_memory_regions(fd, size, regions...) ({ \ unsigned int arr__[] = { regions }; \ @@ -93,7 +93,17 @@ uint32_t gem_create_in_memory_region_list(int fd, uint64_t size, arr_query__[i__].memory_class = MEMORY_TYPE_FROM_REGION(arr__[i__]); \ arr_query__[i__].memory_instance = MEMORY_INSTANCE_FROM_REGION(arr__[i__]); \ } \ - gem_create_in_memory_region_list(fd, size, arr_query__, ARRAY_SIZE(arr_query__)); \ + gem_create_in_memory_region_list(fd, size, 0, arr_query__, ARRAY_SIZE(arr_query__)); \ +}) + +#define gem_create_vm_private_in_memory_regions(fd, size, vm_id, regions...) ({ \ + unsigned int arr__[] = { regions }; \ + struct drm_i915_gem_memory_class_instance arr_query__[ARRAY_SIZE(arr__)]; \ + for (int i__ = 0; i__ < ARRAY_SIZE(arr_query__); ++i__) { \ + arr_query__[i__].memory_class = MEMORY_TYPE_FROM_REGION(arr__[i__]); \ + arr_query__[i__].memory_instance = MEMORY_INSTANCE_FROM_REGION(arr__[i__]); \ + } \ + gem_create_in_memory_region_list(fd, size, vm_id, arr_query__, ARRAY_SIZE(arr_query__)); \ }) struct igt_collection * diff --git a/lib/ioctl_wrappers.c b/lib/ioctl_wrappers.c index 09eb3ce7b57b..ec6cfeaf82c1 100644 --- a/lib/ioctl_wrappers.c +++ b/lib/ioctl_wrappers.c @@ -707,6 +707,38 @@ void gem_execbuf_wr(int fd, struct drm_i915_gem_execbuffer2 *execbuf) } /** + * __gem_execbuf3: + * @fd: open i915 drm file descriptor + * @execbuf: execbuffer data structure + * + * This wraps the EXECBUFFER3 ioctl, which submits a batchbuffer for the gpu to + * run. This is allowed to fail, with -errno returned. + */ +int __gem_execbuf3(int fd, struct drm_i915_gem_execbuffer3 *execbuf) +{ + int err = 0; + if (igt_ioctl(fd, DRM_IOCTL_I915_GEM_EXECBUFFER3, execbuf)) { + err = -errno; + igt_assume(err != 0); + } + errno = 0; + return err; +} + +/** + * gem_execbuf3: + * @fd: open i915 drm file descriptor + * @execbuf: execbuffer data structure + * + * This wraps the EXECBUFFER3 ioctl, which submits a batchbuffer for the gpu to + * run. + */ +void gem_execbuf3(int fd, struct drm_i915_gem_execbuffer3 *execbuf) +{ + igt_assert_eq(__gem_execbuf3(fd, execbuf), 0); +} + +/** * gem_madvise: * @fd: open i915 drm file descriptor * @handle: gem buffer object handle @@ -1328,3 +1360,85 @@ bool igt_has_drm_cap(int fd, uint64_t capability) igt_assert(drmIoctl(fd, DRM_IOCTL_GET_CAP, &cap) == 0); return cap.value; } + +/* VM_BIND */ + +int __gem_vm_bind(int fd, uint32_t vm_id, uint32_t handle, uint64_t start, + uint64_t offset, uint64_t length, uint64_t flags, + uint64_t extensions) +{ + struct drm_i915_gem_vm_bind bind; + int err = 0; + + memset(&bind, 0, sizeof(bind)); + bind.vm_id = vm_id; + bind.handle = handle; + bind.start = start; + bind.offset = offset; + bind.length = length; + bind.flags = flags; + bind.extensions = extensions; + + if (drmIoctl(fd, DRM_IOCTL_I915_GEM_VM_BIND, &bind)) + err = -errno; + return err; +} + +/** + * gem_vm_bind: + * @fd: open i915 drm file descriptor + * @vm_id: address space id + * @handle: BO handle + * @start: VA start + * @offset: offset in BO + * @length: length of mapping + * @flags: flags + * @extensions: extensions + * + * This wraps the VM_BIND ioctl to bind an address range to + * the specified address space. + */ +void gem_vm_bind(int fd, uint32_t vm_id, uint32_t handle, uint64_t start, + uint64_t offset, uint64_t length, uint64_t flags, + uint64_t extensions) +{ + igt_assert_eq(__gem_vm_bind(fd, vm_id, handle, start, offset, length, + flags, extensions), 0); +} + +int __gem_vm_unbind(int fd, uint32_t vm_id, uint64_t start, uint64_t length, + uint64_t flags, uint64_t extensions) +{ + struct drm_i915_gem_vm_unbind unbind; + int err = 0; + + memset(&unbind, 0, sizeof(unbind)); + unbind.vm_id = vm_id; + unbind.start = start; + unbind.length = length; + unbind.flags = flags; + unbind.extensions = extensions; + + if (drmIoctl(fd, DRM_IOCTL_I915_GEM_VM_UNBIND, &unbind)) + err = -errno; + return err; +} + +/** + * gem_vm_unbind: + * @fd: open i915 drm file descriptor + * @vm_id: address space id + * @start: VA start + * @length: length of mapping + * @flags: flags + * @extensions: extensions + * + * This wraps the VM_UNBIND ioctl to unbind an address range from + * the specified address space. + */ +void gem_vm_unbind(int fd, uint32_t vm_id, uint64_t start, uint64_t length, + uint64_t flags, uint64_t extensions) +{ + igt_assert_eq(__gem_vm_unbind(fd, vm_id, start, length, flags, + extensions), 0); +} diff --git a/lib/ioctl_wrappers.h b/lib/ioctl_wrappers.h index 9a897fec2386..9cad3e4cee1a 100644 --- a/lib/ioctl_wrappers.h +++ b/lib/ioctl_wrappers.h @@ -84,6 +84,18 @@ void gem_execbuf_wr(int fd, struct drm_i915_gem_execbuffer2 *execbuf); int __gem_execbuf_wr(int fd, struct drm_i915_gem_execbuffer2 *execbuf); void gem_execbuf(int fd, struct drm_i915_gem_execbuffer2 *execbuf); int __gem_execbuf(int fd, struct drm_i915_gem_execbuffer2 *execbuf); +void gem_execbuf3(int fd, struct drm_i915_gem_execbuffer3 *execbuf); +int __gem_execbuf3(int fd, struct drm_i915_gem_execbuffer3 *execbuf); +int __gem_vm_bind(int fd, uint32_t vm_id, uint32_t handle, uint64_t start, + uint64_t offset, uint64_t length, uint64_t flags, + uint64_t extensions); +void gem_vm_bind(int fd, uint32_t vm_id, uint32_t handle, uint64_t start, + uint64_t offset, uint64_t length, uint64_t flags, + uint64_t extensions); +int __gem_vm_unbind(int fd, uint32_t vm_id, uint64_t start, uint64_t length, + uint64_t flags, uint64_t extensions); +void gem_vm_unbind(int fd, uint32_t vm_id, uint64_t start, uint64_t length, + uint64_t flags, uint64_t extensions); #ifndef I915_GEM_DOMAIN_WC #define I915_GEM_DOMAIN_WC 0x80 diff --git a/tests/i915/gem_eio.c b/tests/i915/gem_eio.c index 913a21f90476..c7eb53db3450 100644 --- a/tests/i915/gem_eio.c +++ b/tests/i915/gem_eio.c @@ -145,7 +145,7 @@ static void test_create_ext(int fd) igt_debug("Creating object in %s\n", r->name); igt_assert_eq(__gem_create_in_memory_region_list(fd, &handle, - &size, + &size, 0, &r->ci, 1), 0); diff --git a/tests/i915/gem_lmem_swapping.c b/tests/i915/gem_lmem_swapping.c index 5d93e9daae32..bb9e69db70ba 100644 --- a/tests/i915/gem_lmem_swapping.c +++ b/tests/i915/gem_lmem_swapping.c @@ -131,7 +131,7 @@ static uint32_t create_bo(int i915, int ret; retry: - ret = __gem_create_in_memory_region_list(i915, &handle, size, region, 1); + ret = __gem_create_in_memory_region_list(i915, &handle, size, 0, region, 1); if (do_oom_test && ret == -ENOMEM) goto retry; igt_assert_eq(ret, 0); diff --git a/tests/i915/i915_pm_rpm.c b/tests/i915/i915_pm_rpm.c index 461730e8a573..6b370d0bbca4 100644 --- a/tests/i915/i915_pm_rpm.c +++ b/tests/i915/i915_pm_rpm.c @@ -1413,7 +1413,7 @@ gem_execbuf_stress_subtest(int rounds, int wait_flags, if (wait_flags & WAIT_PC8_RES) handle = gem_create(drm_fd, batch_size); else - handle = gem_create_in_memory_region_list(drm_fd, batch_size, mem_regions, 1); + handle = gem_create_in_memory_region_list(drm_fd, batch_size, 0, mem_regions, 1); gem_write(drm_fd, handle, 0, batch_buf, batch_size); |