From 67777b76719eeacfa21c69109d2e5aa8f0c7d908 Mon Sep 17 00:00:00 2001 From: Bora Guvendik Date: Thu, 20 Nov 2025 16:14:14 -0800 Subject: [PATCH] soc/intel/common: Add LPCAMM memory topology support MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add MEM_TOPO_LP5_CAMM topology type to support Low Profile Compression Attached Memory Module (LPCAMM) configurations. LPCAMM is a removable memory module format that provides similar functionality to DIMMs but in a different physical form factor. Update the SPD reading logic to handle both traditional DIMM modules and LPCAMM modules, as both are removable memory types that require SPD detection and initialization. This change enables platforms to properly detect and initialize LPCAMM memory configurations alongside existing DIMM and memory-down support. BUG=none TEST=Build test on Intel platforms Change-Id: I6db2fd76300dd4c96212427d9283b078ca621ed9 Signed-off-by: Bora Guvendik Reviewed-on: https://review.coreboot.org/c/coreboot/+/90140 Tested-by: build bot (Jenkins) Reviewed-by: Jérémy Compostella --- src/soc/intel/common/block/include/intelblocks/meminit.h | 1 + src/soc/intel/common/block/memory/meminit.c | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/soc/intel/common/block/include/intelblocks/meminit.h b/src/soc/intel/common/block/include/intelblocks/meminit.h index 566efa03d9..050e325c1c 100644 --- a/src/soc/intel/common/block/include/intelblocks/meminit.h +++ b/src/soc/intel/common/block/include/intelblocks/meminit.h @@ -24,6 +24,7 @@ enum mem_topology { MEM_TOPO_MEMORY_DOWN = BIT(0), // memory is soldered onto board MEM_TOPO_DIMM_MODULE = BIT(1), // memory is composed of DIMM modules + MEM_TOPO_LP5_CAMM = BIT(2), // memory is composed of LPCAMM modules MEM_TOPO_MIXED = MEM_TOPO_MEMORY_DOWN | MEM_TOPO_DIMM_MODULE, }; diff --git a/src/soc/intel/common/block/memory/meminit.c b/src/soc/intel/common/block/memory/meminit.c index fa80017c50..59c1b2a8bc 100644 --- a/src/soc/intel/common/block/memory/meminit.c +++ b/src/soc/intel/common/block/memory/meminit.c @@ -117,7 +117,7 @@ static bool read_spd_dimm(FSPM_UPD *memupd, const struct soc_mem_cfg *soc_mem_cf */ uint32_t pop_mask = 0; - if (!(info->topo & MEM_TOPO_DIMM_MODULE)) + if (!(info->topo & (MEM_TOPO_DIMM_MODULE | MEM_TOPO_LP5_CAMM))) return false; for (ch = 0; ch < num_phys_ch; ch++) { @@ -212,7 +212,8 @@ void mem_populate_channel_data(FSPM_UPD *memupd, const struct soc_mem_cfg *soc_m if (spd_info->topo == MEM_TOPO_MEMORY_DOWN) { data->spd_len = spd_md_len; - } else if (spd_info->topo == MEM_TOPO_DIMM_MODULE) { + } else if (spd_info->topo == MEM_TOPO_DIMM_MODULE || + spd_info->topo == MEM_TOPO_LP5_CAMM) { data->spd_len = spd_dimm_len; } else { /*