On Wed, April 23, 2025 1:19 PM Cavitt, Jonathan wrote: > Add initial declarations for the drm_xe_vm_get_property ioctl. > > v2: > - Expand kernel docs for drm_xe_vm_get_property (Jianxun) > > v3: > - Remove address type external definitions (Jianxun) > - Add fault type to xe_drm_fault struct (Jianxun) > > v4: > - Remove engine class and instance (Ivan) > > v5: > - Add declares for fault type, access type, and fault level (Matt Brost, > Ivan) > > v6: > - Fix inconsistent use of whitespace in defines > > Signed-off-by: Jonathan Cavitt <jonathan.cav...@intel.com> > Cc: Zhang Jianxun <jianxun.zh...@intel.com> > Cc: Ivan Briano <ivan.bri...@intel.com> > Cc: Matthew Brost <matthew.br...@intel.com> > --- > include/uapi/drm/xe_drm.h | 86 > +++++++++++++++++++++++++++++++++++++++ > 1 file changed, 86 insertions(+) > > diff --git a/include/uapi/drm/xe_drm.h b/include/uapi/drm/xe_drm.h index > 9c08738c3b91..556fc360a076 100644 > --- a/include/uapi/drm/xe_drm.h > +++ b/include/uapi/drm/xe_drm.h > @@ -81,6 +81,7 @@ extern "C" { > * - &DRM_IOCTL_XE_EXEC > * - &DRM_IOCTL_XE_WAIT_USER_FENCE > * - &DRM_IOCTL_XE_OBSERVATION > + * - &DRM_IOCTL_XE_VM_GET_PROPERTY > */ > > /* > @@ -102,6 +103,7 @@ extern "C" { > #define DRM_XE_EXEC 0x09 > #define DRM_XE_WAIT_USER_FENCE 0x0a > #define DRM_XE_OBSERVATION 0x0b > +#define DRM_XE_VM_GET_PROPERTY 0x0c > > /* Must be kept compact -- no holes */ > > @@ -117,6 +119,7 @@ extern "C" { > #define DRM_IOCTL_XE_EXEC > DRM_IOW(DRM_COMMAND_BASE + DRM_XE_EXEC, struct > drm_xe_exec) > #define DRM_IOCTL_XE_WAIT_USER_FENCE > DRM_IOWR(DRM_COMMAND_BASE + DRM_XE_WAIT_USER_FENCE, > struct drm_xe_wait_user_fence) > #define DRM_IOCTL_XE_OBSERVATION > DRM_IOW(DRM_COMMAND_BASE + DRM_XE_OBSERVATION, struct > drm_xe_observation_param) > +#define DRM_IOCTL_XE_VM_GET_PROPERTY > DRM_IOWR(DRM_COMMAND_BASE + DRM_XE_VM_GET_PROPERTY, > struct drm_xe_vm_get_property) > > /** > * DOC: Xe IOCTL Extensions > @@ -1193,6 +1196,89 @@ struct drm_xe_vm_bind { > __u64 reserved[2]; > }; > > +/** struct xe_vm_fault - Describes faults for > +%DRM_XE_VM_GET_PROPERTY_FAULTS */ struct xe_vm_fault { > + /** @address: Address of the fault */ > + __u64 address; > + /** @address_precision: Precision of faulted address */ > + __u32 address_precision; > + /** @access_type: Type of address access that resulted in fault */ > +#define FAULT_ACCESS_TYPE_READ 0 > +#define FAULT_ACCESS_TYPE_WRITE 1 > +#define FAULT_ACCESS_TYPE_ATOMIC 2
There is the same definition of "FLT_ACCESS_TYPE_READ" in the "regs/xe_pagefault_desc.h" Could we remove the definition in xe_pagefault_desc.h, and change to this definition? Also for the access_type in below. Shuicheng > + __u8 access_type; > + /** @fault_type: Type of fault reported */ > +#define FAULT_TYPE_NOT_PRESENT 0 > +#define FAULT_TYPE_WRITE_ACCESS 1 > +#define FAULT_TYPE_ATOMIC_ACCESS 2 > + __u8 fault_type; > + /** @fault_level: fault level of the fault */ > +#define FAULT_LEVEL_PTE 0 > +#define FAULT_LEVEL_PDE 1 > +#define FAULT_LEVEL_PDP 2 > +#define FAULT_LEVEL_PML4 3 > +#define FAULT_LEVEL_PML5 4 > + __u8 fault_level; > + /** @pad: MBZ */ > + __u8 pad; > + /** @reserved: MBZ */ > + __u64 reserved[4]; > +}; > + > +/** > + * struct drm_xe_vm_get_property - Input of > +&DRM_IOCTL_XE_VM_GET_PROPERTY > + * > + * The user provides a VM and a property to query among > +DRM_XE_VM_GET_PROPERTY_*, > + * and sets the values in the vm_id and property members, respectively. > +This > + * determines both the VM to get the property of, as well as the > +property to > + * report. > + * > + * If size is set to 0, the driver fills it with the required size for > +the > + * requested property. The user is expected here to allocate memory > +for the > + * property structure and to provide a pointer to the allocated memory > +using the > + * data member. For some properties, this may be zero, in which case, > +the > + * value of the property will be saved to the value member and size > +will remain > + * zero on return. > + * > + * If size is not zero, then the IOCTL will attempt to copy the > +requested > + * property into the data member. > + * > + * The IOCTL will return -ENOENT if the VM could not be identified from > +the > + * provided VM ID, or -EINVAL if the IOCTL fails for any other reason, > +such as > + * providing an invalid size for the given property or if the property > +data > + * could not be copied to the memory allocated to the data member. > + * > + * The property member can be: > + * - %DRM_XE_VM_GET_PROPERTY_FAULTS > + */ > +struct drm_xe_vm_get_property { > + /** @extensions: Pointer to the first extension struct, if any */ > + __u64 extensions; > + > + /** @vm_id: The ID of the VM to query the properties of */ > + __u32 vm_id; > + > +#define DRM_XE_VM_GET_PROPERTY_FAULTS 0 > + /** @property: property to get */ > + __u32 property; > + > + /** @size: Size to allocate for @data */ > + __u32 size; > + > + /** @pad: MBZ */ > + __u32 pad; > + > + union { > + /** @data: Pointer to user-defined array of flexible size and > type */ > + __u64 data; > + /** @value: Return value for scalar queries */ > + __u64 value; > + }; > + > + /** @reserved: MBZ */ > + __u64 reserved[3]; > +}; > + > /** > * struct drm_xe_exec_queue_create - Input of > &DRM_IOCTL_XE_EXEC_QUEUE_CREATE > * > -- > 2.43.0