diff options
author | Wonkyu Kim <wonkyu.kim@intel.com> | 2021-09-01 23:32:23 -0700 |
---|---|---|
committer | Felix Held <felix-coreboot@felixheld.de> | 2022-05-16 13:09:58 +0000 |
commit | d107e810c9b188bd313c25638a2878bd4fc61615 (patch) | |
tree | 0bc1da2c77b1d0da1ce0ca6403348634a69f4e35 /src/soc/intel | |
parent | 169302aa7f52c9d9e842700575741a932a64ac99 (diff) |
soc/intel/common: Implement IOC driver
Starting with Meteor Lake SoC, the PCR/DMI interface to program GPMR
is replaced with IOC (I/O Cache), hence, this patch implements IOC
driver to support that migration.
Reference: 643504 MTL FAS section 7.5.2
TEST=Build and boot to OS for TGL RVP and MTL PSS
Signed-off-by: Wonkyu Kim <wonkyu.kim@intel.com>
Change-Id: I768027c2ca78310c03845f70f17df19dc8cd0982
Reviewed-on: https://review.coreboot.org/c/coreboot/+/63198
Reviewed-by: Subrata Banik <subratabanik@google.com>
Reviewed-by: Angel Pons <th3fanbus@gmail.com>
Reviewed-by: Nick Vaccaro <nvaccaro@google.com>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Diffstat (limited to 'src/soc/intel')
-rw-r--r-- | src/soc/intel/common/block/gpmr/gpmr.c | 16 | ||||
-rw-r--r-- | src/soc/intel/common/block/include/intelblocks/gpmr.h | 4 | ||||
-rw-r--r-- | src/soc/intel/common/block/include/intelblocks/ioc.h | 12 | ||||
-rw-r--r-- | src/soc/intel/common/block/include/intelblocks/ioc_gpmr.h | 29 | ||||
-rw-r--r-- | src/soc/intel/common/block/ioc/Kconfig | 7 | ||||
-rw-r--r-- | src/soc/intel/common/block/ioc/Makefile.inc | 3 | ||||
-rw-r--r-- | src/soc/intel/common/block/ioc/ioc.c | 24 | ||||
-rw-r--r-- | src/soc/intel/common/pch/lockdown/lockdown.c | 7 |
8 files changed, 96 insertions, 6 deletions
diff --git a/src/soc/intel/common/block/gpmr/gpmr.c b/src/soc/intel/common/block/gpmr/gpmr.c index 6c809a5cb8..1b2a2d1e4d 100644 --- a/src/soc/intel/common/block/gpmr/gpmr.c +++ b/src/soc/intel/common/block/gpmr/gpmr.c @@ -2,24 +2,34 @@ #include <console/console.h> #include <intelblocks/gpmr.h> +#include <intelblocks/ioc.h> #include <intelblocks/pcr.h> #include <soc/pcr_ids.h> /* GPMR Register read given offset */ uint32_t gpmr_read32(uint16_t offset) { - return pcr_read32(PID_DMI, offset); + if (CONFIG(SOC_INTEL_COMMON_BLOCK_IOC)) + return ioc_reg_read32(offset); + else + return pcr_read32(PID_DMI, offset); } /* GPMR Register write given offset and val */ void gpmr_write32(uint16_t offset, uint32_t val) { - return pcr_write32(PID_DMI, offset, val); + if (CONFIG(SOC_INTEL_COMMON_BLOCK_IOC)) + return ioc_reg_write32(offset, val); + else + return pcr_write32(PID_DMI, offset, val); } void gpmr_or32(uint16_t offset, uint32_t ordata) { - return pcr_or32(PID_DMI, offset, ordata); + if (CONFIG(SOC_INTEL_COMMON_BLOCK_IOC)) + return ioc_reg_or32(offset, ordata); + else + return pcr_or32(PID_DMI, offset, ordata); } /* Check for available free gpmr */ diff --git a/src/soc/intel/common/block/include/intelblocks/gpmr.h b/src/soc/intel/common/block/include/intelblocks/gpmr.h index d898f329b8..887328c20f 100644 --- a/src/soc/intel/common/block/include/intelblocks/gpmr.h +++ b/src/soc/intel/common/block/include/intelblocks/gpmr.h @@ -4,7 +4,11 @@ #define SOC_INTEL_COMMON_BLOCK_GPMR_H #include <types.h> +#if CONFIG(SOC_INTEL_COMMON_BLOCK_IOC) +#include <intelblocks/ioc_gpmr.h> +#else #include <intelblocks/pcr_gpmr.h> +#endif uint32_t gpmr_read32(uint16_t offset); void gpmr_write32(uint16_t offset, uint32_t val); diff --git a/src/soc/intel/common/block/include/intelblocks/ioc.h b/src/soc/intel/common/block/include/intelblocks/ioc.h new file mode 100644 index 0000000000..885b20f345 --- /dev/null +++ b/src/soc/intel/common/block/include/intelblocks/ioc.h @@ -0,0 +1,12 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#ifndef SOC_INTEL_COMMON_BLOCK_IOC_H +#define SOC_INTEL_COMMON_BLOCK_IOC_H + +#include <types.h> + +void ioc_reg_write32(uint32_t offset, uint32_t value); +uint32_t ioc_reg_read32(uint32_t offset); +void ioc_reg_or32(uint32_t offset, uint32_t ordata); + +#endif /* SOC_INTEL_COMMON_BLOCK_IOC_H */ diff --git a/src/soc/intel/common/block/include/intelblocks/ioc_gpmr.h b/src/soc/intel/common/block/include/intelblocks/ioc_gpmr.h new file mode 100644 index 0000000000..b11fa70a38 --- /dev/null +++ b/src/soc/intel/common/block/include/intelblocks/ioc_gpmr.h @@ -0,0 +1,29 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#ifndef SOC_INTEL_COMMON_BLOCK_IOC_GPMR_H +#define SOC_INTEL_COMMON_BLOCK_IOC_GPMR_H +#include <assert.h> + +#define GPMR_LPCLGIR1 0x7a30 +#define GPMR_LPCGMR 0x7a40 +#define GPMR_GCS 0x7a4c +#define GPMR_GCS_BILD 0x1 +#define GPMR_LPCIOD 0x7a70 +#define GPMR_LPCIOE 0x7a74 +#define GPMR_TCOBASE 0x7a78 +#define GPMR_TCOEN (1 << 1) + +#define MAX_GPMR_REGS 3 + +#define GPMR_OFFSET(x) (0x7a7c + (x) * 8) +#define GPMR_LIMIT_MASK 0xffff0000 +#define GPMR_BASE_SHIFT 16 +#define GPMR_BASE_MASK 0xffff + +#define GPMR_DID_OFFSET(x) (0x7a80 + (x) * 8) +#define GPMR_EN BIT(31) + +#define GPMR_DMICTL dead_code_t(unsigned int) +#define GPMR_DMICTL_SRLOCK dead_code_t(unsigned int) + +#endif diff --git a/src/soc/intel/common/block/ioc/Kconfig b/src/soc/intel/common/block/ioc/Kconfig new file mode 100644 index 0000000000..19c6f8487f --- /dev/null +++ b/src/soc/intel/common/block/ioc/Kconfig @@ -0,0 +1,7 @@ +config SOC_INTEL_COMMON_BLOCK_IOC + bool + depends on SOC_INTEL_COMMON_BLOCK_SA + help + Intel Processor common IO Cache (IOC). + IOC will replace DMI interface starting with Meteor Lake SoC + (which does not have the PCH die). diff --git a/src/soc/intel/common/block/ioc/Makefile.inc b/src/soc/intel/common/block/ioc/Makefile.inc new file mode 100644 index 0000000000..5896534729 --- /dev/null +++ b/src/soc/intel/common/block/ioc/Makefile.inc @@ -0,0 +1,3 @@ +bootblock-$(CONFIG_SOC_INTEL_COMMON_BLOCK_IOC) += ioc.c +romstage-$(CONFIG_SOC_INTEL_COMMON_BLOCK_IOC) += ioc.c +ramstage-$(CONFIG_SOC_INTEL_COMMON_BLOCK_IOC) += ioc.c diff --git a/src/soc/intel/common/block/ioc/ioc.c b/src/soc/intel/common/block/ioc/ioc.c new file mode 100644 index 0000000000..639ec90f8f --- /dev/null +++ b/src/soc/intel/common/block/ioc/ioc.c @@ -0,0 +1,24 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#include <device/mmio.h> +#include <intelblocks/ioc.h> +#include <soc/iomap.h> + +void ioc_reg_write32(uint32_t offset, uint32_t value) +{ + write32p(MCH_BASE_ADDRESS + offset, value); +} + +uint32_t ioc_reg_read32(uint32_t offset) +{ + return read32p(MCH_BASE_ADDRESS + offset); +} + +void ioc_reg_or32(uint32_t offset, uint32_t ordata) +{ + uint32_t data32; + + data32 = read32p(MCH_BASE_ADDRESS + offset); + data32 |= ordata; + write32p(MCH_BASE_ADDRESS + offset, data32); +} diff --git a/src/soc/intel/common/pch/lockdown/lockdown.c b/src/soc/intel/common/pch/lockdown/lockdown.c index 42f01bf6d3..f8eb511889 100644 --- a/src/soc/intel/common/pch/lockdown/lockdown.c +++ b/src/soc/intel/common/pch/lockdown/lockdown.c @@ -30,7 +30,7 @@ int get_lockdown_config(void) static void gpmr_lockdown_cfg(void) { /* - * GCS reg of DMI + * GCS reg * * When set, prevents GCS.BBS from being changed * GCS.BBS: (Boot BIOS Strap) This field determines the destination @@ -43,9 +43,10 @@ static void gpmr_lockdown_cfg(void) /* * Set Secure Register Lock (SRL) bit in DMI control register to lock - * DMI configuration. + * DMI configuration and bypass when IOC instead of DMI */ - gpmr_or32(GPMR_DMICTL, GPMR_DMICTL_SRLOCK); + if (!CONFIG(SOC_INTEL_COMMON_BLOCK_IOC)) + gpmr_or32(GPMR_DMICTL, GPMR_DMICTL_SRLOCK); } static void fast_spi_lockdown_cfg(int chipset_lockdown) |