On Tue, Sep 6, 2022 at 2:44 PM Ilias Apalodimas <[email protected]> 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 <[email protected]> Reviewed-by: Peter Robinson <[email protected]> Tested-by: Peter Robinson <[email protected]> > --- > 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 >

