Commit 0dcac636 authored by Lucas De Marchi's avatar Lucas De Marchi Committed by Rodrigo Vivi

drm/xe/xe2: Extend reserved stolen sizes

For xe2, besides the previous sizes, the reserved portion of stolen can
also have 16MB and 32MB.

Bspec: 53148
Reviewed-by: default avatarMatt Roper <matthew.d.roper@intel.com>
Link: https://lore.kernel.org/r/20230929044959.3149265-1-lucas.demarchi@intel.comSigned-off-by: default avatarLucas De Marchi <lucas.demarchi@intel.com>
Signed-off-by: default avatarRodrigo Vivi <rodrigo.vivi@intel.com>
parent c489925a
...@@ -82,7 +82,7 @@ ...@@ -82,7 +82,7 @@
#define GSMBASE XE_REG(0x108100) #define GSMBASE XE_REG(0x108100)
#define STOLEN_RESERVED XE_REG(0x1082c0) #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) #define MTL_RP_STATE_CAP XE_REG(0x138000)
......
...@@ -86,6 +86,29 @@ static s64 detect_bar2_dgfx(struct xe_device *xe, struct xe_ttm_stolen_mgr *mgr) ...@@ -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); 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) 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); 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 ...@@ -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 */ /* Carve out the top of DSM as it contains the reserved WOPCM region */
wopcm_size = REG_FIELD_GET64(WOPCM_SIZE_MASK, wopcm_size = get_wopcm_size(xe);
xe_mmio_read64_2x32(xe_root_mmio_gt(xe), if (drm_WARN_ON(&xe->drm, !wopcm_size))
STOLEN_RESERVED)); return 0;
stolen_size -= (1U << wopcm_size) * SZ_1M;
stolen_size -= wopcm_size;
if (drm_WARN_ON(&xe->drm, stolen_size + SZ_8M > pci_resource_len(pdev, 2))) if (drm_WARN_ON(&xe->drm, stolen_size + SZ_8M > pci_resource_len(pdev, 2)))
return 0; return 0;
......
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