Message ID | 20241206225438.13866-2-raymond.mao@linaro.org |
---|---|
State | Accepted |
Delegated to: | Tom Rini |
Headers | show |
Series | SMBIOS improvements | expand |
On 06.12.24 23:54, Raymond Mao wrote: > Move the smbios field definitions to a separated simple headfile, > which is a prerequisite to be included by dts files. > Add new definitions for cache information. > This patch also includes a few of code optimizations in smbios. > > Signed-off-by: Raymond Mao <raymond.mao@linaro.org> Acked-by: Heinrich Schuchardt <xypron.glpk@gmx.de> > --- > Changes in v2 > - Initial patch. > Changes in v3 > - Miscellaneous updates. > > cmd/smbios.c | 4 +- > include/smbios.h | 81 +++--------------- > include/smbios_def.h | 194 +++++++++++++++++++++++++++++++++++++++++++ > lib/smbios.c | 44 +++++----- > 4 files changed, 231 insertions(+), 92 deletions(-) > create mode 100644 include/smbios_def.h > > diff --git a/cmd/smbios.c b/cmd/smbios.c > index d3bd8b12a67..2122ac04e55 100644 > --- a/cmd/smbios.c > +++ b/cmd/smbios.c > @@ -99,12 +99,12 @@ static void smbios_print_type1(struct smbios_type1 *table) > smbios_print_str("Product Name", table, table->product_name); > smbios_print_str("Version", table, table->version); > smbios_print_str("Serial Number", table, table->serial_number); > - if (table->length >= 0x19) { > + if (table->hdr.length >= SMBIOS_TYPE1_LENGTH_V21) { > printf("\tUUID: %pUl\n", table->uuid); > printf("\tWake-up Type: %s\n", > smbios_wakeup_type_str(table->wakeup_type)); > } > - if (table->length >= 0x1b) { > + if (table->hdr.length >= SMBIOS_TYPE1_LENGTH_V24) { > smbios_print_str("SKU Number", table, table->sku_number); > smbios_print_str("Family", table, table->family); > } > diff --git a/include/smbios.h b/include/smbios.h > index 00119d7a60c..78fd14d881b 100644 > --- a/include/smbios.h > +++ b/include/smbios.h > @@ -9,6 +9,7 @@ > #define _SMBIOS_H_ > > #include <linux/types.h> > +#include <smbios_def.h> > > /* SMBIOS spec version implemented */ > #define SMBIOS_MAJOR_VER 3 > @@ -80,19 +81,14 @@ struct __packed smbios3_entry { > u64 struct_table_address; > }; > > -/* BIOS characteristics */ > -#define BIOS_CHARACTERISTICS_PCI_SUPPORTED (1 << 7) > -#define BIOS_CHARACTERISTICS_UPGRADEABLE (1 << 11) > -#define BIOS_CHARACTERISTICS_SELECTABLE_BOOT (1 << 16) > - > -#define BIOS_CHARACTERISTICS_EXT1_ACPI (1 << 0) > -#define BIOS_CHARACTERISTICS_EXT2_UEFI (1 << 3) > -#define BIOS_CHARACTERISTICS_EXT2_TARGET (1 << 2) > - > -struct __packed smbios_type0 { > +struct __packed smbios_header { > u8 type; > u8 length; > u16 handle; > +}; > + > +struct __packed smbios_type0 { > + struct smbios_header hdr; > u8 vendor; > u8 bios_ver; > u16 bios_start_segment; > @@ -109,37 +105,12 @@ struct __packed smbios_type0 { > char eos[SMBIOS_STRUCT_EOS_BYTES]; > }; > > -/** > - * enum smbios_wakeup_type - wake-up type > - * > - * These constants are used for the Wake-Up Type field in the SMBIOS > - * System Information (Type 1) structure. > - */ > -enum smbios_wakeup_type { > - /** @SMBIOS_WAKEUP_TYPE_RESERVED: Reserved */ > - SMBIOS_WAKEUP_TYPE_RESERVED, > - /** @SMBIOS_WAKEUP_TYPE_OTHER: Other */ > - SMBIOS_WAKEUP_TYPE_OTHER, > - /** @SMBIOS_WAKEUP_TYPE_UNKNOWN: Unknown */ > - SMBIOS_WAKEUP_TYPE_UNKNOWN, > - /** @SMBIOS_WAKEUP_TYPE_APM_TIMER: APM Timer */ > - SMBIOS_WAKEUP_TYPE_APM_TIMER, > - /** @SMBIOS_WAKEUP_TYPE_MODEM_RING: Modem Ring */ > - SMBIOS_WAKEUP_TYPE_MODEM_RING, > - /** @SMBIOS_WAKEUP_TYPE_LAN_REMOTE: LAN Remote */ > - SMBIOS_WAKEUP_TYPE_LAN_REMOTE, > - /** @SMBIOS_WAKEUP_TYPE_POWER_SWITCH: Power Switch */ > - SMBIOS_WAKEUP_TYPE_POWER_SWITCH, > - /** @SMBIOS_WAKEUP_TYPE_PCI_PME: PCI PME# */ > - SMBIOS_WAKEUP_TYPE_PCI_PME, > - /** @SMBIOS_WAKEUP_TYPE_AC_POWER_RESTORED: AC Power Restored */ > - SMBIOS_WAKEUP_TYPE_AC_POWER_RESTORED, > -}; > +#define SMBIOS_TYPE1_LENGTH_V20 0x08 > +#define SMBIOS_TYPE1_LENGTH_V21 0x19 > +#define SMBIOS_TYPE1_LENGTH_V24 0x1b > > struct __packed smbios_type1 { > - u8 type; > - u8 length; > - u16 handle; > + struct smbios_header hdr; > u8 manufacturer; > u8 product_name; > u8 version; > @@ -151,13 +122,8 @@ struct __packed smbios_type1 { > char eos[SMBIOS_STRUCT_EOS_BYTES]; > }; > > -#define SMBIOS_BOARD_FEATURE_HOSTING (1 << 0) > -#define SMBIOS_BOARD_MOTHERBOARD 10 > - > struct __packed smbios_type2 { > - u8 type; > - u8 length; > - u16 handle; > + struct smbios_header hdr; > u8 manufacturer; > u8 product_name; > u8 version; > @@ -171,14 +137,8 @@ struct __packed smbios_type2 { > char eos[SMBIOS_STRUCT_EOS_BYTES]; > }; > > -#define SMBIOS_ENCLOSURE_DESKTOP 3 > -#define SMBIOS_STATE_SAFE 3 > -#define SMBIOS_SECURITY_NONE 3 > - > struct __packed smbios_type3 { > - u8 type; > - u8 length; > - u16 handle; > + struct smbios_header hdr; > u8 manufacturer; > u8 chassis_type; > u8 version; > @@ -196,17 +156,8 @@ struct __packed smbios_type3 { > char eos[SMBIOS_STRUCT_EOS_BYTES]; > }; > > -#define SMBIOS_PROCESSOR_TYPE_CENTRAL 3 > -#define SMBIOS_PROCESSOR_STATUS_ENABLED 1 > -#define SMBIOS_PROCESSOR_UPGRADE_NONE 6 > - > -#define SMBIOS_PROCESSOR_FAMILY_OTHER 1 > -#define SMBIOS_PROCESSOR_FAMILY_UNKNOWN 2 > - > struct __packed smbios_type4 { > - u8 type; > - u8 length; > - u16 handle; > + struct smbios_header hdr; > u8 socket_designation; > u8 processor_type; > u8 processor_family; > @@ -252,12 +203,6 @@ struct __packed smbios_type127 { > char eos[SMBIOS_STRUCT_EOS_BYTES]; > }; > > -struct __packed smbios_header { > - u8 type; > - u8 length; > - u16 handle; > -}; > - > /** > * fill_smbios_header() - Fill the header of an SMBIOS table > * > diff --git a/include/smbios_def.h b/include/smbios_def.h > new file mode 100644 > index 00000000000..81c5781217f > --- /dev/null > +++ b/include/smbios_def.h > @@ -0,0 +1,194 @@ > +/* SPDX-License-Identifier: GPL-2.0+ */ > +/* > + * Copyright (c) 2024 Linaro Limited > + * Author: Raymond Mao <raymond.mao@linaro.org> > + */ > + > +#ifndef _SMBIOS_DEF_H_ > +#define _SMBIOS_DEF_H_ > + > +/* > + * BIOS characteristics > + */ > + > +#define BIOS_CHARACTERISTICS_PCI_SUPPORTED 0x80 /* BIT(7) */ > +#define BIOS_CHARACTERISTICS_UPGRADEABLE 0x800 /* BIT(11) */ > +#define BIOS_CHARACTERISTICS_SELECTABLE_BOOT 0x10000 /* BIT(16) */ > + > +#define BIOS_CHARACTERISTICS_EXT1_ACPI 1 /* BIT(0) */ > +#define BIOS_CHARACTERISTICS_EXT2_UEFI 8 /* BIT(3) */ > +#define BIOS_CHARACTERISTICS_EXT2_TARGET 4 /* BIT(2) */ > + > +/* > + * System Information > + */ > + > +#define SMBIOS_WAKEUP_TYPE_RESERVED 0 > +#define SMBIOS_WAKEUP_TYPE_OTHER 1 > +#define SMBIOS_WAKEUP_TYPE_UNKNOWN 2 > +#define SMBIOS_WAKEUP_TYPE_APM_TIMER 3 > +#define SMBIOS_WAKEUP_TYPE_MODEM_RING 4 > +#define SMBIOS_WAKEUP_TYPE_LAN_REMOTE 5 > +#define SMBIOS_WAKEUP_TYPE_POWER_SWITCH 6 > +#define SMBIOS_WAKEUP_TYPE_PCI_PME 7 > +#define SMBIOS_WAKEUP_TYPE_AC_POWER_RESTORED 8 > + > +/* > + * Baseboard Information > + */ > + > +#define SMBIOS_BOARD_FEAT_HOST_BOARD 1 /* BIT(0) */ > +#define SMBIOS_BOARD_FEAT_REQ_AUX 2 /* BIT(1) */ > +#define SMBIOS_BOARD_FEAT_REMOVABLE 4 /* BIT(2) */ > +#define SMBIOS_BOARD_FEAT_REPLACEABLE 8 /* BIT(3) */ > +#define SMBIOS_BOARD_FEAT_HOT_SWAPPABLE 16 /* BIT(4) */ > + > +#define SMBIOS_BOARD_TYPE_UNKNOWN 1 > +#define SMBIOS_BOARD_TYPE_OTHER 2 > +#define SMBIOS_BOARD_TYPE_SERVER_BLADE 3 > +#define SMBIOS_BOARD_TYPE_CON_SWITCH 4 > +#define SMBIOS_BOARD_TYPE_SM_MODULE 5 > +#define SMBIOS_BOARD_TYPE_PROCESSOR_MODULE 6 > +#define SMBIOS_BOARD_TYPE_IO_MODULE 7 > +#define SMBIOS_BOARD_TYPE_MEM_MODULE 8 > +#define SMBIOS_BOARD_TYPE_DAUGHTER_BOARD 9 > +#define SMBIOS_BOARD_TYPE_MOTHERBOARD 10 > +#define SMBIOS_BOARD_TYPE_PROC_MEM_MODULE 11 > +#define SMBIOS_BOARD_TYPE_PROC_IO_MODULE 12 > +#define SMBIOS_BOARD_TYPE_INTERCON 13 > + > +/* > + * System Enclosure or Chassis > + */ > +#define SMBIOS_ENCLOSURE_UNKNOWN 2 > +#define SMBIOS_ENCLOSURE_DESKTOP 3 > + > +#define SMBIOS_STATE_OTHER 1 > +#define SMBIOS_STATE_UNKNOWN 2 > +#define SMBIOS_STATE_SAFE 3 > +#define SMBIOS_STATE_WARNING 4 > +#define SMBIOS_STATE_CRITICAL 5 > +#define SMBIOS_STATE_NONRECOVERABLE 6 > + > +#define SMBIOS_SECURITY_OTHER 1 > +#define SMBIOS_SECURITY_UNKNOWN 2 > +#define SMBIOS_SECURITY_NONE 3 > +#define SMBIOS_SECURITY_EXTINT_LOCK 4 > +#define SMBIOS_SECURITY_EXTINT_EN 5 > + > +#define SMBIOS_ENCLOSURE_OEM_UND 0 > +#define SMBIOS_ENCLOSURE_HEIGHT_UND 0 > +#define SMBIOS_POWCORD_NUM_UND 0 > +#define SMBIOS_ELEMENT_TYPE_SELECT 0x80 /* BIT(7) */ > + > +/* > + * Processor Information > + */ > + > +#define SMBIOS_PROCESSOR_TYPE_OTHER 1 > +#define SMBIOS_PROCESSOR_TYPE_UNKNOWN 2 > +#define SMBIOS_PROCESSOR_TYPE_CENTRAL 3 > +#define SMBIOS_PROCESSOR_TYPE_MATH 4 > +#define SMBIOS_PROCESSOR_TYPE_DSP 5 > +#define SMBIOS_PROCESSOR_TYPE_VIDEO 6 > + > +#define SMBIOS_PROCESSOR_STATUS_UNKNOWN 0 > +#define SMBIOS_PROCESSOR_STATUS_ENABLED 1 > +#define SMBIOS_PROCESSOR_STATUS_DISABLED_USER 2 > +#define SMBIOS_PROCESSOR_STATUS_DISABLED_BIOS 3 > +#define SMBIOS_PROCESSOR_STATUS_IDLE 4 > +#define SMBIOS_PROCESSOR_STATUS_OTHER 7 > + > +#define SMBIOS_PROCESSOR_UPGRADE_OTHER 1 > +#define SMBIOS_PROCESSOR_UPGRADE_UNKNOWN 2 > +#define SMBIOS_PROCESSOR_UPGRADE_NONE 6 > + > +#define SMBIOS_PROCESSOR_FAMILY_OTHER 1 > +#define SMBIOS_PROCESSOR_FAMILY_UNKNOWN 2 > +#define SMBIOS_PROCESSOR_FAMILY_RSVD 255 > +#define SMBIOS_PROCESSOR_FAMILY_ARMV7 256 > +#define SMBIOS_PROCESSOR_FAMILY_ARMV8 257 > +#define SMBIOS_PROCESSOR_FAMILY_RV32 512 > +#define SMBIOS_PROCESSOR_FAMILY_RV64 513 > + > +#define SMBIOS_PROCESSOR_FAMILY_EXT 0xfe > + > +/* Processor Characteristics */ > +#define SMBIOS_PROCESSOR_RSVD 1 /* BIT(0) */ > +#define SMBIOS_PROCESSOR_UND 2 /* BIT(1) */ > +#define SMBIOS_PROCESSOR_64BIT 4 /* BIT(2) */ > +#define SMBIOS_PROCESSOR_MULTICORE 8 /* BIT(3) */ > +#define SMBIOS_PROCESSOR_HWTHREAD 16 /* BIT(4) */ > +#define SMBIOS_PROCESSOR_EXEC_PROT 32 /* BIT(5) */ > +#define SMBIOS_PROCESSOR_ENH_VIRT 64 /* BIT(6) */ > +#define SMBIOS_PROCESSOR_POW_CON 0x80 /* BIT(7) */ > +#define SMBIOS_PROCESSOR_128BIT 0x100 /* BIT(8) */ > +#define SMBIOS_PROCESSOR_ARM64_SOCID 0x200 /* BIT(9) */ > + > +/* > + * Cache Information > + */ > + > +#define SMBIOS_CACHE_SIZE_EXT_KB (2047 * 1024) /* 2047 MiB */ > +#define SMBIOS_CACHE_HANDLE_NONE 0xffff > + > +/* System Cache Type */ > +#define SMBIOS_CACHE_SYSCACHE_TYPE_OTHER 1 > +#define SMBIOS_CACHE_SYSCACHE_TYPE_UNKNOWN 2 > +#define SMBIOS_CACHE_SYSCACHE_TYPE_INST 3 > +#define SMBIOS_CACHE_SYSCACHE_TYPE_DATA 4 > +#define SMBIOS_CACHE_SYSCACHE_TYPE_UNIFIED 5 > + > +/* Cache Speed */ > +#define SMBIOS_CACHE_SPEED_UNKNOWN 0 > + > +/* SRAM Type */ > +#define SMBIOS_CACHE_SRAM_TYPE_UNKNOWN 2 /* BIT(1) */ > + > +/* Error Correction Type */ > +#define SMBIOS_CACHE_ERRCORR_OTHER 1 > +#define SMBIOS_CACHE_ERRCORR_UNKNOWN 2 > +#define SMBIOS_CACHE_ERRCORR_NONE 3 > +#define SMBIOS_CACHE_ERRCORR_PARITY 4 > +#define SMBIOS_CACHE_ERRCORR_SBITECC 5 > +#define SMBIOS_CACHE_ERRCORR_MBITECC 6 > + > +/* Cache Configuration */ > +#define SMBIOS_CACHE_LEVEL_1 0 > +#define SMBIOS_CACHE_LEVEL_2 1 > +#define SMBIOS_CACHE_LEVEL_3 2 > +#define SMBIOS_CACHE_LEVEL_4 3 > +#define SMBIOS_CACHE_LEVEL_5 4 > +#define SMBIOS_CACHE_LEVEL_6 5 > +#define SMBIOS_CACHE_LEVEL_7 6 > +#define SMBIOS_CACHE_LEVEL_8 7 > +#define SMBIOS_CACHE_SOCKETED 8 /* BIT(3) */ > +#define SMBIOS_CACHE_LOCATE_EXTERNAL 32 /* BIT(5) */ > +#define SMBIOS_CACHE_LOCATE_RESERVED 64 /* BIT(6) */ > +#define SMBIOS_CACHE_LOCATE_UNKNOWN 96 /* (BIT(5) | BIT(6)) */ > +#define SMBIOS_CACHE_ENABLED 0x80 /* BIT(7) */ > +#define SMBIOS_CACHE_OP_WB 0x100 /* BIT(8), Write Back */ > +#define SMBIOS_CACHE_OP_VAR 0x200 /* BIT(9), Varies with Memory Address */ > +#define SMBIOS_CACHE_OP_UND 0x300 /* (BIT(8) | BIT(9)), Unknown*/ > + > +/* Cache Granularity */ > +#define SMBIOS_CACHE_GRANU_1K 0 > +#define SMBIOS_CACHE_GRANU_64K 1 > + > +/* Cache Associativity */ > +#define SMBIOS_CACHE_ASSOC_OTHER 1 > +#define SMBIOS_CACHE_ASSOC_UNKNOWN 2 > +#define SMBIOS_CACHE_ASSOC_DMAPPED 3 > +#define SMBIOS_CACHE_ASSOC_2WAY 4 > +#define SMBIOS_CACHE_ASSOC_4WAY 5 > +#define SMBIOS_CACHE_ASSOC_FULLY 6 > +#define SMBIOS_CACHE_ASSOC_8WAY 7 > +#define SMBIOS_CACHE_ASSOC_16WAY 8 > +#define SMBIOS_CACHE_ASSOC_12WAY 9 > +#define SMBIOS_CACHE_ASSOC_24WAY 10 > +#define SMBIOS_CACHE_ASSOC_32WAY 11 > +#define SMBIOS_CACHE_ASSOC_48WAY 12 > +#define SMBIOS_CACHE_ASSOC_64WAY 13 > +#define SMBIOS_CACHE_ASSOC_20WAY 14 > + > +#endif /* _SMBIOS_DEF_H_ */ > diff --git a/lib/smbios.c b/lib/smbios.c > index a36d4b4e54a..1dd564a1762 100644 > --- a/lib/smbios.c > +++ b/lib/smbios.c > @@ -330,10 +330,10 @@ static int smbios_write_type0(ulong *current, int handle, > struct smbios_ctx *ctx) > { > struct smbios_type0 *t; > - int len = sizeof(struct smbios_type0); > + int len = sizeof(*t); > > t = map_sysmem(*current, len); > - memset(t, 0, sizeof(struct smbios_type0)); > + memset(t, 0, len); > fill_smbios_header(t, SMBIOS_BIOS_INFORMATION, len, handle); > smbios_set_eos(ctx, t->eos); > t->vendor = smbios_add_prop(ctx, NULL, "U-Boot"); > @@ -374,7 +374,7 @@ static int smbios_write_type0(ulong *current, int handle, > t->ec_major_release = 0xff; > t->ec_minor_release = 0xff; > > - len = t->length + smbios_string_table_len(ctx); > + len = t->hdr.length + smbios_string_table_len(ctx); > *current += len; > unmap_sysmem(t); > > @@ -385,11 +385,11 @@ static int smbios_write_type1(ulong *current, int handle, > struct smbios_ctx *ctx) > { > struct smbios_type1 *t; > - int len = sizeof(struct smbios_type1); > + int len = sizeof(*t); > char *serial_str = env_get("serial#"); > > t = map_sysmem(*current, len); > - memset(t, 0, sizeof(struct smbios_type1)); > + memset(t, 0, len); > fill_smbios_header(t, SMBIOS_SYSTEM_INFORMATION, len, handle); > smbios_set_eos(ctx, t->eos); > t->manufacturer = smbios_add_prop_si(ctx, "manufacturer", > @@ -403,7 +403,7 @@ static int smbios_write_type1(ulong *current, int handle, > NULL); > if (serial_str) { > t->serial_number = smbios_add_prop(ctx, NULL, serial_str); > - strncpy((char *)t->uuid, serial_str, sizeof(t->uuid)); > + strlcpy((char *)t->uuid, serial_str, sizeof(t->uuid)); > } else { > t->serial_number = smbios_add_prop_si(ctx, "serial", > SYSID_SM_SYSTEM_SERIAL, > @@ -415,7 +415,7 @@ static int smbios_write_type1(ulong *current, int handle, > t->family = smbios_add_prop_si(ctx, "family", > SYSID_SM_SYSTEM_FAMILY, NULL); > > - len = t->length + smbios_string_table_len(ctx); > + len = t->hdr.length + smbios_string_table_len(ctx); > *current += len; > unmap_sysmem(t); > > @@ -426,10 +426,10 @@ static int smbios_write_type2(ulong *current, int handle, > struct smbios_ctx *ctx) > { > struct smbios_type2 *t; > - int len = sizeof(struct smbios_type2); > + int len = sizeof(*t); > > t = map_sysmem(*current, len); > - memset(t, 0, sizeof(struct smbios_type2)); > + memset(t, 0, len); > fill_smbios_header(t, SMBIOS_BOARD_INFORMATION, len, handle); > smbios_set_eos(ctx, t->eos); > t->manufacturer = smbios_add_prop_si(ctx, "manufacturer", > @@ -448,11 +448,11 @@ static int smbios_write_type2(ulong *current, int handle, > t->asset_tag_number = smbios_add_prop_si(ctx, "asset-tag", > SYSID_SM_BASEBOARD_ASSET_TAG, > NULL); > - t->feature_flags = SMBIOS_BOARD_FEATURE_HOSTING; > - t->board_type = SMBIOS_BOARD_MOTHERBOARD; > + t->feature_flags = SMBIOS_BOARD_FEAT_HOST_BOARD; > + t->board_type = SMBIOS_BOARD_TYPE_MOTHERBOARD; > t->chassis_handle = handle + 1; > > - len = t->length + smbios_string_table_len(ctx); > + len = t->hdr.length + smbios_string_table_len(ctx); > *current += len; > unmap_sysmem(t); > > @@ -463,10 +463,10 @@ static int smbios_write_type3(ulong *current, int handle, > struct smbios_ctx *ctx) > { > struct smbios_type3 *t; > - int len = sizeof(struct smbios_type3); > + int len = sizeof(*t); > > t = map_sysmem(*current, len); > - memset(t, 0, sizeof(struct smbios_type3)); > + memset(t, 0, len); > fill_smbios_header(t, SMBIOS_SYSTEM_ENCLOSURE, len, handle); > smbios_set_eos(ctx, t->eos); > t->manufacturer = smbios_add_prop(ctx, "manufacturer", NULL); > @@ -476,7 +476,7 @@ static int smbios_write_type3(ulong *current, int handle, > t->thermal_state = SMBIOS_STATE_SAFE; > t->security_status = SMBIOS_SECURITY_NONE; > > - len = t->length + smbios_string_table_len(ctx); > + len = t->hdr.length + smbios_string_table_len(ctx); > *current += len; > unmap_sysmem(t); > > @@ -521,10 +521,10 @@ static int smbios_write_type4(ulong *current, int handle, > struct smbios_ctx *ctx) > { > struct smbios_type4 *t; > - int len = sizeof(struct smbios_type4); > + int len = sizeof(*t); > > t = map_sysmem(*current, len); > - memset(t, 0, sizeof(struct smbios_type4)); > + memset(t, 0, len); > fill_smbios_header(t, SMBIOS_PROCESSOR_INFORMATION, len, handle); > smbios_set_eos(ctx, t->eos); > t->processor_type = SMBIOS_PROCESSOR_TYPE_CENTRAL; > @@ -535,7 +535,7 @@ static int smbios_write_type4(ulong *current, int handle, > t->l2_cache_handle = 0xffff; > t->l3_cache_handle = 0xffff; > > - len = t->length + smbios_string_table_len(ctx); > + len = t->hdr.length + smbios_string_table_len(ctx); > *current += len; > unmap_sysmem(t); > > @@ -546,10 +546,10 @@ static int smbios_write_type32(ulong *current, int handle, > struct smbios_ctx *ctx) > { > struct smbios_type32 *t; > - int len = sizeof(struct smbios_type32); > + int len = sizeof(*t); > > t = map_sysmem(*current, len); > - memset(t, 0, sizeof(struct smbios_type32)); > + memset(t, 0, len); > fill_smbios_header(t, SMBIOS_SYSTEM_BOOT_INFORMATION, len, handle); > smbios_set_eos(ctx, t->eos); > > @@ -563,10 +563,10 @@ static int smbios_write_type127(ulong *current, int handle, > struct smbios_ctx *ctx) > { > struct smbios_type127 *t; > - int len = sizeof(struct smbios_type127); > + int len = sizeof(*t); > > t = map_sysmem(*current, len); > - memset(t, 0, sizeof(struct smbios_type127)); > + memset(t, 0, len); > fill_smbios_header(t, SMBIOS_END_OF_TABLE, len, handle); > > *current += len;
diff --git a/cmd/smbios.c b/cmd/smbios.c index d3bd8b12a67..2122ac04e55 100644 --- a/cmd/smbios.c +++ b/cmd/smbios.c @@ -99,12 +99,12 @@ static void smbios_print_type1(struct smbios_type1 *table) smbios_print_str("Product Name", table, table->product_name); smbios_print_str("Version", table, table->version); smbios_print_str("Serial Number", table, table->serial_number); - if (table->length >= 0x19) { + if (table->hdr.length >= SMBIOS_TYPE1_LENGTH_V21) { printf("\tUUID: %pUl\n", table->uuid); printf("\tWake-up Type: %s\n", smbios_wakeup_type_str(table->wakeup_type)); } - if (table->length >= 0x1b) { + if (table->hdr.length >= SMBIOS_TYPE1_LENGTH_V24) { smbios_print_str("SKU Number", table, table->sku_number); smbios_print_str("Family", table, table->family); } diff --git a/include/smbios.h b/include/smbios.h index 00119d7a60c..78fd14d881b 100644 --- a/include/smbios.h +++ b/include/smbios.h @@ -9,6 +9,7 @@ #define _SMBIOS_H_ #include <linux/types.h> +#include <smbios_def.h> /* SMBIOS spec version implemented */ #define SMBIOS_MAJOR_VER 3 @@ -80,19 +81,14 @@ struct __packed smbios3_entry { u64 struct_table_address; }; -/* BIOS characteristics */ -#define BIOS_CHARACTERISTICS_PCI_SUPPORTED (1 << 7) -#define BIOS_CHARACTERISTICS_UPGRADEABLE (1 << 11) -#define BIOS_CHARACTERISTICS_SELECTABLE_BOOT (1 << 16) - -#define BIOS_CHARACTERISTICS_EXT1_ACPI (1 << 0) -#define BIOS_CHARACTERISTICS_EXT2_UEFI (1 << 3) -#define BIOS_CHARACTERISTICS_EXT2_TARGET (1 << 2) - -struct __packed smbios_type0 { +struct __packed smbios_header { u8 type; u8 length; u16 handle; +}; + +struct __packed smbios_type0 { + struct smbios_header hdr; u8 vendor; u8 bios_ver; u16 bios_start_segment; @@ -109,37 +105,12 @@ struct __packed smbios_type0 { char eos[SMBIOS_STRUCT_EOS_BYTES]; }; -/** - * enum smbios_wakeup_type - wake-up type - * - * These constants are used for the Wake-Up Type field in the SMBIOS - * System Information (Type 1) structure. - */ -enum smbios_wakeup_type { - /** @SMBIOS_WAKEUP_TYPE_RESERVED: Reserved */ - SMBIOS_WAKEUP_TYPE_RESERVED, - /** @SMBIOS_WAKEUP_TYPE_OTHER: Other */ - SMBIOS_WAKEUP_TYPE_OTHER, - /** @SMBIOS_WAKEUP_TYPE_UNKNOWN: Unknown */ - SMBIOS_WAKEUP_TYPE_UNKNOWN, - /** @SMBIOS_WAKEUP_TYPE_APM_TIMER: APM Timer */ - SMBIOS_WAKEUP_TYPE_APM_TIMER, - /** @SMBIOS_WAKEUP_TYPE_MODEM_RING: Modem Ring */ - SMBIOS_WAKEUP_TYPE_MODEM_RING, - /** @SMBIOS_WAKEUP_TYPE_LAN_REMOTE: LAN Remote */ - SMBIOS_WAKEUP_TYPE_LAN_REMOTE, - /** @SMBIOS_WAKEUP_TYPE_POWER_SWITCH: Power Switch */ - SMBIOS_WAKEUP_TYPE_POWER_SWITCH, - /** @SMBIOS_WAKEUP_TYPE_PCI_PME: PCI PME# */ - SMBIOS_WAKEUP_TYPE_PCI_PME, - /** @SMBIOS_WAKEUP_TYPE_AC_POWER_RESTORED: AC Power Restored */ - SMBIOS_WAKEUP_TYPE_AC_POWER_RESTORED, -}; +#define SMBIOS_TYPE1_LENGTH_V20 0x08 +#define SMBIOS_TYPE1_LENGTH_V21 0x19 +#define SMBIOS_TYPE1_LENGTH_V24 0x1b struct __packed smbios_type1 { - u8 type; - u8 length; - u16 handle; + struct smbios_header hdr; u8 manufacturer; u8 product_name; u8 version; @@ -151,13 +122,8 @@ struct __packed smbios_type1 { char eos[SMBIOS_STRUCT_EOS_BYTES]; }; -#define SMBIOS_BOARD_FEATURE_HOSTING (1 << 0) -#define SMBIOS_BOARD_MOTHERBOARD 10 - struct __packed smbios_type2 { - u8 type; - u8 length; - u16 handle; + struct smbios_header hdr; u8 manufacturer; u8 product_name; u8 version; @@ -171,14 +137,8 @@ struct __packed smbios_type2 { char eos[SMBIOS_STRUCT_EOS_BYTES]; }; -#define SMBIOS_ENCLOSURE_DESKTOP 3 -#define SMBIOS_STATE_SAFE 3 -#define SMBIOS_SECURITY_NONE 3 - struct __packed smbios_type3 { - u8 type; - u8 length; - u16 handle; + struct smbios_header hdr; u8 manufacturer; u8 chassis_type; u8 version; @@ -196,17 +156,8 @@ struct __packed smbios_type3 { char eos[SMBIOS_STRUCT_EOS_BYTES]; }; -#define SMBIOS_PROCESSOR_TYPE_CENTRAL 3 -#define SMBIOS_PROCESSOR_STATUS_ENABLED 1 -#define SMBIOS_PROCESSOR_UPGRADE_NONE 6 - -#define SMBIOS_PROCESSOR_FAMILY_OTHER 1 -#define SMBIOS_PROCESSOR_FAMILY_UNKNOWN 2 - struct __packed smbios_type4 { - u8 type; - u8 length; - u16 handle; + struct smbios_header hdr; u8 socket_designation; u8 processor_type; u8 processor_family; @@ -252,12 +203,6 @@ struct __packed smbios_type127 { char eos[SMBIOS_STRUCT_EOS_BYTES]; }; -struct __packed smbios_header { - u8 type; - u8 length; - u16 handle; -}; - /** * fill_smbios_header() - Fill the header of an SMBIOS table * diff --git a/include/smbios_def.h b/include/smbios_def.h new file mode 100644 index 00000000000..81c5781217f --- /dev/null +++ b/include/smbios_def.h @@ -0,0 +1,194 @@ +/* SPDX-License-Identifier: GPL-2.0+ */ +/* + * Copyright (c) 2024 Linaro Limited + * Author: Raymond Mao <raymond.mao@linaro.org> + */ + +#ifndef _SMBIOS_DEF_H_ +#define _SMBIOS_DEF_H_ + +/* + * BIOS characteristics + */ + +#define BIOS_CHARACTERISTICS_PCI_SUPPORTED 0x80 /* BIT(7) */ +#define BIOS_CHARACTERISTICS_UPGRADEABLE 0x800 /* BIT(11) */ +#define BIOS_CHARACTERISTICS_SELECTABLE_BOOT 0x10000 /* BIT(16) */ + +#define BIOS_CHARACTERISTICS_EXT1_ACPI 1 /* BIT(0) */ +#define BIOS_CHARACTERISTICS_EXT2_UEFI 8 /* BIT(3) */ +#define BIOS_CHARACTERISTICS_EXT2_TARGET 4 /* BIT(2) */ + +/* + * System Information + */ + +#define SMBIOS_WAKEUP_TYPE_RESERVED 0 +#define SMBIOS_WAKEUP_TYPE_OTHER 1 +#define SMBIOS_WAKEUP_TYPE_UNKNOWN 2 +#define SMBIOS_WAKEUP_TYPE_APM_TIMER 3 +#define SMBIOS_WAKEUP_TYPE_MODEM_RING 4 +#define SMBIOS_WAKEUP_TYPE_LAN_REMOTE 5 +#define SMBIOS_WAKEUP_TYPE_POWER_SWITCH 6 +#define SMBIOS_WAKEUP_TYPE_PCI_PME 7 +#define SMBIOS_WAKEUP_TYPE_AC_POWER_RESTORED 8 + +/* + * Baseboard Information + */ + +#define SMBIOS_BOARD_FEAT_HOST_BOARD 1 /* BIT(0) */ +#define SMBIOS_BOARD_FEAT_REQ_AUX 2 /* BIT(1) */ +#define SMBIOS_BOARD_FEAT_REMOVABLE 4 /* BIT(2) */ +#define SMBIOS_BOARD_FEAT_REPLACEABLE 8 /* BIT(3) */ +#define SMBIOS_BOARD_FEAT_HOT_SWAPPABLE 16 /* BIT(4) */ + +#define SMBIOS_BOARD_TYPE_UNKNOWN 1 +#define SMBIOS_BOARD_TYPE_OTHER 2 +#define SMBIOS_BOARD_TYPE_SERVER_BLADE 3 +#define SMBIOS_BOARD_TYPE_CON_SWITCH 4 +#define SMBIOS_BOARD_TYPE_SM_MODULE 5 +#define SMBIOS_BOARD_TYPE_PROCESSOR_MODULE 6 +#define SMBIOS_BOARD_TYPE_IO_MODULE 7 +#define SMBIOS_BOARD_TYPE_MEM_MODULE 8 +#define SMBIOS_BOARD_TYPE_DAUGHTER_BOARD 9 +#define SMBIOS_BOARD_TYPE_MOTHERBOARD 10 +#define SMBIOS_BOARD_TYPE_PROC_MEM_MODULE 11 +#define SMBIOS_BOARD_TYPE_PROC_IO_MODULE 12 +#define SMBIOS_BOARD_TYPE_INTERCON 13 + +/* + * System Enclosure or Chassis + */ +#define SMBIOS_ENCLOSURE_UNKNOWN 2 +#define SMBIOS_ENCLOSURE_DESKTOP 3 + +#define SMBIOS_STATE_OTHER 1 +#define SMBIOS_STATE_UNKNOWN 2 +#define SMBIOS_STATE_SAFE 3 +#define SMBIOS_STATE_WARNING 4 +#define SMBIOS_STATE_CRITICAL 5 +#define SMBIOS_STATE_NONRECOVERABLE 6 + +#define SMBIOS_SECURITY_OTHER 1 +#define SMBIOS_SECURITY_UNKNOWN 2 +#define SMBIOS_SECURITY_NONE 3 +#define SMBIOS_SECURITY_EXTINT_LOCK 4 +#define SMBIOS_SECURITY_EXTINT_EN 5 + +#define SMBIOS_ENCLOSURE_OEM_UND 0 +#define SMBIOS_ENCLOSURE_HEIGHT_UND 0 +#define SMBIOS_POWCORD_NUM_UND 0 +#define SMBIOS_ELEMENT_TYPE_SELECT 0x80 /* BIT(7) */ + +/* + * Processor Information + */ + +#define SMBIOS_PROCESSOR_TYPE_OTHER 1 +#define SMBIOS_PROCESSOR_TYPE_UNKNOWN 2 +#define SMBIOS_PROCESSOR_TYPE_CENTRAL 3 +#define SMBIOS_PROCESSOR_TYPE_MATH 4 +#define SMBIOS_PROCESSOR_TYPE_DSP 5 +#define SMBIOS_PROCESSOR_TYPE_VIDEO 6 + +#define SMBIOS_PROCESSOR_STATUS_UNKNOWN 0 +#define SMBIOS_PROCESSOR_STATUS_ENABLED 1 +#define SMBIOS_PROCESSOR_STATUS_DISABLED_USER 2 +#define SMBIOS_PROCESSOR_STATUS_DISABLED_BIOS 3 +#define SMBIOS_PROCESSOR_STATUS_IDLE 4 +#define SMBIOS_PROCESSOR_STATUS_OTHER 7 + +#define SMBIOS_PROCESSOR_UPGRADE_OTHER 1 +#define SMBIOS_PROCESSOR_UPGRADE_UNKNOWN 2 +#define SMBIOS_PROCESSOR_UPGRADE_NONE 6 + +#define SMBIOS_PROCESSOR_FAMILY_OTHER 1 +#define SMBIOS_PROCESSOR_FAMILY_UNKNOWN 2 +#define SMBIOS_PROCESSOR_FAMILY_RSVD 255 +#define SMBIOS_PROCESSOR_FAMILY_ARMV7 256 +#define SMBIOS_PROCESSOR_FAMILY_ARMV8 257 +#define SMBIOS_PROCESSOR_FAMILY_RV32 512 +#define SMBIOS_PROCESSOR_FAMILY_RV64 513 + +#define SMBIOS_PROCESSOR_FAMILY_EXT 0xfe + +/* Processor Characteristics */ +#define SMBIOS_PROCESSOR_RSVD 1 /* BIT(0) */ +#define SMBIOS_PROCESSOR_UND 2 /* BIT(1) */ +#define SMBIOS_PROCESSOR_64BIT 4 /* BIT(2) */ +#define SMBIOS_PROCESSOR_MULTICORE 8 /* BIT(3) */ +#define SMBIOS_PROCESSOR_HWTHREAD 16 /* BIT(4) */ +#define SMBIOS_PROCESSOR_EXEC_PROT 32 /* BIT(5) */ +#define SMBIOS_PROCESSOR_ENH_VIRT 64 /* BIT(6) */ +#define SMBIOS_PROCESSOR_POW_CON 0x80 /* BIT(7) */ +#define SMBIOS_PROCESSOR_128BIT 0x100 /* BIT(8) */ +#define SMBIOS_PROCESSOR_ARM64_SOCID 0x200 /* BIT(9) */ + +/* + * Cache Information + */ + +#define SMBIOS_CACHE_SIZE_EXT_KB (2047 * 1024) /* 2047 MiB */ +#define SMBIOS_CACHE_HANDLE_NONE 0xffff + +/* System Cache Type */ +#define SMBIOS_CACHE_SYSCACHE_TYPE_OTHER 1 +#define SMBIOS_CACHE_SYSCACHE_TYPE_UNKNOWN 2 +#define SMBIOS_CACHE_SYSCACHE_TYPE_INST 3 +#define SMBIOS_CACHE_SYSCACHE_TYPE_DATA 4 +#define SMBIOS_CACHE_SYSCACHE_TYPE_UNIFIED 5 + +/* Cache Speed */ +#define SMBIOS_CACHE_SPEED_UNKNOWN 0 + +/* SRAM Type */ +#define SMBIOS_CACHE_SRAM_TYPE_UNKNOWN 2 /* BIT(1) */ + +/* Error Correction Type */ +#define SMBIOS_CACHE_ERRCORR_OTHER 1 +#define SMBIOS_CACHE_ERRCORR_UNKNOWN 2 +#define SMBIOS_CACHE_ERRCORR_NONE 3 +#define SMBIOS_CACHE_ERRCORR_PARITY 4 +#define SMBIOS_CACHE_ERRCORR_SBITECC 5 +#define SMBIOS_CACHE_ERRCORR_MBITECC 6 + +/* Cache Configuration */ +#define SMBIOS_CACHE_LEVEL_1 0 +#define SMBIOS_CACHE_LEVEL_2 1 +#define SMBIOS_CACHE_LEVEL_3 2 +#define SMBIOS_CACHE_LEVEL_4 3 +#define SMBIOS_CACHE_LEVEL_5 4 +#define SMBIOS_CACHE_LEVEL_6 5 +#define SMBIOS_CACHE_LEVEL_7 6 +#define SMBIOS_CACHE_LEVEL_8 7 +#define SMBIOS_CACHE_SOCKETED 8 /* BIT(3) */ +#define SMBIOS_CACHE_LOCATE_EXTERNAL 32 /* BIT(5) */ +#define SMBIOS_CACHE_LOCATE_RESERVED 64 /* BIT(6) */ +#define SMBIOS_CACHE_LOCATE_UNKNOWN 96 /* (BIT(5) | BIT(6)) */ +#define SMBIOS_CACHE_ENABLED 0x80 /* BIT(7) */ +#define SMBIOS_CACHE_OP_WB 0x100 /* BIT(8), Write Back */ +#define SMBIOS_CACHE_OP_VAR 0x200 /* BIT(9), Varies with Memory Address */ +#define SMBIOS_CACHE_OP_UND 0x300 /* (BIT(8) | BIT(9)), Unknown*/ + +/* Cache Granularity */ +#define SMBIOS_CACHE_GRANU_1K 0 +#define SMBIOS_CACHE_GRANU_64K 1 + +/* Cache Associativity */ +#define SMBIOS_CACHE_ASSOC_OTHER 1 +#define SMBIOS_CACHE_ASSOC_UNKNOWN 2 +#define SMBIOS_CACHE_ASSOC_DMAPPED 3 +#define SMBIOS_CACHE_ASSOC_2WAY 4 +#define SMBIOS_CACHE_ASSOC_4WAY 5 +#define SMBIOS_CACHE_ASSOC_FULLY 6 +#define SMBIOS_CACHE_ASSOC_8WAY 7 +#define SMBIOS_CACHE_ASSOC_16WAY 8 +#define SMBIOS_CACHE_ASSOC_12WAY 9 +#define SMBIOS_CACHE_ASSOC_24WAY 10 +#define SMBIOS_CACHE_ASSOC_32WAY 11 +#define SMBIOS_CACHE_ASSOC_48WAY 12 +#define SMBIOS_CACHE_ASSOC_64WAY 13 +#define SMBIOS_CACHE_ASSOC_20WAY 14 + +#endif /* _SMBIOS_DEF_H_ */ diff --git a/lib/smbios.c b/lib/smbios.c index a36d4b4e54a..1dd564a1762 100644 --- a/lib/smbios.c +++ b/lib/smbios.c @@ -330,10 +330,10 @@ static int smbios_write_type0(ulong *current, int handle, struct smbios_ctx *ctx) { struct smbios_type0 *t; - int len = sizeof(struct smbios_type0); + int len = sizeof(*t); t = map_sysmem(*current, len); - memset(t, 0, sizeof(struct smbios_type0)); + memset(t, 0, len); fill_smbios_header(t, SMBIOS_BIOS_INFORMATION, len, handle); smbios_set_eos(ctx, t->eos); t->vendor = smbios_add_prop(ctx, NULL, "U-Boot"); @@ -374,7 +374,7 @@ static int smbios_write_type0(ulong *current, int handle, t->ec_major_release = 0xff; t->ec_minor_release = 0xff; - len = t->length + smbios_string_table_len(ctx); + len = t->hdr.length + smbios_string_table_len(ctx); *current += len; unmap_sysmem(t); @@ -385,11 +385,11 @@ static int smbios_write_type1(ulong *current, int handle, struct smbios_ctx *ctx) { struct smbios_type1 *t; - int len = sizeof(struct smbios_type1); + int len = sizeof(*t); char *serial_str = env_get("serial#"); t = map_sysmem(*current, len); - memset(t, 0, sizeof(struct smbios_type1)); + memset(t, 0, len); fill_smbios_header(t, SMBIOS_SYSTEM_INFORMATION, len, handle); smbios_set_eos(ctx, t->eos); t->manufacturer = smbios_add_prop_si(ctx, "manufacturer", @@ -403,7 +403,7 @@ static int smbios_write_type1(ulong *current, int handle, NULL); if (serial_str) { t->serial_number = smbios_add_prop(ctx, NULL, serial_str); - strncpy((char *)t->uuid, serial_str, sizeof(t->uuid)); + strlcpy((char *)t->uuid, serial_str, sizeof(t->uuid)); } else { t->serial_number = smbios_add_prop_si(ctx, "serial", SYSID_SM_SYSTEM_SERIAL, @@ -415,7 +415,7 @@ static int smbios_write_type1(ulong *current, int handle, t->family = smbios_add_prop_si(ctx, "family", SYSID_SM_SYSTEM_FAMILY, NULL); - len = t->length + smbios_string_table_len(ctx); + len = t->hdr.length + smbios_string_table_len(ctx); *current += len; unmap_sysmem(t); @@ -426,10 +426,10 @@ static int smbios_write_type2(ulong *current, int handle, struct smbios_ctx *ctx) { struct smbios_type2 *t; - int len = sizeof(struct smbios_type2); + int len = sizeof(*t); t = map_sysmem(*current, len); - memset(t, 0, sizeof(struct smbios_type2)); + memset(t, 0, len); fill_smbios_header(t, SMBIOS_BOARD_INFORMATION, len, handle); smbios_set_eos(ctx, t->eos); t->manufacturer = smbios_add_prop_si(ctx, "manufacturer", @@ -448,11 +448,11 @@ static int smbios_write_type2(ulong *current, int handle, t->asset_tag_number = smbios_add_prop_si(ctx, "asset-tag", SYSID_SM_BASEBOARD_ASSET_TAG, NULL); - t->feature_flags = SMBIOS_BOARD_FEATURE_HOSTING; - t->board_type = SMBIOS_BOARD_MOTHERBOARD; + t->feature_flags = SMBIOS_BOARD_FEAT_HOST_BOARD; + t->board_type = SMBIOS_BOARD_TYPE_MOTHERBOARD; t->chassis_handle = handle + 1; - len = t->length + smbios_string_table_len(ctx); + len = t->hdr.length + smbios_string_table_len(ctx); *current += len; unmap_sysmem(t); @@ -463,10 +463,10 @@ static int smbios_write_type3(ulong *current, int handle, struct smbios_ctx *ctx) { struct smbios_type3 *t; - int len = sizeof(struct smbios_type3); + int len = sizeof(*t); t = map_sysmem(*current, len); - memset(t, 0, sizeof(struct smbios_type3)); + memset(t, 0, len); fill_smbios_header(t, SMBIOS_SYSTEM_ENCLOSURE, len, handle); smbios_set_eos(ctx, t->eos); t->manufacturer = smbios_add_prop(ctx, "manufacturer", NULL); @@ -476,7 +476,7 @@ static int smbios_write_type3(ulong *current, int handle, t->thermal_state = SMBIOS_STATE_SAFE; t->security_status = SMBIOS_SECURITY_NONE; - len = t->length + smbios_string_table_len(ctx); + len = t->hdr.length + smbios_string_table_len(ctx); *current += len; unmap_sysmem(t); @@ -521,10 +521,10 @@ static int smbios_write_type4(ulong *current, int handle, struct smbios_ctx *ctx) { struct smbios_type4 *t; - int len = sizeof(struct smbios_type4); + int len = sizeof(*t); t = map_sysmem(*current, len); - memset(t, 0, sizeof(struct smbios_type4)); + memset(t, 0, len); fill_smbios_header(t, SMBIOS_PROCESSOR_INFORMATION, len, handle); smbios_set_eos(ctx, t->eos); t->processor_type = SMBIOS_PROCESSOR_TYPE_CENTRAL; @@ -535,7 +535,7 @@ static int smbios_write_type4(ulong *current, int handle, t->l2_cache_handle = 0xffff; t->l3_cache_handle = 0xffff; - len = t->length + smbios_string_table_len(ctx); + len = t->hdr.length + smbios_string_table_len(ctx); *current += len; unmap_sysmem(t); @@ -546,10 +546,10 @@ static int smbios_write_type32(ulong *current, int handle, struct smbios_ctx *ctx) { struct smbios_type32 *t; - int len = sizeof(struct smbios_type32); + int len = sizeof(*t); t = map_sysmem(*current, len); - memset(t, 0, sizeof(struct smbios_type32)); + memset(t, 0, len); fill_smbios_header(t, SMBIOS_SYSTEM_BOOT_INFORMATION, len, handle); smbios_set_eos(ctx, t->eos); @@ -563,10 +563,10 @@ static int smbios_write_type127(ulong *current, int handle, struct smbios_ctx *ctx) { struct smbios_type127 *t; - int len = sizeof(struct smbios_type127); + int len = sizeof(*t); t = map_sysmem(*current, len); - memset(t, 0, sizeof(struct smbios_type127)); + memset(t, 0, len); fill_smbios_header(t, SMBIOS_END_OF_TABLE, len, handle); *current += len;
Move the smbios field definitions to a separated simple headfile, which is a prerequisite to be included by dts files. Add new definitions for cache information. This patch also includes a few of code optimizations in smbios. Signed-off-by: Raymond Mao <raymond.mao@linaro.org> --- Changes in v2 - Initial patch. Changes in v3 - Miscellaneous updates. cmd/smbios.c | 4 +- include/smbios.h | 81 +++--------------- include/smbios_def.h | 194 +++++++++++++++++++++++++++++++++++++++++++ lib/smbios.c | 44 +++++----- 4 files changed, 231 insertions(+), 92 deletions(-) create mode 100644 include/smbios_def.h