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. 24*a60349c8SRobert Mustacchi * Copyright (c) 2018, Joyent, Inc. 2503f9f63dSTom Pothier * Copyright 2010 Sun Microsystems, Inc. All rights reserved. 2684ab085aSmws * Use is subject to license terms. 2784ab085aSmws */ 2884ab085aSmws 2984ab085aSmws /* 3084ab085aSmws * This header file defines the implementation structures for the SMBIOS access 3184ab085aSmws * library, libsmbios, and an equivalent kernel module. Clients should use 3284ab085aSmws * the <smbios.h> or <sys/smbios.h> header files to access DMTF SMBIOS 3384ab085aSmws * information, NOT these underlying implementation structures from the spec. 3484ab085aSmws * In short, do not user this header file or these routines for any purpose. 3584ab085aSmws */ 3684ab085aSmws 3784ab085aSmws #ifndef _SYS_SMBIOS_IMPL_H 3884ab085aSmws #define _SYS_SMBIOS_IMPL_H 3984ab085aSmws 4084ab085aSmws #include <sys/smbios.h> 4184ab085aSmws #include <sys/sysmacros.h> 4284ab085aSmws 4384ab085aSmws #ifdef _KERNEL 4484ab085aSmws #include <sys/systm.h> 4584ab085aSmws #else 4684ab085aSmws #include <strings.h> 4784ab085aSmws #include <stddef.h> 4884ab085aSmws #endif 4984ab085aSmws 5084ab085aSmws #ifdef __cplusplus 5184ab085aSmws extern "C" { 5284ab085aSmws #endif 5384ab085aSmws 541eb9e3eaSRobert Mustacchi /* 551eb9e3eaSRobert Mustacchi * Definitions required to interpret the BIOS type information. 561eb9e3eaSRobert Mustacchi */ 571eb9e3eaSRobert Mustacchi #define SMB_BIOSXB_EXTROM 6 581eb9e3eaSRobert Mustacchi 591eb9e3eaSRobert Mustacchi #define SMB_BIOS_EXTROM_VALUE_MASK(x) ((x) & 0x3fff) 601eb9e3eaSRobert Mustacchi #define SMB_BIOS_EXTROM_SHIFT_MASK(x) (((x) & 0xc000) >> 14) 611eb9e3eaSRobert Mustacchi 6284ab085aSmws #pragma pack(1) 6384ab085aSmws 6484ab085aSmws typedef struct smb_header { 6584ab085aSmws uint8_t smbh_type; /* structure type (SMB_TYPE_* value) */ 6684ab085aSmws uint8_t smbh_len; /* length in bytes of formatted area */ 6784ab085aSmws uint16_t smbh_hdl; /* structure handle */ 6884ab085aSmws } smb_header_t; 6984ab085aSmws 70a448814aSRobert Mustacchi /* 71a448814aSRobert Mustacchi * SMBIOS implementation structure for SMB_TYPE_BIOS. 72a448814aSRobert Mustacchi */ 7384ab085aSmws typedef struct smb_bios { 7484ab085aSmws smb_header_t smbbi_hdr; /* structure header */ 7584ab085aSmws uint8_t smbbi_vendor; /* bios vendor string */ 7684ab085aSmws uint8_t smbbi_version; /* bios version string */ 7784ab085aSmws uint16_t smbbi_segment; /* segment location of bios address */ 7884ab085aSmws uint8_t smbbi_reldate; /* bios release date */ 7984ab085aSmws uint8_t smbbi_romsize; /* bios rom size (64k * (n + 1)) */ 8084ab085aSmws uint64_t smbbi_cflags; /* bios characteristics */ 8184ab085aSmws uint8_t smbbi_xcflags[1]; /* bios characteristics extensions */ 8284ab085aSmws } smb_bios_t; 8384ab085aSmws 84a448814aSRobert Mustacchi /* 85a448814aSRobert Mustacchi * SMBIOS implementation structure for SMB_TYPE_SYSTEM. 86a448814aSRobert Mustacchi */ 8784ab085aSmws typedef struct smb_system { 8884ab085aSmws smb_header_t smbsi_hdr; /* structure header */ 8984ab085aSmws uint8_t smbsi_manufacturer; /* manufacturer */ 9084ab085aSmws uint8_t smbsi_product; /* product name */ 9184ab085aSmws uint8_t smbsi_version; /* version */ 9284ab085aSmws uint8_t smbsi_serial; /* serial number */ 9384ab085aSmws uint8_t smbsi_uuid[16]; /* UUID */ 9484ab085aSmws uint8_t smbsi_wakeup; /* wake-up type */ 9584ab085aSmws uint8_t smbsi_sku; /* SKU number */ 9684ab085aSmws uint8_t smbsi_family; /* family */ 9784ab085aSmws } smb_system_t; 9884ab085aSmws 99a448814aSRobert Mustacchi /* 100a448814aSRobert Mustacchi * SMBIOS implementation structure for SMB_TYPE_BASEBOARD. 101a448814aSRobert Mustacchi */ 10284ab085aSmws typedef struct smb_bboard { 10384ab085aSmws smb_header_t smbbb_hdr; /* structure header */ 10484ab085aSmws uint8_t smbbb_manufacturer; /* manufacturer */ 10584ab085aSmws uint8_t smbbb_product; /* product name */ 10684ab085aSmws uint8_t smbbb_version; /* version */ 10784ab085aSmws uint8_t smbbb_serial; /* serial number */ 10884ab085aSmws uint8_t smbbb_asset; /* asset tag */ 10984ab085aSmws uint8_t smbbb_flags; /* feature flags */ 11084ab085aSmws uint8_t smbbb_location; /* location in chassis */ 11184ab085aSmws uint16_t smbbb_chassis; /* chassis handle */ 11284ab085aSmws uint8_t smbbb_type; /* board type */ 11384ab085aSmws uint8_t smbbb_cn; /* number of contained handles */ 11484ab085aSmws uint16_t smbbb_cv[1]; /* array of contained handles */ 11584ab085aSmws } smb_bboard_t; 11684ab085aSmws 117a448814aSRobert Mustacchi /* 118a448814aSRobert Mustacchi * SMBIOS implementation structure for SMB_TYPE_CHASSIS. 119a448814aSRobert Mustacchi */ 12084ab085aSmws typedef struct smb_chassis { 12184ab085aSmws smb_header_t smbch_hdr; /* structure header */ 12284ab085aSmws uint8_t smbch_manufacturer; /* manufacturer */ 12384ab085aSmws uint8_t smbch_type; /* type */ 12484ab085aSmws uint8_t smbch_version; /* version */ 12584ab085aSmws uint8_t smbch_serial; /* serial number */ 12684ab085aSmws uint8_t smbch_asset; /* asset tag */ 12784ab085aSmws uint8_t smbch_bustate; /* boot-up state */ 12884ab085aSmws uint8_t smbch_psstate; /* power supply state */ 12984ab085aSmws uint8_t smbch_thstate; /* thermal state */ 13084ab085aSmws uint8_t smbch_security; /* security state */ 13184ab085aSmws uint32_t smbch_oemdata; /* OEM-specific data */ 13284ab085aSmws uint8_t smbch_uheight; /* enclosure height */ 13384ab085aSmws uint8_t smbch_cords; /* number of power cords */ 13484ab085aSmws uint8_t smbch_cn; /* number of contained records */ 13584ab085aSmws uint8_t smbch_cm; /* size of contained records */ 13684ab085aSmws uint8_t smbch_cv[1]; /* array of contained records */ 13784ab085aSmws } smb_chassis_t; 13884ab085aSmws 1394e901881SDale Ghent /* WARNING: the argument is evaluated three times! */ 1404e901881SDale Ghent #define SMB_CH_SKU(smbcp) ((char *) \ 1414e901881SDale Ghent (smbcp)->smbch_cv + ((smbcp)->smbch_cn * (smbcp)->smbch_cm)) 14284ab085aSmws #define SMB_CHT_LOCK 0x80 /* lock bit within smbch_type */ 14384ab085aSmws 144a448814aSRobert Mustacchi /* 145a448814aSRobert Mustacchi * SMBIOS implementation structure for SMB_TYPE_PROCESSOR. 146a448814aSRobert Mustacchi */ 14784ab085aSmws typedef struct smb_processor { 14884ab085aSmws smb_header_t smbpr_hdr; /* structure header */ 14984ab085aSmws uint8_t smbpr_socket; /* socket designation */ 15084ab085aSmws uint8_t smbpr_type; /* processor type (see <smbios.h>) */ 15184ab085aSmws uint8_t smbpr_family; /* processor family (see <smbios.h>) */ 15284ab085aSmws uint8_t smbpr_manufacturer; /* manufacturer */ 15384ab085aSmws uint64_t smbpr_cpuid; /* processor cpuid information */ 15484ab085aSmws uint8_t smbpr_version; /* version */ 15584ab085aSmws uint8_t smbpr_voltage; /* voltage */ 15684ab085aSmws uint16_t smbpr_clkspeed; /* external clock speed in MHz */ 15784ab085aSmws uint16_t smbpr_maxspeed; /* maximum speed in MHz */ 15884ab085aSmws uint16_t smbpr_curspeed; /* current speed in MHz */ 15984ab085aSmws uint8_t smbpr_status; /* status (see <smbios.h>) */ 16084ab085aSmws uint8_t smbpr_upgrade; /* upgrade */ 16184ab085aSmws uint16_t smbpr_l1cache; /* L1 cache handle (if any) */ 16284ab085aSmws uint16_t smbpr_l2cache; /* L2 cache handle (if any) */ 16384ab085aSmws uint16_t smbpr_l3cache; /* L3 cache handle (if any) */ 16484ab085aSmws uint8_t smbpr_serial; /* serial number */ 16584ab085aSmws uint8_t smbpr_asset; /* asset tag */ 16684ab085aSmws uint8_t smbpr_part; /* part number */ 1674e901881SDale Ghent uint8_t smbpr_corecount; /* number of cores per socket */ 1684e901881SDale Ghent uint8_t smbpr_coresenabled; /* number of enabled cores per socket */ 1694e901881SDale Ghent uint8_t smbpr_threadcount; /* number of threads per socket */ 1704e901881SDale Ghent uint16_t smbpr_cflags; /* cpu characteristics (see <smbios.h>) */ 1714e901881SDale Ghent uint16_t smbpr_family2; /* processor family2 (see <smbios.h>) */ 17204cdb0e3SRobert Mustacchi uint16_t smbpr_corecount2; /* second number of cores per socket */ 17304cdb0e3SRobert Mustacchi uint16_t smbpr_coresenabled2; /* second number of enabled cores */ 17404cdb0e3SRobert Mustacchi uint16_t smbpr_threadcount2; /* second number of enabled threads */ 17584ab085aSmws } smb_processor_t; 17684ab085aSmws 177a448814aSRobert Mustacchi /* 178a448814aSRobert Mustacchi * SMBIOS implementation structure for SMB_TYPE_CACHE. 179a448814aSRobert Mustacchi */ 18084ab085aSmws typedef struct smb_cache { 18184ab085aSmws smb_header_t smbca_hdr; /* structure header */ 18284ab085aSmws uint8_t smbca_socket; /* socket designation */ 18384ab085aSmws uint16_t smbca_config; /* cache configuration */ 18484ab085aSmws uint16_t smbca_maxsize; /* maximum installed size */ 18584ab085aSmws uint16_t smbca_size; /* installed size */ 18684ab085aSmws uint16_t smbca_stype; /* supported SRAM type */ 18784ab085aSmws uint16_t smbca_ctype; /* current SRAM type */ 18884ab085aSmws uint8_t smbca_speed; /* speed in nanoseconds */ 18984ab085aSmws uint8_t smbca_etype; /* error correction type */ 19084ab085aSmws uint8_t smbca_ltype; /* logical cache type */ 19184ab085aSmws uint8_t smbca_assoc; /* associativity */ 1921eb9e3eaSRobert Mustacchi uint32_t smbca_maxsize2; /* maximum installed size 2 */ 1931eb9e3eaSRobert Mustacchi uint32_t smbca_size2; /* installed size 2 */ 19484ab085aSmws } smb_cache_t; 19584ab085aSmws 196e4586ebfSmws /* 1974e901881SDale Ghent * Convert encoded cache size to bytes: DSP0134 Section 7.8 explains the 198e4586ebfSmws * encoding. The highest bit is 0 for 1k units, 1 for 64k units, and this 199e4586ebfSmws * macro decodes the value into bytes for exporting to our clients. 200e4586ebfSmws */ 201e4586ebfSmws #define SMB_CACHE_SIZE(s) (((s) & 0x8000) ? \ 202e4586ebfSmws ((uint32_t)((s) & 0x7FFF) * 64 * 1024) : ((uint32_t)(s) * 1024)) 20384ab085aSmws 2041eb9e3eaSRobert Mustacchi #define SMB_CACHE_EXT_SIZE(s) (((s) & 0x80000000U) ? \ 2051eb9e3eaSRobert Mustacchi ((uint64_t)((s) & 0x7FFFFFFFULL) * 64ULL * 1024ULL) : \ 2061eb9e3eaSRobert Mustacchi ((uint64_t)(s) * 1024ULL)) 2071eb9e3eaSRobert Mustacchi 20884ab085aSmws #define SMB_CACHE_CFG_MODE(c) (((c) >> 8) & 3) 20984ab085aSmws #define SMB_CACHE_CFG_ENABLED(c) (((c) >> 7) & 1) 21084ab085aSmws #define SMB_CACHE_CFG_LOCATION(c) (((c) >> 5) & 3) 21184ab085aSmws #define SMB_CACHE_CFG_SOCKETED(c) (((c) >> 3) & 1) 21284ab085aSmws #define SMB_CACHE_CFG_LEVEL(c) (((c) & 7) + 1) 21384ab085aSmws 214a448814aSRobert Mustacchi /* 215a448814aSRobert Mustacchi * SMBIOS implementation structure for SMB_TYPE_PORT. 216a448814aSRobert Mustacchi */ 21784ab085aSmws typedef struct smb_port { 21884ab085aSmws smb_header_t smbpo_hdr; /* structure header */ 21984ab085aSmws uint8_t smbpo_iref; /* internal reference designator */ 22084ab085aSmws uint8_t smbpo_itype; /* internal connector type */ 22184ab085aSmws uint8_t smbpo_eref; /* external reference designator */ 22284ab085aSmws uint8_t smbpo_etype; /* external connector type */ 22384ab085aSmws uint8_t smbpo_ptype; /* port type */ 22484ab085aSmws } smb_port_t; 22584ab085aSmws 226a448814aSRobert Mustacchi /* 227a448814aSRobert Mustacchi * SMBIOS implementation structure for SMB_TYPE_SLOT. 228a448814aSRobert Mustacchi */ 229*a60349c8SRobert Mustacchi typedef struct smb_slot_peer { 230*a60349c8SRobert Mustacchi uint16_t smbspb_group_no; /* segment group number */ 231*a60349c8SRobert Mustacchi uint8_t smbspb_bus; /* bus number */ 232*a60349c8SRobert Mustacchi uint8_t smbspb_df; /* device/function number */ 233*a60349c8SRobert Mustacchi uint8_t smbspb_width; /* electrical width */ 234*a60349c8SRobert Mustacchi } smb_slot_peer_t; 235*a60349c8SRobert Mustacchi 23684ab085aSmws typedef struct smb_slot { 23784ab085aSmws smb_header_t smbsl_hdr; /* structure header */ 23884ab085aSmws uint8_t smbsl_name; /* reference designation */ 23984ab085aSmws uint8_t smbsl_type; /* slot type */ 24084ab085aSmws uint8_t smbsl_width; /* slot data bus width */ 24184ab085aSmws uint8_t smbsl_usage; /* current usage */ 24284ab085aSmws uint8_t smbsl_length; /* slot length */ 24384ab085aSmws uint16_t smbsl_id; /* slot ID */ 24484ab085aSmws uint8_t smbsl_ch1; /* slot characteristics 1 */ 24584ab085aSmws uint8_t smbsl_ch2; /* slot characteristics 2 */ 24603f9f63dSTom Pothier uint16_t smbsl_sg; /* segment group number */ 24703f9f63dSTom Pothier uint8_t smbsl_bus; /* bus number */ 24803f9f63dSTom Pothier uint8_t smbsl_df; /* device/function number */ 249*a60349c8SRobert Mustacchi /* Added in SMBIOS 3.2+ */ 250*a60349c8SRobert Mustacchi uint8_t smbsl_dbw; /* Data bus width */ 251*a60349c8SRobert Mustacchi uint8_t smbsl_npeers; /* Peer bdf groups */ 252*a60349c8SRobert Mustacchi smb_slot_peer_t smbsl_peers[]; /* bifurcation peers */ 25384ab085aSmws } smb_slot_t; 25484ab085aSmws 255a448814aSRobert Mustacchi /* 256a448814aSRobert Mustacchi * SMBIOS implementation structure for SMB_TYPE_OBDEVS. 257a448814aSRobert Mustacchi */ 25884ab085aSmws typedef struct smb_obdev { 25984ab085aSmws uint8_t smbob_type; /* encoded type and enable bit */ 2604e901881SDale Ghent uint8_t smbob_name; /* description string */ 26184ab085aSmws } smb_obdev_t; 26284ab085aSmws 26384ab085aSmws #define SMB_OBT_ENABLED 0x80 /* enable bit within smbob_type */ 26484ab085aSmws 265a448814aSRobert Mustacchi /* 266a448814aSRobert Mustacchi * SMBIOS implementation structure for SMB_TYPE_OEMSTR, SMB_TYPE_SYSCONFSTR, 267a448814aSRobert Mustacchi * and SMB_TYPE_LANG. 268a448814aSRobert Mustacchi */ 26984ab085aSmws typedef struct smb_strtab { 27084ab085aSmws smb_header_t smbtb_hdr; /* structure header */ 27184ab085aSmws uint8_t smbtb_count; /* number of strings */ 27284ab085aSmws } smb_strtab_t; 27384ab085aSmws 274a448814aSRobert Mustacchi /* 275a448814aSRobert Mustacchi * SMBIOS implementation structure for SMB_TYPE_LANG. 276a448814aSRobert Mustacchi */ 27784ab085aSmws typedef struct smb_lang { 27884ab085aSmws smb_header_t smblang_hdr; /* structure header */ 27984ab085aSmws uint8_t smblang_num; /* number of installed languages */ 28084ab085aSmws uint8_t smblang_flags; /* flags */ 28184ab085aSmws uint8_t smblang_resv[15]; /* reserved for future use */ 28284ab085aSmws uint8_t smblang_cur; /* current language string */ 28384ab085aSmws } smb_lang_t; 28484ab085aSmws 285a448814aSRobert Mustacchi /* 286a448814aSRobert Mustacchi * SMBIOS implementation structure for SMB_TYPE_EVENTLOG. 287a448814aSRobert Mustacchi */ 28884ab085aSmws typedef struct smb_sel { 28984ab085aSmws smb_header_t smbsel_hdr; /* structure header */ 29084ab085aSmws uint16_t smbsel_len; /* log area length */ 29184ab085aSmws uint16_t smbsel_hdroff; /* header offset */ 29284ab085aSmws uint16_t smbsel_dataoff; /* data offset */ 29384ab085aSmws uint8_t smbsel_method; /* access method */ 29484ab085aSmws uint8_t smbsel_status; /* status flags */ 29584ab085aSmws uint32_t smbsel_token; /* change token */ 29684ab085aSmws uint32_t smbsel_addr; /* access method address */ 29784ab085aSmws uint8_t smbsel_format; /* header format */ 29884ab085aSmws uint8_t smbsel_typec; /* number of type descriptors */ 29984ab085aSmws uint8_t smbsel_typesz; /* size of each type descriptor */ 30084ab085aSmws uint8_t smbsel_typev[1]; /* array of type descriptors */ 30184ab085aSmws } smb_sel_t; 30284ab085aSmws 303a448814aSRobert Mustacchi /* 304a448814aSRobert Mustacchi * SMBIOS implementation structure for SMB_TYPE_MEMARRAY. 305a448814aSRobert Mustacchi */ 30684ab085aSmws typedef struct smb_memarray { 30784ab085aSmws smb_header_t smbmarr_hdr; /* structure header */ 30884ab085aSmws uint8_t smbmarr_loc; /* location */ 30984ab085aSmws uint8_t smbmarr_use; /* use */ 31084ab085aSmws uint8_t smbmarr_ecc; /* error detect/correct mechanism */ 31184ab085aSmws uint32_t smbmarr_cap; /* maximum capacity */ 31284ab085aSmws uint16_t smbmarr_err; /* error handle */ 31384ab085aSmws uint16_t smbmarr_ndevs; /* number of slots or sockets */ 3144e901881SDale Ghent uint64_t smbmarr_extcap; /* extended maximum capacity */ 31584ab085aSmws } smb_memarray_t; 31684ab085aSmws 317a448814aSRobert Mustacchi /* 318a448814aSRobert Mustacchi * SMBIOS implementation structure for SMB_TYPE_MEMARRAYMAP. 319a448814aSRobert Mustacchi */ 32084ab085aSmws typedef struct smb_memarrmap { 32184ab085aSmws smb_header_t smbamap_hdr; /* structure header */ 32284ab085aSmws uint32_t smbamap_start; /* starting address in kilobytes */ 32384ab085aSmws uint32_t smbamap_end; /* ending address in kilobytes */ 32484ab085aSmws uint16_t smbamap_array; /* physical memory array handle */ 32584ab085aSmws uint8_t smbamap_width; /* partition width */ 3264e901881SDale Ghent uint64_t smbamap_extstart; /* extended starting address in bytes */ 3274e901881SDale Ghent uint64_t smbamap_extend; /* extended ending address in bytes */ 32884ab085aSmws } smb_memarrmap_t; 32984ab085aSmws 330a448814aSRobert Mustacchi /* 331a448814aSRobert Mustacchi * SMBIOS implementation structure for SMB_TYPE_MEMDEVICE. 332a448814aSRobert Mustacchi */ 33384ab085aSmws typedef struct smb_memdevice { 33484ab085aSmws smb_header_t smbmdev_hdr; /* structure header */ 33584ab085aSmws uint16_t smbmdev_array; /* array handle */ 33684ab085aSmws uint16_t smbmdev_error; /* error handle */ 33784ab085aSmws uint16_t smbmdev_twidth; /* total width */ 33884ab085aSmws uint16_t smbmdev_dwidth; /* data width */ 33984ab085aSmws uint16_t smbmdev_size; /* size in either K or MB */ 34084ab085aSmws uint8_t smbmdev_form; /* form factor */ 34184ab085aSmws uint8_t smbmdev_set; /* device set */ 34284ab085aSmws uint8_t smbmdev_dloc; /* device locator */ 34384ab085aSmws uint8_t smbmdev_bloc; /* bank locator */ 34484ab085aSmws uint8_t smbmdev_type; /* memory type */ 34584ab085aSmws uint16_t smbmdev_flags; /* detail flags */ 3461eb9e3eaSRobert Mustacchi uint16_t smbmdev_speed; /* speed in MT/s */ 34784ab085aSmws uint8_t smbmdev_manufacturer; /* manufacturer */ 34884ab085aSmws uint8_t smbmdev_serial; /* serial number */ 34984ab085aSmws uint8_t smbmdev_asset; /* asset tag */ 35084ab085aSmws uint8_t smbmdev_part; /* part number */ 3514e901881SDale Ghent uint8_t smbmdev_attrs; /* attributes */ 3524e901881SDale Ghent uint32_t smbmdev_extsize; /* extended size */ 3534e901881SDale Ghent uint16_t smbmdev_clkspeed; /* configured clock speed */ 3544e901881SDale Ghent uint16_t smbmdev_minvolt; /* minimum voltage */ 3554e901881SDale Ghent uint16_t smbmdev_maxvolt; /* maximum voltage */ 3564e901881SDale Ghent uint16_t smbmdev_confvolt; /* configured voltage */ 357*a60349c8SRobert Mustacchi /* Added in SMBIOS 3.2 */ 358*a60349c8SRobert Mustacchi uint8_t smbmdev_memtech; /* memory technology */ 359*a60349c8SRobert Mustacchi uint16_t smbmdev_opmode; /* memory operating mode capability */ 360*a60349c8SRobert Mustacchi uint8_t smbmdev_fwver; /* firmware version */ 361*a60349c8SRobert Mustacchi uint16_t smbmdev_modulemfgid; /* module manufacturer ID */ 362*a60349c8SRobert Mustacchi uint16_t smbmdev_moduleprodid; /* module product ID */ 363*a60349c8SRobert Mustacchi uint16_t smbmdev_memsysmfgid; /* memory controller manufacturer id */ 364*a60349c8SRobert Mustacchi uint16_t smbmdev_memsysprodid; /* memory controller product id */ 365*a60349c8SRobert Mustacchi uint64_t smbmdev_nvsize; /* non-volatile memory size */ 366*a60349c8SRobert Mustacchi uint64_t smbmdev_volsize; /* volatile memory size */ 367*a60349c8SRobert Mustacchi uint64_t smbmdev_cachesize; /* cache size */ 368*a60349c8SRobert Mustacchi uint64_t smbmdev_logicalsize; /* logical size */ 36984ab085aSmws } smb_memdevice_t; 37084ab085aSmws 37184ab085aSmws #define SMB_MDS_KBYTES 0x8000 /* size in specified in kilobytes */ 37284ab085aSmws 373a448814aSRobert Mustacchi /* 374a448814aSRobert Mustacchi * SMBIOS implementation structure for SMB_TYPE_MEMDEVICEMAP. 375a448814aSRobert Mustacchi */ 37684ab085aSmws typedef struct smb_memdevmap { 37784ab085aSmws smb_header_t smbdmap_hdr; /* structure header */ 37884ab085aSmws uint32_t smbdmap_start; /* starting address in kilobytes */ 37984ab085aSmws uint32_t smbdmap_end; /* ending address in kilobytes */ 38084ab085aSmws uint16_t smbdmap_device; /* memory device handle */ 38184ab085aSmws uint16_t smbdmap_array; /* memory array mapped address handle */ 38284ab085aSmws uint8_t smbdmap_rpos; /* row position */ 38384ab085aSmws uint8_t smbdmap_ipos; /* interleave position */ 38484ab085aSmws uint8_t smbdmap_idepth; /* interleave depth */ 3854e901881SDale Ghent uint64_t smbdmap_extstart; /* extended starting address */ 3864e901881SDale Ghent uint64_t smbdmap_extend; /* extended ending address */ 38784ab085aSmws } smb_memdevmap_t; 38884ab085aSmws 389a448814aSRobert Mustacchi /* 390a448814aSRobert Mustacchi * SMBIOS implementation structure for SMB_TYPE_BATTERY. 391a448814aSRobert Mustacchi */ 39284ab085aSmws typedef struct smb_battery { 39384ab085aSmws smb_header_t smbbat_hdr; /* structure header */ 39484ab085aSmws uint8_t smbbat_loc; /* location */ 39584ab085aSmws uint8_t smbbat_manufacturer; /* manufacturer */ 39684ab085aSmws uint8_t smbbat_date; /* manufacture date */ 39784ab085aSmws uint8_t smbbat_serial; /* serial number */ 39884ab085aSmws uint8_t smbbat_devname; /* device name */ 39984ab085aSmws uint8_t smbbat_chem; /* device chemistry */ 40084ab085aSmws uint16_t smbbat_cap; /* design capacity in mW hours */ 40184ab085aSmws uint16_t smbbat_volt; /* design voltage in mV */ 40284ab085aSmws uint8_t smbbat_version; /* SBDS version string */ 40384ab085aSmws uint8_t smbbat_err; /* error percentage */ 40484ab085aSmws uint16_t smbbat_ssn; /* SBDS serial number */ 40584ab085aSmws uint16_t smbbat_sdate; /* SBDS manufacture date */ 40684ab085aSmws uint8_t smbbat_schem; /* SBDS chemistry string */ 40784ab085aSmws uint8_t smbbat_mult; /* design capacity multiplier */ 40884ab085aSmws uint32_t smbbat_oemdata; /* OEM-specific data */ 40984ab085aSmws } smb_battery_t; 41084ab085aSmws 411a448814aSRobert Mustacchi /* 412a448814aSRobert Mustacchi * SMBIOS implementation structure for SMB_TYPE_SECURITY. 413a448814aSRobert Mustacchi */ 41484ab085aSmws typedef struct smb_hwsec { 41584ab085aSmws smb_header_t smbhs_hdr; /* structure header */ 41684ab085aSmws uint8_t smbhs_settings; /* settings byte */ 41784ab085aSmws } smb_hwsec_t; 41884ab085aSmws 41984ab085aSmws #define SMB_HWS_PWR_PS(x) (((x) & 0xC0) >> 6) 42084ab085aSmws #define SMB_HWS_KBD_PS(x) (((x) & 0x30) >> 4) 42184ab085aSmws #define SMB_HWS_ADM_PS(x) (((x) & 0x0C) >> 2) 42284ab085aSmws #define SMB_HWS_PAN_PS(x) (((x) & 0x03) >> 0) 42384ab085aSmws 424a448814aSRobert Mustacchi /* 425a448814aSRobert Mustacchi * SMBIOS implementation structure for SMB_TYPE_VPROBE. 426a448814aSRobert Mustacchi */ 427a448814aSRobert Mustacchi typedef struct smb_vprobe { 428a448814aSRobert Mustacchi smb_header_t smbvpr_hdr; /* structure header */ 429a448814aSRobert Mustacchi uint8_t smbvpr_descr; /* description string */ 430a448814aSRobert Mustacchi uint8_t smbvpr_locstat; /* location and status */ 431a448814aSRobert Mustacchi uint16_t smbvpr_maxval; /* maximum voltage */ 432a448814aSRobert Mustacchi uint16_t smbvpr_minval; /* minimum voltage */ 433a448814aSRobert Mustacchi uint16_t smbvpr_resolution; /* probe resolution */ 434a448814aSRobert Mustacchi uint16_t smbvpr_tolerance; /* probe tolerance */ 435a448814aSRobert Mustacchi uint16_t smbvpr_accuracy; /* probe accuracy */ 436a448814aSRobert Mustacchi uint32_t smbvpr_oem; /* vendor-specific data */ 437a448814aSRobert Mustacchi uint16_t smbvpr_nominal; /* nominal value */ 438a448814aSRobert Mustacchi } smb_vprobe_t; 439a448814aSRobert Mustacchi 440a448814aSRobert Mustacchi #define SMB_VPROBE_MINLEN 0x14 441a448814aSRobert Mustacchi #define SMB_VPROBE_NOMINAL_MINLEN 0x16 442a448814aSRobert Mustacchi 443a448814aSRobert Mustacchi #define SMB_VPROBE_LOCATION(x) ((x) & 0x1f) 444a448814aSRobert Mustacchi #define SMB_VPROBE_STATUS(x) (((x) >> 5) & 0x7) 445a448814aSRobert Mustacchi 446a448814aSRobert Mustacchi /* 447a448814aSRobert Mustacchi * SMBIOS implementation structure for SMB_TYPE_COOLDEV. 448a448814aSRobert Mustacchi */ 449a448814aSRobert Mustacchi typedef struct smb_cooldev { 450a448814aSRobert Mustacchi smb_header_t smbcdev_hdr; /* structure header */ 451a448814aSRobert Mustacchi uint16_t smbcdev_tprobe; /* temperature probe */ 452a448814aSRobert Mustacchi uint8_t smbcdev_typstat; /* type and status */ 453a448814aSRobert Mustacchi uint8_t smbcdev_group; /* group identifier */ 454a448814aSRobert Mustacchi uint32_t smbcdev_oem; /* vendor-specific data */ 455a448814aSRobert Mustacchi uint16_t smbcdev_nominal; /* nominal value */ 456a448814aSRobert Mustacchi uint8_t smbcdev_descr; /* description string */ 457a448814aSRobert Mustacchi } smb_cooldev_t; 458a448814aSRobert Mustacchi 459a448814aSRobert Mustacchi #define SMB_COOLDEV_MINLEN 0x0c 460a448814aSRobert Mustacchi #define SMB_COOLDEV_NOMINAL_MINLEN 0x0e 461a448814aSRobert Mustacchi #define SMB_COOLDEV_DESCR_MINLEN 0x0f 462a448814aSRobert Mustacchi 463a448814aSRobert Mustacchi #define SMB_COOLDEV_TYPE(x) ((x) & 0x1f) 464a448814aSRobert Mustacchi #define SMB_COOLDEV_STATUS(x) (((x) >> 5) & 0x7) 465a448814aSRobert Mustacchi 466a448814aSRobert Mustacchi /* 467a448814aSRobert Mustacchi * SMBIOS implementation structure for SMB_TYPE_TPROBE. 468a448814aSRobert Mustacchi */ 469a448814aSRobert Mustacchi typedef struct smb_tprobe { 470a448814aSRobert Mustacchi smb_header_t smbtpr_hdr; /* structure header */ 471a448814aSRobert Mustacchi uint8_t smbtpr_descr; /* description string */ 472a448814aSRobert Mustacchi uint8_t smbtpr_locstat; /* location and status */ 473a448814aSRobert Mustacchi uint16_t smbtpr_maxval; /* maximum temperature */ 474a448814aSRobert Mustacchi uint16_t smbtpr_minval; /* minimum temperature */ 475a448814aSRobert Mustacchi uint16_t smbtpr_resolution; /* probe resolution */ 476a448814aSRobert Mustacchi uint16_t smbtpr_tolerance; /* probe tolerance */ 477a448814aSRobert Mustacchi uint16_t smbtpr_accuracy; /* probe accuracy */ 478a448814aSRobert Mustacchi uint32_t smbtpr_oem; /* vendor-specific data */ 479a448814aSRobert Mustacchi uint16_t smbtpr_nominal; /* nominal value */ 480a448814aSRobert Mustacchi } smb_tprobe_t; 481a448814aSRobert Mustacchi 482a448814aSRobert Mustacchi #define SMB_TPROBE_MINLEN 0x14 483a448814aSRobert Mustacchi #define SMB_TPROBE_NOMINAL_MINLEN 0x16 484a448814aSRobert Mustacchi 485a448814aSRobert Mustacchi #define SMB_TPROBE_LOCATION(x) ((x) & 0x1f) 486a448814aSRobert Mustacchi #define SMB_TPROBE_STATUS(x) (((x) >> 5) & 0x7) 487a448814aSRobert Mustacchi 488a448814aSRobert Mustacchi /* 489a448814aSRobert Mustacchi * SMBIOS implementation structure for SMB_TYPE_IPROBE. 490a448814aSRobert Mustacchi */ 491a448814aSRobert Mustacchi typedef struct smb_iprobe { 492a448814aSRobert Mustacchi smb_header_t smbipr_hdr; /* structure header */ 493a448814aSRobert Mustacchi uint8_t smbipr_descr; /* description string */ 494a448814aSRobert Mustacchi uint8_t smbipr_locstat; /* location and status */ 495a448814aSRobert Mustacchi uint16_t smbipr_maxval; /* maximum current */ 496a448814aSRobert Mustacchi uint16_t smbipr_minval; /* minimum current */ 497a448814aSRobert Mustacchi uint16_t smbipr_resolution; /* probe resolution */ 498a448814aSRobert Mustacchi uint16_t smbipr_tolerance; /* probe tolerance */ 499a448814aSRobert Mustacchi uint16_t smbipr_accuracy; /* probe accuracy */ 500a448814aSRobert Mustacchi uint32_t smbipr_oem; /* vendor-specific data */ 501a448814aSRobert Mustacchi uint16_t smbipr_nominal; /* nominal value */ 502a448814aSRobert Mustacchi } smb_iprobe_t; 503a448814aSRobert Mustacchi 504a448814aSRobert Mustacchi #define SMB_IPROBE_MINLEN 0x14 505a448814aSRobert Mustacchi #define SMB_IPROBE_NOMINAL_MINLEN 0x16 506a448814aSRobert Mustacchi 507a448814aSRobert Mustacchi #define SMB_IPROBE_LOCATION(x) ((x) & 0x1f) 508a448814aSRobert Mustacchi #define SMB_IPROBE_STATUS(x) (((x) >> 5) & 0x7) 509a448814aSRobert Mustacchi 510a448814aSRobert Mustacchi /* 511a448814aSRobert Mustacchi * SMBIOS implementation structure for SMB_TYPE_BOOT. 512a448814aSRobert Mustacchi */ 51384ab085aSmws typedef struct smb_boot { 51484ab085aSmws smb_header_t smbbo_hdr; /* structure header */ 51584ab085aSmws uint8_t smbbo_pad[6]; /* reserved for future use */ 51684ab085aSmws uint8_t smbbo_status[1]; /* variable-length status buffer */ 51784ab085aSmws } smb_boot_t; 51884ab085aSmws 519a448814aSRobert Mustacchi /* 520a448814aSRobert Mustacchi * SMBIOS implementation structure for SMB_TYPE_IPMIDEV. 521a448814aSRobert Mustacchi */ 52284ab085aSmws typedef struct smb_ipmi { 52384ab085aSmws smb_header_t smbipm_hdr; /* structure header */ 52484ab085aSmws uint8_t smbipm_type; /* interface type */ 52584ab085aSmws uint8_t smbipm_spec; /* specification revision */ 52684ab085aSmws uint8_t smbipm_i2c; /* i2C slave address */ 52784ab085aSmws uint8_t smbipm_bus; /* NV storage device bus ID */ 52884ab085aSmws uint64_t smbipm_addr; /* base address */ 52984ab085aSmws uint8_t smbipm_info; /* base address modifier/intr info */ 53084ab085aSmws uint8_t smbipm_intr; /* interrupt number */ 53184ab085aSmws } smb_ipmi_t; 53284ab085aSmws 53384ab085aSmws #define SMB_IPM_SPEC_MAJOR(x) (((x) & 0xF0) >> 4) 53484ab085aSmws #define SMB_IPM_SPEC_MINOR(x) ((x) & 0x0F) 53584ab085aSmws 53684ab085aSmws #define SMB_IPM_ADDR_IO 1ULL 53784ab085aSmws 53884ab085aSmws #define SMB_IPM_INFO_REGS(x) (((x) & 0xC0) >> 6) 53984ab085aSmws #define SMB_IPM_INFO_LSB(x) (((x) & 0x10) >> 4) 54084ab085aSmws #define SMB_IPM_INFO_ISPEC(x) (((x) & 0x08) >> 3) 54184ab085aSmws #define SMB_IPM_INFO_IPOL(x) (((x) & 0x02) >> 1) 54284ab085aSmws #define SMB_IPM_INFO_IMODE(x) (((x) & 0x01) >> 0) 54384ab085aSmws 54484ab085aSmws #define SMB_IPM_REGS_1B 0 54584ab085aSmws #define SMB_IPM_REGS_4B 1 54684ab085aSmws #define SMB_IPM_REGS_16B 2 54784ab085aSmws 54884ab085aSmws #define SMB_IPM_IPOL_LO 0 54984ab085aSmws #define SMB_IPM_IPOL_HI 1 55084ab085aSmws 55184ab085aSmws #define SMB_IPM_IMODE_EDGE 0 55284ab085aSmws #define SMB_IPM_IMODE_LEVEL 1 55384ab085aSmws 554a448814aSRobert Mustacchi /* 555a448814aSRobert Mustacchi * SMBIOS implementation structure for SMB_TYPE_POWERSUP. 556a448814aSRobert Mustacchi */ 55784ab085aSmws typedef struct smb_powersup { 55884ab085aSmws smb_header_t smbpsup_hdr; /* structure header */ 55984ab085aSmws uint8_t smbpsup_group; /* group id */ 56084ab085aSmws uint8_t smbpsup_loc; /* location tag */ 56184ab085aSmws uint8_t smbpsup_devname; /* device name */ 56284ab085aSmws uint8_t smbpsup_manufacturer; /* manufacturer */ 56384ab085aSmws uint8_t smbpsup_serial; /* serial number */ 56484ab085aSmws uint8_t smbpsup_asset; /* asset tag */ 56584ab085aSmws uint8_t smbpsup_part; /* part number */ 56684ab085aSmws uint8_t smbpsup_rev; /* revision string */ 56784ab085aSmws uint16_t smbpsup_max; /* max output in milliwatts */ 56884ab085aSmws uint16_t smbpsup_char; /* characteristics */ 56984ab085aSmws uint16_t smbpsup_vprobe; /* voltage probe handle */ 57084ab085aSmws uint16_t smbpsup_cooldev; /* cooling device handle */ 57184ab085aSmws uint16_t smbpsup_iprobe; /* current probe handle */ 57284ab085aSmws } smb_powersup_t; 57384ab085aSmws 57465fa020fSRobert Mustacchi #define SMB_PSU_CHARS_ISHOT(x) ((x) & 0x01) 57565fa020fSRobert Mustacchi #define SMB_PSU_CHARS_ISPRES(x) ((x) & 0x02) 57665fa020fSRobert Mustacchi #define SMB_PSU_CHARS_ISUNPLUG(x) ((x) & 0x04) 57765fa020fSRobert Mustacchi #define SMB_PSU_CHARS_IVRS(x) (((x) >> 3) & 0xf) 57865fa020fSRobert Mustacchi #define SMB_PSU_CHARS_STATUS(x) (((x) >> 7) & 0x7) 57965fa020fSRobert Mustacchi #define SMB_PSU_CHARS_TYPE(x) (((x) >> 10) & 0xf) 58065fa020fSRobert Mustacchi 581a448814aSRobert Mustacchi /* 582a448814aSRobert Mustacchi * SMBIOS implementation structure for SMB_TYPE_OBDEVEXT. 583a448814aSRobert Mustacchi */ 58403f9f63dSTom Pothier typedef struct smb_obdev_ext { 58503f9f63dSTom Pothier smb_header_t smbobe_hdr; /* structure header */ 58603f9f63dSTom Pothier uint8_t smbobe_name; /* reference designation */ 58703f9f63dSTom Pothier uint8_t smbobe_dtype; /* device type */ 58803f9f63dSTom Pothier uint8_t smbobe_dti; /* device type instance */ 58903f9f63dSTom Pothier uint16_t smbobe_sg; /* segment group number */ 59003f9f63dSTom Pothier uint8_t smbobe_bus; /* bus number */ 59103f9f63dSTom Pothier uint8_t smbobe_df; /* device/function number */ 59203f9f63dSTom Pothier } smb_obdev_ext_t; 59303f9f63dSTom Pothier 594a448814aSRobert Mustacchi /* 595a448814aSRobert Mustacchi * SMBIOS implementation structure for SUN_OEM_EXT_PROCESSOR. 596a448814aSRobert Mustacchi */ 597074bb90dSTom Pothier typedef struct smb_processor_ext { 598074bb90dSTom Pothier smb_header_t smbpre_hdr; /* structure header */ 599074bb90dSTom Pothier uint16_t smbpre_processor; /* processor handle */ 600074bb90dSTom Pothier uint8_t smbpre_fru; /* FRU indicator */ 601074bb90dSTom Pothier uint8_t smbpre_n; /* number of APIC IDs */ 602074bb90dSTom Pothier uint16_t smbpre_apicid[1]; /* strand initial apic id */ 603074bb90dSTom Pothier } smb_processor_ext_t; 604074bb90dSTom Pothier 605a448814aSRobert Mustacchi /* 606a448814aSRobert Mustacchi * SMBIOS implementation structure for SUN_OEM_EXT_PORT. 607a448814aSRobert Mustacchi */ 60803f9f63dSTom Pothier typedef struct smb_port_ext { 60903f9f63dSTom Pothier smb_header_t smbpoe_hdr; /* structure header */ 61003f9f63dSTom Pothier uint16_t smbpoe_chassis; /* chassis handle */ 61103f9f63dSTom Pothier uint16_t smbpoe_port; /* port connector handle */ 61203f9f63dSTom Pothier uint8_t smbpoe_dtype; /* device type */ 61303f9f63dSTom Pothier uint16_t smbpoe_devhdl; /* device handle */ 61403f9f63dSTom Pothier uint8_t smbpoe_phy; /* PHY number */ 61503f9f63dSTom Pothier } smb_port_ext_t; 61603f9f63dSTom Pothier 617a448814aSRobert Mustacchi /* 618a448814aSRobert Mustacchi * SMBIOS implementation structure for SUN_OEM_PCIEXRC. 619a448814aSRobert Mustacchi */ 620074bb90dSTom Pothier typedef struct smb_pciexrc { 621074bb90dSTom Pothier smb_header_t smbpciexrc_hdr; /* structure header */ 622074bb90dSTom Pothier uint16_t smbpciexrc_bboard; /* base board handle */ 623074bb90dSTom Pothier uint16_t smbpciexrc_bdf; /* PCI Bus/Dev/Func */ 624074bb90dSTom Pothier } smb_pciexrc_t; 625074bb90dSTom Pothier 626a448814aSRobert Mustacchi /* 627a448814aSRobert Mustacchi * SMBIOS implementation structure for SUN_OEM_EXT_MEMARRAY. 628a448814aSRobert Mustacchi */ 629074bb90dSTom Pothier typedef struct smb_memarray_ext { 630074bb90dSTom Pothier smb_header_t smbmarre_hdr; /* structure header */ 631074bb90dSTom Pothier uint16_t smbmarre_ma; /* memory array handle */ 632074bb90dSTom Pothier uint16_t smbmarre_component; /* component parent handle */ 633074bb90dSTom Pothier uint16_t smbmarre_bdf; /* PCI bus/dev/funct */ 634074bb90dSTom Pothier } smb_memarray_ext_t; 635074bb90dSTom Pothier 636a448814aSRobert Mustacchi /* 637a448814aSRobert Mustacchi * SMBIOS implementation structure for SUN_OEM_EXT_MEMDEVICE. 638a448814aSRobert Mustacchi */ 639074bb90dSTom Pothier typedef struct smb_memdevice_ext { 640074bb90dSTom Pothier smb_header_t smbmdeve_hdr; /* structure header */ 641074bb90dSTom Pothier uint16_t smbmdeve_mdev; /* memory device handle */ 642074bb90dSTom Pothier uint8_t smbmdeve_dchan; /* DRAM channel */ 643074bb90dSTom Pothier uint8_t smbmdeve_ncs; /* number of chip select */ 644074bb90dSTom Pothier uint8_t smbmdeve_cs[1]; /* chip selects */ 645074bb90dSTom Pothier } smb_memdevice_ext_t; 646074bb90dSTom Pothier 64784ab085aSmws #pragma pack() 64884ab085aSmws 64984ab085aSmws typedef struct smb_struct { 65084ab085aSmws const smb_header_t *smbst_hdr; /* address of raw structure data */ 65184ab085aSmws const uchar_t *smbst_str; /* address of string data (if any) */ 65284ab085aSmws const uchar_t *smbst_end; /* address of 0x0000 ending tag */ 65384ab085aSmws struct smb_struct *smbst_next; /* next structure in hash chain */ 65484ab085aSmws uint16_t *smbst_strtab; /* string index -> offset table */ 65584ab085aSmws uint_t smbst_strtablen; /* length of smbst_strtab */ 65684ab085aSmws } smb_struct_t; 65784ab085aSmws 65884ab085aSmws struct smbios_hdl { 659af349cd6SToomas Soome smbios_entry_point_t sh_ent_type; /* structure table entry point type */ 66084ab085aSmws smbios_entry_t sh_ent; /* structure table entry point */ 661af349cd6SToomas Soome uint_t sh_ent_stnum; /* number of structure table entries */ 66284ab085aSmws const void *sh_buf; /* structure table buffer */ 66384ab085aSmws size_t sh_buflen; /* size of structure table buffer */ 66484ab085aSmws smb_struct_t *sh_structs; /* array of structure descriptors */ 66584ab085aSmws uint_t sh_nstructs; /* number of active structures */ 66684ab085aSmws smb_struct_t **sh_hash; /* hash bucket array for descriptors */ 66784ab085aSmws uint_t sh_hashlen; /* hash bucket array length */ 66884ab085aSmws int sh_err; /* error code for smbios_errno() */ 66984ab085aSmws int sh_libvers; /* library client abi version */ 67084ab085aSmws int sh_smbvers; /* derived underlying format version */ 67184ab085aSmws uint_t sh_flags; /* miscellaneous flags (see below) */ 67284ab085aSmws }; 67384ab085aSmws 67484ab085aSmws #define SMB_FL_DEBUG 0x1 /* print debug messages for this hdl */ 67584ab085aSmws #define SMB_FL_BUFALLOC 0x2 /* sh_buf was allocated by library */ 676dabec466SJonathan Matthew #define SMB_FL_TRUNC 0x4 /* smbios table is truncated */ 67784ab085aSmws 67884ab085aSmws #define SMB_BIOS_DEVICE "/dev/xsvc" /* device w/ BIOS physmem */ 67984ab085aSmws #define SMB_SMBIOS_DEVICE "/dev/smbios" /* device w/ SMBIOS image */ 68084ab085aSmws 68184ab085aSmws #define SMB_RANGE_START 0xF0000 /* start of physical address range */ 68284ab085aSmws #define SMB_RANGE_LIMIT 0xFFFFF /* limit of physical address range */ 683a009cb8cSToomas Soome #define SMB_SCAN_STEP 16 /* stepping by paragraph */ 68484ab085aSmws 685a448814aSRobert Mustacchi #define SMB_MAJMIN(M, m) ((((M) & 0xFF) << 8) | ((m) & 0xFF)) 68684ab085aSmws #define SMB_MAJOR(v) (((v) & 0xFF00) >> 8) 68784ab085aSmws #define SMB_MINOR(v) (((v) & 0x00FF)) 68884ab085aSmws 68984ab085aSmws #define ESMB_BASE 1000 /* base value for libsmbios errnos */ 69084ab085aSmws 69184ab085aSmws enum { 69284ab085aSmws ESMB_NOTFOUND = ESMB_BASE, /* SMBIOS table not found on system */ 69384ab085aSmws ESMB_MAPDEV, /* failed to map SMBIOS table */ 69484ab085aSmws ESMB_NOENT, /* failed to locate structure */ 69584ab085aSmws ESMB_NOMEM, /* failed to allocate memory */ 69684ab085aSmws ESMB_NOHDR, /* failed to read SMBIOS header */ 69784ab085aSmws ESMB_NOSTAB, /* failed to read SMBIOS struct table */ 69884ab085aSmws ESMB_NOINFO, /* no common info for structure */ 69984ab085aSmws ESMB_SHORT, /* buffer length doesn't match header */ 70084ab085aSmws ESMB_CORRUPT, /* buffer struct or len is corrupt */ 70184ab085aSmws ESMB_VERSION, /* version not supported by library */ 70284ab085aSmws ESMB_NOTSUP, /* feature not supported by provider */ 70384ab085aSmws ESMB_HEADER, /* SMBIOS header corrupt or invalid */ 70484ab085aSmws ESMB_OLD, /* SMBIOS version is too old for us */ 70584ab085aSmws ESMB_NEW, /* SMBIOS version is too new for us */ 70684ab085aSmws ESMB_CKSUM, /* SMBIOS header checksum mismatch */ 70784ab085aSmws ESMB_INVAL, /* invalid function call argument */ 70884ab085aSmws ESMB_TYPE, /* structure type mismatch */ 70984ab085aSmws ESMB_UNKNOWN /* unknown error (maximum value tag) */ 71084ab085aSmws }; 71184ab085aSmws 71284ab085aSmws extern const smb_struct_t *smb_lookup_type(smbios_hdl_t *, uint_t); 71384ab085aSmws extern const smb_struct_t *smb_lookup_id(smbios_hdl_t *, uint_t); 71484ab085aSmws extern const char *smb_strptr(const smb_struct_t *, uint_t); 71584ab085aSmws extern int smb_gteq(smbios_hdl_t *, int); 7161eb9e3eaSRobert Mustacchi extern int smb_libgteq(smbios_hdl_t *, int); 71784ab085aSmws 71884ab085aSmws extern int smb_set_errno(smbios_hdl_t *, int); 71984ab085aSmws extern smbios_hdl_t *smb_open_error(smbios_hdl_t *, int *, int); 72084ab085aSmws extern const char *smb_strerror(int); 72184ab085aSmws 72284ab085aSmws extern void *smb_alloc(size_t); 72384ab085aSmws extern void *smb_zalloc(size_t); 72484ab085aSmws extern void smb_free(void *, size_t); 72584ab085aSmws 72684ab085aSmws extern void smb_dprintf(smbios_hdl_t *, const char *, ...); 72784ab085aSmws 72884ab085aSmws extern int _smb_debug; 72984ab085aSmws 73004cdb0e3SRobert Mustacchi /* 73104cdb0e3SRobert Mustacchi * The following series of structures represent the base versions of public 73204cdb0e3SRobert Mustacchi * structures that are used inside by the smbios routines. This allows the 73304cdb0e3SRobert Mustacchi * common code to properly know how much it should or should not bzero and how 73404cdb0e3SRobert Mustacchi * to handle additions to the spec. Types should only be added here if we need 73504cdb0e3SRobert Mustacchi * to extend the public structures in sys/smbios.h due to a change in the spec. 73604cdb0e3SRobert Mustacchi * 73704cdb0e3SRobert Mustacchi * Types here have the name smb_base_%s which corresponds to smbios_%s. 73804cdb0e3SRobert Mustacchi */ 73904cdb0e3SRobert Mustacchi typedef struct smb_base_chassis { 74004cdb0e3SRobert Mustacchi uint32_t smbbc_oemdata; /* OEM-specific data */ 74104cdb0e3SRobert Mustacchi uint8_t smbbc_lock; /* lock present? */ 74204cdb0e3SRobert Mustacchi uint8_t smbbc_type; /* type */ 74304cdb0e3SRobert Mustacchi uint8_t smbbc_bustate; /* boot-up state */ 74404cdb0e3SRobert Mustacchi uint8_t smbbc_psstate; /* power supply state */ 74504cdb0e3SRobert Mustacchi uint8_t smbbc_thstate; /* thermal state */ 74604cdb0e3SRobert Mustacchi uint8_t smbbc_security; /* security status */ 74704cdb0e3SRobert Mustacchi uint8_t smbbc_uheight; /* enclosure height in U's */ 74804cdb0e3SRobert Mustacchi uint8_t smbbc_cords; /* number of power cords */ 74904cdb0e3SRobert Mustacchi uint8_t smbbc_elems; /* number of element records (n) */ 75004cdb0e3SRobert Mustacchi uint8_t smbbc_elemlen; /* length of contained element (m) */ 75104cdb0e3SRobert Mustacchi } smb_base_chassis_t; 75204cdb0e3SRobert Mustacchi 75304cdb0e3SRobert Mustacchi typedef struct smb_base_processor { 75404cdb0e3SRobert Mustacchi uint64_t smbbp_cpuid; /* processor cpuid information */ 75504cdb0e3SRobert Mustacchi uint32_t smbbp_family; /* processor family */ 75604cdb0e3SRobert Mustacchi uint8_t smbbp_type; /* processor type (SMB_PRT_*) */ 75704cdb0e3SRobert Mustacchi uint8_t smbbp_voltage; /* voltage (SMB_PRV_*) */ 75804cdb0e3SRobert Mustacchi uint8_t smbbp_status; /* status (SMB_PRS_*) */ 75904cdb0e3SRobert Mustacchi uint8_t smbbp_upgrade; /* upgrade (SMB_PRU_*) */ 76004cdb0e3SRobert Mustacchi uint32_t smbbp_clkspeed; /* external clock speed in MHz */ 76104cdb0e3SRobert Mustacchi uint32_t smbbp_maxspeed; /* maximum speed in MHz */ 76204cdb0e3SRobert Mustacchi uint32_t smbbp_curspeed; /* current speed in MHz */ 76304cdb0e3SRobert Mustacchi id_t smbbp_l1cache; /* L1 cache handle */ 76404cdb0e3SRobert Mustacchi id_t smbbp_l2cache; /* L2 cache handle */ 76504cdb0e3SRobert Mustacchi id_t smbbp_l3cache; /* L3 cache handle */ 76604cdb0e3SRobert Mustacchi } smb_base_processor_t; 76704cdb0e3SRobert Mustacchi 76804cdb0e3SRobert Mustacchi typedef struct smb_base_memdevice { 76904cdb0e3SRobert Mustacchi id_t smbbmd_array; /* handle of physical memory array */ 77004cdb0e3SRobert Mustacchi id_t smbbmd_error; /* handle of memory error data */ 77104cdb0e3SRobert Mustacchi uint32_t smbbmd_twidth; /* total width in bits including ecc */ 77204cdb0e3SRobert Mustacchi uint32_t smbbmd_dwidth; /* data width in bits */ 77304cdb0e3SRobert Mustacchi uint64_t smbbmd_size; /* size in bytes (see note above) */ 77404cdb0e3SRobert Mustacchi uint8_t smbbmd_form; /* form factor */ 77504cdb0e3SRobert Mustacchi uint8_t smbbmd_set; /* set (0x00=none, 0xFF=unknown) */ 77604cdb0e3SRobert Mustacchi uint8_t smbbmd_type; /* memory type */ 77704cdb0e3SRobert Mustacchi uint8_t smbbmd_pad; /* padding */ 77804cdb0e3SRobert Mustacchi uint32_t smbbmd_flags; /* flags (see below) */ 77904cdb0e3SRobert Mustacchi uint32_t smbbmd_speed; /* speed in MHz */ 78004cdb0e3SRobert Mustacchi const char *smbbmd_dloc; /* physical device locator string */ 78104cdb0e3SRobert Mustacchi const char *smbbmd_bloc; /* physical bank locator string */ 78204cdb0e3SRobert Mustacchi uint8_t smbbmd_rank; /* rank */ 78304cdb0e3SRobert Mustacchi } smb_base_memdevice_t; 78404cdb0e3SRobert Mustacchi 7851eb9e3eaSRobert Mustacchi typedef struct smb_base_bios { 7861eb9e3eaSRobert Mustacchi const char *smbbb_vendor; /* bios vendor string */ 7871eb9e3eaSRobert Mustacchi const char *smbbb_version; /* bios version string */ 7881eb9e3eaSRobert Mustacchi const char *smbbb_reldate; /* bios release date */ 7891eb9e3eaSRobert Mustacchi uint32_t smbbb_segment; /* bios address segment location */ 7901eb9e3eaSRobert Mustacchi uint32_t smbbb_romsize; /* bios rom size in bytes */ 7911eb9e3eaSRobert Mustacchi uint32_t smbbb_runsize; /* bios image size in bytes */ 7921eb9e3eaSRobert Mustacchi uint64_t smbbb_cflags; /* bios characteristics */ 7931eb9e3eaSRobert Mustacchi const uint8_t *smbbb_xcflags; /* bios characteristics extensions */ 7941eb9e3eaSRobert Mustacchi size_t smbbb_nxcflags; /* number of smbb_xcflags[] bytes */ 7951eb9e3eaSRobert Mustacchi smbios_version_t smbbb_biosv; /* bios version */ 7961eb9e3eaSRobert Mustacchi smbios_version_t smbbb_ecfwv; /* bios embedded ctrl f/w version */ 7971eb9e3eaSRobert Mustacchi } smb_base_bios_t; 7981eb9e3eaSRobert Mustacchi 7991eb9e3eaSRobert Mustacchi typedef struct smb_base_cache { 8001eb9e3eaSRobert Mustacchi uint32_t smbba_maxsize; /* maximum installed size in bytes */ 8011eb9e3eaSRobert Mustacchi uint32_t smbba_size; /* installed size in bytes */ 8021eb9e3eaSRobert Mustacchi uint16_t smbba_stype; /* supported SRAM types (SMB_CAT_*) */ 8031eb9e3eaSRobert Mustacchi uint16_t smbba_ctype; /* current SRAM type (SMB_CAT_*) */ 8041eb9e3eaSRobert Mustacchi uint8_t smbba_speed; /* speed in nanoseconds */ 8051eb9e3eaSRobert Mustacchi uint8_t smbba_etype; /* error correction type (SMB_CAE_*) */ 8061eb9e3eaSRobert Mustacchi uint8_t smbba_ltype; /* logical cache type (SMB_CAG_*) */ 8071eb9e3eaSRobert Mustacchi uint8_t smbba_assoc; /* associativity (SMB_CAA_*) */ 8081eb9e3eaSRobert Mustacchi uint8_t smbba_level; /* cache level */ 8091eb9e3eaSRobert Mustacchi uint8_t smbba_mode; /* cache mode (SMB_CAM_*) */ 8101eb9e3eaSRobert Mustacchi uint8_t smbba_location; /* cache location (SMB_CAL_*) */ 8111eb9e3eaSRobert Mustacchi uint8_t smbba_flags; /* cache flags (SMB_CAF_*) */ 8121eb9e3eaSRobert Mustacchi } smb_base_cache_t; 81304cdb0e3SRobert Mustacchi 814*a60349c8SRobert Mustacchi typedef struct smb_base_slot { 815*a60349c8SRobert Mustacchi const char *smbbl_name; /* reference designation */ 816*a60349c8SRobert Mustacchi uint8_t smbbl_type; /* slot type */ 817*a60349c8SRobert Mustacchi uint8_t smbbl_width; /* slot data bus width */ 818*a60349c8SRobert Mustacchi uint8_t smbbl_usage; /* current usage */ 819*a60349c8SRobert Mustacchi uint8_t smbbl_length; /* slot length */ 820*a60349c8SRobert Mustacchi uint16_t smbbl_id; /* slot ID */ 821*a60349c8SRobert Mustacchi uint8_t smbbl_ch1; /* slot characteristics 1 */ 822*a60349c8SRobert Mustacchi uint8_t smbbl_ch2; /* slot characteristics 2 */ 823*a60349c8SRobert Mustacchi uint16_t smbbl_sg; /* segment group number */ 824*a60349c8SRobert Mustacchi uint8_t smbbl_bus; /* bus number */ 825*a60349c8SRobert Mustacchi uint8_t smbbl_df; /* device/function number */ 826*a60349c8SRobert Mustacchi } smb_base_slot_t; 827*a60349c8SRobert Mustacchi 82884ab085aSmws #ifdef __cplusplus 82984ab085aSmws } 83084ab085aSmws #endif 83184ab085aSmws 83284ab085aSmws #endif /* _SYS_SMBIOS_IMPL_H */ 833