1 /* SPDX-License-Identifier: GPL-2.0+ */ 2 /* 3 * Copyright (C) 2015, Bin Meng <bmeng.cn@gmail.com> 4 * 5 * Adapted from coreboot src/include/smbios.h 6 */ 7 8 #ifndef _SMBIOS_H_ 9 #define _SMBIOS_H_ 10 11 /* SMBIOS spec version implemented */ 12 #define SMBIOS_MAJOR_VER 3 13 #define SMBIOS_MINOR_VER 0 14 15 /* SMBIOS structure types */ 16 enum { 17 SMBIOS_BIOS_INFORMATION = 0, 18 SMBIOS_SYSTEM_INFORMATION = 1, 19 SMBIOS_BOARD_INFORMATION = 2, 20 SMBIOS_SYSTEM_ENCLOSURE = 3, 21 SMBIOS_PROCESSOR_INFORMATION = 4, 22 SMBIOS_CACHE_INFORMATION = 7, 23 SMBIOS_SYSTEM_SLOTS = 9, 24 SMBIOS_PHYS_MEMORY_ARRAY = 16, 25 SMBIOS_MEMORY_DEVICE = 17, 26 SMBIOS_MEMORY_ARRAY_MAPPED_ADDRESS = 19, 27 SMBIOS_SYSTEM_BOOT_INFORMATION = 32, 28 SMBIOS_END_OF_TABLE = 127 29 }; 30 31 #define SMBIOS_INTERMEDIATE_OFFSET 16 32 #define SMBIOS_STRUCT_EOS_BYTES 2 33 34 struct __packed smbios_entry { 35 u8 anchor[4]; 36 u8 checksum; 37 u8 length; 38 u8 major_ver; 39 u8 minor_ver; 40 u16 max_struct_size; 41 u8 entry_point_rev; 42 u8 formatted_area[5]; 43 u8 intermediate_anchor[5]; 44 u8 intermediate_checksum; 45 u16 struct_table_length; 46 u32 struct_table_address; 47 u16 struct_count; 48 u8 bcd_rev; 49 }; 50 51 /* BIOS characteristics */ 52 #define BIOS_CHARACTERISTICS_PCI_SUPPORTED (1 << 7) 53 #define BIOS_CHARACTERISTICS_UPGRADEABLE (1 << 11) 54 #define BIOS_CHARACTERISTICS_SELECTABLE_BOOT (1 << 16) 55 56 #define BIOS_CHARACTERISTICS_EXT1_ACPI (1 << 0) 57 #define BIOS_CHARACTERISTICS_EXT1_UEFI (1 << 3) 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 #define SMBIOS_PROCESSOR_FAMILY_OTHER 1 143 #define SMBIOS_PROCESSOR_FAMILY_UNKNOWN 2 144 145 struct __packed smbios_type4 { 146 u8 type; 147 u8 length; 148 u16 handle; 149 u8 socket_designation; 150 u8 processor_type; 151 u8 processor_family; 152 u8 processor_manufacturer; 153 u32 processor_id[2]; 154 u8 processor_version; 155 u8 voltage; 156 u16 external_clock; 157 u16 max_speed; 158 u16 current_speed; 159 u8 status; 160 u8 processor_upgrade; 161 u16 l1_cache_handle; 162 u16 l2_cache_handle; 163 u16 l3_cache_handle; 164 u8 serial_number; 165 u8 asset_tag; 166 u8 part_number; 167 u8 core_count; 168 u8 core_enabled; 169 u8 thread_count; 170 u16 processor_characteristics; 171 u16 processor_family2; 172 u16 core_count2; 173 u16 core_enabled2; 174 u16 thread_count2; 175 char eos[SMBIOS_STRUCT_EOS_BYTES]; 176 }; 177 178 struct __packed smbios_type32 { 179 u8 type; 180 u8 length; 181 u16 handle; 182 u8 reserved[6]; 183 u8 boot_status; 184 u8 eos[SMBIOS_STRUCT_EOS_BYTES]; 185 }; 186 187 struct __packed smbios_type127 { 188 u8 type; 189 u8 length; 190 u16 handle; 191 u8 eos[SMBIOS_STRUCT_EOS_BYTES]; 192 }; 193 194 struct __packed smbios_header { 195 u8 type; 196 u8 length; 197 u16 handle; 198 }; 199 200 /** 201 * fill_smbios_header() - Fill the header of an SMBIOS table 202 * 203 * This fills the header of an SMBIOS table structure. 204 * 205 * @table: start address of the structure 206 * @type: the type of structure 207 * @length: the length of the formatted area of the structure 208 * @handle: the structure's handle, a unique 16-bit number 209 */ 210 static inline void fill_smbios_header(void *table, int type, 211 int length, int handle) 212 { 213 struct smbios_header *header = table; 214 215 header->type = type; 216 header->length = length - SMBIOS_STRUCT_EOS_BYTES; 217 header->handle = handle; 218 } 219 220 /** 221 * Function prototype to write a specific type of SMBIOS structure 222 * 223 * @addr: start address to write the structure 224 * @handle: the structure's handle, a unique 16-bit number 225 * @return: size of the structure 226 */ 227 typedef int (*smbios_write_type)(ulong *addr, int handle); 228 229 /** 230 * write_smbios_table() - Write SMBIOS table 231 * 232 * This writes SMBIOS table at a given address. 233 * 234 * @addr: start address to write SMBIOS table. If this is not 235 * 16-byte-aligned then it will be aligned before the table is written 236 * @return: end address of SMBIOS table (and start address for next entry) 237 */ 238 ulong write_smbios_table(ulong addr); 239 240 #endif /* _SMBIOS_H_ */ 241