[PATCH 2/2] smbios: Fallback to the default DT if sysinfo nodes are missing
Peter Robinson
pbrobinson at gmail.com
Tue Sep 20 13:10:29 CEST 2022
On Tue, Sep 6, 2022 at 2:44 PM Ilias Apalodimas
<ilias.apalodimas at linaro.org> wrote:
>
> 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'.
I don't think the information below all needs to go in the commit,
maybe in the cover letter?
> 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>
Reviewed-by: Peter Robinson <pbrobinson at gmail.com>
Tested-by: Peter Robinson <pbrobinson at gmail.com>
> ---
> 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