summaryrefslogtreecommitdiff
path: root/cmd
diff options
context:
space:
mode:
authorRaymond Mao <[email protected]>2026-02-13 17:52:48 -0500
committerTom Rini <[email protected]>2026-02-18 08:27:51 -0600
commit374896158b435843d8ecf2c04c9985b0321295e0 (patch)
tree7dadbe3d74e4fbcc11f8ff4da380d3df19fbf1a3 /cmd
parent83b28b55d74f884a30c47238dc8bdf9fbe6e495c (diff)
smbios: add support for dynamic generation of Type 16 table
This commit implements SMBIOS Type 16 (Physical Memory Array) generation with a hybrid approach supporting both: 1. Explicit definition via Device Tree 'smbios' node: Child node under '/smbios/smbios/memory-array' will be used to populate as individual Type 16 structure directly. - Properties follow SMBIOS field names with lowercase letters and hyphen-separated words (e.g., 'memory-error-correction', 'maximum-capacity', 'extended-maximum-capacity', etc.). - This method supports precise platform-defined overrides and system descriptions. 2. Fallback to automatic DT-based discovery: If child node under '/smbios/smbios/memory-array' does not exist, the implementation will: - Scan all top-level 'memory@' nodes to populate Type 16 structure with inferred size and location data. - Scan nodes named or marked as 'memory-controller' and parse associated 'dimm@' subnodes (if present) to extract DIMM sizes and map them accordingly. This dual-mode support enables flexible firmware SMBIOS reporting while aligning with spec-compliant naming and runtime-detected memory topology. Type 16 support is under GENERATE_SMBIOS_TABLE_VERBOSE to avoid increasing rom size for those platforms which only require basic SMBIOS support. Signed-off-by: Raymond Mao <[email protected]> Tested-by: Ilias Apalodimas <[email protected]>
Diffstat (limited to 'cmd')
-rw-r--r--cmd/smbios.c46
1 files changed, 46 insertions, 0 deletions
diff --git a/cmd/smbios.c b/cmd/smbios.c
index f9b62e66229..3f7dd21f92e 100644
--- a/cmd/smbios.c
+++ b/cmd/smbios.c
@@ -168,6 +168,32 @@ static const struct str_lookup_table slot_length_strings[] = {
{ SMBIOS_SYSSLOT_LENG_3_5INDRV, "3.5 inch drive form factor" },
};
+static const struct str_lookup_table ma_location_strings[] = {
+ { SMBIOS_MA_LOCATION_OTHER, "Other" },
+ { SMBIOS_MA_LOCATION_UNKNOWN, "Unknown" },
+ { SMBIOS_MA_LOCATION_MOTHERBOARD, "System board or motherboard" },
+};
+
+static const struct str_lookup_table ma_use_strings[] = {
+ { SMBIOS_MA_USE_OTHER, "Other" },
+ { SMBIOS_MA_USE_UNKNOWN, "Unknown" },
+ { SMBIOS_MA_USE_SYSTEM, "System memory" },
+ { SMBIOS_MA_USE_VIDEO, "Video memory" },
+ { SMBIOS_MA_USE_FLASH, "Flash memory" },
+ { SMBIOS_MA_USE_NVRAM, "Non-volatile RAM" },
+ { SMBIOS_MA_USE_CACHE, "Cache memory" },
+};
+
+static const struct str_lookup_table ma_err_corr_strings[] = {
+ { SMBIOS_MA_ERRCORR_OTHER, "Other" },
+ { SMBIOS_MA_ERRCORR_UNKNOWN, "Unknown" },
+ { SMBIOS_MA_ERRCORR_NONE, "None" },
+ { SMBIOS_MA_ERRCORR_PARITY, "Parity" },
+ { SMBIOS_MA_ERRCORR_SBITECC, "Single-bit ECC" },
+ { SMBIOS_MA_ERRCORR_MBITECC, "Multi-bit ECC" },
+ { SMBIOS_MA_ERRCORR_CRC, "CRC" },
+};
+
/**
* smbios_get_string() - get SMBIOS string from table
*
@@ -514,6 +540,23 @@ static void smbios_print_type9(struct smbios_type9 *table)
printf("\tSlot Height: 0x%04x\n", *addr);
}
+static void smbios_print_type16(struct smbios_type16 *table)
+{
+ printf("Physical Memory Array:\n");
+ smbios_print_lookup_str(ma_location_strings, table->location,
+ ARRAY_SIZE(ma_location_strings), "Location");
+ smbios_print_lookup_str(ma_use_strings, table->use,
+ ARRAY_SIZE(ma_use_strings), "Use");
+ smbios_print_lookup_str(ma_err_corr_strings, table->mem_err_corr,
+ ARRAY_SIZE(ma_err_corr_strings),
+ "Memory Error Correction");
+ printf("\tMaximum Capacity: 0x%08x\n", table->max_cap);
+ printf("\tMemory Error Information Handle: 0x%04x\n",
+ table->mem_err_info_hdl);
+ printf("\tNumber of Memory Devices: 0x%04x\n", table->num_of_mem_dev);
+ printf("\tExtended Maximum Capacity: 0x%016llx\n", table->ext_max_cap);
+}
+
static void smbios_print_type127(struct smbios_type127 *table)
{
printf("End Of Table\n");
@@ -596,6 +639,9 @@ static int do_smbios(struct cmd_tbl *cmdtp, int flag, int argc,
case SMBIOS_SYSTEM_SLOTS:
smbios_print_type9((struct smbios_type9 *)pos);
break;
+ case SMBIOS_PHYS_MEMORY_ARRAY:
+ smbios_print_type16((struct smbios_type16 *)pos);
+ break;
case SMBIOS_END_OF_TABLE:
smbios_print_type127((struct smbios_type127 *)pos);
break;