Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/xe/nvm: add support for access mode

Check NVM access mode from GSC FW status registers
and overwrite access status read from SPI descriptor, if needed.

Reviewed-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Acked-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Signed-off-by: Alexander Usyskin <alexander.usyskin@intel.com>
Link: https://lore.kernel.org/r/20250617145159.3803852-8-alexander.usyskin@intel.com
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>

authored by

Alexander Usyskin and committed by
Rodrigo Vivi
87e1ebba c28bfb10

+41 -5
+4
drivers/gpu/drm/xe/regs/xe_gsc_regs.h
··· 16 16 #define MTL_GSC_HECI1_BASE 0x00116000 17 17 #define MTL_GSC_HECI2_BASE 0x00117000 18 18 19 + #define DG1_GSC_HECI2_BASE 0x00259000 20 + #define PVC_GSC_HECI2_BASE 0x00285000 21 + #define DG2_GSC_HECI2_BASE 0x00374000 22 + 19 23 #define HECI_H_CSR(base) XE_REG((base) + 0x4) 20 24 #define HECI_H_CSR_IE REG_BIT(0) 21 25 #define HECI_H_CSR_IS REG_BIT(1)
+1 -4
drivers/gpu/drm/xe/xe_heci_gsc.c
··· 11 11 #include "xe_device_types.h" 12 12 #include "xe_drv.h" 13 13 #include "xe_heci_gsc.h" 14 + #include "regs/xe_gsc_regs.h" 14 15 #include "xe_platform_types.h" 15 16 #include "xe_survivability_mode.h" 16 17 17 18 #define GSC_BAR_LENGTH 0x00000FFC 18 - 19 - #define DG1_GSC_HECI2_BASE 0x259000 20 - #define PVC_GSC_HECI2_BASE 0x285000 21 - #define DG2_GSC_HECI2_BASE 0x374000 22 19 23 20 static void heci_gsc_irq_mask(struct irq_data *d) 24 21 {
+36 -1
drivers/gpu/drm/xe/xe_nvm.c
··· 6 6 #include <linux/intel_dg_nvm_aux.h> 7 7 #include <linux/pci.h> 8 8 9 + #include "xe_device.h" 9 10 #include "xe_device_types.h" 11 + #include "xe_mmio.h" 10 12 #include "xe_nvm.h" 13 + #include "regs/xe_gsc_regs.h" 11 14 #include "xe_sriov.h" 12 15 13 16 #define GEN12_GUNIT_NVM_BASE 0x00102040 ··· 27 24 28 25 static void xe_nvm_release_dev(struct device *dev) 29 26 { 27 + } 28 + 29 + static bool xe_nvm_writable_override(struct xe_device *xe) 30 + { 31 + struct xe_gt *gt = xe_root_mmio_gt(xe); 32 + bool writable_override; 33 + resource_size_t base; 34 + 35 + switch (xe->info.platform) { 36 + case XE_BATTLEMAGE: 37 + base = DG2_GSC_HECI2_BASE; 38 + break; 39 + case XE_PVC: 40 + base = PVC_GSC_HECI2_BASE; 41 + break; 42 + case XE_DG2: 43 + base = DG2_GSC_HECI2_BASE; 44 + break; 45 + case XE_DG1: 46 + base = DG1_GSC_HECI2_BASE; 47 + break; 48 + default: 49 + drm_err(&xe->drm, "Unknown platform\n"); 50 + return true; 51 + } 52 + 53 + writable_override = 54 + !(xe_mmio_read32(&gt->mmio, HECI_FWSTS2(base)) & 55 + HECI_FW_STATUS_2_NVM_ACCESS_MODE); 56 + if (writable_override) 57 + drm_info(&xe->drm, "NVM access overridden by jumper\n"); 58 + return writable_override; 30 59 } 31 60 32 61 int xe_nvm_init(struct xe_device *xe) ··· 85 50 86 51 nvm = xe->nvm; 87 52 88 - nvm->writable_override = false; 53 + nvm->writable_override = xe_nvm_writable_override(xe); 89 54 nvm->bar.parent = &pdev->resource[0]; 90 55 nvm->bar.start = GEN12_GUNIT_NVM_BASE + pdev->resource[0].start; 91 56 nvm->bar.end = nvm->bar.start + GEN12_GUNIT_NVM_SIZE - 1;