There are few minor changes in the CSS header related to the version
numbering in new GuC firmwares. Update our definition and start using
common tools for extracting bitfields.

v2: drop deprecated prod_preprod_fw field, replace unions with bit defs

Signed-off-by: Michal Wajdeczko <[email protected]>
Cc: Daniele Ceraolo Spurio <[email protected]>
Cc: Joonas Lahtinen <[email protected]>
Cc: John Spotswood <[email protected]>
Cc: Jeff Mcgee <[email protected]>
Reviewed-by: Daniele Ceraolo Spurio <[email protected]>
---
 drivers/gpu/drm/i915/intel_guc_fwif.h | 50 +++++++++------------------
 drivers/gpu/drm/i915/intel_uc_fw.c    | 20 +++++------
 2 files changed, 26 insertions(+), 44 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_guc_fwif.h 
b/drivers/gpu/drm/i915/intel_guc_fwif.h
index b2f5148f4f17..4528e098d3a5 100644
--- a/drivers/gpu/drm/i915/intel_guc_fwif.h
+++ b/drivers/gpu/drm/i915/intel_guc_fwif.h
@@ -168,11 +168,7 @@
  *    in fw. So driver will load a truncated firmware in this case.
  *
  * HuC firmware layout is same as GuC firmware.
- *
- * HuC firmware css header is different. However, the only difference is where
- * the version information is saved. The uc_css_header is unified to support
- * both. Driver should get HuC version from uc_css_header.huc_sw_version, while
- * uc_css_header.guc_sw_version for GuC.
+ * Only HuC version information is saved in a different way.
  */
 
 struct uc_css_header {
@@ -183,41 +179,27 @@ struct uc_css_header {
        u32 header_version;
        u32 module_id;
        u32 module_vendor;
-       union {
-               struct {
-                       u8 day;
-                       u8 month;
-                       u16 year;
-               };
-               u32 date;
-       };
+       u32 date;
+#define CSS_DATE_DAY                   (0xFF << 0)
+#define CSS_DATE_MONTH                 (0xFF << 8)
+#define CSS_DATE_YEAR                  (0xFFFF << 16)
        u32 size_dw; /* uCode plus header_size_dw */
        u32 key_size_dw;
        u32 modulus_size_dw;
        u32 exponent_size_dw;
-       union {
-               struct {
-                       u8 hour;
-                       u8 min;
-                       u16 sec;
-               };
-               u32 time;
-       };
-
+       u32 time;
+#define CSS_TIME_HOUR                  (0xFF << 0)
+#define CSS_DATE_MIN                   (0xFF << 8)
+#define CSS_DATE_SEC                   (0xFFFF << 16)
        char username[8];
        char buildnumber[12];
-       union {
-               struct {
-                       u32 branch_client_version;
-                       u32 sw_version;
-       } guc;
-               struct {
-                       u32 sw_version;
-                       u32 reserved;
-       } huc;
-       };
-       u32 prod_preprod_fw;
-       u32 reserved[12];
+       u32 sw_version;
+#define CSS_SW_VERSION_GUC_MAJOR       (0xFF << 16)
+#define CSS_SW_VERSION_GUC_MINOR       (0xFF << 8)
+#define CSS_SW_VERSION_GUC_PATCH       (0xFF << 0)
+#define CSS_SW_VERSION_HUC_MAJOR       (0xFFFF << 16)
+#define CSS_SW_VERSION_HUC_MINOR       (0xFFFF << 0)
+       u32 reserved[14];
        u32 header_info;
 } __packed;
 
diff --git a/drivers/gpu/drm/i915/intel_uc_fw.c 
b/drivers/gpu/drm/i915/intel_uc_fw.c
index b9cb6fea9332..eca741a857a5 100644
--- a/drivers/gpu/drm/i915/intel_uc_fw.c
+++ b/drivers/gpu/drm/i915/intel_uc_fw.c
@@ -22,6 +22,7 @@
  *
  */
 
+#include <linux/bitfield.h>
 #include <linux/firmware.h>
 #include <drm/drm_print.h>
 
@@ -119,21 +120,20 @@ void intel_uc_fw_fetch(struct drm_i915_private *dev_priv,
                goto fail;
        }
 
-       /*
-        * The GuC firmware image has the version number embedded at a
-        * well-known offset within the firmware blob; note that major / minor
-        * version are TWO bytes each (i.e. u16), although all pointers and
-        * offsets are defined in terms of bytes (u8).
-        */
+       /* Get version numbers from the CSS header */
        switch (uc_fw->type) {
        case INTEL_UC_FW_TYPE_GUC:
-               uc_fw->major_ver_found = css->guc.sw_version >> 16;
-               uc_fw->minor_ver_found = css->guc.sw_version & 0xFFFF;
+               uc_fw->major_ver_found = FIELD_GET(CSS_SW_VERSION_GUC_MAJOR,
+                                                  css->sw_version);
+               uc_fw->minor_ver_found = FIELD_GET(CSS_SW_VERSION_GUC_MINOR,
+                                                  css->sw_version);
                break;
 
        case INTEL_UC_FW_TYPE_HUC:
-               uc_fw->major_ver_found = css->huc.sw_version >> 16;
-               uc_fw->minor_ver_found = css->huc.sw_version & 0xFFFF;
+               uc_fw->major_ver_found = FIELD_GET(CSS_SW_VERSION_HUC_MAJOR,
+                                                  css->sw_version);
+               uc_fw->minor_ver_found = FIELD_GET(CSS_SW_VERSION_HUC_MINOR,
+                                                  css->sw_version);
                break;
 
        default:
-- 
2.19.2

_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to