Re: [RFC PATCH] drm/i915: Add GETPARAM for GuC submission version

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 2/7/2024 03:36, Joonas Lahtinen wrote:
Quoting Tvrtko Ursulin (2024-02-07 10:44:01)
On 06/02/2024 20:51, Souza, Jose wrote:
On Tue, 2024-02-06 at 12:42 -0800, John Harrison wrote:
On 2/6/2024 08:33, Tvrtko Ursulin wrote:
On 01/02/2024 18:25, Souza, Jose wrote:
On Wed, 2024-01-24 at 08:55 +0000, Tvrtko Ursulin wrote:
On 24/01/2024 08:19, Joonas Lahtinen wrote:
Add reporting of the GuC submissio/VF interface version via GETPARAM
properties. Mesa intends to use this information to check for old
firmware versions with known bugs before enabling features like async
compute.
There was
https://patchwork.freedesktop.org/patch/560704/?series=124592&rev=1
which does everything in one go so would be my preference.
IMO Joonas version brings less burden to be maintained(no new struct).
But both versions works, please just get into some agreement so we
can move this forward.
So I would really prefer the query. Simplified version would do like
the compile tested only:
Vivaik's patch is definitely preferred. It is much cleaner to make one
single call than having to make four separate calls. It is also
extensible to other firmwares if required. The only blockage against it
was whether it was a good thing to report at all. If that blockage is no
longer valid then we should just merge the patch that has already been
discussed, polished, fixed, etc. rather than starting the whole process
from scratch.
Agreed.

Vivaik can you please rebase and send it again?
Note there was review feedback not addressed so do that too please.
AFAIR incorrect usage of copy item, pad/rsvd/mbz checking and questions
about padding in general. Last is why I proposed a simplified version
which is not future extensible and avoids the need for padding.
Yeah, I don't think there is point an adding an extensible interface as
we're not going to add further FW version queries. This only the
submission interface version we're going to expose:
The media team have flip flopped multiple times about whether they need a HuC version query.


          * Note that the spec for the CSS header defines this version number
          * as 'vf_version' as it was originally intended for virtualisation.
          * However, it is applicable to native submission as well.

If somebody wants to work on the simplified version like Tvrtko
suggested below, I have no objection. We can also remove the reference
to the VF version even if that's used by the header definition.

But if there are just suggestions but no actual patches floated, then we
should be merging the GETPARAM version with the "VF" word removed.
The original patch was posted to the mailing list many months ago. Why do you say 'just suggestions but no patches floated'?



We've already discussed on the topic for some months so doing the
minimal changes to fulfill Mesa requirements should be considered a
priority to avoid further delays.

Regards,

Tvrtko


And note that it is four calls not three. The code below is missing the
branch version number.
Not even kernel uses the 'build' version anywhere. I don't see how there
could be 'build' version for the VF interface version? It's not supposed
to version a concrete firmware build but the API contract implemented by
the build where patch version should already be incremented for each
fix.

So adding the build does not seem appropriate as there is no plan to
extend this API any further.
I did not say "build" version. There is no build version. I said "branch" version. And the branch version absolute becomes important if we ever have to release a bug fix to an LTS branch. So it needs to be part of the interface from the beginning and the UMDs need to be using it from the beginning.

John.



Regards, Joonas

John.

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
    *

It is not that much bigger that the triple get param and IMO nicer.

But if there is no motivation to do it properly then feel free to
proceed with this, I will not block it.

Regards,

Tvrtko

P.S.
Probably still make sure to remove the reference to SR-IOV.

During the time of that patch there was discussion whether firmware
version or submission version was better. I vaguely remember someone
raised an issue with the latter. Adding John in case he remembers.

Signed-off-by: Joonas Lahtinen <joonas.lahtinen@xxxxxxxxxxxxxxx>
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>
---
     drivers/gpu/drm/i915/i915_getparam.c | 12 ++++++++++++
     include/uapi/drm/i915_drm.h          | 13 +++++++++++++
     2 files changed, 25 insertions(+)

diff --git a/drivers/gpu/drm/i915/i915_getparam.c
b/drivers/gpu/drm/i915/i915_getparam.c
index 5c3fec63cb4c1..f176372debc54 100644
--- a/drivers/gpu/drm/i915/i915_getparam.c
+++ b/drivers/gpu/drm/i915/i915_getparam.c
@@ -113,6 +113,18 @@ int i915_getparam_ioctl(struct drm_device
*dev, void *data,
             if (value < 0)
                 return value;
             break;
+    case I915_PARAM_GUC_SUBMISSION_VERSION_MAJOR:
+    case I915_PARAM_GUC_SUBMISSION_VERSION_MINOR:
+    case I915_PARAM_GUC_SUBMISSION_VERSION_PATCH:
+        if (!intel_uc_uses_guc_submission(&to_gt(i915)->uc))
+            return -ENODEV;
+        if (param->param == I915_PARAM_GUC_SUBMISSION_VERSION_MAJOR)
+            value = to_gt(i915)->uc.guc.submission_version.major;
+        else if (param->param ==
I915_PARAM_GUC_SUBMISSION_VERSION_MINOR)
+            value = to_gt(i915)->uc.guc.submission_version.minor;
+        else
+            value = to_gt(i915)->uc.guc.submission_version.patch;
+        break;
         case I915_PARAM_MMAP_GTT_VERSION:
             /* Though we've started our numbering from 1, and so
class all
              * earlier versions as 0, in effect their value is
undefined as
diff --git a/include/uapi/drm/i915_drm.h b/include/uapi/drm/i915_drm.h
index fd4f9574d177a..7d5a47f182542 100644
--- a/include/uapi/drm/i915_drm.h
+++ b/include/uapi/drm/i915_drm.h
@@ -806,6 +806,19 @@ typedef struct drm_i915_irq_wait {
      */
     #define I915_PARAM_PXP_STATUS         58
     +/*
+ * Query for the GuC submission/VF interface version number
What is this VF you speak of? :/

Regards,

Tvrtko

+ *
+ * -ENODEV is returned if GuC submission is not used
+ *
+ * On success, returns the respective GuC submission/VF interface
major,
+ * minor or patch version as per the requested parameter.
+ *
+ */
+#define I915_PARAM_GUC_SUBMISSION_VERSION_MAJOR 59
+#define I915_PARAM_GUC_SUBMISSION_VERSION_MINOR 60
+#define I915_PARAM_GUC_SUBMISSION_VERSION_PATCH 61
+
     /* Must be kept compact -- no holes and well documented */
        /**




[Index of Archives]     [AMD Graphics]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux