From c109fc92ff24602e1dd26de92c99c6f059cabc6b Mon Sep 17 00:00:00 2001 From: Jakub Czapiga Date: Tue, 9 Dec 2025 10:18:38 +0000 Subject: [PATCH] libpayload: Add API to get physical memory size sysinfo contains both CBMEM_ID_MEMINFO and CBMEM_ID_MEM_CHIP. This new function allows to easily retrieve the amount of memory the system has based on the mentioned CBMEM entries structures. BUG=b:450374306 TEST=Checked on Google/Brya/Omnigul (x86) - MEMINFO TEST=Checked on Google/Rauru/Navi (ARM64) - MEM_CHIP Change-Id: Iaf69c54dfb3d2eaffbccacee8bee3be425b78a3f Signed-off-by: Jakub Czapiga Reviewed-on: https://review.coreboot.org/c/coreboot/+/90430 Reviewed-by: Julius Werner Reviewed-by: Yu-Ping Wu Tested-by: build bot (Jenkins) --- payloads/libpayload/include/libpayload.h | 9 +++++++++ payloads/libpayload/libc/sysinfo.c | 20 ++++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/payloads/libpayload/include/libpayload.h b/payloads/libpayload/include/libpayload.h index 09bd4be69c..86429144ec 100644 --- a/payloads/libpayload/include/libpayload.h +++ b/payloads/libpayload/include/libpayload.h @@ -493,6 +493,15 @@ u8 *sha1(const u8 *data, size_t len, u8 *buf); */ int sysinfo_have_multiboot(unsigned long *addr); + +/** + * Check CBMEM_ID_MEM_CHIP and CBMEM_ID_MEMINFO, extract physical memory size + * present in the system. + * + * @returns physical memory detected in the system or zero in case of failure + */ +size_t sysinfo_get_physical_memory_size_mib(void); + /** @} */ /** diff --git a/payloads/libpayload/libc/sysinfo.c b/payloads/libpayload/libc/sysinfo.c index cb063fc6f7..e2fa84190c 100644 --- a/payloads/libpayload/libc/sysinfo.c +++ b/payloads/libpayload/libc/sysinfo.c @@ -34,3 +34,23 @@ int sysinfo_have_multiboot(unsigned long *addr) *addr = (unsigned long) lib_sysinfo.mbtable; return (lib_sysinfo.mbtable == 0) ? 0 : 1; } + +size_t sysinfo_get_physical_memory_size_mib(void) +{ + const struct mem_chip_info *mc = phys_to_virt(lib_sysinfo.mem_chip_base); + + if (mc) + return mem_chip_info_total_density_bytes(mc) / MiB; + +#if CONFIG(LP_GPL) + const struct memory_info *memory_info = phys_to_virt(lib_sysinfo.memory_info); + size_t memory_size_mib = 0; + if (memory_info) { + for (int i = 0; i < memory_info->dimm_cnt; ++i) + memory_size_mib += memory_info->dimm[i].dimm_size; + return memory_size_mib; + } +#endif + + return 0; +}