xref: /qemu/include/hw/firmware/smbios.h (revision 9cd7fd69cfad9180e22b9adb728fc7b596b4bc1e)
1b6f6e3d3Saliguori #ifndef QEMU_SMBIOS_H
2b6f6e3d3Saliguori #define QEMU_SMBIOS_H
3175de524SMarkus Armbruster 
4bdf54a9aSEduardo Habkost #include "qapi/qapi-types-machine.h"
5bdf54a9aSEduardo Habkost 
6b6f6e3d3Saliguori /*
7b6f6e3d3Saliguori  * SMBIOS Support
8b6f6e3d3Saliguori  *
9b6f6e3d3Saliguori  * Copyright (C) 2009 Hewlett-Packard Development Company, L.P.
10b6f6e3d3Saliguori  *
11b6f6e3d3Saliguori  * Authors:
12b6f6e3d3Saliguori  *  Alex Williamson <alex.williamson@hp.com>
13b6f6e3d3Saliguori  *
14b6f6e3d3Saliguori  * This work is licensed under the terms of the GNU GPL, version 2.  See
15b6f6e3d3Saliguori  * the COPYING file in the top-level directory.
16b6f6e3d3Saliguori  *
17b6f6e3d3Saliguori  */
18b6f6e3d3Saliguori 
194f953d2fSMarkus Armbruster 
202e6e8d7aSGabriel L. Somlo #define SMBIOS_MAX_TYPE 127
2105e27d74SJulia Suvorova #define offsetofend(TYPE, MEMBER) \
2205e27d74SJulia Suvorova        (offsetof(TYPE, MEMBER) + sizeof_field(TYPE, MEMBER))
232e6e8d7aSGabriel L. Somlo 
2489cc4a27SWei Huang /* memory area description, used by type 19 table */
2589cc4a27SWei Huang struct smbios_phys_mem_area {
2689cc4a27SWei Huang     uint64_t address;
2789cc4a27SWei Huang     uint64_t length;
2889cc4a27SWei Huang };
2989cc4a27SWei Huang 
3086299120SWei Huang /* SMBIOS Entry Point
3186299120SWei Huang  * There are two types of entry points defined in the SMBIOS specification
32cc2324d0SCao jin  * (see below). BIOS must place the entry point(s) at a 16-byte-aligned
3386299120SWei Huang  * address between 0xf0000 and 0xfffff. Note that either entry point type
3486299120SWei Huang  * can be used in a 64-bit target system, except that SMBIOS 2.1 entry point
3586299120SWei Huang  * only allows the SMBIOS struct table to reside below 4GB address space.
36e41fca3dSGabriel L. Somlo  */
3786299120SWei Huang 
3886299120SWei Huang /* SMBIOS 2.1 (32-bit) Entry Point
3986299120SWei Huang  *  - introduced since SMBIOS 2.1
4086299120SWei Huang  *  - supports structure table below 4GB only
4186299120SWei Huang  */
4286299120SWei Huang struct smbios_21_entry_point {
43e41fca3dSGabriel L. Somlo     uint8_t anchor_string[4];
44e41fca3dSGabriel L. Somlo     uint8_t checksum;
45e41fca3dSGabriel L. Somlo     uint8_t length;
46e41fca3dSGabriel L. Somlo     uint8_t smbios_major_version;
47e41fca3dSGabriel L. Somlo     uint8_t smbios_minor_version;
48e41fca3dSGabriel L. Somlo     uint16_t max_structure_size;
49e41fca3dSGabriel L. Somlo     uint8_t entry_point_revision;
50e41fca3dSGabriel L. Somlo     uint8_t formatted_area[5];
51e41fca3dSGabriel L. Somlo     uint8_t intermediate_anchor_string[5];
52e41fca3dSGabriel L. Somlo     uint8_t intermediate_checksum;
53e41fca3dSGabriel L. Somlo     uint16_t structure_table_length;
54e41fca3dSGabriel L. Somlo     uint32_t structure_table_address;
55e41fca3dSGabriel L. Somlo     uint16_t number_of_structures;
56e41fca3dSGabriel L. Somlo     uint8_t smbios_bcd_revision;
57e41fca3dSGabriel L. Somlo } QEMU_PACKED;
58e41fca3dSGabriel L. Somlo 
5986299120SWei Huang /* SMBIOS 3.0 (64-bit) Entry Point
6086299120SWei Huang  *  - introduced since SMBIOS 3.0
6186299120SWei Huang  *  - supports structure table at 64-bit address space
6286299120SWei Huang  */
6386299120SWei Huang struct smbios_30_entry_point {
6486299120SWei Huang     uint8_t anchor_string[5];
6586299120SWei Huang     uint8_t checksum;
6686299120SWei Huang     uint8_t length;
6786299120SWei Huang     uint8_t smbios_major_version;
6886299120SWei Huang     uint8_t smbios_minor_version;
6986299120SWei Huang     uint8_t smbios_doc_rev;
7086299120SWei Huang     uint8_t entry_point_revision;
7186299120SWei Huang     uint8_t reserved;
7286299120SWei Huang     uint32_t structure_table_max_size;
7386299120SWei Huang     uint64_t structure_table_address;
7486299120SWei Huang } QEMU_PACKED;
7586299120SWei Huang 
7686299120SWei Huang typedef union {
7786299120SWei Huang     struct smbios_21_entry_point ep21;
7886299120SWei Huang     struct smbios_30_entry_point ep30;
7986299120SWei Huang } QEMU_PACKED SmbiosEntryPoint;
8086299120SWei Huang 
81b6f6e3d3Saliguori /* This goes at the beginning of every SMBIOS structure. */
82b6f6e3d3Saliguori struct smbios_structure_header {
83b6f6e3d3Saliguori     uint8_t type;
84b6f6e3d3Saliguori     uint8_t length;
85b6f6e3d3Saliguori     uint16_t handle;
86541dc0d4SStefan Weil } QEMU_PACKED;
87b6f6e3d3Saliguori 
88b6f6e3d3Saliguori /* SMBIOS type 0 - BIOS Information */
89b6f6e3d3Saliguori struct smbios_type_0 {
90b6f6e3d3Saliguori     struct smbios_structure_header header;
91b6f6e3d3Saliguori     uint8_t vendor_str;
92b6f6e3d3Saliguori     uint8_t bios_version_str;
93b6f6e3d3Saliguori     uint16_t bios_starting_address_segment;
94b6f6e3d3Saliguori     uint8_t bios_release_date_str;
95b6f6e3d3Saliguori     uint8_t bios_rom_size;
9684351843SGabriel L. Somlo     uint64_t bios_characteristics;
97b6f6e3d3Saliguori     uint8_t bios_characteristics_extension_bytes[2];
98b6f6e3d3Saliguori     uint8_t system_bios_major_release;
99b6f6e3d3Saliguori     uint8_t system_bios_minor_release;
100b6f6e3d3Saliguori     uint8_t embedded_controller_major_release;
101b6f6e3d3Saliguori     uint8_t embedded_controller_minor_release;
102541dc0d4SStefan Weil } QEMU_PACKED;
103b6f6e3d3Saliguori 
104caad057bSEduardo Habkost /* UUID encoding. The time_* fields are little-endian, as specified by SMBIOS
105caad057bSEduardo Habkost  * version 2.6.
106caad057bSEduardo Habkost  */
107caad057bSEduardo Habkost struct smbios_uuid {
108caad057bSEduardo Habkost     uint32_t time_low;
109caad057bSEduardo Habkost     uint16_t time_mid;
110caad057bSEduardo Habkost     uint16_t time_hi_and_version;
111caad057bSEduardo Habkost     uint8_t clock_seq_hi_and_reserved;
112caad057bSEduardo Habkost     uint8_t clock_seq_low;
113caad057bSEduardo Habkost     uint8_t node[6];
114caad057bSEduardo Habkost } QEMU_PACKED;
115caad057bSEduardo Habkost 
116b6f6e3d3Saliguori /* SMBIOS type 1 - System Information */
117b6f6e3d3Saliguori struct smbios_type_1 {
118b6f6e3d3Saliguori     struct smbios_structure_header header;
119b6f6e3d3Saliguori     uint8_t manufacturer_str;
120b6f6e3d3Saliguori     uint8_t product_name_str;
121b6f6e3d3Saliguori     uint8_t version_str;
122b6f6e3d3Saliguori     uint8_t serial_number_str;
123caad057bSEduardo Habkost     struct smbios_uuid uuid;
124b6f6e3d3Saliguori     uint8_t wake_up_type;
125b6f6e3d3Saliguori     uint8_t sku_number_str;
126b6f6e3d3Saliguori     uint8_t family_str;
127541dc0d4SStefan Weil } QEMU_PACKED;
128b6f6e3d3Saliguori 
129e41fca3dSGabriel L. Somlo /* SMBIOS type 2 - Base Board */
130e41fca3dSGabriel L. Somlo struct smbios_type_2 {
131e41fca3dSGabriel L. Somlo     struct smbios_structure_header header;
132e41fca3dSGabriel L. Somlo     uint8_t manufacturer_str;
133e41fca3dSGabriel L. Somlo     uint8_t product_str;
134e41fca3dSGabriel L. Somlo     uint8_t version_str;
135e41fca3dSGabriel L. Somlo     uint8_t serial_number_str;
136e41fca3dSGabriel L. Somlo     uint8_t asset_tag_number_str;
137e41fca3dSGabriel L. Somlo     uint8_t feature_flags;
138e41fca3dSGabriel L. Somlo     uint8_t location_str;
139e41fca3dSGabriel L. Somlo     uint16_t chassis_handle;
140e41fca3dSGabriel L. Somlo     uint8_t board_type;
141e41fca3dSGabriel L. Somlo     uint8_t contained_element_count;
142e41fca3dSGabriel L. Somlo     /* contained elements follow */
143e41fca3dSGabriel L. Somlo } QEMU_PACKED;
144e41fca3dSGabriel L. Somlo 
145e41fca3dSGabriel L. Somlo /* SMBIOS type 3 - System Enclosure (v2.7) */
146b6f6e3d3Saliguori struct smbios_type_3 {
147b6f6e3d3Saliguori     struct smbios_structure_header header;
148b6f6e3d3Saliguori     uint8_t manufacturer_str;
149b6f6e3d3Saliguori     uint8_t type;
150b6f6e3d3Saliguori     uint8_t version_str;
151b6f6e3d3Saliguori     uint8_t serial_number_str;
152b6f6e3d3Saliguori     uint8_t asset_tag_number_str;
153b6f6e3d3Saliguori     uint8_t boot_up_state;
154b6f6e3d3Saliguori     uint8_t power_supply_state;
155b6f6e3d3Saliguori     uint8_t thermal_state;
156b6f6e3d3Saliguori     uint8_t security_status;
157b6f6e3d3Saliguori     uint32_t oem_defined;
158b6f6e3d3Saliguori     uint8_t height;
159b6f6e3d3Saliguori     uint8_t number_of_power_cords;
160b6f6e3d3Saliguori     uint8_t contained_element_count;
161b81a5f94SDaniel P. Berrangé     uint8_t contained_element_record_length;
162e41fca3dSGabriel L. Somlo     uint8_t sku_number_str;
163e41fca3dSGabriel L. Somlo     /* contained elements follow */
164541dc0d4SStefan Weil } QEMU_PACKED;
165b6f6e3d3Saliguori 
166e41fca3dSGabriel L. Somlo /* SMBIOS type 4 - Processor Information (v2.6) */
167b6f6e3d3Saliguori struct smbios_type_4 {
168b6f6e3d3Saliguori     struct smbios_structure_header header;
169b6f6e3d3Saliguori     uint8_t socket_designation_str;
170b6f6e3d3Saliguori     uint8_t processor_type;
171b6f6e3d3Saliguori     uint8_t processor_family;
172b6f6e3d3Saliguori     uint8_t processor_manufacturer_str;
173b6f6e3d3Saliguori     uint32_t processor_id[2];
174b6f6e3d3Saliguori     uint8_t processor_version_str;
175b6f6e3d3Saliguori     uint8_t voltage;
176b6f6e3d3Saliguori     uint16_t external_clock;
177b6f6e3d3Saliguori     uint16_t max_speed;
178b6f6e3d3Saliguori     uint16_t current_speed;
179b6f6e3d3Saliguori     uint8_t status;
180b6f6e3d3Saliguori     uint8_t processor_upgrade;
181b6f6e3d3Saliguori     uint16_t l1_cache_handle;
182b6f6e3d3Saliguori     uint16_t l2_cache_handle;
183b6f6e3d3Saliguori     uint16_t l3_cache_handle;
184e41fca3dSGabriel L. Somlo     uint8_t serial_number_str;
185e41fca3dSGabriel L. Somlo     uint8_t asset_tag_number_str;
186e41fca3dSGabriel L. Somlo     uint8_t part_number_str;
187e41fca3dSGabriel L. Somlo     uint8_t core_count;
188e41fca3dSGabriel L. Somlo     uint8_t core_enabled;
189e41fca3dSGabriel L. Somlo     uint8_t thread_count;
190e41fca3dSGabriel L. Somlo     uint16_t processor_characteristics;
191e41fca3dSGabriel L. Somlo     uint16_t processor_family2;
19205e27d74SJulia Suvorova     /* SMBIOS spec 3.0.0, Table 21 */
19305e27d74SJulia Suvorova     uint16_t core_count2;
19405e27d74SJulia Suvorova     uint16_t core_enabled2;
19505e27d74SJulia Suvorova     uint16_t thread_count2;
196541dc0d4SStefan Weil } QEMU_PACKED;
197b6f6e3d3Saliguori 
19805e27d74SJulia Suvorova typedef enum smbios_type_4_len_ver {
19905e27d74SJulia Suvorova     SMBIOS_TYPE_4_LEN_V28 = offsetofend(struct smbios_type_4,
20005e27d74SJulia Suvorova                                         processor_family2),
20105e27d74SJulia Suvorova     SMBIOS_TYPE_4_LEN_V30 = offsetofend(struct smbios_type_4, thread_count2),
20205e27d74SJulia Suvorova } smbios_type_4_len_ver;
20305e27d74SJulia Suvorova 
204fd8caa25SHal Martin /* SMBIOS type 8 - Port Connector Information */
205fd8caa25SHal Martin struct smbios_type_8 {
206fd8caa25SHal Martin     struct smbios_structure_header header;
207fd8caa25SHal Martin     uint8_t internal_reference_str;
208fd8caa25SHal Martin     uint8_t internal_connector_type;
209fd8caa25SHal Martin     uint8_t external_reference_str;
210fd8caa25SHal Martin     uint8_t external_connector_type;
211fd8caa25SHal Martin     uint8_t port_type;
212fd8caa25SHal Martin } QEMU_PACKED;
213fd8caa25SHal Martin 
214735eee07SFelix Wu /* SMBIOS type 9 - System Slots (v2.1+) */
215735eee07SFelix Wu struct smbios_type_9 {
216735eee07SFelix Wu     struct smbios_structure_header header;
217735eee07SFelix Wu     uint8_t slot_designation;
218735eee07SFelix Wu     uint8_t slot_type;
219735eee07SFelix Wu     uint8_t slot_data_bus_width;
220735eee07SFelix Wu     uint8_t current_usage;
221735eee07SFelix Wu     uint8_t slot_length;
222735eee07SFelix Wu     uint16_t slot_id;
223735eee07SFelix Wu     uint8_t slot_characteristics1;
224735eee07SFelix Wu     uint8_t slot_characteristics2;
22504f143d8SFelix Wu     /* SMBIOS spec v2.6+ */
22604f143d8SFelix Wu     uint16_t segment_group_number;
22704f143d8SFelix Wu     uint8_t bus_number;
22804f143d8SFelix Wu     uint8_t device_number;
229735eee07SFelix Wu } QEMU_PACKED;
230735eee07SFelix Wu 
2312d6dcbf9SDaniel P. Berrange /* SMBIOS type 11 - OEM strings */
2322d6dcbf9SDaniel P. Berrange struct smbios_type_11 {
2332d6dcbf9SDaniel P. Berrange     struct smbios_structure_header header;
2342d6dcbf9SDaniel P. Berrange     uint8_t count;
2352d6dcbf9SDaniel P. Berrange } QEMU_PACKED;
2362d6dcbf9SDaniel P. Berrange 
237e41fca3dSGabriel L. Somlo /* SMBIOS type 16 - Physical Memory Array (v2.7) */
238b6f6e3d3Saliguori struct smbios_type_16 {
239b6f6e3d3Saliguori     struct smbios_structure_header header;
240b6f6e3d3Saliguori     uint8_t location;
241b6f6e3d3Saliguori     uint8_t use;
242b6f6e3d3Saliguori     uint8_t error_correction;
243b6f6e3d3Saliguori     uint32_t maximum_capacity;
244b6f6e3d3Saliguori     uint16_t memory_error_information_handle;
245b6f6e3d3Saliguori     uint16_t number_of_memory_devices;
246e41fca3dSGabriel L. Somlo     uint64_t extended_maximum_capacity;
247541dc0d4SStefan Weil } QEMU_PACKED;
248e41fca3dSGabriel L. Somlo 
249e41fca3dSGabriel L. Somlo /* SMBIOS type 17 - Memory Device (v2.8) */
250b6f6e3d3Saliguori struct smbios_type_17 {
251b6f6e3d3Saliguori     struct smbios_structure_header header;
252b6f6e3d3Saliguori     uint16_t physical_memory_array_handle;
253b6f6e3d3Saliguori     uint16_t memory_error_information_handle;
254b6f6e3d3Saliguori     uint16_t total_width;
255b6f6e3d3Saliguori     uint16_t data_width;
256b6f6e3d3Saliguori     uint16_t size;
257b6f6e3d3Saliguori     uint8_t form_factor;
258b6f6e3d3Saliguori     uint8_t device_set;
259b6f6e3d3Saliguori     uint8_t device_locator_str;
260b6f6e3d3Saliguori     uint8_t bank_locator_str;
261b6f6e3d3Saliguori     uint8_t memory_type;
262b6f6e3d3Saliguori     uint16_t type_detail;
263e41fca3dSGabriel L. Somlo     uint16_t speed;
264e41fca3dSGabriel L. Somlo     uint8_t manufacturer_str;
265e41fca3dSGabriel L. Somlo     uint8_t serial_number_str;
266e41fca3dSGabriel L. Somlo     uint8_t asset_tag_number_str;
267e41fca3dSGabriel L. Somlo     uint8_t part_number_str;
268e41fca3dSGabriel L. Somlo     uint8_t attributes;
269e41fca3dSGabriel L. Somlo     uint32_t extended_size;
2700d73394aSGabriel L. Somlo     uint16_t configured_clock_speed;
2710d73394aSGabriel L. Somlo     uint16_t minimum_voltage;
2720d73394aSGabriel L. Somlo     uint16_t maximum_voltage;
2730d73394aSGabriel L. Somlo     uint16_t configured_voltage;
274541dc0d4SStefan Weil } QEMU_PACKED;
275b6f6e3d3Saliguori 
276e41fca3dSGabriel L. Somlo /* SMBIOS type 19 - Memory Array Mapped Address (v2.7) */
277b6f6e3d3Saliguori struct smbios_type_19 {
278b6f6e3d3Saliguori     struct smbios_structure_header header;
279b6f6e3d3Saliguori     uint32_t starting_address;
280b6f6e3d3Saliguori     uint32_t ending_address;
281b6f6e3d3Saliguori     uint16_t memory_array_handle;
282b6f6e3d3Saliguori     uint8_t partition_width;
283e41fca3dSGabriel L. Somlo     uint64_t extended_starting_address;
284e41fca3dSGabriel L. Somlo     uint64_t extended_ending_address;
285541dc0d4SStefan Weil } QEMU_PACKED;
286b6f6e3d3Saliguori 
287b6f6e3d3Saliguori /* SMBIOS type 32 - System Boot Information */
288b6f6e3d3Saliguori struct smbios_type_32 {
289b6f6e3d3Saliguori     struct smbios_structure_header header;
290b6f6e3d3Saliguori     uint8_t reserved[6];
291b6f6e3d3Saliguori     uint8_t boot_status;
292541dc0d4SStefan Weil } QEMU_PACKED;
293b6f6e3d3Saliguori 
29405dfb447SVincent Bernat /* SMBIOS type 41 - Onboard Devices Extended Information */
29505dfb447SVincent Bernat struct smbios_type_41 {
29605dfb447SVincent Bernat     struct smbios_structure_header header;
29705dfb447SVincent Bernat     uint8_t reference_designation_str;
29805dfb447SVincent Bernat     uint8_t device_type;
29905dfb447SVincent Bernat     uint8_t device_type_instance;
30005dfb447SVincent Bernat     uint16_t segment_group_number;
30105dfb447SVincent Bernat     uint8_t bus_number;
30205dfb447SVincent Bernat     uint8_t device_number;
30305dfb447SVincent Bernat } QEMU_PACKED;
30405dfb447SVincent Bernat 
305b6f6e3d3Saliguori /* SMBIOS type 127 -- End-of-table */
306b6f6e3d3Saliguori struct smbios_type_127 {
307b6f6e3d3Saliguori     struct smbios_structure_header header;
308541dc0d4SStefan Weil } QEMU_PACKED;
309b6f6e3d3Saliguori 
3101007a37eSLeif Lindholm void smbios_entry_add(QemuOpts *opts, Error **errp);
31186299120SWei Huang void smbios_set_cpuid(uint32_t version, uint32_t features);
31286299120SWei Huang void smbios_set_defaults(const char *manufacturer, const char *product,
313b3854ce8SIgor Mammedov                          const char *version,
31486299120SWei Huang                          bool uuid_encoded, SmbiosEntryPointType ep_type);
3156f3b727bSHeinrich Schuchardt void smbios_set_default_processor_family(uint16_t processor_family);
316*9cd7fd69SIgor Mammedov uint8_t *smbios_get_table_legacy(size_t *length);
317a0628599SLike Xu void smbios_get_tables(MachineState *ms,
318a0628599SLike Xu                        const struct smbios_phys_mem_area *mem_array,
31986299120SWei Huang                        const unsigned int mem_array_size,
32086299120SWei Huang                        uint8_t **tables, size_t *tables_len,
32105dfb447SVincent Bernat                        uint8_t **anchor, size_t *anchor_len,
32205dfb447SVincent Bernat                        Error **errp);
323b6f6e3d3Saliguori #endif /* QEMU_SMBIOS_H */
324