[Intel-xe] [PATCH] xe: Add a uAPI to query micro-controler firmware version

Souza, Jose jose.souza at intel.com
Thu Sep 14 20:43:34 UTC 2023


On Thu, 2023-09-14 at 13:34 -0700, José Roberto de Souza wrote:
> Due to a bug in firmware Mesa can't enable by default usage of compute
> engines in DG2.
> 
> A new GuC firmware fixed the issue but until know there was no way
> for Mesa to know if user was running with the fixed version or not,
> so this uAPI is required.
> 
> I may be expanded in future to query other firmware versions.
> 
> More information: https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/23661

There was some typos here the fixed version + the Mesa MR making use of it:

"
drm/xe: Add a uAPI to query micro-controler firmware version

Due to a bug in GuC firmware Mesa can't enable by default the usage of
compute engines in DG2 and newer.

A new GuC firmware fixed the issue but until now there was no way
for Mesa to know if KMD was running with the fixed GuC version or not,
so this uAPI is required.

It may be expanded in future to query other firmware versions too.

More information: https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/23661
Mesa/UMD implementation: https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25233

Signed-off-by: José Roberto de Souza <jose.souza at intel.com>
"


> 
> Signed-off-by: José Roberto de Souza <jose.souza at intel.com>
> ---
>  drivers/gpu/drm/xe/xe_query.c | 35 ++++++++++++++++++++++++++++++++++
>  include/uapi/drm/xe_drm.h     | 36 +++++++++++++++++++++++++++++------
>  2 files changed, 65 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/gpu/drm/xe/xe_query.c b/drivers/gpu/drm/xe/xe_query.c
> index a951205100fea..360dda9ba1d1d 100644
> --- a/drivers/gpu/drm/xe/xe_query.c
> +++ b/drivers/gpu/drm/xe/xe_query.c
> @@ -361,6 +361,40 @@ static int query_gt_topology(struct xe_device *xe,
>  	return 0;
>  }
>  
> +static int
> +query_uc_fw_version(struct xe_device *xe, struct drm_xe_device_query *query)
> +{
> +	size_t size = sizeof(struct drm_xe_query_uc_fw_version);
> +	struct drm_xe_query_uc_fw_version __user *query_ptr = u64_to_user_ptr(query->data);
> +	struct drm_xe_query_uc_fw_version resp;
> +
> +	if (query->size == 0) {
> +		query->size = size;
> +		return 0;
> +	} else if (XE_IOCTL_DBG(xe, query->size != size)) {
> +		return -EINVAL;
> +	}
> +
> +	if (copy_from_user(&resp, query_ptr, size))
> +		return -EFAULT;
> +
> +	switch (resp.uc_type) {
> +	case XE_QUERY_UC_TYPE_GUC:
> +		resp.major_ver = xe->tiles[0].primary_gt->uc.guc.fw.major_ver_found;
> +		resp.minor_ver = xe->tiles[0].primary_gt->uc.guc.fw.minor_ver_found;
> +		resp.patch_ver = xe->tiles[0].primary_gt->uc.guc.fw.patch_ver_found;
> +		break;
> +	default:
> +		return -EINVAL;
> +	}
> +
> +	if (copy_to_user(query_ptr, &resp, size)) {
> +		return -EFAULT;
> +	}
> +
> +	return 0;
> +}
> +
>  static int (* const xe_query_funcs[])(struct xe_device *xe,
>  				      struct drm_xe_device_query *query) = {
>  	query_engines,
> @@ -369,6 +403,7 @@ static int (* const xe_query_funcs[])(struct xe_device *xe,
>  	query_gts,
>  	query_hwconfig,
>  	query_gt_topology,
> +	query_uc_fw_version,
>  };
>  
>  int xe_query_ioctl(struct drm_device *dev, void *data, struct drm_file *file)
> diff --git a/include/uapi/drm/xe_drm.h b/include/uapi/drm/xe_drm.h
> index 00d5cb4ef85e7..0f5bf5b1874ab 100644
> --- a/include/uapi/drm/xe_drm.h
> +++ b/include/uapi/drm/xe_drm.h
> @@ -346,6 +346,29 @@ struct drm_xe_query_topology_mask {
>  	__u8 mask[];
>  };
>  
> +/**
> + * struct drm_xe_query_uc_fw_version - query a micro-controller firmware version
> + *
> + * Given a uc_type this will return the major, minor and patch version of the
> + * micro-controller firmware.
> + */
> +struct drm_xe_query_uc_fw_version {
> +	/** @uc: The micro-controller type to query firmware version */
> +#define XE_QUERY_UC_TYPE_GUC 0
> +	__u16 uc_type;
> +	__u16 pad;
> +
> +	/* @major_ver: major uc fw version */
> +	__u32 major_ver;
> +	/* @minor_ver: minor uc fw version */
> +	__u32 minor_ver;
> +	/* @patch_ver: patch uc fw version */
> +	__u32 patch_ver;
> +
> +	/** @reserved: Reserved */
> +	__u64 reserved[2];
> +};
> +
>  /**
>   * struct drm_xe_device_query - main structure to query device information
>   *
> @@ -385,12 +408,13 @@ struct drm_xe_device_query {
>  	/** @extensions: Pointer to the first extension struct, if any */
>  	__u64 extensions;
>  
> -#define DRM_XE_DEVICE_QUERY_ENGINES	0
> -#define DRM_XE_DEVICE_QUERY_MEM_USAGE	1
> -#define DRM_XE_DEVICE_QUERY_CONFIG	2
> -#define DRM_XE_DEVICE_QUERY_GTS		3
> -#define DRM_XE_DEVICE_QUERY_HWCONFIG	4
> -#define DRM_XE_DEVICE_QUERY_GT_TOPOLOGY	5
> +#define DRM_XE_DEVICE_QUERY_ENGINES		0
> +#define DRM_XE_DEVICE_QUERY_MEM_USAGE		1
> +#define DRM_XE_DEVICE_QUERY_CONFIG		2
> +#define DRM_XE_DEVICE_QUERY_GTS			3
> +#define DRM_XE_DEVICE_QUERY_HWCONFIG		4
> +#define DRM_XE_DEVICE_QUERY_GT_TOPOLOGY		5
> +#define DRM_XE_DEVICE_QUERY_UC_FW_VERSION	6
>  	/** @query: The type of data to query */
>  	__u32 query;
>  



More information about the Intel-xe mailing list