<div dir="ltr"><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sat, Jun 25, 2022 at 8:49 PM Niranjana Vishwanathapura <<a href="mailto:niranjana.vishwanathapura@intel.com">niranjana.vishwanathapura@intel.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">VM_BIND and related uapi definitions<br>
<br>
v2: Reduce the scope to simple Mesa use case.<br>
v3: Expand VM_UNBIND documentation and add<br>
    I915_GEM_VM_BIND/UNBIND_FENCE_VALID<br>
    and I915_GEM_VM_BIND_TLB_FLUSH flags.<br>
v4: Remove I915_GEM_VM_BIND_TLB_FLUSH flag and add additional<br>
    documentation for vm_bind/unbind.<br>
v5: Remove TLB flush requirement on VM_UNBIND.<br>
    Add version support to stage implementation.<br>
v6: Define and use drm_i915_gem_timeline_fence structure for<br>
    all timeline fences.<br>
v7: Rename I915_PARAM_HAS_VM_BIND to I915_PARAM_VM_BIND_VERSION.<br>
    Update documentation on async vm_bind/unbind and versioning.<br>
    Remove redundant vm_bind/unbind FENCE_VALID flag, execbuf3<br>
    batch_count field and I915_EXEC3_SECURE flag.<br>
<br>
Signed-off-by: Niranjana Vishwanathapura <<a href="mailto:niranjana.vishwanathapura@intel.com" target="_blank">niranjana.vishwanathapura@intel.com</a>><br>
Reviewed-by: Daniel Vetter <<a href="mailto:daniel.vetter@ffwll.ch" target="_blank">daniel.vetter@ffwll.ch</a>><br>
---<br>
 Documentation/gpu/rfc/i915_vm_bind.h | 280 +++++++++++++++++++++++++++<br>
 1 file changed, 280 insertions(+)<br>
 create mode 100644 Documentation/gpu/rfc/i915_vm_bind.h<br>
