aboutsummaryrefslogtreecommitdiff
path: root/src/southbridge/intel/i82801gx/lpc.c
diff options
context:
space:
mode:
authorArthur Heymans <arthur@aheymans.xyz>2018-01-22 14:42:18 +0100
committerPatrick Georgi <pgeorgi@google.com>2018-06-04 09:35:58 +0000
commit3664647a25f31a26993433dcb6754484f58a9a62 (patch)
tree03ae06cb94e49993c5388f1197a30f30cb2a5be0 /src/southbridge/intel/i82801gx/lpc.c
parent02c997122f5f070c2196b86799fa77c85cc22383 (diff)
sb/intel/i82801gx: Add the option to lock the platform
This allows to lock down spi among other things Mostly copied from bd82x6x. Tested on Intel DG41WV with the MRC_CACHE driver write protecting the mrc_cache region. Change-Id: If9c3a6118f4586d51c093edec896c347ba904b8f Signed-off-by: Arthur Heymans <arthur@aheymans.xyz> Reviewed-on: https://review.coreboot.org/23358 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Patrick Georgi <pgeorgi@google.com>
Diffstat (limited to 'src/southbridge/intel/i82801gx/lpc.c')
-rw-r--r--src/southbridge/intel/i82801gx/lpc.c35
1 files changed, 35 insertions, 0 deletions
diff --git a/src/southbridge/intel/i82801gx/lpc.c b/src/southbridge/intel/i82801gx/lpc.c
index ab426ab86c..acc57a7dfb 100644
--- a/src/southbridge/intel/i82801gx/lpc.c
+++ b/src/southbridge/intel/i82801gx/lpc.c
@@ -645,6 +645,40 @@ static void i82801gx_lpc_read_resources(struct device *dev)
}
}
+#define SPIBAR16(x) RCBA16(0x3020 + x)
+#define SPIBAR32(x) RCBA32(0x3020 + x)
+
+static void lpc_final(struct device *dev)
+{
+ u16 tco1_cnt;
+
+ if (!IS_ENABLED(CONFIG_INTEL_CHIPSET_LOCKDOWN))
+ return;
+
+ SPIBAR16(PREOP) = SPI_OPPREFIX;
+ /* Set SPI opcode menu */
+ SPIBAR16(OPTYPE) = SPI_OPTYPE;
+ SPIBAR32(OPMENU) = SPI_OPMENU_LOWER;
+ SPIBAR32(OPMENU + 4) = SPI_OPMENU_UPPER;
+
+ /* Lock SPIBAR */
+ SPIBAR16(0) = SPIBAR16(0) | (1 << 15);
+
+ /* BIOS Interface Lockdown */
+ RCBA32(0x3410) |= 1 << 0;
+
+ /* Global SMI Lock */
+ pci_or_config16(dev, GEN_PMCON_1, 1 << 4);
+
+ /* TCO_Lock */
+ tco1_cnt = inw(DEFAULT_PMBASE + 0x60 + TCO1_CNT);
+ tco1_cnt |= (1 << 12); /* TCO lock */
+ outw(tco1_cnt, DEFAULT_PMBASE + 0x60 + TCO1_CNT);
+
+ /* Indicate finalize step with post code */
+ outb(POST_OS_BOOT, 0x80);
+}
+
static void set_subsystem(struct device *dev, unsigned int vendor,
unsigned int device)
{
@@ -698,6 +732,7 @@ static struct device_operations device_ops = {
.scan_bus = scan_lpc_bus,
.enable = i82801gx_enable,
.ops_pci = &pci_ops,
+ .final = lpc_final,
};
/* 27b0: 82801GH (ICH7 DH) */