summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim Wawrzynczak <twawrzynczak@chromium.org>2021-08-24 09:20:14 -0600
committerFelix Held <felix-coreboot@felixheld.de>2021-08-26 18:23:24 +0000
commitd87af79ace16a499679d28ba3436950f9d9d090e (patch)
tree5dd9ac8fd9eb2f5cb48fd6cbb339879266823bc3
parent30c6ca98381c3fa746aeeacdb37f77a5b9435750 (diff)
soc/intel/common/block: Add PAM locking function
Some FSPs provide a UPD to allow the bootloader to set the PAM lock bit instead of the FSP, therefore add a function in the common code to do this. Source: ADL & TGL FSP integration guides Signed-off-by: Tim Wawrzynczak <twawrzynczak@chromium.org> Change-Id: I1d6642b496617b6e8ccda8a0aa6bfd88ea9dc3ba Reviewed-on: https://review.coreboot.org/c/coreboot/+/57145 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Subrata Banik <subrata.banik@intel.com> Reviewed-by: Furquan Shaikh <furquan@google.com>
-rw-r--r--src/soc/intel/common/block/include/intelblocks/systemagent.h3
-rw-r--r--src/soc/intel/common/block/systemagent/systemagent.c9
-rw-r--r--src/soc/intel/common/block/systemagent/systemagent_def.h3
3 files changed, 15 insertions, 0 deletions
diff --git a/src/soc/intel/common/block/include/intelblocks/systemagent.h b/src/soc/intel/common/block/include/intelblocks/systemagent.h
index fe14c181fb..f708fae674 100644
--- a/src/soc/intel/common/block/include/intelblocks/systemagent.h
+++ b/src/soc/intel/common/block/include/intelblocks/systemagent.h
@@ -79,6 +79,9 @@ uintptr_t sa_get_tseg_base(void);
size_t sa_get_tseg_size(void);
/* Fill MMIO resource above 4GB into GNVS */
void sa_fill_gnvs(struct global_nvs *gnvs);
+/* API to lock PAM registers */
+void sa_lock_pam(void);
+
/*
* SoC overrides
*
diff --git a/src/soc/intel/common/block/systemagent/systemagent.c b/src/soc/intel/common/block/systemagent/systemagent.c
index 6e02c811ec..45e1d4216f 100644
--- a/src/soc/intel/common/block/systemagent/systemagent.c
+++ b/src/soc/intel/common/block/systemagent/systemagent.c
@@ -306,6 +306,15 @@ void enable_power_aware_intr(void)
MCHBAR8(MCH_PAIR) = pair;
}
+void sa_lock_pam(void)
+{
+ const struct device *dev = pcidev_path_on_root(SA_DEVFN_ROOT);
+ if (!dev)
+ return;
+
+ pci_or_config8(dev, PAM0, PAM_LOCK);
+}
+
static struct device_operations systemagent_ops = {
.read_resources = systemagent_read_resources,
.set_resources = pci_dev_set_resources,
diff --git a/src/soc/intel/common/block/systemagent/systemagent_def.h b/src/soc/intel/common/block/systemagent/systemagent_def.h
index 7517b140fb..0add13e93e 100644
--- a/src/soc/intel/common/block/systemagent/systemagent_def.h
+++ b/src/soc/intel/common/block/systemagent/systemagent_def.h
@@ -35,6 +35,9 @@
#define PAM5 0x85
#define PAM6 0x86
+/* PAM0 contains the lock bit */
+#define PAM_LOCK (1 << 0)
+
/* Device 0:0.0 MMIO space */
#define MCH_PAIR 0x5418