blob: e451d17ef8cb72184f09ef5375ffe9df06f22c78 [file] [log] [blame]
Angel Pons32859fc2020-04-02 23:48:27 +02001/* SPDX-License-Identifier: GPL-2.0-only */
Timothy Pearson821217b2015-03-27 22:47:25 -05002
Sven Schnelle164bcfd2011-08-14 20:56:34 +02003#ifndef SMBIOS_H
4#define SMBIOS_H
5
6#include <types.h>
Lijian Zhao10ea93c2019-04-11 00:45:10 -07007#include <memory_info.h>
Sven Schnelle164bcfd2011-08-14 20:56:34 +02008
9unsigned long smbios_write_tables(unsigned long start);
Konstantin Aladyshevd0df1d72017-08-01 15:52:46 +030010int smbios_add_string(u8 *start, const char *str);
11int smbios_string_table_len(u8 *start);
Sven Schnelle164bcfd2011-08-14 20:56:34 +020012
Duncan Laurie21a78702013-05-23 14:17:05 -070013/* Used by mainboard to add an on-board device */
Lijian Zhaoe98a7512019-04-11 23:28:09 -070014enum misc_slot_type;
15enum misc_slot_length;
16enum misc_slot_usage;
17enum slot_data_bus_bandwidth;
18int smbios_write_type9(unsigned long *current, int *handle,
19 const char *name, const enum misc_slot_type type,
20 const enum slot_data_bus_bandwidth bandwidth,
21 const enum misc_slot_usage usage,
22 const enum misc_slot_length length,
23 u8 slot_char1, u8 slot_char2, u8 bus, u8 dev_func);
Patrick Rudolphfe98e902018-03-27 16:17:12 +020024enum smbios_bmc_interface_type;
25int smbios_write_type38(unsigned long *current, int *handle,
26 const enum smbios_bmc_interface_type interface_type,
27 const u8 ipmi_rev, const u8 i2c_addr, const u8 nv_addr,
28 const u64 base_addr, const u8 base_modifier,
29 const u8 irq);
Duncan Laurie21a78702013-05-23 14:17:05 -070030int smbios_write_type41(unsigned long *current, int *handle,
31 const char *name, u8 instance, u16 segment,
Christian Waltere6afab12019-05-21 17:22:49 +020032 u8 bus, u8 device, u8 function, u8 device_type);
Duncan Laurie21a78702013-05-23 14:17:05 -070033
Nico Huberebd8a4f2017-11-01 09:49:16 +010034const char *smbios_system_manufacturer(void);
35const char *smbios_system_product_name(void);
36const char *smbios_system_serial_number(void);
37const char *smbios_system_version(void);
38void smbios_system_set_uuid(u8 *uuid);
39const char *smbios_system_sku(void);
40
Andrey Petrov2e032f02019-10-23 15:31:51 -070041unsigned int smbios_cpu_get_max_speed_mhz(void);
42unsigned int smbios_cpu_get_current_speed_mhz(void);
Patrick Rudolphb01ac7e2020-07-26 14:23:37 +020043unsigned int smbios_cpu_get_voltage(void);
Andrey Petrov2e032f02019-10-23 15:31:51 -070044
Gerd Hoffmann06262742013-11-13 13:37:23 +010045const char *smbios_mainboard_manufacturer(void);
46const char *smbios_mainboard_product_name(void);
Christian Gmeinerac3aa092012-07-25 13:42:40 +020047const char *smbios_mainboard_serial_number(void);
48const char *smbios_mainboard_version(void);
Nico Huberebd8a4f2017-11-01 09:49:16 +010049
Vladimir Serbinenko63acd222014-06-01 00:26:48 +020050const char *smbios_mainboard_bios_version(void);
Julien Viard de Galbert9a31dfe2018-02-22 16:39:58 +010051const char *smbios_mainboard_asset_tag(void);
52u8 smbios_mainboard_feature_flags(void);
53const char *smbios_mainboard_location_in_chassis(void);
Johnny Lind3440542020-01-30 18:21:22 +080054const char *smbios_chassis_version(void);
55const char *smbios_chassis_serial_number(void);
56const char *smbios_processor_serial_number(void);
Christian Gmeinerac3aa092012-07-25 13:42:40 +020057
Tim Chuf2f53c42020-09-07 02:30:19 -070058void smbios_ec_revision(uint8_t *ec_major_revision, uint8_t *ec_minor_revision);
59
Tim Chua96eaf82020-11-12 03:15:39 -080060unsigned int smbios_memory_error_correction_type(struct memory_info *meminfo);
Morgan Jang92bcc4f2020-07-24 10:36:18 +080061unsigned int smbios_processor_external_clock(void);
62unsigned int smbios_processor_characteristics(void);
63struct cpuid_result;
64unsigned int smbios_processor_family(struct cpuid_result res);
65
Morgan Jang8ae391d2020-10-06 16:26:17 +080066unsigned int smbios_cache_error_correction_type(u8 level);
67unsigned int smbios_cache_sram_type(void);
68unsigned int smbios_cache_conf_operation_mode(u8 level);
69
BryantOu4a8e58f2020-04-20 19:45:20 -070070/* Used by mainboard to add port information of type 8 */
71struct port_information;
72int smbios_write_type8(unsigned long *current, int *handle,
73 const struct port_information *port,
74 size_t num_ports);
75
Elyes HAOUAS3233cf42019-02-14 17:46:02 +010076#define BIOS_CHARACTERISTICS_PCI_SUPPORTED (1 << 7)
77#define BIOS_CHARACTERISTICS_PC_CARD (1 << 8)
78#define BIOS_CHARACTERISTICS_PNP (1 << 9)
79#define BIOS_CHARACTERISTICS_APM (1 << 10)
80#define BIOS_CHARACTERISTICS_UPGRADEABLE (1 << 11)
81#define BIOS_CHARACTERISTICS_SHADOW (1 << 12)
82#define BIOS_CHARACTERISTICS_BOOT_FROM_CD (1 << 15)
83#define BIOS_CHARACTERISTICS_SELECTABLE_BOOT (1 << 16)
84#define BIOS_CHARACTERISTICS_BIOS_SOCKETED (1 << 17)
Sven Schnelle164bcfd2011-08-14 20:56:34 +020085
Elyes HAOUAS3233cf42019-02-14 17:46:02 +010086#define BIOS_EXT1_CHARACTERISTICS_ACPI (1 << 0)
87#define BIOS_EXT2_CHARACTERISTICS_TARGET (1 << 2)
Sven Schnelle164bcfd2011-08-14 20:56:34 +020088
Timothy Pearson821217b2015-03-27 22:47:25 -050089#define BIOS_MEMORY_ECC_SINGLE_BIT_CORRECTING (1 << 3)
90#define BIOS_MEMORY_ECC_DOUBLE_BIT_CORRECTING (1 << 4)
91#define BIOS_MEMORY_ECC_SCRUBBING (1 << 5)
92
93#define MEMORY_TYPE_DETAIL_OTHER (1 << 1)
94#define MEMORY_TYPE_DETAIL_UNKNOWN (1 << 2)
95#define MEMORY_TYPE_DETAIL_FAST_PAGED (1 << 3)
96#define MEMORY_TYPE_DETAIL_STATIC_COLUMN (1 << 4)
97#define MEMORY_TYPE_DETAIL_PSEUDO_STATIC (1 << 5)
98#define MEMORY_TYPE_DETAIL_RAMBUS (1 << 6)
99#define MEMORY_TYPE_DETAIL_SYNCHRONOUS (1 << 7)
100#define MEMORY_TYPE_DETAIL_CMOS (1 << 8)
101#define MEMORY_TYPE_DETAIL_EDO (1 << 9)
102#define MEMORY_TYPE_DETAIL_WINDOW_DRAM (1 << 10)
103#define MEMORY_TYPE_DETAIL_CACHE_DRAM (1 << 11)
104#define MEMORY_TYPE_DETAIL_NON_VOLATILE (1 << 12)
105#define MEMORY_TYPE_DETAIL_REGISTERED (1 << 13)
106#define MEMORY_TYPE_DETAIL_UNBUFFERED (1 << 14)
Elyes HAOUAS1db23462019-02-14 17:49:47 +0100107#define MEMORY_TYPE_DETAIL_LRDIMM (1 << 15)
108
109#define MEMORY_TECHNOLOGY_OTHER 0x01
110#define MEMORY_TECHNOLOGY_UNKNOWN 0x02
111#define MEMORY_TECHNOLOGY_DRAM 0x03
112#define MEMORY_TECHNOLOGY_NVDIMM_N 0x04
113#define MEMORY_TECHNOLOGY_NVDIMM_F 0x05
114#define MEMORY_TECHNOLOGY_NVDIMM_P 0x06
115#define MEMORY_TECHNOLOGY_INTEL_PERSISTENT 0x07
116
117#define MEMORY_OPERATING_MODE_CAP_OTHER (1 << 1)
118#define MEMORY_OPERATING_MODE_CAP_UNKNOWN (1 << 2)
119#define MEMORY_OPERATING_MODE_CAP_VOLATILE (1 << 3)
120#define MEMORY_OPERATING_MODE_CAP_BYTE_ACCESS_PERSISTENT (1 << 4)
121#define MEMORY_OPERATING_MODE_CAP_BLOCK_ACCESS_PERSISTENT (1 << 5)
Timothy Pearson821217b2015-03-27 22:47:25 -0500122
Kane Chen33faac62014-07-27 12:54:44 -0700123typedef enum {
Lee Leahy0be6d932015-06-26 11:15:42 -0700124 MEMORY_BUS_WIDTH_8 = 0,
125 MEMORY_BUS_WIDTH_16 = 1,
126 MEMORY_BUS_WIDTH_32 = 2,
127 MEMORY_BUS_WIDTH_64 = 3,
128 MEMORY_BUS_WIDTH_128 = 4,
129 MEMORY_BUS_WIDTH_256 = 5,
130 MEMORY_BUS_WIDTH_512 = 6,
131 MEMORY_BUS_WIDTH_1024 = 7,
132 MEMORY_BUS_WIDTH_MAX = 7,
133} smbios_memory_bus_width;
134
135typedef enum {
Kane Chen33faac62014-07-27 12:54:44 -0700136 MEMORY_FORMFACTOR_OTHER = 0x01,
137 MEMORY_FORMFACTOR_UNKNOWN = 0x02,
138 MEMORY_FORMFACTOR_SIMM = 0x03,
139 MEMORY_FORMFACTOR_SIP = 0x04,
140 MEMORY_FORMFACTOR_CHIP = 0x05,
141 MEMORY_FORMFACTOR_DIP = 0x06,
142 MEMORY_FORMFACTOR_ZIP = 0x07,
143 MEMORY_FORMFACTOR_PROPRIETARY_CARD = 0x08,
144 MEMORY_FORMFACTOR_DIMM = 0x09,
145 MEMORY_FORMFACTOR_TSOP = 0x0a,
146 MEMORY_FORMFACTOR_ROC = 0x0b,
147 MEMORY_FORMFACTOR_RIMM = 0x0c,
148 MEMORY_FORMFACTOR_SODIMM = 0x0d,
149 MEMORY_FORMFACTOR_SRIMM = 0x0e,
150 MEMORY_FORMFACTOR_FBDIMM = 0x0f,
Elyes HAOUAS86b683a2019-10-08 16:30:43 +0200151 MEMORY_FORMFACTOR_DIE = 0x10,
Kane Chen33faac62014-07-27 12:54:44 -0700152} smbios_memory_form_factor;
153
Timothy Pearson821217b2015-03-27 22:47:25 -0500154typedef enum {
155 MEMORY_TYPE_OTHER = 0x01,
156 MEMORY_TYPE_UNKNOWN = 0x02,
157 MEMORY_TYPE_DRAM = 0x03,
158 MEMORY_TYPE_EDRAM = 0x04,
159 MEMORY_TYPE_VRAM = 0x05,
160 MEMORY_TYPE_SRAM = 0x06,
161 MEMORY_TYPE_RAM = 0x07,
162 MEMORY_TYPE_ROM = 0x08,
163 MEMORY_TYPE_FLASH = 0x09,
164 MEMORY_TYPE_EEPROM = 0x0a,
165 MEMORY_TYPE_FEPROM = 0x0b,
166 MEMORY_TYPE_EPROM = 0x0c,
167 MEMORY_TYPE_CDRAM = 0x0d,
168 MEMORY_TYPE_3DRAM = 0x0e,
169 MEMORY_TYPE_SDRAM = 0x0f,
170 MEMORY_TYPE_SGRAM = 0x10,
171 MEMORY_TYPE_RDRAM = 0x11,
172 MEMORY_TYPE_DDR = 0x12,
173 MEMORY_TYPE_DDR2 = 0x13,
174 MEMORY_TYPE_DDR2_FBDIMM = 0x14,
175 MEMORY_TYPE_DDR3 = 0x18,
176 MEMORY_TYPE_FBD2 = 0x19,
Elyes HAOUAS28114ae2018-11-14 17:51:00 +0100177 MEMORY_TYPE_DDR4 = 0x1a,
178 MEMORY_TYPE_LPDDR = 0x1b,
179 MEMORY_TYPE_LPDDR2 = 0x1c,
180 MEMORY_TYPE_LPDDR3 = 0x1d,
181 MEMORY_TYPE_LPDDR4 = 0x1e,
182 MEMORY_TYPE_LOGICAL_NON_VOLATILE_DEVICE = 0x1f,
Elyes HAOUAS86b683a2019-10-08 16:30:43 +0200183 MEMORY_TYPE_HBM = 0x20,
184 MEMORY_TYPE_HBM2 = 0x21,
Timothy Pearson821217b2015-03-27 22:47:25 -0500185} smbios_memory_type;
186
187typedef enum {
188 MEMORY_ARRAY_LOCATION_OTHER = 0x01,
189 MEMORY_ARRAY_LOCATION_UNKNOWN = 0x02,
190 MEMORY_ARRAY_LOCATION_SYSTEM_BOARD = 0x03,
191 MEMORY_ARRAY_LOCATION_ISA_ADD_ON = 0x04,
192 MEMORY_ARRAY_LOCATION_EISA_ADD_ON = 0x05,
193 MEMORY_ARRAY_LOCATION_PCI_ADD_ON = 0x06,
194 MEMORY_ARRAY_LOCATION_MCA_ADD_ON = 0x07,
195 MEMORY_ARRAY_LOCATION_PCMCIA_ADD_ON = 0x08,
196 MEMORY_ARRAY_LOCATION_PROPRIETARY_ADD_ON = 0x09,
197 MEMORY_ARRAY_LOCATION_NUBUS = 0x0a,
198 MEMORY_ARRAY_LOCATION_PC_98_C20_ADD_ON = 0xa0,
199 MEMORY_ARRAY_LOCATION_PC_98_C24_ADD_ON = 0xa1,
200 MEMORY_ARRAY_LOCATION_PC_98_E_ADD_ON = 0xa2,
201 MEMORY_ARRAY_LOCATION_PC_98_LOCAL_BUS_ADD_ON = 0xa3,
Elyes HAOUAS77fe2132019-10-29 08:42:03 +0100202 MEMORY_ARRAY_LOCATION_CXL_FLEXBUS_1_0_ADD_ON = 0xa4,
Timothy Pearson821217b2015-03-27 22:47:25 -0500203} smbios_memory_array_location;
204
205typedef enum {
206 MEMORY_ARRAY_USE_OTHER = 0x01,
207 MEMORY_ARRAY_USE_UNKNOWN = 0x02,
208 MEMORY_ARRAY_USE_SYSTEM = 0x03,
209 MEMORY_ARRAY_USE_VIDEO = 0x04,
210 MEMORY_ARRAY_USE_FLASH = 0x05,
211 MEMORY_ARRAY_USE_NVRAM = 0x06,
212 MEMORY_ARRAY_USE_CACHE = 0x07,
213} smbios_memory_array_use;
214
215typedef enum {
216 MEMORY_ARRAY_ECC_OTHER = 0x01,
217 MEMORY_ARRAY_ECC_UNKNOWN = 0x02,
218 MEMORY_ARRAY_ECC_NONE = 0x03,
219 MEMORY_ARRAY_ECC_PARITY = 0x04,
220 MEMORY_ARRAY_ECC_SINGLE_BIT = 0x05,
221 MEMORY_ARRAY_ECC_MULTI_BIT = 0x06,
222 MEMORY_ARRAY_ECC_CRC = 0x07,
223} smbios_memory_array_ecc;
224
Sven Schnelle164bcfd2011-08-14 20:56:34 +0200225#define SMBIOS_STATE_SAFE 3
226typedef enum {
Elyes HAOUASa0fed372016-09-16 20:17:40 +0200227 SMBIOS_BIOS_INFORMATION = 0,
228 SMBIOS_SYSTEM_INFORMATION = 1,
229 SMBIOS_BOARD_INFORMATION = 2,
230 SMBIOS_SYSTEM_ENCLOSURE = 3,
231 SMBIOS_PROCESSOR_INFORMATION = 4,
232 SMBIOS_CACHE_INFORMATION = 7,
BryantOu4a8e58f2020-04-20 19:45:20 -0700233 SMBIOS_PORT_CONNECTOR_INFORMATION = 8,
Elyes HAOUASa0fed372016-09-16 20:17:40 +0200234 SMBIOS_SYSTEM_SLOTS = 9,
235 SMBIOS_OEM_STRINGS = 11,
236 SMBIOS_EVENT_LOG = 15,
237 SMBIOS_PHYS_MEMORY_ARRAY = 16,
238 SMBIOS_MEMORY_DEVICE = 17,
239 SMBIOS_MEMORY_ARRAY_MAPPED_ADDRESS = 19,
240 SMBIOS_SYSTEM_BOOT_INFORMATION = 32,
Patrick Rudolphfe98e902018-03-27 16:17:12 +0200241 SMBIOS_IPMI_DEVICE_INFORMATION = 38,
Elyes HAOUASa0fed372016-09-16 20:17:40 +0200242 SMBIOS_ONBOARD_DEVICES_EXTENDED_INFORMATION = 41,
243 SMBIOS_END_OF_TABLE = 127,
Sven Schnelle164bcfd2011-08-14 20:56:34 +0200244} smbios_struct_type_t;
245
246struct smbios_entry {
247 u8 anchor[4];
248 u8 checksum;
249 u8 length;
250 u8 major_version;
251 u8 minor_version;
252 u16 max_struct_size;
253 u8 entry_point_rev;
254 u8 formwatted_area[5];
255 u8 intermediate_anchor_string[5];
256 u8 intermediate_checksum;
257 u16 struct_table_length;
258 u32 struct_table_address;
259 u16 struct_count;
260 u8 smbios_bcd_revision;
Stefan Reinauer6a001132017-07-13 02:20:27 +0200261} __packed;
Sven Schnelle164bcfd2011-08-14 20:56:34 +0200262
Patrick Rudolph7a835822020-07-22 16:00:53 +0200263struct smbios_entry30 {
264 u8 anchor[5];
265 u8 checksum;
266 u8 length;
267 u8 major_version;
268 u8 minor_version;
269 u8 smbios_doc_rev;
270 u8 entry_point_rev;
271 u8 reserved;
272 u32 struct_table_length;
273 u64 struct_table_address;
274} __packed;
275
Sven Schnelle164bcfd2011-08-14 20:56:34 +0200276struct smbios_type0 {
277 u8 type;
278 u8 length;
279 u16 handle;
280 u8 vendor;
281 u8 bios_version;
282 u16 bios_start_segment;
283 u8 bios_release_date;
284 u8 bios_rom_size;
285 u64 bios_characteristics;
286 u8 bios_characteristics_ext1;
287 u8 bios_characteristics_ext2;
288 u8 system_bios_major_release;
289 u8 system_bios_minor_release;
290 u8 ec_major_release;
291 u8 ec_minor_release;
Elyes HAOUAS358cbb32019-02-14 14:19:22 +0100292 u16 extended_bios_rom_size;
Konstantin Aladyshevd0df1d72017-08-01 15:52:46 +0300293 u8 eos[2];
Stefan Reinauer6a001132017-07-13 02:20:27 +0200294} __packed;
Sven Schnelle164bcfd2011-08-14 20:56:34 +0200295
296struct smbios_type1 {
297 u8 type;
298 u8 length;
299 u16 handle;
300 u8 manufacturer;
301 u8 product_name;
302 u8 version;
303 u8 serial_number;
304 u8 uuid[16];
305 u8 wakeup_type;
306 u8 sku;
307 u8 family;
Konstantin Aladyshevd0df1d72017-08-01 15:52:46 +0300308 u8 eos[2];
Stefan Reinauer6a001132017-07-13 02:20:27 +0200309} __packed;
Sven Schnelle164bcfd2011-08-14 20:56:34 +0200310
Julien Viard de Galbert9a31dfe2018-02-22 16:39:58 +0100311typedef enum {
312 SMBIOS_BOARD_TYPE_UNKNOWN = 0x01,
313 SMBIOS_BOARD_TYPE_OTHER = 0x02,
314 SMBIOS_BOARD_TYPE_SERVER_BLADE = 0x03,
315 SMBIOS_BOARD_TYPE_CONNECTIVITY_SWITCH = 0x04,
316 SMBIOS_BOARD_TYPE_SYSTEM_MANAGEMENT_MODULE = 0x05,
317 SMBIOS_BOARD_TYPE_PROCESSOR_MODULE = 0x06,
318 SMBIOS_BOARD_TYPE_IO_MODULE = 0x07,
319 SMBIOS_BOARD_TYPE_MEMORY_MODULE = 0x08,
320 SMBIOS_BOARD_TYPE_DAUGHTER_BOARD = 0x09,
321 SMBIOS_BOARD_TYPE_MOTHERBOARD = 0x0a,
322 SMBIOS_BOARD_TYPE_PROCESSOR_MEMORY_MODULE = 0x0b,
323 SMBIOS_BOARD_TYPE_PROCESSOR_IO_MODULE = 0x0c,
324 SMBIOS_BOARD_TYPE_INTERCONNECT_BOARD = 0x0d,
325} smbios_board_type;
326
Vladimir Serbinenko47089f22014-03-02 19:14:44 +0100327struct smbios_type2 {
328 u8 type;
329 u8 length;
330 u16 handle;
331 u8 manufacturer;
332 u8 product_name;
333 u8 version;
334 u8 serial_number;
Julien Viard de Galbert9a31dfe2018-02-22 16:39:58 +0100335 u8 asset_tag;
336 u8 feature_flags;
337 u8 location_in_chassis;
338 u16 chassis_handle;
339 u8 board_type;
Konstantin Aladyshevd0df1d72017-08-01 15:52:46 +0300340 u8 eos[2];
Stefan Reinauer6a001132017-07-13 02:20:27 +0200341} __packed;
Vladimir Serbinenko47089f22014-03-02 19:14:44 +0100342
Mathew Kingbe820b32019-10-31 12:10:44 -0600343typedef enum {
Elyes HAOUAS25dbc172017-07-04 21:38:03 +0200344 SMBIOS_ENCLOSURE_OTHER = 0x01,
345 SMBIOS_ENCLOSURE_UNKNOWN = 0x02,
346 SMBIOS_ENCLOSURE_DESKTOP = 0x03,
347 SMBIOS_ENCLOSURE_LOW_PROFILE_DESKTOP = 0x04,
348 SMBIOS_ENCLOSURE_PIZZA_BOX = 0x05,
349 SMBIOS_ENCLOSURE_MINI_TOWER = 0x06,
350 SMBIOS_ENCLOSURE_TOWER = 0x07,
351 SMBIOS_ENCLOSURE_PORTABLE = 0x08,
352 SMBIOS_ENCLOSURE_LAPTOP = 0x09,
353 SMBIOS_ENCLOSURE_NOTEBOOK = 0x0a,
354 SMBIOS_ENCLOSURE_HAND_HELD = 0x0b,
355 SMBIOS_ENCLOSURE_DOCKING_STATION = 0x0c,
356 SMBIOS_ENCLOSURE_ALL_IN_ONE = 0x0d,
357 SMBIOS_ENCLOSURE_SUB_NOTEBOOK = 0x0e,
358 SMBIOS_ENCLOSURE_SPACE_SAVING = 0x0f,
359 SMBIOS_ENCLOSURE_LUNCH_BOX = 0x10,
360 SMBIOS_ENCLOSURE_MAIN_SERVER_CHASSIS = 0x11,
361 SMBIOS_ENCLOSURE_EXPANSION_CHASSIS = 0x12,
362 SMBIOS_ENCLOSURE_SUBCHASSIS = 0x13,
363 SMBIOS_ENCLOSURE_BUS_EXPANSION_CHASSIS = 0x14,
364 SMBIOS_ENCLOSURE_PERIPHERAL_CHASSIS = 0x15,
365 SMBIOS_ENCLOSURE_RAID_CHASSIS = 0x16,
366 SMBIOS_ENCLOSURE_RACK_MOUNT_CHASSIS = 0x17,
367 SMBIOS_ENCLOSURE_SEALED_CASE_PC = 0x18,
368 SMBIOS_ENCLOSURE_MULTI_SYSTEM_CHASSIS = 0x19,
369 SMBIOS_ENCLOSURE_COMPACT_PCI = 0x1a,
370 SMBIOS_ENCLOSURE_ADVANCED_TCA = 0x1b,
371 SMBIOS_ENCLOSURE_BLADE = 0x1c,
372 SMBIOS_ENCLOSURE_BLADE_ENCLOSURE = 0x1d,
373 SMBIOS_ENCLOSURE_TABLET = 0x1e,
374 SMBIOS_ENCLOSURE_CONVERTIBLE = 0x1f,
375 SMBIOS_ENCLOSURE_DETACHABLE = 0x20,
376 SMBIOS_ENCLOSURE_IOT_GATEWAY = 0x21,
377 SMBIOS_ENCLOSURE_EMBEDDED_PC = 0x22,
378 SMBIOS_ENCLOSURE_MINI_PC = 0x23,
379 SMBIOS_ENCLOSURE_STICK_PC = 0x24,
Mathew Kingbe820b32019-10-31 12:10:44 -0600380} smbios_enclosure_type;
Vladimir Serbinenko71c0bf62014-08-27 23:23:14 +0200381
Sven Schnelle164bcfd2011-08-14 20:56:34 +0200382struct smbios_type3 {
383 u8 type;
384 u8 length;
385 u16 handle;
386 u8 manufacturer;
387 u8 _type;
388 u8 version;
389 u8 serial_number;
390 u8 asset_tag_number;
391 u8 bootup_state;
392 u8 power_supply_state;
393 u8 thermal_state;
394 u8 security_status;
395 u32 oem_defined;
396 u8 height;
397 u8 number_of_power_cords;
398 u8 element_count;
399 u8 element_record_length;
Matt DeVillier4863cc42016-09-01 00:55:40 -0500400 u8 sku_number;
Konstantin Aladyshevd0df1d72017-08-01 15:52:46 +0300401 u8 eos[2];
Stefan Reinauer6a001132017-07-13 02:20:27 +0200402} __packed;
Sven Schnelle164bcfd2011-08-14 20:56:34 +0200403
404struct smbios_type4 {
405 u8 type;
406 u8 length;
407 u16 handle;
408 u8 socket_designation;
409 u8 processor_type;
410 u8 processor_family;
411 u8 processor_manufacturer;
412 u32 processor_id[2];
413 u8 processor_version;
414 u8 voltage;
415 u16 external_clock;
416 u16 max_speed;
417 u16 current_speed;
418 u8 status;
419 u8 processor_upgrade;
420 u16 l1_cache_handle;
421 u16 l2_cache_handle;
422 u16 l3_cache_handle;
423 u8 serial_number;
424 u8 asset_tag;
425 u8 part_number;
426 u8 core_count;
427 u8 core_enabled;
428 u8 thread_count;
429 u16 processor_characteristics;
430 u16 processor_family2;
Patrick Rudolph7a835822020-07-22 16:00:53 +0200431 u16 core_count2;
432 u16 core_enabled2;
433 u16 thread_count2;
Konstantin Aladyshevd0df1d72017-08-01 15:52:46 +0300434 u8 eos[2];
Stefan Reinauer6a001132017-07-13 02:20:27 +0200435} __packed;
Sven Schnelle164bcfd2011-08-14 20:56:34 +0200436
Patrick Rudolph4aea6912020-07-22 07:28:26 +0200437/* defines for smbios_type4 */
438
439#define SMBIOS_PROCESSOR_STATUS_POPULATED (1 << 6)
440#define SMBIOS_PROCESSOR_STATUS_CPU_ENABLED (1 << 0)
441
Patrick Rudolphfc5b8092019-03-30 17:37:28 +0100442/* defines for supported_sram_type/current_sram_type */
443
444#define SMBIOS_CACHE_SRAM_TYPE_OTHER (1 << 0)
445#define SMBIOS_CACHE_SRAM_TYPE_UNKNOWN (1 << 1)
446#define SMBIOS_CACHE_SRAM_TYPE_NON_BURST (1 << 2)
447#define SMBIOS_CACHE_SRAM_TYPE_BURST (1 << 3)
448#define SMBIOS_CACHE_SRAM_TYPE_PIPELINE_BURST (1 << 4)
449#define SMBIOS_CACHE_SRAM_TYPE_SYNCHRONOUS (1 << 5)
450#define SMBIOS_CACHE_SRAM_TYPE_ASYNCHRONOUS (1 << 6)
451
452/* enum for error_correction_type */
453
454enum smbios_cache_error_corr {
455 SMBIOS_CACHE_ERROR_CORRECTION_OTHER = 1,
456 SMBIOS_CACHE_ERROR_CORRECTION_UNKNOWN,
457 SMBIOS_CACHE_ERROR_CORRECTION_NONE,
458 SMBIOS_CACHE_ERROR_CORRECTION_PARITY,
459 SMBIOS_CACHE_ERROR_CORRECTION_SINGLE_BIT,
460 SMBIOS_CACHE_ERROR_CORRECTION_MULTI_BIT,
461};
462
463/* enum for system_cache_type */
464
465enum smbios_cache_type {
466 SMBIOS_CACHE_TYPE_OTHER = 1,
467 SMBIOS_CACHE_TYPE_UNKNOWN,
468 SMBIOS_CACHE_TYPE_INSTRUCTION,
469 SMBIOS_CACHE_TYPE_DATA,
470 SMBIOS_CACHE_TYPE_UNIFIED,
471};
472
473/* enum for associativity */
474
475enum smbios_cache_associativity {
476 SMBIOS_CACHE_ASSOCIATIVITY_OTHER = 1,
477 SMBIOS_CACHE_ASSOCIATIVITY_UNKNOWN,
478 SMBIOS_CACHE_ASSOCIATIVITY_DIRECT,
479 SMBIOS_CACHE_ASSOCIATIVITY_2WAY,
480 SMBIOS_CACHE_ASSOCIATIVITY_4WAY,
481 SMBIOS_CACHE_ASSOCIATIVITY_FULL,
482 SMBIOS_CACHE_ASSOCIATIVITY_8WAY,
483 SMBIOS_CACHE_ASSOCIATIVITY_16WAY,
484 SMBIOS_CACHE_ASSOCIATIVITY_12WAY,
485 SMBIOS_CACHE_ASSOCIATIVITY_24WAY,
486 SMBIOS_CACHE_ASSOCIATIVITY_32WAY,
487 SMBIOS_CACHE_ASSOCIATIVITY_48WAY,
488 SMBIOS_CACHE_ASSOCIATIVITY_64WAY,
489 SMBIOS_CACHE_ASSOCIATIVITY_20WAY,
490};
491
492/* defines for cache_configuration */
493
494#define SMBIOS_CACHE_CONF_LEVEL(x) ((((x) - 1) & 0x7) << 0)
495#define SMBIOS_CACHE_CONF_LOCATION(x) (((x) & 0x3) << 5)
496#define SMBIOS_CACHE_CONF_ENABLED(x) (((x) & 0x1) << 7)
497#define SMBIOS_CACHE_CONF_OPERATION_MODE(x) (((x) & 0x3) << 8)
498
499/* defines for max_cache_size and installed_size */
500
501#define SMBIOS_CACHE_SIZE_UNIT_1KB (0 << 15)
502#define SMBIOS_CACHE_SIZE_UNIT_64KB (1 << 15)
503#define SMBIOS_CACHE_SIZE_MASK 0x7fff
504#define SMBIOS_CACHE_SIZE_OVERFLOW 0xffff
505
506#define SMBIOS_CACHE_SIZE2_UNIT_1KB (0 << 31)
507#define SMBIOS_CACHE_SIZE2_UNIT_64KB (1UL << 31)
508#define SMBIOS_CACHE_SIZE2_MASK 0x7fffffff
509
Morgan Jang8ae391d2020-10-06 16:26:17 +0800510/* define for cache operation mode */
511
512#define SMBIOS_CACHE_OP_MODE_WRITE_THROUGH 0
513#define SMBIOS_CACHE_OP_MODE_WRITE_BACK 1
514#define SMBIOS_CACHE_OP_MODE_VARIES_WITH_MEMORY_ADDRESS 2
515#define SMBIOS_CACHE_OP_MODE_UNKNOWN 3
516
Patrick Rudolphfc5b8092019-03-30 17:37:28 +0100517struct smbios_type7 {
518 u8 type;
519 u8 length;
520 u16 handle;
521 u8 socket_designation;
522 u16 cache_configuration;
523 u16 max_cache_size;
524 u16 installed_size;
525 u16 supported_sram_type;
526 u16 current_sram_type;
527 u8 cache_speed;
528 u8 error_correction_type;
529 u8 system_cache_type;
530 u8 associativity;
531 u32 max_cache_size2;
532 u32 installed_size2;
533 u8 eos[2];
534} __packed;
535
BryantOu4a8e58f2020-04-20 19:45:20 -0700536/* enum for connector types */
537typedef enum {
538 CONN_NONE = 0x00,
539 CONN_CENTRONICS = 0x01,
540 CONN_MINI_CENTRONICS = 0x02,
541 CONN_PROPRIETARY = 0x03,
542 CONN_DB_25_PIN_MALE = 0x04,
543 CONN_DB_25_PIN_FEMALE = 0x05,
544 CONN_DB_15_PIN_MALE = 0x06,
545 CONN_DB_15_PIN_FEMALE = 0x07,
546 CONN_DB_9_PIN_MALE = 0x08,
547 CONN_DB_9_PIN_FEMALE = 0x09,
548 CONN_RJ_11 = 0x0A,
549 CONN_RJ_45 = 0x0B,
550 CONN_50_PIN_MINI_SCSI = 0x0C,
551 CONN_MINI_DIN = 0x0D,
552 CONN_MICRO_DIN = 0x0E,
553 CONN_PS_2 = 0x0F,
554 CONN_INFRARED = 0x10,
555 CONN_HP_HIL = 0x11,
556 CONN_ACCESS_BUS_USB = 0x12,
557 CONN_SSA_SCSI = 0x13,
558 CONN_CIRCULAR_DIN_8_MALE = 0x14,
559 CONN_CIRCULAR_DIN_8_FEMALE = 0x15,
560 CONN_ON_BOARD_IDE = 0x16,
561 CONN_ON_BOARD_FLOPPY = 0x17,
562 CONN_9_PIN_DUAL_INLINE = 0x18,
563 CONN_25_PIN_DUAL_INLINE = 0x19,
564 CONN_50_PIN_DUAL_INLINE = 0x1A,
565 CONN_68_PIN_DUAL_INLINE = 0x1B,
566 CONN_ON_BOARD_SOUND_INPUT_FROM_CD_ROM = 0x1C,
567 CONN_MINI_CENTRONICS_TYPE14 = 0x1D,
568 CONN_MINI_CENTRONICS_TYPE26 = 0x1E,
569 CONN_MINI_JACK_HEADPHONES = 0x1F,
570 CONN_BNC = 0x20,
571 CONN_1394 = 0x21,
572 CONN_SAS_SATA = 0x22,
573 CONN_USB_TYPE_C = 0x23,
574 CONN_PC_98 = 0xA0,
575 CONN_PC_98_HIRESO = 0xA1,
576 CONN_PC_H98 = 0xA2,
577 CONN_PC98_NOTE = 0xA3,
578 CONN_PC_98_FULL = 0xA4,
579 CONN_OTHER = 0xFF,
580} type8_connector_types;
581
582/* enum for port types */
583typedef enum {
Patrick Georgi54be3952020-07-04 21:22:25 +0200584 TYPE_NONE_PORT = 0x00,
BryantOu4a8e58f2020-04-20 19:45:20 -0700585 TYPE_PARALLEL_PORT_XT_AT_COMPATIBLE = 0x01,
586 TYPE_PARALLEL_PORT_PS_2 = 0x02,
587 TYPE_PARALLEL_PORT_ECP = 0x03,
588 TYPE_PARALLEL_PORT_EPP = 0x04,
589 TYPE_PARALLEL_PORT_ECP_EPP = 0x05,
590 TYPE_SERIAL_PORT_XT_AT_COMPATIBLE = 0x06,
591 TYPE_SERIAL_PORT_16450_COMPATIBLE = 0x07,
592 TYPE_SERIAL_PORT_16550_COMPATIBLE = 0x08,
593 TYPE_SERIAL_PORT_16550A_COMPATIBLE = 0x09,
594 TYPE_SCSI_PORT = 0x0A,
595 TYPE_MIDI_PORT = 0x0B,
596 TYPE_JOY_STICK_PORT = 0x0C,
597 TYPE_KEYBOARD_PORT = 0x0D,
598 TYPE_MOUSE_PORT = 0x0E,
599 TYPE_SSA_SCSI = 0x0F,
600 TYPE_USB = 0x10,
601 TYPE_FIREWIRE_IEEE_P1394 = 0x11,
602 TYPE_PCMCIA_TYPE_I = 0x12,
603 TYPE_PCMCIA_TYPE_II = 0x13,
604 TYPE_PCMCIA_TYPE_III = 0x14,
605 TYPE_CARDBUS = 0x15,
606 TYPE_ACCESS_BUS_PORT = 0x16,
607 TYPE_SCSI_II = 0x17,
608 TYPE_SCSI_WIDE = 0x18,
609 TYPE_PC_98 = 0x19,
610 TYPE_PC_98_HIRESO = 0x1A,
611 TYPE_PC_H98 = 0x1B,
612 TYPE_VIDEO_PORT = 0x1C,
613 TYPE_AUDIO_PORT = 0x1D,
614 TYPE_MODEM_PORT = 0x1E,
615 TYPE_NETWORK_PORT = 0x1F,
616 TYPE_SATA = 0x20,
617 TYPE_SAS = 0x21,
618 TYPE_MFDP = 0x22,
619 TYPE_THUNDERBOLT = 0x23,
620 TYPE_8251_COMPATIBLE = 0xA0,
621 TYPE_8251_FIFO_COMPATIBLE = 0xA1,
Patrick Georgi54be3952020-07-04 21:22:25 +0200622 TYPE_OTHER_PORT = 0xFF,
BryantOu4a8e58f2020-04-20 19:45:20 -0700623} type8_port_types;
624
625struct port_information {
626 const char *internal_reference_designator;
627 type8_connector_types internal_connector_type;
628 const char *external_reference_designator;
629 type8_connector_types external_connector_type;
630 type8_port_types port_type;
631};
632
633struct smbios_type8 {
634 u8 type;
635 u8 length;
636 u16 handle;
637 u8 internal_reference_designator;
638 u8 internal_connector_type;
639 u8 external_reference_designator;
640 u8 external_connector_type;
641 u8 port_type;
642 u8 eos[2];
643} __packed;
644
Lijian Zhaoe98a7512019-04-11 23:28:09 -0700645/* System Slots - Slot Type */
646enum misc_slot_type {
647 SlotTypeOther = 0x01,
648 SlotTypeUnknown = 0x02,
649 SlotTypeIsa = 0x03,
650 SlotTypeMca = 0x04,
651 SlotTypeEisa = 0x05,
652 SlotTypePci = 0x06,
653 SlotTypePcmcia = 0x07,
654 SlotTypeVlVesa = 0x08,
655 SlotTypeProprietary = 0x09,
656 SlotTypeProcessorCardSlot = 0x0A,
657 SlotTypeProprietaryMemoryCardSlot = 0x0B,
658 SlotTypeIORiserCardSlot = 0x0C,
659 SlotTypeNuBus = 0x0D,
660 SlotTypePci66MhzCapable = 0x0E,
661 SlotTypeAgp = 0x0F,
662 SlotTypeApg2X = 0x10,
663 SlotTypeAgp4X = 0x11,
664 SlotTypePciX = 0x12,
665 SlotTypeAgp8X = 0x13,
666 SlotTypeM2Socket1_DP = 0x14,
667 SlotTypeM2Socket1_SD = 0x15,
668 SlotTypeM2Socket2 = 0x16,
669 SlotTypeM2Socket3 = 0x17,
670 SlotTypeMxmTypeI = 0x18,
671 SlotTypeMxmTypeII = 0x19,
672 SlotTypeMxmTypeIIIStandard = 0x1A,
673 SlotTypeMxmTypeIIIHe = 0x1B,
674 SlotTypeMxmTypeIV = 0x1C,
675 SlotTypeMxm30TypeA = 0x1D,
676 SlotTypeMxm30TypeB = 0x1E,
677 SlotTypePciExpressGen2Sff_8639 = 0x1F,
678 SlotTypePciExpressGen3Sff_8639 = 0x20,
679 SlotTypePciExpressMini52pinWithBSKO = 0x21,
680 SlotTypePciExpressMini52pinWithoutBSKO = 0x22,
681 SlotTypePciExpressMini76pin = 0x23,
682 SlotTypePC98C20 = 0xA0,
683 SlotTypePC98C24 = 0xA1,
684 SlotTypePC98E = 0xA2,
685 SlotTypePC98LocalBus = 0xA3,
686 SlotTypePC98Card = 0xA4,
687 SlotTypePciExpress = 0xA5,
688 SlotTypePciExpressX1 = 0xA6,
689 SlotTypePciExpressX2 = 0xA7,
690 SlotTypePciExpressX4 = 0xA8,
691 SlotTypePciExpressX8 = 0xA9,
692 SlotTypePciExpressX16 = 0xAA,
693 SlotTypePciExpressGen2 = 0xAB,
694 SlotTypePciExpressGen2X1 = 0xAC,
695 SlotTypePciExpressGen2X2 = 0xAD,
696 SlotTypePciExpressGen2X4 = 0xAE,
697 SlotTypePciExpressGen2X8 = 0xAF,
698 SlotTypePciExpressGen2X16 = 0xB0,
699 SlotTypePciExpressGen3 = 0xB1,
700 SlotTypePciExpressGen3X1 = 0xB2,
701 SlotTypePciExpressGen3X2 = 0xB3,
702 SlotTypePciExpressGen3X4 = 0xB4,
703 SlotTypePciExpressGen3X8 = 0xB5,
Elyes HAOUAS5d0942b2019-10-08 16:13:34 +0200704 SlotTypePciExpressGen3X16 = 0xB6,
705 SlotTypePciExpressGen4 = 0xB8,
706 SlotTypePciExpressGen4x1 = 0xB9,
707 SlotTypePciExpressGen4x2 = 0xBA,
708 SlotTypePciExpressGen4x4 = 0xBB,
709 SlotTypePciExpressGen4x8 = 0xBC,
710 SlotTypePciExpressGen4x16 = 0xBD
Lijian Zhaoe98a7512019-04-11 23:28:09 -0700711};
712
713/* System Slots - Slot Data Bus Width. */
714enum slot_data_bus_bandwidth {
715 SlotDataBusWidthOther = 0x01,
716 SlotDataBusWidthUnknown = 0x02,
717 SlotDataBusWidth8Bit = 0x03,
718 SlotDataBusWidth16Bit = 0x04,
719 SlotDataBusWidth32Bit = 0x05,
720 SlotDataBusWidth64Bit = 0x06,
721 SlotDataBusWidth128Bit = 0x07,
722 SlotDataBusWidth1X = 0x08,
723 SlotDataBusWidth2X = 0x09,
724 SlotDataBusWidth4X = 0x0A,
725 SlotDataBusWidth8X = 0x0B,
726 SlotDataBusWidth12X = 0x0C,
727 SlotDataBusWidth16X = 0x0D,
728 SlotDataBusWidth32X = 0x0E
729};
730
731/* System Slots - Current Usage. */
732enum misc_slot_usage {
733 SlotUsageOther = 0x01,
734 SlotUsageUnknown = 0x02,
735 SlotUsageAvailable = 0x03,
736 SlotUsageInUse = 0x04,
737 SlotUsageUnavailable = 0x05
738};
739
740/* System Slots - Slot Length.*/
741enum misc_slot_length {
742 SlotLengthOther = 0x01,
743 SlotLengthUnknown = 0x02,
744 SlotLengthShort = 0x03,
745 SlotLengthLong = 0x04
746};
747
748/* System Slots - Slot Characteristics 1. */
749#define SMBIOS_SLOT_UNKNOWN (1 << 0)
750#define SMBIOS_SLOT_5V (1 << 1)
751#define SMBIOS_SLOT_3P3V (1 << 2)
752#define SMBIOS_SLOT_SHARED (1 << 3)
753#define SMBIOS_SLOT_PCCARD_16 (1 << 4)
754#define SMBIOS_SLOT_PCCARD_CARDBUS (1 << 5)
755#define SMBIOS_SLOT_PCCARD_ZOOM (1 << 6)
756#define SMBIOS_SLOT_PCCARD_MODEM_RING (1 << 7)
757/* System Slots - Slot Characteristics 2. */
758#define SMBIOS_SLOT_PME (1 << 0)
759#define SMBIOS_SLOT_HOTPLUG (1 << 1)
760#define SMBIOS_SLOT_SMBUS (1 << 2)
761#define SMBIOS_SLOT_BIFURCATION (1 << 3)
762
763struct slot_peer_groups {
764 u16 peer_seg_num;
765 u8 peer_bus_num;
766 u8 peer_dev_fn_num;
767 u8 peer_data_bus_width;
768} __packed;
769
770struct smbios_type9 {
771 u8 type;
772 u8 length;
773 u16 handle;
774 u8 slot_designation;
775 u8 slot_type;
776 u8 slot_data_bus_width;
777 u8 current_usage;
778 u8 slot_length;
779 u16 slot_id;
780 u8 slot_characteristics_1;
781 u8 slot_characteristics_2;
782 u16 segment_group_number;
783 u8 bus_number;
784 u8 device_function_number;
785 u8 data_bus_width;
786 u8 peer_group_count;
787 struct slot_peer_groups peer[0];
788 u8 eos[2];
789} __packed;
790
Peter Stugec392b642013-07-06 19:51:12 +0200791struct smbios_type11 {
792 u8 type;
793 u8 length;
794 u16 handle;
795 u8 count;
Konstantin Aladyshevd0df1d72017-08-01 15:52:46 +0300796 u8 eos[2];
Stefan Reinauer6a001132017-07-13 02:20:27 +0200797} __packed;
Peter Stugec392b642013-07-06 19:51:12 +0200798
Duncan Laurie472ec9c2012-06-23 16:13:42 -0700799struct smbios_type15 {
800 u8 type;
801 u8 length;
802 u16 handle;
803 u16 area_length;
804 u16 header_offset;
805 u16 data_offset;
806 u8 access_method;
807 u8 log_status;
808 u32 change_token;
809 u32 address;
810 u8 header_format;
811 u8 log_type_descriptors;
812 u8 log_type_descriptor_length;
Konstantin Aladyshevd0df1d72017-08-01 15:52:46 +0300813 u8 eos[2];
Stefan Reinauer6a001132017-07-13 02:20:27 +0200814} __packed;
Duncan Laurie472ec9c2012-06-23 16:13:42 -0700815
816enum {
817 SMBIOS_EVENTLOG_ACCESS_METHOD_IO8 = 0,
818 SMBIOS_EVENTLOG_ACCESS_METHOD_IO8X2,
819 SMBIOS_EVENTLOG_ACCESS_METHOD_IO16,
820 SMBIOS_EVENTLOG_ACCESS_METHOD_MMIO32,
821 SMBIOS_EVENTLOG_ACCESS_METHOD_GPNV,
822};
823
824enum {
825 SMBIOS_EVENTLOG_STATUS_VALID = 1, /* Bit 0 */
826 SMBIOS_EVENTLOG_STATUS_FULL = 2, /* Bit 1 */
827};
828
Sven Schnelle164bcfd2011-08-14 20:56:34 +0200829struct smbios_type16 {
830 u8 type;
831 u8 length;
832 u16 handle;
833 u8 location;
834 u8 use;
835 u8 memory_error_correction;
836 u32 maximum_capacity;
837 u16 memory_error_information_handle;
838 u16 number_of_memory_devices;
839 u64 extended_maximum_capacity;
Konstantin Aladyshevd0df1d72017-08-01 15:52:46 +0300840 u8 eos[2];
Stefan Reinauer6a001132017-07-13 02:20:27 +0200841} __packed;
Sven Schnelle164bcfd2011-08-14 20:56:34 +0200842
843struct smbios_type17 {
844 u8 type;
845 u8 length;
846 u16 handle;
847 u16 phys_memory_array_handle;
848 u16 memory_error_information_handle;
849 u16 total_width;
850 u16 data_width;
851 u16 size;
852 u8 form_factor;
853 u8 device_set;
854 u8 device_locator;
855 u8 bank_locator;
856 u8 memory_type;
857 u16 type_detail;
858 u16 speed;
859 u8 manufacturer;
860 u8 serial_number;
861 u8 asset_tag;
862 u8 part_number;
863 u8 attributes;
Timothy Pearson964aa832015-09-05 19:00:34 -0500864 u32 extended_size;
Sven Schnelle164bcfd2011-08-14 20:56:34 +0200865 u16 clock_speed;
Timothy Pearson964aa832015-09-05 19:00:34 -0500866 u16 minimum_voltage;
867 u16 maximum_voltage;
868 u16 configured_voltage;
Konstantin Aladyshevd0df1d72017-08-01 15:52:46 +0300869 u8 eos[2];
Stefan Reinauer6a001132017-07-13 02:20:27 +0200870} __packed;
Sven Schnelle164bcfd2011-08-14 20:56:34 +0200871
Patrick Rudolph604295e2020-07-21 14:53:37 +0200872struct smbios_type19 {
873 u8 type;
874 u8 length;
875 u16 handle;
876 u32 starting_address;
877 u32 ending_address;
878 u16 memory_array_handle;
879 u8 partition_width;
880 u64 extended_starting_address;
881 u64 extended_ending_address;
882 u8 eos[2];
883} __packed;
884
Sven Schnelle164bcfd2011-08-14 20:56:34 +0200885struct smbios_type32 {
886 u8 type;
887 u8 length;
888 u16 handle;
889 u8 reserved[6];
890 u8 boot_status;
891 u8 eos[2];
Stefan Reinauer6a001132017-07-13 02:20:27 +0200892} __packed;
Sven Schnelle164bcfd2011-08-14 20:56:34 +0200893
Sven Schnelle6d038762012-07-09 08:52:53 +0200894struct smbios_type38 {
895 u8 type;
896 u8 length;
897 u16 handle;
898 u8 interface_type;
899 u8 ipmi_rev;
900 u8 i2c_slave_addr;
901 u8 nv_storage_addr;
902 u64 base_address;
903 u8 base_address_modifier;
904 u8 irq;
Lukasz Siudut2352a502019-02-19 10:06:09 +0000905 u8 eos[2];
Stefan Reinauer6a001132017-07-13 02:20:27 +0200906} __packed;
Sven Schnelle6d038762012-07-09 08:52:53 +0200907
Patrick Rudolphfe98e902018-03-27 16:17:12 +0200908enum smbios_bmc_interface_type {
909 SMBIOS_BMC_INTERFACE_UNKNOWN = 0,
910 SMBIOS_BMC_INTERFACE_KCS,
911 SMBIOS_BMC_INTERFACE_SMIC,
912 SMBIOS_BMC_INTERFACE_BLOCK,
Elyes HAOUASa5cc0cf2019-02-14 16:48:08 +0100913 SMBIOS_BMC_INTERFACE_SMBUS,
Patrick Rudolphfe98e902018-03-27 16:17:12 +0200914};
915
Stefan Reinauer3d7c6772012-04-02 13:30:10 -0700916typedef enum {
917 SMBIOS_DEVICE_TYPE_OTHER = 0x01,
918 SMBIOS_DEVICE_TYPE_UNKNOWN,
919 SMBIOS_DEVICE_TYPE_VIDEO,
920 SMBIOS_DEVICE_TYPE_SCSI,
921 SMBIOS_DEVICE_TYPE_ETHERNET,
922 SMBIOS_DEVICE_TYPE_TOKEN_RING,
923 SMBIOS_DEVICE_TYPE_SOUND,
924 SMBIOS_DEVICE_TYPE_PATA,
925 SMBIOS_DEVICE_TYPE_SATA,
926 SMBIOS_DEVICE_TYPE_SAS,
927} smbios_onboard_device_type;
928
Christian Walter9e5b0622019-05-21 17:37:58 +0200929#define SMBIOS_DEVICE_TYPE_COUNT 10
930
Stefan Reinauer3d7c6772012-04-02 13:30:10 -0700931struct smbios_type41 {
932 u8 type;
933 u8 length;
934 u16 handle;
935 u8 reference_designation;
936 u8 device_type: 7;
937 u8 device_status: 1;
938 u8 device_type_instance;
939 u16 segment_group_number;
940 u8 bus_number;
941 u8 function_number: 3;
942 u8 device_number: 5;
Konstantin Aladyshevd0df1d72017-08-01 15:52:46 +0300943 u8 eos[2];
Stefan Reinauer6a001132017-07-13 02:20:27 +0200944} __packed;
Stefan Reinauer3d7c6772012-04-02 13:30:10 -0700945
Sven Schnelle164bcfd2011-08-14 20:56:34 +0200946struct smbios_type127 {
947 u8 type;
948 u8 length;
949 u16 handle;
950 u8 eos[2];
Stefan Reinauer6a001132017-07-13 02:20:27 +0200951} __packed;
Sven Schnelle164bcfd2011-08-14 20:56:34 +0200952
Lee Leahy6a566d72017-03-07 17:45:12 -0800953void smbios_fill_dimm_manufacturer_from_id(uint16_t mod_id,
954 struct smbios_type17 *t);
Lijian Zhao10ea93c2019-04-11 00:45:10 -0700955void smbios_fill_dimm_locator(const struct dimm_info *dimm,
956 struct smbios_type17 *t);
Timothy Pearson4785f2a2015-03-27 23:05:36 -0500957
Julien Viard de Galbert9a31dfe2018-02-22 16:39:58 +0100958smbios_board_type smbios_mainboard_board_type(void);
Mathew Kingbe820b32019-10-31 12:10:44 -0600959smbios_enclosure_type smbios_mainboard_enclosure_type(void);
Julien Viard de Galbert9a31dfe2018-02-22 16:39:58 +0100960
Sven Schnelle164bcfd2011-08-14 20:56:34 +0200961#endif