From d5a8cec7487b037fea07b49caac16f08fd0b6415 Mon Sep 17 00:00:00 2001 From: Subrata Banik Date: Thu, 9 Oct 2025 17:27:42 +0530 Subject: [PATCH] soc/intel/meteorlake: Rely on FSP_DIMM_INFO This patch updates the Meteor Lake SoC configuration to select the `FSP_DIMM_INFO` Kconfig option. This change instructs the build system to use the common FSP driver implementation for retrieving and storing DIMM information. As a result, the duplicated, SoC-specific DIMM information retrieval logic is dropped from the Panther Lake SoC code base, centralizing the memory parsing mechanism. TEST=Able to build and boot google/screebo. Verify the memory related information is proper as part of the SMBIOS table. Change-Id: I88fe72b558d2f9af55b585fd20f5f55e15eb465f Signed-off-by: Subrata Banik Reviewed-on: https://review.coreboot.org/c/coreboot/+/89496 Reviewed-by: Kapil Porwal Tested-by: build bot (Jenkins) --- src/soc/intel/meteorlake/Kconfig | 1 + src/soc/intel/meteorlake/romstage/romstage.c | 111 ++----------------- 2 files changed, 8 insertions(+), 104 deletions(-) diff --git a/src/soc/intel/meteorlake/Kconfig b/src/soc/intel/meteorlake/Kconfig index c1c2266973..a0e648a856 100644 --- a/src/soc/intel/meteorlake/Kconfig +++ b/src/soc/intel/meteorlake/Kconfig @@ -18,6 +18,7 @@ config SOC_INTEL_METEORLAKE select DRIVERS_USB_ACPI select EDK2_CPU_TIMER_LIB if PAYLOAD_EDK2 select FSP_COMPRESS_FSP_S_LZ4 + select FSP_DIMM_INFO select FAST_SPI_SUPPORTS_EXT_BIOS_WINDOW select FSP_M_XIP select FSP_UGOP_EARLY_SIGN_OF_LIFE if !SOC_INTEL_METEORLAKE_PRE_PRODUCTION_SILICON && !BOARD_GOOGLE_BASEBOARD_OVIS diff --git a/src/soc/intel/meteorlake/romstage/romstage.c b/src/soc/intel/meteorlake/romstage/romstage.c index 5ceb6d5577..d509ae5147 100644 --- a/src/soc/intel/meteorlake/romstage/romstage.c +++ b/src/soc/intel/meteorlake/romstage/romstage.c @@ -3,121 +3,24 @@ #include #include #include -#include +#include #include #include #include #include #include -#include -#include #include #include #include #include #include -#define FSP_SMBIOS_MEMORY_INFO_GUID \ -{ \ - 0xd4, 0x71, 0x20, 0x9b, 0x54, 0xb0, 0x0c, 0x4e, \ - 0x8d, 0x09, 0x11, 0xcf, 0x8b, 0x9f, 0x03, 0x23 \ -} - -/* Save the DIMM information for SMBIOS table 17 */ -static void save_dimm_info(void) +void platform_fill_dimm_info_args(const DIMM_INFO *src_dimm, + const MEMORY_INFO_DATA_HOB *meminfo_hob, + struct dimm_fill_args *args) { - int node, channel, dimm, dimm_max, index; - size_t hob_size; - const CONTROLLER_INFO *ctrlr_info; - const CHANNEL_INFO *channel_info; - const DIMM_INFO *src_dimm; - struct dimm_info *dest_dimm; - struct memory_info *mem_info; - const MEMORY_INFO_DATA_HOB *meminfo_hob; - const uint8_t smbios_memory_info_guid[sizeof(EFI_GUID)] = FSP_SMBIOS_MEMORY_INFO_GUID; - const uint8_t *serial_num; - const char *dram_part_num = NULL; - size_t dram_part_num_len = 0; - - /* Locate the memory info HOB, presence validated by raminit */ - meminfo_hob = fsp_find_extension_hob_by_guid( - smbios_memory_info_guid, - &hob_size); - if (!meminfo_hob || hob_size == 0) { - printk(BIOS_ERR, "SMBIOS MEMORY_INFO_DATA_HOB not found\n"); - return; - } - - /* - * Allocate CBMEM area for DIMM information used to populate SMBIOS - * table 17 - */ - mem_info = cbmem_add(CBMEM_ID_MEMINFO, sizeof(*mem_info)); - if (!mem_info) { - printk(BIOS_ERR, "CBMEM entry for DIMM info missing\n"); - return; - } - memset(mem_info, 0, sizeof(*mem_info)); - - /* Allow mainboard to override DRAM part number. */ - dram_part_num = mainboard_get_dram_part_num(); - if (dram_part_num) - dram_part_num_len = strlen(dram_part_num); - - /* Save available DIMM information */ - index = 0; - dimm_max = ARRAY_SIZE(mem_info->dimm); - for (node = 0; node < MAX_NODE; node++) { - ctrlr_info = &meminfo_hob->Controller[node]; - for (channel = 0; channel < MAX_CH && index < dimm_max; channel++) { - channel_info = &ctrlr_info->ChannelInfo[channel]; - if (channel_info->Status != CHANNEL_PRESENT) - continue; - - for (dimm = 0; dimm < MAX_DIMM && index < dimm_max; dimm++) { - src_dimm = &channel_info->DimmInfo[dimm]; - dest_dimm = &mem_info->dimm[index]; - if (src_dimm->Status != DIMM_PRESENT) - continue; - - /* If there is no DRAM part number overridden by - * mainboard then use original one. */ - if (!dram_part_num) { - dram_part_num_len = sizeof(src_dimm->ModulePartNum); - dram_part_num = (const char *) - &src_dimm->ModulePartNum[0]; - } - - uint8_t memProfNum = meminfo_hob->MemoryProfile; - serial_num = src_dimm->SpdSave + SPD_SAVE_OFFSET_SERIAL; - - /* Populate the DIMM information */ - dimm_info_fill(dest_dimm, - src_dimm->DimmCapacity, - meminfo_hob->MemoryType, - meminfo_hob->ConfiguredMemoryClockSpeed, - src_dimm->RankInDimm, - channel_info->ChannelId, - src_dimm->DimmId, - dram_part_num, - dram_part_num_len, - serial_num, - meminfo_hob->DataWidth, - meminfo_hob->VddVoltage[memProfNum], - meminfo_hob->EccSupport, - src_dimm->MfgId, - src_dimm->SpdModuleType, - node, - meminfo_hob->MaximumMemoryClockSpeed); - index++; - } - } - } - mem_info->dimm_cnt = index; - if (mem_info->dimm_cnt == 0) - printk(BIOS_ERR, "No DIMMs found\n"); - else - printk(BIOS_DEBUG, "%d DIMMs found\n", mem_info->dimm_cnt); + args->data_width = meminfo_hob->DataWidth; + args->mfg_id_arg = src_dimm->MfgId; } void mainboard_romstage_entry(void) @@ -154,5 +57,5 @@ void mainboard_romstage_entry(void) fsp_memory_init(s3wake); pmc_set_disb(); if (!s3wake) - save_dimm_info(); + fsp_save_dimm_info(); }