[PATCH 03/10] smbios: Refactor SMBIOS library

Michal Simek michal.simek at amd.com
Mon Aug 26 11:34:00 CEST 2024



On 8/16/24 17:46, Raymond Mao wrote:
> Current SMBIOS library does not fully match to the specification.
> It hardcodes values instead of exposing values from the device.
> It does not support dynamic length for contained object handles
> or elements and misses the handling of a few fields.
> 
> The refactoring of this patch includes:
> 1. Expose values from device via sysinfo interface.
> 2. Replace smbios_add_prop with smbios_add_prop_si to allow getting
>     string values from sysinfo.
> 3. Add smbios_get_val_si to get int values from sysinfo.
> 4. Use sysinfo_get_data to get data area like contained object
>     handles, elements or processor id.
> 5. Refactor SMBIOS cmd print functions to match the command output
>     with the specification
> 6. Add new print functions for Type 0, 3 and 4.
> 7. Miscellaneous fixes in SMBIOS.
> 
> Signed-off-by: Raymond Mao <raymond.mao at linaro.org>
> ---
>   cmd/smbios.c     | 268 +++++++++++++++++++++++++++++++++--
>   include/smbios.h | 116 +++++++++++----
>   lib/smbios.c     | 358 ++++++++++++++++++++++++++++++++++++++---------
>   3 files changed, 632 insertions(+), 110 deletions(-)
> 
> diff --git a/cmd/smbios.c b/cmd/smbios.c
> index d3bd8b12a67..8e2bf46a09c 100644
> --- a/cmd/smbios.c
> +++ b/cmd/smbios.c
> @@ -26,6 +26,71 @@ static const char * const wakeup_type_strings[] = {
>   	"AC Power Restored",	/* 0x08 */
>   };
>   
> +static const char * const boardtype_strings[] = {
> +	"Reserved",			/* 0x00 */
> +	"Unknown",			/* 0x01 */
> +	"Other",			/* 0x02 */
> +	"Server Blade",			/* 0x03 */
> +	"Connectivity Switch",		/* 0x04 */
> +	"System Management Module",	/* 0x05 */
> +	"Processor Module",		/* 0x06 */
> +	"I/O Module",			/* 0x07 */
> +	"Memory Module",		/* 0x08 */
> +	"Daughter board",		/* 0x09 */
> +	"Motherboard",			/* 0x0a */
> +	"Processor/Memory Module",	/* 0x0b */
> +	"Processor/IO Module",		/* 0x0c */
> +	"Interconnect board",		/* 0x0d */
> +};
> +
> +static const char * const chassis_state_strings[] = {
> +	"Reserved",			/* 0x00 */
> +	"Other",			/* 0x01 */
> +	"Unknown",			/* 0x02 */
> +	"Safe",				/* 0x03 */
> +	"Warning",			/* 0x04 */
> +	"Critical",			/* 0x05 */
> +	"Non-recoverable",		/* 0x06 */
> +};
> +
> +static const char * const chassis_security_strings[] = {
> +	"Reserved",			/* 0x00 */
> +	"Other",			/* 0x01 */
> +	"Unknown",			/* 0x02 */
> +	"None",				/* 0x03 */
> +	"External interface locked out",/* 0x04 */
> +	"External interface enabled",	/* 0x05 */
> +};
> +
> +static const char * const processor_type_strings[] = {
> +	"Reserved",			/* 0x00 */
> +	"Other",			/* 0x01 */
> +	"Unknown",			/* 0x02 */
> +	"Central Processor",		/* 0x03 */
> +	"Math Processor",		/* 0x04 */
> +	"DSP Processor",		/* 0x05 */
> +	"Video Processor",		/* 0x06 */
> +};
> +
> +static const char * const processor_family_strings[] = {
> +	[0] = "Other",
> +	[1] = "Unknown",
> +	[2 ... 253] = "Other", /* skip these definitions from now */
> +	[254] = "Refer to 'Processor Family 2'",
> +	[255] = "Reserved",
> +	[256] = "ARMv7",
> +	[257] = "ARMv8",
> +};
> +
> +static const char * const processor_upgrade_strings[] = {
> +	[0] = "Reserved",
> +	[1] = "Other",
> +	[2] = "Unknown",
> +	[3 ... 5] = "Other", /* skip these definitions from now */
> +	[6] = "None",
> +	[7 ... 80] = "Other", /* skip these definitions from now */
> +};
> +
>   /**
>    * smbios_get_string() - get SMBIOS string from table
>    *
> @@ -92,6 +157,32 @@ const char *smbios_wakeup_type_str(u8 wakeup_type)
>   	return wakeup_type_strings[wakeup_type];
>   }
>   
> +static void smbios_print_type0(struct smbios_type0 *table)
> +{
> +	printf("BIOS Information\n");
> +	smbios_print_str("Vendor", table, table->vendor);
> +	smbios_print_str("BIOS Version", table, table->bios_ver);
> +	/* Keep table->bios_start_segment as 0 for UEFI-based systems */
> +	smbios_print_str("BIOS Release Date", table, table->bios_release_date);
> +	printf("\tBIOS ROM Size: 0x%02x\n", table->bios_rom_size);
> +	printf("\tBIOS Characteristics: 0x%016llx\n",
> +	       table->bios_characteristics);
> +	printf("\tBIOS Characteristics Extension Byte 1: 0x%02x\n",
> +	       table->bios_characteristics_ext1);
> +	printf("\tBIOS Characteristics Extension Byte 2: 0x%02x\n",
> +	       table->bios_characteristics_ext2);
> +	printf("\tSystem BIOS Major Release: 0x%02x\n",
> +	       table->bios_major_release);
> +	printf("\tSystem BIOS Minor Release: 0x%02x\n",
> +	       table->bios_minor_release);
> +	printf("\tEmbedded Controller Firmware Major Release: 0x%02x\n",
> +	       table->ec_major_release);
> +	printf("\tEmbedded Controller Firmware Minor Release: 0x%02x\n",
> +	       table->ec_minor_release);
> +	printf("\tExtended BIOS ROM Size: 0x%04x\n",
> +	       table->extended_bios_rom_size);
> +}
> +
>   static void smbios_print_type1(struct smbios_type1 *table)
>   {
>   	printf("System Information\n");
> @@ -99,38 +190,180 @@ 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);
>   	}
>   }
>   
> +const char *smbios_baseboard_type_str(u8 borad_type)

