From 0cb5eace6cf1163ba59cf54c4ba013acfc7dcc56 Mon Sep 17 00:00:00 2001 From: CoolStar Date: Fri, 7 Jul 2023 15:59:04 -0700 Subject: soc/intel/common: Restore to page 0 before reading SPD MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit test: Warm reboot from Windows 11 w/ Samsung 980 Pro on Banshee Verify memory type detected properly and following boot works Change-Id: Iad0a2024bd0ef39f6ab57ff7a6e6aa651d7882a6 Signed-off-by: CoolStar Reviewed-on: https://review.coreboot.org/c/coreboot/+/76382 Tested-by: build bot (Jenkins) Reviewed-by: Kyösti Mälkki Reviewed-by: Eric Lai Reviewed-by: Matt DeVillier --- src/soc/intel/common/block/smbus/smbuslib.c | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'src/soc/intel/common/block') diff --git a/src/soc/intel/common/block/smbus/smbuslib.c b/src/soc/intel/common/block/smbus/smbuslib.c index a92f88018c..aff6fb0a1b 100644 --- a/src/soc/intel/common/block/smbus/smbuslib.c +++ b/src/soc/intel/common/block/smbus/smbuslib.c @@ -40,6 +40,11 @@ static void smbus_read_spd(u8 *spd, u8 addr) /* return -1 if SMBus errors otherwise return 0 */ static int get_spd(u8 *spd, u8 addr) { + if (CONFIG_DIMM_SPD_SIZE > SPD_PAGE_LEN) { + /* Restore to page 0 before reading */ + smbus_write_byte(SPD_PAGE_0, 0, 0); + } + /* If address is not 0, it will return CB_ERR(-1) if no dimm */ if (smbus_read_byte(addr, 0) < 0) { printk(BIOS_INFO, "No memory dimm at address %02X\n", @@ -102,6 +107,11 @@ enum cb_err get_spd_sn(u8 addr, u32 *sn) if (addr == 0x0) return CB_ERR; + if (CONFIG_DIMM_SPD_SIZE > SPD_PAGE_LEN) { + /* Restore to page 0 before reading */ + smbus_write_byte(SPD_PAGE_0, 0, 0); + } + /* If dimm is not present, set sn to 0xff. */ smbus_ret = smbus_read_byte(addr, SPD_DRAM_TYPE); if (smbus_ret < 0) { -- cgit v1.2.3