[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