]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/xe/xe2: Extend reserved stolen sizes
authorLucas De Marchi <lucas.demarchi@intel.com>
Fri, 29 Sep 2023 04:49:59 +0000 (21:49 -0700)
committerRodrigo Vivi <rodrigo.vivi@intel.com>
Thu, 21 Dec 2023 16:42:03 +0000 (11:42 -0500)
For xe2, besides the previous sizes, the reserved portion of stolen can
also have 16MB and 32MB.

Bspec: 53148
Reviewed-by: Matt Roper <matthew.d.roper@intel.com>
Link: https://lore.kernel.org/r/20230929044959.3149265-1-lucas.demarchi@intel.com
Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com>
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
drivers/gpu/drm/xe/regs/xe_regs.h
drivers/gpu/drm/xe/xe_ttm_stolen_mgr.c

index d62555757d0fa60ec782b4a774b0180a0db1afcd..1574d11d4e1439e00083806ae43fc808a246f165 100644 (file)
@@ -82,7 +82,7 @@
 #define GSMBASE                                        XE_REG(0x108100)
 
 #define STOLEN_RESERVED                                XE_REG(0x1082c0)
-#define   WOPCM_SIZE_MASK                      REG_GENMASK64(8, 7)
+#define   WOPCM_SIZE_MASK                      REG_GENMASK64(9, 7)
 
 #define MTL_RP_STATE_CAP                       XE_REG(0x138000)
 
index 6ba6b1b7f34b6684434e933eb06039388cd38311..79fbd74a3944675450f0f9665a9fbcd3fc01e16b 100644 (file)
@@ -86,6 +86,29 @@ static s64 detect_bar2_dgfx(struct xe_device *xe, struct xe_ttm_stolen_mgr *mgr)
        return ALIGN_DOWN(stolen_size, SZ_1M);
 }
 
+static u32 get_wopcm_size(struct xe_device *xe)
+{
+       u32 wopcm_size;
+       u64 val;
+
+       val = xe_mmio_read64_2x32(xe_root_mmio_gt(xe), STOLEN_RESERVED);
+       val = REG_FIELD_GET64(WOPCM_SIZE_MASK, val);
+
+       switch (val) {
+       case 0x5 ... 0x6:
+               val--;
+               fallthrough;
+       case 0x0 ... 0x3:
+               wopcm_size = (1U << val) * SZ_1M;
+               break;
+       default:
+               WARN(1, "Missing case wopcm_size=%llx\n", val);
+               wopcm_size = 0;
+       }
+
+       return wopcm_size;
+}
+
 static u32 detect_bar2_integrated(struct xe_device *xe, struct xe_ttm_stolen_mgr *mgr)
 {
        struct pci_dev *pdev = to_pci_dev(xe->drm.dev);
@@ -125,10 +148,11 @@ static u32 detect_bar2_integrated(struct xe_device *xe, struct xe_ttm_stolen_mgr
        }
 
        /* Carve out the top of DSM as it contains the reserved WOPCM region */
-       wopcm_size = REG_FIELD_GET64(WOPCM_SIZE_MASK,
-                                    xe_mmio_read64_2x32(xe_root_mmio_gt(xe),
-                                                        STOLEN_RESERVED));
-       stolen_size -= (1U << wopcm_size) * SZ_1M;
+       wopcm_size = get_wopcm_size(xe);
+       if (drm_WARN_ON(&xe->drm, !wopcm_size))
+               return 0;
+
+       stolen_size -= wopcm_size;
 
        if (drm_WARN_ON(&xe->drm, stolen_size + SZ_8M > pci_resource_len(pdev, 2)))
                return 0;