[PATCH 2/2] smbios: Fallback to the default DT if sysinfo nodes are missing

Ilias Apalodimas ilias.apalodimas at linaro.org
Tue Sep 6 15:44:26 CEST 2022


In order to fill in the SMBIOS tables U-Boot currently relies on a
"u-boot,sysinfo-smbios" compatible node.  This is fine for the boards
that already include such nodes.  However with some recent EFI changes,
the majority of boards can boot up distros, which usually rely on
things like dmidecode etc for their reporting.  For boards that
lack this special node the SMBIOS output looks like:

System Information
        Manufacturer: Unknown
        Product Name: Unknown
        Version: Unknown
        Serial Number: Unknown
        UUID: Not Settable
        Wake-up Type: Reserved
        SKU Number: Unknown
        Family: Unknown

This looks problematic since most of the info are "Unknown".  The DT spec
specifies standard properties containing relevant information like
'model' and 'compatible' for which the suggested format is
<manufacturer,model>.  So let's add a last resort to our current
smbios parsing.  If none of the sysinfo properties are found,  we can
scan the root node for 'model' and 'compatible'.

pre-patch dmidecode:
<snip>
Handle 0x0001, DMI type 1, 27 bytes
System Information
        Manufacturer: Unknown
        Product Name: Unknown
        Version: Unknown
        Serial Number: Unknown
        UUID: Not Settable
        Wake-up Type: Reserved
        SKU Number: Unknown
        Family: Unknown

Handle 0x0002, DMI type 2, 14 bytes
Base Board Information
        Manufacturer: Unknown
        Product Name: Unknown
        Version: Unknown
        Serial Number: Not Specified
        Asset Tag: Unknown
        Features:
                Board is a hosting board
        Location In Chassis: Not Specified
        Chassis Handle: 0x0000
        Type: Motherboard

Handle 0x0003, DMI type 3, 21 bytes
Chassis Information
        Manufacturer: Unknown
        Type: Desktop
        Lock: Not Present
        Version: Not Specified
        Serial Number: Not Specified
        Asset Tag: Not Specified
        Boot-up State: Safe
        Power Supply State: Safe
        Thermal State: Safe
        Security Status: None
        OEM Information: 0x00000000
        Height: Unspecified
        Number Of Power Cords: Unspecified
        Contained Elements: 0
<snip>

post-pastch dmidecode:
<snip>
Handle 0x0001, DMI type 1, 27 bytes
System Information
        Manufacturer: socionext,developer-box
        Product Name: Socionext Developer Box
        Version: Unknown
        Serial Number: Unknown
        UUID: Not Settable
        Wake-up Type: Reserved
        SKU Number: Unknown
        Family: Unknown

Handle 0x0002, DMI type 2, 14 bytes
Base Board Information
        Manufacturer: socionext,developer-box
        Product Name: Socionext Developer Box
        Version: Unknown
        Serial Number: Not Specified
        Asset Tag: Unknown
        Features:
                Board is a hosting board
        Location In Chassis: Not Specified
        Chassis Handle: 0x0000
        Type: Motherboard

Handle 0x0003, DMI type 3, 21 bytes
Chassis Information
        Manufacturer: socionext,developer-box
        Type: Desktop
        Lock: Not Present
        Version: Not Specified
        Serial Number: Not Specified
        Asset Tag: Not Specified
        Boot-up State: Safe
        Power Supply State: Safe
        Thermal State: Safe
        Security Status: None
        OEM Information: 0x00000000
        Height: Unspecified
        Number Of Power Cords: Unspecified
        Contained Elements: 0
<snip>

Signed-off-by: Ilias Apalodimas <ilias.apalodimas at linaro.org>
---
 lib/smbios.c | 41 +++++++++++++++++++++++++++++++++++++++--
 1 file changed, 39 insertions(+), 2 deletions(-)

diff --git a/lib/smbios.c b/lib/smbios.c
index fcc8686993ef..f2eb961f514b 100644
--- a/lib/smbios.c
+++ b/lib/smbios.c
@@ -43,6 +43,20 @@
 
 DECLARE_GLOBAL_DATA_PTR;
 
+/**
+ * struct sysifno_to_dt - Mapping of sysinfo strings to DT
+ *
+ * @sysinfo_str: sysinfo string
+ * @dt_str: DT string
+ */
+static const struct {
+	const char *sysinfo_str;
+	const char *dt_str;
+} sysifno_to_dt[] = {
+	{ .sysinfo_str = "product", .dt_str = "model" },
+	{ .sysinfo_str = "manufacturer", .dt_str = "compatible" },
+};
+
 /**
  * struct smbios_ctx - context for writing SMBIOS tables
  *
@@ -87,6 +101,18 @@ struct smbios_write_method {
 	const char *subnode_name;
 };
 
+static const char *convert_sysinfo_to_dt(const char *sysinfo_str)
+{
+	int i;
+
+	for (i = 0; i < ARRAY_SIZE(sysifno_to_dt); i++) {
+		if (!strcmp(sysinfo_str, sysifno_to_dt[i].sysinfo_str))
+			return sysifno_to_dt[i].dt_str;
+	}
+
+	return NULL;
+}
+
 /**
  * smbios_add_string() - add a string to the string area
  *
@@ -148,9 +174,20 @@ static int smbios_add_prop_si(struct smbios_ctx *ctx, const char *prop,
 			return smbios_add_string(ctx, val);
 	}
 	if (IS_ENABLED(CONFIG_OF_CONTROL)) {
-		const char *str;
+		const char *str = NULL;
 
-		str = ofnode_read_string(ctx->node, prop);
+		/*
+		 * If the node is not valid fallback and try the entire DT
+		 * so we can at least fill in maufacturer and board type
+		 */
+		if (!ofnode_valid(ctx->node)) {
+			const char *nprop = convert_sysinfo_to_dt(prop);
+
+			if (nprop)
+				str = ofnode_read_string(ofnode_root(), nprop);
+		} else {
+			str = ofnode_read_string(ctx->node, prop);
+		}
 		return smbios_add_string(ctx, str);
 	}
 
-- 
2.37.2



More information about the U-Boot mailing list