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