soc/intel/cannonlake: Do not read SPD again if index hasn't changed
With the recent refactoring of memory configuration in CB:32513 ("soc/intel/cannonlake: Support different SPD read type for each slot"), meminit_cbfs_spd_index ends up reading SPD from CBFS for each slot. However, for mainboards that use the same SPD index for each slot this is unneccessary. This change adds a check to see if spd_data_ptr is not NULL and current spd index is the same as the last call to decide if SPD read from CBFS should be skipped. TEST=Verified that SPD gets read only once on hatch. Change-Id: I91963b55cea534c92207b2cd9f0caa96df8f222b Signed-off-by: Furquan Shaikh <furquan@google.com> Reviewed-on: https://review.coreboot.org/c/coreboot/+/33137 Reviewed-by: Paul Menzel <paulepanter@users.sourceforge.net> Reviewed-by: Aaron Durbin <adurbin@chromium.org> Reviewed-by: Tim Wawrzynczak <twawrzynczak@chromium.org> Reviewed-by: Philip Chen <philipchen@google.com> Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
This commit is contained in:
parent
ef1ab4d6d4
commit
b2709ae0ae
|
@ -91,18 +91,29 @@ static void meminit_spd_data(FSP_M_CONFIG *mem_cfg, uint8_t mem_slot,
|
|||
static void meminit_cbfs_spd_index(FSP_M_CONFIG *mem_cfg,
|
||||
int spd_index, uint8_t mem_slot)
|
||||
{
|
||||
size_t spd_data_len;
|
||||
uintptr_t spd_data_ptr;
|
||||
struct region_device spd_rdev;
|
||||
static size_t spd_data_len;
|
||||
static uintptr_t spd_data_ptr;
|
||||
static int last_spd_index;
|
||||
|
||||
assert(mem_slot < NUM_DIMM_SLOT);
|
||||
printk(BIOS_DEBUG, "SPD INDEX = %d\n", spd_index);
|
||||
if (get_spd_cbfs_rdev(&spd_rdev, spd_index) < 0)
|
||||
die("spd.bin not found or incorrect index\n");
|
||||
spd_data_len = region_device_sz(&spd_rdev);
|
||||
/* Memory leak is ok since we have memory mapped boot media */
|
||||
assert(CONFIG(BOOT_DEVICE_MEMORY_MAPPED));
|
||||
spd_data_ptr = (uintptr_t)rdev_mmap_full(&spd_rdev);
|
||||
|
||||
if ((spd_data_ptr == 0) || (last_spd_index != spd_index)) {
|
||||
struct region_device spd_rdev;
|
||||
|
||||
printk(BIOS_DEBUG, "SPD INDEX = %d\n", spd_index);
|
||||
|
||||
if (get_spd_cbfs_rdev(&spd_rdev, spd_index) < 0)
|
||||
die("spd.bin not found or incorrect index\n");
|
||||
|
||||
spd_data_len = region_device_sz(&spd_rdev);
|
||||
|
||||
/* Memory leak is ok since we have memory mapped boot media */
|
||||
assert(CONFIG(BOOT_DEVICE_MEMORY_MAPPED));
|
||||
|
||||
spd_data_ptr = (uintptr_t)rdev_mmap_full(&spd_rdev);
|
||||
last_spd_index = spd_index;
|
||||
}
|
||||
|
||||
meminit_spd_data(mem_cfg, mem_slot, spd_data_len, spd_data_ptr);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue