summaryrefslogtreecommitdiff
path: root/src/soc/intel/xeon_sp
diff options
context:
space:
mode:
Diffstat (limited to 'src/soc/intel/xeon_sp')
-rw-r--r--src/soc/intel/xeon_sp/cpx/chip.c9
-rw-r--r--src/soc/intel/xeon_sp/cpx/include/soc/pci_devs.h6
2 files changed, 15 insertions, 0 deletions
diff --git a/src/soc/intel/xeon_sp/cpx/chip.c b/src/soc/intel/xeon_sp/cpx/chip.c
index 34e0e27936..f4a9e8282b 100644
--- a/src/soc/intel/xeon_sp/cpx/chip.c
+++ b/src/soc/intel/xeon_sp/cpx/chip.c
@@ -6,6 +6,7 @@
#include <cpu/x86/lapic.h>
#include <cpu/x86/mp.h>
#include <device/pci.h>
+#include <device/pci_ids.h>
#include <intelblocks/acpi.h>
#include <intelblocks/gpio.h>
#include <intelblocks/lpc_lib.h>
@@ -159,6 +160,13 @@ static void set_msr_locks(void *unused)
wrmsr(MSR_FEATURE_CONFIG, msr);
}
+static void set_imc_locks(void)
+{
+ struct device *dev = 0;
+ while ((dev = dev_find_device(PCI_VENDOR_ID_INTEL, IMC_M2MEM_DEVID, dev)))
+ pci_or_config32(dev, IMC_M2MEM_TIMEOUT, TIMEOUT_LOCK);
+}
+
static void chip_final(void *data)
{
/* Lock SBI */
@@ -177,6 +185,7 @@ static void chip_final(void *data)
mp_run_on_all_cpus(set_msr_locks, NULL);
set_pcu_locks();
+ set_imc_locks();
p2sb_hide();
iio_enable_masks();
diff --git a/src/soc/intel/xeon_sp/cpx/include/soc/pci_devs.h b/src/soc/intel/xeon_sp/cpx/include/soc/pci_devs.h
index 7f4a04583d..0f9a1c31fb 100644
--- a/src/soc/intel/xeon_sp/cpx/include/soc/pci_devs.h
+++ b/src/soc/intel/xeon_sp/cpx/include/soc/pci_devs.h
@@ -118,6 +118,12 @@
#define VTD_EXT_CAP_HIGH 0x14
#define VTD_LTDPR 0x290
+/* IMC Devices */
+/* Bus: B(2), Device: 9-8, Function: 0 (M2MEM) */
+#define IMC_M2MEM_DEVID 0x2066
+#define IMC_M2MEM_TIMEOUT 0x104
+#define TIMEOUT_LOCK BIT(1)
+
/* CPU Devices */
#define CBDMA_DEV_NUM 0x04