drm/xe: Return GMD_ID revid properly
authorMatt Roper <matthew.d.roper@intel.com>
Wed, 14 Jun 2023 20:51:59 +0000 (13:51 -0700)
committerRodrigo Vivi <rodrigo.vivi@intel.com>
Thu, 21 Dec 2023 16:35:06 +0000 (11:35 -0500)
peek_gmdid() returns the IP version, not the raw value of the GMD_ID
register.  Make sure we extract and return the rev_id field as well so
that it can be used to determine the IP steppings properly.

Reviewed-by: Lucas De Marchi <lucas.demarchi@intel.com>
Reviewed-by: Gustavo Sousa <gustavo.sousa@intel.com>
Link: https://lore.kernel.org/r/20230614205202.3376752-2-matthew.d.roper@intel.com
Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
drivers/gpu/drm/xe/xe_pci.c

index 96f1ee1ea17f40a450914ebdfc20dd3165d916e7..5c0c2e9b901eb97e751ab0d8334b7fe8ce8a2181 100644 (file)
@@ -374,23 +374,27 @@ find_subplatform(const struct xe_device *xe, const struct xe_device_desc *desc)
        return NULL;
 }
 
-static u32 peek_gmdid(struct xe_device *xe, u32 gmdid_offset)
+static void peek_gmdid(struct xe_device *xe, u32 gmdid_offset, u32 *ver, u32 *revid)
 {
        struct pci_dev *pdev = to_pci_dev(xe->drm.dev);
        void __iomem *map = pci_iomap_range(pdev, 0, gmdid_offset, sizeof(u32));
-       u32 ver;
+       u32 val;
 
        if (!map) {
                drm_err(&xe->drm, "Failed to read GMD_ID (%#x) from PCI BAR.\n",
                        gmdid_offset);
-               return 0;
+               *ver = 0;
+               *revid = 0;
+
+               return;
        }
 
-       ver = ioread32(map);
+       val = ioread32(map);
        pci_iounmap(pdev, map);
 
-       return REG_FIELD_GET(GMD_ID_ARCH_MASK, ver) * 100 +
-               REG_FIELD_GET(GMD_ID_RELEASE_MASK, ver);
+       *ver = REG_FIELD_GET(GMD_ID_ARCH_MASK, val) * 100 +
+               REG_FIELD_GET(GMD_ID_RELEASE_MASK, val);
+       *revid = REG_FIELD_GET(GMD_ID_REVID, val);
 }
 
 /*
@@ -426,8 +430,7 @@ static void handle_gmdid(struct xe_device *xe,
 {
        u32 ver;
 
-       ver = peek_gmdid(xe, GMD_ID.addr);
-       *graphics_revid = REG_FIELD_GET(GMD_ID_REVID, ver);
+       peek_gmdid(xe, GMD_ID.addr, &ver, graphics_revid);
        for (int i = 0; i < ARRAY_SIZE(graphics_ip_map); i++) {
                if (ver == graphics_ip_map[i].ver) {
                        xe->info.graphics_verx100 = ver;
@@ -442,8 +445,8 @@ static void handle_gmdid(struct xe_device *xe,
                        ver / 100, ver % 100);
        }
 
-       ver = peek_gmdid(xe, GMD_ID.addr + 0x380000);
-       *media_revid = REG_FIELD_GET(GMD_ID_REVID, ver);
+       peek_gmdid(xe, GMD_ID.addr + 0x380000, &ver, media_revid);
+
        for (int i = 0; i < ARRAY_SIZE(media_ip_map); i++) {
                if (ver == media_ip_map[i].ver) {
                        xe->info.media_verx100 = ver;