1*4b6dddc2SAlexander Graf /* 2*4b6dddc2SAlexander Graf * Copyright (C) 2015, Bin Meng <bmeng.cn@gmail.com> 3*4b6dddc2SAlexander Graf * 4*4b6dddc2SAlexander Graf * Adapted from coreboot src/include/smbios.h 5*4b6dddc2SAlexander Graf * 6*4b6dddc2SAlexander Graf * SPDX-License-Identifier: GPL-2.0+ 7*4b6dddc2SAlexander Graf */ 8*4b6dddc2SAlexander Graf 9*4b6dddc2SAlexander Graf #ifndef _SMBIOS_H_ 10*4b6dddc2SAlexander Graf #define _SMBIOS_H_ 11*4b6dddc2SAlexander Graf 12*4b6dddc2SAlexander Graf /* SMBIOS spec version implemented */ 13*4b6dddc2SAlexander Graf #define SMBIOS_MAJOR_VER 3 14*4b6dddc2SAlexander Graf #define SMBIOS_MINOR_VER 0 15*4b6dddc2SAlexander Graf 16*4b6dddc2SAlexander Graf /* SMBIOS structure types */ 17*4b6dddc2SAlexander Graf enum { 18*4b6dddc2SAlexander Graf SMBIOS_BIOS_INFORMATION = 0, 19*4b6dddc2SAlexander Graf SMBIOS_SYSTEM_INFORMATION = 1, 20*4b6dddc2SAlexander Graf SMBIOS_BOARD_INFORMATION = 2, 21*4b6dddc2SAlexander Graf SMBIOS_SYSTEM_ENCLOSURE = 3, 22*4b6dddc2SAlexander Graf SMBIOS_PROCESSOR_INFORMATION = 4, 23*4b6dddc2SAlexander Graf SMBIOS_CACHE_INFORMATION = 7, 24*4b6dddc2SAlexander Graf SMBIOS_SYSTEM_SLOTS = 9, 25*4b6dddc2SAlexander Graf SMBIOS_PHYS_MEMORY_ARRAY = 16, 26*4b6dddc2SAlexander Graf SMBIOS_MEMORY_DEVICE = 17, 27*4b6dddc2SAlexander Graf SMBIOS_MEMORY_ARRAY_MAPPED_ADDRESS = 19, 28*4b6dddc2SAlexander Graf SMBIOS_SYSTEM_BOOT_INFORMATION = 32, 29*4b6dddc2SAlexander Graf SMBIOS_END_OF_TABLE = 127 30*4b6dddc2SAlexander Graf }; 31*4b6dddc2SAlexander Graf 32*4b6dddc2SAlexander Graf #define SMBIOS_INTERMEDIATE_OFFSET 16 33*4b6dddc2SAlexander Graf #define SMBIOS_STRUCT_EOS_BYTES 2 34*4b6dddc2SAlexander Graf 35*4b6dddc2SAlexander Graf struct __packed smbios_entry { 36*4b6dddc2SAlexander Graf u8 anchor[4]; 37*4b6dddc2SAlexander Graf u8 checksum; 38*4b6dddc2SAlexander Graf u8 length; 39*4b6dddc2SAlexander Graf u8 major_ver; 40*4b6dddc2SAlexander Graf u8 minor_ver; 41*4b6dddc2SAlexander Graf u16 max_struct_size; 42*4b6dddc2SAlexander Graf u8 entry_point_rev; 43*4b6dddc2SAlexander Graf u8 formatted_area[5]; 44*4b6dddc2SAlexander Graf u8 intermediate_anchor[5]; 45*4b6dddc2SAlexander Graf u8 intermediate_checksum; 46*4b6dddc2SAlexander Graf u16 struct_table_length; 47*4b6dddc2SAlexander Graf u32 struct_table_address; 48*4b6dddc2SAlexander Graf u16 struct_count; 49*4b6dddc2SAlexander Graf u8 bcd_rev; 50*4b6dddc2SAlexander Graf }; 51*4b6dddc2SAlexander Graf 52*4b6dddc2SAlexander Graf /* BIOS characteristics */ 53*4b6dddc2SAlexander Graf #define BIOS_CHARACTERISTICS_PCI_SUPPORTED (1 << 7) 54*4b6dddc2SAlexander Graf #define BIOS_CHARACTERISTICS_UPGRADEABLE (1 << 11) 55*4b6dddc2SAlexander Graf #define BIOS_CHARACTERISTICS_SELECTABLE_BOOT (1 << 16) 56*4b6dddc2SAlexander Graf 57*4b6dddc2SAlexander Graf #define BIOS_CHARACTERISTICS_EXT1_ACPI (1 << 0) 58*4b6dddc2SAlexander Graf #define BIOS_CHARACTERISTICS_EXT2_TARGET (1 << 2) 59*4b6dddc2SAlexander Graf 60*4b6dddc2SAlexander Graf struct __packed smbios_type0 { 61*4b6dddc2SAlexander Graf u8 type; 62*4b6dddc2SAlexander Graf u8 length; 63*4b6dddc2SAlexander Graf u16 handle; 64*4b6dddc2SAlexander Graf u8 vendor; 65*4b6dddc2SAlexander Graf u8 bios_ver; 66*4b6dddc2SAlexander Graf u16 bios_start_segment; 67*4b6dddc2SAlexander Graf u8 bios_release_date; 68*4b6dddc2SAlexander Graf u8 bios_rom_size; 69*4b6dddc2SAlexander Graf u64 bios_characteristics; 70*4b6dddc2SAlexander Graf u8 bios_characteristics_ext1; 71*4b6dddc2SAlexander Graf u8 bios_characteristics_ext2; 72*4b6dddc2SAlexander Graf u8 bios_major_release; 73*4b6dddc2SAlexander Graf u8 bios_minor_release; 74*4b6dddc2SAlexander Graf u8 ec_major_release; 75*4b6dddc2SAlexander Graf u8 ec_minor_release; 76*4b6dddc2SAlexander Graf char eos[SMBIOS_STRUCT_EOS_BYTES]; 77*4b6dddc2SAlexander Graf }; 78*4b6dddc2SAlexander Graf 79*4b6dddc2SAlexander Graf struct __packed smbios_type1 { 80*4b6dddc2SAlexander Graf u8 type; 81*4b6dddc2SAlexander Graf u8 length; 82*4b6dddc2SAlexander Graf u16 handle; 83*4b6dddc2SAlexander Graf u8 manufacturer; 84*4b6dddc2SAlexander Graf u8 product_name; 85*4b6dddc2SAlexander Graf u8 version; 86*4b6dddc2SAlexander Graf u8 serial_number; 87*4b6dddc2SAlexander Graf u8 uuid[16]; 88*4b6dddc2SAlexander Graf u8 wakeup_type; 89*4b6dddc2SAlexander Graf u8 sku_number; 90*4b6dddc2SAlexander Graf u8 family; 91*4b6dddc2SAlexander Graf char eos[SMBIOS_STRUCT_EOS_BYTES]; 92*4b6dddc2SAlexander Graf }; 93*4b6dddc2SAlexander Graf 94*4b6dddc2SAlexander Graf #define SMBIOS_BOARD_FEATURE_HOSTING (1 << 0) 95*4b6dddc2SAlexander Graf #define SMBIOS_BOARD_MOTHERBOARD 10 96*4b6dddc2SAlexander Graf 97*4b6dddc2SAlexander Graf struct __packed smbios_type2 { 98*4b6dddc2SAlexander Graf u8 type; 99*4b6dddc2SAlexander Graf u8 length; 100*4b6dddc2SAlexander Graf u16 handle; 101*4b6dddc2SAlexander Graf u8 manufacturer; 102*4b6dddc2SAlexander Graf u8 product_name; 103*4b6dddc2SAlexander Graf u8 version; 104*4b6dddc2SAlexander Graf u8 serial_number; 105*4b6dddc2SAlexander Graf u8 asset_tag_number; 106*4b6dddc2SAlexander Graf u8 feature_flags; 107*4b6dddc2SAlexander Graf u8 chassis_location; 108*4b6dddc2SAlexander Graf u16 chassis_handle; 109*4b6dddc2SAlexander Graf u8 board_type; 110*4b6dddc2SAlexander Graf char eos[SMBIOS_STRUCT_EOS_BYTES]; 111*4b6dddc2SAlexander Graf }; 112*4b6dddc2SAlexander Graf 113*4b6dddc2SAlexander Graf #define SMBIOS_ENCLOSURE_DESKTOP 3 114*4b6dddc2SAlexander Graf #define SMBIOS_STATE_SAFE 3 115*4b6dddc2SAlexander Graf #define SMBIOS_SECURITY_NONE 3 116*4b6dddc2SAlexander Graf 117*4b6dddc2SAlexander Graf struct __packed smbios_type3 { 118*4b6dddc2SAlexander Graf u8 type; 119*4b6dddc2SAlexander Graf u8 length; 120*4b6dddc2SAlexander Graf u16 handle; 121*4b6dddc2SAlexander Graf u8 manufacturer; 122*4b6dddc2SAlexander Graf u8 chassis_type; 123*4b6dddc2SAlexander Graf u8 version; 124*4b6dddc2SAlexander Graf u8 serial_number; 125*4b6dddc2SAlexander Graf u8 asset_tag_number; 126*4b6dddc2SAlexander Graf u8 bootup_state; 127*4b6dddc2SAlexander Graf u8 power_supply_state; 128*4b6dddc2SAlexander Graf u8 thermal_state; 129*4b6dddc2SAlexander Graf u8 security_status; 130*4b6dddc2SAlexander Graf u32 oem_defined; 131*4b6dddc2SAlexander Graf u8 height; 132*4b6dddc2SAlexander Graf u8 number_of_power_cords; 133*4b6dddc2SAlexander Graf u8 element_count; 134*4b6dddc2SAlexander Graf u8 element_record_length; 135*4b6dddc2SAlexander Graf char eos[SMBIOS_STRUCT_EOS_BYTES]; 136*4b6dddc2SAlexander Graf }; 137*4b6dddc2SAlexander Graf 138*4b6dddc2SAlexander Graf #define SMBIOS_PROCESSOR_TYPE_CENTRAL 3 139*4b6dddc2SAlexander Graf #define SMBIOS_PROCESSOR_STATUS_ENABLED 1 140*4b6dddc2SAlexander Graf #define SMBIOS_PROCESSOR_UPGRADE_NONE 6 141*4b6dddc2SAlexander Graf 142*4b6dddc2SAlexander Graf struct __packed smbios_type4 { 143*4b6dddc2SAlexander Graf u8 type; 144*4b6dddc2SAlexander Graf u8 length; 145*4b6dddc2SAlexander Graf u16 handle; 146*4b6dddc2SAlexander Graf u8 socket_designation; 147*4b6dddc2SAlexander Graf u8 processor_type; 148*4b6dddc2SAlexander Graf u8 processor_family; 149*4b6dddc2SAlexander Graf u8 processor_manufacturer; 150*4b6dddc2SAlexander Graf u32 processor_id[2]; 151*4b6dddc2SAlexander Graf u8 processor_version; 152*4b6dddc2SAlexander Graf u8 voltage; 153*4b6dddc2SAlexander Graf u16 external_clock; 154*4b6dddc2SAlexander Graf u16 max_speed; 155*4b6dddc2SAlexander Graf u16 current_speed; 156*4b6dddc2SAlexander Graf u8 status; 157*4b6dddc2SAlexander Graf u8 processor_upgrade; 158*4b6dddc2SAlexander Graf u16 l1_cache_handle; 159*4b6dddc2SAlexander Graf u16 l2_cache_handle; 160*4b6dddc2SAlexander Graf u16 l3_cache_handle; 161*4b6dddc2SAlexander Graf u8 serial_number; 162*4b6dddc2SAlexander Graf u8 asset_tag; 163*4b6dddc2SAlexander Graf u8 part_number; 164*4b6dddc2SAlexander Graf u8 core_count; 165*4b6dddc2SAlexander Graf u8 core_enabled; 166*4b6dddc2SAlexander Graf u8 thread_count; 167*4b6dddc2SAlexander Graf u16 processor_characteristics; 168*4b6dddc2SAlexander Graf u16 processor_family2; 169*4b6dddc2SAlexander Graf u16 core_count2; 170*4b6dddc2SAlexander Graf u16 core_enabled2; 171*4b6dddc2SAlexander Graf u16 thread_count2; 172*4b6dddc2SAlexander Graf char eos[SMBIOS_STRUCT_EOS_BYTES]; 173*4b6dddc2SAlexander Graf }; 174*4b6dddc2SAlexander Graf 175*4b6dddc2SAlexander Graf struct __packed smbios_type32 { 176*4b6dddc2SAlexander Graf u8 type; 177*4b6dddc2SAlexander Graf u8 length; 178*4b6dddc2SAlexander Graf u16 handle; 179*4b6dddc2SAlexander Graf u8 reserved[6]; 180*4b6dddc2SAlexander Graf u8 boot_status; 181*4b6dddc2SAlexander Graf u8 eos[SMBIOS_STRUCT_EOS_BYTES]; 182*4b6dddc2SAlexander Graf }; 183*4b6dddc2SAlexander Graf 184*4b6dddc2SAlexander Graf struct __packed smbios_type127 { 185*4b6dddc2SAlexander Graf u8 type; 186*4b6dddc2SAlexander Graf u8 length; 187*4b6dddc2SAlexander Graf u16 handle; 188*4b6dddc2SAlexander Graf u8 eos[SMBIOS_STRUCT_EOS_BYTES]; 189*4b6dddc2SAlexander Graf }; 190*4b6dddc2SAlexander Graf 191*4b6dddc2SAlexander Graf struct __packed smbios_header { 192*4b6dddc2SAlexander Graf u8 type; 193*4b6dddc2SAlexander Graf u8 length; 194*4b6dddc2SAlexander Graf u16 handle; 195*4b6dddc2SAlexander Graf }; 196*4b6dddc2SAlexander Graf 197*4b6dddc2SAlexander Graf /** 198*4b6dddc2SAlexander Graf * fill_smbios_header() - Fill the header of an SMBIOS table 199*4b6dddc2SAlexander Graf * 200*4b6dddc2SAlexander Graf * This fills the header of an SMBIOS table structure. 201*4b6dddc2SAlexander Graf * 202*4b6dddc2SAlexander Graf * @table: start address of the structure 203*4b6dddc2SAlexander Graf * @type: the type of structure 204*4b6dddc2SAlexander Graf * @length: the length of the formatted area of the structure 205*4b6dddc2SAlexander Graf * @handle: the structure's handle, a unique 16-bit number 206*4b6dddc2SAlexander Graf */ 207*4b6dddc2SAlexander Graf static inline void fill_smbios_header(void *table, int type, 208*4b6dddc2SAlexander Graf int length, int handle) 209*4b6dddc2SAlexander Graf { 210*4b6dddc2SAlexander Graf struct smbios_header *header = table; 211*4b6dddc2SAlexander Graf 212*4b6dddc2SAlexander Graf header->type = type; 213*4b6dddc2SAlexander Graf header->length = length - SMBIOS_STRUCT_EOS_BYTES; 214*4b6dddc2SAlexander Graf header->handle = handle; 215*4b6dddc2SAlexander Graf } 216*4b6dddc2SAlexander Graf 217*4b6dddc2SAlexander Graf /** 218*4b6dddc2SAlexander Graf * Function prototype to write a specific type of SMBIOS structure 219*4b6dddc2SAlexander Graf * 220*4b6dddc2SAlexander Graf * @addr: start address to write the structure 221*4b6dddc2SAlexander Graf * @handle: the structure's handle, a unique 16-bit number 222*4b6dddc2SAlexander Graf * @return: size of the structure 223*4b6dddc2SAlexander Graf */ 224*4b6dddc2SAlexander Graf typedef int (*smbios_write_type)(u32 *addr, int handle); 225*4b6dddc2SAlexander Graf 226*4b6dddc2SAlexander Graf /** 227*4b6dddc2SAlexander Graf * write_smbios_table() - Write SMBIOS table 228*4b6dddc2SAlexander Graf * 229*4b6dddc2SAlexander Graf * This writes SMBIOS table at a given address. 230*4b6dddc2SAlexander Graf * 231*4b6dddc2SAlexander Graf * @addr: start address to write SMBIOS table 232*4b6dddc2SAlexander Graf * @return: end address of SMBIOS table 233*4b6dddc2SAlexander Graf */ 234*4b6dddc2SAlexander Graf u32 write_smbios_table(u32 addr); 235*4b6dddc2SAlexander Graf 236*4b6dddc2SAlexander Graf #endif /* _SMBIOS_H_ */ 237