Commit b1123648 authored by Tvrtko Ursulin's avatar Tvrtko Ursulin Committed by José Roberto de Souza

drm/i915: Add GuC submission interface version query

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.

Compile tested only.

v2:
 * Added branch version.
Signed-off-by: default avatarTvrtko Ursulin <tvrtko.ursulin@intel.com>
Cc: Kenneth Graunke <kenneth@whitecape.org>
Cc: Jose Souza <jose.souza@intel.com>
Cc: Sagar Ghuge <sagar.ghuge@intel.com>
Cc: Paulo Zanoni <paulo.r.zanoni@intel.com>
Cc: John Harrison <John.C.Harrison@Intel.com>
Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
Cc: Jani Nikula <jani.nikula@intel.com>
Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Cc: Vivaik Balasubrawmanian <vivaik.balasubrawmanian@intel.com>
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Reviewed-by: default avatarJosé Roberto de Souza <jose.souza@intel.com>
Tested-by: default avatarJosé Roberto de Souza <jose.souza@intel.com>
Signed-off-by: default avatarJosé Roberto de Souza <jose.souza@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240208082510.1363268-1-tvrtko.ursulin@linux.intel.com
parent 599b0d8c
...@@ -551,6 +551,38 @@ static int query_hwconfig_blob(struct drm_i915_private *i915, ...@@ -551,6 +551,38 @@ static int query_hwconfig_blob(struct drm_i915_private *i915,
return hwconfig->size; 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.branch || ver.major || ver.minor || ver.patch)
return -EINVAL;
ver.branch = 0;
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, static int (* const i915_query_funcs[])(struct drm_i915_private *dev_priv,
struct drm_i915_query_item *query_item) = { struct drm_i915_query_item *query_item) = {
query_topology_info, query_topology_info,
...@@ -559,6 +591,7 @@ static int (* const i915_query_funcs[])(struct drm_i915_private *dev_priv, ...@@ -559,6 +591,7 @@ static int (* const i915_query_funcs[])(struct drm_i915_private *dev_priv,
query_memregion_info, query_memregion_info,
query_hwconfig_blob, query_hwconfig_blob,
query_geometry_subslices, query_geometry_subslices,
query_guc_submission_version,
}; };
int i915_query_ioctl(struct drm_device *dev, void *data, struct drm_file *file) int i915_query_ioctl(struct drm_device *dev, void *data, struct drm_file *file)
......
...@@ -3013,6 +3013,7 @@ struct drm_i915_query_item { ...@@ -3013,6 +3013,7 @@ struct drm_i915_query_item {
* - %DRM_I915_QUERY_MEMORY_REGIONS (see struct drm_i915_query_memory_regions) * - %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_HWCONFIG_BLOB (see `GuC HWCONFIG blob uAPI`)
* - %DRM_I915_QUERY_GEOMETRY_SUBSLICES (see struct drm_i915_query_topology_info) * - %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; __u64 query_id;
#define DRM_I915_QUERY_TOPOLOGY_INFO 1 #define DRM_I915_QUERY_TOPOLOGY_INFO 1
...@@ -3021,6 +3022,7 @@ struct drm_i915_query_item { ...@@ -3021,6 +3022,7 @@ struct drm_i915_query_item {
#define DRM_I915_QUERY_MEMORY_REGIONS 4 #define DRM_I915_QUERY_MEMORY_REGIONS 4
#define DRM_I915_QUERY_HWCONFIG_BLOB 5 #define DRM_I915_QUERY_HWCONFIG_BLOB 5
#define DRM_I915_QUERY_GEOMETRY_SUBSLICES 6 #define DRM_I915_QUERY_GEOMETRY_SUBSLICES 6
#define DRM_I915_QUERY_GUC_SUBMISSION_VERSION 7
/* Must be kept compact -- no holes and well documented */ /* Must be kept compact -- no holes and well documented */
/** /**
...@@ -3566,6 +3568,16 @@ struct drm_i915_query_memory_regions { ...@@ -3566,6 +3568,16 @@ struct drm_i915_query_memory_regions {
struct drm_i915_memory_region_info 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 {
__u32 branch;
__u32 major;
__u32 minor;
__u32 patch;
};
/** /**
* DOC: GuC HWCONFIG blob uAPI * DOC: GuC HWCONFIG blob uAPI
* *
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment