summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrancois Dugast <francois.dugast@intel.com>2024-04-12 14:21:59 +0000
committerKamil Konieczny <kamil.konieczny@linux.intel.com>2024-04-24 16:43:50 +0200
commitfffcce4ac88b1c4e68825d564515470e72d2c40f (patch)
tree27c6c5c45709350c052bd65c822de634c8f4a400
parent6114611af7e544dc1c812c85b56c6a74b20f9be1 (diff)
drm-uapi/xe: Restore flags VM_BIND_FLAG_READONLY and VM_BIND_FLAG_IMMEDIATE
The commit ca4607939 ("drm/xe/uapi: Remove unused flags") is partially reverted. At the time, flags not used by user space were removed during cleanup. As a consequence, tests depending on those flags were also removed. Some of those flags are now needed by user space, so bring them back and the removed tests as well. Align with kernel commit ("drm/xe/uapi: Restore flags \ VM_BIND_FLAG_READONLY and VM_BIND_FLAG_IMMEDIATE"). v2: Fix missing period in kernel doc (Ashutosh Dixit) Signed-off-by: Francois Dugast <francois.dugast@intel.com> Acked-by: Ashutosh Dixit <ashutosh.dixit@intel.com> Reviewed-by: Kamil Konieczny <kamil.konieczny@linux.intel.com>
-rw-r--r--include/drm-uapi/xe_drm.h8
-rw-r--r--tests/intel-ci/xe-fast-feedback.testlist10
-rw-r--r--tests/intel/xe_exec_fault_mode.c65
-rw-r--r--tests/intel/xe_vm.c16
4 files changed, 85 insertions, 14 deletions
diff --git a/include/drm-uapi/xe_drm.h b/include/drm-uapi/xe_drm.h
index d8816df83..0b709b374 100644
--- a/include/drm-uapi/xe_drm.h
+++ b/include/drm-uapi/xe_drm.h
@@ -871,6 +871,12 @@ struct drm_xe_vm_destroy {
* - %DRM_XE_VM_BIND_OP_PREFETCH
*
* and the @flags can be:
+ * - %DRM_XE_VM_BIND_FLAG_READONLY - Setup the page tables as read-only
+ * to ensure write protection
+ * - %DRM_XE_VM_BIND_FLAG_IMMEDIATE - On a faulting VM, do the
+ * MAP operation immediately rather than deferring the MAP to the page
+ * fault handler. This is implied on a non-faulting VM as there is no
+ * fault handler to defer to.
* - %DRM_XE_VM_BIND_FLAG_NULL - When the NULL flag is set, the page
* tables are setup with a special bit which indicates writes are
* dropped and all reads return zero. In the future, the NULL flags
@@ -963,6 +969,8 @@ struct drm_xe_vm_bind_op {
/** @op: Bind operation to perform */
__u32 op;
+#define DRM_XE_VM_BIND_FLAG_READONLY (1 << 0)
+#define DRM_XE_VM_BIND_FLAG_IMMEDIATE (1 << 1)
#define DRM_XE_VM_BIND_FLAG_NULL (1 << 2)
#define DRM_XE_VM_BIND_FLAG_DUMPABLE (1 << 3)
/** @flags: Bind flags */
diff --git a/tests/intel-ci/xe-fast-feedback.testlist b/tests/intel-ci/xe-fast-feedback.testlist
index f9dbf5705..c57706f25 100644
--- a/tests/intel-ci/xe-fast-feedback.testlist
+++ b/tests/intel-ci/xe-fast-feedback.testlist
@@ -223,6 +223,16 @@ igt@xe_exec_fault_mode@twice-bindexecqueue-userptr
igt@xe_exec_fault_mode@twice-bindexecqueue-rebind
igt@xe_exec_fault_mode@twice-bindexecqueue-userptr-rebind
igt@xe_exec_fault_mode@twice-bindexecqueue-userptr-invalidate
+igt@xe_exec_fault_mode@twice-basic-imm
+igt@xe_exec_fault_mode@twice-userptr-imm
+igt@xe_exec_fault_mode@twice-rebind-imm
+igt@xe_exec_fault_mode@twice-userptr-rebind-imm
+igt@xe_exec_fault_mode@twice-userptr-invalidate-imm
+igt@xe_exec_fault_mode@twice-bindexecqueue-imm
+igt@xe_exec_fault_mode@twice-bindexecqueue-userptr-imm
+igt@xe_exec_fault_mode@twice-bindexecqueue-rebind-imm
+igt@xe_exec_fault_mode@twice-bindexecqueue-userptr-rebind-imm
+igt@xe_exec_fault_mode@twice-bindexecqueue-userptr-invalidate-imm
igt@xe_exec_fault_mode@twice-basic-prefetch
igt@xe_exec_fault_mode@twice-userptr-prefetch
igt@xe_exec_fault_mode@twice-rebind-prefetch
diff --git a/tests/intel/xe_exec_fault_mode.c b/tests/intel/xe_exec_fault_mode.c
index 4ef5ec3c9..0b3f4cb8d 100644
--- a/tests/intel/xe_exec_fault_mode.c
+++ b/tests/intel/xe_exec_fault_mode.c
@@ -29,10 +29,11 @@
#define INVALIDATE (0x1 << 2)
#define RACE (0x1 << 3)
#define BIND_EXEC_QUEUE (0x1 << 4)
-#define PREFETCH (0x1 << 5)
-#define INVALID_FAULT (0x1 << 6)
-#define INVALID_VA (0x1 << 7)
-#define ENABLE_SCRATCH (0x1 << 8)
+#define IMMEDIATE (0x1 << 5)
+#define PREFETCH (0x1 << 6)
+#define INVALID_FAULT (0x1 << 7)
+#define INVALID_VA (0x1 << 8)
+#define ENABLE_SCRATCH (0x1 << 9)
/**
* SUBTEST: invalid-va
@@ -75,6 +76,21 @@
* bindexecqueue userptr invalidate
* @bindexecqueue-userptr-invalidate-race:
* bindexecqueue userptr invalidate race
+ * @basic-imm: basic imm
+ * @userptr-imm: userptr imm
+ * @rebind-imm: rebind imm
+ * @userptr-rebind-imm: userptr rebind imm
+ * @userptr-invalidate-imm: userptr invalidate imm
+ * @userptr-invalidate-race-imm: userptr invalidate race imm
+ * @bindexecqueue-imm: bindexecqueue imm
+ * @bindexecqueue-userptr-imm: bindexecqueue userptr imm
+ * @bindexecqueue-rebind-imm: bindexecqueue rebind imm
+ * @bindexecqueue-userptr-rebind-imm:
+ * bindexecqueue userptr rebind imm
+ * @bindexecqueue-userptr-invalidate-imm:
+ * bindexecqueue userptr invalidate imm
+ * @bindexecqueue-userptr-invalidate-race-imm:
+ * bindexecqueue userptr invalidate race imm
* @basic-prefetch: basic prefetch
* @userptr-prefetch: userptr prefetch
* @rebind-prefetch: rebind prefetch
@@ -170,12 +186,26 @@ test_exec(int fd, struct drm_xe_engine_class_instance *eci,
};
sync[0].addr = to_user_pointer(&data[0].vm_sync);
- if (bo)
- xe_vm_bind_async(fd, vm, bind_exec_queues[0], bo, 0, addr, bo_size, sync, 1);
- else
- xe_vm_bind_userptr_async(fd, vm, bind_exec_queues[0],
- to_user_pointer(data), addr,
+ if (flags & IMMEDIATE) {
+ if (bo)
+ xe_vm_bind_async_flags(fd, vm, bind_exec_queues[0], bo, 0,
+ addr, bo_size, sync, 1,
+ DRM_XE_VM_BIND_FLAG_IMMEDIATE);
+ else
+ xe_vm_bind_userptr_async_flags(fd, vm, bind_exec_queues[0],
+ to_user_pointer(data),
+ addr, bo_size, sync, 1,
+ DRM_XE_VM_BIND_FLAG_IMMEDIATE);
+ } else {
+ if (bo)
+ xe_vm_bind_async(fd, vm, bind_exec_queues[0], bo, 0, addr,
bo_size, sync, 1);
+ else
+ xe_vm_bind_userptr_async(fd, vm, bind_exec_queues[0],
+ to_user_pointer(data), addr,
+ bo_size, sync, 1);
+ }
+
#define ONE_SEC MS_TO_NS(1000)
xe_wait_ufence(fd, &data[0].vm_sync, USER_FENCE_VALUE,
bind_exec_queues[0], ONE_SEC);
@@ -336,6 +366,23 @@ igt_main
INVALIDATE },
{ "bindexecqueue-userptr-invalidate-race", BIND_EXEC_QUEUE | USERPTR |
INVALIDATE | RACE },
+ { "basic-imm", IMMEDIATE },
+ { "userptr-imm", IMMEDIATE | USERPTR },
+ { "rebind-imm", IMMEDIATE | REBIND },
+ { "userptr-rebind-imm", IMMEDIATE | USERPTR | REBIND },
+ { "userptr-invalidate-imm", IMMEDIATE | USERPTR | INVALIDATE },
+ { "userptr-invalidate-race-imm", IMMEDIATE | USERPTR |
+ INVALIDATE | RACE },
+ { "bindexecqueue-imm", IMMEDIATE | BIND_EXEC_QUEUE },
+ { "bindexecqueue-userptr-imm", IMMEDIATE | BIND_EXEC_QUEUE | USERPTR },
+ { "bindexecqueue-rebind-imm", IMMEDIATE | BIND_EXEC_QUEUE | REBIND },
+ { "bindexecqueue-userptr-rebind-imm", IMMEDIATE | BIND_EXEC_QUEUE |
+ USERPTR | REBIND },
+ { "bindexecqueue-userptr-invalidate-imm", IMMEDIATE | BIND_EXEC_QUEUE |
+ USERPTR | INVALIDATE },
+ { "bindexecqueue-userptr-invalidate-race-imm", IMMEDIATE |
+ BIND_EXEC_QUEUE | USERPTR | INVALIDATE | RACE },
+
{ "basic-prefetch", PREFETCH },
{ "userptr-prefetch", PREFETCH | USERPTR },
{ "rebind-prefetch", PREFETCH | REBIND },
diff --git a/tests/intel/xe_vm.c b/tests/intel/xe_vm.c
index 13cca2752..de2b1a813 100644
--- a/tests/intel/xe_vm.c
+++ b/tests/intel/xe_vm.c
@@ -1802,6 +1802,16 @@ static void bind_flag_invalid(int fd)
igt_assert(syncobj_wait(fd, &sync[0].handle, 1, INT64_MAX, 0, NULL));
syncobj_reset(fd, &sync[0].handle, 1);
+ bind.bind.flags = DRM_XE_VM_BIND_FLAG_READONLY;
+ igt_ioctl(fd, DRM_IOCTL_XE_VM_BIND, &bind);
+ igt_assert(syncobj_wait(fd, &sync[0].handle, 1, INT64_MAX, 0, NULL));
+ syncobj_reset(fd, &sync[0].handle, 1);
+
+ bind.bind.flags = DRM_XE_VM_BIND_FLAG_IMMEDIATE;
+ igt_ioctl(fd, DRM_IOCTL_XE_VM_BIND, &bind);
+ igt_assert(syncobj_wait(fd, &sync[0].handle, 1, INT64_MAX, 0, NULL));
+ syncobj_reset(fd, &sync[0].handle, 1);
+
bind.bind.flags = DRM_XE_VM_BIND_FLAG_NULL;
bind.bind.obj = 0;
igt_ioctl(fd, DRM_IOCTL_XE_VM_BIND, &bind);
@@ -1815,11 +1825,7 @@ static void bind_flag_invalid(int fd)
syncobj_reset(fd, &sync[0].handle, 1);
/* Using invalid flags should not work */
- bind.bind.flags = 1 << 0;
- igt_ioctl(fd, DRM_IOCTL_XE_VM_BIND, &bind);
- do_ioctl_err(fd, DRM_IOCTL_XE_VM_BIND, &bind, EINVAL);
-
- bind.bind.flags = 1 << 1;
+ bind.bind.flags = 1 << 4;
igt_ioctl(fd, DRM_IOCTL_XE_VM_BIND, &bind);
do_ioctl_err(fd, DRM_IOCTL_XE_VM_BIND, &bind, EINVAL);