- introduces some standard sysinfo options as a source, e.g. to read
  strapping pins to determine the board revision
- allows the U-Boot version number to be included
- allows the version number to be provided programmatically, e.g. to
  support the build system adding information after U-Boot is built
This commit is contained in:
Tom Rini 2021-02-06 09:45:58 -05:00
commit 3936fd9986
8 changed files with 328 additions and 76 deletions

View File

@ -1853,9 +1853,13 @@ prepare: prepare0
# Generate some files
# ---------------------------------------------------------------------------
# Use sed to remove leading zeros from PATCHLEVEL to avoid using octal numbers
define filechk_version.h
(echo \#define PLAIN_VERSION \"$(UBOOTRELEASE)\"; \
echo \#define U_BOOT_VERSION \"U-Boot \" PLAIN_VERSION; \
echo \#define U_BOOT_VERSION_NUM $(VERSION); \
echo \#define U_BOOT_VERSION_NUM_PATCH $$(echo $(PATCHLEVEL) | \
sed -e "s/^0*//"); \
echo \#define CC_VERSION_STRING \"$$(LC_ALL=C $(CC) --version | head -n 1)\"; \
echo \#define LD_VERSION_STRING \"$$(LC_ALL=C $(LD) --version | head -n 1)\"; )
endef

View File

