[PATCH v2] drm/xe/uapi: restructure query config types in an enum

Lucas De Marchi lucas.demarchi at intel.com
Mon Jul 29 13:41:19 UTC 2024


On Mon, Jul 29, 2024 at 04:19:25PM GMT, Jani Nikula wrote:
>On Mon, 29 Jul 2024, Lucas De Marchi <lucas.demarchi at intel.com> wrote:
>> On Mon, Jul 29, 2024 at 03:15:26PM GMT, Ohad Sharabi wrote:
>>>The config query has entries per config type.
>>>
>>>In query_config(), an array is allocated using the last element of
>>>the query config to dictate the array length.
>>>
>>>Instead, a more robust approach would be to use the standard "number of
>>>elements" last element of an enum such that one wouldn't need to modify
>>>the ioctl each time another entry is added.
>>>
>>>v2:
>>> - modify `enum drm_xe_query_config_type` doc
>>>
>>>Signed-off-by: Ohad Sharabi <osharabi at habana.ai>
>>>---
>>> drivers/gpu/drm/xe/xe_query.c |  2 +-
>>> include/uapi/drm/xe_drm.h     | 58 ++++++++++++++++++++++-------------
>>> 2 files changed, 38 insertions(+), 22 deletions(-)
>>>
>>>diff --git a/drivers/gpu/drm/xe/xe_query.c b/drivers/gpu/drm/xe/xe_query.c
>>>index 73ef6e4c2dc9..aaa60ff764ee 100644
>>>--- a/drivers/gpu/drm/xe/xe_query.c
>>>+++ b/drivers/gpu/drm/xe/xe_query.c
>>>@@ -313,7 +313,7 @@ static int query_mem_regions(struct xe_device *xe,
>>>
>>> static int query_config(struct xe_device *xe, struct drm_xe_device_query *query)
>>> {
>>>-	const u32 num_params = DRM_XE_QUERY_CONFIG_MAX_EXEC_QUEUE_PRIORITY + 1;
>>>+	const u32 num_params = DRM_XE_QUERY_CONFIG_NUM_CONFIGS;
>>> 	size_t size =
>>> 		sizeof(struct drm_xe_query_config) + num_params * sizeof(u64);
>>> 	struct drm_xe_query_config __user *query_ptr =
>>>diff --git a/include/uapi/drm/xe_drm.h b/include/uapi/drm/xe_drm.h
>>>index 29425d7fdc77..9222563cddc3 100644
>>>--- a/include/uapi/drm/xe_drm.h
>>>+++ b/include/uapi/drm/xe_drm.h
>>>@@ -378,6 +378,42 @@ struct drm_xe_query_mem_regions {
>>> 	struct drm_xe_mem_region mem_regions[];
>>> };
>>>
>>>+#define DRM_XE_QUERY_CONFIG_FLAG_HAS_VRAM	(1 << 0)
>>>+
>>>+/**
>>>+ * enum drm_xe_query_config_type - Indices for the supported configs returned
>>>+ * in &drm_xe_query_config.info array
>>>+ */
>>>+enum drm_xe_query_config_type {
>>>+	/**
>>>+	 * @DRM_XE_QUERY_CONFIG_REV_AND_DEVICE_ID: Device ID (lower 16 bits)
>>>+	 * and the device revision (next 8 bits).
>>>+	 */
>>>+	DRM_XE_QUERY_CONFIG_REV_AND_DEVICE_ID,
>>>+	/**
>>>+	 * @DRM_XE_QUERY_CONFIG_FLAGS: Flags describing the device
>>>+	 * configuration, see list below.
>>>+	 *
>>>+	 *    - %DRM_XE_QUERY_CONFIG_FLAG_HAS_VRAM - Flag is set if the device
>>>+	 *      has usable VRAM
>>>+	 */
>>>+	DRM_XE_QUERY_CONFIG_FLAGS,
>>>+	/**
>>>+	 * @DRM_XE_QUERY_CONFIG_MIN_ALIGNMENT: Minimal memory alignment
>>>+	 * required by this device, typically SZ_4K or SZ_64K.
>>>+	 */
>>>+	DRM_XE_QUERY_CONFIG_MIN_ALIGNMENT,
>>>+	/** @DRM_XE_QUERY_CONFIG_VA_BITS: Maximum bits of a virtual address. */
>>>+	DRM_XE_QUERY_CONFIG_VA_BITS,
>>>+	/**
>>>+	 * @DRM_XE_QUERY_CONFIG_MAX_EXEC_QUEUE_PRIORITY: Value of the highest
>>>+	 * available exec queue priority.
>>>+	 */
>>>+	DRM_XE_QUERY_CONFIG_MAX_EXEC_QUEUE_PRIORITY,
>>>+	/** @DRM_XE_QUERY_CONFIG_NUM_CONFIGS: must be last. Number of configs */
>>>+	DRM_XE_QUERY_CONFIG_NUM_CONFIGS,
>>
>> But then when we change from 5 to 6, we are changing the uapi.  It's
>> very possible that userspace was using that number and then when they
>> update the header the build breaks.
>>
>> I believe that's why none of our enums contain a max/count/num element
>> at the end.
>
>Agreed.

just another note that making this for the driver-only would be good. So
we only use the _MAX/_COUNT when iterating instead of hardcoding the
last element.  That'd mean defining a __DRM_XE_QUERY_CONFIG_NUM_CONFIGS
or the like in an internal header or .c if it's used in only one place.

Lucas De Marchi

>
>
>BR,
>Jani.
>
>
>>
>> Lucas De Marchi
>>
>>>+};
>>>+
>>> /**
>>>  * struct drm_xe_query_config - describe the device configuration
>>>  *
>>>@@ -385,33 +421,13 @@ struct drm_xe_query_mem_regions {
>>>  * is equal to DRM_XE_DEVICE_QUERY_CONFIG, then the reply uses
>>>  * struct drm_xe_query_config in .data.
>>>  *
>>>- * The index in @info can be:
>>>- *  - %DRM_XE_QUERY_CONFIG_REV_AND_DEVICE_ID - Device ID (lower 16 bits)
>>>- *    and the device revision (next 8 bits)
>>>- *  - %DRM_XE_QUERY_CONFIG_FLAGS - Flags describing the device
>>>- *    configuration, see list below
>>>- *
>>>- *    - %DRM_XE_QUERY_CONFIG_FLAG_HAS_VRAM - Flag is set if the device
>>>- *      has usable VRAM
>>>- *  - %DRM_XE_QUERY_CONFIG_MIN_ALIGNMENT - Minimal memory alignment
>>>- *    required by this device, typically SZ_4K or SZ_64K
>>>- *  - %DRM_XE_QUERY_CONFIG_VA_BITS - Maximum bits of a virtual address
>>>- *  - %DRM_XE_QUERY_CONFIG_MAX_EXEC_QUEUE_PRIORITY - Value of the highest
>>>- *    available exec queue priority
>>>+ * The index in @info are the entries in `enum drm_xe_query_config`
>>>  */
>>> struct drm_xe_query_config {
>>> 	/** @num_params: number of parameters returned in info */
>>> 	__u32 num_params;
>>>-
>>> 	/** @pad: MBZ */
>>> 	__u32 pad;
>>>-
>>>-#define DRM_XE_QUERY_CONFIG_REV_AND_DEVICE_ID	0
>>>-#define DRM_XE_QUERY_CONFIG_FLAGS			1
>>>-	#define DRM_XE_QUERY_CONFIG_FLAG_HAS_VRAM	(1 << 0)
>>>-#define DRM_XE_QUERY_CONFIG_MIN_ALIGNMENT		2
>>>-#define DRM_XE_QUERY_CONFIG_VA_BITS			3
>>>-#define DRM_XE_QUERY_CONFIG_MAX_EXEC_QUEUE_PRIORITY	4
>>> 	/** @info: array of elements containing the config info */
>>> 	__u64 info[];
>>> };
>>>--
>>>2.34.1
>>>
>
>-- 
>Jani Nikula, Intel


More information about the Intel-xe mailing list