typo board_type


> +{
> +	if (borad_type >= ARRAY_SIZE(boardtype_strings))
> +		borad_type = 0;

newline but is 0 proper here? It means Reserved. Shouldn't be Unknown?


> +	return boardtype_strings[borad_type];
> +}
> +
>   static void smbios_print_type2(struct smbios_type2 *table)
>   {
> -	u16 *handle;
> +	int i;
> +	u8 *addr = (u8 *)table + offsetof(struct smbios_type2, eos);
>   
> -	printf("Base Board Information\n");
> +	printf("Baseboard Information\n");
>   	smbios_print_str("Manufacturer", table, table->manufacturer);
>   	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);
>   	smbios_print_str("Asset Tag", table, table->asset_tag_number);
> -	printf("\tFeature Flags: 0x%04x\n", table->feature_flags);
> +	printf("\tFeature Flags: 0x%02x\n", table->feature_flags);
>   	smbios_print_str("Chassis Location", table, table->chassis_location);
>   	printf("\tChassis Handle: 0x%04x\n", table->chassis_handle);
> -	smbios_print_str("Board Type", table, table->board_type);
> -	printf("\tContained Object Handles: ");
> -	handle = (void *)table->eos;
> -	for (int i = 0; i < table->number_contained_objects; ++i)
> -		printf("0x%04x ", handle[i]);
> +	printf("\tBoard Type: %s\n",
> +	       smbios_baseboard_type_str(table->board_type));
> +	printf("\tNumber of Contained Object Handles: 0x%02x\n",
> +	       table->number_contained_objects);
> +	if (!table->number_contained_objects)
> +		return;
> +
> +	printf("\tContained Object Handles:\n");
> +	for (i = 0; i < table->number_contained_objects; i++) {
> +		printf("\t\tObject[%03d]:\n", i);
> +		if (CONFIG_IS_ENABLED(HEXDUMP))
> +			print_hex_dump("\t\t", DUMP_PREFIX_OFFSET, 16, 1, addr,
> +				       sizeof(u16), false);
> +		addr += sizeof(u16);
> +	}
>   	printf("\n");
>   }
>   
> +const char *smbios_chassis_state_str(u8 state)
> +{
> +	if (state >= ARRAY_SIZE(chassis_state_strings))
> +		state = 0;

newline and same as above.

> +	return chassis_state_strings[state];
> +}
> +
> +const char *smbios_chassis_security_str(u8 status)
> +{
> +	if (status >= ARRAY_SIZE(chassis_security_strings))
> +		status = 0;

ditto.

M


More information about the U-Boot mailing list