summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam Miszczak <adam.miszczak@linux.intel.com>2020-10-15 09:00:50 +0200
committerNiranjana Vishwanathapura <niranjana.vishwanathapura@intel.com>2022-06-17 21:27:58 +0000
commit5417d8f44d3afc35683351a3ef658bf4fe41fe88 (patch)
treec7a079e80e1e17d6e0d9fa96eea09c4ca18d5163
parent37ae32cab9029979191a6ca92af2450d46cca168 (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.c24
-rw-r--r--lib/i915/gem_context.h3
-rw-r--r--lib/i915/gem_vm.c31
-rw-r--r--lib/i915/gem_vm.h3
-rw-r--r--lib/i915/intel_memory_region.c14
-rw-r--r--lib/i915/intel_memory_region.h18
-rw-r--r--lib/ioctl_wrappers.c114
-rw-r--r--lib/ioctl_wrappers.h12
-rw-r--r--tests/i915/gem_eio.c2
-rw-r--r--tests/i915/gem_lmem_swapping.c2
-rw-r--r--tests/i915/i915_pm_rpm.c2
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);