Skip to content

Commit

Permalink
smbios: fix matching issues for table types
Browse files Browse the repository at this point in the history
commit 738b346 ("smbios: Fallback to the default DT if sysinfo nodes are missing")
allowed the code to fallback and fill in SMBIOS tables with properties
from the compatible and product nodes of the DT, in case the
'smbios,sysinfo' node is missing.
That works fine for Type1/2 tables, but for other types we need to
match the smbios,sysinfo subnode name as well. So add it to the
smbios_ctx and check it during the sysinfo <-> DT mathcing

Signed-off-by: Ilias Apalodimas <[email protected]>
  • Loading branch information
apalos authored and trini committed Jan 19, 2024
1 parent 5e2b472 commit b6488ca
Showing 1 changed file with 28 additions and 17 deletions.
45 changes: 28 additions & 17 deletions lib/smbios.c
Original file line number Diff line number Diff line change
Expand Up @@ -54,32 +54,38 @@ DECLARE_GLOBAL_DATA_PTR;
*
*/
struct map_sysinfo {
const char *si_node;
const char *si_str;
const char *dt_str;
int max;
};

static const struct map_sysinfo sysinfo_to_dt[] = {
{ .si_str = "product", .dt_str = "model", 2 },
{ .si_str = "manufacturer", .dt_str = "compatible", 1 },
{ .si_node = "system", .si_str = "product", .dt_str = "model", 2 },
{ .si_node = "system", .si_str = "manufacturer", .dt_str = "compatible", 1 },
{ .si_node = "baseboard", .si_str = "product", .dt_str = "model", 2 },
{ .si_node = "baseboard", .si_str = "manufacturer", .dt_str = "compatible", 1 },
};

/**
* struct smbios_ctx - context for writing SMBIOS tables
*
* @node: node containing the information to write (ofnode_null() if none)
* @dev: sysinfo device to use (NULL if none)
* @eos: end-of-string pointer for the table being processed. This is set
* up when we start processing a table
* @next_ptr: pointer to the start of the next string to be added. When the
* table is nopt empty, this points to the byte after the \0 of the
* previous string.
* @last_str: points to the last string that was written to the table, or NULL
* if none
* @node: node containing the information to write (ofnode_null()
* if none)
* @dev: sysinfo device to use (NULL if none)
* @subnode_name: sysinfo subnode_name. Used for DT fallback
* @eos: end-of-string pointer for the table being processed.
* This is set up when we start processing a table
* @next_ptr: pointer to the start of the next string to be added.
* When the table is not empty, this points to the byte
* after the \0 of the previous string.
* @last_str: points to the last string that was written to the table,
* or NULL if none
*/
struct smbios_ctx {
ofnode node;
struct udevice *dev;
const char *subnode_name;
char *eos;
char *next_ptr;
char *last_str;
Expand Down Expand Up @@ -108,12 +114,13 @@ struct smbios_write_method {
const char *subnode_name;
};

static const struct map_sysinfo *convert_sysinfo_to_dt(const char *si)
static const struct map_sysinfo *convert_sysinfo_to_dt(const char *node, const char *si)
{
int i;

for (i = 0; i < ARRAY_SIZE(sysinfo_to_dt); i++) {
if (!strcmp(si, sysinfo_to_dt[i].si_str))
if (node && !strcmp(node, sysinfo_to_dt[i].si_node) &&
!strcmp(si, sysinfo_to_dt[i].si_str))
return &sysinfo_to_dt[i];
}

Expand Down Expand Up @@ -233,7 +240,7 @@ static int smbios_add_prop_si(struct smbios_ctx *ctx, const char *prop,
} else {
const struct map_sysinfo *nprop;

nprop = convert_sysinfo_to_dt(prop);
nprop = convert_sysinfo_to_dt(ctx->subnode_name, prop);
get_str_from_dt(nprop, str_dt, sizeof(str_dt));
str = (const char *)str_dt;
}
Expand Down Expand Up @@ -574,9 +581,13 @@ ulong write_smbios_table(ulong addr)
int tmp;

method = &smbios_write_funcs[i];
if (IS_ENABLED(CONFIG_OF_CONTROL) && method->subnode_name)
ctx.node = ofnode_find_subnode(parent_node,
method->subnode_name);
ctx.subnode_name = NULL;
if (method->subnode_name) {
ctx.subnode_name = method->subnode_name;
if (IS_ENABLED(CONFIG_OF_CONTROL))
ctx.node = ofnode_find_subnode(parent_node,
method->subnode_name);
}
tmp = method->write((ulong *)&addr, handle++, &ctx);

max_struct_size = max(max_struct_size, tmp);
Expand Down

0 comments on commit b6488ca

Please sign in to comment.