]> Git Repo - u-boot.git/blob - include/smbios.h
Merge tag 'smbios-2024-04-rc2' of https://source.denx.de/u-boot/custodians/u-boot-efi
[u-boot.git] / include / smbios.h
1 /* SPDX-License-Identifier: GPL-2.0+ */
2 /*
3  * Copyright (C) 2015, Bin Meng <[email protected]>
4  *
5  * Adapted from coreboot src/include/smbios.h
6  */
7
8 #ifndef _SMBIOS_H_
9 #define _SMBIOS_H_
10
11 #include <linux/types.h>
12
13 /* SMBIOS spec version implemented */
14 #define SMBIOS_MAJOR_VER        3
15 #define SMBIOS_MINOR_VER        7
16
17 enum {
18         SMBIOS_STR_MAX  = 64,   /* Maximum length allowed for a string */
19 };
20
21 /* SMBIOS structure types */
22 enum {
23         SMBIOS_BIOS_INFORMATION = 0,
24         SMBIOS_SYSTEM_INFORMATION = 1,
25         SMBIOS_BOARD_INFORMATION = 2,
26         SMBIOS_SYSTEM_ENCLOSURE = 3,
27         SMBIOS_PROCESSOR_INFORMATION = 4,
28         SMBIOS_CACHE_INFORMATION = 7,
29         SMBIOS_SYSTEM_SLOTS = 9,
30         SMBIOS_PHYS_MEMORY_ARRAY = 16,
31         SMBIOS_MEMORY_DEVICE = 17,
32         SMBIOS_MEMORY_ARRAY_MAPPED_ADDRESS = 19,
33         SMBIOS_SYSTEM_BOOT_INFORMATION = 32,
34         SMBIOS_END_OF_TABLE = 127
35 };
36
37 #define SMBIOS_INTERMEDIATE_OFFSET      16
38 #define SMBIOS_STRUCT_EOS_BYTES         2
39
40 struct __packed smbios_entry {
41         u8 anchor[4];
42         u8 checksum;
43         u8 length;
44         u8 major_ver;
45         u8 minor_ver;
46         u16 max_struct_size;
47         u8 entry_point_rev;
48         u8 formatted_area[5];
49         u8 intermediate_anchor[5];
50         u8 intermediate_checksum;
51         u16 struct_table_length;
52         u32 struct_table_address;
53         u16 struct_count;
54         u8 bcd_rev;
55 };
56
57 /**
58  * struct smbios3_entry - SMBIOS 3.0 (64-bit) Entry Point structure
59  */
60 struct __packed smbios3_entry {
61         /** @anchor: anchor string */
62         u8 anchor[5];
63         /** @checksum: checksum of the entry point structure */
64         u8 checksum;
65         /** @length: length of the entry point structure */
66         u8 length;
67         /** @major_ver: major version of the SMBIOS specification */
68         u8 major_ver;
69         /** @minor_ver: minor version of the SMBIOS specification */
70         u8 minor_ver;
71         /** @docrev: revision of the SMBIOS specification */
72         u8 doc_rev;
73         /** @entry_point_rev: revision of the entry point structure */
74         u8 entry_point_rev;
75         /** @reserved: reserved */
76         u8 reserved;
77         /** maximum size of SMBIOS table */
78         u32 table_maximum_size;
79         /** @struct_table_address: 64-bit physical starting address */
80         u64 struct_table_address;
81 };
82
83 /* BIOS characteristics */
84 #define BIOS_CHARACTERISTICS_PCI_SUPPORTED      (1 << 7)
85 #define BIOS_CHARACTERISTICS_UPGRADEABLE        (1 << 11)
86 #define BIOS_CHARACTERISTICS_SELECTABLE_BOOT    (1 << 16)
87
88 #define BIOS_CHARACTERISTICS_EXT1_ACPI          (1 << 0)
89 #define BIOS_CHARACTERISTICS_EXT2_UEFI          (1 << 3)
90 #define BIOS_CHARACTERISTICS_EXT2_TARGET        (1 << 2)
91
92 struct __packed smbios_type0 {
93         u8 type;
94         u8 length;
95         u16 handle;
96         u8 vendor;
97         u8 bios_ver;
98         u16 bios_start_segment;
99         u8 bios_release_date;
100         u8 bios_rom_size;
101         u64 bios_characteristics;
102         u8 bios_characteristics_ext1;
103         u8 bios_characteristics_ext2;
104         u8 bios_major_release;
105         u8 bios_minor_release;
106         u8 ec_major_release;
107         u8 ec_minor_release;
108         char eos[SMBIOS_STRUCT_EOS_BYTES];
109 };
110
111 struct __packed smbios_type1 {
112         u8 type;
113         u8 length;
114         u16 handle;
115         u8 manufacturer;
116         u8 product_name;
117         u8 version;
118         u8 serial_number;
119         u8 uuid[16];
120         u8 wakeup_type;
121         u8 sku_number;
122         u8 family;
123         char eos[SMBIOS_STRUCT_EOS_BYTES];
124 };
125
126 #define SMBIOS_BOARD_FEATURE_HOSTING    (1 << 0)
127 #define SMBIOS_BOARD_MOTHERBOARD        10
128
129 struct __packed smbios_type2 {
130         u8 type;
131         u8 length;
132         u16 handle;
133         u8 manufacturer;
134         u8 product_name;
135         u8 version;
136         u8 serial_number;
137         u8 asset_tag_number;
138         u8 feature_flags;
139         u8 chassis_location;
140         u16 chassis_handle;
141         u8 board_type;
142         u8 number_contained_objects;
143         char eos[SMBIOS_STRUCT_EOS_BYTES];
144 };
145
146 #define SMBIOS_ENCLOSURE_DESKTOP        3
147 #define SMBIOS_STATE_SAFE               3
148 #define SMBIOS_SECURITY_NONE            3
149
150 struct __packed smbios_type3 {
151         u8 type;
152         u8 length;
153         u16 handle;
154         u8 manufacturer;
155         u8 chassis_type;
156         u8 version;
157         u8 serial_number;
158         u8 asset_tag_number;
159         u8 bootup_state;
160         u8 power_supply_state;
161         u8 thermal_state;
162         u8 security_status;
163         u32 oem_defined;
164         u8 height;
165         u8 number_of_power_cords;
166         u8 element_count;
167         u8 element_record_length;
168         char eos[SMBIOS_STRUCT_EOS_BYTES];
169 };
170
171 #define SMBIOS_PROCESSOR_TYPE_CENTRAL   3
172 #define SMBIOS_PROCESSOR_STATUS_ENABLED 1
173 #define SMBIOS_PROCESSOR_UPGRADE_NONE   6
174
175 #define SMBIOS_PROCESSOR_FAMILY_OTHER   1
176 #define SMBIOS_PROCESSOR_FAMILY_UNKNOWN 2
177
178 struct __packed smbios_type4 {
179         u8 type;
180         u8 length;
181         u16 handle;
182         u8 socket_designation;
183         u8 processor_type;
184         u8 processor_family;
185         u8 processor_manufacturer;
186         u32 processor_id[2];
187         u8 processor_version;
188         u8 voltage;
189         u16 external_clock;
190         u16 max_speed;
191         u16 current_speed;
192         u8 status;
193         u8 processor_upgrade;
194         u16 l1_cache_handle;
195         u16 l2_cache_handle;
196         u16 l3_cache_handle;
197         u8 serial_number;
198         u8 asset_tag;
199         u8 part_number;
200         u8 core_count;
201         u8 core_enabled;
202         u8 thread_count;
203         u16 processor_characteristics;
204         u16 processor_family2;
205         u16 core_count2;
206         u16 core_enabled2;
207         u16 thread_count2;
208         char eos[SMBIOS_STRUCT_EOS_BYTES];
209 };
210
211 struct __packed smbios_type32 {
212         u8 type;
213         u8 length;
214         u16 handle;
215         u8 reserved[6];
216         u8 boot_status;
217         char eos[SMBIOS_STRUCT_EOS_BYTES];
218 };
219
220 struct __packed smbios_type127 {
221         u8 type;
222         u8 length;
223         u16 handle;
224         char eos[SMBIOS_STRUCT_EOS_BYTES];
225 };
226
227 struct __packed smbios_header {
228         u8 type;
229         u8 length;
230         u16 handle;
231 };
232
233 /**
234  * fill_smbios_header() - Fill the header of an SMBIOS table
235  *
236  * This fills the header of an SMBIOS table structure.
237  *
238  * @table:      start address of the structure
239  * @type:       the type of structure
240  * @length:     the length of the formatted area of the structure
241  * @handle:     the structure's handle, a unique 16-bit number
242  */
243 static inline void fill_smbios_header(void *table, int type,
244                                       int length, int handle)
245 {
246         struct smbios_header *header = table;
247
248         header->type = type;
249         header->length = length - SMBIOS_STRUCT_EOS_BYTES;
250         header->handle = handle;
251 }
252
253 /**
254  * write_smbios_table() - Write SMBIOS table
255  *
256  * This writes SMBIOS table at a given address.
257  *
258  * @addr:       start address to write SMBIOS table, 16-byte-alignment
259  * recommended. Note that while the SMBIOS tables themself have no alignment
260  * requirement, some systems may requires alignment. For example x86 systems
261  * which put tables at f0000 require 16-byte alignment
262  *
263  * Return:      end address of SMBIOS table (and start address for next entry)
264  *              or NULL in case of an error
265  */
266 ulong write_smbios_table(ulong addr);
267
268 /**
269  * smbios_entry() - Get a valid struct smbios_entry pointer
270  *
271  * @address:   address where smbios tables is located
272  * @size:      size of smbios table
273  * @return:    NULL or a valid pointer to a struct smbios_entry
274  */
275 const struct smbios_entry *smbios_entry(u64 address, u32 size);
276
277 /**
278  * smbios_header() - Search for SMBIOS header type
279  *
280  * @entry:     pointer to a struct smbios_entry
281  * @type:      SMBIOS type
282  * @return:    NULL or a valid pointer to a struct smbios_header
283  */
284 const struct smbios_header *smbios_header(const struct smbios_entry *entry, int type);
285
286 /**
287  * smbios_string() - Return string from SMBIOS
288  *
289  * @header:    pointer to struct smbios_header
290  * @index:     string index
291  * @return:    NULL or a valid char pointer
292  */
293 char *smbios_string(const struct smbios_header *header, int index);
294
295 /**
296  * smbios_update_version() - Update the version string
297  *
298  * This can be called after the SMBIOS tables are written (e.g. after the U-Boot
299  * main loop has started) to update the BIOS version string (SMBIOS table 0).
300  *
301  * @version: New version string to use
302  * Return: 0 if OK, -ENOENT if no version string was previously written,
303  *      -ENOSPC if the new string is too large to fit
304  */
305 int smbios_update_version(const char *version);
306
307 /**
308  * smbios_update_version_full() - Update the version string
309  *
310  * This can be called after the SMBIOS tables are written (e.g. after the U-Boot
311  * main loop has started) to update the BIOS version string (SMBIOS table 0).
312  * It scans for the correct place to put the version, so does not need U-Boot
313  * to have actually written the tables itself (e.g. if a previous bootloader
314  * did it).
315  *
316  * @smbios_tab: Start of SMBIOS tables
317  * @version: New version string to use
318  * Return: 0 if OK, -ENOENT if no version string was previously written,
319  *      -ENOSPC if the new string is too large to fit
320  */
321 int smbios_update_version_full(void *smbios_tab, const char *version);
322
323 /**
324  * smbios_prepare_measurement() - Update smbios table for the measurement
325  *
326  * TCG specification requires to measure static configuration information.
327  * This function clear the device dependent parameters such as
328  * serial number for the measurement.
329  *
330  * @entry: pointer to a struct smbios3_entry
331  * @header: pointer to a struct smbios_header
332  */
333 void smbios_prepare_measurement(const struct smbios3_entry *entry,
334                                 struct smbios_header *header);
335
336 #endif /* _SMBIOS_H_ */
This page took 0.047102 seconds and 4 git commands to generate.