void mainboard_romstage_entry(struct romstage_params *rp) { struct cbfs_file *spd_file; void *spd_content; int dual_channel = 0; struct mrc_params mp = { .mainboard = { .dram_type = DRAM_DDR3L, .dram_info_location = DRAM_INFO_SPD_MEM, .weaker_odt_settings = 1, }, }; spd_file = cbfs_get_file(CBFS_DEFAULT_MEDIA, "spd.bin"); if (!spd_file) die("SPD data not found."); spd_content = get_spd_pointer(CBFS_SUBHEADER(spd_file), ntohl(spd_file->len) / SPD_SIZE, &dual_channel); mp.mainboard.dram_data[0] = spd_content; if (dual_channel) mp.mainboard.dram_data[1] = spd_content; rp->mrc_params = ∓ romstage_common(rp); }
void mainboard_romstage_entry(struct romstage_params *rp) { void *spd_content; int dual_channel = 0; void *spd_file; size_t spd_fsize; struct mrc_params mp = { .mainboard = { .dram_type = DRAM_DDR3L, .dram_info_location = DRAM_INFO_SPD_MEM, .weaker_odt_settings = 1, }, }; spd_file = cbfs_boot_map_with_leak("spd.bin", CBFS_TYPE_SPD, &spd_fsize); if (!spd_file) die("SPD data not found."); /* Both channels are always present. */ spd_content = get_spd_pointer(spd_file, spd_fsize / SPD_SIZE, &dual_channel); mp.mainboard.dram_data[0] = spd_content; if (dual_channel) mp.mainboard.dram_data[1] = spd_content; rp->mrc_params = ∓ romstage_common(rp); }
/* Copy SPD data for on-board memory */ void mainboard_fill_spd_data(struct pei_data *ps) { char *spd_file; size_t spd_file_len; void *spd_content; int dual_channel = 0; /* Find the SPD data in CBFS. */ spd_file = cbfs_boot_map_with_leak("spd.bin", CBFS_TYPE_SPD, &spd_file_len); if (!spd_file) die("SPD data not found."); if (spd_file_len < SPD_PAGE_LEN) die("Missing SPD data."); /* * Both channels are always present in SPD data. Always use matched * DIMMs so use the same SPD data for each DIMM. */ spd_content = get_spd_pointer(spd_file, spd_file_len / SPD_PAGE_LEN, &dual_channel); if (IS_ENABLED(CONFIG_DISPLAY_SPD_DATA) && spd_content != NULL) { printk(BIOS_DEBUG, "SPD Data:\n"); hexdump(spd_content, SPD_PAGE_LEN); printk(BIOS_DEBUG, "\n"); } /* * Set SPD and memory configuration: * Memory type: 0=DimmInstalled, * 1=SolderDownMemory, * 2=DimmDisabled */ if (spd_content != NULL) { ps->spd_data_ch0 = spd_content; ps->spd_ch0_config = 1; printk(BIOS_DEBUG, "Channel 0 DIMM soldered down\n"); if (dual_channel) { printk(BIOS_DEBUG, "Channel 1 DIMM soldered down\n"); ps->spd_data_ch1 = spd_content; ps->spd_ch1_config = 1; } else { printk(BIOS_DEBUG, "Channel 1 DIMM not installed\n"); ps->spd_ch1_config = 2; } } }