Home | History | Annotate | Download | only in common
      1 /*
      2  * CDDL HEADER START
      3  *
      4  * The contents of this file are subject to the terms of the
      5  * Common Development and Distribution License (the "License").
      6  * You may not use this file except in compliance with the License.
      7  *
      8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
      9  * or http://www.opensolaris.org/os/licensing.
     10  * See the License for the specific language governing permissions
     11  * and limitations under the License.
     12  *
     13  * When distributing Covered Code, include this CDDL HEADER in each
     14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     15  * If applicable, add the following below this CDDL HEADER, with the
     16  * fields enclosed by brackets "[]" replaced with your own identifying
     17  * information: Portions Copyright [yyyy] [name of copyright owner]
     18  *
     19  * CDDL HEADER END
     20  */
     21 /*
     22  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
     23  * Use is subject to license terms.
     24  */
     25 
     26 #ifndef	_LIBIPMI_H
     27 #define	_LIBIPMI_H
     28 
     29 #include <sys/bmc_intf.h>
     30 #include <sys/byteorder.h>
     31 #include <sys/sysmacros.h>
     32 
     33 /*
     34  * Private interfaces for communicating with attached services over IPMI.  This
     35  * library is designed for system software communicating with Sun-supported
     36  * service processors over /dev/bmc.  It is not a generic IPMI library.
     37  *
     38  * Documentation references refer to "Intelligent Platform Management Interface
     39  * Specification Second Generation v2.0", document revision 1.0 with Februrary
     40  * 15, 2006 Markup from "IPMI v2.0 Addenda, Errata, and Clarifications Revision
     41  * 3".
     42  */
     43 
     44 #ifdef	__cplusplus
     45 extern "C" {
     46 #endif
     47 
     48 typedef struct ipmi_handle ipmi_handle_t;
     49 
     50 #pragma pack(1)
     51 
     52 /*
     53  * Basic netfn definitions.  See section 5.1.
     54  */
     55 #define	IPMI_NETFN_APP			BMC_NETFN_APP
     56 #define	IPMI_NETFN_STORAGE		BMC_NETFN_STORAGE
     57 #define	IPMI_NETFN_SE			BMC_NETFN_SE
     58 #define	IPMI_NETFN_TRANSPORT		0x0C
     59 #define	IPMI_NETFN_OEM			0x2e
     60 
     61 /*
     62  * Error definitions
     63  */
     64 #define	EIPMI_BASE	2000
     65 
     66 typedef enum {
     67 	EIPMI_NOMEM = EIPMI_BASE,	/* memory allocation failure */
     68 	EIPMI_BMC_OPEN_FAILED,		/* failed to open /dev/bmc */
     69 	EIPMI_BMC_PUTMSG,		/* failed to send message to /dev/bmc */
     70 	EIPMI_BMC_GETMSG,	/* failed to read response from /dev/bmc */
     71 	EIPMI_BMC_RESPONSE,		/* response from /dev/bmc failed */
     72 	EIPMI_INVALID_COMMAND,		/* invalid command */
     73 	EIPMI_COMMAND_TIMEOUT,		/* command timeout */
     74 	EIPMI_DATA_LENGTH_EXCEEDED,	/* maximum data length exceeded */
     75 	EIPMI_SEND_FAILED,		/* failed to send BMC request */
     76 	EIPMI_UNSPECIFIED,		/* unspecified BMC error */
     77 	EIPMI_UNKNOWN,			/* unknown error */
     78 	EIPMI_BAD_RESPONSE,		/* received unexpected response */
     79 	EIPMI_BAD_RESPONSE_LENGTH,	/* unexpected response length */
     80 	EIPMI_INVALID_RESERVATION,	/* invalid or cancelled reservation */
     81 	EIPMI_NOT_PRESENT,		/* requested entity not present */
     82 	EIPMI_INVALID_REQUEST,		/* malformed request data */
     83 	EIPMI_BUSY,			/* service processor is busy */
     84 	EIPMI_NOSPACE,			/* service processor is out of space */
     85 	EIPMI_UNAVAILABLE,		/* service processor is unavailable */
     86 	EIPMI_ACCESS,			/* insufficient privileges */
     87 	EIPMI_BADPARAM,			/* parameter is not supported */
     88 	EIPMI_READONLY,			/* attempt to write read-only param */
     89 	EIPMI_WRITEONLY			/* attempt to read write-only param */
     90 } ipmi_errno_t;
     91 
     92 /*
     93  * Basic library functions.
     94  *
     95  * The ipmi_handle is the primary interface to the library.  The library itself
     96  * is not MT-safe, but it is safe within a single handle.  Multithreaded clients
     97  * should either open multiple handles, or otherwise synchronize access to the
     98  * same handle.
     99  *
    100  * There is a single command response buffer that is stored with the handle, to
    101  * simplify memory management in the caller.  The memory referenced by a command
    102  * response is only valid until the next command is issued.  The caller is
    103  * responsible for making a copy of the response if it is needed.
    104  */
    105 extern ipmi_handle_t *ipmi_open(int *, char **);
    106 extern void ipmi_close(ipmi_handle_t *);
    107 
    108 extern int ipmi_errno(ipmi_handle_t *);
    109 extern const char *ipmi_errmsg(ipmi_handle_t *);
    110 
    111 /*
    112  * Raw requests.  See section 5.
    113  */
    114 typedef struct ipmi_cmd {
    115 	uint8_t		ic_netfn:6;
    116 	uint8_t		ic_lun:2;
    117 	uint8_t		ic_cmd;
    118 	uint16_t	ic_dlen;
    119 	void		*ic_data;
    120 } ipmi_cmd_t;
    121 
    122 extern ipmi_cmd_t *ipmi_send(ipmi_handle_t *, ipmi_cmd_t *);
    123 
    124 /*
    125  * Retrieve basic information about the IPMI device.  See section 20.1 "Get
    126  * Device ID Command".
    127  */
    128 #define	IPMI_CMD_GET_DEVICEID		0x01
    129 
    130 typedef struct ipmi_deviceid {
    131 	uint8_t		id_devid;
    132 	DECL_BITFIELD3(
    133 	    id_dev_rev		:4,
    134 	    __reserved		:3,
    135 	    id_dev_sdrs		:1);
    136 	DECL_BITFIELD2(
    137 	    id_firm_major	:7,
    138 	    id_dev_available	:1);
    139 	uint8_t		id_firm_minor;
    140 	uint8_t		id_ipmi_rev;
    141 	uint8_t		id_dev_support;
    142 	uint8_t		id_manufacturer[3];
    143 	uint16_t	id_product;
    144 } ipmi_deviceid_t;
    145 
    146 #define	IPMI_OEM_SUN		0x2a
    147 #define	IPMI_PROD_SUN_ILOM	0x4701
    148 
    149 ipmi_deviceid_t *ipmi_get_deviceid(ipmi_handle_t *);
    150 
    151 #define	ipmi_devid_manufacturer(dp)		\
    152 	((dp)->id_manufacturer[0] |		\
    153 	((dp)->id_manufacturer[1] << 8) |	\
    154 	((dp)->id_manufacturer[2] << 16))
    155 
    156 const char *ipmi_firmware_version(ipmi_handle_t *);
    157 
    158 /*
    159  * Get Channel Info.  See section 22.24.
    160  */
    161 typedef struct ipmi_channel_info {
    162 	DECL_BITFIELD2(
    163 	    ici_number		:4,
    164 	    __reserved1		:4);
    165 	DECL_BITFIELD2(
    166 	    ici_medium		:7,
    167 	    __reserved2		:1);
    168 	DECL_BITFIELD2(
    169 	    ici_protocol	:5,
    170 	    __reserved3		:3);
    171 	DECL_BITFIELD3(
    172 	    ici_session_count	:6,
    173 	    ici_single_session	:1,
    174 	    ici_multi_Session	:1);
    175 	uint8_t		ici_vendor[3];
    176 	uint8_t		ici_auxinfo[2];
    177 } ipmi_channel_info_t;
    178 
    179 #define	IPMI_CMD_GET_CHANNEL_INFO	0x42
    180 
    181 /*
    182  * Channel Numbers.  See section 6.3.
    183  */
    184 #define	IPMI_CHANNEL_PRIMARY		0x0
    185 #define	IPMI_CHANNEL_MIN		0x1
    186 #define	IPMI_CHANNEL_MAX		0xB
    187 #define	IPMI_CHANNEL_CURRENT		0xE
    188 #define	IPMI_CHANNEL_SYSTEM		0xF
    189 
    190 extern ipmi_channel_info_t *ipmi_get_channel_info(ipmi_handle_t *, int);
    191 
    192 /*
    193  * Channel Protocol Types.  See section 6.4.
    194  */
    195 #define	IPMI_PROTOCOL_IPMB		0x1
    196 #define	IPMI_PROTOCOL_ICMB		0x2
    197 #define	IPMI_PROTOCOL_SMBUS		0x4
    198 #define	IPMI_PROTOCOL_KCS		0x5
    199 #define	IPMI_PROTOCOL_SMIC		0x6
    200 #define	IPMI_PROTOCOL_BT10		0x7
    201 #define	IPMI_PROTOCOL_BT15		0x8
    202 #define	IPMI_PROTOCOL_TMODE		0x9
    203 #define	IPMI_PROTOCOL_OEM1		0xC
    204 #define	IPMI_PROTOCOL_OEM2		0xD
    205 #define	IPMI_PROTOCOL_OEM3		0xE
    206 #define	IPMI_PROTOCOL_OEM4		0xF
    207 
    208 /*
    209  * Channel Medium Types.  See section 6.5.
    210  */
    211 #define	IPMI_MEDIUM_IPMB		0x1
    212 #define	IPMI_MEDIUM_ICMB10		0x2
    213 #define	IPMI_MEDIUM_ICMB09		0x3
    214 #define	IPMI_MEDIUM_8023LAN		0x4
    215 #define	IPMI_MEDIUM_RS232		0x5
    216 #define	IPMI_MEDIUM_OTHERLAN		0x6
    217 #define	IPMI_MEDIUM_PCISMBUS		0x7
    218 #define	IPMI_MEDIUM_SMBUS10		0x8
    219 #define	IPMI_MEDIUM_SMBUS20		0x9
    220 #define	IPMI_MEDIUM_USB1		0xA
    221 #define	IPMI_MEDIUM_USB2		0xB
    222 #define	IPMI_MEDIUM_SYSTEM		0xC
    223 
    224 /*
    225  * LAN Configuration.  See section 23.  While the underlying mechanism is
    226  * implemented via a sequence of get/set parameter commands, we assume that
    227  * consumers prefer to get and set information in chunks, and therefore expose
    228  * the configuration as a structure, with some of the less useful fields
    229  * removed.  When making changes, the consumer specifies which fields to apply
    230  * along with the structure the library takes care of the rest of the work.
    231  *
    232  * This can be expanded in the future as needed.
    233  */
    234 
    235 typedef struct ipmi_lan_config {
    236 	boolean_t	ilc_set_in_progress;
    237 	uint32_t	ilc_ipaddr;
    238 	uint8_t		ilc_ipaddr_source;
    239 	uint8_t		ilc_macaddr[6];
    240 	uint32_t	ilc_subnet;
    241 	uint32_t	ilc_gateway_addr;
    242 } ipmi_lan_config_t;
    243 
    244 #define	IPMI_LAN_SRC_UNSPECIFIED	0x0
    245 #define	IPMI_LAN_SRC_STATIC		0x1
    246 #define	IPMI_LAN_SRC_DHCP		0x2
    247 #define	IPMI_LAN_SRC_BIOS		0x3
    248 #define	IPMI_LAN_SRC_OTHER		0x4
    249 
    250 #define	IPMI_LAN_SET_IPADDR		0x01
    251 #define	IPMI_LAN_SET_IPADDR_SOURCE	0x02
    252 #define	IPMI_LAN_SET_MACADDR		0x04
    253 #define	IPMI_LAN_SET_SUBNET		0x08
    254 #define	IPMI_LAN_SET_GATEWAY_ADDR	0x10
    255 
    256 #define	IPMI_CMD_SET_LAN_CONFIG		0x01
    257 #define	IPMI_CMD_GET_LAN_CONFIG		0x02
    258 
    259 extern int ipmi_lan_get_config(ipmi_handle_t *, int,
    260     ipmi_lan_config_t *);
    261 extern int ipmi_lan_set_config(ipmi_handle_t *, int, ipmi_lan_config_t *, int);
    262 
    263 /*
    264  * SEL (System Event Log) commands.  Currently the library only provides
    265  * commands for reading the SEL.
    266  */
    267 
    268 /*
    269  * 31.2 Get SEL Info Command
    270  */
    271 #define	IPMI_CMD_GET_SEL_INFO		0x40
    272 
    273 typedef struct ipmi_sel_info {
    274 	uint8_t		isel_version;
    275 	uint16_t	isel_entries;
    276 	uint16_t	isel_free;
    277 	uint32_t	isel_add_ts;
    278 	uint32_t	isel_erase_ts;
    279 	DECL_BITFIELD6(
    280 	    isel_supp_allocation	:1,
    281 	    isel_supp_reserve		:1,
    282 	    isel_supp_partial		:1,
    283 	    isel_supp_delete		:1,
    284 	    __reserved			:3,
    285 	    isel_overflow		:1);
    286 } ipmi_sel_info_t;
    287 
    288 extern ipmi_sel_info_t *ipmi_sel_get_info(ipmi_handle_t *);
    289 extern boolean_t ipmi_sdr_changed(ipmi_handle_t *);
    290 extern int ipmi_sdr_refresh(ipmi_handle_t *);
    291 
    292 /*
    293  * 32.1 SEL Event Records
    294  */
    295 typedef struct ipmi_sel_event {
    296 	uint16_t	isel_ev_next;
    297 	uint16_t	isel_ev_recid;
    298 	uint8_t		isel_ev_rectype;
    299 	uint32_t	isel_ev_ts;
    300 	DECL_BITFIELD2(
    301 	    isel_ev_software	:1,
    302 	    isel_ev_addr_or_id	:7);
    303 	DECL_BITFIELD3(
    304 	    isel_ev_lun		:2,
    305 	    __reserved		:2,
    306 	    isel_ev_channel	:4);
    307 	uint8_t		isel_ev_rev;
    308 	uint8_t		isel_ev_sensor_type;
    309 	uint8_t		isel_ev_sensor_number;
    310 	DECL_BITFIELD2(
    311 	    isel_ev_type	:7,
    312 	    isel_ev_dir		:1);
    313 	uint8_t		isel_ev_data[3];
    314 } ipmi_sel_event_t;
    315 
    316 #define	IPMI_EV_REV15		0x04
    317 #define	IPMI_EV_REV1		0x03
    318 
    319 #define	IPMI_SEL_SYSTEM		0x02
    320 #define	IPMI_SEL_OEMTS_LO	0xC0
    321 #define	IPMI_SEL_OEMTS_HI	0xDF
    322 #define	IPMI_SEL_OEM_LO		0xE0
    323 #define	IPMI_SEL_OEM_HI		0xFF
    324 
    325 #define	IPMI_EV_ASSERT		0x0
    326 #define	IPMI_EV_DEASSERT	0x1
    327 
    328 /*
    329  * 32.2 OEM SEL Record (with timestamp)
    330  */
    331 typedef struct ipmi_sel_oem_ts {
    332 	uint16_t	isel_oem_next;
    333 	uint16_t	isel_oem_id;
    334 	uint8_t		isel_oem_type;
    335 	uint32_t	isel_oem_ts;
    336 	uint8_t		isel_oem_devid[3];
    337 	uint8_t		isel_oem_data[6];
    338 } ipmi_sel_oem_ts_t;
    339 
    340 /*
    341  * 32.3 OEM SEL Record (no timestamp)
    342  */
    343 typedef struct ipmi_sel_oem {
    344 	uint16_t	isel_oem_next;
    345 	uint16_t	isel_oem_id;
    346 	uint8_t		isel_oem_type;
    347 	uint8_t		isel_oem_data[13];
    348 } ipmi_sel_oem_t;
    349 
    350 /*
    351  * 29.3 Platform Event Message Command.
    352  */
    353 typedef struct ipmi_platform_event_message {
    354 	uint8_t		ipem_generator;
    355 	uint8_t		ipem_rev;
    356 	uint8_t		ipem_sensor_type;
    357 	uint8_t		ipem_sensor_num;
    358 	DECL_BITFIELD2(
    359 	    ipem_event_type	:7,
    360 	    ipem_event_dir	:1);
    361 	uint8_t		ipem_event_data[3];
    362 } ipmi_platform_event_message_t;
    363 
    364 #define	IPMI_CMD_PLATFORM_EVENT_MESSAGE	0x02
    365 
    366 extern int ipmi_event_platform_message(ipmi_handle_t *,
    367     ipmi_platform_event_message_t *);
    368 
    369 /*
    370  * 29.7 Event Data Field Formats.  Consumers can cast the data field of the
    371  * event record to the appropriate type depending on the sensor class.
    372  */
    373 
    374 typedef struct ipmi_event_threshold {
    375 	DECL_BITFIELD3(
    376 	    iev_offset		:4,
    377 	    iev_desc_byte3	:2,
    378 	    iev_desc_byte2	:2);
    379 	uint8_t		iev_reading;
    380 	uint8_t		iev_threshold;
    381 } ipmi_event_threshold_t;
    382 
    383 #define	IPMI_EV_DESC_UNSPECIFIED	0x00
    384 #define	IPMI_EV_DESC_TRIGGER		0x01
    385 #define	IPMI_EV_DESC_OEM		0x02
    386 #define	IPMI_EV_DESC_SPECIFIC		0x03
    387 
    388 typedef struct ipmi_event_discrete {
    389 	DECL_BITFIELD3(
    390 	    iev_offset		:4,
    391 	    iev_desc_byte3	:2,
    392 	    iev_desc_byte2	:2);
    393 	DECL_BITFIELD2(
    394 	    iev_offset_type	:4,
    395 	    iev_offset_severity	:4);
    396 	uint8_t		iev_oem_code;
    397 } ipmi_event_discrete_t;
    398 
    399 #define	IPMI_EV_DESC_PREVSTATE		0x01
    400 #define	IPMI_EV_DESC_SPECIFIC		0x03
    401 
    402 typedef struct ipmi_event_oem {
    403 	DECL_BITFIELD3(
    404 	    iev_offset		:4,
    405 	    iev_desc_byte3	:2,
    406 	    iev_desc_byte2	:2);
    407 	DECL_BITFIELD2(
    408 	    iev_offset_type	:4,
    409 	    iev_offset_severity	:4);
    410 	uint8_t		iev_oem_code;
    411 } ipmi_event_oem_t;
    412 
    413 /*
    414  * Get SEL Entry Command.  See section 31.5.  We don't support partial reads, so
    415  * this interface is quite a bit simpler than in the spec.  We default to
    416  * returning event records, though the consumer should check the type field and
    417  * cast it to the appropriate type if it is no IPMI_SEL_SYSTEM.
    418  */
    419 #define	IPMI_CMD_GET_SEL_ENTRY		0x43
    420 
    421 extern ipmi_sel_event_t *ipmi_sel_get_entry(ipmi_handle_t *, uint16_t);
    422 
    423 #define	IPMI_SEL_FIRST_ENTRY		0x0000
    424 #define	IPMI_SEL_LAST_ENTRY		0xFFFF
    425 
    426 /*
    427  * SEL time management.  See sections 31.10 and 31.11.
    428  */
    429 #define	IPMI_CMD_GET_SEL_TIME		0x48
    430 #define	IPMI_CMD_SET_SEL_TIME		0x49
    431 #define	IPMI_CMD_GET_SEL_UTC_OFFSET	0x5C
    432 #define	IPMI_CMD_SET_SEL_UTC_OFFSET	0x5D
    433 
    434 extern int ipmi_sel_get_time(ipmi_handle_t *, uint32_t *);
    435 extern int ipmi_sel_set_time(ipmi_handle_t *, uint32_t);
    436 extern int ipmi_sel_get_utc_offset(ipmi_handle_t *, int *);
    437 extern int ipmi_sel_set_utc_offset(ipmi_handle_t *, int);
    438 
    439 /*
    440  * SDR (Sensor Device Record) requests.  A cache of the current SDR repository
    441  * is kept as part of the IPMI handle and updated when necessary.  This does the
    442  * work of processing the SDR names and providing an easy way to lookup
    443  * individual records and iterate over all records.
    444  */
    445 
    446 /*
    447  * Get SDR Repository Info Command.  See section 33.9.
    448  */
    449 #define	IPMI_CMD_GET_SDR_INFO		0x20
    450 
    451 typedef struct ipmi_sdr_info {
    452 	uint8_t		isi_version;
    453 	uint16_t	isi_record_count;
    454 	uint16_t	isi_free_space;
    455 	uint32_t	isi_add_ts;
    456 	uint32_t	isi_erase_ts;
    457 	DECL_BITFIELD7(
    458 	    isi_supp_allocation		:1,
    459 	    isi_supp_reserve		:1,
    460 	    isi_supp_partial		:1,
    461 	    isi_supp_delete		:1,
    462 	    __reserved			:1,
    463 	    isi_modal			:2,
    464 	    isi_overflow		:1);
    465 } ipmi_sdr_info_t;
    466 
    467 extern ipmi_sdr_info_t *ipmi_sdr_get_info(ipmi_handle_t *);
    468 
    469 /*
    470  * Reserve repository command.  See section 33.11.
    471  */
    472 #define	IPMI_CMD_RESERVE_SDR_REPOSITORY	0x22
    473 
    474 /*
    475  * Get SDR command.  See section 33.12.  This command accesses the raw SDR
    476  * repository.  Clients can also use the lookup functions to retrieve a
    477  * particular SDR record by name.
    478  *
    479  * The list of possible types is indicated in the sub-chapters of section 43.
    480  */
    481 typedef struct ipmi_sdr {
    482 	uint16_t	is_id;
    483 	uint8_t		is_version;
    484 	uint8_t		is_type;
    485 	uint8_t		is_length;
    486 	uint8_t		is_record[1];
    487 } ipmi_sdr_t;
    488 #define	IPMI_CMD_GET_SDR		0x23
    489 
    490 #define	IPMI_SDR_FIRST			0x0000
    491 #define	IPMI_SDR_LAST			0xFFFF
    492 
    493 extern ipmi_sdr_t *ipmi_sdr_get(ipmi_handle_t *, uint16_t, uint16_t *);
    494 
    495 /*
    496  * Full Sensor Record.  See 43.1
    497  */
    498 #define	IPMI_SDR_TYPE_FULL_SENSOR		0x01
    499 
    500 typedef struct ipmi_sdr_full_sensor {
    501 	/* RECORD KEY BYTES */
    502 	uint8_t		is_fs_owner;
    503 	DECL_BITFIELD3(
    504 	    is_fs_sensor_lun			:2,
    505 	    __reserved1				:2,
    506 	    is_fs_channel			:4);
    507 	uint8_t		is_fs_number;
    508 	/* RECORD BODY BYTES */
    509 	uint8_t		is_fs_entity_id;
    510 	DECL_BITFIELD2(
    511 	    is_fs_entity_instance		:7,
    512 	    is_fs_entity_logical		:1);
    513 	DECL_BITFIELD8(
    514 	    is_fs_sensor_scanning_enabled	:1,
    515 	    is_fs_event_generation_enabled	:1,
    516 	    is_fs_init_sensor_type		:1,
    517 	    is_fs_init_hysteresis		:1,
    518 	    is_fs_init_thresholds		:1,
    519 	    is_fs_init_events			:1,
    520 	    is_fs_init_scanning			:1,
    521 	    is_fs_settable			:1);
    522 	DECL_BITFIELD5(
    523 	    is_fs_event_support			:2,
    524 	    is_fs_threshold_support		:2,
    525 	    is_fs_hysteresis_support		:2,
    526 	    is_fs_rearm_support			:1,
    527 	    is_fs_ignore			:1);
    528 	uint8_t		is_fs_type;
    529 	uint8_t		is_fs_reading_type;
    530 	uint16_t	is_fs_assert_mask;
    531 	uint16_t	is_fs_deassert_mask;
    532 	uint16_t	is_fs_reading_mask;
    533 	DECL_BITFIELD4(
    534 	    is_fs_units_isprcnt			:1,
    535 	    is_fs_mod_unit			:2,
    536 	    is_fs_rate_unit			:3,
    537 	    is_fs_analog_fmt			:2);
    538 	uint8_t		is_fs_unit2;
    539 	uint8_t		is_fs_unit3;
    540 	/* Linearization */
    541 	DECL_BITFIELD2(
    542 	    is_fs_sensor_linear_type		:7,
    543 	    __reserved2				:1);
    544 	/* M, Tolerance */
    545 	uint16_t	is_fs_mtol;
    546 	/* B, Accuracy, R exp, B exp */
    547 	uint32_t	is_fs_bacc;
    548 	DECL_BITFIELD4(
    549 	    is_fs_nominal_reading_spec		:1,
    550 	    is_fs_normal_max_spec		:1,
    551 	    is_fs_normal_min_spec		:1,
    552 	    __reserved3				:5);
    553 	uint8_t	is_fs_nominal_reading;
    554 	uint8_t	is_fs_normal_maximum;
    555 	uint8_t	is_fs_normal_minimum;
    556 	uint8_t	is_fs_max;
    557 	uint8_t	is_fs_min;
    558 	uint8_t is_fs_upper_nonrecov;
    559 	uint8_t	is_fs_upper_critical;
    560 	uint8_t	is_fs_upper_noncrit;
    561 	uint8_t	is_fs_lower_nonrecov;
    562 	uint8_t	is_fs_lower_critical;
    563 	uint8_t	is_fs_lower_noncrit;
    564 	uint8_t		is_fs_hysteresis_positive;
    565 	uint8_t		is_fs_hysteresis_negative;
    566 	uint16_t	__reserved4;
    567 	uint8_t		is_fs_oem;
    568 	DECL_BITFIELD3(
    569 	    is_fs_idlen				:5,
    570 	    __reserved5				:1,
    571 	    is_fs_idtype			:2);
    572 	char		is_fs_idstring[1];
    573 } ipmi_sdr_full_sensor_t;
    574 
    575 #define	IPMI_SDR_TYPE_COMPACT_SENSOR		0x02
    576 
    577 /*
    578  * Compact Sensor Record.  See section 43.2
    579  */
    580 typedef struct ipmi_sdr_compact_sensor {
    581 	/* RECORD KEY BYTES */
    582 	uint8_t		is_cs_owner;
    583 	DECL_BITFIELD3(
    584 	    is_cs_sensor_lun			:2,
    585 	    is_cs_fru_lun			:2,
    586 	    is_cs_channel			:4);
    587 	uint8_t		is_cs_number;
    588 	/* RECORD BODY BYTES */
    589 	uint8_t		is_cs_entity_id;
    590 	DECL_BITFIELD2(
    591 	    is_cs_entity_instance		:7,
    592 	    is_cs_entity_logical		:1);
    593 	DECL_BITFIELD8(
    594 	    is_cs_sensor_scanning_enabled	:1,
    595 	    is_cs_event_generation_enabled	:1,
    596 	    is_cs_init_sensor_type		:1,
    597 	    is_cs_init_hysteresis		:1,
    598 	    __reserved1				:1,
    599 	    is_cs_init_events			:1,
    600 	    is_cs_init_scanning			:1,
    601 	    is_cs_settable			:1);
    602 	DECL_BITFIELD5(
    603 	    is_cs_event_support			:2,
    604 	    is_cs_threshold_support		:2,
    605 	    is_cs_hysteresis_support		:2,
    606 	    is_cs_rearm_support			:1,
    607 	    is_cs_ignore			:1);
    608 	uint8_t		is_cs_type;
    609 	uint8_t		is_cs_reading_type;
    610 	uint16_t	is_cs_assert_mask;
    611 	uint16_t	is_cs_deassert_mask;
    612 	uint16_t	is_cs_reading_mask;
    613 	DECL_BITFIELD4(
    614 	    is_cs_units_isprcnt			:1,
    615 	    is_cs_mod_unit			:2,
    616 	    is_cs_rate_unit			:3,
    617 	    __reserved2				:2);
    618 	uint8_t		is_cs_unit2;
    619 	uint8_t		is_cs_unit3;
    620 	DECL_BITFIELD3(
    621 	    is_cs_share_count			:4,
    622 	    is_cs_modifier_type			:2,
    623 	    is_cs_direction			:2);
    624 	DECL_BITFIELD2(
    625 	    is_cs_modifier_offset		:7,
    626 	    is_cs_sharing			:1);
    627 	uint8_t		is_cs_hysteresis_positive;
    628 	uint8_t		is_cs_hysteresis_negative;
    629 	uint16_t	__reserved3;
    630 	uint8_t		__reserved4;
    631 	uint8_t		is_cs_oem;
    632 	DECL_BITFIELD3(
    633 	    is_cs_idlen				:5,
    634 	    __reserved5				:1,
    635 	    is_cs_idtype			:2);
    636 	char		is_cs_idstring[1];
    637 } ipmi_sdr_compact_sensor_t;
    638 
    639 /*
    640  * Threshold sensor masks for is_cs_assert_mask and is_cs_deassert_mask.
    641  */
    642 #define	IPMI_SENSOR_RETURN_NONRECOV	0x4000
    643 #define	IPMI_SENSOR_RETURN_CRIT		0x2000
    644 #define	IPMI_SENSOR_RETURN_NONCRIT	0x1000
    645 
    646 #define	IPMI_SENSOR_MASK_UPPER_NONRECOV_HI	0x0800
    647 #define	IPMI_SENSOR_MASK_UPPER_NONRECOV_LO	0x0400
    648 #define	IPMI_SENSOR_MASK_UPPER_CRIT_HI		0x0200
    649 #define	IPMI_SENSOR_MASK_UPPER_CRIT_LO		0x0100
    650 #define	IPMI_SENSOR_MASK_UPPER_NONCRIT_HI	0x0080
    651 #define	IPMI_SENSOR_MASK_UPPER_NONCRIT_LO	0x0040
    652 #define	IPMI_SENSOR_MASK_LOWER_NONRECOV_HI	0x0020
    653 #define	IPMI_SENSOR_MASK_LOWER_NONRECOV_LO	0x0010
    654 #define	IPMI_SENSOR_MASK_LOWER_CRIT_HI		0x0008
    655 #define	IPMI_SENSOR_MASK_LOWER_CRIT_LO		0x0004
    656 #define	IPMI_SENSOR_MASK_LOWER_NONCRIT_HI	0x0002
    657 #define	IPMI_SENSOR_MASK_LOWER_NONCRIT_LO	0x0001
    658 
    659 /*
    660  * Threshold sensor masks for is_cs_reading_mask.
    661  */
    662 #define	IPMI_SENSOR_SETTABLE_UPPER_NONRECOV	0x2000
    663 #define	IPMI_SENSOR_SETTABLE_UPPER_CRIT		0x1000
    664 #define	IPMI_SENSOR_SETTABLE_UPPER_NONCRIT	0x0800
    665 #define	IPMI_SENSOR_SETTABLE_LOWER_NONRECOV	0x0400
    666 #define	IPMI_SENSOR_SETTABLE_LOWER_CRIT		0x0200
    667 #define	IPMI_SENSOR_SETTABLE_LOWER_NONCRIT	0x0100
    668 #define	IPMI_SENSOR_READABLE_UPPER_NONRECOV	0x0020
    669 #define	IPMI_SENSOR_READABLE_UPPER_CRIT		0x0010
    670 #define	IPMI_SENSOR_READABLE_UPPER_NONCRIT	0x0008
    671 #define	IPMI_SENSOR_READABLE_LOWER_NONRECOV	0x0004
    672 #define	IPMI_SENSOR_READABLE_LOWER_CRIT		0x0002
    673 #define	IPMI_SENSOR_READABLE_LOWER_NONCRIT	0x0001
    674 
    675 /*
    676  * Values for is_cs_reading_type.  See table 42-2.
    677  */
    678 #define	IPMI_RT_THRESHOLD			0x01
    679 #define	IPMI_RT_USAGE				0x02
    680 #define	IPMI_RT_STATE				0x03
    681 #define	IPMI_RT_PREDFAIL			0x04
    682 #define	IPMI_RT_LIMIT				0x05
    683 #define	IPMI_RT_PERFORMANCE			0x06
    684 #define	IPMI_RT_SEVERITY			0x07
    685 #define	IPMI_RT_PRESENT				0x08
    686 #define	IPMI_RT_ENABLED				0x09
    687 #define	IPMI_RT_AVAILABILITY			0x0A
    688 #define	IPMI_RT_REDUNDANCY			0x0B
    689 #define	IPMI_RT_ACPI				0x0C
    690 #define	IPMI_RT_SPECIFIC			0x6F
    691 
    692 /*
    693  * Bitmasks based on above reading types.  See table 42-2
    694  */
    695 #define	IPMI_SR_THRESHOLD_LOWER_NONCRIT_LOW	0x0001
    696 #define	IPMI_SR_THRESHOLD_LOWER_NONCRIT_HIGH	0x0002
    697 #define	IPMI_SR_THRESHOLD_LOWER_CRIT_LOW	0x0004
    698 #define	IPMI_SR_THRESHOLD_LOWER_CRIT_HIGH	0x0008
    699 #define	IPMI_SR_THRESHOLD_LOWER_NONRECOV_LOW	0x0010
    700 #define	IPMI_SR_THRESHOLD_LOWER_NONRECOV_HIGH	0x0020
    701 #define	IPMI_SR_THRESHOLD_UPPER_NONCRIT_LOW	0x0040
    702 #define	IPMI_SR_THRESHOLD_UPPER_NONCRIT_HIGH	0x0080
    703 #define	IPMI_SR_THRESHOLD_UPPER_CRIT_LOW	0x0100
    704 #define	IPMI_SR_THRESHOLD_UPPER_CRIT_HIGH	0x0200
    705 #define	IPMI_SR_THRESHOLD_UPPER_NONRECOV_LOW	0x0400
    706 #define	IPMI_SR_THRESHOLD_UPPER_NONRECOV_HIGH	0x0800
    707 
    708 #define	IPMI_SR_USAGE_IDLE			0x0001
    709 #define	IPMI_SR_USAGE_ACTIVE			0x0002
    710 #define	IPMI_SR_USAGE_BUSY			0x0004
    711 
    712 #define	IPMI_SR_STATE_DEASSERT			0x0001
    713 #define	IPMI_SR_STATE_ASSERT			0x0002
    714 
    715 #define	IPMI_SR_PREDFAIL_DEASSERT		0x0001
    716 #define	IPMI_SR_PREDFAIL_ASSERT			0x0002
    717 
    718 #define	IPMI_SR_LIMIT_NOTEXCEEDED		0x0001
    719 #define	IPMI_SR_LIMIT_EXCEEDED			0x0002
    720 
    721 #define	IPMI_SR_PERFORMANCE_MET			0x0001
    722 #define	IPMI_SR_PERFORMANCE_LAGS		0x0002
    723 
    724 #define	IPMI_SR_SEVERITY_TO_OK			0x0001
    725 #define	IPMI_SR_SEVERITY_OK_TO_NONCRIT		0x0002
    726 #define	IPMI_SR_SEVERITY_LESS_TO_CRIT		0x0004
    727 #define	IPMI_SR_SEVERITY_LESS_TO_NONRECOV	0x0008
    728 #define	IPMI_SR_SEVERITY_MORE_TO_NONCRIT	0x0010
    729 #define	IPMI_SR_SEVERITY_NONRECOV_TO_CRIT	0x0020
    730 #define	IPMI_SR_SEVERITY_TO_NONRECOV		0x0040
    731 #define	IPMI_SR_SEVERITY_MONITOR		0x0080
    732 #define	IPMI_SR_SEVERITY_INFO			0x0100
    733 
    734 #define	IPMI_SR_PRESENT_DEASSERT		0x0001
    735 #define	IPMI_SR_PRESENT_ASSERT			0x0002
    736 
    737 #define	IPMI_SR_ENABLED_DEASSERT		0x0001
    738 #define	IPMI_SR_ENABLED_ASSERT			0x0002
    739 
    740 #define	IPMI_SR_AVAILABILITY_RUNNING		0x0001
    741 #define	IPMI_SR_AVAILABILITY_INTEST		0x0002
    742 #define	IPMI_SR_AVAILABILITY_POWEROFF		0x0004
    743 #define	IPMI_SR_AVAILABILITY_ONLINE		0x0008
    744 #define	IPMI_SR_AVAILABILITY_OFFLINE		0x0010
    745 #define	IPMI_SR_AVAILABILITY_OFFDUTY		0x0020
    746 #define	IPMI_SR_AVAILABILITY_DEGRADED		0x0040
    747 #define	IPMI_SR_AVAILABILITY_POWERSAVE		0x0080
    748 #define	IPMI_SR_AVAILABILITY_INSTALLERR		0x0100
    749 
    750 #define	IPMI_SR_REDUNDANCY_FULL			0x0001
    751 #define	IPMI_SR_REDUNDANCY_LOST			0x0002
    752 #define	IPMI_SR_REDUNDANCY_DEGRADED		0x0004
    753 #define	IPMI_SR_REDUNDANCY_NONE_MINIMAL		0x0008
    754 #define	IPMI_SR_REDUNDANCY_NONE_REGAINED	0x0010
    755 #define	IPMI_SR_REDUNDANCY_NONE_INSUFFFICIENT	0x0020
    756 #define	IPMI_SR_REDUNDANCY_DEG_FROM_FULL	0x0040
    757 #define	IPMI_SR_REDUNDANCY_DEG_FROM_NON		0x0080
    758 
    759 #define	IPMI_SR_ACPI_DO				0x0001
    760 #define	IPMI_SR_ACPI_D1				0x0002
    761 #define	IPMI_SR_ACPI_D2				0x0004
    762 #define	IPMI_SR_ACPI_D3				0x0008
    763 
    764 /*
    765  * Bitmasks for sensor-specific reading type (0x6F).  See section 42.2.
    766  */
    767 #define	IPMI_ST_RESERVED			0x00
    768 #define	IPMI_ST_TEMP				0x01
    769 #define	IPMI_ST_VOLTAGE				0x02
    770 #define	IPMI_ST_CURRENT				0x03
    771 #define	IPMI_ST_FAN				0x04
    772 #define	IPMI_ST_PHYSICAL			0x05
    773 
    774 #define	IPMI_EV_PHYSICAL_GENERAL		0x0001
    775 #define	IPMI_EV_PHYSICAL_BAY			0x0002
    776 #define	IPMI_EV_PHYSICAL_CARD			0x0004
    777 #define	IPMI_EV_PHYSICAL_PROCESSOR		0x0008
    778 #define	IPMI_EV_PHYSICAL_LAN			0x0010
    779 #define	IPMI_EV_PHYSICAL_DOCK			0x0020
    780 #define	IPMI_EV_PHYSICAL_FAN			0x0040
    781 
    782 #define	IPMI_ST_PLATFORM			0x06
    783 
    784 #define	IPMI_EV_PLATFORM_SECURE			0x0001
    785 #define	IPMI_EV_PLATFORM_USER_PASS		0x0002
    786 #define	IPMI_EV_PLATFORM_SETUP_PASS		0x0004
    787 #define	IPMI_EV_PLATFORM_NETWORK_PASS		0x0008
    788 #define	IPMI_EV_PLATFORM_OTHER_PASS		0x0010
    789 #define	IPMI_EV_PLATFORM_OUT_OF_BAND		0x0020
    790 
    791 #define	IPMI_ST_PROCESSOR			0x07
    792 
    793 #define	IPMI_EV_PROCESSOR_IERR			0x0001
    794 #define	IPMI_EV_PROCESSOR_THERMAL		0x0002
    795 #define	IPMI_EV_PROCESSOR_FRB1			0x0004
    796 #define	IPMI_EV_PROCESSOR_FRB2			0x0008
    797 #define	IPMI_EV_PROCESSOR_FRB3			0x0010
    798 #define	IPMI_EV_PROCESSOR_CONFIG		0x0020
    799 #define	IPMI_EV_PROCESSOR_SMBIOS		0x0040
    800 #define	IPMI_EV_PROCESSOR_PRESENT		0x0080
    801 #define	IPMI_EV_PROCESSOR_DISABLED		0x0100
    802 #define	IPMI_EV_PROCESSOR_TERMINATOR		0x0200
    803 #define	IPMI_EV_PROCESSOR_THROTTLED		0x0400
    804 
    805 #define	IPMI_ST_POWER_SUPPLY			0x08
    806 
    807 #define	IPMI_EV_POWER_SUPPLY_PRESENT		0x0001
    808 #define	IPMI_EV_POWER_SUPPLY_FAILURE		0x0002
    809 #define	IPMI_EV_POWER_SUPPLY_PREDFAIL		0x0004
    810 #define	IPMI_EV_POWER_SUPPLY_INPUT_LOST		0x0008
    811 #define	IPMI_EV_POWER_SUPPLY_INPUT_RANGE	0x0010
    812 #define	IPMI_EV_POWER_SUPPLY_INPUT_RANGE_PRES	0x0020
    813 #define	IPMI_EV_POWER_SUPPLY_CONFIG_ERR		0x0040
    814 
    815 #define	IPMI_ST_POWER_UNIT			0x09
    816 
    817 #define	IPMI_EV_POWER_UNIT_OFF			0x0001
    818 #define	IPMI_EV_POWER_UNIT_CYCLE		0x0002
    819 #define	IPMI_EV_POWER_UNIT_240_DOWN		0x0004
    820 #define	IPMI_EV_POWER_UNIT_INTERLOCK_DOWN	0x0008
    821 #define	IPMI_EV_POWER_UNIT_AC_LOST		0x0010
    822 #define	IPMI_EV_POWER_UNIT_SOFT_FAILURE		0x0020
    823 #define	IPMI_EV_POWER_UNIT_FAIL			0x0040
    824 #define	IPMI_EV_POWER_UNIT_PREDFAIL		0x0080
    825 
    826 #define	IPMI_ST_COOLING				0x0A
    827 #define	IPMI_ST_OTHER				0x0B
    828 #define	IPMI_ST_MEMORY				0x0C
    829 
    830 #define	IPMI_EV_MEMORY_CE			0x0001
    831 #define	IPMI_EV_MEMORY_UE			0x0002
    832 #define	IPMI_EV_MEMORY_PARITY			0x0004
    833 #define	IPMI_EV_MEMORY_SCRUB_FAIL		0x0008
    834 #define	IPMI_EV_MEMORY_DISABLED			0x0010
    835 #define	IPMI_EV_MEMORY_CE_LOG_LIMIT		0x0020
    836 #define	IPMI_EV_MEMORY_PRESENT			0x0040
    837 #define	IPMI_EV_MEMORY_CONFIG_ERR		0x0080
    838 #define	IPMI_EV_MEMORY_SPARE			0x0100
    839 #define	IPMI_EV_MEMORY_THROTTLED		0x0200
    840 #define	IPMI_EV_MEMORY_OVERTEMP			0x0400
    841 
    842 #define	IPMI_ST_BAY				0x0D
    843 
    844 #define	IPMI_EV_BAY_PRESENT			0x0001
    845 #define	IPMI_EV_BAY_FAULT			0x0002
    846 #define	IPMI_EV_BAY_PREDFAIL			0x0004
    847 #define	IPMI_EV_BAY_SPARE			0x0008
    848 #define	IPMI_EV_BAY_CHECK			0x0010
    849 #define	IPMI_EV_BAY_CRITICAL			0x0020
    850 #define	IPMI_EV_BAY_FAILED			0x0040
    851 #define	IPMI_EV_BAY_REBUILDING			0x0080
    852 #define	IPMI_EV_BAY_ABORTED			0x0100
    853 
    854 #define	IPMI_ST_POST_RESIZE			0x0E
    855 #define	IPMI_ST_FIRMWARE			0x0F
    856 
    857 #define	IPMI_EV_FIRMWARE_ERROR			0x0001
    858 #define	IPMI_EV_FIRMWARE_HANG			0x0002
    859 #define	IPMI_EV_FIRMWARE_PROGRESS		0x0004
    860 
    861 #define	IPMI_ST_EVENT_LOG			0x10
    862 
    863 #define	IPMI_EV_EVENT_LOG_CE			0x0001
    864 #define	IPMI_EV_EVENT_LOG_TYPE			0x0002
    865 #define	IPMI_EV_EVENT_LOG_RESET			0x0004
    866 #define	IPMI_EV_EVENT_LOG_ALL			0x0008
    867 #define	IPMI_EV_EVENT_LOG_FULL			0x0010
    868 #define	IPMI_EV_EVENT_LOG_ALMOST_FULL		0x0020
    869 
    870 #define	IPMI_ST_WATCHDOG1			0x11
    871 
    872 #define	IPMI_EV_WATCHDOG_BIOS_RESET		0x0001
    873 #define	IPMI_EV_WATCHDOG_OS_RESET		0x0002
    874 #define	IPMI_EV_WATCHDOG_OS_SHUTDOWN		0x0004
    875 #define	IPMI_EV_WATCHDOG_OS_PWR_DOWN		0x0008
    876 #define	IPMI_EV_WATCHDOG_OS_PWR_CYCLE		0x0010
    877 #define	IPMI_EV_WATCHDOG_OS_NMI_DIAG		0x0020
    878 #define	IPMI_EV_WATCHDOG_EXPIRED		0x0040
    879 #define	IPMI_EV_WATCHDOG_PRE_TIMEOUT_INT	0x0080
    880 
    881 #define	IPMI_ST_SYSTEM				0x12
    882 
    883 #define	IPMI_EV_STSTEM_RECONF			0x0001
    884 #define	IPMI_EV_STSTEM_BOOT			0x0002
    885 #define	IPMI_EV_STSTEM_UNKNOWN_HW_FAILURE	0x0004
    886 #define	IPMI_EV_STSTEM_AUX_LOG_UPDATED		0x0008
    887 #define	IPMI_EV_STSTEM_PEF_ACTION		0x0010
    888 #define	IPMI_EV_SYSTEM_TIMETAMP_CLOCKSYNC	0x0020
    889 
    890 #define	IPMI_ST_CRITICAL			0x13
    891 
    892 #define	IPMI_EV_CRITICAL_EXT_NMI		0x0001
    893 #define	IPMI_EV_CRITICAL_BUS_TIMOEOUT		0x0002
    894 #define	IPMI_EV_CRITICAL_IO_NMI			0x0004
    895 #define	IPMI_EV_CRITICAL_SW_NMI			0x0008
    896 #define	IPMI_EV_CRITICAL_PCI_PERR		0x0010
    897 #define	IPMI_EV_CRITICAL_PCI_SERR		0x0020
    898 #define	IPMI_EV_CRITICAL_EISA_FAILSAFE		0x0040
    899 #define	IPMI_EV_CRITICAL_BUS_CE			0x0080
    900 #define	IPMI_EV_CRITICAL_BUS_UE			0x0100
    901 #define	IPMI_EV_CRITICAL_FATAL_NMI		0x0200
    902 #define	IPMI_EV_CRITICAL_BUS_FATAL_ERR		0x0400
    903 #define	IPMI_EV_CRITICAL_BUS_DEGRADED		0x0800
    904 
    905 #define	IPMI_ST_BUTTON				0x14
    906 
    907 #define	IPMI_EV_BUTTON_PWR			0x0001
    908 #define	IPMI_EV_BUTTON_SLEEP			0x0002
    909 #define	IPMI_EV_BUTTON_RESET			0x0004
    910 #define	IPMI_EV_BUTTON_FRU_LATCH		0x0008
    911 #define	IPMI_EV_BUTTON_FRU_SERVICE		0x0010
    912 
    913 #define	IPMI_ST_MODULE				0x15
    914 #define	IPMI_ST_MICROCONTROLLER			0x16
    915 #define	IPMI_ST_CARD				0x17
    916 #define	IPMI_ST_CHASSIS				0x18
    917 
    918 #define	IPMI_ST_CHIPSET				0x19
    919 
    920 #define	IPMI_EV_CHIPSET_PWR_CTL_FAIL		0x0001
    921 
    922 #define	IPMI_ST_FRU				0x1A
    923 #define	IPMI_ST_CABLE				0x1B
    924 
    925 #define	IPMI_EV_CABLE_CONNECTED			0x0001
    926 #define	IPMI_EV_CABLE_CONFIG_ERR		0x0002
    927 
    928 #define	IPMI_ST_TERMINATOR			0x1C
    929 
    930 #define	IPMI_ST_BOOT				0x1D
    931 
    932 #define	IPMI_EV_BOOT_BIOS_PWR_UP		0x0001
    933 #define	IPMI_EV_BOOT_BIOS_HARD_RESET		0x0002
    934 #define	IPMI_EV_BOOT_BIOS_WARM_RESET		0x0004
    935 #define	IPMI_EV_BOOT_PXE_BOOT			0x0008
    936 #define	IPMI_EV_BOOT_DIAG_BOOT			0x0010
    937 #define	IPMI_EV_BOOT_OS_HARD_RESET		0x0020
    938 #define	IPMI_EV_BOOT_OS_WARM_RESET		0x0040
    939 #define	IPMI_EV_BOOT_SYS_RESTART		0x0080
    940 
    941 #define	IPMI_ST_BOOT_ERROR			0x1E
    942 
    943 #define	IPMI_EV_BOOT_ERROR_NOMEDIA		0x0001
    944 #define	IPMI_EV_BOOT_ERROR_NON_BOOTABLE_DISK	0x0002
    945 #define	IPMI_EV_BOOT_ERROR_NO_PXE_SERVER	0x0004
    946 #define	IPMI_EV_BOOT_ERROR_INV_BOOT_SECT	0x0008
    947 #define	IPMI_EV_BOOT_ERROR_USR_SELECT_TIMEOUT	0x0010
    948 
    949 #define	IPMI_ST_BOOT_OS				0x1F
    950 
    951 #define	IPMI_EV_BOOT_OS_A_DRV_BOOT_COMPLETE	0x0001
    952 #define	IPMI_EV_BOOT_OS_C_DRV_BOOT_COMPLETE	0x0002
    953 #define	IPMI_EV_BOOT_OS_PXE_BOOT_COMPLETE	0x0004
    954 #define	IPMI_EV_BOOT_OS_DIAG_BOOT_COMPLETE	0x0008
    955 #define	IPMI_EV_BOOT_OS_CDROM_BOOT_COMPLETE	0x0010
    956 #define	IPMI_EV_BOOT_OS_ROM_BOOT_COMPLETE	0x0020
    957 #define	IPMI_EV_BOOT_OS_UNSPEC_BOOT_COMPLETE	0x0040
    958 
    959 #define	IPMI_ST_OS_SHUTDOWN			0x20
    960 
    961 #define	IPMI_EV_OS_SHUTDOWN_LOADING		0x0001
    962 #define	IPMI_EV_OS_SHUTDOWN_CRASH		0x0002
    963 #define	IPMI_EV_OS_STOP_GRACEFUL		0x0004
    964 #define	IPMI_EV_OS_SHUTDOWN_GRACEFUL		0x0008
    965 #define	IPMI_EV_OS_SHUTDOWN_PEF			0x0010
    966 #define	IPMI_EV_OS_SHUTDOWN_BMC			0x0020
    967 
    968 #define	IPMI_ST_SLOT				0x21
    969 
    970 #define	IPMI_EV_SLOT_FAULT_ASSERTED		0x0001
    971 #define	IPMI_EV_SLOT_IDENTIFY_ASSERTED		0x0002
    972 #define	IPMI_EV_SLOT_CONNECTED			0x0004
    973 #define	IPMI_EV_SLOT_INSTALL_READY		0x0008
    974 #define	IPMI_EV_SLOT_REMOVE_READY		0x0010
    975 #define	IPMI_EV_SLOT_PWR_OFF			0x0020
    976 #define	IPMI_EV_SLOT_REMOVED			0x0040
    977 #define	IPMI_EV_SLOT_INTERLOCK_ASSERTED		0x0080
    978 #define	IPMI_EV_SLOT_DISABLED			0x0100
    979 #define	IPMI_EV_SLOT_SPARE_DEVICE		0x0200
    980 
    981 #define	IPMI_ST_ACPI				0x22
    982 
    983 #define	IPMI_EV_ACPI_PSTATE_S0_G0		0x0001
    984 #define	IPMI_EV_ACPI_PSTATE_S1			0x0002
    985 #define	IPMI_EV_ACPI_PSTATE_S2			0x0004
    986 #define	IPMI_EV_ACPI_PSTATE_S3			0x0008
    987 #define	IPMI_EV_ACPI_PSTATE_S4			0x0010
    988 #define	IPMI_EV_ACPI_PSTATE_S5_G2_SOFT_OFF	0x0020
    989 #define	IPMI_EV_ACPI_PSTATE_S4_S5_SOFT_OFF	0x0040
    990 #define	IPMI_EV_ACPI_PSATTE_G3_MECH_OFF		0x0080
    991 #define	IPMI_EV_ACPI_PSTATE_S1_S2_S3_SLEEP	0x0100
    992 #define	IPMI_EV_ACPI_PSTATE_G1_SLEEP		0x0200
    993 #define	IPMI_EV_ACPI_PSTATE_S5_OVERRIDE		0x0400
    994 #define	IPMI_EV_ACPI_PSTATE_LEGACY_ON		0x0800
    995 #define	IPMI_EV_ACPI_PSTATE_LEGACY_OFF		0x1000
    996 #define	IPMI_EV_ACPI_PSTATE_UNKNOWN		0x2000
    997 
    998 #define	IPMI_ST_WATCHDOG2			0x23
    999 
   1000 #define	IPMI_EV_WATCHDOG2_EXPIRED		0x0001
   1001 #define	IPMI_EV_WATCHDOG2_HARD_RESET		0x0002
   1002 #define	IPMI_EV_WATCHDOG2_PWR_DOWN		0x0004
   1003 #define	IPMI_EV_WATCHDOG2_PWR_CYCLE		0x0008
   1004 #define	IPMI_EV_WATCHDOG2_RESERVED1		0x0010
   1005 #define	IPMI_EV_WATCHDOG2_RESERVED2		0x0020
   1006 #define	IPMI_EV_WATCHDOG2_RESERVED3		0x0040
   1007 #define	IPMI_EV_WATCHDOG2_RESERVED4		0x0080
   1008 #define	IPMI_EV_WATCHDOG2_TIMEOUT_INT		0x0100
   1009 
   1010 #define	IPMI_ST_ALERT				0x24
   1011 
   1012 #define	IPMI_EV_ALERT_PLAT_PAGE			0x0001
   1013 #define	IPMI_EV_ALERT_PLAT_LAN_ALERT		0x0002
   1014 #define	IPMI_EV_ALERT_PLAT_EVT_TRAP		0x0004
   1015 #define	IPMI_EV_ALERT_PLAT_SNMP_TRAP		0x0008
   1016 
   1017 #define	IPMI_ST_PRESENCE			0x25
   1018 
   1019 #define	IPMI_EV_PRESENCE_PRESENT		0x0001
   1020 #define	IPMI_EV_PRESENCE_ABSENT			0x0002
   1021 #define	IPMI_EV_PRESENCE_DISABLED		0x0004
   1022 
   1023 #define	IPMI_ST_ASIC				0x26
   1024 
   1025 #define	IPMI_ST_LAN				0x27
   1026 
   1027 #define	IPMI_EV_LAN_HEARTBEAT_LOST		0x0001
   1028 #define	IPMI_EV_LAN_HEARTBEAT			0x0002
   1029 
   1030 #define	IPMI_ST_HEALTH				0x28
   1031 
   1032 #define	IPMI_EV_HEALTH_SENSOR_ACC_DEGRADED	0x0001
   1033 #define	IPMI_EV_HEALTH_CNTLR_ACC_DEGRADED	0x0002
   1034 #define	IPMI_EV_HEALTH_CNTLR_OFFLINE		0x0004
   1035 #define	IPMI_EV_HEALTH_CNTLR_UNAVAIL		0x0008
   1036 #define	IPMI_EV_HEALTH_SENSOR_FAILURE		0x0010
   1037 #define	IPMI_EV_HEALTH_FRU_FAILURE		0x0020
   1038 
   1039 #define	IPMI_ST_BATTERY				0x29
   1040 
   1041 #define	IPMI_EV_BATTERY_LOW			0x0001
   1042 #define	IPMI_EV_BATTERY_FAILED			0x0002
   1043 #define	IPMI_EV_BATTERY_PRESENCE		0x0004
   1044 
   1045 #define	IPMI_ST_AUDIT				0x2A
   1046 
   1047 #define	IPMI_EV_AUDIT_SESSION_ACTIVATED		0x0001
   1048 #define	IPMI_EV_AUDIT_SESSION_DEACTIVATED	0x0002
   1049 
   1050 #define	IPMI_ST_VERSION				0x2B
   1051 
   1052 #define	IPMI_EV_VERSION_HW_CHANGE		0x0001
   1053 #define	IPMI_EV_VERSION_SW_CHANGE		0x0002
   1054 #define	IPMI_EV_VERSION_HW_INCOMPATIBLE		0x0004
   1055 #define	IPMI_EV_VERSION_SW_INCOMPATIBLE		0x0008
   1056 #define	IPMI_EV_VERSION_HW_INVAL		0x0010
   1057 #define	IPMI_EV_VERSION_SW_INVAL		0x0020
   1058 #define	IPMI_EV_VERSION_HW_CHANGE_SUCCESS	0x0040
   1059 #define	IPMI_EV_VERSION_SW_CHANGE_SUCCESS	0x0080
   1060 
   1061 #define	IPMI_ST_FRU_STATE			0x2C
   1062 
   1063 #define	IPMI_EV_FRU_STATE_NOT_INSTALLED		0x0001
   1064 #define	IPMI_EV_FRU_STATE_INACTIVE		0x0002
   1065 #define	IPMI_EV_FRU_STATE_ACT_REQ		0x0004
   1066 #define	IPMI_EV_FRU_STATE_ACT_INPROGRESS	0x0008
   1067 #define	IPMI_EV_FRU_STATE_ACTIVE		0x0010
   1068 #define	IPMI_EV_FRU_STATE_DEACT_REQ		0x0020
   1069 #define	IPMI_EV_FRU_STATE_DEACT_INPROGRESS	0x0040
   1070 #define	IPMI_EV_FRU_STATE_COMM_LOST		0x0080
   1071 
   1072 /*
   1073  * Constants for unit type codes.  See Table 43-15.
   1074  */
   1075 #define	IPMI_UNITS_UNSPECIFIED			0x00
   1076 #define	IPMI_UNITS_DEGREES_C			0x01
   1077 #define	IPMI_UNITS_DEGREES_F			0x02
   1078 #define	IPMI_UNITS_DEGREES_K			0x03
   1079 #define	IPMI_UNITS_VOLTS			0x04
   1080 #define	IPMI_UNITS_AMPS				0x05
   1081 #define	IPMI_UNITS_WATTS			0x06
   1082 #define	IPMI_UNITS_JOULES			0x07
   1083 #define	IPMI_UNITS_COULOMBS			0x08
   1084 #define	IPMI_UNITS_VA				0x09
   1085 #define	IPMI_UNITS_NITS				0x0A
   1086 #define	IPMI_UNITS_LUMEN			0x0B
   1087 #define	IPMI_UNITS_LUX				0x0C
   1088 #define	IPMI_UNITS_CANDELA			0x0D
   1089 #define	IPMI_UNITS_KPA				0x0E
   1090 #define	IPMI_UNITS_PSI				0x0F
   1091 
   1092 #define	IPMI_UNITS_NEWTON			0x10
   1093 #define	IPMI_UNITS_CFM				0x11
   1094 #define	IPMI_UNITS_RPM				0x12
   1095 #define	IPMI_UNITS_HZ				0x13
   1096 #define	IPMI_UNITS_MICROSEC			0x14
   1097 #define	IPMI_UNITS_MILLISEC			0x15
   1098 #define	IPMI_UNITS_SECS				0x16
   1099 #define	IPMI_UNITS_MIN				0x17
   1100 #define	IPMI_UNITS_HOUR				0x18
   1101 #define	IPMI_UNITS_DAY				0x19
   1102 #define	IPMI_UNITS_WEEK				0x1A
   1103 #define	IPMI_UNITS_MIL				0x1B
   1104 #define	IPMI_UNITS_INCHES			0x1C
   1105 #define	IPMI_UNITS_FEET				0x1D
   1106 #define	IPMI_UNITS_CUB_INCH			0x1E
   1107 #define	IPMI_UNITS_CUB_FEET			0x1F
   1108 
   1109 #define	IPMI_UNITS_MM				0x20
   1110 #define	IPMI_UNITS_CM				0x21
   1111 #define	IPMI_UNITS_METERS			0x22
   1112 #define	IPMI_UNITS_CUB_CM			0x23
   1113 #define	IPMI_UNITS_CUB_METER			0x24
   1114 #define	IPMI_UNITS_LITERS			0x25
   1115 #define	IPMI_UNITS_FLUID_OUNCE			0x26
   1116 #define	IPMI_UNITS_RADIANS			0x27
   1117 #define	IPMI_UNITS_STERADIANS			0x28
   1118 #define	IPMI_UNITS_REVOLUTIONS			0x29
   1119 #define	IPMI_UNITS_CYCLES			0x2A
   1120 #define	IPMI_UNITS_GRAVITIES			0x2B
   1121 #define	IPMI_UNITS_OUNCE			0x2C
   1122 #define	IPMI_UNITS_POUND			0x2D
   1123 #define	IPMI_UNITS_FOOT_POUND			0x2E
   1124 #define	IPMI_UNITS_OZ_INCH			0x2F
   1125 
   1126 #define	IPMI_UNITS_GAUSS			0x30
   1127 #define	IPMI_UNITS_GILBERTS			0x31
   1128 #define	IPMI_UNITS_HENRY			0x32
   1129 #define	IPMI_UNITS_MILHENRY			0x33
   1130 #define	IPMI_UNITS_FARAD			0x34
   1131 #define	IPMI_UNITS_MICROFARAD			0x35
   1132 #define	IPMI_UNITS_OHMS				0x36
   1133 #define	IPMI_UNITS_SIEMENS			0x37
   1134 #define	IPMI_UNITS_MOLE				0x38
   1135 #define	IPMI_UNITS_BECQUEREL			0x39
   1136 #define	IPMI_UNITS_PPM				0x3A
   1137 /* 0x3B is reserved */
   1138 #define	IPMI_UNITS_DECIBELS			0x3C
   1139 #define	IPMI_UNITS_DBA				0x3D
   1140 #define	IPMI_UNITS_DBC				0x3E
   1141 #define	IPMI_UNITS_GRAY				0x3F
   1142 
   1143 #define	IPMI_UNITS_SIEVERT			0x40
   1144 #define	IPMI_UNITS_COLOR_TEMP_K			0x41
   1145 #define	IPMI_UNITS_BIT				0x42
   1146 #define	IPMI_UNITS_KILOBIT			0x43
   1147 #define	IPMI_UNITS_MEGABIT			0x44
   1148 #define	IPMI_UNITS_GIGABIT			0x45
   1149 #define	IPMI_UNITS_BYTE				0x46
   1150 #define	IPMI_UNITS_KILOBYTE			0x47
   1151 #define	IPMI_UNITS_MEGABYTE			0x48
   1152 #define	IPMI_UNITS_GIGABYTE			0x49
   1153 #define	IPMI_UNITS_WORD				0x4A
   1154 #define	IPMI_UNITS_DWORD			0x4B
   1155 #define	IPMI_UNITS_QWORD			0x4C
   1156 #define	IPMI_UNITS_MEMLINE			0x4D
   1157 #define	IPMI_UNITS_HIT				0x4E
   1158 #define	IPMI_UNITS_MISS				0x4F
   1159 
   1160 #define	IPMI_UNITS_RETRY			0x50
   1161 #define	IPMI_UNITS_RESET			0x51
   1162 #define	IPMI_UNITS_OVERFLOW			0x52
   1163 #define	IPMI_UNITS_UNDERRUN			0x53
   1164 #define	IPMI_UNITS_COLLISION			0x54
   1165 #define	IPMI_UNITS_PACKETS			0x55
   1166 #define	IPMI_UNITS_MESSAGES			0x56
   1167 #define	IPMI_UNITS_CHARACTERS			0x57
   1168 #define	IPMI_UNITS_ERROR			0x58
   1169 #define	IPMI_UNITS_CE				0x59
   1170 #define	IPMI_UNITS_UE				0x5A
   1171 #define	IPMI_UNITS_FATAL_ERROR			0x5B
   1172 #define	IPMI_UNITS_GRAMS			0x5C
   1173 
   1174 /*
   1175  * Event-Only Record.  See section 43.3.
   1176  */
   1177 
   1178 #define	IPMI_SDR_TYPE_EVENT_ONLY		0x03
   1179 
   1180 typedef struct ipmi_sdr_event_only {
   1181 	/* RECORD KEY BYTES */
   1182 	uint8_t		is_eo_owner;
   1183 	DECL_BITFIELD3(
   1184 	    is_eo_sensor_lun			:2,
   1185 	    is_eo_fru_lun			:2,
   1186 	    is_eo_channel			:4);
   1187 	uint8_t		is_eo_number;
   1188 	/* RECORD BODY BYTES */
   1189 	uint8_t		is_eo_entity_id;
   1190 	DECL_BITFIELD2(
   1191 	    is_eo_entity_instance		:7,
   1192 	    is_eo_entity_logical		:1);
   1193 	uint8_t		is_eo_sensor_type;
   1194 	uint8_t		is_eo_reading_type;
   1195 	DECL_BITFIELD3(
   1196 	    is_eo_share_count			:4,
   1197 	    is_eo_modifier_type			:2,
   1198 	    is_eo_direction			:2);
   1199 	DECL_BITFIELD2(
   1200 	    is_eo_modifier_offset		:7,
   1201 	    is_eo_sharing			:1);
   1202 	uint8_t		__reserved;
   1203 	uint8_t		is_eo_oem;
   1204 	DECL_BITFIELD3(
   1205 	    is_eo_idlen				:5,
   1206 	    __reserved1				:1,
   1207 	    is_eo_idtype			:2);
   1208 	char		is_eo_idstring[1];
   1209 } ipmi_sdr_event_only_t;
   1210 
   1211 /*
   1212  * Entity Association Record.  See section 43.4.
   1213  */
   1214 
   1215 #define	IPMI_SDR_TYPE_ENTITY_ASSOCIATION	0x08
   1216 
   1217 typedef struct ipmi_sdr_entity_association {
   1218 	/* RECORD KEY BYTES */
   1219 	uint8_t		is_ea_entity_id;
   1220 	uint8_t		is_ea_entity_instance;
   1221 	DECL_BITFIELD4(
   1222 	    __reserved		:5,
   1223 	    is_ea_presence	:1,
   1224 	    is_ea_record_link	:1,
   1225 	    is_ea_range		:1);
   1226 	/* RECORD BODY BYTES */
   1227 	struct {
   1228 		uint8_t		is_ea_sub_id;
   1229 		uint8_t		is_ea_sub_instance;
   1230 	} is_ea_sub[4];
   1231 } ipmi_sdr_entity_association_t;
   1232 
   1233 /*
   1234  * Device-relative Entity Association Record.  See section 43.5.
   1235  */
   1236 
   1237 #define	IPMI_SDR_TYPE_DEVICE_RELATIVE		0x09
   1238 
   1239 typedef struct ipmi_sdr_device_relative {
   1240 	/* RECORD KEY BYTES */
   1241 	uint8_t		is_dr_entity_id;
   1242 	uint8_t		is_dr_entity_instance;
   1243 	DECL_BITFIELD2(
   1244 	    __reserved1			:1,
   1245 	    is_dr_slaveaddr		:7);
   1246 	DECL_BITFIELD2(
   1247 	    __reserved2			:4,
   1248 	    is_dr_channel		:4);
   1249 	DECL_BITFIELD4(
   1250 	    __reserved			:5,
   1251 	    is_dr_presence		:1,
   1252 	    is_dr_record_link		:1,
   1253 	    is_dr_range			:1);
   1254 	/* RECORD BODY BYTES */
   1255 	struct {
   1256 		DECL_BITFIELD2(
   1257 		    __reserved3		:1,
   1258 		    is_dr_sub_slaveaddr	:7);
   1259 		DECL_BITFIELD2(
   1260 		    __reserved4		:4,
   1261 		    is_dr_sub_channel	:4);
   1262 		uint8_t		is_ea_sub_id;
   1263 		uint8_t		is_ea_sub_instance;
   1264 	} is_ea_sub[4];
   1265 } ipmi_sdr_device_relative_t;
   1266 
   1267 /*
   1268  * Generic Device Locator Record.  See section 43.7.
   1269  */
   1270 
   1271 #define	IPMI_SDR_TYPE_GENERIC_LOCATOR		0x10
   1272 
   1273 typedef struct ipmi_sdr_generic_locator {
   1274 	/* RECORD KEY BYTES */
   1275 	DECL_BITFIELD2(
   1276 	    __reserved1		:1,
   1277 	    is_gl_accessaddr	:7);
   1278 	DECL_BITFIELD2(
   1279 	    is_gl_channel_msb	:1,
   1280 	    is_gl_slaveaddr	:7);
   1281 	DECL_BITFIELD3(
   1282 	    is_gl_bus		:3,
   1283 	    is_gl_lun		:2,
   1284 	    is_gl_channel	:3);
   1285 	/* RECORD BODY BYTES */
   1286 	DECL_BITFIELD2(
   1287 	    is_gl_span		:3,
   1288 	    __reserved2		:5);
   1289 	uint8_t		__reserved3;
   1290 	uint8_t		is_gl_type;
   1291 	uint8_t		is_gl_modifier;
   1292 	uint8_t		is_gl_entity;
   1293 	uint8_t		is_gl_instance;
   1294 	uint8_t		is_gl_oem;
   1295 	DECL_BITFIELD3(
   1296 	    is_gl_idlen		:5,
   1297 	    __reserved4		:1,
   1298 	    is_gl_idtype	:2);
   1299 	char		is_gl_idstring[1];
   1300 } ipmi_sdr_generic_locator_t;
   1301 
   1302 /*
   1303  * FRU Device Locator Record.  See section 43.8.
   1304  */
   1305 
   1306 #define	IPMI_SDR_TYPE_FRU_LOCATOR		0x11
   1307 
   1308 typedef struct ipmi_sdr_fru_locator {
   1309 	/* RECORD KEY BYTES */
   1310 	DECL_BITFIELD2(
   1311 	    __reserved1		:1,
   1312 	    is_fl_accessaddr	:7);
   1313 	union {
   1314 		struct {
   1315 			uint8_t	_is_fl_devid;
   1316 		} _logical;
   1317 		struct {
   1318 			DECL_BITFIELD2(
   1319 			    __reserved		:1,
   1320 			    _is_fl_slaveaddr	:7);
   1321 		} _nonintelligent;
   1322 	} _devid_or_slaveaddr;
   1323 	DECL_BITFIELD4(
   1324 	    is_fl_bus		:3,
   1325 	    is_fl_lun		:2,
   1326 	    __reserved2		:2,
   1327 	    is_fl_logical	:1);
   1328 	DECL_BITFIELD2(
   1329 	    __reserved3		:4,
   1330 	    is_fl_channel	:4);
   1331 	/* RECORD BODY BYTES */
   1332 	uint8_t		__reserved4;
   1333 	uint8_t		is_fl_type;
   1334 	uint8_t		is_fl_modifier;
   1335 	uint8_t		is_fl_entity;
   1336 	uint8_t		is_fl_instance;
   1337 	uint8_t		is_fl_oem;
   1338 	DECL_BITFIELD3(
   1339 	    is_fl_idlen		:5,
   1340 	    __reserved5		:1,
   1341 	    is_fl_idtype	:2);
   1342 	char		is_fl_idstring[1];
   1343 } ipmi_sdr_fru_locator_t;
   1344 
   1345 #define	is_fl_devid	_devid_or_slaveaddr._logical._is_fl_devid
   1346 #define	is_fl_slaveaddr	_devid_or_slaveaddr._nonintelligent._is_fl_slaveaddr
   1347 
   1348 /*
   1349  * Management Controller Device Locator Record.  See section 43.9
   1350  */
   1351 
   1352 #define	IPMI_SDR_TYPE_MANAGEMENT_LOCATOR	0x12
   1353 
   1354 typedef struct ipmi_sdr_management_locator {
   1355 	/* RECORD KEY BYTES */
   1356 	DECL_BITFIELD2(
   1357 	    __reserved1			:1,
   1358 	    is_ml_devaddr		:7);
   1359 	DECL_BITFIELD2(
   1360 	    is_ml_channel		:4,
   1361 	    __reserved2			:4);
   1362 	/* RECORD BODY BYTES */
   1363 	DECL_BITFIELD7(
   1364 	    is_ml_init_message		:2,
   1365 	    is_ml_init_log		:1,
   1366 	    is_ml_init_controller_log	:1,
   1367 	    __reserved3			:1,
   1368 	    is_ml_static		:1,
   1369 	    is_ml_acpi_device		:1,
   1370 	    is_ml_acpi_system		:1);
   1371 	DECL_BITFIELD8(
   1372 	    is_ml_supp_sensor		:1,
   1373 	    is_ml_supp_sdr		:1,
   1374 	    is_ml_supp_sel		:1,
   1375 	    is_ml_supp_fru		:1,
   1376 	    is_ml_supp_event_receiver	:1,
   1377 	    is_ml_supp_event_generator	:1,
   1378 	    is_ml_supp_bridge		:1,
   1379 	    is_ml_supp_chassis		:1);
   1380 	uint8_t		__reserved4;
   1381 	uint16_t	__reserved5;
   1382 	uint8_t		is_ml_entity_id;
   1383 	uint8_t		is_ml_entity_instance;
   1384 	uint8_t		is_ml_oem;
   1385 	DECL_BITFIELD3(
   1386 	    is_ml_idlen		:5,
   1387 	    __reserved6		:1,
   1388 	    is_ml_idtype	:2);
   1389 	char		is_ml_idstring[1];
   1390 } ipmi_sdr_management_locator_t;
   1391 
   1392 #define	IPMI_MESSAGE_INIT_ENABLE		0x0
   1393 #define	IPMI_MESSAGE_INIT_DISABLE		0x1
   1394 #define	IPMI_MESSAGE_INIT_NONE			0x2
   1395 
   1396 /*
   1397  *  Management Controller Confirmation Record.  See section 43.10
   1398  */
   1399 
   1400 #define	IPMI_SDR_TYPE_MANAGEMENT_CONFIRMATION	0x13
   1401 
   1402 typedef struct ipmi_sdr_management_confirmation {
   1403 	/* RECORD KEY BYTES */
   1404 	DECL_BITFIELD2(
   1405 	    __reserved1		:1,
   1406 	    is_mc_slaveaddr	:7);
   1407 	uint8_t		is_mc_deviceid;
   1408 	DECL_BITFIELD2(
   1409 	    is_mc_dev_revision	:4,
   1410 	    is_mc_channel	:4);
   1411 	/* RECORD BODY BYTES */
   1412 	DECL_BITFIELD2(
   1413 	    is_mc_major_rev	:7,
   1414 	    __reserved2		:1);
   1415 	uint8_t		is_mc_minor_rev;
   1416 	uint8_t		is_mc_impi_ver;
   1417 	uint8_t		is_mc_manufacturer[3];
   1418 	uint16_t	is_mc_product;
   1419 	uint8_t		is_mc_guid[16];
   1420 } ipmi_sdr_management_confirmation_t;
   1421 
   1422 /*
   1423  * BMC Message Channel Info Record.  See esction 43.11.
   1424  */
   1425 
   1426 #define	IPMI_SDR_TYPE_BMC_MESSAGE_CHANNEL	0x14
   1427 
   1428 typedef struct ipmi_sdr_bmc_channel {
   1429 	/* RECORD BODY BYTES */
   1430 	struct {
   1431 		DECL_BITFIELD3(
   1432 		    is_bc_protocol	:4,
   1433 		    is_bc_receive_lun	:3,
   1434 		    is_bc_transmit	:1);
   1435 	} is_bc_channel[8];
   1436 	uint8_t		is_bc_interrupt_type;
   1437 	uint8_t		is_bc_buffer_type;
   1438 	uint8_t		__reserved;
   1439 } ipmi_sdr_bmc_channel_t;
   1440 
   1441 /*
   1442  * OEM Record.  See ction 43.12.
   1443  */
   1444 
   1445 #define	IPMI_SDR_TYPE_OEM			0xC0
   1446 
   1447 typedef struct ipmi_sdr_oem {
   1448 	uint8_t		is_oem_manufacturer[3];
   1449 	uint8_t		is_oem_data[1];
   1450 } ipmi_sdr_oem_t;
   1451 
   1452 /*
   1453  * Iterate over the SDR repository.  This function does the work of parsing the
   1454  * name when available, and keeping the repository in a consistent state.
   1455  */
   1456 extern int ipmi_sdr_iter(ipmi_handle_t *,
   1457     int (*)(ipmi_handle_t *, const char *, ipmi_sdr_t *, void *), void *);
   1458 
   1459 /*
   1460  * Lookup the given sensor type by name.  These functions automatically read in
   1461  * and cache the complete SDR repository.
   1462  */
   1463 extern ipmi_sdr_t *ipmi_sdr_lookup(ipmi_handle_t *, const char *);
   1464 extern ipmi_sdr_fru_locator_t *ipmi_sdr_lookup_fru(ipmi_handle_t *,
   1465     const char *);
   1466 extern ipmi_sdr_generic_locator_t *ipmi_sdr_lookup_generic(ipmi_handle_t *,
   1467     const char *);
   1468 extern ipmi_sdr_compact_sensor_t *ipmi_sdr_lookup_compact_sensor(
   1469     ipmi_handle_t *, const char *);
   1470 extern ipmi_sdr_full_sensor_t *ipmi_sdr_lookup_full_sensor(
   1471     ipmi_handle_t *, const char *);
   1472 
   1473 /*
   1474  * Entity ID codes.  See table 43.13.
   1475  */
   1476 #define	IPMI_ET_UNSPECIFIED		0x00
   1477 #define	IPMI_ET_OTHER			0x01
   1478 #define	IPMI_ET_UNKNOWN			0x02
   1479 #define	IPMI_ET_PROCESSOR		0x03
   1480 #define	IPMI_ET_DISK			0x04
   1481 #define	IPMI_ET_PERIPHERAL		0x05
   1482 #define	IPMI_ET_MANAGEMENT_MODULE	0x06
   1483 #define	IPMI_ET_MOTHERBOARD		0x07
   1484 #define	IPMI_ET_MEMORY_MODULE		0x08
   1485 #define	IPMI_ET_PROCESSOR_MODULE	0x09
   1486 #define	IPMI_ET_PSU			0x0A
   1487 #define	IPMI_ET_CARD			0x0B
   1488 #define	IPMI_ET_FRONT_PANEL		0x0C
   1489 #define	IPMI_ET_BACK_PANEL		0x0D
   1490 #define	IPMI_ET_POWER_BOARD		0x0E
   1491 #define	IPMI_ET_BACKPLANE		0x0F
   1492 #define	IPMI_ET_EXPANSION_BOARD		0x10
   1493 #define	IPMI_ET_OTHER_BOARD		0x11
   1494 #define	IPMI_ET_PROCESSOR_BOARD		0x12
   1495 #define	IPMI_ET_POWER_DOMAIN		0x13
   1496 #define	IPMI_ET_POWER_CONVERTER		0x14
   1497 #define	IPMI_ET_POWER_MANAGEMENT	0x15
   1498 #define	IPMI_ET_BACK_CHASSIS		0x16
   1499 #define	IPMI_ET_SYSTEM_CHASSIS		0x17
   1500 #define	IPMI_ET_SUB_CHASSIS		0x18
   1501 #define	IPMI_ET_OTHER_CHASSIS		0x19
   1502 #define	IPMI_ET_DISK_BAY		0x1A
   1503 #define	IPMI_ET_PERIPHERAL_BAY		0x1B
   1504 #define	IPMI_ET_DEVICE_BAY		0x1C
   1505 #define	IPMI_ET_FAN			0x1D
   1506 #define	IPMI_ET_COOLING_DOMAIN		0x1E
   1507 #define	IPMI_ET_CABLE			0x1F
   1508 #define	IPMI_ET_MEMORY_DEVICE		0x20
   1509 #define	IPMI_ET_MANAGEMENT_SOFTWARE	0x21
   1510 #define	IPMI_ET_SYSTEM_FIRMWARE		0x22
   1511 #define	IPMI_ET_OS			0x23
   1512 #define	IPMI_ET_SYSTEM_BUS		0x24
   1513 #define	IPMI_ET_GROUP			0x25
   1514 #define	IPMI_ET_REMOTE			0x26
   1515 #define	IPMI_ET_ENVIRONMENT		0x27
   1516 #define	IPMI_ET_BATTERY			0x28
   1517 #define	IPMI_ET_BLADE			0x29
   1518 #define	IPMI_ET_SWITCH			0x2A
   1519 #define	IPMI_ET_PROCMEM_MODULE		0x2B
   1520 #define	IPMI_ET_IO_MODULE		0x2C
   1521 #define	IPMI_ET_PROCIO_MODULE		0x2D
   1522 #define	IPMI_ET_CONTROLLER_FIRMWARE	0x2E
   1523 #define	IPMI_ET_CHANNEL			0x2F
   1524 #define	IPMI_ET_PCI			0x30
   1525 #define	IPMI_ET_PCIE			0x31
   1526 #define	IPMI_ET_SCSI			0x32
   1527 #define	IPMI_ET_SATA_SAS		0x33
   1528 #define	IPMI_ET_FSB			0x34
   1529 #define	IPMI_ET_RTC			0x35
   1530 
   1531 /*
   1532  * Get Sensor Reading.  See section 35.14.
   1533  */
   1534 
   1535 #define	IPMI_CMD_GET_SENSOR_READING	0x2d
   1536 
   1537 typedef struct ipmi_sensor_reading {
   1538 	uint8_t		isr_reading;
   1539 	DECL_BITFIELD4(
   1540 	    __reserved1			:5,
   1541 	    isr_state_unavailable	:1,
   1542 	    isr_scanning_enabled	:1,
   1543 	    isr_event_enabled		:1);
   1544 	uint16_t	isr_state;
   1545 } ipmi_sensor_reading_t;
   1546 
   1547 #define	IPMI_SENSOR_THRESHOLD_LOWER_NONCRIT		0x0001
   1548 #define	IPMI_SENSOR_THRESHOLD_LOWER_CRIT		0x0002
   1549 #define	IPMI_SENSOR_THRESHOLD_LOWER_NONRECOV		0x0004
   1550 #define	IPMI_SENSOR_THRESHOLD_UPPER_NONCRIT		0x0008
   1551 #define	IPMI_SENSOR_THRESHOLD_UPPER_CRIT		0x0010
   1552 #define	IPMI_SENSOR_THRESHOLD_UPPER_NONRECOV		0x0020
   1553 
   1554 extern ipmi_sensor_reading_t *ipmi_get_sensor_reading(ipmi_handle_t *, uint8_t);
   1555 extern int ipmi_sdr_conv_reading(ipmi_sdr_full_sensor_t *, uint8_t,
   1556     double *);
   1557 /*
   1558  * Set Sensor Reading.  See section 35.14.
   1559  */
   1560 #define	IPMI_CMD_SET_SENSOR_READING	0x30
   1561 
   1562 #define	IPMI_SENSOR_OP_CLEAR	0x3	/* clear '0' bits */
   1563 #define	IPMI_SENSOR_OP_SET	0x2	/* set '1' bits */
   1564 #define	IPMI_SENSOR_OP_EXACT	0x1	/* set bits exactly */
   1565 
   1566 typedef struct ipmi_set_sensor_reading {
   1567 	uint8_t		iss_id;
   1568 	DECL_BITFIELD5(
   1569 	    iss_set_reading		:1,
   1570 	    __reserved			:1,
   1571 	    iss_deassrt_op		:2,
   1572 	    iss_assert_op		:2,
   1573 	    iss_data_bytes		:2);
   1574 	uint8_t		iss_sensor_reading;
   1575 	uint16_t	iss_assert_state;	/* optional */
   1576 	uint16_t	iss_deassert_state;	/* optional */
   1577 	uint8_t		iss_event_data1;	/* optional */
   1578 	uint8_t		iss_event_data2;	/* optional */
   1579 	uint8_t		iss_event_data3;	/* optional */
   1580 } ipmi_set_sensor_reading_t;
   1581 
   1582 extern int ipmi_set_sensor_reading(ipmi_handle_t *,
   1583     ipmi_set_sensor_reading_t *);
   1584 
   1585 /*
   1586  * These IPMI message id/opcodes are documented in Appendix G in the IPMI spec.
   1587  *
   1588  * Payloads for these two commands are described in Sections 34.1 and 34.2 of
   1589  * the spec, respectively.
   1590  */
   1591 #define	IPMI_CMD_GET_FRU_INV_AREA	0x10
   1592 #define	IPMI_CMD_READ_FRU_DATA		0x11
   1593 
   1594 /*
   1595  * Structs to hold the FRU Common Header and the FRU Product Info Area, as
   1596  * described in the IPMI Platform Management FRU Information Storage
   1597  * Definition (v1.1).
   1598  */
   1599 typedef struct ipmi_fru_hdr
   1600 {
   1601 	uint8_t		ifh_format;
   1602 	uint8_t		ifh_int_use_off;
   1603 	uint8_t		ifh_chassis_info_off;
   1604 	uint8_t		ifh_board_info_off;
   1605 	uint8_t		ifh_product_info_off;
   1606 	uint8_t		ifh_multi_rec_off;
   1607 	uint8_t		ifh_pad;
   1608 	uint8_t		ifh_chksum;
   1609 } ipmi_fru_hdr_t;
   1610 
   1611 /*
   1612  * Because only 6 bits are used to specify the length of each field in the FRU
   1613  * product and board info areas, the biggest string we would ever need to hold
   1614  * would be 63 chars plus a NULL.
   1615  */
   1616 #define	FRU_INFO_MAXLEN	64
   1617 
   1618 typedef struct ipmi_fru_brd_info
   1619 {
   1620 	char	ifbi_manuf_date[3];
   1621 	char	ifbi_manuf_name[FRU_INFO_MAXLEN];
   1622 	char	ifbi_board_name[FRU_INFO_MAXLEN];
   1623 	char	ifbi_product_serial[FRU_INFO_MAXLEN];
   1624 	char	ifbi_part_number[FRU_INFO_MAXLEN];
   1625 } ipmi_fru_brd_info_t;
   1626 
   1627 typedef struct ipmi_fru_prod_info
   1628 {
   1629 	char	ifpi_manuf_name[FRU_INFO_MAXLEN];
   1630 	char	ifpi_product_name[FRU_INFO_MAXLEN];
   1631 	char	ifpi_part_number[FRU_INFO_MAXLEN];
   1632 	char	ifpi_product_version[FRU_INFO_MAXLEN];
   1633 	char	ifpi_product_serial[FRU_INFO_MAXLEN];
   1634 	char	ifpi_asset_tag[FRU_INFO_MAXLEN];
   1635 } ipmi_fru_prod_info_t;
   1636 
   1637 extern int ipmi_fru_read(ipmi_handle_t *, ipmi_sdr_fru_locator_t *, char **);
   1638 extern int ipmi_fru_parse_board(ipmi_handle_t *, char *, ipmi_fru_brd_info_t *);
   1639 extern int ipmi_fru_parse_product(ipmi_handle_t *, char *,
   1640     ipmi_fru_prod_info_t *);
   1641 
   1642 /*
   1643  * Routines to convert from entity and sensors defines into text strings.
   1644  */
   1645 void ipmi_entity_name(uint8_t, char *, size_t);
   1646 void ipmi_sensor_type_name(uint8_t, char *, size_t);
   1647 void ipmi_sensor_units_name(uint8_t, char *, size_t);
   1648 void ipmi_sensor_reading_name(uint8_t, uint8_t, char *, size_t);
   1649 
   1650 /*
   1651  * Entity management.  IPMI has a notion of 'entities', but these are not
   1652  * directly accessible from any commands.  Instead, their existence is inferred
   1653  * from examining the SDR repository.  Since this is rather unwieldy, and
   1654  * iterating over entities is a common operation, libipmi provides an entity
   1655  * abstraction that hides the implementation details.  This handles entity
   1656  * groupings as well as SDR associations.
   1657  */
   1658 typedef struct ipmi_entity {
   1659 	uint8_t		ie_type;
   1660 	uint8_t		ie_instance;
   1661 	uint8_t		ie_children;
   1662 	boolean_t	ie_logical;
   1663 } ipmi_entity_t;
   1664 
   1665 extern int ipmi_entity_iter(ipmi_handle_t *, int (*)(ipmi_handle_t *,
   1666     ipmi_entity_t *, void *), void *);
   1667 extern int ipmi_entity_iter_sdr(ipmi_handle_t *, ipmi_entity_t *,
   1668     int (*)(ipmi_handle_t *, ipmi_entity_t *, const char *, ipmi_sdr_t *,
   1669     void *), void *);
   1670 extern int ipmi_entity_iter_children(ipmi_handle_t *, ipmi_entity_t *,
   1671     int (*)(ipmi_handle_t *, ipmi_entity_t *, void *), void *);
   1672 extern ipmi_entity_t *ipmi_entity_lookup(ipmi_handle_t *, uint8_t,
   1673     uint8_t);
   1674 extern ipmi_entity_t *ipmi_entity_lookup_sdr(ipmi_handle_t *, const char *);
   1675 extern ipmi_entity_t *ipmi_entity_parent(ipmi_handle_t *, ipmi_entity_t *);
   1676 extern int ipmi_entity_present(ipmi_handle_t *, ipmi_entity_t *, boolean_t *);
   1677 extern int ipmi_entity_present_sdr(ipmi_handle_t *, ipmi_sdr_t *, boolean_t *);
   1678 
   1679 /*
   1680  * User management.  The raw functions are private to libipmi, and only the
   1681  * higher level abstraction (ipmi_user_t) is exported to consumers of the
   1682  * library.
   1683  */
   1684 
   1685 #define	IPMI_USER_PRIV_CALLBACK		0x1
   1686 #define	IPMI_USER_PRIV_USER		0x2
   1687 #define	IPMI_USER_PRIV_OPERATOR		0x3
   1688 #define	IPMI_USER_PRIV_ADMIN		0x4
   1689 #define	IPMI_USER_PRIV_OEM		0x5
   1690 #define	IPMI_USER_PRIV_NONE		0xf
   1691 
   1692 typedef struct ipmi_user {
   1693 	uint8_t		iu_uid;
   1694 	char		*iu_name;
   1695 	boolean_t	iu_enabled;
   1696 	boolean_t	iu_ipmi_msg_enable;
   1697 	boolean_t	iu_link_auth_enable;
   1698 	uint8_t		iu_priv;
   1699 } ipmi_user_t;
   1700 
   1701 extern int ipmi_user_iter(ipmi_handle_t *,
   1702     int (*)(ipmi_user_t *, void *), void *);
   1703 extern ipmi_user_t *ipmi_user_lookup_name(ipmi_handle_t *, const char *);
   1704 extern ipmi_user_t *ipmi_user_lookup_id(ipmi_handle_t *, uint8_t);
   1705 extern int ipmi_user_set_password(ipmi_handle_t *, uint8_t, const char *);
   1706 
   1707 /*
   1708  * The remaining functions are private to the implementation of the Sun ILOM
   1709  * service processor.  These function first check the manufacturer from the IPMI
   1710  * device ID, and will return EIPMI_NOT_SUPPORTED if attempted for non-Sun
   1711  * devices.
   1712  */
   1713 
   1714 /*
   1715  * Sun OEM LED requests.
   1716  */
   1717 
   1718 #define	IPMI_SUNOEM_LED_MODE_OFF	0
   1719 #define	IPMI_SUNOEM_LED_MODE_ON		1
   1720 #define	IPMI_SUNOEM_LED_MODE_STANDBY	2
   1721 #define	IPMI_SUNOEM_LED_MODE_SLOW	3
   1722 #define	IPMI_SUNOEM_LED_MODE_FAST	4
   1723 
   1724 /*
   1725  * These functions take a SDR record and construct the appropriate form of the
   1726  * above commands.
   1727  */
   1728 extern int ipmi_sunoem_led_set(ipmi_handle_t *,
   1729     ipmi_sdr_generic_locator_t *, uint8_t);
   1730 extern int ipmi_sunoem_led_get(ipmi_handle_t *,
   1731     ipmi_sdr_generic_locator_t *, uint8_t *);
   1732 
   1733 /*
   1734  * Sun OEM uptime.  Note that the underlying command returns the uptime in big
   1735  * endian form.  This wrapper automatically converts to the appropriate native
   1736  * form.
   1737  */
   1738 
   1739 #define	IPMI_CMD_SUNOEM_UPTIME		0x08
   1740 
   1741 extern int ipmi_sunoem_uptime(ipmi_handle_t *, uint32_t *, uint32_t *);
   1742 
   1743 /*
   1744  * Sun OEM FRU update.  The FRU information is managed through a generic
   1745  * identifier, and then a type-specific data portion.  The wrapper function will
   1746  * automatically fill in the data length field according to which type is
   1747  * specified.
   1748  */
   1749 
   1750 #define	IPMI_CMD_SUNOEM_FRU_UPDATE	0x16
   1751 
   1752 #define	IPMI_SUNOEM_FRU_DIMM	0x00
   1753 #define	IPMI_SUNOEM_FRU_CPU	0x01
   1754 #define	IPMI_SUNOEM_FRU_BIOS	0x02
   1755 #define	IPMI_SUNOEM_FRU_DISK	0x03
   1756 
   1757 typedef struct ipmi_sunoem_fru {
   1758 	uint8_t				isf_type;
   1759 	uint8_t				isf_id;
   1760 	uint8_t				isf_datalen;
   1761 	union {
   1762 		struct {
   1763 			uint8_t		isf_data[128];
   1764 		} dimm;
   1765 		struct {
   1766 			uint32_t	isf_thermtrip;
   1767 			uint32_t	isf_eax;
   1768 			char		isf_product[48];
   1769 		} cpu;
   1770 		struct {
   1771 			char		isf_part[16];
   1772 			char		isf_version[16];
   1773 		} bios;
   1774 		struct {
   1775 			char		isf_manufacturer[16];
   1776 			char		isf_model[28];
   1777 			char		isf_serial[20];
   1778 			char		isf_version[8];
   1779 			char		isf_capacity[16];
   1780 		} disk;
   1781 	} isf_data;
   1782 } ipmi_sunoem_fru_t;
   1783 
   1784 int ipmi_sunoem_update_fru(ipmi_handle_t *, ipmi_sunoem_fru_t *);
   1785 
   1786 #pragma pack()
   1787 
   1788 #ifdef	__cplusplus
   1789 }
   1790 #endif
   1791 
   1792 #endif	/* _LIBIPMI_H */
   1793