<br>
diff --git a/Documentation/gpu/rfc/i915_vm_bind.h b/Documentation/gpu/rfc/i915_vm_bind.h<br>
new file mode 100644<br>
index 000000000000..a93e08bceee6<br>
--- /dev/null<br>
+++ b/Documentation/gpu/rfc/i915_vm_bind.h<br>
@@ -0,0 +1,280 @@<br>
+/* SPDX-License-Identifier: MIT */<br>
+/*<br>
+ * Copyright © 2022 Intel Corporation<br>
+ */<br>
+<br>
+/**<br>
+ * DOC: I915_PARAM_VM_BIND_VERSION<br>
+ *<br>
+ * VM_BIND feature version supported.<br>
+ * See typedef drm_i915_getparam_t param.<br>
+ *<br>
+ * Specifies the VM_BIND feature version supported.<br>
+ * The following versions of VM_BIND have been defined:<br>
+ *<br>
+ * 0: No VM_BIND support.<br>
+ *<br>
+ * 1: In VM_UNBIND calls, the UMD must specify the exact mappings created<br>
+ *    previously with VM_BIND, the ioctl will not support unbinding multiple<br>
+ *    mappings or splitting them. Similarly, VM_BIND calls will not replace<br>
+ *    any existing mappings.<br>
+ *<br>
+ * 2: The restrictions on unbinding partial or multiple mappings is<br>
+ *    lifted, Similarly, binding will replace any mappings in the given range.<br>
+ *<br>
+ * See struct drm_i915_gem_vm_bind and struct drm_i915_gem_vm_unbind.<br>
+ */<br>
+#define I915_PARAM_VM_BIND_VERSION     57<br>
+<br>
+/**<br>
+ * DOC: I915_VM_CREATE_FLAGS_USE_VM_BIND<br>
+ *<br>
+ * Flag to opt-in for VM_BIND mode of binding during VM creation.<br>
+ * See struct drm_i915_gem_vm_control flags.<br>
+ *<br>
+ * The older execbuf2 ioctl will not support VM_BIND mode of operation.<br>
+ * For VM_BIND mode, we have new execbuf3 ioctl which will not accept any<br>
+ * execlist (See struct drm_i915_gem_execbuffer3 for more details).<br>
+ */<br>
+#define I915_VM_CREATE_FLAGS_USE_VM_BIND       (1 << 0)<br>
+<br>
+/* VM_BIND related ioctls */<br>
+#define DRM_I915_GEM_VM_BIND           0x3d<br>
+#define DRM_I915_GEM_VM_UNBIND         0x3e<br>
+#define DRM_I915_GEM_EXECBUFFER3       0x3f<br>
+<br>
+#define DRM_IOCTL_I915_GEM_VM_BIND             DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_VM_BIND, struct drm_i915_gem_vm_bind)<br>
+#define DRM_IOCTL_I915_GEM_VM_UNBIND           DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_VM_UNBIND, struct drm_i915_gem_vm_bind)<br>
+#define DRM_IOCTL_I915_GEM_EXECBUFFER3         DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_EXECBUFFER3, struct drm_i915_gem_execbuffer3)<br>
+<br>
+/**<br>
+ * struct drm_i915_gem_timeline_fence - An input or output timeline fence.<br>
+ *<br>
+ * The operation will wait for input fence to signal.<br>
+ *<br>
+ * The returned output fence will be signaled after the completion of the<br>
+ * operation.<br>
+ */<br>
+struct drm_i915_gem_timeline_fence {<br>
+       /** @handle: User's handle for a drm_syncobj to wait on or signal. */<br>
+       __u32 handle;<br>
+<br>
+       /**<br>
+        * @flags: Supported flags are:<br>
+        *<br>
+        * I915_TIMELINE_FENCE_WAIT:<br>
+        * Wait for the input fence before the operation.<br>
+        *<br>
+        * I915_TIMELINE_FENCE_SIGNAL:<br>
+        * Return operation completion fence as output.<br>
+        */<br>
+       __u32 flags;<br>
+#define I915_TIMELINE_FENCE_WAIT            (1 << 0)<br>
+#define I915_TIMELINE_FENCE_SIGNAL          (1 << 1)<br>
+#define __I915_TIMELINE_FENCE_UNKNOWN_FLAGS (-(I915_TIMELINE_FENCE_SIGNAL << 1))<br>
+<br>
+       /**<br>
+        * @value: A point in the timeline.<br>
+        * Value must be 0 for a binary drm_syncobj. A Value of 0 for a<br>
+        * timeline drm_syncobj is invalid as it turns a drm_syncobj into a<br>
+        * binary one.<br>
+        */<br>
+       __u64 value;<br>
+};<br>
+<br>
+/**<br>
+ * struct drm_i915_gem_vm_bind - VA to object mapping to bind.<br>
+ *<br>
+ * This structure is passed to VM_BIND ioctl and specifies the mapping of GPU<br>
+ * virtual address (VA) range to the section of an object that should be bound<br>
+ * in the device page table of the specified address space (VM).<br>
+ * The VA range specified must be unique (ie., not currently bound) and can<br>
+ * be mapped to whole object or a section of the object (partial binding).<br>
+ * Multiple VA mappings can be created to the same section of the object<br>
+ * (aliasing).<br>
+ *<br>
+ * The @start, @offset and @length must be 4K page aligned. However the DG2<br>
+ * and XEHPSDV has 64K page size for device local-memory and has compact page<br>
+ * table. On those platforms, for binding device local-memory objects, the<br>
+ * @start must be 2M aligned, @offset and @length must be 64K aligned.<br>
+ * Also, for such mappings, i915 will reserve the whole 2M range for it so as<br>
+ * to not allow multiple mappings in that 2M range (Compact page tables do not<br>
+ * allow 64K page and 4K page bindings in the same 2M range).<br>
+ *<br>
+ * Error code -EINVAL will be returned if @start, @offset and @length are not<br>
+ * properly aligned. In version 1 (See I915_PARAM_VM_BIND_VERSION), error code<br>
+ * -ENOSPC will be returned if the VA range specified can't be reserved.<br>
+ *<br>
+ * VM_BIND/UNBIND ioctl calls executed on different CPU threads concurrently<br>
+ * are not ordered. Furthermore, parts of the VM_BIND operation can be done<br>
+ * asynchronously, if valid @fence is specified.<br>
+ */<br>
+struct drm_i915_gem_vm_bind {<br>
+       /** @vm_id: VM (address space) id to bind */<br>
+       __u32 vm_id;<br>
+<br>
+       /** @handle: Object handle */<br>
+       __u32 handle;<br>
+<br>
+       /** @start: Virtual Address start to bind */<br>
+       __u64 start;<br>
+<br>
+       /** @offset: Offset in object to bind */<br>
+       __u64 offset;<br>
+<br>
+       /** @length: Length of mapping to bind */<br>
+       __u64 length;<br>
+<br>
+       /**<br>
+        * @flags: Supported flags are:<br>
+        *<br>
+        * I915_GEM_VM_BIND_READONLY:<br>
+        * Mapping is read-only.<br>
+        *<br>
+        * I915_GEM_VM_BIND_CAPTURE:<br>
+        * Capture this mapping in the dump upon GPU error.<br>
+        */<br>
+       __u64 flags;<br>
+#define I915_GEM_VM_BIND_READONLY      (1 << 1)<br>
+#define I915_GEM_VM_BIND_CAPTURE       (1 << 2)<br>
+<br>
+       /**<br>
+        * @fence: Timeline fence for bind completion signaling.<br>
+        *<br>
+        * It is an out fence, hence using I915_TIMELINE_FENCE_WAIT flag<br>
+        * is invalid, and an error will be returned.<br>
+        */<br>
+       struct drm_i915_gem_timeline_fence fence;<br></blockquote><div><br></div><div>Why a single fence and not an array of fences?  If Mesa wants to use the out fences for signalling VkSemaphores on the sparse binding queue, we need N of them.  We can still have the "zero fences means block" behavior.</div><div><br></div><div>--Jason<br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
+<br>
+       /**<br>
+        * @extensions: Zero-terminated chain of extensions.<br>
+        *<br>
+        * For future extensions. See struct i915_user_extension.<br>
+        */<br>
+       __u64 extensions;<br>
+};<br>
+<br>
+/**<br>
+ * struct drm_i915_gem_vm_unbind - VA to object mapping to unbind.<br>
+ *<br>
+ * This structure is passed to VM_UNBIND ioctl and specifies the GPU virtual<br>
+ * address (VA) range that should be unbound from the device page table of the<br>
+ * specified address space (VM). VM_UNBIND will force unbind the specified<br>
+ * range from device page table without waiting for any GPU job to complete.<br>
+ * It is UMDs responsibility to ensure the mapping is no longer in use before<br>
+ * calling VM_UNBIND.<br>
+ *<br>
+ * If the specified mapping is not found, the ioctl will simply return without<br>
+ * any error.<br>
+ *<br>
+ * VM_BIND/UNBIND ioctl calls executed on different CPU threads concurrently<br>
+ * are not ordered. Furthermore, parts of the VM_UNBIND operation can be done<br>
+ * asynchronously, if valid @fence is specified.<br>
+ */<br>
+struct drm_i915_gem_vm_unbind {<br>
+       /** @vm_id: VM (address space) id to bind */<br>
+       __u32 vm_id;<br>
+<br>
+       /** @rsvd: Reserved, MBZ */<br>
+       __u32 rsvd;<br>
+<br>
+       /** @start: Virtual Address start to unbind */<br>
+       __u64 start;<br>
+<br>
+       /** @length: Length of mapping to unbind */<br>
+       __u64 length;<br>
+<br>
+       /** @flags: Currently reserved, MBZ */<br>
+       __u64 flags;<br>
+<br>
+       /**<br>
+        * @fence: Timeline fence for unbind completion signaling.<br>
+        *<br>
+        * It is an out fence, hence using I915_TIMELINE_FENCE_WAIT flag<br>
+        * is invalid, and an error will be returned.<br>
+        */<br>
+       struct drm_i915_gem_timeline_fence fence;<br>
+<br>
+       /**<br>
+        * @extensions: Zero-terminated chain of extensions.<br>
+        *<br>
+        * For future extensions. See struct i915_user_extension.<br>
+        */<br>
+       __u64 extensions;<br>
+};<br>
+<br>
+/**<br>
+ * struct drm_i915_gem_execbuffer3 - Structure for DRM_I915_GEM_EXECBUFFER3<br>
+ * ioctl.<br>
+ *<br>
+ * DRM_I915_GEM_EXECBUFFER3 ioctl only works in VM_BIND mode and VM_BIND mode<br>
+ * only works with this ioctl for submission.<br>
+ * See I915_VM_CREATE_FLAGS_USE_VM_BIND.<br>
+ */<br>
+struct drm_i915_gem_execbuffer3 {<br>
+       /**<br>
+        * @ctx_id: Context id<br>
+        *<br>
+        * Only contexts with user engine map are allowed.<br>
+        */<br>
+       __u32 ctx_id;<br>
+<br>
+       /**<br>
+        * @engine_idx: Engine index<br>
+        *<br>
+        * An index in the user engine map of the context specified by @ctx_id.<br>
+        */<br>
+       __u32 engine_idx;<br>
+<br>
+       /**<br>
+        * @batch_address: Batch gpu virtual address/es.<br>
+        *<br>
+        * For normal submission, it is the gpu virtual address of the batch<br>
+        * buffer. For parallel submission, it is a pointer to an array of<br>
+        * batch buffer gpu virtual addresses with array size equal to the<br>
+        * number of (parallel) engines involved in that submission (See<br>
+        * struct i915_context_engines_parallel_submit).<br>
+        */<br>
+       __u64 batch_address;<br>
+<br>
+       /** @flags: Currently reserved, MBZ */<br>
+       __u64 flags;<br>
+<br>
+       /** @rsvd1: Reserved, MBZ */<br>
+       __u32 rsvd1;<br>
+<br>
+       /** @fence_count: Number of fences in @timeline_fences array. */<br>
+       __u32 fence_count;<br>
+<br>
+       /**<br>
+        * @timeline_fences: Pointer to an array of timeline fences.<br>
+        *<br>
+        * Timeline fences are of format struct drm_i915_gem_timeline_fence.<br>
+        */<br>
+       __u64 timeline_fences;<br>
+<br>
+       /** @rsvd2: Reserved, MBZ */<br>
+       __u64 rsvd2;<br>
+<br>
+       /**<br>
+        * @extensions: Zero-terminated chain of extensions.<br>
+        *<br>
+        * For future extensions. See struct i915_user_extension.<br>
+        */<br>
+       __u64 extensions;<br>
+};<br>
+<br>
+/**<br>
+ * struct drm_i915_gem_create_ext_vm_private - Extension to make the object<br>
+ * private to the specified VM.<br>
+ *<br>
+ * See struct drm_i915_gem_create_ext.<br>
+ */<br>
+struct drm_i915_gem_create_ext_vm_private {<br>
+#define I915_GEM_CREATE_EXT_VM_PRIVATE         2<br>
+       /** @base: Extension link. See struct i915_user_extension. */<br>
+       struct i915_user_extension base;<br>
+<br>
+       /** @vm_id: Id of the VM to which the object is private */<br>
+       __u32 vm_id;<br>
+};<br>
-- <br>
2.21.0.rc0.32.g243a4c7e27<br>
<br>
</blockquote></div></div>