Quoting Tvrtko Ursulin (2024-02-07 13:56:12) > From: Tvrtko Ursulin <tvrtko.ursulin@xxxxxxxxx> > > Add a new query to the GuC submission interface version. > > Mesa intends to use this information to check for old firmware versions > with a known bug where using the render and compute command streamers > simultaneously can cause GPU hangs due issues in firmware scheduling. > > Based on patches from Vivaik and Joonas. > > There is a little bit of an open around the width required for versions. > While the GuC FW iface tells they are u8, i915 GuC code uses u32: > > #define CSS_SW_VERSION_UC_MAJOR (0xFF << 16) > #define CSS_SW_VERSION_UC_MINOR (0xFF << 8) > #define CSS_SW_VERSION_UC_PATCH (0xFF << 0) > ... > struct intel_uc_fw_ver { > u32 major; > u32 minor; > u32 patch; > u32 build; > }; > > So we could make the query u8, and refactor the struct intel_uc_fw_ver > to use u8, or not. To avoid any doubts on why are we assigning u32 to > u8 I simply opted to use u64. Which avoids the need to add any padding > too. This a single-shot init time query so I guess u64 is fine too, to keep the code straightforward. > Compile tested only. If Mesa folks confirm this is working for them and after you add link to the Mesa PR, then you can add my: Reviewed-by: Joonas Lahtinen <joonas.lahtinen@xxxxxxxxxxxxxxx> Regards, Joonas > Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@xxxxxxxxx> > Cc: Kenneth Graunke <kenneth@xxxxxxxxxxxxx> > Cc: Jose Souza <jose.souza@xxxxxxxxx> > Cc: Sagar Ghuge <sagar.ghuge@xxxxxxxxx> > Cc: Paulo Zanoni <paulo.r.zanoni@xxxxxxxxx> > Cc: John Harrison <John.C.Harrison@xxxxxxxxx> > Cc: Rodrigo Vivi <rodrigo.vivi@xxxxxxxxx> > Cc: Jani Nikula <jani.nikula@xxxxxxxxx> > Cc: Tvrtko Ursulin <tvrtko.ursulin@xxxxxxxxx> > Cc: Vivaik Balasubrawmanian <vivaik.balasubrawmanian@xxxxxxxxx> > --- > drivers/gpu/drm/i915/i915_query.c | 32 +++++++++++++++++++++++++++++++ > include/uapi/drm/i915_drm.h | 11 +++++++++++ > 2 files changed, 43 insertions(+) > > diff --git a/drivers/gpu/drm/i915/i915_query.c b/drivers/gpu/drm/i915/i915_query.c > index 00871ef99792..999687f6a3d4 100644 > --- a/drivers/gpu/drm/i915/i915_query.c > +++ b/drivers/gpu/drm/i915/i915_query.c > @@ -551,6 +551,37 @@ static int query_hwconfig_blob(struct drm_i915_private *i915, > return hwconfig->size; > } > > +static int > +query_guc_submission_version(struct drm_i915_private *i915, > + struct drm_i915_query_item *query) > +{ > + struct drm_i915_query_guc_submission_version __user *query_ptr = > + u64_to_user_ptr(query->data_ptr); > + struct drm_i915_query_guc_submission_version ver; > + struct intel_guc *guc = &to_gt(i915)->uc.guc; > + const size_t size = sizeof(ver); > + int ret; > + > + if (!intel_uc_uses_guc_submission(&to_gt(i915)->uc)) > + return -ENODEV; > + > + ret = copy_query_item(&ver, size, size, query); > + if (ret != 0) > + return ret; > + > + if (ver.major || ver.minor || ver.patch) > + return -EINVAL; > + > + ver.major = guc->submission_version.major; > + ver.minor = guc->submission_version.minor; > + ver.patch = guc->submission_version.patch; > + > + if (copy_to_user(query_ptr, &ver, size)) > + return -EFAULT; > + > + return 0; > +} > + > static int (* const i915_query_funcs[])(struct drm_i915_private *dev_priv, > struct drm_i915_query_item *query_item) = { > query_topology_info, > @@ -559,6 +590,7 @@ static int (* const i915_query_funcs[])(struct drm_i915_private *dev_priv, > query_memregion_info, > query_hwconfig_blob, > query_geometry_subslices, > + query_guc_submission_version, > }; > > int i915_query_ioctl(struct drm_device *dev, void *data, struct drm_file *file) > diff --git a/include/uapi/drm/i915_drm.h b/include/uapi/drm/i915_drm.h > index 550c496ce76d..d80d9b5e1eda 100644 > --- a/include/uapi/drm/i915_drm.h > +++ b/include/uapi/drm/i915_drm.h > @@ -3038,6 +3038,7 @@ struct drm_i915_query_item { > * - %DRM_I915_QUERY_MEMORY_REGIONS (see struct drm_i915_query_memory_regions) > * - %DRM_I915_QUERY_HWCONFIG_BLOB (see `GuC HWCONFIG blob uAPI`) > * - %DRM_I915_QUERY_GEOMETRY_SUBSLICES (see struct drm_i915_query_topology_info) > + * - %DRM_I915_QUERY_GUC_SUBMISSION_VERSION (see struct drm_i915_query_guc_submission_version) > */ > __u64 query_id; > #define DRM_I915_QUERY_TOPOLOGY_INFO 1 > @@ -3046,6 +3047,7 @@ struct drm_i915_query_item { > #define DRM_I915_QUERY_MEMORY_REGIONS 4 > #define DRM_I915_QUERY_HWCONFIG_BLOB 5 > #define DRM_I915_QUERY_GEOMETRY_SUBSLICES 6 > +#define DRM_I915_QUERY_GUC_SUBMISSION_VERSION 7 > /* Must be kept compact -- no holes and well documented */ > > /** > @@ -3591,6 +3593,15 @@ struct drm_i915_query_memory_regions { > struct drm_i915_memory_region_info regions[]; > }; > > +/** > +* struct drm_i915_query_guc_submission_version - query GuC submission interface version > +*/ > +struct drm_i915_query_guc_submission_version { > + __u64 major; > + __u64 minor; > + __u64 patch; > +}; > + > /** > * DOC: GuC HWCONFIG blob uAPI > * > -- > 2.40.1 >