diff options
author | Tom Rini <trini@konsulko.com> | 2021-02-06 09:45:58 -0500 |
---|---|---|
committer | Tom Rini <trini@konsulko.com> | 2021-02-06 09:45:58 -0500 |
commit | 3936fd998668846f77468d8f6a662e906920969c (patch) | |
tree | 3f7d2b7a970b0890e95038585befdb2a49b14c7f | |
parent | 8308a28af821d6498186b3dd7463db9874cd2daf (diff) | |
parent | 07c9e683a484bc8e5e22976feb54b1c1a460068d (diff) | |
download | u-boot-WIP/06Feb2021.zip u-boot-WIP/06Feb2021.tar.gz u-boot-WIP/06Feb2021.tar.bz2 |
Merge https://gitlab.denx.de/u-boot/custodians/u-boot-x86WIP/06Feb2021
- 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
-rw-r--r-- | Makefile | 4 | ||||
-rw-r--r-- | board/google/chromebook_coral/coral.c | 5 | ||||
-rw-r--r-- | doc/develop/index.rst | 1 | ||||
-rw-r--r-- | doc/develop/version.rst | 101 | ||||
-rw-r--r-- | include/asm-generic/global_data.h | 6 | ||||
-rw-r--r-- | include/smbios.h | 26 | ||||
-rw-r--r-- | include/sysinfo.h | 13 | ||||
-rw-r--r-- | lib/smbios.c | 248 |
8 files changed, 328 insertions, 76 deletions
@@ -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 diff --git a/board/google/chromebook_coral/coral.c b/board/google/chromebook_coral/coral.c index 34b2c2a..f9fb3f1 100644 --- a/board/google/chromebook_coral/coral.c +++ b/board/google/chromebook_coral/coral.c @@ -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) }; diff --git a/doc/develop/index.rst b/doc/develop/index.rst index beaa64d..ac57fdb 100644 --- a/doc/develop/index.rst +++ b/doc/develop/index.rst @@ -13,6 +13,7 @@ Implementation global_data logging menus + version Debugging --------- diff --git a/doc/develop/version.rst b/doc/develop/version.rst new file mode 100644 index 0000000..a7797db --- /dev/null +++ b/doc/develop/version.rst @@ -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. diff --git a/include/asm-generic/global_data.h b/include/asm-generic/global_data.h index 998beb0..b6a9991 100644 --- a/include/asm-generic/global_data.h +++ b/include/asm-generic/global_data.h @@ -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 }; /** diff --git a/include/smbios.h b/include/smbios.h index 1846607..ecc4fd1 100644 --- a/include/smbios.h +++ b/include/smbios.h @@ -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 { @@ -220,16 +220,6 @@ static inline void fill_smbios_header(void *table, int type, } /** - * 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 * * This writes SMBIOS table at a given address. @@ -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_ */ diff --git a/include/sysinfo.h b/include/sysinfo.h index c045d31..743f355 100644 --- a/include/sysinfo.h +++ b/include/sysinfo.h @@ -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. * diff --git a/lib/smbios.c b/lib/smbios.c index 1e10fa8..7d463c8 100644 --- a/lib/smbios.c +++ b/lib/smbios.c @@ -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; |