Files
u-boot/include/smbios.h
Simon Glass 48fefafeff smbios: Add docs for the main types
Add kerneldoc documentation for SMBIOS information structure types:

- Type 0: BIOS Information
- Type 2: Baseboard Information
- Type 3: System Enclosure Information
- Type 4: Processor Information

Add an enum for the enclosure type too.

Co-developed-by: Claude <noreply@anthropic.com>
Signed-off-by: Simon Glass <sjg@chromium.org>
2025-09-04 07:08:24 -06:00

670 lines
20 KiB
C

/* SPDX-License-Identifier: GPL-2.0+ */
/*
* Copyright (C) 2015, Bin Meng <bmeng.cn@gmail.com>
*
* Adapted from coreboot src/include/smbios.h
*/
#ifndef _SMBIOS_H_
#define _SMBIOS_H_
#include <linux/types.h>
#include <smbios_def.h>
/* SMBIOS spec version implemented */
#define SMBIOS_MAJOR_VER 3
#define SMBIOS_MINOR_VER 7
/**
* struct smbios_info - Information about SMBIOS tables
*
* @table: Pointer to the first table
* @count: Number of tables
* @max_size: Maximum size of the tables pointed to by struct_table_address
* @version: table version in the form 0xMMmmrr, where MM is the major version
* number (2 or 3), mm is the minor version number and rr is * the revision
* (always 0 for major-version 2)
*/
struct smbios_info {
struct smbios_header *table;
int count;
int max_size;
int version;
};
enum {
SMBIOS_STR_MAX = 64, /* Maximum length allowed for a string */
};
/* SMBIOS structure types */
enum {
SMBIOS_BIOS_INFORMATION = 0,
SMBIOS_SYSTEM_INFORMATION = 1,
SMBIOS_BOARD_INFORMATION = 2,
SMBIOS_SYSTEM_ENCLOSURE = 3,
SMBIOS_PROCESSOR_INFORMATION = 4,
SMBIOS_CACHE_INFORMATION = 7,
SMBIOS_SYSTEM_SLOTS = 9,
SMBIOS_PHYS_MEMORY_ARRAY = 16,
SMBIOS_MEMORY_DEVICE = 17,
SMBIOS_MEMORY_ARRAY_MAPPED_ADDRESS = 19,
SMBIOS_SYSTEM_BOOT_INFORMATION = 32,
SMBIOS_END_OF_TABLE = 127
};
#define SMBIOS_INTERMEDIATE_OFFSET 16
#define SMBIOS_STRUCT_EOS_BYTES 2
struct str_lookup_table {
u16 idx;
const char *str;
};
/**
* struct smbios_entry - SMBIOS 2.1 (32-bit) Entry Point structure
*
* This structure represents the SMBIOS Entry Point as defined in the
* SMBIOS specification version 2.1+. It serves as the starting point
* for locating SMBIOS tables in system memory.
*
* @anchor: Entry Point Structure anchor string "_SM_"
* @checksum: Checksum of the Entry Point Structure
* @length: Length of the Entry Point Structure, formatted area
* @major_ver: Major version of the SMBIOS specification implemented
* @minor_ver: Minor version of the SMBIOS specification implemented
* @max_struct_size: Size of the largest SMBIOS structure
* @entry_point_rev: Entry Point Structure Revision implemented
* @formatted_area: Reserved formatted area, set to 0
* @intermediate_anchor: Intermediate Entry Point Structure anchor "_DMI_"
* @intermediate_checksum: Checksum of intermediate Entry Point Structure
* @struct_table_length: Total length in bytes of SMBIOS Structure Table
* @struct_table_address: 32-bit physical starting address of table
* @struct_count: Total number of SMBIOS structures present in the table
* @bcd_rev: BCD revision of the SMBIOS specification (e.g. 0x21 for v2.1)
*/
struct __packed smbios_entry {
u8 anchor[4];
u8 checksum;
u8 length;
u8 major_ver;
u8 minor_ver;
u16 max_struct_size;
u8 entry_point_rev;
u8 formatted_area[5];
u8 intermediate_anchor[5];
u8 intermediate_checksum;
u16 struct_table_length;
u32 struct_table_address;
u16 struct_count;
u8 bcd_rev;
};
/**
* struct smbios3_entry - SMBIOS 3.0 (64-bit) Entry Point structure
*
* This structure represents the SMBIOS 3.0+ Entry Point as defined in the
* SMBIOS specification version 3.0+. It provides 64-bit addressing support
* and serves as the starting point for locating SMBIOS tables in memory.
*
* @anchor: Entry Point Structure anchor string "_SM3_"
* @checksum: Checksum of the Entry Point Structure
* @length: Length of the Entry Point Structure
* @major_ver: Major version of the SMBIOS specification implemented
* @minor_ver: Minor version of the SMBIOS specification implemented
* @doc_rev: Revision of the SMBIOS specification document
* @entry_point_rev: Revision of the Entry Point Structure
* @reserved: Reserved field, must be 0
* @table_maximum_size: Maximum size of SMBIOS Structure Table
* @struct_table_address: 64-bit physical starting address of table
*/
struct __packed smbios3_entry {
u8 anchor[5];
u8 checksum;
u8 length;
u8 major_ver;
u8 minor_ver;
u8 doc_rev;
u8 entry_point_rev;
u8 reserved;
u32 table_maximum_size;
u64 struct_table_address;
};
/**
* struct smbios_header - Common header for all SMBIOS structures
*
* This header appears at the beginning of every SMBIOS structure and
* provides basic identification and size information for the structure.
*
* @type: SMBIOS structure type (0-127 for standard types)
* @length: Length of the formatted portion of the structure in bytes
* @handle: Unique 16-bit identifier for this structure instance
*/
struct __packed smbios_header {
u8 type;
u8 length;
u16 handle;
};
/**
* struct smbios_type0 - SMBIOS Type 0 (BIOS Information) structure
*
* This structure contains information about the BIOS/UEFI firmware
* including vendor, version, release date, size, characteristics,
* and version information for both BIOS and embedded controller.
*
* @hdr: Common SMBIOS structure header
* @vendor: String number for BIOS vendor name
* @bios_ver: String number for BIOS version
* @bios_start_segment: Segment location of BIOS starting address
* @bios_release_date: String number for BIOS release date
* @bios_rom_size: Size of BIOS image
* @bios_characteristics: BIOS characteristics bit field
* @bios_characteristics_ext1: BIOS characteristics extension byte 1
* @bios_characteristics_ext2: BIOS characteristics extension byte 2
* @bios_major_release: Major release number of system BIOS
* @bios_minor_release: Minor release number of system BIOS
* @ec_major_release: Major release number of embedded controller
* @ec_minor_release: Minor release number of embedded controller
* @extended_bios_rom_size: Extended size of BIOS image
* @eos: End-of-structure marker (double null bytes)
*/
struct __packed smbios_type0 {
struct smbios_header hdr;
u8 vendor;
u8 bios_ver;
u16 bios_start_segment;
u8 bios_release_date;
u8 bios_rom_size;
u64 bios_characteristics;
u8 bios_characteristics_ext1;
u8 bios_characteristics_ext2;
u8 bios_major_release;
u8 bios_minor_release;
u8 ec_major_release;
u8 ec_minor_release;
u16 extended_bios_rom_size;
char eos[SMBIOS_STRUCT_EOS_BYTES];
};
#define SMBIOS_TYPE1_LENGTH_V20 0x08
#define SMBIOS_TYPE1_LENGTH_V21 0x19
#define SMBIOS_TYPE1_LENGTH_V24 0x1b
/**
* struct smbios_type1 - SMBIOS Type 1 (System Information) structure
*
* This structure contains information that identifies the system as a
* whole. It includes manufacturer, model, version, serial number, UUID,
* and other system-level identification information.
*
* @hdr: Common SMBIOS structure header
* @manufacturer: String number for manufacturer name
* @product_name: String number for product name
* @version: String number for version
* @serial_number: String number for serial number
* @uuid: Universal unique identifier for the system (16 bytes)
* @wakeup_type: Identifies the event that caused the system to power up
* @sku_number: String number for the system SKU
* @family: String number for the family of systems
* @eos: End-of-structure marker (double null bytes)
*/
struct __packed smbios_type1 {
struct smbios_header hdr;
u8 manufacturer;
u8 product_name;
u8 version;
u8 serial_number;
u8 uuid[16];
u8 wakeup_type;
u8 sku_number;
u8 family;
char eos[SMBIOS_STRUCT_EOS_BYTES];
};
#define SMBIOS_TYPE2_CON_OBJ_HANDLE_SIZE sizeof(u16)
/**
* struct smbios_type2 - SMBIOS Type 2 (Baseboard Information) structure
*
* This structure contains information about the motherboard or system
* baseboard including manufacturer, model, serial number, asset tag,
* feature flags, and information about contained objects.
*
* @hdr: Common SMBIOS structure header
* @manufacturer: String number for baseboard manufacturer name
* @product_name: String number for baseboard product name
* @version: String number for baseboard version
* @serial_number: String number for baseboard serial number
* @asset_tag_number: String number for asset tag
* @feature_flags: Collection of flags identifying baseboard features
* @chassis_location: String number describing baseboard location in chassis
* @chassis_handle: Handle of chassis containing this baseboard
* @board_type: Type of board (motherboard, processor card, etc.)
* @number_contained_objects: Number of contained object handles
* @eos: End-of-structure marker (double null bytes)
*
* Note: Dynamic bytes for contained object handles are inserted before @eos
*/
struct __packed smbios_type2 {
struct smbios_header hdr;
u8 manufacturer;
u8 product_name;
u8 version;
u8 serial_number;
u8 asset_tag_number;
u8 feature_flags;
u8 chassis_location;
u16 chassis_handle;
u8 board_type;
u8 number_contained_objects;
/*
* Dynamic bytes will be inserted here to store the objects.
* length is equal to 'number_contained_objects'.
*/
char eos[SMBIOS_STRUCT_EOS_BYTES];
};
/**
* enum smbios_chassis_type - SMBIOS System Enclosure Chassis Types
*
* Defines the standard chassis types as specified in the SMBIOS specification.
* The chassis type indicates the physical characteristics and form factor
* of the system enclosure.
*/
enum smbios_chassis_type {
SMBIOSCH_OTHER = 0x01,
SMBIOSCH_UNKNOWN = 0x02,
SMBIOSCH_DESKTOP = 0x03,
SMBIOSCH_LOW_PROFILE_DESKTOP = 0x04,
SMBIOSCH_PIZZA_BOX = 0x05,
SMBIOSCH_MINI_TOWER = 0x06,
SMBIOSCH_TOWER = 0x07,
SMBIOSCH_PORTABLE = 0x08,
SMBIOSCH_LAPTOP = 0x09,
SMBIOSCH_NOTEBOOK = 0x0a,
SMBIOSCH_HAND_HELD = 0x0b,
SMBIOSCH_DOCKING_STATION = 0x0c,
SMBIOSCH_ALL_IN_ONE = 0x0d,
SMBIOSCH_SUB_NOTEBOOK = 0x0e,
SMBIOSCH_SPACE_SAVING = 0x0f,
SMBIOSCH_LUNCH_BOX = 0x10,
SMBIOSCH_MAIN_SERVER = 0x11,
SMBIOSCH_EXPANSION = 0x12,
SMBIOSCH_SUB_CHASSIS = 0x13,
SMBIOSCH_BUS_EXPANSION = 0x14,
SMBIOSCH_PERIPHERAL = 0x15,
SMBIOSCH_RAID = 0x16,
SMBIOSCH_RACK_MOUNT = 0x17,
SMBIOSCH_SEALED_CASE_PC = 0x18,
SMBIOSCH_MULTI_SYSTEM = 0x19,
SMBIOSCH_COMPACT_PCI = 0x1a,
SMBIOSCH_ADVANCED_TCA = 0x1b,
SMBIOSCH_BLADE = 0x1c,
SMBIOSCH_BLADE_ENCLOSURE = 0x1d,
SMBIOSCH_TABLET = 0x1e,
SMBIOSCH_CONVERTIBLE = 0x1f,
SMBIOSCH_DETACHABLE = 0x20,
SMBIOSCH_IOT_GATEWAY = 0x21,
SMBIOSCH_EMBEDDED_PC = 0x22,
SMBIOSCH_MINI_PC = 0x23,
SMBIOSCH_STICK_PC = 0x24,
};
/**
* struct smbios_type3 - SMBIOS Type 3 (System Enclosure) structure
*
* This structure contains information about the system enclosure or chassis
* including manufacturer, type, version, serial number, asset tag, power
* states, thermal state, security status, and physical characteristics.
*
* @hdr: Common SMBIOS structure header
* @manufacturer: String number for chassis manufacturer name
* @chassis_type: Type of chassis (desktop, laptop, server, etc.)
* @version: String number for chassis version
* @serial_number: String number for chassis serial number
* @asset_tag_number: String number for asset tag
* @bootup_state: State of enclosure when last booted
* @power_supply_state: State of enclosure's power supply
* @thermal_state: Thermal state of the enclosure
* @security_status: Physical security status of the enclosure
* @oem_defined: OEM or BIOS vendor-specific information
* @height: Height of enclosure in 'U's (rack units)
* @number_of_power_cords: Number of power cords associated with enclosure
* @element_count: Number of contained element records
* @element_record_length: Length of each contained element record
* @sku_number: String number for chassis or enclosure SKU number
* @eos: End-of-structure marker (double null bytes)
*
* Note: Dynamic bytes for contained elements are inserted before @sku_number
*/
struct __packed smbios_type3 {
struct smbios_header hdr;
u8 manufacturer;
u8 chassis_type;
u8 version;
u8 serial_number;
u8 asset_tag_number;
u8 bootup_state;
u8 power_supply_state;
u8 thermal_state;
u8 security_status;
u32 oem_defined;
u8 height;
u8 number_of_power_cords;
u8 element_count;
u8 element_record_length;
/*
* Dynamic bytes will be inserted here to store the elements.
* length is equal to 'element_record_length' * 'element_record_length'
*/
u8 sku_number;
char eos[SMBIOS_STRUCT_EOS_BYTES];
};
/**
* struct smbios_type4 - SMBIOS Type 4 (Processor Information) structure
*
* This structure contains information about installed processors including
* manufacturer, family, model, speed, cache handles, core/thread counts,
* and other processor-specific characteristics and capabilities.
*
* @hdr: Common SMBIOS structure header
* @socket_design: String number for socket designation
* @processor_type: Type of processor (CPU, math processor, DSP, etc.)
* @processor_family: Processor family information
* @processor_manufacturer: String number for processor manufacturer
* @processor_id: Processor identification information (2 DWORDs)
* @processor_version: String number for processor version
* @voltage: Voltage of the processor
* @external_clock: External clock frequency in MHz
* @max_speed: Maximum processor speed in MHz
* @current_speed: Current processor speed in MHz
* @status: Processor status information
* @processor_upgrade: Processor socket type
* @l1_cache_handle: Handle of L1 cache information
* @l2_cache_handle: Handle of L2 cache information
* @l3_cache_handle: Handle of L3 cache information
* @serial_number: String number for processor serial number
* @asset_tag: String number for asset tag
* @part_number: String number for processor part number
* @core_count: Number of cores per processor socket
* @core_enabled: Number of enabled cores per processor socket
* @thread_count: Number of threads per processor socket
* @processor_characteristics: Processor characteristics
* @processor_family2: Extended processor family information
* @core_count2: Extended number of cores per processor socket
* @core_enabled2: Extended number of enabled cores per processor socket
* @thread_count2: Extended number of threads per processor socket
* @thread_enabled: Number of enabled threads per processor socket
* @eos: End-of-structure marker (double null bytes)
*/
struct __packed smbios_type4 {
struct smbios_header hdr;
u8 socket_design;
u8 processor_type;
u8 processor_family;
u8 processor_manufacturer;
u32 processor_id[2];
u8 processor_version;
u8 voltage;
u16 external_clock;
u16 max_speed;
u16 current_speed;
u8 status;
u8 processor_upgrade;
u16 l1_cache_handle;
u16 l2_cache_handle;
u16 l3_cache_handle;
u8 serial_number;
u8 asset_tag;
u8 part_number;
u8 core_count;
u8 core_enabled;
u8 thread_count;
u16 processor_characteristics;
u16 processor_family2;
u16 core_count2;
u16 core_enabled2;
u16 thread_count2;
u16 thread_enabled;
char eos[SMBIOS_STRUCT_EOS_BYTES];
};
union cache_config {
struct {
u16 level:3;
u16 bsocketed:1;
u16 rsvd0:1;
u16 locate:2;
u16 benabled:1;
u16 opmode:2;
u16 rsvd1:6;
} fields;
u16 data;
};
union cache_size_word {
struct {
u16 size:15;
u16 granu:1;
} fields;
u16 data;
};
union cache_size_dword {
struct {
u32 size:31;
u32 granu:1;
} fields;
u32 data;
};
union cache_sram_type {
struct {
u16 other:1;
u16 unknown:1;
u16 nonburst:1;
u16 burst:1;
u16 plburst:1;
u16 sync:1;
u16 async:1;
u16 rsvd:9;
} fields;
u16 data;
};
struct __packed smbios_type7 {
struct smbios_header hdr;
u8 socket_design;
union cache_config config;
union cache_size_word max_size;
union cache_size_word inst_size;
union cache_sram_type supp_sram_type;
union cache_sram_type curr_sram_type;
u8 speed;
u8 err_corr_type;
u8 sys_cache_type;
u8 associativity;
union cache_size_dword max_size2;
union cache_size_dword inst_size2;
char eos[SMBIOS_STRUCT_EOS_BYTES];
};
struct __packed smbios_type16 {
struct smbios_header hdr;
u8 location;
u8 use;
u8 error_correction;
u32 maximum_capacity;
u16 error_information_handle;
u16 number_of_memory_devices;
/* The following field is only present in SMBIOS v2.7+ */
u64 extended_maximum_capacity;
char eos[SMBIOS_STRUCT_EOS_BYTES];
};
struct __packed smbios_type19 {
struct smbios_header hdr;
u32 starting_address;
u32 ending_address;
u16 memory_array_handle;
u8 partition_width;
/* The following fields are only present in SMBIOS v2.7+ */
u64 extended_starting_address;
u64 extended_ending_address;
char eos[SMBIOS_STRUCT_EOS_BYTES];
};
struct __packed smbios_type32 {
u8 type;
u8 length;
u16 handle;
u8 reserved[6];
u8 boot_status;
char eos[SMBIOS_STRUCT_EOS_BYTES];
};
struct __packed smbios_type127 {
u8 type;
u8 length;
u16 handle;
char eos[SMBIOS_STRUCT_EOS_BYTES];
};
/**
* fill_smbios_header() - Fill the header of an SMBIOS table
*
* This fills the header of an SMBIOS table structure.
*
* @table: start address of the structure
* @type: the type of structure
* @length: the length of the formatted area of the structure
* @handle: the structure's handle, a unique 16-bit number
*/
static inline void fill_smbios_header(void *table, int type,
int length, int handle)
{
struct smbios_header *header = table;
header->type = type;
header->length = length - SMBIOS_STRUCT_EOS_BYTES;
header->handle = handle;
}
/**
* write_smbios_table() - Write SMBIOS table
*
* This writes SMBIOS table at a given address.
*
* @addr: start address to write SMBIOS table, 16-byte-alignment
* recommended. Note that while the SMBIOS tables themself have no alignment
* requirement, some systems may requires alignment. For example x86 systems
* which put tables at f0000 require 16-byte alignment
*
* Return: end address of SMBIOS table (and start address for next entry)
* or NULL in case of an error
*/
ulong write_smbios_table(ulong addr);
/**
* smbios_entry() - Get a valid struct smbios_entry pointer
*
* @address: address where smbios tables is located
* @size: size of smbios table
* @return: NULL or a valid pointer to a struct smbios_entry
*/
const struct smbios_entry *smbios_entry(u64 address, u32 size);
/**
* smbios_get_header() - Search for an SMBIOS header type
*
* @info: SMBIOS info
* @type: SMBIOS type
* @return: NULL or a valid pointer to a struct smbios_header
*/
const void *smbios_get_header(const struct smbios_info *info, int type);
/**
* smbios_string() - Return string from SMBIOS
*
* @header: pointer to struct smbios_header
* @index: string index
* @return: NULL or a valid char pointer
*/
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);
/**
* smbios_update_version_full() - 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).
* It scans for the correct place to put the version, so does not need U-Boot
* to have actually written the tables itself (e.g. if a previous bootloader
* did it).
*
* @smbios_tab: Start of SMBIOS tables
* @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_full(void *smbios_tab, const char *version);
/**
* smbios_prepare_measurement() - Update smbios table for the measurement
*
* TCG specification requires to measure static configuration information.
* This function clear the device dependent parameters such as
* serial number for the measurement.
*
* @entry: pointer to a struct smbios3_entry
* @header: pointer to a struct smbios_header
* @table_maximum_size: number of bytes used by the tables at @header
*/
void smbios_prepare_measurement(const struct smbios3_entry *entry,
struct smbios_header *smbios_copy,
int table_maximum_size);
/**
* smbios_get_string() - get SMBIOS string from table
*
* @table: SMBIOS table
* @index: index of the string
* Return: address of string, may point to empty string
*/
const char *smbios_get_string(void *table, int index);
/**
* smbios_next_table() - Find the next table
*
* @info: SMBIOS info
* @table: Table to start from
* Return: Pointer to the next table, or NULL if @table is the last
*/
struct smbios_header *smbios_next_table(const struct smbios_info *info,
struct smbios_header *table);
/**
* smbios_locate() - Locate the SMBIOS tables
*
* @addr: Address of SMBIOS table, typically gd_smbios_start()
* @info: Returns the SMBIOS info, on success
* Return: 0 if OK, -EINVAL if the address is 0, -NOENT if the header signature
* is not recognised, -EIO if the checksum is wrong
*/
int smbios_locate(ulong addr, struct smbios_info *info);
#endif /* _SMBIOS_H_ */