diff --git a/src/include/spd_bin.h b/src/include/spd_bin.h index 11a0084c70..973eb498a7 100644 --- a/src/include/spd_bin.h +++ b/src/include/spd_bin.h @@ -43,8 +43,7 @@ struct spd_block { }; void print_spd_info(uint8_t spd[]); -/* Return 0 on success & -1 on failure */ -int get_spd_cbfs_rdev(struct region_device *spd_rdev, u8 spd_index); +uintptr_t spd_cbfs_map(u8 spd_index); void dump_spd_info(struct spd_block *blk); void get_spd_smbus(struct spd_block *blk); diff --git a/src/lib/spd_bin.c b/src/lib/spd_bin.c index 213d5f4561..865f16cc8a 100644 --- a/src/lib/spd_bin.c +++ b/src/lib/spd_bin.c @@ -210,17 +210,16 @@ void print_spd_info(uint8_t spd[]) } } -int get_spd_cbfs_rdev(struct region_device *spd_rdev, u8 spd_index) +uintptr_t spd_cbfs_map(u8 spd_index) { - struct cbfsf fh; + enum cbfs_type cbfs_type = CBFS_TYPE_SPD; + size_t size; - uint32_t cbfs_type = CBFS_TYPE_SPD; + void *map = cbfs_type_map("spd.bin", &size, &cbfs_type); + if (!map || size < (spd_index + 1) * CONFIG_DIMM_SPD_SIZE) + return 0; - if (cbfs_boot_locate(&fh, "spd.bin", &cbfs_type) < 0) - return -1; - cbfs_file_data(spd_rdev, &fh); - return rdev_chain(spd_rdev, spd_rdev, spd_index * CONFIG_DIMM_SPD_SIZE, - CONFIG_DIMM_SPD_SIZE); + return (uintptr_t)map + spd_index * CONFIG_DIMM_SPD_SIZE; } #if CONFIG_DIMM_SPD_SIZE == 128 diff --git a/src/mainboard/facebook/fbg1701/romstage.c b/src/mainboard/facebook/fbg1701/romstage.c index f307f95d73..fd005a6bf2 100644 --- a/src/mainboard/facebook/fbg1701/romstage.c +++ b/src/mainboard/facebook/fbg1701/romstage.c @@ -18,7 +18,6 @@ void mainboard_memory_init_params(struct romstage_params *params, MEMORY_INIT_UPD *memory_params) { - struct region_device spd_rdev; u8 spd_index = 0; if (!CONFIG(ONBOARD_SAMSUNG_MEM)) { @@ -28,11 +27,10 @@ void mainboard_memory_init_params(struct romstage_params *params, spd_index = 2; } - if (get_spd_cbfs_rdev(&spd_rdev, spd_index) < 0) - die("spd.bin not found\n"); - memory_params->PcdMemoryTypeEnable = MEM_DDR3; - memory_params->PcdMemorySpdPtr = (uintptr_t)rdev_mmap_full(&spd_rdev); + memory_params->PcdMemorySpdPtr = spd_cbfs_map(spd_index); + if (!memory_params->PcdMemorySpdPtr) + die("spd.bin not found\n"); memory_params->PcdMemChannel0Config = 1; /* Memory down */ memory_params->PcdMemChannel1Config = 2; /* Disabled */ } diff --git a/src/mainboard/google/kahlee/variants/baseboard/memory.c b/src/mainboard/google/kahlee/variants/baseboard/memory.c index d3d81fde36..4b60a9cfc3 100644 --- a/src/mainboard/google/kahlee/variants/baseboard/memory.c +++ b/src/mainboard/google/kahlee/variants/baseboard/memory.c @@ -4,6 +4,7 @@ #include #include #include +#include #include #include @@ -22,25 +23,22 @@ uint8_t __weak variant_memory_sku(void) int __weak variant_mainboard_read_spd(uint8_t spdAddress, char *buf, size_t len) { - struct region_device spd_rdev; u8 spd_index = variant_memory_sku(); printk(BIOS_INFO, "%s SPD index %d\n", __func__, spd_index); - if (get_spd_cbfs_rdev(&spd_rdev, spd_index) < 0) { + void *spd = (void *)spd_cbfs_map(spd_index); + if (!spd) { printk(BIOS_ERR, "Error: spd.bin not found\n"); return -1; } - if (len != region_device_sz(&spd_rdev)) { + if (len != CONFIG_DIMM_SPD_SIZE) { printk(BIOS_ERR, "Error: spd.bin is not the correct size\n"); return -1; } - if (rdev_readat(&spd_rdev, buf, 0, len) != len) { - printk(BIOS_ERR, "Error: couldn't read spd.bin\n"); - return -1; - } + memcpy(buf, spd, len); return 0; } diff --git a/src/mainboard/intel/icelake_rvp/romstage_fsp_params.c b/src/mainboard/intel/icelake_rvp/romstage_fsp_params.c index 97617cc1b5..160f0a53ff 100644 --- a/src/mainboard/intel/icelake_rvp/romstage_fsp_params.c +++ b/src/mainboard/intel/icelake_rvp/romstage_fsp_params.c @@ -14,15 +14,12 @@ void mainboard_memory_init_params(FSPM_UPD *mupd) printk(BIOS_DEBUG, "spd index is 0x%x\n", spd_index); if (spd_index > 0 && spd_index != 2) { - struct region_device spd_rdev; - - if (get_spd_cbfs_rdev(&spd_rdev, spd_index) < 0) - die("spd.bin not found\n"); - - mem_cfg->MemorySpdDataLen = region_device_sz(&spd_rdev); + mem_cfg->MemorySpdDataLen = CONFIG_DIMM_SPD_SIZE; /* Memory leak is ok since we have memory mapped boot media */ - mem_cfg->MemorySpdPtr00 = (uintptr_t)rdev_mmap_full(&spd_rdev); + mem_cfg->MemorySpdPtr00 = spd_cbfs_map(spd_index); + if (!mem_cfg->MemorySpdPtr00) + die("spd.bin not found\n"); mem_cfg->MemorySpdPtr10 = mem_cfg->MemorySpdPtr00; mem_cfg->SpdAddressTable[0] = 0x0; diff --git a/src/mainboard/intel/kblrvp/romstage.c b/src/mainboard/intel/kblrvp/romstage.c index 79206e00c8..bc4c6de661 100644 --- a/src/mainboard/intel/kblrvp/romstage.c +++ b/src/mainboard/intel/kblrvp/romstage.c @@ -28,14 +28,12 @@ void mainboard_memory_init_params(FSPM_UPD *mupd) mainboard_fill_rcomp_strength_data(&mem_cfg->RcompTarget); if (CONFIG(BOARD_INTEL_KBLRVP3)) { - struct region_device spd_rdev; - mem_cfg->DqPinsInterleaved = 0; - if (get_spd_cbfs_rdev(&spd_rdev, spd_index) < 0) - die("spd.bin not found\n"); - mem_cfg->MemorySpdDataLen = region_device_sz(&spd_rdev); + mem_cfg->MemorySpdDataLen = CONFIG_DIMM_SPD_SIZE; /* Memory leak is ok since we have memory mapped boot media */ - mem_cfg->MemorySpdPtr00 = (uintptr_t)rdev_mmap_full(&spd_rdev); + mem_cfg->MemorySpdPtr00 = spd_cbfs_map(spd_index); + if (!mem_cfg->MemorySpdPtr00) + die("spd.bin not found\n"); } else { /* CONFIG_BOARD_INTEL_KBLRVP7 and CONFIG_BOARD_INTEL_KBLRVP8 */ struct spd_block blk = { .addr_map = { 0x50, 0x51, 0x52, 0x53, }, diff --git a/src/mainboard/portwell/m107/romstage.c b/src/mainboard/portwell/m107/romstage.c index 3ba12f30ff..d6d495518a 100644 --- a/src/mainboard/portwell/m107/romstage.c +++ b/src/mainboard/portwell/m107/romstage.c @@ -12,7 +12,6 @@ void mainboard_memory_init_params(struct romstage_params *params, MEMORY_INIT_UPD *memory_params) { - struct region_device spd_rdev; u8 spd_index = 0; if (CONFIG(ONBOARD_MEM_MICRON)) @@ -20,11 +19,10 @@ void mainboard_memory_init_params(struct romstage_params *params, else if (CONFIG(ONBOARD_MEM_KINGSTON)) spd_index = 2; - if (get_spd_cbfs_rdev(&spd_rdev, spd_index) < 0) - die("spd.bin not found\n"); - memory_params->PcdMemoryTypeEnable = MEM_DDR3; - memory_params->PcdMemorySpdPtr = (uintptr_t)rdev_mmap_full(&spd_rdev); + memory_params->PcdMemorySpdPtr = spd_cbfs_map(spd_index); + if (!memory_params->PcdMemorySpdPtr) + die("spd.bin not found\n"); memory_params->PcdMemChannel0Config = 1; /* Memory down */ memory_params->PcdMemChannel1Config = 2; /* Disabled */ } diff --git a/src/mainboard/razer/blade_stealth_kbl/romstage.c b/src/mainboard/razer/blade_stealth_kbl/romstage.c index 92ced2e613..02bfda4846 100644 --- a/src/mainboard/razer/blade_stealth_kbl/romstage.c +++ b/src/mainboard/razer/blade_stealth_kbl/romstage.c @@ -30,15 +30,13 @@ void mainboard_memory_init_params(FSPM_UPD *mupd) mainboard_fill_rcomp_res_data(&mem_cfg->RcompResistor); mainboard_fill_rcomp_strength_data(&mem_cfg->RcompTarget); - struct region_device spd_rdev; - mem_cfg->DqPinsInterleaved = 0; - if (get_spd_cbfs_rdev(&spd_rdev, spd_index) < 0) - die("spd.bin not found\n"); - mem_cfg->MemorySpdDataLen = region_device_sz(&spd_rdev); + mem_cfg->MemorySpdDataLen = CONFIG_DIMM_SPD_SIZE; /* Memory leak is ok since we have memory mapped boot media */ // TODO evaluate google/eve way of loading - mem_cfg->MemorySpdPtr00 = (uintptr_t)rdev_mmap_full(&spd_rdev); + mem_cfg->MemorySpdPtr00 = spd_cbfs_map(spd_index); + if (!mem_cfg->MemorySpdPtr00) + die("spd.bin not found\n"); mem_cfg->MemorySpdPtr10 = mem_cfg->MemorySpdPtr00; mupd->FspmTestConfig.DmiVc1 = 1; diff --git a/src/soc/intel/cannonlake/cnl_memcfg_init.c b/src/soc/intel/cannonlake/cnl_memcfg_init.c index 46452a8b32..a9f9e95b72 100644 --- a/src/soc/intel/cannonlake/cnl_memcfg_init.c +++ b/src/soc/intel/cannonlake/cnl_memcfg_init.c @@ -86,19 +86,17 @@ static void meminit_cbfs_spd_index(FSP_M_CONFIG *mem_cfg, assert(mem_slot < NUM_DIMM_SLOT); 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) + spd_data_ptr = spd_cbfs_map(spd_index); + if (!spd_data_ptr) die("spd.bin not found or incorrect index\n"); - spd_data_len = region_device_sz(&spd_rdev); + spd_data_len = CONFIG_DIMM_SPD_SIZE; /* 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; print_spd_info((unsigned char *)spd_data_ptr); } diff --git a/src/soc/intel/common/block/memory/meminit.c b/src/soc/intel/common/block/memory/meminit.c index 17bf066ba2..50c8b40df2 100644 --- a/src/soc/intel/common/block/memory/meminit.c +++ b/src/soc/intel/common/block/memory/meminit.c @@ -39,7 +39,6 @@ static void read_spd_md(const struct soc_mem_cfg *soc_mem_cfg, const struct mem_ { size_t ch; size_t num_phys_ch = soc_mem_cfg->num_phys_channels; - struct region_device spd_rdev; uintptr_t spd_data; /* @@ -63,15 +62,14 @@ static void read_spd_md(const struct soc_mem_cfg *soc_mem_cfg, const struct mem_ printk(BIOS_DEBUG, "SPD index = %zu\n", info->cbfs_index); - if (get_spd_cbfs_rdev(&spd_rdev, info->cbfs_index) < 0) - die("SPD not found in CBFS or incorrect index!\n"); - /* Memory leak is ok as long as we have memory mapped boot media */ _Static_assert(CONFIG(BOOT_DEVICE_MEMORY_MAPPED), "Function assumes memory-mapped boot media"); - spd_data = (uintptr_t)rdev_mmap_full(&spd_rdev); - *spd_len = region_device_sz(&spd_rdev); + *spd_len = CONFIG_DIMM_SPD_SIZE; + spd_data = spd_cbfs_map(info->cbfs_index); + if (!spd_data) + die("SPD not found in CBFS or incorrect index!\n"); print_spd_info((uint8_t *)spd_data); diff --git a/src/soc/intel/elkhartlake/meminit.c b/src/soc/intel/elkhartlake/meminit.c index f1f82708d8..d6de9a4046 100644 --- a/src/soc/intel/elkhartlake/meminit.c +++ b/src/soc/intel/elkhartlake/meminit.c @@ -10,19 +10,17 @@ static void spd_read_from_cbfs(const struct spd_info *spd_info, uintptr_t *spd_data_ptr, size_t *spd_data_len) { - struct region_device spd_rdev; size_t spd_index = spd_info->spd_spec.spd_index; printk(BIOS_DEBUG, "SPD INDEX = %lu\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); + *spd_data_len = CONFIG_DIMM_SPD_SIZE; + *spd_data_ptr = spd_cbfs_map(spd_index); + if (!*spd_data_ptr) + die("spd.bin not found or incorrect index\n"); } static void get_spd_data(const struct spd_info *spd_info, uintptr_t *spd_data_ptr, diff --git a/src/soc/intel/jasperlake/meminit.c b/src/soc/intel/jasperlake/meminit.c index cd777ba3a0..9ec1ffa82d 100644 --- a/src/soc/intel/jasperlake/meminit.c +++ b/src/soc/intel/jasperlake/meminit.c @@ -10,19 +10,17 @@ static void spd_read_from_cbfs(const struct spd_info *spd_info, uintptr_t *spd_data_ptr, size_t *spd_data_len) { - struct region_device spd_rdev; size_t spd_index = spd_info->spd_spec.spd_index; printk(BIOS_DEBUG, "SPD INDEX = %lu\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); + *spd_data_len = CONFIG_DIMM_SPD_SIZE; + *spd_data_ptr = spd_cbfs_map(spd_index); + if (!*spd_data_ptr) + die("spd.bin not found or incorrect index\n"); } static void get_spd_data(const struct spd_info *spd_info, uintptr_t *spd_data_ptr,