Commit 5d30cfe0 authored by Matt Roper's avatar Matt Roper Committed by Rodrigo Vivi

drm/xe: Add Wa_14019821291

This workaround is primarily implemented by the BIOS.  However if the
BIOS applies the workaround it will reserve a small piece of our DSM
(which should be at the top, right below the WOPCM); we just need to
keep that region reserved so that nothing else attempts to re-use it.

v2 (Gustavo):
  - Check for NULL media_gt
  - Mask bits [5:0] to avoid potential issues in future platforms
Signed-off-by: default avatarMatt Roper <matthew.d.roper@intel.com>
Reviewed-by: default avatarGustavo Sousa <gustavo.sousa@intel.com>
Link: https://lore.kernel.org/r/20231102124855.1940491-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 effc560d
...@@ -40,7 +40,7 @@ quiet_cmd_wa_oob = GEN $(notdir $(generated_oob)) ...@@ -40,7 +40,7 @@ quiet_cmd_wa_oob = GEN $(notdir $(generated_oob))
$(generated_oob) &: $(obj)/xe_gen_wa_oob $(srctree)/$(src)/xe_wa_oob.rules $(generated_oob) &: $(obj)/xe_gen_wa_oob $(srctree)/$(src)/xe_wa_oob.rules
$(call cmd,wa_oob) $(call cmd,wa_oob)
$(obj)/xe_guc.o $(obj)/xe_migrate.o $(obj)/xe_ring_ops.o $(obj)/xe_vm.o $(obj)/xe_wa.o: $(generated_oob) $(obj)/xe_guc.o $(obj)/xe_migrate.o $(obj)/xe_ring_ops.o $(obj)/xe_vm.o $(obj)/xe_wa.o $(obj)/xe_ttm_stolen_mgr.o: $(generated_oob)
# Please keep these build lists sorted! # Please keep these build lists sorted!
......
...@@ -158,6 +158,8 @@ ...@@ -158,6 +158,8 @@
#define XEHP_SQCM XE_REG_MCR(0x8724) #define XEHP_SQCM XE_REG_MCR(0x8724)
#define EN_32B_ACCESS REG_BIT(30) #define EN_32B_ACCESS REG_BIT(30)
#define GSCPSMI_BASE XE_REG(0x880c)
#define MIRROR_FUSE3 XE_REG(0x9118) #define MIRROR_FUSE3 XE_REG(0x9118)
#define XE2_NODE_ENABLE_MASK REG_GENMASK(31, 16) #define XE2_NODE_ENABLE_MASK REG_GENMASK(31, 16)
#define L3BANK_PAIR_COUNT 4 #define L3BANK_PAIR_COUNT 4
......
...@@ -11,6 +11,8 @@ ...@@ -11,6 +11,8 @@
#include <drm/ttm/ttm_placement.h> #include <drm/ttm/ttm_placement.h>
#include <drm/ttm/ttm_range_manager.h> #include <drm/ttm/ttm_range_manager.h>
#include "generated/xe_wa_oob.h"
#include "regs/xe_gt_regs.h"
#include "regs/xe_regs.h" #include "regs/xe_regs.h"
#include "xe_bo.h" #include "xe_bo.h"
#include "xe_device.h" #include "xe_device.h"
...@@ -19,6 +21,7 @@ ...@@ -19,6 +21,7 @@
#include "xe_res_cursor.h" #include "xe_res_cursor.h"
#include "xe_ttm_stolen_mgr.h" #include "xe_ttm_stolen_mgr.h"
#include "xe_ttm_vram_mgr.h" #include "xe_ttm_vram_mgr.h"
#include "xe_wa.h"
struct xe_ttm_stolen_mgr { struct xe_ttm_stolen_mgr {
struct xe_ttm_vram_mgr base; struct xe_ttm_vram_mgr base;
...@@ -112,6 +115,7 @@ static u32 get_wopcm_size(struct xe_device *xe) ...@@ -112,6 +115,7 @@ static u32 get_wopcm_size(struct xe_device *xe)
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);
struct xe_gt *media_gt = xe_device_get_root_tile(xe)->media_gt;
u32 stolen_size, wopcm_size; u32 stolen_size, wopcm_size;
u32 ggc, gms; u32 ggc, gms;
...@@ -154,6 +158,27 @@ static u32 detect_bar2_integrated(struct xe_device *xe, struct xe_ttm_stolen_mgr ...@@ -154,6 +158,27 @@ static u32 detect_bar2_integrated(struct xe_device *xe, struct xe_ttm_stolen_mgr
stolen_size -= wopcm_size; stolen_size -= wopcm_size;
if (media_gt && XE_WA(media_gt, 14019821291)) {
u64 gscpsmi_base = xe_mmio_read64_2x32(media_gt, GSCPSMI_BASE)
& ~GENMASK_ULL(5, 0);
/*
* This workaround is primarily implemented by the BIOS. We
* just need to figure out whether the BIOS has applied the
* workaround (meaning the programmed address falls within
* the DSM) and, if so, reserve that part of the DSM to
* prevent accidental reuse. The DSM location should be just
* below the WOPCM.
*/
if (gscpsmi_base >= mgr->io_base &&
gscpsmi_base < mgr->io_base + stolen_size) {
xe_gt_dbg(media_gt,
"Reserving %llu bytes of DSM for Wa_14019821291\n",
mgr->io_base + stolen_size - gscpsmi_base);
stolen_size = gscpsmi_base - mgr->io_base;
}
}
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;
......
...@@ -19,3 +19,4 @@ ...@@ -19,3 +19,4 @@
SUBPLATFORM(DG2, G12) SUBPLATFORM(DG2, G12)
16017236439 PLATFORM(PVC) 16017236439 PLATFORM(PVC)
22010954014 PLATFORM(DG2) 22010954014 PLATFORM(DG2)
14019821291 MEDIA_VERSION_RANGE(1300, 2000)
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