@ -8,6 +8,7 @@
#include <command.h>
#include <dm.h>
#include <log.h>
#include <sysinfo.h>
#include <acpi/acpigen.h>
#include <asm-generic/gpio.h>
#include <asm/acpi_nhlt.h>
@ -143,6 +144,9 @@ struct acpi_ops coral_acpi_ops = {
.inject_dsdt = chromeos_acpi_gpio_generate,
};
struct sysinfo_ops coral_sysinfo_ops = {
};
#if !CONFIG_IS_ENABLED(OF_PLATDATA)
static const struct udevice_id coral_ids[] = {
{ .compatible = "google,coral" },
@ -154,5 +158,6 @@ U_BOOT_DRIVER(coral_drv) = {
.name = "coral",
.id = UCLASS_SYSINFO,
.of_match = of_match_ptr(coral_ids),
.ops = &coral_sysinfo_ops,
ACPI_OPS_PTR(&coral_acpi_ops)
};

View File

@ -13,6 +13,7 @@ Implementation
global_data
logging
menus
version
Debugging
---------

101
doc/develop/version.rst Normal file
View File

@ -0,0 +1,101 @@
.. SPDX-License-Identifier: GPL-2.0+
.. Copyright (c) 2013 The Chromium OS Authors.
Version information
===================
U-Boot releases are named by year and patch level, for example 2020.10 means the
release that came out in October 2020. Release candidates are tagged every few
weeks as the project heads to the next release. So 2020.10-rc1 was the first
release candidate (RC), tagged soon after 2020.07 was released.
See https://www.denx.de/wiki/view/U-Boot/ReleaseCycle for full details.
Within the build system, various Makefile variables are created, making use of
VERSION, PATCHLEVEL and EXTRAVERSION defined at the top of 'Makefile'. There is
also SUBLEVEL available for downstream use. See also CONFIG_IDENT_STRING.
Some variables end up in a generated header file at
include/generated/version_autogenerated.h and can be accessed from C source by
including <version.h>
The following are available:
UBOOTRELEASE (Makefile)
Full release version as a string. If this is not a tagged release, it also
includes the number of commits since the last tag as well as the the git
hash. If there are uncommitted changes a '-dirty' suffix is added too.
This is written by scripts/setlocalversion (maintained by Linux) to
include/config/uboot.release and ends up in the UBOOTRELEASE Makefile
variable.
Examples::
2020.10-rc3
2021.01-rc5-00248-g60dd854f3ba-dirty
PLAIN_VERSION (string #define)
This is UBOOTRELEASE but available in C source.
Examples::
2020.10
2021.01-rc5-00248-g60dd854f3ba-dirty
UBOOTVERSION (Makefile)
This holds just the first three components of UBOOTRELEASE (i.e. not the
git hash, etc.)
Examples::
2020.10
2021.01-rc5
U_BOOT_VERSION (string #define)
"U-Boot " followed by UBOOTRELEASE, for example::
U-Boot 2020.10
U-Boot 2021.01-rc5
This is used as part of the banner string when U-Boot starts.
U_BOOT_VERSION_STRING (string #define)
U_BOOT_VERSION followed by build-time information
and CONFIG_IDENT_STRING.
Examples::
U-Boot 2020.10 (Jan 06 2021 - 08:50:36 -0700)
U-Boot 2021.01-rc5-00248-g60dd854f3ba-dirty (Jan 06 2021 - 08:50:36 -0700) for spring
U_BOOT_VERSION_NUM (integer #define)
Release year, e.g. 2021 for release 2021.01. Note
this is an integer, not a string.
U_BOOT_VERSION_NUM_PATCH (integer #define)
Patch number, e.g. 1 for release 2020.01. Note
this is an integer, not a string.
Build date/time is also included. See the generated file
include/generated/timestamp_autogenerated.h for the available
fields. For example::
#define U_BOOT_DATE "Jan 06 2021" (US format only)
#define U_BOOT_TIME "08:50:36" (24-hour clock)
#define U_BOOT_TZ "-0700" (Time zone in hours)
#define U_BOOT_DMI_DATE "01/06/2021" (US format only)
#define U_BOOT_BUILD_DATE 0x20210106 (hex yyyymmdd format)
#define U_BOOT_EPOCH 1609948236
The Epoch is the number of seconds since midnight on 1/1/70. You can convert
this to a time with::
$ date -u -d @1609948236
Wed 06 Jan 2021 03:50:36 PM UTC
$ date -d 'Wed 06 Jan 2021 03:50:36 PM UTC' +%s
1609948236
Every time you build U-Boot this will update based on the time
on your build machine. See 'Reproducible builds' if you want to
avoid that.

View File

@ -447,6 +447,12 @@ struct global_data {
*/
struct acpi_ctx *acpi_ctx;
#endif
#if CONFIG_IS_ENABLED(GENERATE_SMBIOS_TABLE)
/**
* @smbios_version: Points to SMBIOS type 0 version
*/
char *smbios_version;
#endif
};
/**

View File

@ -183,14 +183,14 @@ struct __packed smbios_type32 {
u16 handle;
u8 reserved[6];
u8 boot_status;
u8 eos[SMBIOS_STRUCT_EOS_BYTES];
char eos[SMBIOS_STRUCT_EOS_BYTES];
};
struct __packed smbios_type127 {
u8 type;
u8 length;
u16 handle;
u8 eos[SMBIOS_STRUCT_EOS_BYTES];
char eos[SMBIOS_STRUCT_EOS_BYTES];
};
struct __packed smbios_header {
@ -219,16 +219,6 @@ static inline void fill_smbios_header(void *table, int type,
header->handle = handle;
}
/**
* Function prototype to write a specific type of SMBIOS structure
*
* @addr: start address to write the structure
* @handle: the structure's handle, a unique 16-bit number
* @node: node containing the information to write (ofnode_null() if none)
* @return: size of the structure
*/
typedef int (*smbios_write_type)(ulong *addr, int handle, ofnode node);
/**
* write_smbios_table() - Write SMBIOS table
*
@ -267,4 +257,16 @@ const struct smbios_header *smbios_header(const struct smbios_entry *entry, int
*/
const char *smbios_string(const struct smbios_header *header, int index);
/**
* smbios_update_version() - Update the version string
*
* This can be called after the SMBIOS tables are written (e.g. after the U-Boot
* main loop has started) to update the BIOS version string (SMBIOS table 0).
*
* @version: New version string to use
* @return 0 if OK, -ENOENT if no version string was previously written,
* -ENOSPC if the new string is too large to fit
*/
int smbios_update_version(const char *version);
#endif /* _SMBIOS_H_ */

View File

@ -31,7 +31,17 @@
* to read the serial number.
*/
#if CONFIG_IS_ENABLED(SYSINFO)
/** enum sysinfo_id - Standard IDs defined by U-Boot */
enum sysinfo_id {
SYSINFO_ID_NONE,
SYSINFO_ID_SMBIOS_SYSTEM_VERSION,
SYSINFO_ID_SMBIOS_BASEBOARD_VERSION,
/* First value available for downstream/board used */
SYSINFO_ID_USER = 0x1000,
};
struct sysinfo_ops {
/**
* detect() - Run the hardware info detection procedure for this
@ -102,6 +112,7 @@ struct sysinfo_ops {
#define sysinfo_get_ops(dev) ((struct sysinfo_ops *)(dev)->driver->ops)
#if CONFIG_IS_ENABLED(SYSINFO)
/**
* sysinfo_detect() - Run the hardware info detection procedure for this device.
*

View File

@ -10,6 +10,7 @@
#include <env.h>
#include <mapmem.h>
#include <smbios.h>
#include <sysinfo.h>
#include <tables_csum.h>
#include <version.h>
#ifdef CONFIG_CPU
@ -17,6 +18,44 @@
#include <dm/uclass-internal.h>
#endif
DECLARE_GLOBAL_DATA_PTR;
enum {
SMBIOS_STR_MAX = 64, /* Maximum length allowed for a string */
};
/**
* 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
*/
struct smbios_ctx {
ofnode node;
struct udevice *dev;
char *eos;
char *next_ptr;
char *last_str;
};
/**
* Function prototype to write a specific type of SMBIOS structure
*
* @addr: start address to write the structure
* @handle: the structure's handle, a unique 16-bit number
* @ctx: context for writing the tables
* @return: size of the structure
*/
typedef int (*smbios_write_type)(ulong *addr, int handle,
struct smbios_ctx *ctx);
/**
* struct smbios_write_method - Information about a table-writing function
*
@ -35,29 +74,34 @@ struct smbios_write_method {
* This adds a string to the string area which is appended directly after
* the formatted portion of an SMBIOS structure.
*
* @start: string area start address
* @ctx: SMBIOS context
* @str: string to add
* @return: string number in the string area (1 or more)
*/
static int smbios_add_string(char *start, const char *str)
static int smbios_add_string(struct smbios_ctx *ctx, const char *str)
{
int i = 1;
char *p = start;
char *p = ctx->eos;
if (!*str)
str = "Unknown";
for (;;) {
if (!*p) {
ctx->last_str = p;
strcpy(p, str);
p += strlen(str);
*p++ = '\0';
ctx->next_ptr = p;
*p++ = '\0';
return i;
}
if (!strcmp(p, str))
if (!strcmp(p, str)) {
ctx->last_str = p;
return i;
}
p += strlen(p) + 1;
i++;
@ -65,50 +109,98 @@ static int smbios_add_string(char *start, const char *str)
}
/**
* smbios_add_prop() - Add a property from the device tree
* smbios_add_prop_si() - Add a property from the devicetree or sysinfo
*
* @start: string area start address
* @node: node containing the information to write (ofnode_null() if none)
* Sysinfo is used if available, with a fallback to devicetree
*
* @ctx: context for writing the tables
* @prop: property to write
* @return 0 if not found, else SMBIOS string number (1 or more)
*/
static int smbios_add_prop(char *start, ofnode node, const char *prop)
static int smbios_add_prop_si(struct smbios_ctx *ctx, const char *prop,
int sysinfo_id)
{
if (sysinfo_id && ctx->dev) {
char val[SMBIOS_STR_MAX];
int ret;
ret = sysinfo_get_str(ctx->dev, sysinfo_id, sizeof(val), val);
if (!ret)
return smbios_add_string(ctx, val);
}
if (IS_ENABLED(CONFIG_OF_CONTROL)) {
const char *str;
str = ofnode_read_string(node, prop);
str = ofnode_read_string(ctx->node, prop);
if (str)
return smbios_add_string(start, str);
return smbios_add_string(ctx, str);
}
return 0;
}
/**
* smbios_add_prop() - Add a property from the devicetree
*
* @prop: property to write
* @return 0 if not found, else SMBIOS string number (1 or more)
*/
static int smbios_add_prop(struct smbios_ctx *ctx, const char *prop)
{
return smbios_add_prop_si(ctx, prop, SYSINFO_ID_NONE);
}
static void smbios_set_eos(struct smbios_ctx *ctx, char *eos)
{
ctx->eos = eos;
ctx->next_ptr = eos;
ctx->last_str = NULL;
}
int smbios_update_version(const char *version)
{
char *ptr = gd->smbios_version;
uint old_len, len;
if (!ptr)
return log_ret(-ENOENT);
/*
* This string is supposed to have at least enough bytes and is
* padded with spaces. Update it, taking care not to move the
* \0 terminator, so that other strings in the string table
* are not disturbed. See smbios_add_string()
*/
old_len = strnlen(ptr, SMBIOS_STR_MAX);
len = strnlen(version, SMBIOS_STR_MAX);
if (len > old_len)
return log_ret(-ENOSPC);
log_debug("Replacing SMBIOS type 0 version string '%s'\n", ptr);
memcpy(ptr, version, len);
#ifdef LOG_DEBUG
print_buffer((ulong)ptr, ptr, 1, old_len + 1, 0);
#endif
return 0;
}
/**
* smbios_string_table_len() - compute the string area size
*
* This computes the size of the string area including the string terminator.
*
* @start: string area start address
* @ctx: SMBIOS context
* @return: string area size
*/
static int smbios_string_table_len(char *start)
static int smbios_string_table_len(const struct smbios_ctx *ctx)
{
char *p = start;
int i, len = 0;
while (*p) {
i = strlen(p) + 1;
p += i;
len += i;
}
return len + 1;
/* Allow for the final \0 after all strings */
return (ctx->next_ptr + 1) - ctx->eos;
}
static int smbios_write_type0(ulong *current, int handle, ofnode node)
static int smbios_write_type0(ulong *current, int handle,
struct smbios_ctx *ctx)
{
struct smbios_type0 *t;
int len = sizeof(struct smbios_type0);
@ -116,9 +208,21 @@ static int smbios_write_type0(ulong *current, int handle, ofnode node)
t = map_sysmem(*current, len);
memset(t, 0, sizeof(struct smbios_type0));
fill_smbios_header(t, SMBIOS_BIOS_INFORMATION, len, handle);
t->vendor = smbios_add_string(t->eos, "U-Boot");
t->bios_ver = smbios_add_string(t->eos, PLAIN_VERSION);
t->bios_release_date = smbios_add_string(t->eos, U_BOOT_DMI_DATE);
smbios_set_eos(ctx, t->eos);
t->vendor = smbios_add_string(ctx, "U-Boot");
t->bios_ver = smbios_add_prop(ctx, "version");
if (!t->bios_ver)
t->bios_ver = smbios_add_string(ctx, PLAIN_VERSION);
if (t->bios_ver)
gd->smbios_version = ctx->last_str;
log_debug("smbios_version = %p: '%s'\n", gd->smbios_version,
gd->smbios_version);
#ifdef LOG_DEBUG
print_buffer((ulong)gd->smbios_version, gd->smbios_version,
1, strlen(gd->smbios_version) + 1, 0);
#endif
t->bios_release_date = smbios_add_string(ctx, U_BOOT_DMI_DATE);
#ifdef CONFIG_ROM_SIZE
t->bios_rom_size = (CONFIG_ROM_SIZE / 65536) - 1;
#endif
@ -133,19 +237,21 @@ static int smbios_write_type0(ulong *current, int handle, ofnode node)
#endif
t->bios_characteristics_ext2 = BIOS_CHARACTERISTICS_EXT2_TARGET;
t->bios_major_release = 0xff;
t->bios_minor_release = 0xff;
/* bios_major_release has only one byte, so drop century */
t->bios_major_release = U_BOOT_VERSION_NUM % 100;
t->bios_minor_release = U_BOOT_VERSION_NUM_PATCH;
t->ec_major_release = 0xff;
t->ec_minor_release = 0xff;
len = t->length + smbios_string_table_len(t->eos);
len = t->length + smbios_string_table_len(ctx);
*current += len;
unmap_sysmem(t);
return len;
}
static int smbios_write_type1(ulong *current, int handle, ofnode node)
static int smbios_write_type1(ulong *current, int handle,
struct smbios_ctx *ctx)
{
struct smbios_type1 *t;
int len = sizeof(struct smbios_type1);
@ -154,26 +260,29 @@ static int smbios_write_type1(ulong *current, int handle, ofnode node)
t = map_sysmem(*current, len);
memset(t, 0, sizeof(struct smbios_type1));
fill_smbios_header(t, SMBIOS_SYSTEM_INFORMATION, len, handle);
t->manufacturer = smbios_add_prop(t->eos, node, "manufacturer");
t->product_name = smbios_add_prop(t->eos, node, "product");
t->version = smbios_add_prop(t->eos, node, "version");
smbios_set_eos(ctx, t->eos);
t->manufacturer = smbios_add_prop(ctx, "manufacturer");
t->product_name = smbios_add_prop(ctx, "product");
t->version = smbios_add_prop_si(ctx, "version",
SYSINFO_ID_SMBIOS_SYSTEM_VERSION);
if (serial_str) {
t->serial_number = smbios_add_string(t->eos, serial_str);
t->serial_number = smbios_add_string(ctx, serial_str);
strncpy((char *)t->uuid, serial_str, sizeof(t->uuid));
} else {
t->serial_number = smbios_add_prop(t->eos, node, "serial");
t->serial_number = smbios_add_prop(ctx, "serial");
}
t->sku_number = smbios_add_prop(t->eos, node, "sku");
t->family = smbios_add_prop(t->eos, node, "family");
t->sku_number = smbios_add_prop(ctx, "sku");
t->family = smbios_add_prop(ctx, "family");
len = t->length + smbios_string_table_len(t->eos);
len = t->length + smbios_string_table_len(ctx);
*current += len;
unmap_sysmem(t);
return len;
}
static int smbios_write_type2(ulong *current, int handle, ofnode node)
static int smbios_write_type2(ulong *current, int handle,
struct smbios_ctx *ctx)
{
struct smbios_type2 *t;
int len = sizeof(struct smbios_type2);
@ -181,20 +290,24 @@ static int smbios_write_type2(ulong *current, int handle, ofnode node)
t = map_sysmem(*current, len);
memset(t, 0, sizeof(struct smbios_type2));
fill_smbios_header(t, SMBIOS_BOARD_INFORMATION, len, handle);
t->manufacturer = smbios_add_prop(t->eos, node, "manufacturer");
t->product_name = smbios_add_prop(t->eos, node, "product");
t->asset_tag_number = smbios_add_prop(t->eos, node, "asset-tag");
smbios_set_eos(ctx, t->eos);
t->manufacturer = smbios_add_prop(ctx, "manufacturer");
t->product_name = smbios_add_prop(ctx, "product");
t->version = smbios_add_prop_si(ctx, "version",
SYSINFO_ID_SMBIOS_BASEBOARD_VERSION);
t->asset_tag_number = smbios_add_prop(ctx, "asset-tag");
t->feature_flags = SMBIOS_BOARD_FEATURE_HOSTING;
t->board_type = SMBIOS_BOARD_MOTHERBOARD;
len = t->length + smbios_string_table_len(t->eos);
len = t->length + smbios_string_table_len(ctx);
*current += len;
unmap_sysmem(t);
return len;
}
static int smbios_write_type3(ulong *current, int handle, ofnode node)
static int smbios_write_type3(ulong *current, int handle,
struct smbios_ctx *ctx)
{
struct smbios_type3 *t;
int len = sizeof(struct smbios_type3);
@ -202,21 +315,23 @@ static int smbios_write_type3(ulong *current, int handle, ofnode node)
t = map_sysmem(*current, len);
memset(t, 0, sizeof(struct smbios_type3));
fill_smbios_header(t, SMBIOS_SYSTEM_ENCLOSURE, len, handle);
t->manufacturer = smbios_add_prop(t->eos, node, "manufacturer");
smbios_set_eos(ctx, t->eos);
t->manufacturer = smbios_add_prop(ctx, "manufacturer");
t->chassis_type = SMBIOS_ENCLOSURE_DESKTOP;
t->bootup_state = SMBIOS_STATE_SAFE;
t->power_supply_state = SMBIOS_STATE_SAFE;
t->thermal_state = SMBIOS_STATE_SAFE;
t->security_status = SMBIOS_SECURITY_NONE;
len = t->length + smbios_string_table_len(t->eos);
len = t->length + smbios_string_table_len(ctx);
*current += len;
unmap_sysmem(t);
return len;
}
static void smbios_write_type4_dm(struct smbios_type4 *t, ofnode node)
static void smbios_write_type4_dm(struct smbios_type4 *t,
struct smbios_ctx *ctx)
{
u16 processor_family = SMBIOS_PROCESSOR_FAMILY_UNKNOWN;
const char *vendor = "Unknown";
@ -244,11 +359,12 @@ static void smbios_write_type4_dm(struct smbios_type4 *t, ofnode node)
#endif
t->processor_family = processor_family;
t->processor_manufacturer = smbios_add_string(t->eos, vendor);
t->processor_version = smbios_add_string(t->eos, name);
t->processor_manufacturer = smbios_add_string(ctx, vendor);
t->processor_version = smbios_add_string(ctx, name);
}
static int smbios_write_type4(ulong *current, int handle, ofnode node)
static int smbios_write_type4(ulong *current, int handle,
struct smbios_ctx *ctx)
{
struct smbios_type4 *t;
int len = sizeof(struct smbios_type4);
@ -256,8 +372,9 @@ static int smbios_write_type4(ulong *current, int handle, ofnode node)
t = map_sysmem(*current, len);
memset(t, 0, sizeof(struct smbios_type4));
fill_smbios_header(t, SMBIOS_PROCESSOR_INFORMATION, len, handle);
smbios_set_eos(ctx, t->eos);
t->processor_type = SMBIOS_PROCESSOR_TYPE_CENTRAL;
smbios_write_type4_dm(t, node);
smbios_write_type4_dm(t, ctx);
t->status = SMBIOS_PROCESSOR_STATUS_ENABLED;
t->processor_upgrade = SMBIOS_PROCESSOR_UPGRADE_NONE;
t->l1_cache_handle = 0xffff;
@ -265,14 +382,15 @@ static int smbios_write_type4(ulong *current, int handle, ofnode node)
t->l3_cache_handle = 0xffff;
t->processor_family2 = t->processor_family;
len = t->length + smbios_string_table_len(t->eos);
len = t->length + smbios_string_table_len(ctx);
*current += len;
unmap_sysmem(t);
return len;
}
static int smbios_write_type32(ulong *current, int handle, ofnode node)
static int smbios_write_type32(ulong *current, int handle,
struct smbios_ctx *ctx)
{
struct smbios_type32 *t;
int len = sizeof(struct smbios_type32);
@ -280,6 +398,7 @@ static int smbios_write_type32(ulong *current, int handle, ofnode node)
t = map_sysmem(*current, len);
memset(t, 0, sizeof(struct smbios_type32));
fill_smbios_header(t, SMBIOS_SYSTEM_BOOT_INFORMATION, len, handle);
smbios_set_eos(ctx, t->eos);
*current += len;
unmap_sysmem(t);
@ -287,7 +406,8 @@ static int smbios_write_type32(ulong *current, int handle, ofnode node)
return len;
}
static int smbios_write_type127(ulong *current, int handle, ofnode node)
static int smbios_write_type127(ulong *current, int handle,
struct smbios_ctx *ctx)
{
struct smbios_type127 *t;
int len = sizeof(struct smbios_type127);
@ -303,7 +423,7 @@ static int smbios_write_type127(ulong *current, int handle, ofnode node)
}
static struct smbios_write_method smbios_write_funcs[] = {
{ smbios_write_type0, },
{ smbios_write_type0, "bios", },
{ smbios_write_type1, "system", },
{ smbios_write_type2, "baseboard", },
{ smbios_write_type3, "chassis", },
@ -316,7 +436,7 @@ ulong write_smbios_table(ulong addr)
{
ofnode parent_node = ofnode_null();
struct smbios_entry *se;
struct udevice *dev;
struct smbios_ctx ctx;
ulong table_addr;
ulong tables;
int len = 0;
@ -326,10 +446,13 @@ ulong write_smbios_table(ulong addr)
int isize;
int i;
ctx.node = ofnode_null();
if (IS_ENABLED(CONFIG_OF_CONTROL)) {
uclass_first_device(UCLASS_SYSINFO, &dev);
if (dev)
parent_node = dev_read_subnode(dev, "smbios");
uclass_first_device(UCLASS_SYSINFO, &ctx.dev);
if (ctx.dev)
parent_node = dev_read_subnode(ctx.dev, "smbios");
} else {
ctx.dev = NULL;
}
/* 16 byte align the table address */
@ -345,14 +468,13 @@ ulong write_smbios_table(ulong addr)
/* populate minimum required tables */
for (i = 0; i < ARRAY_SIZE(smbios_write_funcs); i++) {
const struct smbios_write_method *method;
ofnode node = ofnode_null();
int tmp;
method = &smbios_write_funcs[i];
if (IS_ENABLED(CONFIG_OF_CONTROL) && method->subnode_name)
node = ofnode_find_subnode(parent_node,
method->subnode_name);
tmp = method->write((ulong *)&addr, handle++, node);
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);
len += tmp;