184ab085aSmws /* 284ab085aSmws * CDDL HEADER START 384ab085aSmws * 484ab085aSmws * The contents of this file are subject to the terms of the 5074bb90dSTom Pothier * Common Development and Distribution License (the "License"). 6074bb90dSTom Pothier * You may not use this file except in compliance with the License. 784ab085aSmws * 884ab085aSmws * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 984ab085aSmws * or http://www.opensolaris.org/os/licensing. 1084ab085aSmws * See the License for the specific language governing permissions 1184ab085aSmws * and limitations under the License. 1284ab085aSmws * 1384ab085aSmws * When distributing Covered Code, include this CDDL HEADER in each 1484ab085aSmws * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 1584ab085aSmws * If applicable, add the following below this CDDL HEADER, with the 1684ab085aSmws * fields enclosed by brackets "[]" replaced with your own identifying 1784ab085aSmws * information: Portions Copyright [yyyy] [name of copyright owner] 1884ab085aSmws * 1984ab085aSmws * CDDL HEADER END 2084ab085aSmws */ 2184ab085aSmws 2284ab085aSmws /* 234e901881SDale Ghent * Copyright 2015 OmniTI Computer Consulting, Inc. All rights reserved. 241566bc34SRobert Mustacchi * Copyright (c) 2018, Joyent, Inc. 25*064d431aSRobert Mustacchi * Copyright 2024 Oxide Computer Company 2603f9f63dSTom Pothier * Copyright 2010 Sun Microsystems, Inc. All rights reserved. 2784ab085aSmws * Use is subject to license terms. 2884ab085aSmws */ 2984ab085aSmws 3084ab085aSmws /* 3184ab085aSmws * This header file defines the implementation structures for the SMBIOS access 3284ab085aSmws * library, libsmbios, and an equivalent kernel module. Clients should use 3384ab085aSmws * the <smbios.h> or <sys/smbios.h> header files to access DMTF SMBIOS 3484ab085aSmws * information, NOT these underlying implementation structures from the spec. 3584ab085aSmws * In short, do not user this header file or these routines for any purpose. 3684ab085aSmws */ 3784ab085aSmws 3884ab085aSmws #ifndef _SYS_SMBIOS_IMPL_H 3984ab085aSmws #define _SYS_SMBIOS_IMPL_H 4084ab085aSmws 4184ab085aSmws #include <sys/smbios.h> 4284ab085aSmws #include <sys/sysmacros.h> 4384ab085aSmws 4484ab085aSmws #ifdef _KERNEL 4584ab085aSmws #include <sys/systm.h> 4684ab085aSmws #else 4784ab085aSmws #include <strings.h> 4884ab085aSmws #include <stddef.h> 4984ab085aSmws #endif 5084ab085aSmws 5184ab085aSmws #ifdef __cplusplus 5284ab085aSmws extern "C" { 5384ab085aSmws #endif 5484ab085aSmws 55e5cce96fSRobert Mustacchi /* 56e5cce96fSRobert Mustacchi * Definitions required to interpret the BIOS type information. 57e5cce96fSRobert Mustacchi */ 58e5cce96fSRobert Mustacchi #define SMB_BIOSXB_EXTROM 6 59e5cce96fSRobert Mustacchi 60e5cce96fSRobert Mustacchi #define SMB_BIOS_EXTROM_VALUE_MASK(x) ((x) & 0x3fff) 61e5cce96fSRobert Mustacchi #define SMB_BIOS_EXTROM_SHIFT_MASK(x) (((x) & 0xc000) >> 14) 62e5cce96fSRobert Mustacchi 6384ab085aSmws #pragma pack(1) 6484ab085aSmws 6584ab085aSmws typedef struct smb_header { 6684ab085aSmws uint8_t smbh_type; /* structure type (SMB_TYPE_* value) */ 6784ab085aSmws uint8_t smbh_len; /* length in bytes of formatted area */ 6884ab085aSmws uint16_t smbh_hdl; /* structure handle */ 6984ab085aSmws } smb_header_t; 7084ab085aSmws 71f44a1392SRobert Mustacchi /* 72f44a1392SRobert Mustacchi * SMBIOS implementation structure for SMB_TYPE_BIOS. 73f44a1392SRobert Mustacchi */ 7484ab085aSmws typedef struct smb_bios { 7584ab085aSmws smb_header_t smbbi_hdr; /* structure header */ 7684ab085aSmws uint8_t smbbi_vendor; /* bios vendor string */ 7784ab085aSmws uint8_t smbbi_version; /* bios version string */ 7884ab085aSmws uint16_t smbbi_segment; /* segment location of bios address */ 7984ab085aSmws uint8_t smbbi_reldate; /* bios release date */ 8084ab085aSmws uint8_t smbbi_romsize; /* bios rom size (64k * (n + 1)) */ 8184ab085aSmws uint64_t smbbi_cflags; /* bios characteristics */ 8284ab085aSmws uint8_t smbbi_xcflags[1]; /* bios characteristics extensions */ 8384ab085aSmws } smb_bios_t; 8484ab085aSmws 85f44a1392SRobert Mustacchi /* 86f44a1392SRobert Mustacchi * SMBIOS implementation structure for SMB_TYPE_SYSTEM. 87f44a1392SRobert Mustacchi */ 8884ab085aSmws typedef struct smb_system { 8984ab085aSmws smb_header_t smbsi_hdr; /* structure header */ 9084ab085aSmws uint8_t smbsi_manufacturer; /* manufacturer */ 9184ab085aSmws uint8_t smbsi_product; /* product name */ 9284ab085aSmws uint8_t smbsi_version; /* version */ 9384ab085aSmws uint8_t smbsi_serial; /* serial number */ 9484ab085aSmws uint8_t smbsi_uuid[16]; /* UUID */ 9584ab085aSmws uint8_t smbsi_wakeup; /* wake-up type */ 9684ab085aSmws uint8_t smbsi_sku; /* SKU number */ 9784ab085aSmws uint8_t smbsi_family; /* family */ 9884ab085aSmws } smb_system_t; 9984ab085aSmws 100f44a1392SRobert Mustacchi /* 101f44a1392SRobert Mustacchi * SMBIOS implementation structure for SMB_TYPE_BASEBOARD. 102f44a1392SRobert Mustacchi */ 10384ab085aSmws typedef struct smb_bboard { 10484ab085aSmws smb_header_t smbbb_hdr; /* structure header */ 10584ab085aSmws uint8_t smbbb_manufacturer; /* manufacturer */ 10684ab085aSmws uint8_t smbbb_product; /* product name */ 10784ab085aSmws uint8_t smbbb_version; /* version */ 10884ab085aSmws uint8_t smbbb_serial; /* serial number */ 10984ab085aSmws uint8_t smbbb_asset; /* asset tag */ 11084ab085aSmws uint8_t smbbb_flags; /* feature flags */ 11184ab085aSmws uint8_t smbbb_location; /* location in chassis */ 11284ab085aSmws uint16_t smbbb_chassis; /* chassis handle */ 11384ab085aSmws uint8_t smbbb_type; /* board type */ 11484ab085aSmws uint8_t smbbb_cn; /* number of contained handles */ 11584ab085aSmws uint16_t smbbb_cv[1]; /* array of contained handles */ 11684ab085aSmws } smb_bboard_t; 11784ab085aSmws 118f44a1392SRobert Mustacchi /* 119f44a1392SRobert Mustacchi * SMBIOS implementation structure for SMB_TYPE_CHASSIS. 120f44a1392SRobert Mustacchi */ 12184ab085aSmws typedef struct smb_chassis { 12284ab085aSmws smb_header_t smbch_hdr; /* structure header */ 12384ab085aSmws uint8_t smbch_manufacturer; /* manufacturer */ 12484ab085aSmws uint8_t smbch_type; /* type */ 12584ab085aSmws uint8_t smbch_version; /* version */ 12684ab085aSmws uint8_t smbch_serial; /* serial number */ 12784ab085aSmws uint8_t smbch_asset; /* asset tag */ 12884ab085aSmws uint8_t smbch_bustate; /* boot-up state */ 12984ab085aSmws uint8_t smbch_psstate; /* power supply state */ 13084ab085aSmws uint8_t smbch_thstate; /* thermal state */ 13184ab085aSmws uint8_t smbch_security; /* security state */ 13284ab085aSmws uint32_t smbch_oemdata; /* OEM-specific data */ 13384ab085aSmws uint8_t smbch_uheight; /* enclosure height */ 13484ab085aSmws uint8_t smbch_cords; /* number of power cords */ 13584ab085aSmws uint8_t smbch_cn; /* number of contained records */ 13684ab085aSmws uint8_t smbch_cm; /* size of contained records */ 137d53cdfabSRobert Mustacchi uint8_t smbch_cv[]; /* array of contained records */ 13884ab085aSmws } smb_chassis_t; 13984ab085aSmws 14084ab085aSmws #define SMB_CHT_LOCK 0x80 /* lock bit within smbch_type */ 14184ab085aSmws 142d53cdfabSRobert Mustacchi typedef struct smb_chassis_entry { 143d53cdfabSRobert Mustacchi uint8_t smbce_type; /* Containing Element and Type */ 144d53cdfabSRobert Mustacchi uint8_t smbce_min; /* minimum number of elt */ 145d53cdfabSRobert Mustacchi uint8_t smbce_max; /* minimum number of elt */ 146d53cdfabSRobert Mustacchi } smb_chassis_entry_t; 147d53cdfabSRobert Mustacchi 148d53cdfabSRobert Mustacchi #define SMB_CHE_TYPE_IS_SMB(x) (((x) & 0x80) == 0x80) 149d53cdfabSRobert Mustacchi #define SMB_CHE_TYPE_TYPE(x) (((x) & 0x7f)) 150d53cdfabSRobert Mustacchi 151f44a1392SRobert Mustacchi /* 152f44a1392SRobert Mustacchi * SMBIOS implementation structure for SMB_TYPE_PROCESSOR. 153f44a1392SRobert Mustacchi */ 15484ab085aSmws typedef struct smb_processor { 15584ab085aSmws smb_header_t smbpr_hdr; /* structure header */ 15684ab085aSmws uint8_t smbpr_socket; /* socket designation */ 15784ab085aSmws uint8_t smbpr_type; /* processor type (see <smbios.h>) */ 15884ab085aSmws uint8_t smbpr_family; /* processor family (see <smbios.h>) */ 15984ab085aSmws uint8_t smbpr_manufacturer; /* manufacturer */ 16084ab085aSmws uint64_t smbpr_cpuid; /* processor cpuid information */ 16184ab085aSmws uint8_t smbpr_version; /* version */ 16284ab085aSmws uint8_t smbpr_voltage; /* voltage */ 16384ab085aSmws uint16_t smbpr_clkspeed; /* external clock speed in MHz */ 16484ab085aSmws uint16_t smbpr_maxspeed; /* maximum speed in MHz */ 16584ab085aSmws uint16_t smbpr_curspeed; /* current speed in MHz */ 16684ab085aSmws uint8_t smbpr_status; /* status (see <smbios.h>) */ 16784ab085aSmws uint8_t smbpr_upgrade; /* upgrade */ 16884ab085aSmws uint16_t smbpr_l1cache; /* L1 cache handle (if any) */ 16984ab085aSmws uint16_t smbpr_l2cache; /* L2 cache handle (if any) */ 17084ab085aSmws uint16_t smbpr_l3cache; /* L3 cache handle (if any) */ 17184ab085aSmws uint8_t smbpr_serial; /* serial number */ 17284ab085aSmws uint8_t smbpr_asset; /* asset tag */ 17384ab085aSmws uint8_t smbpr_part; /* part number */ 1744e901881SDale Ghent uint8_t smbpr_corecount; /* number of cores per socket */ 1754e901881SDale Ghent uint8_t smbpr_coresenabled; /* number of enabled cores per socket */ 1764e901881SDale Ghent uint8_t smbpr_threadcount; /* number of threads per socket */ 1774e901881SDale Ghent uint16_t smbpr_cflags; /* cpu characteristics (see <smbios.h>) */ 1784e901881SDale Ghent uint16_t smbpr_family2; /* processor family2 (see <smbios.h>) */ 1796734c4b0SRobert Mustacchi uint16_t smbpr_corecount2; /* second number of cores per socket */ 1806734c4b0SRobert Mustacchi uint16_t smbpr_coresenabled2; /* second number of enabled cores */ 1816734c4b0SRobert Mustacchi uint16_t smbpr_threadcount2; /* second number of enabled threads */ 1821d1fc316SRobert Mustacchi uint16_t smpbr_threaden; /* enabled thread count */ 18384ab085aSmws } smb_processor_t; 18484ab085aSmws 185f44a1392SRobert Mustacchi /* 186f44a1392SRobert Mustacchi * SMBIOS implementation structure for SMB_TYPE_CACHE. 187f44a1392SRobert Mustacchi */ 18884ab085aSmws typedef struct smb_cache { 18984ab085aSmws smb_header_t smbca_hdr; /* structure header */ 19084ab085aSmws uint8_t smbca_socket; /* socket designation */ 19184ab085aSmws uint16_t smbca_config; /* cache configuration */ 19284ab085aSmws uint16_t smbca_maxsize; /* maximum installed size */ 19384ab085aSmws uint16_t smbca_size; /* installed size */ 19484ab085aSmws uint16_t smbca_stype; /* supported SRAM type */ 19584ab085aSmws uint16_t smbca_ctype; /* current SRAM type */ 19684ab085aSmws uint8_t smbca_speed; /* speed in nanoseconds */ 19784ab085aSmws uint8_t smbca_etype; /* error correction type */ 19884ab085aSmws uint8_t smbca_ltype; /* logical cache type */ 19984ab085aSmws uint8_t smbca_assoc; /* associativity */ 200e5cce96fSRobert Mustacchi uint32_t smbca_maxsize2; /* maximum installed size 2 */ 201e5cce96fSRobert Mustacchi uint32_t smbca_size2; /* installed size 2 */ 20284ab085aSmws } smb_cache_t; 20384ab085aSmws 204e4586ebfSmws /* 2054e901881SDale Ghent * Convert encoded cache size to bytes: DSP0134 Section 7.8 explains the 206e4586ebfSmws * encoding. The highest bit is 0 for 1k units, 1 for 64k units, and this 207e4586ebfSmws * macro decodes the value into bytes for exporting to our clients. 208e4586ebfSmws */ 209e4586ebfSmws #define SMB_CACHE_SIZE(s) (((s) & 0x8000) ? \ 210e4586ebfSmws ((uint32_t)((s) & 0x7FFF) * 64 * 1024) : ((uint32_t)(s) * 1024)) 21184ab085aSmws 2121566bc34SRobert Mustacchi #define SMB_CACHE_EXT_SIZE(s) (((s) & 0x80000000U) ? \ 2131566bc34SRobert Mustacchi ((uint64_t)((s) & 0x7FFFFFFFULL) * 64ULL * 1024ULL) : \ 214e5cce96fSRobert Mustacchi ((uint64_t)(s) * 1024ULL)) 215e5cce96fSRobert Mustacchi 21684ab085aSmws #define SMB_CACHE_CFG_MODE(c) (((c) >> 8) & 3) 21784ab085aSmws #define SMB_CACHE_CFG_ENABLED(c) (((c) >> 7) & 1) 21884ab085aSmws #define SMB_CACHE_CFG_LOCATION(c) (((c) >> 5) & 3) 21984ab085aSmws #define SMB_CACHE_CFG_SOCKETED(c) (((c) >> 3) & 1) 22084ab085aSmws #define SMB_CACHE_CFG_LEVEL(c) (((c) & 7) + 1) 22184ab085aSmws 222f44a1392SRobert Mustacchi /* 223f44a1392SRobert Mustacchi * SMBIOS implementation structure for SMB_TYPE_PORT. 224f44a1392SRobert Mustacchi */ 22584ab085aSmws typedef struct smb_port { 22684ab085aSmws smb_header_t smbpo_hdr; /* structure header */ 22784ab085aSmws uint8_t smbpo_iref; /* internal reference designator */ 22884ab085aSmws uint8_t smbpo_itype; /* internal connector type */ 22984ab085aSmws uint8_t smbpo_eref; /* external reference designator */ 23084ab085aSmws uint8_t smbpo_etype; /* external connector type */ 23184ab085aSmws uint8_t smbpo_ptype; /* port type */ 23284ab085aSmws } smb_port_t; 23384ab085aSmws 234f44a1392SRobert Mustacchi /* 235f44a1392SRobert Mustacchi * SMBIOS implementation structure for SMB_TYPE_SLOT. 236f44a1392SRobert Mustacchi */ 2371566bc34SRobert Mustacchi typedef struct smb_slot_peer { 2381566bc34SRobert Mustacchi uint16_t smbspb_group_no; /* segment group number */ 2391566bc34SRobert Mustacchi uint8_t smbspb_bus; /* bus number */ 2401566bc34SRobert Mustacchi uint8_t smbspb_df; /* device/function number */ 2411566bc34SRobert Mustacchi uint8_t smbspb_width; /* electrical width */ 2421566bc34SRobert Mustacchi } smb_slot_peer_t; 2431566bc34SRobert Mustacchi 24484ab085aSmws typedef struct smb_slot { 24584ab085aSmws smb_header_t smbsl_hdr; /* structure header */ 24684ab085aSmws uint8_t smbsl_name; /* reference designation */ 24784ab085aSmws uint8_t smbsl_type; /* slot type */ 24884ab085aSmws uint8_t smbsl_width; /* slot data bus width */ 24984ab085aSmws uint8_t smbsl_usage; /* current usage */ 25084ab085aSmws uint8_t smbsl_length; /* slot length */ 25184ab085aSmws uint16_t smbsl_id; /* slot ID */ 25284ab085aSmws uint8_t smbsl_ch1; /* slot characteristics 1 */ 25384ab085aSmws uint8_t smbsl_ch2; /* slot characteristics 2 */ 25403f9f63dSTom Pothier uint16_t smbsl_sg; /* segment group number */ 25503f9f63dSTom Pothier uint8_t smbsl_bus; /* bus number */ 25603f9f63dSTom Pothier uint8_t smbsl_df; /* device/function number */ 2571566bc34SRobert Mustacchi /* Added in SMBIOS 3.2+ */ 2581566bc34SRobert Mustacchi uint8_t smbsl_dbw; /* Data bus width */ 2591566bc34SRobert Mustacchi uint8_t smbsl_npeers; /* Peer bdf groups */ 2601566bc34SRobert Mustacchi smb_slot_peer_t smbsl_peers[]; /* bifurcation peers */ 261c6795799SRobert Mustacchi /* There are later additions in 3.4+, see smbios_slot_cont_t */ 26284ab085aSmws } smb_slot_t; 26384ab085aSmws 264c6795799SRobert Mustacchi /* 265c6795799SRobert Mustacchi * After the variable number of smbsl_peers, the smbios_slot has continued in 266c6795799SRobert Mustacchi * size and has the following members defined as of version 3.4. These occur 267c6795799SRobert Mustacchi * starting at byte 14 + 5 * smbsl_npeers. 268c6795799SRobert Mustacchi */ 269c6795799SRobert Mustacchi typedef struct smb_slot_cont { 270c6795799SRobert Mustacchi uint8_t smbsl_info; /* slot info */ 271c6795799SRobert Mustacchi uint8_t smbsl_pwidth; /* slot physical width */ 272c6795799SRobert Mustacchi uint16_t smbsl_pitch; /* slot pitch */ 273d53cdfabSRobert Mustacchi /* Added in SMBIOS 3.5 */ 274d53cdfabSRobert Mustacchi uint8_t smbsl_height; /* slot height */ 275c6795799SRobert Mustacchi } smb_slot_cont_t; 276c6795799SRobert Mustacchi 277c6795799SRobert Mustacchi /* 278d53cdfabSRobert Mustacchi * The first byte that the smb_slot_cont_t is defined to start at. Note, this 279d53cdfabSRobert Mustacchi * was originally indicated to be 0x14 in the SMBIOS 3.4 specification. This has 280d53cdfabSRobert Mustacchi * been noted as an errata. Right now we assume that most things have the 281d53cdfabSRobert Mustacchi * updated behavior in SMBIOS 3.5. However, if we encounter things in the wild 282d53cdfabSRobert Mustacchi * that have the other offset then we will need to condition this on 3.4. 283c6795799SRobert Mustacchi */ 284d53cdfabSRobert Mustacchi #define SMB_SLOT_CONT_START 0x13 285c6795799SRobert Mustacchi 286f44a1392SRobert Mustacchi /* 287f44a1392SRobert Mustacchi * SMBIOS implementation structure for SMB_TYPE_OBDEVS. 288f44a1392SRobert Mustacchi */ 28984ab085aSmws typedef struct smb_obdev { 29084ab085aSmws uint8_t smbob_type; /* encoded type and enable bit */ 2914e901881SDale Ghent uint8_t smbob_name; /* description string */ 29284ab085aSmws } smb_obdev_t; 29384ab085aSmws 29484ab085aSmws #define SMB_OBT_ENABLED 0x80 /* enable bit within smbob_type */ 29584ab085aSmws 296f44a1392SRobert Mustacchi /* 297f44a1392SRobert Mustacchi * SMBIOS implementation structure for SMB_TYPE_OEMSTR, SMB_TYPE_SYSCONFSTR, 298f44a1392SRobert Mustacchi * and SMB_TYPE_LANG. 299f44a1392SRobert Mustacchi */ 30084ab085aSmws typedef struct smb_strtab { 30184ab085aSmws smb_header_t smbtb_hdr; /* structure header */ 30284ab085aSmws uint8_t smbtb_count; /* number of strings */ 30384ab085aSmws } smb_strtab_t; 30484ab085aSmws 305f44a1392SRobert Mustacchi /* 306f44a1392SRobert Mustacchi * SMBIOS implementation structure for SMB_TYPE_LANG. 307f44a1392SRobert Mustacchi */ 30884ab085aSmws typedef struct smb_lang { 30984ab085aSmws smb_header_t smblang_hdr; /* structure header */ 31084ab085aSmws uint8_t smblang_num; /* number of installed languages */ 31184ab085aSmws uint8_t smblang_flags; /* flags */ 31284ab085aSmws uint8_t smblang_resv[15]; /* reserved for future use */ 31384ab085aSmws uint8_t smblang_cur; /* current language string */ 31484ab085aSmws } smb_lang_t; 31584ab085aSmws 316f44a1392SRobert Mustacchi /* 317f44a1392SRobert Mustacchi * SMBIOS implementation structure for SMB_TYPE_EVENTLOG. 318f44a1392SRobert Mustacchi */ 31984ab085aSmws typedef struct smb_sel { 32084ab085aSmws smb_header_t smbsel_hdr; /* structure header */ 32184ab085aSmws uint16_t smbsel_len; /* log area length */ 32284ab085aSmws uint16_t smbsel_hdroff; /* header offset */ 32384ab085aSmws uint16_t smbsel_dataoff; /* data offset */ 32484ab085aSmws uint8_t smbsel_method; /* access method */ 32584ab085aSmws uint8_t smbsel_status; /* status flags */ 32684ab085aSmws uint32_t smbsel_token; /* change token */ 32784ab085aSmws uint32_t smbsel_addr; /* access method address */ 32884ab085aSmws uint8_t smbsel_format; /* header format */ 32984ab085aSmws uint8_t smbsel_typec; /* number of type descriptors */ 33084ab085aSmws uint8_t smbsel_typesz; /* size of each type descriptor */ 33184ab085aSmws uint8_t smbsel_typev[1]; /* array of type descriptors */ 33284ab085aSmws } smb_sel_t; 33384ab085aSmws 334f44a1392SRobert Mustacchi /* 335f44a1392SRobert Mustacchi * SMBIOS implementation structure for SMB_TYPE_MEMARRAY. 336f44a1392SRobert Mustacchi */ 33784ab085aSmws typedef struct smb_memarray { 33884ab085aSmws smb_header_t smbmarr_hdr; /* structure header */ 33984ab085aSmws uint8_t smbmarr_loc; /* location */ 34084ab085aSmws uint8_t smbmarr_use; /* use */ 34184ab085aSmws uint8_t smbmarr_ecc; /* error detect/correct mechanism */ 34284ab085aSmws uint32_t smbmarr_cap; /* maximum capacity */ 34384ab085aSmws uint16_t smbmarr_err; /* error handle */ 34484ab085aSmws uint16_t smbmarr_ndevs; /* number of slots or sockets */ 3454e901881SDale Ghent uint64_t smbmarr_extcap; /* extended maximum capacity */ 34684ab085aSmws } smb_memarray_t; 34784ab085aSmws 348f44a1392SRobert Mustacchi /* 349f44a1392SRobert Mustacchi * SMBIOS implementation structure for SMB_TYPE_MEMARRAYMAP. 350f44a1392SRobert Mustacchi */ 35184ab085aSmws typedef struct smb_memarrmap { 35284ab085aSmws smb_header_t smbamap_hdr; /* structure header */ 35384ab085aSmws uint32_t smbamap_start; /* starting address in kilobytes */ 35484ab085aSmws uint32_t smbamap_end; /* ending address in kilobytes */ 35584ab085aSmws uint16_t smbamap_array; /* physical memory array handle */ 35684ab085aSmws uint8_t smbamap_width; /* partition width */ 3574e901881SDale Ghent uint64_t smbamap_extstart; /* extended starting address in bytes */ 3584e901881SDale Ghent uint64_t smbamap_extend; /* extended ending address in bytes */ 35984ab085aSmws } smb_memarrmap_t; 36084ab085aSmws 361f44a1392SRobert Mustacchi /* 362f44a1392SRobert Mustacchi * SMBIOS implementation structure for SMB_TYPE_MEMDEVICE. 363f44a1392SRobert Mustacchi */ 36484ab085aSmws typedef struct smb_memdevice { 36584ab085aSmws smb_header_t smbmdev_hdr; /* structure header */ 36684ab085aSmws uint16_t smbmdev_array; /* array handle */ 36784ab085aSmws uint16_t smbmdev_error; /* error handle */ 36884ab085aSmws uint16_t smbmdev_twidth; /* total width */ 36984ab085aSmws uint16_t smbmdev_dwidth; /* data width */ 37084ab085aSmws uint16_t smbmdev_size; /* size in either K or MB */ 37184ab085aSmws uint8_t smbmdev_form; /* form factor */ 37284ab085aSmws uint8_t smbmdev_set; /* device set */ 37384ab085aSmws uint8_t smbmdev_dloc; /* device locator */ 37484ab085aSmws uint8_t smbmdev_bloc; /* bank locator */ 37584ab085aSmws uint8_t smbmdev_type; /* memory type */ 37684ab085aSmws uint16_t smbmdev_flags; /* detail flags */ 377e5cce96fSRobert Mustacchi uint16_t smbmdev_speed; /* speed in MT/s */ 37884ab085aSmws uint8_t smbmdev_manufacturer; /* manufacturer */ 37984ab085aSmws uint8_t smbmdev_serial; /* serial number */ 38084ab085aSmws uint8_t smbmdev_asset; /* asset tag */ 38184ab085aSmws uint8_t smbmdev_part; /* part number */ 3824e901881SDale Ghent uint8_t smbmdev_attrs; /* attributes */ 3834e901881SDale Ghent uint32_t smbmdev_extsize; /* extended size */ 3844e901881SDale Ghent uint16_t smbmdev_clkspeed; /* configured clock speed */ 3854e901881SDale Ghent uint16_t smbmdev_minvolt; /* minimum voltage */ 3864e901881SDale Ghent uint16_t smbmdev_maxvolt; /* maximum voltage */ 3874e901881SDale Ghent uint16_t smbmdev_confvolt; /* configured voltage */ 3881566bc34SRobert Mustacchi /* Added in SMBIOS 3.2 */ 3891566bc34SRobert Mustacchi uint8_t smbmdev_memtech; /* memory technology */ 3901566bc34SRobert Mustacchi uint16_t smbmdev_opmode; /* memory operating mode capability */ 3911566bc34SRobert Mustacchi uint8_t smbmdev_fwver; /* firmware version */ 3921566bc34SRobert Mustacchi uint16_t smbmdev_modulemfgid; /* module manufacturer ID */ 3931566bc34SRobert Mustacchi uint16_t smbmdev_moduleprodid; /* module product ID */ 3941566bc34SRobert Mustacchi uint16_t smbmdev_memsysmfgid; /* memory controller manufacturer id */ 3951566bc34SRobert Mustacchi uint16_t smbmdev_memsysprodid; /* memory controller product id */ 3961566bc34SRobert Mustacchi uint64_t smbmdev_nvsize; /* non-volatile memory size */ 3971566bc34SRobert Mustacchi uint64_t smbmdev_volsize; /* volatile memory size */ 3981566bc34SRobert Mustacchi uint64_t smbmdev_cachesize; /* cache size */ 3991566bc34SRobert Mustacchi uint64_t smbmdev_logicalsize; /* logical size */ 400176a9270SRobert Mustacchi /* Added in SMBIOS 3.3 */ 401176a9270SRobert Mustacchi uint32_t smbmdev_extspeed; /* Extended device speed */ 402176a9270SRobert Mustacchi uint32_t smbmdev_extclkspeed; /* Extended clock speed */ 4036bc074b1SRobert Mustacchi /* Added in SMBIOS 3.7 */ 4046bc074b1SRobert Mustacchi uint16_t smbmdev_pmic0mfgid; /* PMIC0 Manufacturer ID */ 4056bc074b1SRobert Mustacchi uint16_t smbmdev_pmic0rev; /* PMIC0 Revision */ 4066bc074b1SRobert Mustacchi uint16_t smbmdev_rcdmfgid; /* RCD Manufacturer ID */ 4076bc074b1SRobert Mustacchi uint16_t smbmdev_rcdrev; /* RCD Revision */ 40884ab085aSmws } smb_memdevice_t; 40984ab085aSmws 41084ab085aSmws #define SMB_MDS_KBYTES 0x8000 /* size in specified in kilobytes */ 41184ab085aSmws 412f44a1392SRobert Mustacchi /* 413f44a1392SRobert Mustacchi * SMBIOS implementation structure for SMB_TYPE_MEMDEVICEMAP. 414f44a1392SRobert Mustacchi */ 41584ab085aSmws typedef struct smb_memdevmap { 41684ab085aSmws smb_header_t smbdmap_hdr; /* structure header */ 41784ab085aSmws uint32_t smbdmap_start; /* starting address in kilobytes */ 41884ab085aSmws uint32_t smbdmap_end; /* ending address in kilobytes */ 41984ab085aSmws uint16_t smbdmap_device; /* memory device handle */ 42084ab085aSmws uint16_t smbdmap_array; /* memory array mapped address handle */ 42184ab085aSmws uint8_t smbdmap_rpos; /* row position */ 42284ab085aSmws uint8_t smbdmap_ipos; /* interleave position */ 42384ab085aSmws uint8_t smbdmap_idepth; /* interleave depth */ 4244e901881SDale Ghent uint64_t smbdmap_extstart; /* extended starting address */ 4254e901881SDale Ghent uint64_t smbdmap_extend; /* extended ending address */ 42684ab085aSmws } smb_memdevmap_t; 42784ab085aSmws 4281d77dcdaSRobert Mustacchi typedef struct smb_pointdev { 4291d77dcdaSRobert Mustacchi smb_header_t smbpdev_hdr; /* structure header */ 4301d77dcdaSRobert Mustacchi uint8_t smbpdev_type; /* device type */ 4311d77dcdaSRobert Mustacchi uint8_t smbpdev_iface; /* device interface */ 4321d77dcdaSRobert Mustacchi uint8_t smbpdev_nbuttons; /* number of buttons */ 4331d77dcdaSRobert Mustacchi } smb_pointdev_t; 4341d77dcdaSRobert Mustacchi 435f44a1392SRobert Mustacchi /* 436f44a1392SRobert Mustacchi * SMBIOS implementation structure for SMB_TYPE_BATTERY. 437f44a1392SRobert Mustacchi */ 43884ab085aSmws typedef struct smb_battery { 43984ab085aSmws smb_header_t smbbat_hdr; /* structure header */ 44084ab085aSmws uint8_t smbbat_loc; /* location */ 44184ab085aSmws uint8_t smbbat_manufacturer; /* manufacturer */ 44284ab085aSmws uint8_t smbbat_date; /* manufacture date */ 44384ab085aSmws uint8_t smbbat_serial; /* serial number */ 44484ab085aSmws uint8_t smbbat_devname; /* device name */ 44584ab085aSmws uint8_t smbbat_chem; /* device chemistry */ 44684ab085aSmws uint16_t smbbat_cap; /* design capacity in mW hours */ 44784ab085aSmws uint16_t smbbat_volt; /* design voltage in mV */ 44884ab085aSmws uint8_t smbbat_version; /* SBDS version string */ 44984ab085aSmws uint8_t smbbat_err; /* error percentage */ 45084ab085aSmws uint16_t smbbat_ssn; /* SBDS serial number */ 45184ab085aSmws uint16_t smbbat_sdate; /* SBDS manufacture date */ 45284ab085aSmws uint8_t smbbat_schem; /* SBDS chemistry string */ 45384ab085aSmws uint8_t smbbat_mult; /* design capacity multiplier */ 45484ab085aSmws uint32_t smbbat_oemdata; /* OEM-specific data */ 45584ab085aSmws } smb_battery_t; 45684ab085aSmws 457f44a1392SRobert Mustacchi /* 458f44a1392SRobert Mustacchi * SMBIOS implementation structure for SMB_TYPE_SECURITY. 459f44a1392SRobert Mustacchi */ 46084ab085aSmws typedef struct smb_hwsec { 46184ab085aSmws smb_header_t smbhs_hdr; /* structure header */ 46284ab085aSmws uint8_t smbhs_settings; /* settings byte */ 46384ab085aSmws } smb_hwsec_t; 46484ab085aSmws 46584ab085aSmws #define SMB_HWS_PWR_PS(x) (((x) & 0xC0) >> 6) 46684ab085aSmws #define SMB_HWS_KBD_PS(x) (((x) & 0x30) >> 4) 46784ab085aSmws #define SMB_HWS_ADM_PS(x) (((x) & 0x0C) >> 2) 46884ab085aSmws #define SMB_HWS_PAN_PS(x) (((x) & 0x03) >> 0) 46984ab085aSmws 470f44a1392SRobert Mustacchi /* 471f44a1392SRobert Mustacchi * SMBIOS implementation structure for SMB_TYPE_VPROBE. 472f44a1392SRobert Mustacchi */ 473f44a1392SRobert Mustacchi typedef struct smb_vprobe { 474f44a1392SRobert Mustacchi smb_header_t smbvpr_hdr; /* structure header */ 475f44a1392SRobert Mustacchi uint8_t smbvpr_descr; /* description string */ 476f44a1392SRobert Mustacchi uint8_t smbvpr_locstat; /* location and status */ 477f44a1392SRobert Mustacchi uint16_t smbvpr_maxval; /* maximum voltage */ 478f44a1392SRobert Mustacchi uint16_t smbvpr_minval; /* minimum voltage */ 479f44a1392SRobert Mustacchi uint16_t smbvpr_resolution; /* probe resolution */ 480f44a1392SRobert Mustacchi uint16_t smbvpr_tolerance; /* probe tolerance */ 481f44a1392SRobert Mustacchi uint16_t smbvpr_accuracy; /* probe accuracy */ 482f44a1392SRobert Mustacchi uint32_t smbvpr_oem; /* vendor-specific data */ 483f44a1392SRobert Mustacchi uint16_t smbvpr_nominal; /* nominal value */ 484f44a1392SRobert Mustacchi } smb_vprobe_t; 485f44a1392SRobert Mustacchi 486f44a1392SRobert Mustacchi #define SMB_VPROBE_MINLEN 0x14 487f44a1392SRobert Mustacchi #define SMB_VPROBE_NOMINAL_MINLEN 0x16 488f44a1392SRobert Mustacchi 489f44a1392SRobert Mustacchi #define SMB_VPROBE_LOCATION(x) ((x) & 0x1f) 490f44a1392SRobert Mustacchi #define SMB_VPROBE_STATUS(x) (((x) >> 5) & 0x7) 491f44a1392SRobert Mustacchi 492f44a1392SRobert Mustacchi /* 493f44a1392SRobert Mustacchi * SMBIOS implementation structure for SMB_TYPE_COOLDEV. 494f44a1392SRobert Mustacchi */ 495f44a1392SRobert Mustacchi typedef struct smb_cooldev { 496f44a1392SRobert Mustacchi smb_header_t smbcdev_hdr; /* structure header */ 497f44a1392SRobert Mustacchi uint16_t smbcdev_tprobe; /* temperature probe */ 498f44a1392SRobert Mustacchi uint8_t smbcdev_typstat; /* type and status */ 499f44a1392SRobert Mustacchi uint8_t smbcdev_group; /* group identifier */ 500f44a1392SRobert Mustacchi uint32_t smbcdev_oem; /* vendor-specific data */ 501f44a1392SRobert Mustacchi uint16_t smbcdev_nominal; /* nominal value */ 502f44a1392SRobert Mustacchi uint8_t smbcdev_descr; /* description string */ 503f44a1392SRobert Mustacchi } smb_cooldev_t; 504f44a1392SRobert Mustacchi 505f44a1392SRobert Mustacchi #define SMB_COOLDEV_MINLEN 0x0c 506f44a1392SRobert Mustacchi #define SMB_COOLDEV_NOMINAL_MINLEN 0x0e 507f44a1392SRobert Mustacchi #define SMB_COOLDEV_DESCR_MINLEN 0x0f 508f44a1392SRobert Mustacchi 509f44a1392SRobert Mustacchi #define SMB_COOLDEV_TYPE(x) ((x) & 0x1f) 510f44a1392SRobert Mustacchi #define SMB_COOLDEV_STATUS(x) (((x) >> 5) & 0x7) 511f44a1392SRobert Mustacchi 512f44a1392SRobert Mustacchi /* 513f44a1392SRobert Mustacchi * SMBIOS implementation structure for SMB_TYPE_TPROBE. 514f44a1392SRobert Mustacchi */ 515f44a1392SRobert Mustacchi typedef struct smb_tprobe { 516f44a1392SRobert Mustacchi smb_header_t smbtpr_hdr; /* structure header */ 517f44a1392SRobert Mustacchi uint8_t smbtpr_descr; /* description string */ 518f44a1392SRobert Mustacchi uint8_t smbtpr_locstat; /* location and status */ 519f44a1392SRobert Mustacchi uint16_t smbtpr_maxval; /* maximum temperature */ 520f44a1392SRobert Mustacchi uint16_t smbtpr_minval; /* minimum temperature */ 521f44a1392SRobert Mustacchi uint16_t smbtpr_resolution; /* probe resolution */ 522f44a1392SRobert Mustacchi uint16_t smbtpr_tolerance; /* probe tolerance */ 523f44a1392SRobert Mustacchi uint16_t smbtpr_accuracy; /* probe accuracy */ 524f44a1392SRobert Mustacchi uint32_t smbtpr_oem; /* vendor-specific data */ 525f44a1392SRobert Mustacchi uint16_t smbtpr_nominal; /* nominal value */ 526f44a1392SRobert Mustacchi } smb_tprobe_t; 527f44a1392SRobert Mustacchi 528f44a1392SRobert Mustacchi #define SMB_TPROBE_MINLEN 0x14 529f44a1392SRobert Mustacchi #define SMB_TPROBE_NOMINAL_MINLEN 0x16 530f44a1392SRobert Mustacchi 531f44a1392SRobert Mustacchi #define SMB_TPROBE_LOCATION(x) ((x) & 0x1f) 532f44a1392SRobert Mustacchi #define SMB_TPROBE_STATUS(x) (((x) >> 5) & 0x7) 533f44a1392SRobert Mustacchi 534f44a1392SRobert Mustacchi /* 535f44a1392SRobert Mustacchi * SMBIOS implementation structure for SMB_TYPE_IPROBE. 536f44a1392SRobert Mustacchi */ 537f44a1392SRobert Mustacchi typedef struct smb_iprobe { 538f44a1392SRobert Mustacchi smb_header_t smbipr_hdr; /* structure header */ 539f44a1392SRobert Mustacchi uint8_t smbipr_descr; /* description string */ 540f44a1392SRobert Mustacchi uint8_t smbipr_locstat; /* location and status */ 541f44a1392SRobert Mustacchi uint16_t smbipr_maxval; /* maximum current */ 542f44a1392SRobert Mustacchi uint16_t smbipr_minval; /* minimum current */ 543f44a1392SRobert Mustacchi uint16_t smbipr_resolution; /* probe resolution */ 544f44a1392SRobert Mustacchi uint16_t smbipr_tolerance; /* probe tolerance */ 545f44a1392SRobert Mustacchi uint16_t smbipr_accuracy; /* probe accuracy */ 546f44a1392SRobert Mustacchi uint32_t smbipr_oem; /* vendor-specific data */ 547f44a1392SRobert Mustacchi uint16_t smbipr_nominal; /* nominal value */ 548f44a1392SRobert Mustacchi } smb_iprobe_t; 549f44a1392SRobert Mustacchi 550f44a1392SRobert Mustacchi #define SMB_IPROBE_MINLEN 0x14 551f44a1392SRobert Mustacchi #define SMB_IPROBE_NOMINAL_MINLEN 0x16 552f44a1392SRobert Mustacchi 553f44a1392SRobert Mustacchi #define SMB_IPROBE_LOCATION(x) ((x) & 0x1f) 554f44a1392SRobert Mustacchi #define SMB_IPROBE_STATUS(x) (((x) >> 5) & 0x7) 555f44a1392SRobert Mustacchi 556f44a1392SRobert Mustacchi /* 557f44a1392SRobert Mustacchi * SMBIOS implementation structure for SMB_TYPE_BOOT. 558f44a1392SRobert Mustacchi */ 55984ab085aSmws typedef struct smb_boot { 56084ab085aSmws smb_header_t smbbo_hdr; /* structure header */ 56184ab085aSmws uint8_t smbbo_pad[6]; /* reserved for future use */ 56284ab085aSmws uint8_t smbbo_status[1]; /* variable-length status buffer */ 56384ab085aSmws } smb_boot_t; 56484ab085aSmws 565f44a1392SRobert Mustacchi /* 566f44a1392SRobert Mustacchi * SMBIOS implementation structure for SMB_TYPE_IPMIDEV. 567f44a1392SRobert Mustacchi */ 56884ab085aSmws typedef struct smb_ipmi { 56984ab085aSmws smb_header_t smbipm_hdr; /* structure header */ 57084ab085aSmws uint8_t smbipm_type; /* interface type */ 57184ab085aSmws uint8_t smbipm_spec; /* specification revision */ 57284ab085aSmws uint8_t smbipm_i2c; /* i2C slave address */ 57384ab085aSmws uint8_t smbipm_bus; /* NV storage device bus ID */ 57484ab085aSmws uint64_t smbipm_addr; /* base address */ 57584ab085aSmws uint8_t smbipm_info; /* base address modifier/intr info */ 57684ab085aSmws uint8_t smbipm_intr; /* interrupt number */ 57784ab085aSmws } smb_ipmi_t; 57884ab085aSmws 57984ab085aSmws #define SMB_IPM_SPEC_MAJOR(x) (((x) & 0xF0) >> 4) 58084ab085aSmws #define SMB_IPM_SPEC_MINOR(x) ((x) & 0x0F) 58184ab085aSmws 58284ab085aSmws #define SMB_IPM_ADDR_IO 1ULL 58384ab085aSmws 58484ab085aSmws #define SMB_IPM_INFO_REGS(x) (((x) & 0xC0) >> 6) 58584ab085aSmws #define SMB_IPM_INFO_LSB(x) (((x) & 0x10) >> 4) 58684ab085aSmws #define SMB_IPM_INFO_ISPEC(x) (((x) & 0x08) >> 3) 58784ab085aSmws #define SMB_IPM_INFO_IPOL(x) (((x) & 0x02) >> 1) 58884ab085aSmws #define SMB_IPM_INFO_IMODE(x) (((x) & 0x01) >> 0) 58984ab085aSmws 59084ab085aSmws #define SMB_IPM_REGS_1B 0 59184ab085aSmws #define SMB_IPM_REGS_4B 1 59284ab085aSmws #define SMB_IPM_REGS_16B 2 59384ab085aSmws 59484ab085aSmws #define SMB_IPM_IPOL_LO 0 59584ab085aSmws #define SMB_IPM_IPOL_HI 1 59684ab085aSmws 59784ab085aSmws #define SMB_IPM_IMODE_EDGE 0 59884ab085aSmws #define SMB_IPM_IMODE_LEVEL 1 59984ab085aSmws 600f44a1392SRobert Mustacchi /* 601f44a1392SRobert Mustacchi * SMBIOS implementation structure for SMB_TYPE_POWERSUP. 602f44a1392SRobert Mustacchi */ 60384ab085aSmws typedef struct smb_powersup { 60484ab085aSmws smb_header_t smbpsup_hdr; /* structure header */ 60584ab085aSmws uint8_t smbpsup_group; /* group id */ 60684ab085aSmws uint8_t smbpsup_loc; /* location tag */ 60784ab085aSmws uint8_t smbpsup_devname; /* device name */ 60884ab085aSmws uint8_t smbpsup_manufacturer; /* manufacturer */ 60984ab085aSmws uint8_t smbpsup_serial; /* serial number */ 61084ab085aSmws uint8_t smbpsup_asset; /* asset tag */ 61184ab085aSmws uint8_t smbpsup_part; /* part number */ 61284ab085aSmws uint8_t smbpsup_rev; /* revision string */ 61384ab085aSmws uint16_t smbpsup_max; /* max output in milliwatts */ 61484ab085aSmws uint16_t smbpsup_char; /* characteristics */ 61584ab085aSmws uint16_t smbpsup_vprobe; /* voltage probe handle */ 61684ab085aSmws uint16_t smbpsup_cooldev; /* cooling device handle */ 61784ab085aSmws uint16_t smbpsup_iprobe; /* current probe handle */ 61884ab085aSmws } smb_powersup_t; 61984ab085aSmws 62032ece1f9SRobert Mustacchi #define SMB_PSU_CHARS_ISHOT(x) ((x) & 0x01) 62132ece1f9SRobert Mustacchi #define SMB_PSU_CHARS_ISPRES(x) ((x) & 0x02) 62232ece1f9SRobert Mustacchi #define SMB_PSU_CHARS_ISUNPLUG(x) ((x) & 0x04) 62332ece1f9SRobert Mustacchi #define SMB_PSU_CHARS_IVRS(x) (((x) >> 3) & 0xf) 62432ece1f9SRobert Mustacchi #define SMB_PSU_CHARS_STATUS(x) (((x) >> 7) & 0x7) 62532ece1f9SRobert Mustacchi #define SMB_PSU_CHARS_TYPE(x) (((x) >> 10) & 0xf) 62632ece1f9SRobert Mustacchi 627*064d431aSRobert Mustacchi /* 628*064d431aSRobert Mustacchi * SMBIOS implementation structure for SMB_TYPE_ADDINFO. 629*064d431aSRobert Mustacchi */ 630*064d431aSRobert Mustacchi typedef struct smb_addinfo { 631*064d431aSRobert Mustacchi smb_header_t smbai_hdr; 632*064d431aSRobert Mustacchi uint8_t smbai_nents; 633*064d431aSRobert Mustacchi uint8_t smbai_data[]; 634*064d431aSRobert Mustacchi } smb_addinfo_t; 635*064d431aSRobert Mustacchi 636*064d431aSRobert Mustacchi /* 637*064d431aSRobert Mustacchi * This contains the additional information entry. There are in theory n of 638*064d431aSRobert Mustacchi * these in the smbai_data[] member of the additional information structure 639*064d431aSRobert Mustacchi * above. The offset here is to the referenced handle. 640*064d431aSRobert Mustacchi */ 641*064d431aSRobert Mustacchi typedef struct smb_addinfo_ent { 642*064d431aSRobert Mustacchi uint8_t smbaie_len; 643*064d431aSRobert Mustacchi uint16_t smbaie_rhdl; 644*064d431aSRobert Mustacchi uint8_t smbaie_off; 645*064d431aSRobert Mustacchi uint8_t smbaie_str; 646*064d431aSRobert Mustacchi uint8_t smbaie_val[]; 647*064d431aSRobert Mustacchi } smb_addinfo_ent_t; 648*064d431aSRobert Mustacchi 649f44a1392SRobert Mustacchi /* 650f44a1392SRobert Mustacchi * SMBIOS implementation structure for SMB_TYPE_OBDEVEXT. 651f44a1392SRobert Mustacchi */ 65203f9f63dSTom Pothier typedef struct smb_obdev_ext { 65303f9f63dSTom Pothier smb_header_t smbobe_hdr; /* structure header */ 65403f9f63dSTom Pothier uint8_t smbobe_name; /* reference designation */ 65503f9f63dSTom Pothier uint8_t smbobe_dtype; /* device type */ 65603f9f63dSTom Pothier uint8_t smbobe_dti; /* device type instance */ 65703f9f63dSTom Pothier uint16_t smbobe_sg; /* segment group number */ 65803f9f63dSTom Pothier uint8_t smbobe_bus; /* bus number */ 65903f9f63dSTom Pothier uint8_t smbobe_df; /* device/function number */ 66003f9f63dSTom Pothier } smb_obdev_ext_t; 66103f9f63dSTom Pothier 662176a9270SRobert Mustacchi /* 663176a9270SRobert Mustacchi * SMBIOS implementation structure for SMB_TYPE_PROCESSOR_INFO 664176a9270SRobert Mustacchi */ 665176a9270SRobert Mustacchi typedef struct smb_processor_info { 666176a9270SRobert Mustacchi smb_header_t smbpai_hdr; /* structure handle */ 667176a9270SRobert Mustacchi uint16_t smbpai_proc; /* processor handle */ 668176a9270SRobert Mustacchi uint8_t smbpai_len; /* length of processor specific data */ 669176a9270SRobert Mustacchi uint8_t smbpai_type; /* processor type */ 670176a9270SRobert Mustacchi uint8_t smbpai_data[]; /* processor-specific block */ 671176a9270SRobert Mustacchi } smb_processor_info_t; 672176a9270SRobert Mustacchi 673176a9270SRobert Mustacchi typedef struct smb_processor_info_riscv { 674176a9270SRobert Mustacchi uint16_t smbpairv_vers; /* structure revision */ 675176a9270SRobert Mustacchi uint8_t smbpairv_len; /* length of structure */ 676176a9270SRobert Mustacchi uint8_t smbpairv_hartid[16]; /* id of the hart */ 677176a9270SRobert Mustacchi uint8_t smbpairv_boot; /* boot hart */ 678176a9270SRobert Mustacchi uint8_t smbpairv_vendid[16]; /* machine vendor id */ 679176a9270SRobert Mustacchi uint8_t smbpairv_archid[16]; /* arch vendor id */ 680176a9270SRobert Mustacchi uint8_t smbpairv_machid[16]; /* machine impl id */ 681176a9270SRobert Mustacchi uint32_t smbpairv_isa; /* supported ISA */ 682176a9270SRobert Mustacchi uint8_t smbpairv_privlvl; /* supported privilege levels */ 683176a9270SRobert Mustacchi uint8_t smbpairv_metdi[16]; /* Machine exception trap delegation */ 684176a9270SRobert Mustacchi uint8_t smbpairv_mitdi[16]; /* Machine interrupt trap delegation */ 685176a9270SRobert Mustacchi uint8_t smbpairv_xlen; /* Register width */ 686176a9270SRobert Mustacchi uint8_t smbpairv_mxlen; /* Machine register width */ 687176a9270SRobert Mustacchi uint8_t smbpairv_rsvd; /* Reserved */ 688176a9270SRobert Mustacchi uint8_t smbpairv_sxlen; /* Supervisor register width */ 689176a9270SRobert Mustacchi uint8_t smbpairv_uxlen; /* User register width */ 690176a9270SRobert Mustacchi } smb_processor_info_riscv_t; 691176a9270SRobert Mustacchi 692d53cdfabSRobert Mustacchi /* 693d53cdfabSRobert Mustacchi * SMBIOS implementation structure for SMBIOS_TYPE_FWINFO. 694d53cdfabSRobert Mustacchi */ 695d53cdfabSRobert Mustacchi typedef struct smb_fwinfo { 696d53cdfabSRobert Mustacchi smb_header_t smbfwii_hdr; /* structure handle */ 697d53cdfabSRobert Mustacchi uint8_t smbfwii_name; /* Firmware component name */ 698d53cdfabSRobert Mustacchi uint8_t smbfwii_vers; /* Firmware version */ 699d53cdfabSRobert Mustacchi uint8_t smbfwii_vers_fmt; /* Version format */ 700d53cdfabSRobert Mustacchi uint8_t smbfwii_id; /* Firmware ID */ 701d53cdfabSRobert Mustacchi uint8_t smbfwii_id_fmt; /* Firmware ID format */ 702d53cdfabSRobert Mustacchi uint8_t smbfwii_reldate; /* Release Date */ 703d53cdfabSRobert Mustacchi uint8_t smbfwii_mfg; /* Manufacturer */ 704d53cdfabSRobert Mustacchi uint8_t smbfwii_lsv; /* Lowest supported version */ 705d53cdfabSRobert Mustacchi uint64_t smbfwii_imgsz; /* Image size */ 706d53cdfabSRobert Mustacchi uint16_t smbfwii_chars; /* Characteristics */ 707d53cdfabSRobert Mustacchi uint8_t smbfwii_state; /* State */ 708d53cdfabSRobert Mustacchi uint8_t smbfwii_ncomps; /* Number of associated components */ 709d53cdfabSRobert Mustacchi uint16_t smbfwii_comps[]; /* Variable handles */ 710d53cdfabSRobert Mustacchi } smb_fwinfo_t; 711d53cdfabSRobert Mustacchi 712d53cdfabSRobert Mustacchi /* 713d53cdfabSRobert Mustacchi * SMBIOS implementation structure for SMBIOS_TYPE_STRPROP. 714d53cdfabSRobert Mustacchi */ 715d53cdfabSRobert Mustacchi typedef struct smb_strprop { 716d53cdfabSRobert Mustacchi smb_header_t smbstrp_hdr; /* structure handle */ 717d53cdfabSRobert Mustacchi uint16_t smbstrp_prop_id; /* string property ID */ 718d53cdfabSRobert Mustacchi uint8_t smbstrp_prop_val; /* string property value */ 719d53cdfabSRobert Mustacchi uint16_t smbstrp_phdl; /* parent handle */ 720d53cdfabSRobert Mustacchi } smb_strprop_t; 721d53cdfabSRobert Mustacchi 722f44a1392SRobert Mustacchi /* 723f44a1392SRobert Mustacchi * SMBIOS implementation structure for SUN_OEM_EXT_PROCESSOR. 724f44a1392SRobert Mustacchi */ 725074bb90dSTom Pothier typedef struct smb_processor_ext { 726074bb90dSTom Pothier smb_header_t smbpre_hdr; /* structure header */ 727074bb90dSTom Pothier uint16_t smbpre_processor; /* processor handle */ 728074bb90dSTom Pothier uint8_t smbpre_fru; /* FRU indicator */ 729074bb90dSTom Pothier uint8_t smbpre_n; /* number of APIC IDs */ 730074bb90dSTom Pothier uint16_t smbpre_apicid[1]; /* strand initial apic id */ 731074bb90dSTom Pothier } smb_processor_ext_t; 73203f9f63dSTom Pothier 733f44a1392SRobert Mustacchi /* 734f44a1392SRobert Mustacchi * SMBIOS implementation structure for SUN_OEM_EXT_PORT. 735f44a1392SRobert Mustacchi */ 73603f9f63dSTom Pothier typedef struct smb_port_ext { 73703f9f63dSTom Pothier smb_header_t smbpoe_hdr; /* structure header */ 73803f9f63dSTom Pothier uint16_t smbpoe_chassis; /* chassis handle */ 73903f9f63dSTom Pothier uint16_t smbpoe_port; /* port connector handle */ 74003f9f63dSTom Pothier uint8_t smbpoe_dtype; /* device type */ 74103f9f63dSTom Pothier uint16_t smbpoe_devhdl; /* device handle */ 74203f9f63dSTom Pothier uint8_t smbpoe_phy; /* PHY number */ 74303f9f63dSTom Pothier } smb_port_ext_t; 744074bb90dSTom Pothier 745f44a1392SRobert Mustacchi /* 746f44a1392SRobert Mustacchi * SMBIOS implementation structure for SUN_OEM_PCIEXRC. 747f44a1392SRobert Mustacchi */ 748074bb90dSTom Pothier typedef struct smb_pciexrc { 749074bb90dSTom Pothier smb_header_t smbpciexrc_hdr; /* structure header */ 750074bb90dSTom Pothier uint16_t smbpciexrc_bboard; /* base board handle */ 751074bb90dSTom Pothier uint16_t smbpciexrc_bdf; /* PCI Bus/Dev/Func */ 752074bb90dSTom Pothier } smb_pciexrc_t; 753074bb90dSTom Pothier 754f44a1392SRobert Mustacchi /* 755f44a1392SRobert Mustacchi * SMBIOS implementation structure for SUN_OEM_EXT_MEMARRAY. 756f44a1392SRobert Mustacchi */ 757074bb90dSTom Pothier typedef struct smb_memarray_ext { 758074bb90dSTom Pothier smb_header_t smbmarre_hdr; /* structure header */ 759074bb90dSTom Pothier uint16_t smbmarre_ma; /* memory array handle */ 760074bb90dSTom Pothier uint16_t smbmarre_component; /* component parent handle */ 761074bb90dSTom Pothier uint16_t smbmarre_bdf; /* PCI bus/dev/funct */ 762074bb90dSTom Pothier } smb_memarray_ext_t; 763074bb90dSTom Pothier 764f44a1392SRobert Mustacchi /* 765f44a1392SRobert Mustacchi * SMBIOS implementation structure for SUN_OEM_EXT_MEMDEVICE. 766f44a1392SRobert Mustacchi */ 767074bb90dSTom Pothier typedef struct smb_memdevice_ext { 768074bb90dSTom Pothier smb_header_t smbmdeve_hdr; /* structure header */ 769074bb90dSTom Pothier uint16_t smbmdeve_mdev; /* memory device handle */ 770074bb90dSTom Pothier uint8_t smbmdeve_dchan; /* DRAM channel */ 771074bb90dSTom Pothier uint8_t smbmdeve_ncs; /* number of chip select */ 772679a141eSToomas Soome uint8_t smbmdeve_cs[]; /* chip selects */ 773074bb90dSTom Pothier } smb_memdevice_ext_t; 774074bb90dSTom Pothier 77584ab085aSmws #pragma pack() 77684ab085aSmws 77784ab085aSmws typedef struct smb_struct { 77884ab085aSmws const smb_header_t *smbst_hdr; /* address of raw structure data */ 77984ab085aSmws const uchar_t *smbst_str; /* address of string data (if any) */ 78084ab085aSmws const uchar_t *smbst_end; /* address of 0x0000 ending tag */ 7811566bc34SRobert Mustacchi struct smb_struct *smbst_next; /* next structure in hash chain */ 78284ab085aSmws uint16_t *smbst_strtab; /* string index -> offset table */ 78384ab085aSmws uint_t smbst_strtablen; /* length of smbst_strtab */ 78484ab085aSmws } smb_struct_t; 78584ab085aSmws 78684ab085aSmws struct smbios_hdl { 7871951a933SToomas Soome smbios_entry_point_t sh_ent_type; /* structure table entry point type */ 78884ab085aSmws smbios_entry_t sh_ent; /* structure table entry point */ 7891951a933SToomas Soome uint_t sh_ent_stnum; /* number of structure table entries */ 79084ab085aSmws const void *sh_buf; /* structure table buffer */ 79184ab085aSmws size_t sh_buflen; /* size of structure table buffer */ 79284ab085aSmws smb_struct_t *sh_structs; /* array of structure descriptors */ 79384ab085aSmws uint_t sh_nstructs; /* number of active structures */ 79484ab085aSmws smb_struct_t **sh_hash; /* hash bucket array for descriptors */ 79584ab085aSmws uint_t sh_hashlen; /* hash bucket array length */ 79684ab085aSmws int sh_err; /* error code for smbios_errno() */ 79784ab085aSmws int sh_libvers; /* library client abi version */ 79884ab085aSmws int sh_smbvers; /* derived underlying format version */ 79984ab085aSmws uint_t sh_flags; /* miscellaneous flags (see below) */ 80084ab085aSmws }; 80184ab085aSmws 80284ab085aSmws #define SMB_FL_DEBUG 0x1 /* print debug messages for this hdl */ 80384ab085aSmws #define SMB_FL_BUFALLOC 0x2 /* sh_buf was allocated by library */ 804516627f3SJonathan Matthew #define SMB_FL_TRUNC 0x4 /* smbios table is truncated */ 80584ab085aSmws 80684ab085aSmws #define SMB_BIOS_DEVICE "/dev/xsvc" /* device w/ BIOS physmem */ 80784ab085aSmws #define SMB_SMBIOS_DEVICE "/dev/smbios" /* device w/ SMBIOS image */ 80884ab085aSmws 80984ab085aSmws #define SMB_RANGE_START 0xF0000 /* start of physical address range */ 81084ab085aSmws #define SMB_RANGE_LIMIT 0xFFFFF /* limit of physical address range */ 81196e7037fSToomas Soome #define SMB_SCAN_STEP 16 /* stepping by paragraph */ 81284ab085aSmws 813f44a1392SRobert Mustacchi #define SMB_MAJMIN(M, m) ((((M) & 0xFF) << 8) | ((m) & 0xFF)) 81484ab085aSmws #define SMB_MAJOR(v) (((v) & 0xFF00) >> 8) 81584ab085aSmws #define SMB_MINOR(v) (((v) & 0x00FF)) 81684ab085aSmws 81784ab085aSmws #define ESMB_BASE 1000 /* base value for libsmbios errnos */ 81884ab085aSmws 81984ab085aSmws enum { 82084ab085aSmws ESMB_NOTFOUND = ESMB_BASE, /* SMBIOS table not found on system */ 82184ab085aSmws ESMB_MAPDEV, /* failed to map SMBIOS table */ 82284ab085aSmws ESMB_NOENT, /* failed to locate structure */ 82384ab085aSmws ESMB_NOMEM, /* failed to allocate memory */ 82484ab085aSmws ESMB_NOHDR, /* failed to read SMBIOS header */ 82584ab085aSmws ESMB_NOSTAB, /* failed to read SMBIOS struct table */ 82684ab085aSmws ESMB_NOINFO, /* no common info for structure */ 82784ab085aSmws ESMB_SHORT, /* buffer length doesn't match header */ 82884ab085aSmws ESMB_CORRUPT, /* buffer struct or len is corrupt */ 82984ab085aSmws ESMB_VERSION, /* version not supported by library */ 83084ab085aSmws ESMB_NOTSUP, /* feature not supported by provider */ 83184ab085aSmws ESMB_HEADER, /* SMBIOS header corrupt or invalid */ 83284ab085aSmws ESMB_OLD, /* SMBIOS version is too old for us */ 83384ab085aSmws ESMB_NEW, /* SMBIOS version is too new for us */ 83484ab085aSmws ESMB_CKSUM, /* SMBIOS header checksum mismatch */ 83584ab085aSmws ESMB_INVAL, /* invalid function call argument */ 83684ab085aSmws ESMB_TYPE, /* structure type mismatch */ 837*064d431aSRobert Mustacchi ESMB_UNKNOWN, /* unknown error */ 838*064d431aSRobert Mustacchi ESMB_REQVAL /* invalid requested value */ 83984ab085aSmws }; 84084ab085aSmws 84184ab085aSmws extern const smb_struct_t *smb_lookup_type(smbios_hdl_t *, uint_t); 84284ab085aSmws extern const smb_struct_t *smb_lookup_id(smbios_hdl_t *, uint_t); 84384ab085aSmws extern const char *smb_strptr(const smb_struct_t *, uint_t); 8446bc074b1SRobert Mustacchi extern boolean_t smb_gteq(smbios_hdl_t *, int); 8456bc074b1SRobert Mustacchi extern boolean_t smb_libgteq(smbios_hdl_t *, int); 84684ab085aSmws 84784ab085aSmws extern int smb_set_errno(smbios_hdl_t *, int); 84884ab085aSmws extern smbios_hdl_t *smb_open_error(smbios_hdl_t *, int *, int); 84984ab085aSmws extern const char *smb_strerror(int); 85084ab085aSmws 85184ab085aSmws extern void *smb_alloc(size_t); 85284ab085aSmws extern void *smb_zalloc(size_t); 85384ab085aSmws extern void smb_free(void *, size_t); 85484ab085aSmws 85584ab085aSmws extern void smb_dprintf(smbios_hdl_t *, const char *, ...); 85684ab085aSmws 85784ab085aSmws extern int _smb_debug; 85884ab085aSmws 8596734c4b0SRobert Mustacchi /* 8606734c4b0SRobert Mustacchi * The following series of structures represent the base versions of public 8616734c4b0SRobert Mustacchi * structures that are used inside by the smbios routines. This allows the 8626734c4b0SRobert Mustacchi * common code to properly know how much it should or should not bzero and how 8636734c4b0SRobert Mustacchi * to handle additions to the spec. Types should only be added here if we need 8646734c4b0SRobert Mustacchi * to extend the public structures in sys/smbios.h due to a change in the spec. 8656734c4b0SRobert Mustacchi * 8666734c4b0SRobert Mustacchi * Types here have the name smb_base_%s which corresponds to smbios_%s. 8676734c4b0SRobert Mustacchi */ 8686734c4b0SRobert Mustacchi typedef struct smb_base_chassis { 8696734c4b0SRobert Mustacchi uint32_t smbbc_oemdata; /* OEM-specific data */ 8706734c4b0SRobert Mustacchi uint8_t smbbc_lock; /* lock present? */ 8716734c4b0SRobert Mustacchi uint8_t smbbc_type; /* type */ 8726734c4b0SRobert Mustacchi uint8_t smbbc_bustate; /* boot-up state */ 8736734c4b0SRobert Mustacchi uint8_t smbbc_psstate; /* power supply state */ 8746734c4b0SRobert Mustacchi uint8_t smbbc_thstate; /* thermal state */ 8756734c4b0SRobert Mustacchi uint8_t smbbc_security; /* security status */ 8766734c4b0SRobert Mustacchi uint8_t smbbc_uheight; /* enclosure height in U's */ 8776734c4b0SRobert Mustacchi uint8_t smbbc_cords; /* number of power cords */ 8786734c4b0SRobert Mustacchi uint8_t smbbc_elems; /* number of element records (n) */ 8796734c4b0SRobert Mustacchi uint8_t smbbc_elemlen; /* length of contained element (m) */ 8806734c4b0SRobert Mustacchi } smb_base_chassis_t; 8816734c4b0SRobert Mustacchi 8826734c4b0SRobert Mustacchi typedef struct smb_base_processor { 8836734c4b0SRobert Mustacchi uint64_t smbbp_cpuid; /* processor cpuid information */ 8846734c4b0SRobert Mustacchi uint32_t smbbp_family; /* processor family */ 8856734c4b0SRobert Mustacchi uint8_t smbbp_type; /* processor type (SMB_PRT_*) */ 8866734c4b0SRobert Mustacchi uint8_t smbbp_voltage; /* voltage (SMB_PRV_*) */ 8876734c4b0SRobert Mustacchi uint8_t smbbp_status; /* status (SMB_PRS_*) */ 8886734c4b0SRobert Mustacchi uint8_t smbbp_upgrade; /* upgrade (SMB_PRU_*) */ 8896734c4b0SRobert Mustacchi uint32_t smbbp_clkspeed; /* external clock speed in MHz */ 8906734c4b0SRobert Mustacchi uint32_t smbbp_maxspeed; /* maximum speed in MHz */ 8916734c4b0SRobert Mustacchi uint32_t smbbp_curspeed; /* current speed in MHz */ 8926734c4b0SRobert Mustacchi id_t smbbp_l1cache; /* L1 cache handle */ 8936734c4b0SRobert Mustacchi id_t smbbp_l2cache; /* L2 cache handle */ 8946734c4b0SRobert Mustacchi id_t smbbp_l3cache; /* L3 cache handle */ 8956734c4b0SRobert Mustacchi } smb_base_processor_t; 8966734c4b0SRobert Mustacchi 8976734c4b0SRobert Mustacchi typedef struct smb_base_memdevice { 8986734c4b0SRobert Mustacchi id_t smbbmd_array; /* handle of physical memory array */ 8996734c4b0SRobert Mustacchi id_t smbbmd_error; /* handle of memory error data */ 9006734c4b0SRobert Mustacchi uint32_t smbbmd_twidth; /* total width in bits including ecc */ 9016734c4b0SRobert Mustacchi uint32_t smbbmd_dwidth; /* data width in bits */ 9026734c4b0SRobert Mustacchi uint64_t smbbmd_size; /* size in bytes (see note above) */ 9036734c4b0SRobert Mustacchi uint8_t smbbmd_form; /* form factor */ 9046734c4b0SRobert Mustacchi uint8_t smbbmd_set; /* set (0x00=none, 0xFF=unknown) */ 9056734c4b0SRobert Mustacchi uint8_t smbbmd_type; /* memory type */ 9066734c4b0SRobert Mustacchi uint8_t smbbmd_pad; /* padding */ 9076734c4b0SRobert Mustacchi uint32_t smbbmd_flags; /* flags (see below) */ 9086734c4b0SRobert Mustacchi uint32_t smbbmd_speed; /* speed in MHz */ 9096734c4b0SRobert Mustacchi const char *smbbmd_dloc; /* physical device locator string */ 9106734c4b0SRobert Mustacchi const char *smbbmd_bloc; /* physical bank locator string */ 9116734c4b0SRobert Mustacchi uint8_t smbbmd_rank; /* rank */ 9126734c4b0SRobert Mustacchi } smb_base_memdevice_t; 9136734c4b0SRobert Mustacchi 914e5cce96fSRobert Mustacchi typedef struct smb_base_bios { 915e5cce96fSRobert Mustacchi const char *smbbb_vendor; /* bios vendor string */ 916e5cce96fSRobert Mustacchi const char *smbbb_version; /* bios version string */ 917e5cce96fSRobert Mustacchi const char *smbbb_reldate; /* bios release date */ 918e5cce96fSRobert Mustacchi uint32_t smbbb_segment; /* bios address segment location */ 919e5cce96fSRobert Mustacchi uint32_t smbbb_romsize; /* bios rom size in bytes */ 920e5cce96fSRobert Mustacchi uint32_t smbbb_runsize; /* bios image size in bytes */ 921e5cce96fSRobert Mustacchi uint64_t smbbb_cflags; /* bios characteristics */ 922e5cce96fSRobert Mustacchi const uint8_t *smbbb_xcflags; /* bios characteristics extensions */ 923e5cce96fSRobert Mustacchi size_t smbbb_nxcflags; /* number of smbb_xcflags[] bytes */ 924e5cce96fSRobert Mustacchi smbios_version_t smbbb_biosv; /* bios version */ 925e5cce96fSRobert Mustacchi smbios_version_t smbbb_ecfwv; /* bios embedded ctrl f/w version */ 926e5cce96fSRobert Mustacchi } smb_base_bios_t; 927e5cce96fSRobert Mustacchi 928e5cce96fSRobert Mustacchi typedef struct smb_base_cache { 929e5cce96fSRobert Mustacchi uint32_t smbba_maxsize; /* maximum installed size in bytes */ 930e5cce96fSRobert Mustacchi uint32_t smbba_size; /* installed size in bytes */ 931e5cce96fSRobert Mustacchi uint16_t smbba_stype; /* supported SRAM types (SMB_CAT_*) */ 932e5cce96fSRobert Mustacchi uint16_t smbba_ctype; /* current SRAM type (SMB_CAT_*) */ 933e5cce96fSRobert Mustacchi uint8_t smbba_speed; /* speed in nanoseconds */ 934e5cce96fSRobert Mustacchi uint8_t smbba_etype; /* error correction type (SMB_CAE_*) */ 935e5cce96fSRobert Mustacchi uint8_t smbba_ltype; /* logical cache type (SMB_CAG_*) */ 936e5cce96fSRobert Mustacchi uint8_t smbba_assoc; /* associativity (SMB_CAA_*) */ 937e5cce96fSRobert Mustacchi uint8_t smbba_level; /* cache level */ 938e5cce96fSRobert Mustacchi uint8_t smbba_mode; /* cache mode (SMB_CAM_*) */ 939e5cce96fSRobert Mustacchi uint8_t smbba_location; /* cache location (SMB_CAL_*) */ 940e5cce96fSRobert Mustacchi uint8_t smbba_flags; /* cache flags (SMB_CAF_*) */ 941e5cce96fSRobert Mustacchi } smb_base_cache_t; 9426734c4b0SRobert Mustacchi 9431566bc34SRobert Mustacchi typedef struct smb_base_slot { 9441566bc34SRobert Mustacchi const char *smbbl_name; /* reference designation */ 9451566bc34SRobert Mustacchi uint8_t smbbl_type; /* slot type */ 9461566bc34SRobert Mustacchi uint8_t smbbl_width; /* slot data bus width */ 9471566bc34SRobert Mustacchi uint8_t smbbl_usage; /* current usage */ 9481566bc34SRobert Mustacchi uint8_t smbbl_length; /* slot length */ 9491566bc34SRobert Mustacchi uint16_t smbbl_id; /* slot ID */ 9501566bc34SRobert Mustacchi uint8_t smbbl_ch1; /* slot characteristics 1 */ 9511566bc34SRobert Mustacchi uint8_t smbbl_ch2; /* slot characteristics 2 */ 9521566bc34SRobert Mustacchi uint16_t smbbl_sg; /* segment group number */ 9531566bc34SRobert Mustacchi uint8_t smbbl_bus; /* bus number */ 9541566bc34SRobert Mustacchi uint8_t smbbl_df; /* device/function number */ 9551566bc34SRobert Mustacchi } smb_base_slot_t; 9561566bc34SRobert Mustacchi 957d53cdfabSRobert Mustacchi /* 958d53cdfabSRobert Mustacchi * Prior to reivison 3.5 of the library and interface we had embedded a 256 byte 959d53cdfabSRobert Mustacchi * string for the SKU into here rather than pointing to constant data. This, 960d53cdfabSRobert Mustacchi * combined withe bugs in the implementation, generally led to strings with 961d53cdfabSRobert Mustacchi * garbage. As part of fixing this with the 3.5 support, we moved the struct to 962d53cdfabSRobert Mustacchi * ve more inline with everything else. 963d53cdfabSRobert Mustacchi */ 964d53cdfabSRobert Mustacchi typedef struct smb_chassis_pre35 { 965d53cdfabSRobert Mustacchi uint32_t smbc_oemdata; /* OEM-specific data */ 966d53cdfabSRobert Mustacchi uint8_t smbc_lock; /* lock present? */ 967d53cdfabSRobert Mustacchi uint8_t smbc_type; /* type */ 968d53cdfabSRobert Mustacchi uint8_t smbc_bustate; /* boot-up state */ 969d53cdfabSRobert Mustacchi uint8_t smbc_psstate; /* power supply state */ 970d53cdfabSRobert Mustacchi uint8_t smbc_thstate; /* thermal state */ 971d53cdfabSRobert Mustacchi uint8_t smbc_security; /* security status */ 972d53cdfabSRobert Mustacchi uint8_t smbc_uheight; /* enclosure height in U's */ 973d53cdfabSRobert Mustacchi uint8_t smbc_cords; /* number of power cords */ 974d53cdfabSRobert Mustacchi uint8_t smbc_elems; /* number of element records (n) */ 975d53cdfabSRobert Mustacchi uint8_t smbc_elemlen; /* length of contained element (m) */ 976d53cdfabSRobert Mustacchi char smbc_sku[256]; 977d53cdfabSRobert Mustacchi } smb_chassis_pre35_t; 978d53cdfabSRobert Mustacchi 97984ab085aSmws #ifdef __cplusplus 98084ab085aSmws } 98184ab085aSmws #endif 98284ab085aSmws 98384ab085aSmws #endif /* _SYS_SMBIOS_IMPL_H */ 984