summaryrefslogtreecommitdiff
path: root/src/soc/intel/common/block/smbus
diff options
context:
space:
mode:
authorYuchi Chen <yuchi.chen@intel.com>2024-09-03 23:09:23 +0800
committerLean Sheng Tan <sheng.tan@9elements.com>2024-11-09 10:21:17 +0000
commit60771bfdb102be639b7f074299c5778a8d9b24b9 (patch)
treeea30f1bbc516b3f24a4b430eddcef428a7925cbd /src/soc/intel/common/block/smbus
parent7a7b4f05fc6375d63e2128c791006c5f9e1c45ac (diff)
soc/intel/common/block/imc: Add Integrated Memory Controller driver
Intel common IMC contains an embedded SMBus controller for SPD data access. This patch implements IMC based SPD access supports through MMIO. Register definitons are from Intel Atom Processor C5100, C5300, P5300 and P5700 Product Families EDS, doc No. 575160 rev 2.0. Change-Id: I3f47ddeda94d3882852d64c0052f8fb42b6b7ad2 Tested-by: Yuchi Chen <yuchi.chen@intel.com> Signed-off-by: Yuchi Chen <yuchi.chen@intel.com> Reviewed-on: https://review.coreboot.org/c/coreboot/+/83320 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Shuo Liu <shuo.liu@intel.com>
Diffstat (limited to 'src/soc/intel/common/block/smbus')
-rw-r--r--src/soc/intel/common/block/smbus/Makefile.mk7
-rw-r--r--src/soc/intel/common/block/smbus/smbuslib.c13
2 files changed, 15 insertions, 5 deletions
diff --git a/src/soc/intel/common/block/smbus/Makefile.mk b/src/soc/intel/common/block/smbus/Makefile.mk
index dd568144e5..2ef3a5b752 100644
--- a/src/soc/intel/common/block/smbus/Makefile.mk
+++ b/src/soc/intel/common/block/smbus/Makefile.mk
@@ -1,10 +1,8 @@
## SPDX-License-Identifier: GPL-2.0-only
-bootblock-$(CONFIG_SOC_INTEL_COMMON_BLOCK_SMBUS) += spd_access.c
bootblock-$(CONFIG_SOC_INTEL_COMMON_BLOCK_SMBUS) += smbuslib.c
bootblock-$(CONFIG_SOC_INTEL_COMMON_BLOCK_SMBUS) += smbus_early.c
bootblock-$(CONFIG_SOC_INTEL_COMMON_BLOCK_TCO) += tco.c
-romstage-$(CONFIG_SOC_INTEL_COMMON_BLOCK_SMBUS) += spd_access.c
romstage-$(CONFIG_SOC_INTEL_COMMON_BLOCK_SMBUS) += smbuslib.c
romstage-$(CONFIG_SOC_INTEL_COMMON_BLOCK_SMBUS) += smbus_early.c
romstage-$(CONFIG_SOC_INTEL_COMMON_BLOCK_TCO) += tco.c
@@ -15,3 +13,8 @@ ramstage-$(CONFIG_SOC_INTEL_COMMON_BLOCK_TCO) += tco.c
postcar-$(CONFIG_SOC_INTEL_COMMON_BLOCK_TCO) += tco.c
smm-$(CONFIG_SOC_INTEL_COMMON_BLOCK_TCO) += tco.c
verstage-$(CONFIG_SOC_INTEL_COMMON_BLOCK_TCO) += tco.c
+
+ifneq ($(CONFIG_SOC_INTEL_COMMON_BLOCK_IMC),y)
+bootblock-$(CONFIG_SOC_INTEL_COMMON_BLOCK_SMBUS) += spd_access.c
+romstage-$(CONFIG_SOC_INTEL_COMMON_BLOCK_SMBUS) += spd_access.c
+endif
diff --git a/src/soc/intel/common/block/smbus/smbuslib.c b/src/soc/intel/common/block/smbus/smbuslib.c
index deb09b390d..cf60e64c1d 100644
--- a/src/soc/intel/common/block/smbus/smbuslib.c
+++ b/src/soc/intel/common/block/smbus/smbuslib.c
@@ -52,7 +52,9 @@ static int get_spd(u8 *spd, u8 addr)
return -1;
}
- if (i2c_eeprom_read(addr, 0, SPD_PAGE_LEN, spd) < 0) {
+ /* IMC doesn't support i2c eeprom read. */
+ if (CONFIG(SOC_INTEL_COMMON_BLOCK_IMC) ||
+ i2c_eeprom_read(addr, 0, SPD_PAGE_LEN, spd) < 0) {
printk(BIOS_INFO, "do_i2c_eeprom_read failed, using fallback\n");
spd_read(spd, addr);
}
@@ -62,7 +64,9 @@ static int get_spd(u8 *spd, u8 addr)
/* Switch to page 1 */
spd_write_byte(SPD_PAGE_1, 0, 0);
- if (i2c_eeprom_read(addr, 0, SPD_PAGE_LEN, spd + SPD_PAGE_LEN) < 0) {
+ /* IMC doesn't support i2c eeprom read. */
+ if (CONFIG(SOC_INTEL_COMMON_BLOCK_IMC) ||
+ i2c_eeprom_read(addr, 0, SPD_PAGE_LEN, spd + SPD_PAGE_LEN) < 0) {
printk(BIOS_INFO, "do_i2c_eeprom_read failed, using fallback\n");
spd_read(spd + SPD_PAGE_LEN, addr);
}
@@ -78,7 +82,10 @@ void get_spd_smbus(struct spd_block *blk)
{
u8 i;
for (i = 0 ; i < CONFIG_DIMM_MAX; i++) {
- if (blk->addr_map[i] == 0) {
+ /**
+ * Slave address 0 is also available for IMC based SPD SMBus.
+ */
+ if (!CONFIG(SOC_INTEL_COMMON_BLOCK_IMC) && blk->addr_map[i] == 0) {
blk->spd_array[i] = NULL;
continue;
}