xref: /titanic_52/usr/src/uts/common/sys/smbios.h (revision 9a0230e14eeca531332705f4152eb19975093c0e)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 
22 /*
23  * Copyright 2015 OmniTI Computer Consulting, Inc. All rights reserved.
24  * Copyright (c) 2017, Joyent, Inc.
25  * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
26  * Use is subject to license terms.
27  */
28 
29 /*
30  * This header file defines the interfaces available from the SMBIOS access
31  * library, libsmbios, and an equivalent kernel module.  This API can be used
32  * to access DMTF SMBIOS data from a device, file, or raw memory buffer.
33  *
34  * This is NOT a Public interface, and should be considered Unstable, as it is
35  * subject to change without notice as the DMTF SMBIOS specification evolves.
36  * Therefore, be aware that any program linked with this API in this
37  * instance of illumos is almost guaranteed to break in the next release.
38  */
39 
40 #ifndef	_SYS_SMBIOS_H
41 #define	_SYS_SMBIOS_H
42 
43 #include <sys/types.h>
44 
45 #ifdef	__cplusplus
46 extern "C" {
47 #endif
48 
49 typedef enum smbios_entry_point_type {
50 	SMBIOS_ENTRY_POINT_21,
51 	SMBIOS_ENTRY_POINT_30
52 } smbios_entry_point_t;
53 
54 /*
55  * SMBIOS Structure Table Entry Point.  See DSP0134 5.2.1 for more information.
56  * The structure table entry point is located by searching for the anchor.
57  */
58 #pragma pack(1)
59 
60 typedef struct smbios_21_entry {
61 	char smbe_eanchor[4];		/* anchor tag (SMB_ENTRY_EANCHOR) */
62 	uint8_t smbe_ecksum;		/* checksum of entry point structure */
63 	uint8_t smbe_elen;		/* length in bytes of entry point */
64 	uint8_t smbe_major;		/* major version of the SMBIOS spec */
65 	uint8_t smbe_minor;		/* minor version of the SMBIOS spec */
66 	uint16_t smbe_maxssize;		/* maximum size in bytes of a struct */
67 	uint8_t smbe_revision;		/* entry point structure revision */
68 	uint8_t smbe_format[5];		/* entry point revision-specific data */
69 	char smbe_ianchor[5];		/* intermed. tag (SMB_ENTRY_IANCHOR) */
70 	uint8_t smbe_icksum;		/* intermed. checksum */
71 	uint16_t smbe_stlen;		/* length in bytes of structure table */
72 	uint32_t smbe_staddr;		/* physical addr of structure table */
73 	uint16_t smbe_stnum;		/* number of structure table entries */
74 	uint8_t smbe_bcdrev;		/* BCD value representing DMI version */
75 } smbios_21_entry_t;
76 
77 /*
78  * The 64-bit SMBIOS 3.0 Entry Point.  See DSP0134 5.2.2 for more information.
79  * The structure table entry point is located by searching for the anchor.
80  */
81 
82 typedef struct smbios_30_entry {
83 	char smbe_eanchor[5];		/* anchor tag (SMB3_ENTRY_EANCHOR) */
84 	uint8_t smbe_ecksum;		/* checksum of entry point structure */
85 	uint8_t smbe_elen;		/* length in bytes of entry point */
86 	uint8_t smbe_major;		/* major version of the SMBIOS spec */
87 	uint8_t smbe_minor;		/* minor version of the SMBIOS spec */
88 	uint8_t smbe_docrev;		/* specification docrev */
89 	uint8_t smbe_revision;		/* entry point structure revision */
90 	uint8_t smbe_reserved;
91 	uint32_t smbe_stlen;		/* length in bytes of structure table */
92 	uint64_t smbe_staddr;		/* physical addr of structure table */
93 } smbios_30_entry_t;
94 
95 typedef union {
96 	smbios_21_entry_t ep21;
97 	smbios_30_entry_t ep30;
98 } smbios_entry_t;
99 
100 #pragma pack()
101 
102 #define	SMB_ENTRY_EANCHOR	"_SM_"	/* structure table entry point anchor */
103 #define	SMB_ENTRY_EANCHORLEN	4	/* length of entry point anchor */
104 #define	SMB3_ENTRY_EANCHOR	"_SM3_"	/* structure table entry point anchor */
105 #define	SMB3_ENTRY_EANCHORLEN	5	/* length of entry point anchor */
106 #define	SMB_ENTRY_IANCHOR	"_DMI_"	/* intermediate anchor string */
107 #define	SMB_ENTRY_IANCHORLEN	5	/* length of intermediate anchor */
108 #define	SMB_ENTRY_MAXLEN	255	/* maximum length of entry point */
109 
110 /*
111  * Structure type codes.  The comments next to each type include an (R) note to
112  * indicate a structure that is required as of SMBIOS v2.8 and an (O) note to
113  * indicate a structure that is obsolete as of SMBIOS v2.8.
114  */
115 #define	SMB_TYPE_BIOS		0	/* BIOS information (R) */
116 #define	SMB_TYPE_SYSTEM		1	/* system information (R) */
117 #define	SMB_TYPE_BASEBOARD	2	/* base board */
118 #define	SMB_TYPE_CHASSIS	3	/* system enclosure or chassis (R) */
119 #define	SMB_TYPE_PROCESSOR	4	/* processor (R) */
120 #define	SMB_TYPE_MEMCTL		5	/* memory controller (O) */
121 #define	SMB_TYPE_MEMMOD		6	/* memory module (O) */
122 #define	SMB_TYPE_CACHE		7	/* processor cache (R) */
123 #define	SMB_TYPE_PORT		8	/* port connector */
124 #define	SMB_TYPE_SLOT		9	/* upgradeable system slot (R) */
125 #define	SMB_TYPE_OBDEVS		10	/* on-board devices (O) */
126 #define	SMB_TYPE_OEMSTR		11	/* OEM string table */
127 #define	SMB_TYPE_SYSCONFSTR	12	/* system configuration string table */
128 #define	SMB_TYPE_LANG		13	/* BIOS language information */
129 #define	SMB_TYPE_GROUP		14	/* group associations */
130 #define	SMB_TYPE_EVENTLOG	15	/* system event log */
131 #define	SMB_TYPE_MEMARRAY	16	/* physical memory array (R) */
132 #define	SMB_TYPE_MEMDEVICE	17	/* memory device (R) */
133 #define	SMB_TYPE_MEMERR32	18	/* 32-bit memory error information */
134 #define	SMB_TYPE_MEMARRAYMAP	19	/* memory array mapped address (R) */
135 #define	SMB_TYPE_MEMDEVICEMAP	20	/* memory device mapped address */
136 #define	SMB_TYPE_POINTDEV	21	/* built-in pointing device */
137 #define	SMB_TYPE_BATTERY	22	/* portable battery */
138 #define	SMB_TYPE_RESET		23	/* system reset settings */
139 #define	SMB_TYPE_SECURITY	24	/* hardware security settings */
140 #define	SMB_TYPE_POWERCTL	25	/* system power controls */
141 #define	SMB_TYPE_VPROBE		26	/* voltage probe */
142 #define	SMB_TYPE_COOLDEV	27	/* cooling device */
143 #define	SMB_TYPE_TPROBE		28	/* temperature probe */
144 #define	SMB_TYPE_IPROBE		29	/* current probe */
145 #define	SMB_TYPE_OOBRA		30	/* out-of-band remote access facility */
146 #define	SMB_TYPE_BIS		31	/* boot integrity services */
147 #define	SMB_TYPE_BOOT		32	/* system boot status (R) */
148 #define	SMB_TYPE_MEMERR64	33	/* 64-bit memory error information */
149 #define	SMB_TYPE_MGMTDEV	34	/* management device */
150 #define	SMB_TYPE_MGMTDEVCP	35	/* management device component */
151 #define	SMB_TYPE_MGMTDEVDATA	36	/* management device threshold data */
152 #define	SMB_TYPE_MEMCHAN	37	/* memory channel */
153 #define	SMB_TYPE_IPMIDEV	38	/* IPMI device information */
154 #define	SMB_TYPE_POWERSUP	39	/* system power supply */
155 #define	SMB_TYPE_ADDINFO	40	/* additional information */
156 #define	SMB_TYPE_OBDEVEXT	41	/* on-board device extended info */
157 #define	SMB_TYPE_MCHI		42	/* mgmt controller host interface */
158 #define	SMB_TYPE_TPM		43	/* TPM device */
159 #define	SMB_TYPE_INACTIVE	126	/* inactive table entry */
160 #define	SMB_TYPE_EOT		127	/* end of table */
161 
162 #define	SMB_TYPE_OEM_LO		128	/* start of OEM-specific type range */
163 #define	SUN_OEM_EXT_PROCESSOR	132	/* processor extended info */
164 #define	SUN_OEM_EXT_PORT	136	/* port exteded info */
165 #define	SUN_OEM_PCIEXRC		138	/* PCIE RootComplex/RootPort info */
166 #define	SUN_OEM_EXT_MEMARRAY	144	/* phys memory array extended info */
167 #define	SUN_OEM_EXT_MEMDEVICE	145	/* memory device extended info */
168 #define	SMB_TYPE_OEM_HI		256	/* end of OEM-specific type range */
169 
170 /*
171  * OEM string indicating "Platform Resource Management Specification"
172  * compliance.
173  */
174 #define	SMB_PRMS1	"SUNW-PRMS-1"
175 
176 /*
177  * Some default values set by BIOS vendor
178  */
179 #define	SMB_DEFAULT1	"To Be Filled By O.E.M."
180 #define	SMB_DEFAULT2	"Not Available"
181 
182 /*
183  * SMBIOS Common Information.  These structures do not correspond to anything
184  * in the SMBIOS specification, but allow library clients to more easily read
185  * information that is frequently encoded into the various SMBIOS structures.
186  */
187 typedef struct smbios_info {
188 	const char *smbi_manufacturer;	/* manufacturer */
189 	const char *smbi_product;	/* product name */
190 	const char *smbi_version;	/* version */
191 	const char *smbi_serial;	/* serial number */
192 	const char *smbi_asset;		/* asset tag */
193 	const char *smbi_location;	/* location tag */
194 	const char *smbi_part;		/* part number */
195 } smbios_info_t;
196 
197 typedef struct smbios_version {
198 	uint8_t smbv_major;		/* version major number */
199 	uint8_t smbv_minor;		/* version minor number */
200 } smbios_version_t;
201 
202 #define	SMB_CONT_BYTE	1		/* contained elements are byte size */
203 #define	SMB_CONT_WORD	2		/* contained elements are word size */
204 #define	SMB_CONT_MAX	255		/* maximum contained objects */
205 
206 /*
207  * SMBIOS Bios Information.  See DSP0134 Section 7.1 for more information.
208  * smbb_romsize is converted from the implementation format into bytes. Note, if
209  * we do not have an extended BIOS ROM size, it is filled in with the default
210  * BIOS ROM size.
211  */
212 typedef struct smbios_bios {
213 	const char *smbb_vendor;	/* bios vendor string */
214 	const char *smbb_version;	/* bios version string */
215 	const char *smbb_reldate;	/* bios release date */
216 	uint32_t smbb_segment;		/* bios address segment location */
217 	uint32_t smbb_romsize;		/* bios rom size in bytes */
218 	uint32_t smbb_runsize;		/* bios image size in bytes */
219 	uint64_t smbb_cflags;		/* bios characteristics */
220 	const uint8_t *smbb_xcflags;	/* bios characteristics extensions */
221 	size_t smbb_nxcflags;		/* number of smbb_xcflags[] bytes */
222 	smbios_version_t smbb_biosv;	/* bios version */
223 	smbios_version_t smbb_ecfwv;	/* bios embedded ctrl f/w version */
224 	uint64_t smbb_extromsize;	/* Extended bios ROM Size */
225 } smbios_bios_t;
226 
227 #define	SMB_BIOSFL_RSV0		0x00000001	/* reserved bit zero */
228 #define	SMB_BIOSFL_RSV1		0x00000002	/* reserved bit one */
229 #define	SMB_BIOSFL_UNKNOWN	0x00000004	/* unknown */
230 #define	SMB_BIOSFL_BCNOTSUP	0x00000008	/* BIOS chars not supported */
231 #define	SMB_BIOSFL_ISA		0x00000010	/* ISA is supported */
232 #define	SMB_BIOSFL_MCA		0x00000020	/* MCA is supported */
233 #define	SMB_BIOSFL_EISA		0x00000040	/* EISA is supported */
234 #define	SMB_BIOSFL_PCI		0x00000080	/* PCI is supported */
235 #define	SMB_BIOSFL_PCMCIA	0x00000100	/* PCMCIA is supported */
236 #define	SMB_BIOSFL_PLUGNPLAY	0x00000200	/* Plug and Play is supported */
237 #define	SMB_BIOSFL_APM		0x00000400	/* APM is supported */
238 #define	SMB_BIOSFL_FLASH	0x00000800	/* BIOS is Flash Upgradeable */
239 #define	SMB_BIOSFL_SHADOW	0x00001000	/* BIOS shadowing is allowed */
240 #define	SMB_BIOSFL_VLVESA	0x00002000	/* VL-VESA is supported */
241 #define	SMB_BIOSFL_ESCD		0x00004000	/* ESCD support is available */
242 #define	SMB_BIOSFL_CDBOOT	0x00008000	/* Boot from CD is supported */
243 #define	SMB_BIOSFL_SELBOOT	0x00010000	/* Selectable Boot supported */
244 #define	SMB_BIOSFL_ROMSOCK	0x00020000	/* BIOS ROM is socketed */
245 #define	SMB_BIOSFL_PCMBOOT	0x00040000	/* Boot from PCMCIA supported */
246 #define	SMB_BIOSFL_EDD		0x00080000	/* EDD Spec is supported */
247 #define	SMB_BIOSFL_NEC9800	0x00100000	/* int 0x13 NEC 9800 floppy */
248 #define	SMB_BIOSFL_TOSHIBA	0x00200000	/* int 0x13 Toshiba floppy */
249 #define	SMB_BIOSFL_525_360K	0x00400000	/* int 0x13 5.25" 360K floppy */
250 #define	SMB_BIOSFL_525_12M	0x00800000	/* int 0x13 5.25" 1.2M floppy */
251 #define	SMB_BIOSFL_35_720K	0x01000000	/* int 0x13 3.5" 720K floppy */
252 #define	SMB_BIOSFL_35_288M	0x02000000	/* int 0x13 3.5" 2.88M floppy */
253 #define	SMB_BIOSFL_I5_PRINT	0x04000000	/* int 0x5 print screen svcs */
254 #define	SMB_BIOSFL_I9_KBD	0x08000000	/* int 0x9 8042 keyboard svcs */
255 #define	SMB_BIOSFL_I14_SER	0x10000000	/* int 0x14 serial svcs */
256 #define	SMB_BIOSFL_I17_PRINTER	0x20000000	/* int 0x17 printer svcs */
257 #define	SMB_BIOSFL_I10_CGA	0x40000000	/* int 0x10 CGA svcs */
258 #define	SMB_BIOSFL_NEC_PC98	0x80000000	/* NEC PC-98 */
259 
260 /*
261  * These values are used to allow consumers to have raw access to the extended
262  * characteristic flags. We explicitly don't include the extended BIOS
263  * information from section 3.1 as part of this as it has its own member.
264  */
265 #define	SMB_BIOSXB_1		0	/* bios extension byte 1 (7.1.2.1) */
266 #define	SMB_BIOSXB_2		1	/* bios extension byte 2 (7.1.2.2) */
267 #define	SMB_BIOSXB_BIOS_MAJ	2	/* bios major version */
268 #define	SMB_BIOSXB_BIOS_MIN	3	/* bios minor version */
269 #define	SMB_BIOSXB_ECFW_MAJ	4	/* extended ctlr f/w major version */
270 #define	SMB_BIOSXB_ECFW_MIN	5	/* extended ctlr f/w minor version */
271 
272 #define	SMB_BIOSXB1_ACPI	0x01	/* ACPI is supported */
273 #define	SMB_BIOSXB1_USBL	0x02	/* USB legacy is supported */
274 #define	SMB_BIOSXB1_AGP		0x04	/* AGP is supported */
275 #define	SMB_BIOSXB1_I20		0x08	/* I2O boot is supported */
276 #define	SMB_BIOSXB1_LS120	0x10	/* LS-120 boot is supported */
277 #define	SMB_BIOSXB1_ATZIP	0x20	/* ATAPI ZIP drive boot is supported */
278 #define	SMB_BIOSXB1_1394	0x40	/* 1394 boot is supported */
279 #define	SMB_BIOSXB1_SMBAT	0x80	/* Smart Battery is supported */
280 
281 #define	SMB_BIOSXB2_BBOOT	0x01	/* BIOS Boot Specification supported */
282 #define	SMB_BIOSXB2_FKNETSVC	0x02	/* F-key Network Svc boot supported */
283 #define	SMB_BIOSXB2_ETCDIST	0x04	/* Enable Targeted Content Distrib. */
284 #define	SMB_BIOSXB2_UEFI	0x08	/* UEFI Specification supported */
285 #define	SMB_BIOSXB2_VM		0x10	/* SMBIOS table describes a VM */
286 
287 /*
288  * SMBIOS System Information.  See DSP0134 Section 7.2 for more information.
289  * The current set of smbs_wakeup values is defined after the structure.
290  */
291 typedef struct smbios_system {
292 	const uint8_t *smbs_uuid;	/* UUID byte array */
293 	uint8_t smbs_uuidlen;		/* UUID byte array length */
294 	uint8_t smbs_wakeup;		/* wake-up event */
295 	const char *smbs_sku;		/* SKU number */
296 	const char *smbs_family;	/* family */
297 } smbios_system_t;
298 
299 #define	SMB_WAKEUP_RSV0		0x00	/* reserved */
300 #define	SMB_WAKEUP_OTHER	0x01	/* other */
301 #define	SMB_WAKEUP_UNKNOWN	0x02	/* unknown */
302 #define	SMB_WAKEUP_APM		0x03	/* APM timer */
303 #define	SMB_WAKEUP_MODEM	0x04	/* modem ring */
304 #define	SMB_WAKEUP_LAN		0x05	/* LAN remote */
305 #define	SMB_WAKEUP_SWITCH	0x06	/* power switch */
306 #define	SMB_WAKEUP_PCIPME	0x07	/* PCI PME# */
307 #define	SMB_WAKEUP_AC		0x08	/* AC power restored */
308 
309 /*
310  * SMBIOS Base Board description.  See DSP0134 Section 7.3 for more
311  * information.  smbb_flags and smbb_type definitions are below.
312  */
313 typedef struct smbios_bboard {
314 	id_t smbb_chassis;		/* chassis containing this board */
315 	uint8_t smbb_flags;		/* flags (see below) */
316 	uint8_t smbb_type;		/* board type (see below) */
317 	uint8_t smbb_contn;		/* number of contained object hdls */
318 } smbios_bboard_t;
319 
320 #define	SMB_BBFL_MOTHERBOARD	0x01	/* board is a motherboard */
321 #define	SMB_BBFL_NEEDAUX	0x02	/* auxiliary card or daughter req'd */
322 #define	SMB_BBFL_REMOVABLE	0x04	/* board is removable */
323 #define	SMB_BBFL_REPLACABLE	0x08	/* board is field-replacable */
324 #define	SMB_BBFL_HOTSWAP	0x10	/* board is hot-swappable */
325 
326 #define	SMB_BBT_UNKNOWN		0x1	/* unknown */
327 #define	SMB_BBT_OTHER		0x2	/* other */
328 #define	SMB_BBT_SBLADE		0x3	/* server blade */
329 #define	SMB_BBT_CSWITCH		0x4	/* connectivity switch */
330 #define	SMB_BBT_SMM		0x5	/* system management module */
331 #define	SMB_BBT_PROC		0x6	/* processor module */
332 #define	SMB_BBT_IO		0x7	/* i/o module */
333 #define	SMB_BBT_MEM		0x8	/* memory module */
334 #define	SMB_BBT_DAUGHTER	0x9	/* daughterboard */
335 #define	SMB_BBT_MOTHER		0xA	/* motherboard */
336 #define	SMB_BBT_PROCMEM		0xB	/* processor/memory module */
337 #define	SMB_BBT_PROCIO		0xC	/* processor/i/o module */
338 #define	SMB_BBT_INTER		0xD	/* interconnect board */
339 
340 /*
341  * SMBIOS Chassis description.  See DSP0134 Section 7.4 for more information.
342  * We move the lock bit of the type field into smbc_lock for easier processing.
343  */
344 typedef struct smbios_chassis {
345 	uint32_t smbc_oemdata;		/* OEM-specific data */
346 	uint8_t smbc_lock;		/* lock present? */
347 	uint8_t smbc_type;		/* type */
348 	uint8_t smbc_bustate;		/* boot-up state */
349 	uint8_t smbc_psstate;		/* power supply state */
350 	uint8_t smbc_thstate;		/* thermal state */
351 	uint8_t smbc_security;		/* security status */
352 	uint8_t smbc_uheight;		/* enclosure height in U's */
353 	uint8_t smbc_cords;		/* number of power cords */
354 	uint8_t smbc_elems;		/* number of element records (n) */
355 	uint8_t smbc_elemlen;		/* length of contained element (m) */
356 	char smbc_sku[256];		/* SKU number (as a string) */
357 } smbios_chassis_t;
358 
359 #define	SMB_CHT_OTHER		0x01	/* other */
360 #define	SMB_CHT_UNKNOWN		0x02	/* unknown */
361 #define	SMB_CHT_DESKTOP		0x03	/* desktop */
362 #define	SMB_CHT_LPDESKTOP	0x04	/* low-profile desktop */
363 #define	SMB_CHT_PIZZA		0x05	/* pizza box */
364 #define	SMB_CHT_MINITOWER	0x06	/* mini-tower */
365 #define	SMB_CHT_TOWER		0x07	/* tower */
366 #define	SMB_CHT_PORTABLE	0x08	/* portable */
367 #define	SMB_CHT_LAPTOP		0x09	/* laptop */
368 #define	SMB_CHT_NOTEBOOK	0x0A	/* notebook */
369 #define	SMB_CHT_HANDHELD	0x0B	/* hand-held */
370 #define	SMB_CHT_DOCK		0x0C	/* docking station */
371 #define	SMB_CHT_ALLIN1		0x0D	/* all-in-one */
372 #define	SMB_CHT_SUBNOTE		0x0E	/* sub-notebook */
373 #define	SMB_CHT_SPACESAVE	0x0F	/* space-saving */
374 #define	SMB_CHT_LUNCHBOX	0x10	/* lunchbox */
375 #define	SMB_CHT_MAIN		0x11	/* main server chassis */
376 #define	SMB_CHT_EXPANSION	0x12	/* expansion chassis */
377 #define	SMB_CHT_SUB		0x13	/* sub-chassis */
378 #define	SMB_CHT_BUS		0x14	/* bus expansion chassis */
379 #define	SMB_CHT_PERIPHERAL	0x15	/* peripheral chassis */
380 #define	SMB_CHT_RAID		0x16	/* raid chassis */
381 #define	SMB_CHT_RACK		0x17	/* rack mount chassis */
382 #define	SMB_CHT_SEALED		0x18	/* sealed case pc */
383 #define	SMB_CHT_MULTI		0x19	/* multi-system chassis */
384 #define	SMB_CHT_CPCI		0x1A	/* compact PCI */
385 #define	SMB_CHT_ATCA		0x1B	/* advanced TCA */
386 #define	SMB_CHT_BLADE		0x1C	/* blade */
387 #define	SMB_CHT_BLADEENC	0x1D	/* blade enclosure */
388 #define	SMB_CHT_TABLET		0x1E	/* tablet */
389 #define	SMB_CHT_CONVERTIBLE	0x1F	/* convertible */
390 #define	SMB_CHT_DETACHABLE	0x20	/* detachable */
391 #define	SMB_CHT_IOTGW		0x21	/* IoT Gateway */
392 #define	SMB_CHT_EMBEDPC		0x22	/* Embedded PC */
393 #define	SMB_CHT_MINIPC		0x23	/* Mini PC */
394 #define	SMB_CHT_STICKPC		0x24	/* Stick PC */
395 
396 #define	SMB_CHST_OTHER		0x01	/* other */
397 #define	SMB_CHST_UNKNOWN	0x02	/* unknown */
398 #define	SMB_CHST_SAFE		0x03	/* safe */
399 #define	SMB_CHST_WARNING	0x04	/* warning */
400 #define	SMB_CHST_CRITICAL	0x05	/* critical */
401 #define	SMB_CHST_NONREC		0x06	/* non-recoverable */
402 
403 #define	SMB_CHSC_OTHER		0x01	/* other */
404 #define	SMB_CHSC_UNKNOWN	0x02	/* unknown */
405 #define	SMB_CHSC_NONE		0x03	/* none */
406 #define	SMB_CHSC_EILOCK		0x04	/* external interface locked out */
407 #define	SMB_CHSC_EIENAB		0x05	/* external interface enabled */
408 
409 /*
410  * SMBIOS Processor description.  See DSP0134 Section 7.5 for more details.
411  * If the L1, L2, or L3 cache handle is -1, the cache information is unknown.
412  * If the handle refers to something of size 0, that type of cache is absent.
413  *
414  * NOTE: Although SMBIOS exports a 64-bit CPUID result, this value should not
415  * be used for any purpose other than BIOS debugging.  illumos itself computes
416  * its own CPUID value and applies knowledge of additional errata and processor
417  * specific CPUID variations, so this value should not be used for anything.
418  */
419 typedef struct smbios_processor {
420 	uint64_t smbp_cpuid;		/* processor cpuid information */
421 	uint32_t smbp_family;		/* processor family */
422 	uint8_t smbp_type;		/* processor type (SMB_PRT_*) */
423 	uint8_t smbp_voltage;		/* voltage (SMB_PRV_*) */
424 	uint8_t smbp_status;		/* status (SMB_PRS_*) */
425 	uint8_t smbp_upgrade;		/* upgrade (SMB_PRU_*) */
426 	uint32_t smbp_clkspeed;		/* external clock speed in MHz */
427 	uint32_t smbp_maxspeed;		/* maximum speed in MHz */
428 	uint32_t smbp_curspeed;		/* current speed in MHz */
429 	id_t smbp_l1cache;		/* L1 cache handle */
430 	id_t smbp_l2cache;		/* L2 cache handle */
431 	id_t smbp_l3cache;		/* L3 cache handle */
432 	uint32_t smbp_corecount;
433 		/* number of cores per processor socket */
434 	uint32_t smbp_coresenabled;
435 		/* number of enabled cores per processor socket */
436 	uint32_t smbp_threadcount;
437 		/* number of threads per processor socket */
438 	uint16_t smbp_cflags;
439 		/* processor characteristics (SMB_PRC_*) */
440 	uint16_t smbp_family2;		/* processor family 2 */
441 	uint16_t smbp_corecount2;	/* core count 2 */
442 	uint16_t smbp_coresenabled2;	/* cores enabled 2 */
443 	uint16_t smbp_threadcount2;	/* thread count 2 */
444 } smbios_processor_t;
445 
446 #define	SMB_PRT_OTHER		0x01	/* other */
447 #define	SMB_PRT_UNKNOWN		0x02	/* unknown */
448 #define	SMB_PRT_CENTRAL		0x03	/* central processor */
449 #define	SMB_PRT_MATH		0x04	/* math processor */
450 #define	SMB_PRT_DSP		0x05	/* DSP processor */
451 #define	SMB_PRT_VIDEO		0x06	/* video processor */
452 
453 #define	SMB_PRV_LEGACY(v)	(!((v) & 0x80))	/* legacy voltage mode */
454 #define	SMB_PRV_FIXED(v)	((v) & 0x80)	/* fixed voltage mode */
455 
456 #define	SMB_PRV_5V		0x01	/* 5V is supported */
457 #define	SMB_PRV_33V		0x02	/* 3.3V is supported */
458 #define	SMB_PRV_29V		0x04	/* 2.9V is supported */
459 
460 #define	SMB_PRV_VOLTAGE(v)	((v) & 0x7f)
461 
462 #define	SMB_PRSTATUS_PRESENT(s)	((s) & 0x40)	/* socket is populated */
463 #define	SMB_PRSTATUS_STATUS(s)	((s) & 0x07)	/* status (see below) */
464 
465 #define	SMB_PRS_UNKNOWN		0x0	/* unknown */
466 #define	SMB_PRS_ENABLED		0x1	/* enabled */
467 #define	SMB_PRS_BDISABLED	0x2	/* disabled in bios user setup */
468 #define	SMB_PRS_PDISABLED	0x3	/* disabled in bios from post error */
469 #define	SMB_PRS_IDLE		0x4	/* waiting to be enabled */
470 #define	SMB_PRS_OTHER		0x7	/* other */
471 
472 #define	SMB_PRU_OTHER		0x01	/* other */
473 #define	SMB_PRU_UNKNOWN		0x02	/* unknown */
474 #define	SMB_PRU_DAUGHTER	0x03	/* daughter board */
475 #define	SMB_PRU_ZIF		0x04	/* ZIF socket */
476 #define	SMB_PRU_PIGGY		0x05	/* replaceable piggy back */
477 #define	SMB_PRU_NONE		0x06	/* none */
478 #define	SMB_PRU_LIF		0x07	/* LIF socket */
479 #define	SMB_PRU_SLOT1		0x08	/* slot 1 */
480 #define	SMB_PRU_SLOT2		0x09	/* slot 2 */
481 #define	SMB_PRU_370PIN		0x0A	/* 370-pin socket */
482 #define	SMB_PRU_SLOTA		0x0B	/* slot A */
483 #define	SMB_PRU_SLOTM		0x0C	/* slot M */
484 #define	SMB_PRU_423		0x0D	/* socket 423 */
485 #define	SMB_PRU_A		0x0E	/* socket A (socket 462) */
486 #define	SMB_PRU_478		0x0F	/* socket 478 */
487 #define	SMB_PRU_754		0x10	/* socket 754 */
488 #define	SMB_PRU_940		0x11	/* socket 940 */
489 #define	SMB_PRU_939		0x12	/* socket 939 */
490 #define	SMB_PRU_MPGA604		0x13	/* mPGA604 */
491 #define	SMB_PRU_LGA771		0x14	/* LGA771 */
492 #define	SMB_PRU_LGA775		0x15	/* LGA775 */
493 #define	SMB_PRU_S1		0x16	/* socket S1 */
494 #define	SMB_PRU_AM2		0x17	/* socket AM2 */
495 #define	SMB_PRU_F		0x18	/* socket F */
496 #define	SMB_PRU_LGA1366		0x19	/* LGA1366 */
497 #define	SMB_PRU_G34		0x1A	/* socket G34 */
498 #define	SMB_PRU_AM3		0x1B	/* socket AM3 */
499 #define	SMB_PRU_C32		0x1C	/* socket C32 */
500 #define	SMB_PRU_LGA1156		0x1D	/* LGA1156 */
501 #define	SMB_PRU_LGA1567		0x1E	/* LGA1567 */
502 #define	SMB_PRU_PGA988A		0x1F	/* PGA988A */
503 #define	SMB_PRU_BGA1288		0x20	/* BGA1288 */
504 #define	SMB_PRU_RPGA988B	0x21	/* rPGA988B */
505 #define	SMB_PRU_BGA1023		0x22	/* BGA1023 */
506 #define	SMB_PRU_BGA1224		0x23	/* BGA1224 */
507 #define	SMB_PRU_LGA1155		0x24	/* LGA1155 */
508 #define	SMB_PRU_LGA1356		0x25	/* LGA1356 */
509 #define	SMB_PRU_LGA2011		0x26	/* LGA2011 */
510 #define	SMB_PRU_FS1		0x27	/* socket FS1 */
511 #define	SMB_PRU_FS2		0x28	/* socket FS2 */
512 #define	SMB_PRU_FM1		0x29	/* socket FM1 */
513 #define	SMB_PRU_FM2		0x2A	/* socket FM2 */
514 #define	SMB_PRU_LGA20113	0x2B	/* LGA2011-3 */
515 #define	SMB_PRU_LGA13563	0x2C	/* LGA1356-3 */
516 #define	SMB_PRU_LGA1150		0x2D	/* LGA1150 */
517 #define	SMB_PRU_BGA1168		0x2E	/* BGA1168 */
518 #define	SMB_PRU_BGA1234		0x2F	/* BGA1234 */
519 #define	SMB_PRU_BGA1364		0x30	/* BGA1364 */
520 #define	SMB_PRU_AM4		0x31	/* socket AM4 */
521 #define	SMB_PRU_LGA1151		0x32	/* LGA1151 */
522 #define	SMB_PRU_BGA1356		0x33	/* BGA1356 */
523 #define	SMB_PRU_BGA1440		0x34	/* BGA1440 */
524 #define	SMB_PRU_BGA1515		0x35	/* BGA1515 */
525 #define	SMB_PRU_LGA36471	0x36	/* LGA3647-1 */
526 #define	SMB_PRU_SP3		0x37	/* socket SP3 */
527 #define	SMB_PRU_SP3r2		0x38	/* socket SP3r2 */
528 #define	SMB_PRU_LGA2066		0x39	/* Socket LGA2066 */
529 #define	SMB_PRU_BGA1392		0x3A	/* Socket BGA1392 */
530 #define	SMB_PRU_BGA1510		0x3B	/* Socket BGA1510 */
531 #define	SMB_PRU_BGA1528		0x3C	/* Socket BGA1528 */
532 
533 #define	SMB_PRC_RESERVED	0x0001	/* reserved */
534 #define	SMB_PRC_UNKNOWN		0x0002	/* unknown */
535 #define	SMB_PRC_64BIT		0x0004	/* 64-bit capable */
536 #define	SMB_PRC_MC		0x0008	/* multi-core */
537 #define	SMB_PRC_HT		0x0010	/* hardware thread */
538 #define	SMB_PRC_NX		0x0020	/* execution protection */
539 #define	SMB_PRC_VT		0x0040	/* enhanced virtualization */
540 #define	SMB_PRC_PM		0x0080	/* power/performance control */
541 
542 #define	SMB_PRF_OTHER		0x01	/* other */
543 #define	SMB_PRF_UNKNOWN		0x02	/* unknown */
544 #define	SMB_PRF_8086		0x03	/* 8086 */
545 #define	SMB_PRF_80286		0x04	/* 80286 */
546 #define	SMB_PRF_I386		0x05	/* Intel 386 */
547 #define	SMB_PRF_I486		0x06	/* Intel 486 */
548 #define	SMB_PRF_8087		0x07	/* 8087 */
549 #define	SMB_PRF_80287		0x08	/* 80287 */
550 #define	SMB_PRF_80387		0x09	/* 80387 */
551 #define	SMB_PRF_80487		0x0A	/* 80487 */
552 #define	SMB_PRF_PENTIUM		0x0B	/* Pentium Family */
553 #define	SMB_PRF_PENTIUMPRO	0x0C	/* Pentium Pro */
554 #define	SMB_PRF_PENTIUMII	0x0D	/* Pentium II */
555 #define	SMB_PRF_PENTIUM_MMX	0x0E	/* Pentium w/ MMX */
556 #define	SMB_PRF_CELERON		0x0F	/* Celeron */
557 #define	SMB_PRF_PENTIUMII_XEON	0x10	/* Pentium II Xeon */
558 #define	SMB_PRF_PENTIUMIII	0x11	/* Pentium III */
559 #define	SMB_PRF_M1		0x12	/* M1 */
560 #define	SMB_PRF_M2		0x13	/* M2 */
561 #define	SMB_PRF_CELERON_M	0x14	/* Celeron M */
562 #define	SMB_PRF_PENTIUMIV_HT	0x15	/* Pentium 4 HT */
563 #define	SMB_PRF_DURON		0x18	/* AMD Duron */
564 #define	SMB_PRF_K5		0x19	/* K5 */
565 #define	SMB_PRF_K6		0x1A	/* K6 */
566 #define	SMB_PRF_K6_2		0x1B	/* K6-2 */
567 #define	SMB_PRF_K6_3		0x1C	/* K6-3 */
568 #define	SMB_PRF_ATHLON		0x1D	/* Athlon */
569 #define	SMB_PRF_2900		0x1E	/* AMD 2900 */
570 #define	SMB_PRF_K6_2PLUS	0x1F	/* K6-2+ */
571 #define	SMB_PRF_PPC		0x20	/* PowerPC */
572 #define	SMB_PRF_PPC_601		0x21	/* PowerPC 601 */
573 #define	SMB_PRF_PPC_603		0x22	/* PowerPC 603 */
574 #define	SMB_PRF_PPC_603PLUS	0x23	/* PowerPC 603+ */
575 #define	SMB_PRF_PPC_604		0x24	/* PowerPC 604 */
576 #define	SMB_PRF_PPC_620		0x25	/* PowerPC 620 */
577 #define	SMB_PRF_PPC_704		0x26	/* PowerPC x704 */
578 #define	SMB_PRF_PPC_750		0x27	/* PowerPC 750 */
579 #define	SMB_PRF_CORE_DUO	0x28	/* Core Duo */
580 #define	SMB_PRF_CORE_DUO_M	0x29	/* Core Duo mobile */
581 #define	SMB_PRF_CORE_SOLO_M	0x2A	/* Core Solo mobile */
582 #define	SMB_PRF_ATOM		0x2B	/* Intel Atom */
583 #define	SMB_PRF_CORE_M		0x2C	/* Intel Core M */
584 #define	SMB_PRF_CORE_M3		0x2D	/* Intel Core m3 */
585 #define	SMB_PRF_CORE_M5		0x2E	/* Intel Core m5 */
586 #define	SMB_PRF_CORE_M7		0x2F	/* Intel Core m7 */
587 #define	SMB_PRF_ALPHA		0x30	/* Alpha */
588 #define	SMB_PRF_ALPHA_21064	0x31	/* Alpha 21064 */
589 #define	SMB_PRF_ALPHA_21066	0x32	/* Alpha 21066 */
590 #define	SMB_PRF_ALPHA_21164	0x33	/* Alpha 21164 */
591 #define	SMB_PRF_ALPHA_21164PC	0x34	/* Alpha 21164PC */
592 #define	SMB_PRF_ALPHA_21164A	0x35	/* Alpha 21164a */
593 #define	SMB_PRF_ALPHA_21264	0x36	/* Alpha 21264 */
594 #define	SMB_PRF_ALPHA_21364	0x37	/* Alpha 21364 */
595 #define	SMB_PRF_TURION2U_2C_MM	0x38
596 			/* AMD Turion II Ultra Dual-Core Mobile M */
597 #define	SMB_PRF_TURION2_2C_MM	0x39	/* AMD Turion II Dual-Core Mobile M */
598 #define	SMB_PRF_ATHLON2_2C_M	0x3A	/* AMD Athlon II Dual-Core M */
599 #define	SMB_PRF_OPTERON_6100	0x3B	/* AMD Opteron 6100 series */
600 #define	SMB_PRF_OPTERON_4100	0x3C	/* AMD Opteron 4100 series */
601 #define	SMB_PRF_OPTERON_6200	0x3D	/* AMD Opteron 6200 series */
602 #define	SMB_PRF_OPTERON_4200	0x3E	/* AMD Opteron 4200 series */
603 #define	SMB_PRF_AMD_FX		0x3F	/* AMD FX series */
604 #define	SMB_PRF_MIPS		0x40	/* MIPS */
605 #define	SMB_PRF_MIPS_R4000	0x41	/* MIPS R4000 */
606 #define	SMB_PRF_MIPS_R4200	0x42	/* MIPS R4200 */
607 #define	SMB_PRF_MIPS_R4400	0x43	/* MIPS R4400 */
608 #define	SMB_PRF_MIPS_R4600	0x44	/* MIPS R4600 */
609 #define	SMB_PRF_MIPS_R10000	0x45	/* MIPS R10000 */
610 #define	SMB_PRF_AMD_C		0x46	/* AMD C-series */
611 #define	SMB_PRF_AMD_E		0x47	/* AMD E-series */
612 #define	SMB_PRF_AMD_A		0x48	/* AMD A-series */
613 #define	SMB_PRF_AMD_G		0x49	/* AMD G-series */
614 #define	SMB_PRF_AMD_Z		0x4A	/* AMD Z-series */
615 #define	SMB_PRF_AMD_R		0x4B	/* AMD R-series */
616 #define	SMB_PRF_OPTERON_4300	0x4C	/* AMD Opteron 4300 series */
617 #define	SMB_PRF_OPTERON_6300	0x4D	/* AMD Opteron 6300 series */
618 #define	SMB_PRF_OPTERON_3300	0x4E	/* AMD Opteron 3300 series */
619 #define	SMB_PRF_AMD_FIREPRO	0x4F	/* AMD FirePro series */
620 #define	SMB_PRF_SPARC		0x50	/* SPARC */
621 #define	SMB_PRF_SUPERSPARC	0x51	/* SuperSPARC */
622 #define	SMB_PRF_MICROSPARCII	0x52	/* microSPARC II */
623 #define	SMB_PRF_MICROSPARCIIep	0x53	/* microSPARC IIep */
624 #define	SMB_PRF_ULTRASPARC	0x54	/* UltraSPARC */
625 #define	SMB_PRF_USII		0x55	/* UltraSPARC II */
626 #define	SMB_PRF_USIIi		0x56	/* UltraSPARC IIi */
627 #define	SMB_PRF_USIII		0x57	/* UltraSPARC III */
628 #define	SMB_PRF_USIIIi		0x58	/* UltraSPARC IIIi */
629 #define	SMB_PRF_68040		0x60	/* 68040 */
630 #define	SMB_PRF_68XXX		0x61	/* 68XXX */
631 #define	SMB_PRF_68000		0x62	/* 68000 */
632 #define	SMB_PRF_68010		0x63	/* 68010 */
633 #define	SMB_PRF_68020		0x64	/* 68020 */
634 #define	SMB_PRF_68030		0x65	/* 68030 */
635 #define	SMB_PRF_ATHLON_X4	0x66	/* AMD Athlon X4 Quad-Core */
636 #define	SMB_PRF_OPTERON_X1K	0x67	/* AMD Opteron X1000 */
637 #define	SMB_PRF_OPTERON_X2K	0x68	/* AMD Opteron X2000 APU */
638 #define	SMB_PRF_OPTERON_A	0x69	/* AMD Opteron A Series */
639 #define	SMB_PRF_OPTERON_X3K	0x6A	/* AMD Opteron X3000 APU */
640 #define	SMB_PRF_ZEN		0x6B	/* AMD Zen Processor Family */
641 #define	SMB_PRF_HOBBIT		0x70	/* Hobbit */
642 #define	SMB_PRF_TM5000		0x78	/* Crusoe TM5000 */
643 #define	SMB_PRF_TM3000		0x79	/* Crusoe TM3000 */
644 #define	SMB_PRF_TM8000		0x7A	/* Efficeon TM8000 */
645 #define	SMB_PRF_WEITEK		0x80	/* Weitek */
646 #define	SMB_PRF_ITANIC		0x82	/* Itanium */
647 #define	SMB_PRF_ATHLON64	0x83	/* Athlon64 */
648 #define	SMB_PRF_OPTERON		0x84	/* Opteron */
649 #define	SMB_PRF_SEMPRON		0x85    /* Sempron */
650 #define	SMB_PRF_TURION64_M	0x86	/* Turion 64 Mobile */
651 #define	SMB_PRF_OPTERON_2C	0x87	/* AMD Opteron Dual-Core */
652 #define	SMB_PRF_ATHLON64_X2_2C	0x88	/* AMD Athlon 64 X2 Dual-Core */
653 #define	SMB_PRF_TURION64_X2_M	0x89	/* AMD Turion 64 X2 Mobile */
654 #define	SMB_PRF_OPTERON_4C	0x8A	/* AMD Opteron Quad-Core */
655 #define	SMB_PRF_OPTERON_3G	0x8B	/* AMD Opteron 3rd Generation */
656 #define	SMB_PRF_PHENOM_FX_4C	0x8C	/* AMD Phenom FX Quad-Core */
657 #define	SMB_PRF_PHENOM_X4_4C	0x8D	/* AMD Phenom X4 Quad-Core */
658 #define	SMB_PRF_PHENOM_X2_2C	0x8E	/* AMD Phenom X2 Dual-Core */
659 #define	SMB_PRF_ATHLON_X2_2C	0x8F	/* AMD Athlon X2 Dual-Core */
660 #define	SMB_PRF_PA		0x90	/* PA-RISC */
661 #define	SMB_PRF_PA8500		0x91	/* PA-RISC 8500 */
662 #define	SMB_PRF_PA8000		0x92	/* PA-RISC 8000 */
663 #define	SMB_PRF_PA7300LC	0x93	/* PA-RISC 7300LC */
664 #define	SMB_PRF_PA7200		0x94	/* PA-RISC 7200 */
665 #define	SMB_PRF_PA7100LC	0x95	/* PA-RISC 7100LC */
666 #define	SMB_PRF_PA7100		0x96	/* PA-RISC 7100 */
667 #define	SMB_PRF_V30		0xA0	/* V30 */
668 #define	SMB_PRF_XEON_4C_3200	0xA1	/* Xeon Quad Core 3200 */
669 #define	SMB_PRF_XEON_2C_3000	0xA2	/* Xeon Dual Core 3000 */
670 #define	SMB_PRF_XEON_4C_5300	0xA3	/* Xeon Quad Core 5300 */
671 #define	SMB_PRF_XEON_2C_5100	0xA4	/* Xeon Dual Core 5100 */
672 #define	SMB_PRF_XEON_2C_5000	0xA5	/* Xeon Dual Core 5000 */
673 #define	SMB_PRF_XEON_2C_LV	0xA6	/* Xeon Dual Core LV */
674 #define	SMB_PRF_XEON_2C_ULV	0xA7	/* Xeon Dual Core ULV */
675 #define	SMB_PRF_XEON_2C_7100	0xA8	/* Xeon Dual Core 7100 */
676 #define	SMB_PRF_XEON_4C_5400	0xA9	/* Xeon Quad Core 5400 */
677 #define	SMB_PRF_XEON_4C		0xAA	/* Xeon Quad Core */
678 #define	SMB_PRF_XEON_2C_5200	0xAB	/* Xeon Dual Core 5200 */
679 #define	SMB_PRF_XEON_2C_7200	0xAC	/* Xeon Dual Core 7200 */
680 #define	SMB_PRF_XEON_4C_7300	0xAD	/* Xeon Quad Core 7300 */
681 #define	SMB_PRF_XEON_4C_7400	0xAE	/* Xeon Quad Core 7400 */
682 #define	SMB_PRF_XEON_XC_7400	0xAF	/* Xeon Multi Core 7400 */
683 #define	SMB_PRF_PENTIUMIII_XEON	0xB0	/* Pentium III Xeon */
684 #define	SMB_PRF_PENTIUMIII_SS	0xB1	/* Pentium III with SpeedStep */
685 #define	SMB_PRF_P4		0xB2	/* Pentium 4 */
686 #define	SMB_PRF_XEON		0xB3	/* Intel Xeon */
687 #define	SMB_PRF_AS400		0xB4	/* AS400 */
688 #define	SMB_PRF_XEON_MP		0xB5	/* Intel Xeon MP */
689 #define	SMB_PRF_ATHLON_XP	0xB6	/* AMD Athlon XP */
690 #define	SMB_PRF_ATHLON_MP	0xB7	/* AMD Athlon MP */
691 #define	SMB_PRF_ITANIC2		0xB8	/* Itanium 2 */
692 #define	SMB_PRF_PENTIUM_M	0xB9	/* Pentium M */
693 #define	SMB_PRF_CELERON_D	0xBA	/* Celeron D */
694 #define	SMB_PRF_PENTIUM_D	0xBB	/* Pentium D */
695 #define	SMB_PRF_PENTIUM_EE	0xBC	/* Pentium Extreme Edition */
696 #define	SMB_PRF_CORE_SOLO	0xBD	/* Intel Core Solo */
697 #define	SMB_PRF_CORE2_DUO	0xBF	/* Intel Core 2 Duo */
698 #define	SMB_PRF_CORE2_SOLO	0xC0	/* Intel Core 2 Solo */
699 #define	SMB_PRF_CORE2_EX	0xC1	/* Intel Core 2 Extreme */
700 #define	SMB_PRF_CORE2_QUAD	0xC2	/* Intel Core 2 Quad */
701 #define	SMB_PRF_CORE2_EX_M	0xC3	/* Intel Core 2 Extreme mobile */
702 #define	SMB_PRF_CORE2_DUO_M	0xC4	/* Intel Core 2 Duo mobile */
703 #define	SMB_PRF_CORE2_SOLO_M	0xC5	/* Intel Core 2 Solo mobile */
704 #define	SMB_PRF_CORE_I7		0xC6	/* Intel Core i7 */
705 #define	SMB_PRF_CELERON_2C	0xC7	/* Celeron Dual-Core */
706 #define	SMB_PRF_IBM390		0xC8	/* IBM 390 */
707 #define	SMB_PRF_G4		0xC9	/* G4 */
708 #define	SMB_PRF_G5		0xCA	/* G5 */
709 #define	SMB_PRF_ESA390		0xCB	/* ESA390 */
710 #define	SMB_PRF_ZARCH		0xCC	/* z/Architecture */
711 #define	SMB_PRF_CORE_I5		0xCD	/* Intel Core i5 */
712 #define	SMB_PRF_CORE_I3		0xCE	/* Intel Core i3 */
713 #define	SMB_PRF_CORE_I9		0xCF	/* Intel Core i9 */
714 #define	SMB_PRF_C7M		0xD2	/* VIA C7-M */
715 #define	SMB_PRF_C7D		0xD3	/* VIA C7-D */
716 #define	SMB_PRF_C7		0xD4	/* VIA C7 */
717 #define	SMB_PRF_EDEN		0xD5	/* VIA Eden */
718 #define	SMB_PRF_XEON_XC		0xD6	/* Intel Xeon Multi-Core */
719 #define	SMB_PRF_XEON_2C_3XXX	0xD7	/* Intel Xeon Dual-Core 3xxx */
720 #define	SMB_PRF_XEON_4C_3XXX	0xD8	/* Intel Xeon Quad-Core 3xxx */
721 #define	SMB_PRF_VIA_NANO	0xD9	/* VIA Nano */
722 #define	SMB_PRF_XEON_2C_5XXX	0xDA	/* Intel Xeon Dual-Core 5xxx */
723 #define	SMB_PRF_XEON_4C_5XXX	0xDB	/* Intel Xeon Quad-Core 5xxx */
724 #define	SMB_PRF_XEON_2C_7XXX	0xDD	/* Intel Xeon Dual-Core 7xxx */
725 #define	SMB_PRF_XEON_4C_7XXX	0xDE	/* Intel Xeon Quad-Core 7xxx */
726 #define	SMB_PRF_XEON_XC_7XXX	0xDF	/* Intel Xeon Multi-Core 7xxx */
727 #define	SMB_PRF_XEON_XC_3400	0xE0	/* Intel Xeon Multi-Core 3400 */
728 #define	SMB_PRF_OPTERON_3000	0xE4	/* AMD Opteron 3000 */
729 #define	SMB_PRF_SEMPRON_II	0xE5	/* AMD Sempron II */
730 #define	SMB_PRF_OPTERON_4C_EM	0xE6	/* AMD Opteron Quad-Core embedded */
731 #define	SMB_PRF_PHENOM_3C	0xE7	/* AMD Phenom Triple-Core */
732 #define	SMB_PRF_TURIONU_2C_M	0xE8	/* AMD Turion Ultra Dual-Core mobile */
733 #define	SMB_PRF_TURION_2C_M	0xE9	/* AMD Turion Dual-Core mobile */
734 #define	SMB_PRF_ATHLON_2C	0xEA	/* AMD Athlon Dual-Core */
735 #define	SMB_PRF_SEMPRON_SI	0xEB	/* AMD Sempron SI */
736 #define	SMB_PRF_PHENOM_II	0xEC	/* AMD Phenom II */
737 #define	SMB_PRF_ATHLON_II	0xED	/* AMD Athlon II */
738 #define	SMB_PRF_OPTERON_6C	0xEE	/* AMD Opteron Six-Core */
739 #define	SMB_PRF_SEMPRON_M	0xEF	/* AMD Sempron M */
740 #define	SMB_PRF_I860		0xFA	/* i860 */
741 #define	SMB_PRF_I960		0xFB	/* i960 */
742 #define	SMB_PRF_ARMv7		0x100	/* ARMv7 */
743 #define	SMB_PRF_ARMv8		0x101	/* ARMv8 */
744 #define	SMB_PRF_SH3		0x104	/* SH-3 */
745 #define	SMB_PRF_SH4		0x105	/* SH-4 */
746 #define	SMB_PRF_ARM		0x118	/* ARM */
747 #define	SMB_PRF_SARM		0x119	/* StrongARM */
748 #define	SMB_PRF_6X86		0x12C	/* 6x86 */
749 #define	SMB_PRF_MEDIAGX		0x12D	/* MediaGX */
750 #define	SMB_PRF_MII		0x12E	/* MII */
751 #define	SMB_PRF_WINCHIP		0x140	/* WinChip */
752 #define	SMB_PRF_DSP		0x15E	/* DSP */
753 #define	SMB_PRF_VIDEO		0x1F4	/* Video Processor */
754 
755 /*
756  * SMBIOS Cache Information.  See DSP0134 Section 7.8 for more information.
757  * If smba_size is zero, this indicates the specified cache is not present.
758  *
759  * SMBIOS 3.1 added extended cache sizes. Unfortunately, we had already baked in
760  * the uint32_t sizes, so we added extended uint64_t's that correspond to the
761  * new fields. To make life easier for consumers, we always make sure that the
762  * _maxsize2 and _size2 members are filled in with the old value if no other
763  * value is present.
764  */
765 typedef struct smbios_cache {
766 	uint32_t smba_maxsize;		/* maximum installed size in bytes */
767 	uint32_t smba_size;		/* installed size in bytes */
768 	uint16_t smba_stype;		/* supported SRAM types (SMB_CAT_*) */
769 	uint16_t smba_ctype;		/* current SRAM type (SMB_CAT_*) */
770 	uint8_t smba_speed;		/* speed in nanoseconds */
771 	uint8_t smba_etype;		/* error correction type (SMB_CAE_*) */
772 	uint8_t smba_ltype;		/* logical cache type (SMB_CAG_*) */
773 	uint8_t smba_assoc;		/* associativity (SMB_CAA_*) */
774 	uint8_t smba_level;		/* cache level */
775 	uint8_t smba_mode;		/* cache mode (SMB_CAM_*) */
776 	uint8_t smba_location;		/* cache location (SMB_CAL_*) */
777 	uint8_t smba_flags;		/* cache flags (SMB_CAF_*) */
778 	uint64_t smba_maxsize2;		/* maximum installed size in bytes */
779 	uint64_t smba_size2;		/* installed size in bytes */
780 } smbios_cache_t;
781 
782 #define	SMB_CAT_OTHER		0x0001		/* other */
783 #define	SMB_CAT_UNKNOWN		0x0002		/* unknown */
784 #define	SMB_CAT_NONBURST	0x0004		/* non-burst */
785 #define	SMB_CAT_BURST		0x0008		/* burst */
786 #define	SMB_CAT_PBURST		0x0010		/* pipeline burst */
787 #define	SMB_CAT_SYNC		0x0020		/* synchronous */
788 #define	SMB_CAT_ASYNC		0x0040		/* asynchronous */
789 
790 #define	SMB_CAE_OTHER		0x01		/* other */
791 #define	SMB_CAE_UNKNOWN		0x02		/* unknown */
792 #define	SMB_CAE_NONE		0x03		/* none */
793 #define	SMB_CAE_PARITY		0x04		/* parity */
794 #define	SMB_CAE_SBECC		0x05		/* single-bit ECC */
795 #define	SMB_CAE_MBECC		0x06		/* multi-bit ECC */
796 
797 #define	SMB_CAG_OTHER		0x01		/* other */
798 #define	SMB_CAG_UNKNOWN		0x02		/* unknown */
799 #define	SMB_CAG_INSTR		0x03		/* instruction */
800 #define	SMB_CAG_DATA		0x04		/* data */
801 #define	SMB_CAG_UNIFIED		0x05		/* unified */
802 
803 #define	SMB_CAA_OTHER		0x01		/* other */
804 #define	SMB_CAA_UNKNOWN		0x02		/* unknown */
805 #define	SMB_CAA_DIRECT		0x03		/* direct mapped */
806 #define	SMB_CAA_2WAY		0x04		/* 2-way set associative */
807 #define	SMB_CAA_4WAY		0x05		/* 4-way set associative */
808 #define	SMB_CAA_FULL		0x06		/* fully associative */
809 #define	SMB_CAA_8WAY		0x07		/* 8-way set associative */
810 #define	SMB_CAA_16WAY		0x08		/* 16-way set associative */
811 #define	SMB_CAA_12WAY		0x09		/* 12-way set associative */
812 #define	SMB_CAA_24WAY		0x0A		/* 24-way set associative */
813 #define	SMB_CAA_32WAY		0x0B		/* 32-way set associative */
814 #define	SMB_CAA_48WAY		0x0C		/* 48-way set associative */
815 #define	SMB_CAA_64WAY		0x0D		/* 64-way set associative */
816 #define	SMB_CAA_20WAY		0x0E		/* 20-way set associative */
817 
818 #define	SMB_CAM_WT		0x00		/* write-through */
819 #define	SMB_CAM_WB		0x01		/* write-back */
820 #define	SMB_CAM_VARY		0x02		/* varies by address */
821 #define	SMB_CAM_UNKNOWN		0x03		/* unknown */
822 
823 #define	SMB_CAL_INTERNAL	0x00		/* internal */
824 #define	SMB_CAL_EXTERNAL	0x01		/* external */
825 #define	SMB_CAL_RESERVED	0x02		/* reserved */
826 #define	SMB_CAL_UNKNOWN		0x03		/* unknown */
827 
828 #define	SMB_CAF_ENABLED		0x01		/* enabled at boot time */
829 #define	SMB_CAF_SOCKETED	0x02		/* cache is socketed */
830 
831 /*
832  * SMBIOS Port Information.  See DSP0134 Section 7.9 for more information.
833  * The internal reference designator string is also mapped to the location.
834  */
835 typedef struct smbios_port {
836 	const char *smbo_iref;	/* internal reference designator */
837 	const char *smbo_eref;	/* external reference designator */
838 	uint8_t smbo_itype;	/* internal connector type (SMB_POC_*) */
839 	uint8_t smbo_etype;	/* external connector type (SMB_POC_*) */
840 	uint8_t smbo_ptype;	/* port type (SMB_POT_*) */
841 	uint8_t smbo_pad;	/* padding */
842 } smbios_port_t;
843 
844 #define	SMB_POC_NONE		0x00		/* none */
845 #define	SMB_POC_CENT		0x01		/* Centronics */
846 #define	SMB_POC_MINICENT	0x02		/* Mini-Centronics */
847 #define	SMB_POC_PROPRIETARY	0x03		/* proprietary */
848 #define	SMB_POC_DB25M		0x04		/* DB-25 pin male */
849 #define	SMB_POC_DB25F		0x05		/* DB-25 pin female */
850 #define	SMB_POC_DB15M		0x06		/* DB-15 pin male */
851 #define	SMB_POC_DB15F		0x07		/* DB-15 pin female */
852 #define	SMB_POC_DB9M		0x08		/* DB-9 pin male */
853 #define	SMB_POC_DB9F		0x09		/* DB-9 pin female */
854 #define	SMB_POC_RJ11		0x0A		/* RJ-11 */
855 #define	SMB_POC_RJ45		0x0B		/* RJ-45 */
856 #define	SMB_POC_MINISCSI	0x0C		/* 50-pin MiniSCSI */
857 #define	SMB_POC_MINIDIN		0x0D		/* Mini-DIN */
858 #define	SMB_POC_MICRODIN	0x0E		/* Micro-DIN */
859 #define	SMB_POC_PS2		0x0F		/* PS/2 */
860 #define	SMB_POC_IR		0x10		/* Infrared */
861 #define	SMB_POC_HPHIL		0x11		/* HP-HIL */
862 #define	SMB_POC_USB		0x12		/* USB */
863 #define	SMB_POC_SSA		0x13		/* SSA SCSI */
864 #define	SMB_POC_DIN8M		0x14		/* Circular DIN-8 male */
865 #define	SMB_POC_DIN8F		0x15		/* Circular DIN-8 female */
866 #define	SMB_POC_OBIDE		0x16		/* on-board IDE */
867 #define	SMB_POC_OBFLOPPY	0x17		/* on-board floppy */
868 #define	SMB_POC_DI9		0x18		/* 9p dual inline (p10 cut) */
869 #define	SMB_POC_DI25		0x19		/* 25p dual inline (p26 cut) */
870 #define	SMB_POC_DI50		0x1A		/* 50p dual inline */
871 #define	SMB_POC_DI68		0x1B		/* 68p dual inline */
872 #define	SMB_POC_CDROM		0x1C		/* on-board sound from CDROM */
873 #define	SMB_POC_MINI14		0x1D		/* Mini-Centronics Type 14 */
874 #define	SMB_POC_MINI26		0x1E		/* Mini-Centronics Type 26 */
875 #define	SMB_POC_MINIJACK	0x1F		/* Mini-jack (headphones) */
876 #define	SMB_POC_BNC		0x20		/* BNC */
877 #define	SMB_POC_1394		0x21		/* 1394 */
878 #define	SMB_POC_SATA		0x22		/* SAS/SATA plug receptacle */
879 #define	SMB_POC_USB_C		0x23		/* USB Type-C receptacle */
880 #define	SMB_POC_PC98		0xA0		/* PC-98 */
881 #define	SMB_POC_PC98HR		0xA1		/* PC-98Hireso */
882 #define	SMB_POC_PCH98		0xA2		/* PC-H98 */
883 #define	SMB_POC_PC98NOTE	0xA3		/* PC-98Note */
884 #define	SMB_POC_PC98FULL	0xA4		/* PC-98Full */
885 #define	SMB_POC_OTHER		0xFF		/* other */
886 
887 #define	SMB_POT_NONE		0x00		/* none */
888 #define	SMB_POT_PP_XTAT		0x01		/* Parallel Port XT/AT compat */
889 #define	SMB_POT_PP_PS2		0x02		/* Parallel Port PS/2 */
890 #define	SMB_POT_PP_ECP		0x03		/* Parallel Port ECP */
891 #define	SMB_POT_PP_EPP		0x04		/* Parallel Port EPP */
892 #define	SMB_POT_PP_ECPEPP	0x05		/* Parallel Port ECP/EPP */
893 #define	SMB_POT_SP_XTAT		0x06		/* Serial Port XT/AT compat */
894 #define	SMB_POT_SP_16450	0x07		/* Serial Port 16450 compat */
895 #define	SMB_POT_SP_16550	0x08		/* Serial Port 16550 compat */
896 #define	SMB_POT_SP_16550A	0x09		/* Serial Port 16550A compat */
897 #define	SMB_POT_SCSI		0x0A		/* SCSI port */
898 #define	SMB_POT_MIDI		0x0B		/* MIDI port */
899 #define	SMB_POT_JOYSTICK	0x0C		/* Joystick port */
900 #define	SMB_POT_KEYBOARD	0x0D		/* Keyboard port */
901 #define	SMB_POT_MOUSE		0x0E		/* Mouse port */
902 #define	SMB_POT_SSA		0x0F		/* SSA SCSI */
903 #define	SMB_POT_USB		0x10		/* USB */
904 #define	SMB_POT_FIREWIRE	0x11		/* FireWrite (IEEE P1394) */
905 #define	SMB_POT_PCMII		0x12		/* PCMCIA Type II */
906 #define	SMB_POT_PCMIIa		0x13		/* PCMCIA Type II (alternate) */
907 #define	SMB_POT_PCMIII		0x14		/* PCMCIA Type III */
908 #define	SMB_POT_CARDBUS		0x15		/* Cardbus */
909 #define	SMB_POT_ACCESS		0x16		/* Access Bus Port */
910 #define	SMB_POT_SCSI2		0x17		/* SCSI II */
911 #define	SMB_POT_SCSIW		0x18		/* SCSI Wide */
912 #define	SMB_POT_PC98		0x19		/* PC-98 */
913 #define	SMB_POT_PC98HR		0x1A		/* PC-98Hireso */
914 #define	SMB_POT_PCH98		0x1B		/* PC-H98 */
915 #define	SMB_POT_VIDEO		0x1C		/* Video port */
916 #define	SMB_POT_AUDIO		0x1D		/* Audio port */
917 #define	SMB_POT_MODEM		0x1E		/* Modem port */
918 #define	SMB_POT_NETWORK		0x1F		/* Network port */
919 #define	SMB_POT_SATA		0x20		/* SATA */
920 #define	SMB_POT_SAS		0x21		/* SAS */
921 #define	SMB_POT_MFDP		0x22	/* MFDP (Multi-Function Display Port) */
922 #define	SMB_POT_THUNDERBOLT	0x23		/* Thunderbolt */
923 #define	SMB_POT_8251		0xA0		/* 8251 compatible */
924 #define	SMB_POT_8251F		0xA1		/* 8251 FIFO compatible */
925 #define	SMB_POT_OTHER		0xFF		/* other */
926 
927 /*
928  * SMBIOS Slot Information.  See DSP0134 Section 7.10 for more information.
929  * See DSP0134 7.10.5 for how to interpret the value of smbl_id.
930  */
931 typedef struct smbios_slot {
932 	const char *smbl_name;		/* reference designation */
933 	uint8_t smbl_type;		/* slot type */
934 	uint8_t smbl_width;		/* slot data bus width */
935 	uint8_t smbl_usage;		/* current usage */
936 	uint8_t smbl_length;		/* slot length */
937 	uint16_t smbl_id;		/* slot ID */
938 	uint8_t smbl_ch1;		/* slot characteristics 1 */
939 	uint8_t smbl_ch2;		/* slot characteristics 2 */
940 	uint16_t smbl_sg;		/* segment group number */
941 	uint8_t smbl_bus;		/* bus number */
942 	uint8_t smbl_df;		/* device/function number */
943 	uint8_t smbl_dbw;		/* data bus width */
944 	uint8_t smbl_npeers;		/* PCIe bifurcation peers */
945 } smbios_slot_t;
946 
947 #define	SMB_SLT_OTHER		0x01	/* other */
948 #define	SMB_SLT_UNKNOWN		0x02	/* unknown */
949 #define	SMB_SLT_ISA		0x03	/* ISA */
950 #define	SMB_SLT_MCA		0x04	/* MCA */
951 #define	SMB_SLT_EISA		0x05	/* EISA */
952 #define	SMB_SLT_PCI		0x06	/* PCI */
953 #define	SMB_SLT_PCMCIA		0x07	/* PCMCIA */
954 #define	SMB_SLT_VLVESA		0x08	/* VL-VESA */
955 #define	SMB_SLT_PROPRIETARY	0x09	/* proprietary */
956 #define	SMB_SLT_PROC		0x0A	/* processor card slot */
957 #define	SMB_SLT_MEM		0x0B	/* proprietary memory card slot */
958 #define	SMB_SLT_IOR		0x0C	/* I/O riser card slot */
959 #define	SMB_SLT_NUBUS		0x0D	/* NuBus */
960 #define	SMB_SLT_PCI66		0x0E	/* PCI (66MHz capable) */
961 #define	SMB_SLT_AGP		0x0F	/* AGP */
962 #define	SMB_SLT_AGP2X		0x10	/* AGP 2X */
963 #define	SMB_SLT_AGP4X		0x11	/* AGP 4X */
964 #define	SMB_SLT_PCIX		0x12	/* PCI-X */
965 #define	SMB_SLT_AGP8X		0x13	/* AGP 8X */
966 #define	SMB_SLT_M2_1DP		0x14	/* M.2 Socket 1-DP (Mechanical Key A) */
967 #define	SMB_SLT_M2_1SD		0x15	/* M.2 Socket 1-SD (Mechanical Key E) */
968 #define	SMB_SLT_M2_2		0x16	/* M.2 Socket 2 (Mechanical Key B) */
969 #define	SMB_SLT_M2_3		0x17	/* M.2 Socket 3 (Mechanical Key M) */
970 #define	SMB_SLT_MXM_I		0x18	/* MXM Type I */
971 #define	SMB_SLT_MXM_II		0x19	/* MXM Type II */
972 #define	SMB_SLT_MXM_III		0x1A	/* MXM Type III (standard connector) */
973 #define	SMB_SLT_MXM_III_HE	0x1B	/* MXM Type III (HE connector) */
974 #define	SMB_SLT_MXM_V		0x1C	/* MXM Type IV */
975 #define	SMB_SLT_MXM3_A		0x1D	/* MXM 3.0 Type A */
976 #define	SMB_SLT_MXM3_B		0x1E	/* MXM 3.0 Type B */
977 #define	SMB_SLT_PCIEG2_SFF	0x1F	/* PCI Express Gen 2 SFF-8639 */
978 #define	SMB_SLT_PCIEG3_SFF	0x20	/* PCI Express Gen 3 SFF-8639 */
979 /*
980  * These lines must be on one line for the string generating code.
981  */
982 /* BEGIN CSTYLED */
983 #define	SMB_SLT_PCIE_M52_WBSKO	0x21	/* PCI Express Mini 52-pin with bottom-side keep-outs */
984 #define	SMB_SLT_PCIE_M52_WOBSKO	0x22	/* PCI Express Mini 52-pin without bottom-side keep-outs */
985 /* END CSTYLED */
986 #define	SMB_SLT_PCIE_M76	0x23	/* PCI Express Mini 72-pin */
987 #define	SMB_SLT_PC98_C20	0xA0	/* PC-98/C20 */
988 #define	SMB_SLT_PC98_C24	0xA1	/* PC-98/C24 */
989 #define	SMB_SLT_PC98_E		0xA2	/* PC-98/E */
990 #define	SMB_SLT_PC98_LB		0xA3	/* PC-98/Local Bus */
991 #define	SMB_SLT_PC98_C		0xA4	/* PC-98/Card */
992 #define	SMB_SLT_PCIE		0xA5	/* PCI Express */
993 #define	SMB_SLT_PCIE1		0xA6	/* PCI Express x1 */
994 #define	SMB_SLT_PCIE2		0xA7	/* PCI Express x2 */
995 #define	SMB_SLT_PCIE4		0xA8	/* PCI Express x4 */
996 #define	SMB_SLT_PCIE8		0xA9	/* PCI Express x8 */
997 #define	SMB_SLT_PCIE16		0xAA	/* PCI Express x16 */
998 #define	SMB_SLT_PCIE2G		0xAB	/* PCI Exp. Gen 2 */
999 #define	SMB_SLT_PCIE2G1		0xAC	/* PCI Exp. Gen 2 x1 */
1000 #define	SMB_SLT_PCIE2G2		0xAD	/* PCI Exp. Gen 2 x2 */
1001 #define	SMB_SLT_PCIE2G4		0xAE	/* PCI Exp. Gen 2 x4 */
1002 #define	SMB_SLT_PCIE2G8		0xAF	/* PCI Exp. Gen 2 x8 */
1003 #define	SMB_SLT_PCIE2G16	0xB0	/* PCI Exp. Gen 2 x16 */
1004 #define	SMB_SLT_PCIE3G		0xB1	/* PCI Exp. Gen 3 */
1005 #define	SMB_SLT_PCIE3G1		0xB2	/* PCI Exp. Gen 3 x1 */
1006 #define	SMB_SLT_PCIE3G2		0xB3	/* PCI Exp. Gen 3 x2 */
1007 #define	SMB_SLT_PCIE3G4		0xB4	/* PCI Exp. Gen 3 x4 */
1008 #define	SMB_SLT_PCIE3G8		0xB5	/* PCI Exp. Gen 3 x8 */
1009 #define	SMB_SLT_PCIE3G16	0xB6	/* PCI Exp. Gen 3 x16 */
1010 
1011 #define	SMB_SLW_OTHER		0x01	/* other */
1012 #define	SMB_SLW_UNKNOWN		0x02	/* unknown */
1013 #define	SMB_SLW_8		0x03	/* 8 bit */
1014 #define	SMB_SLW_16		0x04	/* 16 bit */
1015 #define	SMB_SLW_32		0x05	/* 32 bit */
1016 #define	SMB_SLW_64		0x06	/* 64 bit */
1017 #define	SMB_SLW_128		0x07	/* 128 bit */
1018 #define	SMB_SLW_1X		0x08	/* 1x or x1 */
1019 #define	SMB_SLW_2X		0x09	/* 2x or x2 */
1020 #define	SMB_SLW_4X		0x0A	/* 4x or x4 */
1021 #define	SMB_SLW_8X		0x0B	/* 8x or x8 */
1022 #define	SMB_SLW_12X		0x0C	/* 12x or x12 */
1023 #define	SMB_SLW_16X		0x0D	/* 16x or x16 */
1024 #define	SMB_SLW_32X		0x0E	/* 32x or x32 */
1025 
1026 #define	SMB_SLU_OTHER		0x01	/* other */
1027 #define	SMB_SLU_UNKNOWN		0x02	/* unknown */
1028 #define	SMB_SLU_AVAIL		0x03	/* available */
1029 #define	SMB_SLU_INUSE		0x04	/* in use */
1030 
1031 #define	SMB_SLL_OTHER		0x01	/* other */
1032 #define	SMB_SLL_UNKNOWN		0x02	/* unknown */
1033 #define	SMB_SLL_SHORT		0x03	/* short length */
1034 #define	SMB_SLL_LONG		0x04	/* long length */
1035 
1036 #define	SMB_SLCH1_UNKNOWN	0x01	/* characteristics unknown */
1037 #define	SMB_SLCH1_5V		0x02	/* provides 5.0V */
1038 #define	SMB_SLCH1_33V		0x04	/* provides 3.3V */
1039 #define	SMB_SLCH1_SHARED	0x08	/* opening shared with other slot */
1040 #define	SMB_SLCH1_PC16		0x10	/* slot supports PC Card-16 */
1041 #define	SMB_SLCH1_PCCB		0x20	/* slot supports CardBus */
1042 #define	SMB_SLCH1_PCZV		0x40	/* slot supports Zoom Video */
1043 #define	SMB_SLCH1_PCMRR		0x80	/* slot supports Modem Ring Resume */
1044 
1045 #define	SMB_SLCH2_PME		0x01	/* slot supports PME# signal */
1046 #define	SMB_SLCH2_HOTPLUG	0x02	/* slot supports hot-plug devices */
1047 #define	SMB_SLCH2_SMBUS		0x04	/* slot supports SMBus signal */
1048 #define	SMB_SLCH2_BIFUR		0x08	/* slot supports PCIe bifurcation */
1049 
1050 /*
1051  * SMBIOS 7.10.9 Slot Peer Devices
1052  *
1053  * This structure represents an optional peer device that may be part of an
1054  * SMBIOS 3.2 slot.
1055  */
1056 typedef struct smbios_slot_peer {
1057 	uint16_t smblp_group;		/* peer segment group number */
1058 	uint8_t smblp_bus;		/* peer bus number */
1059 	uint8_t smblp_device;		/* peer device number */
1060 	uint8_t smblp_function;		/* peer function number */
1061 	uint8_t	smblp_data_width;	/* peer data bus width */
1062 } smbios_slot_peer_t;
1063 
1064 /*
1065  * SMBIOS On-Board Device Information.  See DSP0134 Section 7.11 for more
1066  * information.  Any number of on-board device sections may be present, each
1067  * containing one or more records.  The smbios_info_obdevs() function permits
1068  * the caller to retrieve one or more of the records from a given section.
1069  */
1070 typedef struct smbios_obdev {
1071 	const char *smbd_name;		/* description string for this device */
1072 	uint8_t smbd_type;		/* type code (SMB_OBT_*) */
1073 	uint8_t smbd_enabled;		/* boolean (device is enabled) */
1074 } smbios_obdev_t;
1075 
1076 #define	SMB_OBT_OTHER		0x01	/* other */
1077 #define	SMB_OBT_UNKNOWN		0x02	/* unknown */
1078 #define	SMB_OBT_VIDEO		0x03	/* video */
1079 #define	SMB_OBT_SCSI		0x04	/* scsi */
1080 #define	SMB_OBT_ETHERNET	0x05	/* ethernet */
1081 #define	SMB_OBT_TOKEN		0x06	/* token ring */
1082 #define	SMB_OBT_SOUND		0x07	/* sound */
1083 #define	SMB_OBT_PATA		0x08	/* pata */
1084 #define	SMB_OBT_SATA		0x09	/* sata */
1085 #define	SMB_OBT_SAS		0x0A	/* sas */
1086 
1087 /*
1088  * SMBIOS BIOS Language Information.  See DSP0134 Section 7.14 for more
1089  * information.  The smbios_info_strtab() function can be applied using a
1090  * count of smbla_num to retrieve the other possible language settings.
1091  */
1092 typedef struct smbios_lang {
1093 	const char *smbla_cur;		/* current language setting */
1094 	uint_t smbla_fmt;		/* language name format (see below) */
1095 	uint_t smbla_num;		/* number of installed languages */
1096 } smbios_lang_t;
1097 
1098 #define	SMB_LFMT_LONG	0		/* <ISO639>|<ISO3166>|Encoding Method */
1099 #define	SMB_LFMT_SHORT	1		/* <ISO930><ISO3166> */
1100 
1101 /*
1102  * SMBIOS System Event Log Information.  See DSP0134 Section 7.16 for more
1103  * information.  Accessing the event log itself requires additional interfaces.
1104  */
1105 typedef struct smbios_evtype {
1106 	uint8_t smbevt_ltype;		/* log type */
1107 	uint8_t smbevt_dtype;		/* variable data format type */
1108 } smbios_evtype_t;
1109 
1110 typedef struct smbios_evlog {
1111 	size_t smbev_size;		/* size in bytes of log area */
1112 	size_t smbev_hdr;		/* offset or index of header */
1113 	size_t smbev_data;		/* offset or index of data */
1114 	uint8_t smbev_method;		/* data access method (see below) */
1115 	uint8_t smbev_flags;		/* flags (see below) */
1116 	uint8_t smbev_format;		/* log header format (see below) */
1117 	uint8_t smbev_pad;		/* padding */
1118 	uint32_t smbev_token;		/* data update change token */
1119 	union {
1120 		struct {
1121 			uint16_t evi_iaddr; /* index address */
1122 			uint16_t evi_daddr; /* data address */
1123 		} eva_io;		/* i/o address for SMB_EVM_XxY */
1124 		uint32_t eva_addr;	/* address for SMB_EVM_MEM32 */
1125 		uint16_t eva_gpnv;	/* handle for SMB_EVM_GPNV */
1126 	} smbev_addr;
1127 	uint32_t smbev_typec;		/* number of type descriptors */
1128 	const smbios_evtype_t *smbev_typev; /* type descriptor array */
1129 } smbios_evlog_t;
1130 
1131 #define	SMB_EVM_1x1i_1x1d	0	/* I/O: 1 1b idx port, 1 1b data port */
1132 #define	SMB_EVM_2x1i_1x1d	1	/* I/O: 2 1b idx port, 1 1b data port */
1133 #define	SMB_EVM_1x2i_1x1d	2	/* I/O: 1 2b idx port, 1 1b data port */
1134 #define	SMB_EVM_MEM32		3	/* Memory-Mapped 32-bit Physical Addr */
1135 #define	SMB_EVM_GPNV		4	/* GP Non-Volatile API Access */
1136 
1137 #define	SMB_EVFL_VALID		0x1	/* log area valid */
1138 #define	SMB_EVFL_FULL		0x2	/* log area full */
1139 
1140 #define	SMB_EVHF_NONE		0	/* no log headers used */
1141 #define	SMB_EVHF_F1		1	/* DMTF log header type 1 */
1142 
1143 /*
1144  * SMBIOS Physical Memory Array Information.  See DSP0134 Section 7.17 for
1145  * more information.  This describes a collection of physical memory devices.
1146  */
1147 typedef struct smbios_memarray {
1148 	uint8_t smbma_location;		/* physical device location */
1149 	uint8_t smbma_use;		/* physical device functional purpose */
1150 	uint8_t smbma_ecc;		/* error detect/correct mechanism */
1151 	uint8_t smbma_pad0;		/* padding */
1152 	uint32_t smbma_pad1;		/* padding */
1153 	uint32_t smbma_ndevs;		/* number of slots or sockets */
1154 	id_t smbma_err;			/* handle of error (if any) */
1155 	uint64_t smbma_size;		/* maximum capacity in bytes */
1156 } smbios_memarray_t;
1157 
1158 #define	SMB_MAL_OTHER		0x01	/* other */
1159 #define	SMB_MAL_UNKNOWN		0x02	/* unknown */
1160 #define	SMB_MAL_SYSMB		0x03	/* system board or motherboard */
1161 #define	SMB_MAL_ISA		0x04	/* ISA add-on card */
1162 #define	SMB_MAL_EISA		0x05	/* EISA add-on card */
1163 #define	SMB_MAL_PCI		0x06	/* PCI add-on card */
1164 #define	SMB_MAL_MCA		0x07	/* MCA add-on card */
1165 #define	SMB_MAL_PCMCIA		0x08	/* PCMCIA add-on card */
1166 #define	SMB_MAL_PROP		0x09	/* proprietary add-on card */
1167 #define	SMB_MAL_NUBUS		0x0A	/* NuBus */
1168 #define	SMB_MAL_PC98C20		0xA0	/* PC-98/C20 add-on card */
1169 #define	SMB_MAL_PC98C24		0xA1	/* PC-98/C24 add-on card */
1170 #define	SMB_MAL_PC98E		0xA2	/* PC-98/E add-on card */
1171 #define	SMB_MAL_PC98LB		0xA3	/* PC-98/Local bus add-on card */
1172 
1173 #define	SMB_MAU_OTHER		0x01	/* other */
1174 #define	SMB_MAU_UNKNOWN		0x02	/* unknown */
1175 #define	SMB_MAU_SYSTEM		0x03	/* system memory */
1176 #define	SMB_MAU_VIDEO		0x04	/* video memory */
1177 #define	SMB_MAU_FLASH		0x05	/* flash memory */
1178 #define	SMB_MAU_NVRAM		0x06	/* non-volatile RAM */
1179 #define	SMB_MAU_CACHE		0x07	/* cache memory */
1180 
1181 #define	SMB_MAE_OTHER		0x01	/* other */
1182 #define	SMB_MAE_UNKNOWN		0x02	/* unknown */
1183 #define	SMB_MAE_NONE		0x03	/* none */
1184 #define	SMB_MAE_PARITY		0x04	/* parity */
1185 #define	SMB_MAE_SECC		0x05	/* single-bit ECC */
1186 #define	SMB_MAE_MECC		0x06	/* multi-bit ECC */
1187 #define	SMB_MAE_CRC		0x07	/* CRC */
1188 
1189 /*
1190  * SMBIOS Memory Device Information.  See DSP0134 Section 7.18 for more
1191  * information.  One or more of these structures are associated with each
1192  * smbios_memarray_t.  A structure is present even for unpopulated sockets.
1193  * Unknown values are set to -1.  A smbmd_size of 0 indicates unpopulated.
1194  * WARNING: Some BIOSes appear to export the *maximum* size of the device
1195  * that can appear in the corresponding socket as opposed to the current one.
1196  */
1197 typedef struct smbios_memdevice {
1198 	id_t smbmd_array;		/* handle of physical memory array */
1199 	id_t smbmd_error;		/* handle of memory error data */
1200 	uint32_t smbmd_twidth;		/* total width in bits including ecc */
1201 	uint32_t smbmd_dwidth;		/* data width in bits */
1202 	uint64_t smbmd_size;		/* size in bytes (see note above) */
1203 	uint8_t smbmd_form;		/* form factor */
1204 	uint8_t smbmd_set;		/* set (0x00=none, 0xFF=unknown) */
1205 	uint8_t smbmd_type;		/* memory type */
1206 	uint8_t smbmd_pad;		/* padding */
1207 	uint32_t smbmd_flags;		/* flags (see below) */
1208 	uint32_t smbmd_speed;		/* speed in MT/s */
1209 	const char *smbmd_dloc;		/* physical device locator string */
1210 	const char *smbmd_bloc;		/* physical bank locator string */
1211 	uint8_t smbmd_rank;		/* rank */
1212 	uint16_t smbmd_clkspeed;	/* configured clock speed */
1213 	uint16_t smbmd_minvolt;		/* minimum voltage */
1214 	uint16_t smbmd_maxvolt;		/* maximum voltage */
1215 	uint16_t smbmd_confvolt;	/* configured voltage */
1216 	uint8_t smbmd_memtech;		/* memory technology */
1217 	uint32_t smbmd_opcap_flags;	/* operating mode capability */
1218 	const char *smbmd_firmware_rev;	/* firmware rev */
1219 	uint16_t smbmd_modmfg_id;	/* JEDEC module mfg id */
1220 	uint16_t smbmd_modprod_id;	/* JEDEC module product id */
1221 	uint16_t smbmd_cntrlmfg_id;	/* JEDEC controller mfg id */
1222 	uint16_t smbmd_cntrlprod_id;	/* JEDEC controller prod id */
1223 	uint64_t smbmd_nvsize;		/* non-volatile size in bytes */
1224 	uint64_t smbmd_volatile_size;	/* volatile size in bytes */
1225 	uint64_t smbmd_cache_size;	/* cache size in bytes */
1226 	uint64_t smbmd_logical_size;	/* logical size in bytes */
1227 } smbios_memdevice_t;
1228 
1229 #define	SMB_MDFF_OTHER		0x01	/* other */
1230 #define	SMB_MDFF_UNKNOWN	0x02	/* unknown */
1231 #define	SMB_MDFF_SIMM		0x03	/* SIMM */
1232 #define	SMB_MDFF_SIP		0x04	/* SIP */
1233 #define	SMB_MDFF_CHIP		0x05	/* chip */
1234 #define	SMB_MDFF_DIP		0x06	/* DIP */
1235 #define	SMB_MDFF_ZIP		0x07	/* ZIP */
1236 #define	SMB_MDFF_PROP		0x08	/* proprietary card */
1237 #define	SMB_MDFF_DIMM		0x09	/* DIMM */
1238 #define	SMB_MDFF_TSOP		0x0A	/* TSOP */
1239 #define	SMB_MDFF_CHIPROW	0x0B	/* row of chips */
1240 #define	SMB_MDFF_RIMM		0x0C	/* RIMM */
1241 #define	SMB_MDFF_SODIMM		0x0D	/* SODIMM */
1242 #define	SMB_MDFF_SRIMM		0x0E	/* SRIMM */
1243 #define	SMB_MDFF_FBDIMM		0x0F	/* FBDIMM */
1244 
1245 #define	SMB_MDT_OTHER		0x01	/* other */
1246 #define	SMB_MDT_UNKNOWN		0x02	/* unknown */
1247 #define	SMB_MDT_DRAM		0x03	/* DRAM */
1248 #define	SMB_MDT_EDRAM		0x04	/* EDRAM */
1249 #define	SMB_MDT_VRAM		0x05	/* VRAM */
1250 #define	SMB_MDT_SRAM		0x06	/* SRAM */
1251 #define	SMB_MDT_RAM		0x07	/* RAM */
1252 #define	SMB_MDT_ROM		0x08	/* ROM */
1253 #define	SMB_MDT_FLASH		0x09	/* FLASH */
1254 #define	SMB_MDT_EEPROM		0x0A	/* EEPROM */
1255 #define	SMB_MDT_FEPROM		0x0B	/* FEPROM */
1256 #define	SMB_MDT_EPROM		0x0C	/* EPROM */
1257 #define	SMB_MDT_CDRAM		0x0D	/* CDRAM */
1258 #define	SMB_MDT_3DRAM		0x0E	/* 3DRAM */
1259 #define	SMB_MDT_SDRAM		0x0F	/* SDRAM */
1260 #define	SMB_MDT_SGRAM		0x10	/* SGRAM */
1261 #define	SMB_MDT_RDRAM		0x11	/* RDRAM */
1262 #define	SMB_MDT_DDR		0x12	/* DDR */
1263 #define	SMB_MDT_DDR2		0x13	/* DDR2 */
1264 #define	SMB_MDT_DDR2FBDIMM	0x14	/* DDR2 FBDIMM */
1265 #define	SMB_MDT_DDR3		0x18	/* DDR3 */
1266 #define	SMB_MDT_FBD2		0x19	/* FBD2 */
1267 #define	SMB_MDT_DDR4		0x1A	/* DDR4 */
1268 #define	SMB_MDT_LPDDR		0x1B	/* LPDDR */
1269 #define	SMB_MDT_LPDDR2		0x1C	/* LPDDR2 */
1270 #define	SMB_MDT_LPDDR3		0x1D	/* LPDDR3 */
1271 #define	SMB_MDT_LPDDR4		0x1E	/* LPDDR4 */
1272 #define	SMB_MDT_LOGNV		0x1F	/* Logical non-volatile device */
1273 
1274 #define	SMB_MDF_OTHER		0x0002	/* other */
1275 #define	SMB_MDF_UNKNOWN		0x0004	/* unknown */
1276 #define	SMB_MDF_FASTPG		0x0008	/* fast-paged */
1277 #define	SMB_MDF_STATIC		0x0010	/* static column */
1278 #define	SMB_MDF_PSTATIC		0x0020	/* pseudo-static */
1279 #define	SMB_MDF_RAMBUS		0x0040	/* RAMBUS */
1280 #define	SMB_MDF_SYNC		0x0080	/* synchronous */
1281 #define	SMB_MDF_CMOS		0x0100	/* CMOS */
1282 #define	SMB_MDF_EDO		0x0200	/* EDO */
1283 #define	SMB_MDF_WDRAM		0x0400	/* Window DRAM */
1284 #define	SMB_MDF_CDRAM		0x0800	/* Cache DRAM */
1285 #define	SMB_MDF_NV		0x1000	/* non-volatile */
1286 #define	SMB_MDF_REG		0x2000	/* Registered (Buffered) */
1287 #define	SMB_MDF_UNREG		0x4000	/* Unregistered (Unbuffered) */
1288 #define	SMB_MDF_LRDIMM		0x8000	/* LRDIMM */
1289 
1290 #define	SMB_MDR_SINGLE		0x01	/* single */
1291 #define	SMB_MDR_DUAL		0x02	/* dual */
1292 #define	SMB_MDR_QUAD		0x04	/* quad */
1293 #define	SMB_MDR_OCTAL		0x08	/* octal */
1294 
1295 #define	SMB_MTECH_OTHER		0x01	/* other */
1296 #define	SMB_MTECH_UNKNOWN	0x02	/* unknown */
1297 #define	SMB_MTECH_DRAM		0x03	/* DRAM */
1298 #define	SMB_MTECH_NVDIMM_N	0x04	/* NVDIMM-N */
1299 #define	SMB_MTECH_NVDIMM_F	0x05	/* NVDIMM-F */
1300 #define	SMB_MTECH_NVDIMM_P	0x06	/* NVDIMM-P */
1301 #define	SMB_MTECH_INTCPM	0x07	/* Intel persistent memory */
1302 
1303 #define	SMB_MOMC_OTHER		0x01	/* other */
1304 #define	SMB_MOMC_UNKNOWN	0x02	/* unknown */
1305 #define	SMB_MOMC_VOLATILE	0x04	/* Volatile memory */
1306 #define	SMB_MOMC_BYTE_PM	0x08	/* Byte-accessible persistent memory */
1307 #define	SMB_MOMC_BLOCK_PM	0x10	/* Block-accessible persistent memory */
1308 
1309 /*
1310  * SMBIOS Memory Array Mapped Address.  See DSP0134 Section 7.20 for more
1311  * information.  We convert start/end addresses into addr/size for convenience.
1312  */
1313 typedef struct smbios_memarrmap {
1314 	id_t smbmam_array;		/* physical memory array handle */
1315 	uint32_t smbmam_width;		/* number of devices that form a row */
1316 	uint64_t smbmam_addr;		/* physical address of mapping */
1317 	uint64_t smbmam_size;		/* size in bytes of address range */
1318 } smbios_memarrmap_t;
1319 
1320 /*
1321  * SMBIOS Memory Device Mapped Address.  See DSP0134 Section 7.21 for more
1322  * information.  We convert start/end addresses into addr/size for convenience.
1323  */
1324 typedef struct smbios_memdevmap {
1325 	id_t smbmdm_device;		/* memory device handle */
1326 	id_t smbmdm_arrmap;		/* memory array mapped address handle */
1327 	uint64_t smbmdm_addr;		/* physical address of mapping */
1328 	uint64_t smbmdm_size;		/* size in bytes of address range */
1329 	uint8_t smbmdm_rpos;		/* partition row position */
1330 	uint8_t smbmdm_ipos;		/* interleave position */
1331 	uint8_t smbmdm_idepth;		/* interleave data depth */
1332 } smbios_memdevmap_t;
1333 
1334 /*
1335  * SMBIOS Hardware Security Settings.  See DSP0134 Section 7.25 for more
1336  * information.  Only one such record will be present in the SMBIOS.
1337  */
1338 typedef struct smbios_hwsec {
1339 	uint8_t smbh_pwr_ps;		/* power-on password status */
1340 	uint8_t smbh_kbd_ps;		/* keyboard password status */
1341 	uint8_t smbh_adm_ps;		/* administrator password status */
1342 	uint8_t smbh_pan_ps;		/* front panel reset status */
1343 } smbios_hwsec_t;
1344 
1345 #define	SMB_HWSEC_PS_DISABLED	0x00	/* password disabled */
1346 #define	SMB_HWSEC_PS_ENABLED	0x01	/* password enabled */
1347 #define	SMB_HWSEC_PS_NOTIMPL	0x02	/* password not implemented */
1348 #define	SMB_HWSEC_PS_UNKNOWN	0x03	/* password status unknown */
1349 
1350 /*
1351  * This value is used to represent a probe that has an unknown value.
1352  */
1353 #define	SMB_PROBE_UNKNOWN_VALUE	0x8000
1354 
1355 /*
1356  * SMBIOS Voltage Probe.  See DSP0134 Section 7.27 for more information.
1357  * Please see the specification for the units of each value.
1358  */
1359 typedef struct smbios_vprobe {
1360 	const char *smbvp_description;	/* description information */
1361 	uint8_t smbvp_location;		/* probe location */
1362 	uint8_t smbvp_status;		/* probe status */
1363 	uint16_t smbvp_maxval;		/* maximum voltage */
1364 	uint16_t smbvp_minval;		/* minimum voltage */
1365 	uint16_t smbvp_resolution;	/* probe resolution */
1366 	uint16_t smbvp_tolerance;	/* probe tolerance */
1367 	uint16_t smbvp_accuracy;	/* probe accuracy */
1368 	uint32_t smbvp_oem;		/* vendor-specific data */
1369 	uint16_t smbvp_nominal;		/* nominal value */
1370 } smbios_vprobe_t;
1371 
1372 #define	SMB_VPROBE_S_OTHER	0x01	/* other */
1373 #define	SMB_VPROBE_S_UNKNOWN	0x02	/* unknown */
1374 #define	SMB_VPROBE_S_OK		0x03	/* OK */
1375 #define	SMB_VPROBE_S_NONCRIT	0x04	/* non-critical */
1376 #define	SMB_VPROBE_S_CRIT	0x05	/* critical */
1377 #define	SMB_VPROBE_S_NONRECOV	0x06	/* non-recoverable */
1378 
1379 #define	SMB_VPROBE_L_OTHER	0x01	/* other */
1380 #define	SMB_VPROBE_L_UNKNOWN	0x02	/* unknown */
1381 #define	SMB_VPROBE_L_PROC	0x03	/* processor */
1382 #define	SMB_VPROBE_L_DISK	0x04	/* disk */
1383 #define	SMB_VPROBE_L_PBAY	0x05	/* peripheral bay */
1384 #define	SMB_VPROBE_L_MGMT	0x06	/* system management module */
1385 #define	SMB_VPROBE_L_MOBO	0x07	/* motherboard */
1386 #define	SMB_VPROBE_L_MEMMOD	0x08	/* memory module */
1387 #define	SMB_VPROBE_L_PROCMOD	0x09	/* processor module */
1388 #define	SMB_VPROBE_L_POWER	0x0a	/* power unit */
1389 #define	SMB_VPROBE_L_AIC	0x0b	/* add-in card */
1390 
1391 /*
1392  * SMBIOS Cooling Device.  See DSP0134 Section 7.28 for more information.
1393  * Please see the specification for the units of each value.
1394  */
1395 typedef struct smbios_cooldev {
1396 	id_t smbcd_tprobe;		/* temperature probe handle */
1397 	uint8_t smbcd_type;		/* cooling device type */
1398 	uint8_t smbcd_status;		/* status */
1399 	uint8_t smbcd_group;		/* group ID */
1400 	uint32_t smbcd_oem;		/* vendor-specific data */
1401 	uint16_t smbcd_nominal;		/* nominal speed */
1402 	const char *smbcd_descr;	/* device description */
1403 } smbios_cooldev_t;
1404 
1405 #define	SMB_COOLDEV_S_OTHER	0x01	/* other */
1406 #define	SMB_COOLDEV_S_UNKNOWN	0x02	/* unknown */
1407 #define	SMB_COOLDEV_S_OK	0x03	/* OK */
1408 #define	SMB_COOLDEV_S_NONCRIT	0x04	/* non-critical */
1409 #define	SMB_COOLDEV_S_CRIT	0x05	/* critical */
1410 #define	SMB_COOLDEV_S_NONRECOV	0x06	/* non-recoverable */
1411 
1412 #define	SMB_COOLDEV_T_OTHER	0x01	/* other */
1413 #define	SMB_COOLDEV_T_UNKNOWN	0x02	/* unknown */
1414 #define	SMB_COOLDEV_T_FAN	0x03	/* fan */
1415 #define	SMB_COOLDEV_T_BLOWER	0x04	/* centrifugal blower */
1416 #define	SMB_COOLDEV_T_CHIPFAN	0x05	/* chip fan */
1417 #define	SMB_COOLDEV_T_CABFAN	0x06	/* cabinet fan */
1418 #define	SMB_COOLDEV_T_PSFAN	0x07	/* power supply fan */
1419 #define	SMB_COOLDEV_T_HEATPIPE	0x08	/* head pipe */
1420 #define	SMB_COOLDEV_T_IREFRIG	0x09	/* integrated refrigeration */
1421 #define	SMB_COOLDEV_T_ACTCOOL	0x10	/* active cooling */
1422 #define	SMB_COOLDEV_T_PASSCOOL	0x11	/* passive cooling */
1423 
1424 /*
1425  * SMBIOS Temperature Probe.  See DSP0134 Section 7.29 for more information.
1426  * Please see the specification for the units of each value.
1427  */
1428 typedef struct smbios_tprobe {
1429 	const char *smbtp_description;	/* description information */
1430 	uint8_t smbtp_location;		/* probe location */
1431 	uint8_t smbtp_status;		/* probe status */
1432 	uint16_t smbtp_maxval;		/* maximum temperature */
1433 	uint16_t smbtp_minval;		/* minimum temperature */
1434 	uint16_t smbtp_resolution;	/* probe resolution */
1435 	uint16_t smbtp_tolerance;	/* probe tolerance */
1436 	uint16_t smbtp_accuracy;	/* probe accuracy */
1437 	uint32_t smbtp_oem;		/* vendor-specific data */
1438 	uint16_t smbtp_nominal;		/* nominal value */
1439 } smbios_tprobe_t;
1440 
1441 #define	SMB_TPROBE_S_OTHER	0x01	/* other */
1442 #define	SMB_TPROBE_S_UNKNOWN	0x02	/* unknown */
1443 #define	SMB_TPROBE_S_OK		0x03	/* OK */
1444 #define	SMB_TPROBE_S_NONCRIT	0x04	/* non-critical */
1445 #define	SMB_TPROBE_S_CRIT	0x05	/* critical */
1446 #define	SMB_TPROBE_S_NONRECOV	0x06	/* non-recoverable */
1447 
1448 #define	SMB_TPROBE_L_OTHER	0x01	/* other */
1449 #define	SMB_TPROBE_L_UNKNOWN	0x02	/* unknown */
1450 #define	SMB_TPROBE_L_PROC	0x03	/* processor */
1451 #define	SMB_TPROBE_L_DISK	0x04	/* disk */
1452 #define	SMB_TPROBE_L_PBAY	0x05	/* peripheral bay */
1453 #define	SMB_TPROBE_L_MGMT	0x06	/* system management module */
1454 #define	SMB_TPROBE_L_MOBO	0x07	/* motherboard */
1455 #define	SMB_TPROBE_L_MEMMOD	0x08	/* memory module */
1456 #define	SMB_TPROBE_L_PROCMOD	0x09	/* processor module */
1457 #define	SMB_TPROBE_L_POWER	0x0a	/* power unit */
1458 #define	SMB_TPROBE_L_AIC	0x0b	/* add-in card */
1459 #define	SMB_TPROBE_L_FPBOARD	0x0c	/* front panel board */
1460 #define	SMB_TPROBE_L_BPBOARD	0x0d	/* rear panel board */
1461 #define	SMB_TPROBE_L_PSBOARD	0x0e	/* power system board */
1462 #define	SMB_TPROBE_L_DBPANE	0x0f	/* drive back plane */
1463 
1464 /*
1465  * SMBIOS Current Probe.  See DSP0134 Section 7.30 for more information.
1466  * Please see the specification for the units of each value.
1467  */
1468 typedef struct smbios_iprobe {
1469 	const char *smbip_description;	/* description information */
1470 	uint8_t smbip_location;		/* probe location */
1471 	uint8_t smbip_status;		/* probe status */
1472 	uint16_t smbip_maxval;		/* maximum current */
1473 	uint16_t smbip_minval;		/* minimum current */
1474 	uint16_t smbip_resolution;	/* probe resolution */
1475 	uint16_t smbip_tolerance;	/* probe tolerance */
1476 	uint16_t smbip_accuracy;	/* probe accuracy */
1477 	uint32_t smbip_oem;		/* vendor-specific data */
1478 	uint16_t smbip_nominal;		/* nominal value */
1479 } smbios_iprobe_t;
1480 
1481 #define	SMB_IPROBE_S_OTHER	0x01	/* other */
1482 #define	SMB_IPROBE_S_UNKNOWN	0x02	/* unknown */
1483 #define	SMB_IPROBE_S_OK		0x03	/* OK */
1484 #define	SMB_IPROBE_S_NONCRIT	0x04	/* non-critical */
1485 #define	SMB_IPROBE_S_CRIT	0x05	/* critical */
1486 #define	SMB_IPROBE_S_NONRECOV	0x06	/* non-recoverable */
1487 
1488 #define	SMB_IPROBE_L_OTHER	0x01	/* other */
1489 #define	SMB_IPROBE_L_UNKNOWN	0x02	/* unknown */
1490 #define	SMB_IPROBE_L_PROC	0x03	/* processor */
1491 #define	SMB_IPROBE_L_DISK	0x04	/* disk */
1492 #define	SMB_IPROBE_L_PBAY	0x05	/* peripheral bay */
1493 #define	SMB_IPROBE_L_MGMT	0x06	/* system management module */
1494 #define	SMB_IPROBE_L_MOBO	0x07	/* motherboard */
1495 #define	SMB_IPROBE_L_MEMMOD	0x08	/* memory module */
1496 #define	SMB_IPROBE_L_PROCMOD	0x09	/* processor module */
1497 #define	SMB_IPROBE_L_POWER	0x0a	/* power unit */
1498 #define	SMB_IPROBE_L_AIC	0x0b	/* add-in card */
1499 
1500 /*
1501  * SMBIOS System Boot Information.  See DSP0134 Section 7.33 for more
1502  * information.  The contents of the data varies by type and is undocumented
1503  * from the perspective of DSP0134 -- it seems to be left as vendor-specific.
1504  * The (D) annotation next to SMB_BOOT_* below indicates possible data payload.
1505  */
1506 typedef struct smbios_boot {
1507 	uint8_t smbt_status;		/* boot status code (see below) */
1508 	const void *smbt_data;		/* data buffer specific to status */
1509 	size_t smbt_size;		/* size of smbt_data buffer in bytes */
1510 } smbios_boot_t;
1511 
1512 #define	SMB_BOOT_NORMAL		0	/* no errors detected */
1513 #define	SMB_BOOT_NOMEDIA	1	/* no bootable media */
1514 #define	SMB_BOOT_OSFAIL		2	/* normal o/s failed to load */
1515 #define	SMB_BOOT_FWHWFAIL	3	/* firmware-detected hardware failure */
1516 #define	SMB_BOOT_OSHWFAIL	4	/* o/s-detected hardware failure */
1517 #define	SMB_BOOT_USERREQ	5	/* user-requested boot (keystroke) */
1518 #define	SMB_BOOT_SECURITY	6	/* system security violation */
1519 #define	SMB_BOOT_PREVREQ	7	/* previously requested image (D) */
1520 #define	SMB_BOOT_WATCHDOG	8	/* watchdog initiated reboot */
1521 #define	SMB_BOOT_RESV_LO	9	/* low end of reserved range */
1522 #define	SMB_BOOT_RESV_HI	127	/* high end of reserved range */
1523 #define	SMB_BOOT_OEM_LO		128	/* low end of OEM-specific range */
1524 #define	SMB_BOOT_OEM_HI		191	/* high end of OEM-specific range */
1525 #define	SMB_BOOT_PROD_LO	192	/* low end of product-specific range */
1526 #define	SMB_BOOT_PROD_HI	255	/* high end of product-specific range */
1527 
1528 /*
1529  * SMBIOS IPMI Device Information.  See DSP0134 Section 7.39 and also
1530  * Appendix C1 of the IPMI specification for more information on this record.
1531  */
1532 typedef struct smbios_ipmi {
1533 	uint_t smbip_type;		/* BMC interface type */
1534 	smbios_version_t smbip_vers;	/* BMC's IPMI specification version */
1535 	uint32_t smbip_i2c;		/* BMC I2C bus slave address */
1536 	uint32_t smbip_bus;		/* bus ID of NV storage device, or -1 */
1537 	uint64_t smbip_addr;		/* BMC base address */
1538 	uint32_t smbip_flags;		/* flags (see below) */
1539 	uint16_t smbip_intr;		/* interrupt number (or zero if none) */
1540 	uint16_t smbip_regspacing;	/* i/o space register spacing (bytes) */
1541 } smbios_ipmi_t;
1542 
1543 #define	SMB_IPMI_T_UNKNOWN	0x00	/* unknown */
1544 #define	SMB_IPMI_T_KCS		0x01	/* KCS: Keyboard Controller Style */
1545 #define	SMB_IPMI_T_SMIC		0x02	/* SMIC: Server Mgmt Interface Chip */
1546 #define	SMB_IPMI_T_BT		0x03	/* BT: Block Transfer */
1547 #define	SMB_IPMI_T_SSIF		0x04	/* SSIF: SMBus System Interface */
1548 
1549 #define	SMB_IPMI_F_IOADDR	0x01	/* base address is in i/o space */
1550 #define	SMB_IPMI_F_INTRSPEC	0x02	/* intr information is specified */
1551 #define	SMB_IPMI_F_INTRHIGH	0x04	/* intr active high (else low) */
1552 #define	SMB_IPMI_F_INTREDGE	0x08	/* intr is edge triggered (else lvl) */
1553 
1554 /*
1555  * SMBIOS System Power Supply Information.  See DSP0134 7.40 for more
1556  * information.
1557  */
1558 typedef struct smbios_powersup {
1559 	uint32_t smbps_group;		/* group ID */
1560 	uint64_t smbps_maxout;		/* max output in milliwatts */
1561 	uint32_t smbps_flags;		/* see below */
1562 	uint8_t smbps_ivrs;		/* input voltage range switching type */
1563 	uint8_t smbps_status;		/* PSU status */
1564 	uint8_t smbps_pstype;		/* PSU type */
1565 	id_t smbps_vprobe;		/* voltage probe handle */
1566 	id_t smbps_cooldev;		/* cooling device handle */
1567 	id_t smbps_iprobe;		/* current probe handle */
1568 } smbios_powersup_t;
1569 
1570 /* smbpfs_flags */
1571 #define	SMB_POWERSUP_F_HOT	0x01	/* PSU is hot-replaceable */
1572 #define	SMB_POWERSUP_F_PRESENT	0x02	/* PSU is present */
1573 #define	SMB_POWERSUP_F_UNPLUG	0x04	/* PSU is unplugged from outlet */
1574 
1575 /* Values for smbps_ivrs */
1576 #define	SMB_POWERSUP_I_OTHER	0x01	/* other */
1577 #define	SMB_POWERSUP_I_UNKNOWN	0x02	/* unknown */
1578 #define	SMB_POWERSUP_I_MANUAL	0x03	/* manual */
1579 #define	SMB_POWERSUP_I_AUTO	0x04	/* auto-switch */
1580 #define	SMB_POWERSUP_I_WIDE	0x05	/* wide range */
1581 #define	SMB_POWERSUP_I_NA	0x06	/* not applicable */
1582 
1583 #define	SMB_POWERSUP_S_OTHER	0x01	/* other */
1584 #define	SMB_POWERSUP_S_UNKNOWN	0x02	/* unknown */
1585 #define	SMB_POWERSUP_S_OK	0x03	/* OK */
1586 #define	SMB_POWERSUP_S_NONCRIT	0x04	/* non-critical */
1587 #define	SMB_POWERSUP_S_CRIT	0x05	/* critical; PSU failed */
1588 
1589 #define	SMB_POWERSUP_T_OTHER	0x01	/* other */
1590 #define	SMB_POWERSUP_T_UNKNOWN	0x02	/* unknown */
1591 #define	SMB_POWERSUP_T_LINEAR	0x03	/* linear */
1592 #define	SMB_POWERSUP_T_SWITCH	0x04	/* switching */
1593 #define	SMB_POWERSUP_T_BAT	0x05	/* battery */
1594 #define	SMB_POWERSUP_T_UPS	0x06	/* UPS */
1595 #define	SMB_POWERSUP_T_CONV	0x07	/* converter */
1596 #define	SMB_POWERSUP_T_REGL	0x08	/* regulator */
1597 
1598 /*
1599  * SMBIOS Onboard Devices Extended Information.  See DSP0134 Section 7.42
1600  * for more information.
1601  */
1602 typedef struct smbios_obdev_ext {
1603 	const char *smboe_name;		/* reference designation */
1604 	uint8_t smboe_dtype;		/* device type */
1605 	uint8_t smboe_dti;		/* device type instance */
1606 	uint16_t smboe_sg;		/* segment group number */
1607 	uint8_t smboe_bus;		/* bus number */
1608 	uint8_t smboe_df;		/* device/function number */
1609 } smbios_obdev_ext_t;
1610 
1611 
1612 /*
1613  * SMBIOS OEM-specific (Type 132) Processor Extended Information.
1614  */
1615 typedef struct smbios_processor_ext {
1616 	uint16_t smbpe_processor;	/* extending processor handle */
1617 	uint8_t smbpe_fru;		/* FRU indicaor */
1618 	uint8_t smbpe_n;		/* number of APIC IDs */
1619 	uint16_t *smbpe_apicid;		/* strand Inital APIC IDs */
1620 } smbios_processor_ext_t;
1621 
1622 /*
1623  * SMBIOS OEM-specific (Type 136) Port Extended Information.
1624  */
1625 typedef struct smbios_port_ext {
1626 	uint16_t smbporte_chassis;	/* chassis handle */
1627 	uint16_t smbporte_port;		/* port connector handle */
1628 	uint8_t smbporte_dtype;		/* device type */
1629 	uint16_t smbporte_devhdl;	/* device handle */
1630 	uint8_t smbporte_phy;		/* PHY number */
1631 } smbios_port_ext_t;
1632 
1633 /*
1634  * SMBIOS OEM-specific (Type 138) PCI-Express RC/RP Information.
1635  */
1636 typedef struct smbios_pciexrc {
1637 	uint16_t smbpcie_bb;		/* base board handle */
1638 	uint16_t smbpcie_bdf;		/* Bus/Dev/Funct (PCI) */
1639 } smbios_pciexrc_t;
1640 
1641 /*
1642  * SMBIOS OEM-specific (Type 144) Memory Array Extended Information.
1643  */
1644 typedef struct smbios_memarray_ext {
1645 	uint16_t smbmae_ma;		/* memory array handle */
1646 	uint16_t smbmae_comp;		/* component parent handle */
1647 	uint16_t smbmae_bdf;		/* Bus/Dev/Funct (PCI) */
1648 } smbios_memarray_ext_t;
1649 
1650 /*
1651  * SMBIOS OEM-specific (Type 145) Memory Device Extended Information.
1652  */
1653 typedef struct smbios_memdevice_ext {
1654 	uint16_t smbmdeve_md;		/* memory device handle */
1655 	uint8_t smbmdeve_drch;		/* DRAM channel */
1656 	uint8_t smbmdeve_ncs;		/* number of chip selects */
1657 	uint8_t *smbmdeve_cs;		/* array of chip select numbers */
1658 } smbios_memdevice_ext_t;
1659 
1660 /*
1661  * SMBIOS Interfaces.  An SMBIOS image can be opened by either providing a file
1662  * pathname, device pathname, file descriptor, or raw memory buffer.  Once an
1663  * image is opened the functions below can be used to iterate over the various
1664  * structures and convert the underlying data representation into the simpler
1665  * data structures described earlier in this header file.  The SMB_VERSION
1666  * constant specified when opening an image indicates the version of the ABI
1667  * the caller expects and the DMTF SMBIOS version the client can understand.
1668  * The library will then map older or newer data structures to that as needed.
1669  */
1670 
1671 #define	SMB_VERSION_23	0x0203		/* SMBIOS encoding for DMTF spec 2.3 */
1672 #define	SMB_VERSION_24	0x0204		/* SMBIOS encoding for DMTF spec 2.4 */
1673 #define	SMB_VERSION_25	0x0205		/* SMBIOS encoding for DMTF spec 2.5 */
1674 #define	SMB_VERSION_26	0x0206		/* SMBIOS encoding for DMTF spec 2.6 */
1675 #define	SMB_VERSION_27	0x0207		/* SMBIOS encoding for DMTF spec 2.7 */
1676 #define	SMB_VERSION_28	0x0208		/* SMBIOS encoding for DMTF spec 2.8 */
1677 #define	SMB_VERSION_30	0x0300		/* SMBIOS encoding for DMTF spec 3.0 */
1678 #define	SMB_VERSION_31	0x0301		/* SMBIOS encoding for DMTF spec 3.1 */
1679 #define	SMB_VERSION_32	0x0302		/* SMBIOS encoding for DMTF spec 3.2 */
1680 #define	SMB_VERSION	SMB_VERSION_32	/* SMBIOS latest version definitions */
1681 
1682 #define	SMB_O_NOCKSUM	0x1		/* do not verify header checksums */
1683 #define	SMB_O_NOVERS	0x2		/* do not verify header versions */
1684 #define	SMB_O_ZIDS	0x4		/* strip out identification numbers */
1685 #define	SMB_O_MASK	0x7		/* mask of valid smbios_*open flags */
1686 
1687 #define	SMB_ID_NOTSUP	0xFFFE		/* structure is not supported by BIOS */
1688 #define	SMB_ID_NONE	0xFFFF		/* structure is a null reference */
1689 
1690 #define	SMB_ERR		(-1)		/* id_t value indicating error */
1691 
1692 typedef struct smbios_hdl smbios_hdl_t;
1693 
1694 typedef struct smbios_struct {
1695 	id_t smbstr_id;			/* structure ID handle */
1696 	uint_t smbstr_type;		/* structure type */
1697 	const void *smbstr_data;	/* structure data */
1698 	size_t smbstr_size;		/* structure size */
1699 } smbios_struct_t;
1700 
1701 typedef int smbios_struct_f(smbios_hdl_t *,
1702     const smbios_struct_t *, void *);
1703 
1704 extern smbios_hdl_t *smbios_open(const char *, int, int, int *);
1705 extern smbios_hdl_t *smbios_fdopen(int, int, int, int *);
1706 extern smbios_hdl_t *smbios_bufopen(const smbios_entry_t *,
1707     const void *, size_t, int, int, int *);
1708 
1709 extern const void *smbios_buf(smbios_hdl_t *);
1710 extern size_t smbios_buflen(smbios_hdl_t *);
1711 
1712 extern void smbios_checksum(smbios_hdl_t *, smbios_entry_t *);
1713 extern int smbios_write(smbios_hdl_t *, int);
1714 extern void smbios_close(smbios_hdl_t *);
1715 
1716 extern boolean_t smbios_truncated(smbios_hdl_t *);
1717 extern int smbios_errno(smbios_hdl_t *);
1718 extern const char *smbios_errmsg(int);
1719 
1720 extern int smbios_lookup_id(smbios_hdl_t *, id_t, smbios_struct_t *);
1721 extern int smbios_lookup_type(smbios_hdl_t *, uint_t, smbios_struct_t *);
1722 extern int smbios_iter(smbios_hdl_t *, smbios_struct_f *, void *);
1723 
1724 extern smbios_entry_point_t smbios_info_smbios(smbios_hdl_t *,
1725     smbios_entry_t *);
1726 extern void smbios_info_smbios_version(smbios_hdl_t *, smbios_version_t *);
1727 extern int smbios_info_common(smbios_hdl_t *, id_t, smbios_info_t *);
1728 extern int smbios_info_contains(smbios_hdl_t *, id_t, uint_t, id_t *);
1729 extern id_t smbios_info_bios(smbios_hdl_t *, smbios_bios_t *);
1730 extern id_t smbios_info_system(smbios_hdl_t *, smbios_system_t *);
1731 extern int smbios_info_bboard(smbios_hdl_t *, id_t, smbios_bboard_t *);
1732 extern int smbios_info_chassis(smbios_hdl_t *, id_t, smbios_chassis_t *);
1733 extern int smbios_info_processor(smbios_hdl_t *, id_t, smbios_processor_t *);
1734 extern int smbios_info_extprocessor(smbios_hdl_t *, id_t,
1735     smbios_processor_ext_t *);
1736 extern int smbios_info_cache(smbios_hdl_t *, id_t, smbios_cache_t *);
1737 extern int smbios_info_port(smbios_hdl_t *, id_t, smbios_port_t *);
1738 extern int smbios_info_extport(smbios_hdl_t *, id_t, smbios_port_ext_t *);
1739 extern int smbios_info_slot(smbios_hdl_t *, id_t, smbios_slot_t *);
1740 extern int smbios_info_slot_peers(smbios_hdl_t *, id_t, uint_t *,
1741     smbios_slot_peer_t **);
1742 extern void smbios_info_slot_peers_free(smbios_hdl_t *, uint_t,
1743     smbios_slot_peer_t *);
1744 extern int smbios_info_obdevs(smbios_hdl_t *, id_t, int, smbios_obdev_t *);
1745 extern int smbios_info_obdevs_ext(smbios_hdl_t *, id_t, smbios_obdev_ext_t *);
1746 extern int smbios_info_strtab(smbios_hdl_t *, id_t, int, const char *[]);
1747 extern id_t smbios_info_lang(smbios_hdl_t *, smbios_lang_t *);
1748 extern id_t smbios_info_eventlog(smbios_hdl_t *, smbios_evlog_t *);
1749 extern int smbios_info_memarray(smbios_hdl_t *, id_t, smbios_memarray_t *);
1750 extern int smbios_info_extmemarray(smbios_hdl_t *, id_t,
1751     smbios_memarray_ext_t *);
1752 extern int smbios_info_memarrmap(smbios_hdl_t *, id_t, smbios_memarrmap_t *);
1753 extern int smbios_info_memdevice(smbios_hdl_t *, id_t, smbios_memdevice_t *);
1754 extern int smbios_info_extmemdevice(smbios_hdl_t *, id_t,
1755     smbios_memdevice_ext_t *);
1756 extern int smbios_info_memdevmap(smbios_hdl_t *, id_t, smbios_memdevmap_t *);
1757 extern id_t smbios_info_hwsec(smbios_hdl_t *, smbios_hwsec_t *);
1758 extern int smbios_info_vprobe(smbios_hdl_t *, id_t, smbios_vprobe_t *);
1759 extern int smbios_info_cooldev(smbios_hdl_t *, id_t, smbios_cooldev_t *);
1760 extern int smbios_info_tprobe(smbios_hdl_t *, id_t, smbios_tprobe_t *);
1761 extern int smbios_info_iprobe(smbios_hdl_t *, id_t, smbios_iprobe_t *);
1762 extern id_t smbios_info_boot(smbios_hdl_t *, smbios_boot_t *);
1763 extern id_t smbios_info_ipmi(smbios_hdl_t *, smbios_ipmi_t *);
1764 extern int smbios_info_powersup(smbios_hdl_t *, id_t, smbios_powersup_t *);
1765 extern int smbios_info_pciexrc(smbios_hdl_t *, id_t, smbios_pciexrc_t *);
1766 
1767 
1768 extern const char *smbios_psn(smbios_hdl_t *);
1769 extern const char *smbios_csn(smbios_hdl_t *);
1770 
1771 #ifndef _KERNEL
1772 /*
1773  * The smbios_*_desc() and smbios_*_name() interfaces can be used for utilities
1774  * such as smbios(1M) that wish to decode SMBIOS fields for humans.  The _desc
1775  * functions return the comment string next to the #defines listed above, and
1776  * the _name functions return the appropriate #define identifier itself.
1777  */
1778 extern const char *smbios_bboard_flag_desc(uint_t);
1779 extern const char *smbios_bboard_flag_name(uint_t);
1780 extern const char *smbios_bboard_type_desc(uint_t);
1781 
1782 extern const char *smbios_bios_flag_desc(uint64_t);
1783 extern const char *smbios_bios_flag_name(uint64_t);
1784 
1785 extern const char *smbios_bios_xb1_desc(uint_t);
1786 extern const char *smbios_bios_xb1_name(uint_t);
1787 extern const char *smbios_bios_xb2_desc(uint_t);
1788 extern const char *smbios_bios_xb2_name(uint_t);
1789 
1790 extern const char *smbios_boot_desc(uint_t);
1791 
1792 extern const char *smbios_cache_assoc_desc(uint_t);
1793 extern const char *smbios_cache_ctype_desc(uint_t);
1794 extern const char *smbios_cache_ctype_name(uint_t);
1795 extern const char *smbios_cache_ecc_desc(uint_t);
1796 extern const char *smbios_cache_flag_desc(uint_t);
1797 extern const char *smbios_cache_flag_name(uint_t);
1798 extern const char *smbios_cache_loc_desc(uint_t);
1799 extern const char *smbios_cache_logical_desc(uint_t);
1800 extern const char *smbios_cache_mode_desc(uint_t);
1801 
1802 extern const char *smbios_chassis_state_desc(uint_t);
1803 extern const char *smbios_chassis_type_desc(uint_t);
1804 
1805 extern const char *smbios_evlog_flag_desc(uint_t);
1806 extern const char *smbios_evlog_flag_name(uint_t);
1807 extern const char *smbios_evlog_format_desc(uint_t);
1808 extern const char *smbios_evlog_method_desc(uint_t);
1809 
1810 extern const char *smbios_vprobe_loc_desc(uint_t);
1811 extern const char *smbios_vprobe_status_desc(uint_t);
1812 
1813 extern const char *smbios_cooldev_status_desc(uint_t);
1814 extern const char *smbios_cooldev_type_desc(uint_t);
1815 
1816 extern const char *smbios_tprobe_loc_desc(uint_t);
1817 extern const char *smbios_tprobe_status_desc(uint_t);
1818 
1819 extern const char *smbios_iprobe_loc_desc(uint_t);
1820 extern const char *smbios_iprobe_status_desc(uint_t);
1821 
1822 extern const char *smbios_ipmi_flag_name(uint_t);
1823 extern const char *smbios_ipmi_flag_desc(uint_t);
1824 extern const char *smbios_ipmi_type_desc(uint_t);
1825 
1826 extern const char *smbios_powersup_flag_name(uint_t);
1827 extern const char *smbios_powersup_flag_desc(uint_t);
1828 extern const char *smbios_powersup_input_desc(uint_t);
1829 extern const char *smbios_powersup_status_desc(uint_t);
1830 extern const char *smbios_powersup_type_desc(uint_t);
1831 
1832 extern const char *smbios_hwsec_desc(uint_t);
1833 
1834 extern const char *smbios_memarray_loc_desc(uint_t);
1835 extern const char *smbios_memarray_use_desc(uint_t);
1836 extern const char *smbios_memarray_ecc_desc(uint_t);
1837 
1838 extern const char *smbios_memdevice_form_desc(uint_t);
1839 extern const char *smbios_memdevice_type_desc(uint_t);
1840 extern const char *smbios_memdevice_flag_name(uint_t);
1841 extern const char *smbios_memdevice_flag_desc(uint_t);
1842 extern const char *smbios_memdevice_rank_desc(uint_t);
1843 extern const char *smbios_memdevice_memtech_desc(uint_t);
1844 extern const char *smbios_memdevice_op_capab_name(uint_t);
1845 extern const char *smbios_memdevice_op_capab_desc(uint_t);
1846 
1847 extern const char *smbios_onboard_type_desc(uint_t);
1848 
1849 extern const char *smbios_port_conn_desc(uint_t);
1850 extern const char *smbios_port_type_desc(uint_t);
1851 
1852 extern const char *smbios_processor_family_desc(uint_t);
1853 extern const char *smbios_processor_status_desc(uint_t);
1854 extern const char *smbios_processor_type_desc(uint_t);
1855 extern const char *smbios_processor_upgrade_desc(uint_t);
1856 extern const char *smbios_processor_core_flag_name(uint_t);
1857 extern const char *smbios_processor_core_flag_desc(uint_t);
1858 
1859 extern const char *smbios_slot_type_desc(uint_t);
1860 extern const char *smbios_slot_width_desc(uint_t);
1861 extern const char *smbios_slot_usage_desc(uint_t);
1862 extern const char *smbios_slot_length_desc(uint_t);
1863 extern const char *smbios_slot_ch1_desc(uint_t);
1864 extern const char *smbios_slot_ch1_name(uint_t);
1865 extern const char *smbios_slot_ch2_desc(uint_t);
1866 extern const char *smbios_slot_ch2_name(uint_t);
1867 
1868 extern const char *smbios_type_desc(uint_t);
1869 extern const char *smbios_type_name(uint_t);
1870 
1871 extern const char *smbios_system_wakeup_desc(uint_t);
1872 #endif /* !_KERNEL */
1873 
1874 #ifdef _KERNEL
1875 /*
1876  * For SMBIOS clients within the kernel itself, ksmbios is used to refer to
1877  * the kernel's current snapshot of the SMBIOS, if one exists, and the
1878  * ksmbios_flags tunable is the set of flags for use with smbios_open().
1879  */
1880 extern smbios_hdl_t *ksmbios;
1881 extern int ksmbios_flags;
1882 #endif /* _KERNEL */
1883 
1884 #ifdef	__cplusplus
1885 }
1886 #endif
1887 
1888 #endif	/* _SYS_SMBIOS_H */
1889