14b6dddc2SAlexander Graf /* 24b6dddc2SAlexander Graf * Copyright (C) 2015, Bin Meng <bmeng.cn@gmail.com> 34b6dddc2SAlexander Graf * 44b6dddc2SAlexander Graf * Adapted from coreboot src/include/smbios.h 54b6dddc2SAlexander Graf * 64b6dddc2SAlexander Graf * SPDX-License-Identifier: GPL-2.0+ 74b6dddc2SAlexander Graf */ 84b6dddc2SAlexander Graf 94b6dddc2SAlexander Graf #ifndef _SMBIOS_H_ 104b6dddc2SAlexander Graf #define _SMBIOS_H_ 114b6dddc2SAlexander Graf 124b6dddc2SAlexander Graf /* SMBIOS spec version implemented */ 134b6dddc2SAlexander Graf #define SMBIOS_MAJOR_VER 3 144b6dddc2SAlexander Graf #define SMBIOS_MINOR_VER 0 154b6dddc2SAlexander Graf 164b6dddc2SAlexander Graf /* SMBIOS structure types */ 174b6dddc2SAlexander Graf enum { 184b6dddc2SAlexander Graf SMBIOS_BIOS_INFORMATION = 0, 194b6dddc2SAlexander Graf SMBIOS_SYSTEM_INFORMATION = 1, 204b6dddc2SAlexander Graf SMBIOS_BOARD_INFORMATION = 2, 214b6dddc2SAlexander Graf SMBIOS_SYSTEM_ENCLOSURE = 3, 224b6dddc2SAlexander Graf SMBIOS_PROCESSOR_INFORMATION = 4, 234b6dddc2SAlexander Graf SMBIOS_CACHE_INFORMATION = 7, 244b6dddc2SAlexander Graf SMBIOS_SYSTEM_SLOTS = 9, 254b6dddc2SAlexander Graf SMBIOS_PHYS_MEMORY_ARRAY = 16, 264b6dddc2SAlexander Graf SMBIOS_MEMORY_DEVICE = 17, 274b6dddc2SAlexander Graf SMBIOS_MEMORY_ARRAY_MAPPED_ADDRESS = 19, 284b6dddc2SAlexander Graf SMBIOS_SYSTEM_BOOT_INFORMATION = 32, 294b6dddc2SAlexander Graf SMBIOS_END_OF_TABLE = 127 304b6dddc2SAlexander Graf }; 314b6dddc2SAlexander Graf 324b6dddc2SAlexander Graf #define SMBIOS_INTERMEDIATE_OFFSET 16 334b6dddc2SAlexander Graf #define SMBIOS_STRUCT_EOS_BYTES 2 344b6dddc2SAlexander Graf 354b6dddc2SAlexander Graf struct __packed smbios_entry { 364b6dddc2SAlexander Graf u8 anchor[4]; 374b6dddc2SAlexander Graf u8 checksum; 384b6dddc2SAlexander Graf u8 length; 394b6dddc2SAlexander Graf u8 major_ver; 404b6dddc2SAlexander Graf u8 minor_ver; 414b6dddc2SAlexander Graf u16 max_struct_size; 424b6dddc2SAlexander Graf u8 entry_point_rev; 434b6dddc2SAlexander Graf u8 formatted_area[5]; 444b6dddc2SAlexander Graf u8 intermediate_anchor[5]; 454b6dddc2SAlexander Graf u8 intermediate_checksum; 464b6dddc2SAlexander Graf u16 struct_table_length; 474b6dddc2SAlexander Graf u32 struct_table_address; 484b6dddc2SAlexander Graf u16 struct_count; 494b6dddc2SAlexander Graf u8 bcd_rev; 504b6dddc2SAlexander Graf }; 514b6dddc2SAlexander Graf 524b6dddc2SAlexander Graf /* BIOS characteristics */ 534b6dddc2SAlexander Graf #define BIOS_CHARACTERISTICS_PCI_SUPPORTED (1 << 7) 544b6dddc2SAlexander Graf #define BIOS_CHARACTERISTICS_UPGRADEABLE (1 << 11) 554b6dddc2SAlexander Graf #define BIOS_CHARACTERISTICS_SELECTABLE_BOOT (1 << 16) 564b6dddc2SAlexander Graf 574b6dddc2SAlexander Graf #define BIOS_CHARACTERISTICS_EXT1_ACPI (1 << 0) 584b6dddc2SAlexander Graf #define BIOS_CHARACTERISTICS_EXT2_TARGET (1 << 2) 594b6dddc2SAlexander Graf 604b6dddc2SAlexander Graf struct __packed smbios_type0 { 614b6dddc2SAlexander Graf u8 type; 624b6dddc2SAlexander Graf u8 length; 634b6dddc2SAlexander Graf u16 handle; 644b6dddc2SAlexander Graf u8 vendor; 654b6dddc2SAlexander Graf u8 bios_ver; 664b6dddc2SAlexander Graf u16 bios_start_segment; 674b6dddc2SAlexander Graf u8 bios_release_date; 684b6dddc2SAlexander Graf u8 bios_rom_size; 694b6dddc2SAlexander Graf u64 bios_characteristics; 704b6dddc2SAlexander Graf u8 bios_characteristics_ext1; 714b6dddc2SAlexander Graf u8 bios_characteristics_ext2; 724b6dddc2SAlexander Graf u8 bios_major_release; 734b6dddc2SAlexander Graf u8 bios_minor_release; 744b6dddc2SAlexander Graf u8 ec_major_release; 754b6dddc2SAlexander Graf u8 ec_minor_release; 764b6dddc2SAlexander Graf char eos[SMBIOS_STRUCT_EOS_BYTES]; 774b6dddc2SAlexander Graf }; 784b6dddc2SAlexander Graf 794b6dddc2SAlexander Graf struct __packed smbios_type1 { 804b6dddc2SAlexander Graf u8 type; 814b6dddc2SAlexander Graf u8 length; 824b6dddc2SAlexander Graf u16 handle; 834b6dddc2SAlexander Graf u8 manufacturer; 844b6dddc2SAlexander Graf u8 product_name; 854b6dddc2SAlexander Graf u8 version; 864b6dddc2SAlexander Graf u8 serial_number; 874b6dddc2SAlexander Graf u8 uuid[16]; 884b6dddc2SAlexander Graf u8 wakeup_type; 894b6dddc2SAlexander Graf u8 sku_number; 904b6dddc2SAlexander Graf u8 family; 914b6dddc2SAlexander Graf char eos[SMBIOS_STRUCT_EOS_BYTES]; 924b6dddc2SAlexander Graf }; 934b6dddc2SAlexander Graf 944b6dddc2SAlexander Graf #define SMBIOS_BOARD_FEATURE_HOSTING (1 << 0) 954b6dddc2SAlexander Graf #define SMBIOS_BOARD_MOTHERBOARD 10 964b6dddc2SAlexander Graf 974b6dddc2SAlexander Graf struct __packed smbios_type2 { 984b6dddc2SAlexander Graf u8 type; 994b6dddc2SAlexander Graf u8 length; 1004b6dddc2SAlexander Graf u16 handle; 1014b6dddc2SAlexander Graf u8 manufacturer; 1024b6dddc2SAlexander Graf u8 product_name; 1034b6dddc2SAlexander Graf u8 version; 1044b6dddc2SAlexander Graf u8 serial_number; 1054b6dddc2SAlexander Graf u8 asset_tag_number; 1064b6dddc2SAlexander Graf u8 feature_flags; 1074b6dddc2SAlexander Graf u8 chassis_location; 1084b6dddc2SAlexander Graf u16 chassis_handle; 1094b6dddc2SAlexander Graf u8 board_type; 1104b6dddc2SAlexander Graf char eos[SMBIOS_STRUCT_EOS_BYTES]; 1114b6dddc2SAlexander Graf }; 1124b6dddc2SAlexander Graf 1134b6dddc2SAlexander Graf #define SMBIOS_ENCLOSURE_DESKTOP 3 1144b6dddc2SAlexander Graf #define SMBIOS_STATE_SAFE 3 1154b6dddc2SAlexander Graf #define SMBIOS_SECURITY_NONE 3 1164b6dddc2SAlexander Graf 1174b6dddc2SAlexander Graf struct __packed smbios_type3 { 1184b6dddc2SAlexander Graf u8 type; 1194b6dddc2SAlexander Graf u8 length; 1204b6dddc2SAlexander Graf u16 handle; 1214b6dddc2SAlexander Graf u8 manufacturer; 1224b6dddc2SAlexander Graf u8 chassis_type; 1234b6dddc2SAlexander Graf u8 version; 1244b6dddc2SAlexander Graf u8 serial_number; 1254b6dddc2SAlexander Graf u8 asset_tag_number; 1264b6dddc2SAlexander Graf u8 bootup_state; 1274b6dddc2SAlexander Graf u8 power_supply_state; 1284b6dddc2SAlexander Graf u8 thermal_state; 1294b6dddc2SAlexander Graf u8 security_status; 1304b6dddc2SAlexander Graf u32 oem_defined; 1314b6dddc2SAlexander Graf u8 height; 1324b6dddc2SAlexander Graf u8 number_of_power_cords; 1334b6dddc2SAlexander Graf u8 element_count; 1344b6dddc2SAlexander Graf u8 element_record_length; 1354b6dddc2SAlexander Graf char eos[SMBIOS_STRUCT_EOS_BYTES]; 1364b6dddc2SAlexander Graf }; 1374b6dddc2SAlexander Graf 1384b6dddc2SAlexander Graf #define SMBIOS_PROCESSOR_TYPE_CENTRAL 3 1394b6dddc2SAlexander Graf #define SMBIOS_PROCESSOR_STATUS_ENABLED 1 1404b6dddc2SAlexander Graf #define SMBIOS_PROCESSOR_UPGRADE_NONE 6 1414b6dddc2SAlexander Graf 1424b6dddc2SAlexander Graf struct __packed smbios_type4 { 1434b6dddc2SAlexander Graf u8 type; 1444b6dddc2SAlexander Graf u8 length; 1454b6dddc2SAlexander Graf u16 handle; 1464b6dddc2SAlexander Graf u8 socket_designation; 1474b6dddc2SAlexander Graf u8 processor_type; 1484b6dddc2SAlexander Graf u8 processor_family; 1494b6dddc2SAlexander Graf u8 processor_manufacturer; 1504b6dddc2SAlexander Graf u32 processor_id[2]; 1514b6dddc2SAlexander Graf u8 processor_version; 1524b6dddc2SAlexander Graf u8 voltage; 1534b6dddc2SAlexander Graf u16 external_clock; 1544b6dddc2SAlexander Graf u16 max_speed; 1554b6dddc2SAlexander Graf u16 current_speed; 1564b6dddc2SAlexander Graf u8 status; 1574b6dddc2SAlexander Graf u8 processor_upgrade; 1584b6dddc2SAlexander Graf u16 l1_cache_handle; 1594b6dddc2SAlexander Graf u16 l2_cache_handle; 1604b6dddc2SAlexander Graf u16 l3_cache_handle; 1614b6dddc2SAlexander Graf u8 serial_number; 1624b6dddc2SAlexander Graf u8 asset_tag; 1634b6dddc2SAlexander Graf u8 part_number; 1644b6dddc2SAlexander Graf u8 core_count; 1654b6dddc2SAlexander Graf u8 core_enabled; 1664b6dddc2SAlexander Graf u8 thread_count; 1674b6dddc2SAlexander Graf u16 processor_characteristics; 1684b6dddc2SAlexander Graf u16 processor_family2; 1694b6dddc2SAlexander Graf u16 core_count2; 1704b6dddc2SAlexander Graf u16 core_enabled2; 1714b6dddc2SAlexander Graf u16 thread_count2; 1724b6dddc2SAlexander Graf char eos[SMBIOS_STRUCT_EOS_BYTES]; 1734b6dddc2SAlexander Graf }; 1744b6dddc2SAlexander Graf 1754b6dddc2SAlexander Graf struct __packed smbios_type32 { 1764b6dddc2SAlexander Graf u8 type; 1774b6dddc2SAlexander Graf u8 length; 1784b6dddc2SAlexander Graf u16 handle; 1794b6dddc2SAlexander Graf u8 reserved[6]; 1804b6dddc2SAlexander Graf u8 boot_status; 1814b6dddc2SAlexander Graf u8 eos[SMBIOS_STRUCT_EOS_BYTES]; 1824b6dddc2SAlexander Graf }; 1834b6dddc2SAlexander Graf 1844b6dddc2SAlexander Graf struct __packed smbios_type127 { 1854b6dddc2SAlexander Graf u8 type; 1864b6dddc2SAlexander Graf u8 length; 1874b6dddc2SAlexander Graf u16 handle; 1884b6dddc2SAlexander Graf u8 eos[SMBIOS_STRUCT_EOS_BYTES]; 1894b6dddc2SAlexander Graf }; 1904b6dddc2SAlexander Graf 1914b6dddc2SAlexander Graf struct __packed smbios_header { 1924b6dddc2SAlexander Graf u8 type; 1934b6dddc2SAlexander Graf u8 length; 1944b6dddc2SAlexander Graf u16 handle; 1954b6dddc2SAlexander Graf }; 1964b6dddc2SAlexander Graf 1974b6dddc2SAlexander Graf /** 1984b6dddc2SAlexander Graf * fill_smbios_header() - Fill the header of an SMBIOS table 1994b6dddc2SAlexander Graf * 2004b6dddc2SAlexander Graf * This fills the header of an SMBIOS table structure. 2014b6dddc2SAlexander Graf * 2024b6dddc2SAlexander Graf * @table: start address of the structure 2034b6dddc2SAlexander Graf * @type: the type of structure 2044b6dddc2SAlexander Graf * @length: the length of the formatted area of the structure 2054b6dddc2SAlexander Graf * @handle: the structure's handle, a unique 16-bit number 2064b6dddc2SAlexander Graf */ 2074b6dddc2SAlexander Graf static inline void fill_smbios_header(void *table, int type, 2084b6dddc2SAlexander Graf int length, int handle) 2094b6dddc2SAlexander Graf { 2104b6dddc2SAlexander Graf struct smbios_header *header = table; 2114b6dddc2SAlexander Graf 2124b6dddc2SAlexander Graf header->type = type; 2134b6dddc2SAlexander Graf header->length = length - SMBIOS_STRUCT_EOS_BYTES; 2144b6dddc2SAlexander Graf header->handle = handle; 2154b6dddc2SAlexander Graf } 2164b6dddc2SAlexander Graf 2174b6dddc2SAlexander Graf /** 2184b6dddc2SAlexander Graf * Function prototype to write a specific type of SMBIOS structure 2194b6dddc2SAlexander Graf * 2204b6dddc2SAlexander Graf * @addr: start address to write the structure 2214b6dddc2SAlexander Graf * @handle: the structure's handle, a unique 16-bit number 2224b6dddc2SAlexander Graf * @return: size of the structure 2234b6dddc2SAlexander Graf */ 224*e824cf3fSAlexander Graf typedef int (*smbios_write_type)(uintptr_t *addr, int handle); 2254b6dddc2SAlexander Graf 2264b6dddc2SAlexander Graf /** 2274b6dddc2SAlexander Graf * write_smbios_table() - Write SMBIOS table 2284b6dddc2SAlexander Graf * 2294b6dddc2SAlexander Graf * This writes SMBIOS table at a given address. 2304b6dddc2SAlexander Graf * 2314b6dddc2SAlexander Graf * @addr: start address to write SMBIOS table 2324b6dddc2SAlexander Graf * @return: end address of SMBIOS table 2334b6dddc2SAlexander Graf */ 234*e824cf3fSAlexander Graf uintptr_t write_smbios_table(uintptr_t addr); 2354b6dddc2SAlexander Graf 2364b6dddc2SAlexander Graf #endif /* _SMBIOS_H_ */ 237