[PATCH i-g-t 1/7] drm-uapi/xe: Sync PXP uapi updates

Daniele Ceraolo Spurio daniele.ceraolospurio at intel.com
Wed Jan 15 23:26:45 UTC 2025


On 1/14/25 18:25, Teres Alexis, Alan Previn wrote:
> Since this has already received RB on the kernel side, I provide my RB here on condition that if anything changes on
> kernel side in coming days, we update this (ofc need to update anyway for reference kernel merge point).
>
> Reviewed-by: Alan Previn <alan.previn.teres.alexis at intel.com>
>
> As a side question (not blocking) i notice the UAPI documentation for DRM_XE_VM_BIND_FLAG_CHECK_PXP doesn't mention if
> the bind will still stick after a successful prior bind if a pxp teardown (key update) were to occur in future. (which i
> am guessing it would? - i.e. once bind, it is forever bound?).

Yes. The only impact is that any new binds will be rejected, no impact 
on existing ones.

Daniele

>
>
> On Wed, 2024-12-11 at 16:18 -0800, Daniele Ceraolo Spurio wrote:
>> Based on the kernel series still in review:
>> https://patchwork.freedesktop.org/series/136052/
>>
>> DO NOT MERGE: will respin with the final version once the kernel side is
>> merged
>>
>> Signed-off-by: Daniele Ceraolo Spurio <daniele.ceraolospurio at intel.com>
>> ---
>>   include/drm-uapi/xe_drm.h | 94 ++++++++++++++++++++++++++++++++++++++-
>>   1 file changed, 93 insertions(+), 1 deletion(-)
>>
>> diff --git a/include/drm-uapi/xe_drm.h b/include/drm-uapi/xe_drm.h
>> index 56163eb91..5b288af1f 100644
>> --- a/include/drm-uapi/xe_drm.h
>> +++ b/include/drm-uapi/xe_drm.h
>> @@ -629,6 +629,39 @@ struct drm_xe_query_uc_fw_version {
>>          __u64 reserved;
>>   };
>>   
>> +/**
>> + * struct drm_xe_query_pxp_status - query if PXP is ready
>> + *
>> + * If PXP is enabled and no fatal error as occurred, the status will be set to
>> + * one of the following values:
>> + * 0: PXP init still in progress
>> + * 1: PXP init complete
>> + *
>> + * If PXP is not enabled or something has gone wrong, the query will be failed
>> + * with one of the following error codes:
>> + * -ENODEV: PXP not supported or disabled;
>> + * -EIO: fatal error occurred during init, so PXP will never be enabled;
>> + * -EINVAL: incorrect value provided as part of the query;
>> + * -EFAULT: error copying the memory between kernel and userspace.
>> + *
>> + * The status can only be 0 in the first few seconds after driver load. If
>> + * everything works as expected, the status will transition to init complete in
>> + * less than 1 second, while in case of errors the driver might take longer to
>> + * start returning an error code, but it should still take less than 10 seconds.
>> + *
>> + * The supported session type bitmask is based on the values in
>> + * enum drm_xe_pxp_session_type. TYPE_NONE is always supported and therefore
>> + * is not reported in the bitmask.
>> + *
>> + */
>> +struct drm_xe_query_pxp_status {
>> +       /** @status: current PXP status */
>> +       __u32 status;
>> +
>> +       /** @supported_session_types: bitmask of supported PXP session types */
>> +       __u32 supported_session_types;
>> +};
>> +
>>   /**
>>    * struct drm_xe_device_query - Input of &DRM_IOCTL_XE_DEVICE_QUERY - main
>>    * structure to query device information
>> @@ -648,6 +681,7 @@ struct drm_xe_query_uc_fw_version {
>>    *    attributes.
>>    *  - %DRM_XE_DEVICE_QUERY_GT_TOPOLOGY
>>    *  - %DRM_XE_DEVICE_QUERY_ENGINE_CYCLES
>> + *  - %DRM_XE_DEVICE_QUERY_PXP_STATUS
>>    *
>>    * If size is set to 0, the driver fills it with the required size for
>>    * the requested type of data to query. If size is equal to the required
>> @@ -700,6 +734,7 @@ struct drm_xe_device_query {
>>   #define DRM_XE_DEVICE_QUERY_ENGINE_CYCLES      6
>>   #define DRM_XE_DEVICE_QUERY_UC_FW_VERSION      7
>>   #define DRM_XE_DEVICE_QUERY_OA_UNITS           8
>> +#define DRM_XE_DEVICE_QUERY_PXP_STATUS         9
>>          /** @query: The type of data to query */
>>          __u32 query;
>>   
>> @@ -743,8 +778,23 @@ struct drm_xe_device_query {
>>    *  - %DRM_XE_GEM_CPU_CACHING_WC - Allocate the pages as write-combined. This
>>    *    is uncached. Scanout surfaces should likely use this. All objects
>>    *    that can be placed in VRAM must use this.
>> + *
>> + * This ioctl supports setting the following properties via the
>> + * %DRM_XE_GEM_CREATE_EXTENSION_SET_PROPERTY extension, which uses the
>> + * generic @drm_xe_ext_set_property struct:
>> + *
>> + *  - %DRM_XE_GEM_CREATE_SET_PROPERTY_PXP_TYPE - set the type of PXP session
>> + *    this object will be used with. Valid values are listed in enum
>> + *    drm_xe_pxp_session_type. %DRM_XE_PXP_TYPE_NONE is the default behavior, so
>> + *    there is no need to explicitly set that. Objects used with session of type
>> + *    %DRM_XE_PXP_TYPE_HWDRM will be marked as invalid if a PXP invalidation
>> + *    event occurs after their creation. Attempting to flip an invalid object
>> + *    will cause a black frame to be displayed instead. Submissions with invalid
>> + *    objects mapped in the VM will be rejected.
>>    */
>>   struct drm_xe_gem_create {
>> +#define DRM_XE_GEM_CREATE_EXTENSION_SET_PROPERTY       0
>> +#define   DRM_XE_GEM_CREATE_SET_PROPERTY_PXP_TYPE      0
>>          /** @extensions: Pointer to the first extension struct, if any */
>>          __u64 extensions;
>>   
>> @@ -906,6 +956,9 @@ struct drm_xe_vm_destroy {
>>    *    will only be valid for DRM_XE_VM_BIND_OP_MAP operations, the BO
>>    *    handle MBZ, and the BO offset MBZ. This flag is intended to
>>    *    implement VK sparse bindings.
>> + *  - %DRM_XE_VM_BIND_FLAG_CHECK_PXP - If the object is encrypted via PXP,
>> + *    reject the binding if the encryption key is no longer valid. This
>> + *    flag has no effect on BOs that are not marked as using PXP.
>>    */
>>   struct drm_xe_vm_bind_op {
>>          /** @extensions: Pointer to the first extension struct, if any */
>> @@ -996,6 +1049,7 @@ struct drm_xe_vm_bind_op {
>>   #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)
>> +#define DRM_XE_VM_BIND_FLAG_CHECK_PXP  (1 << 4)
>>          /** @flags: Bind flags */
>>          __u32 flags;
>>   
>> @@ -1087,6 +1141,24 @@ struct drm_xe_vm_bind {
>>   /**
>>    * struct drm_xe_exec_queue_create - Input of &DRM_IOCTL_XE_EXEC_QUEUE_CREATE
>>    *
>> + * This ioctl supports setting the following properties via the
>> + * %DRM_XE_EXEC_QUEUE_EXTENSION_SET_PROPERTY extension, which uses the
>> + * generic @drm_xe_ext_set_property struct:
>> + *
>> + *  - %DRM_XE_EXEC_QUEUE_SET_PROPERTY_PRIORITY - set the queue priority.
>> + *    CAP_SYS_NICE is required to set a value above normal.
>> + *  - %DRM_XE_EXEC_QUEUE_SET_PROPERTY_TIMESLICE - set the queue timeslice
>> + *    duration.
>> + *  - %DRM_XE_EXEC_QUEUE_SET_PROPERTY_PXP_TYPE - set the type of PXP session
>> + *    this queue will be used with. Valid values are listed in enum
>> + *    drm_xe_pxp_session_type. %DRM_XE_PXP_TYPE_NONE is the default behavior, so
>> + *    there is no need to explicitly set that. When a queue of type
>> + *    %DRM_XE_PXP_TYPE_HWDRM is created, the PXP default HWDRM session
>> + *    (%XE_PXP_HWDRM_DEFAULT_SESSION) will be started, if isn't already running.
>> + *    Given that going into a power-saving state kills PXP HWDRM sessions,
>> + *    runtime PM will be blocked while queues of this type are alive.
>> + *    All PXP queues will be killed if a PXP invalidation event occurs.
>> + *
>>    * The example below shows how to use @drm_xe_exec_queue_create to create
>>    * a simple exec_queue (no parallel submission) of class
>>    * &DRM_XE_ENGINE_CLASS_RENDER.
>> @@ -1110,7 +1182,7 @@ struct drm_xe_exec_queue_create {
>>   #define DRM_XE_EXEC_QUEUE_EXTENSION_SET_PROPERTY               0
>>   #define   DRM_XE_EXEC_QUEUE_SET_PROPERTY_PRIORITY              0
>>   #define   DRM_XE_EXEC_QUEUE_SET_PROPERTY_TIMESLICE             1
>> -
>> +#define   DRM_XE_EXEC_QUEUE_SET_PROPERTY_PXP_TYPE              2
>>          /** @extensions: Pointer to the first extension struct, if any */
>>          __u64 extensions;
>>   
>> @@ -1713,6 +1785,26 @@ struct drm_xe_oa_stream_info {
>>          __u64 reserved[3];
>>   };
>>   
>> +/**
>> + * enum drm_xe_pxp_session_type - Supported PXP session types.
>> + *
>> + * We currently only support HWDRM sessions, which are used for protected
>> + * content that ends up being displayed, but the HW supports multiple types, so
>> + * we might extend support in the future.
>> + */
>> +enum drm_xe_pxp_session_type {
>> +       /** @DRM_XE_PXP_TYPE_NONE: PXP not used */
>> +       DRM_XE_PXP_TYPE_NONE = 0,
>> +       /**
>> +        * @DRM_XE_PXP_TYPE_HWDRM: HWDRM sessions are used for content that ends
>> +        * up on the display.
>> +        */
>> +       DRM_XE_PXP_TYPE_HWDRM = 1,
>> +};
>> +
>> +/* ID of the protected content session managed by Xe when PXP is active */
>> +#define DRM_XE_PXP_HWDRM_DEFAULT_SESSION 0xf
>> +
>>   #if defined(__cplusplus)
>>   }
>>   #endif


More information about the igt-dev mailing list