19113a79cSeschrock /*
29113a79cSeschrock  * CDDL HEADER START
39113a79cSeschrock  *
49113a79cSeschrock  * The contents of this file are subject to the terms of the
59113a79cSeschrock  * Common Development and Distribution License (the "License").
69113a79cSeschrock  * You may not use this file except in compliance with the License.
79113a79cSeschrock  *
89113a79cSeschrock  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
99113a79cSeschrock  * or http://www.opensolaris.org/os/licensing.
109113a79cSeschrock  * See the License for the specific language governing permissions
119113a79cSeschrock  * and limitations under the License.
129113a79cSeschrock  *
139113a79cSeschrock  * When distributing Covered Code, include this CDDL HEADER in each
149113a79cSeschrock  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
159113a79cSeschrock  * If applicable, add the following below this CDDL HEADER, with the
169113a79cSeschrock  * fields enclosed by brackets "[]" replaced with your own identifying
179113a79cSeschrock  * information: Portions Copyright [yyyy] [name of copyright owner]
189113a79cSeschrock  *
199113a79cSeschrock  * CDDL HEADER END
209113a79cSeschrock  */
219113a79cSeschrock /*
22aec67356SRobert Johnston  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
23208e1562SRob Johnston  * Copyright (c) 2018, Joyent, Inc. All rights reserved.
249113a79cSeschrock  */
259113a79cSeschrock 
269113a79cSeschrock #ifndef	_LIBIPMI_H
279113a79cSeschrock #define	_LIBIPMI_H
289113a79cSeschrock 
299113a79cSeschrock #include <sys/byteorder.h>
3081d9f076SRobert Johnston #include <sys/nvpair.h>
312c32020fSeschrock #include <sys/sysmacros.h>
329113a79cSeschrock 
339113a79cSeschrock /*
349113a79cSeschrock  * Private interfaces for communicating with attached services over IPMI.  This
35989f2807SJerry Jelinek  * library is designed for system software communicating with Illumos-supported
36989f2807SJerry Jelinek  * service processors over /dev/ipmi0.  It is not a generic IPMI library.
379113a79cSeschrock  *
389113a79cSeschrock  * Documentation references refer to "Intelligent Platform Management Interface
399113a79cSeschrock  * Specification Second Generation v2.0", document revision 1.0 with Februrary
409113a79cSeschrock  * 15, 2006 Markup from "IPMI v2.0 Addenda, Errata, and Clarifications Revision
419113a79cSeschrock  * 3".
429113a79cSeschrock  */
439113a79cSeschrock 
449113a79cSeschrock #ifdef	__cplusplus
459113a79cSeschrock extern "C" {
469113a79cSeschrock #endif
479113a79cSeschrock 
489113a79cSeschrock typedef struct ipmi_handle ipmi_handle_t;
499113a79cSeschrock 
509113a79cSeschrock #pragma pack(1)
519113a79cSeschrock 
529113a79cSeschrock /*
539113a79cSeschrock  * Basic netfn definitions.  See section 5.1.
549113a79cSeschrock  */
55989f2807SJerry Jelinek #define	IPMI_NETFN_CHASSIS		0x0
56989f2807SJerry Jelinek #define	IPMI_NETFN_BRIDGE		0x2
57989f2807SJerry Jelinek #define	IPMI_NETFN_SE			0x4
58989f2807SJerry Jelinek #define	IPMI_NETFN_APP			0x6
59989f2807SJerry Jelinek #define	IPMI_NETFN_FIRMWARE		0x8
60989f2807SJerry Jelinek #define	IPMI_NETFN_STORAGE		0xa
61283bfb4dSEric Schrock #define	IPMI_NETFN_TRANSPORT		0x0C
629113a79cSeschrock #define	IPMI_NETFN_OEM			0x2e
639113a79cSeschrock 
649113a79cSeschrock /*
659113a79cSeschrock  * Error definitions
669113a79cSeschrock  */
679113a79cSeschrock #define	EIPMI_BASE	2000
689113a79cSeschrock 
692eeaed14Srobj typedef enum {
709113a79cSeschrock 	EIPMI_NOMEM = EIPMI_BASE,	/* memory allocation failure */
71989f2807SJerry Jelinek 	EIPMI_BMC_OPEN_FAILED,		/* failed to open /dev/ipmi0 */
72989f2807SJerry Jelinek 	EIPMI_BMC_PUTMSG,	/* failed to send message to /dev/ipmi0 */
73989f2807SJerry Jelinek 	EIPMI_BMC_GETMSG,	/* failed to read response from /dev/ipmi0 */
74989f2807SJerry Jelinek 	EIPMI_BMC_RESPONSE,		/* response from /dev/ipmi0 failed */
759113a79cSeschrock 	EIPMI_INVALID_COMMAND,		/* invalid command */
769113a79cSeschrock 	EIPMI_COMMAND_TIMEOUT,		/* command timeout */
779113a79cSeschrock 	EIPMI_DATA_LENGTH_EXCEEDED,	/* maximum data length exceeded */
789113a79cSeschrock 	EIPMI_SEND_FAILED,		/* failed to send BMC request */
792eeaed14Srobj 	EIPMI_UNSPECIFIED,		/* unspecified BMC error */
809113a79cSeschrock 	EIPMI_UNKNOWN,			/* unknown error */
819113a79cSeschrock 	EIPMI_BAD_RESPONSE,		/* received unexpected response */
829113a79cSeschrock 	EIPMI_BAD_RESPONSE_LENGTH,	/* unexpected response length */
832eeaed14Srobj 	EIPMI_INVALID_RESERVATION,	/* invalid or cancelled reservation */
849113a79cSeschrock 	EIPMI_NOT_PRESENT,		/* requested entity not present */
852eeaed14Srobj 	EIPMI_INVALID_REQUEST,		/* malformed request data */
862eeaed14Srobj 	EIPMI_BUSY,			/* service processor is busy */
872eeaed14Srobj 	EIPMI_NOSPACE,			/* service processor is out of space */
882eeaed14Srobj 	EIPMI_UNAVAILABLE,		/* service processor is unavailable */
89283bfb4dSEric Schrock 	EIPMI_ACCESS,			/* insufficient privileges */
90283bfb4dSEric Schrock 	EIPMI_BADPARAM,			/* parameter is not supported */
91283bfb4dSEric Schrock 	EIPMI_READONLY,			/* attempt to write read-only param */
9281d9f076SRobert Johnston 	EIPMI_WRITEONLY,		/* attempt to read write-only param */
9381d9f076SRobert Johnston 	EIPMI_LAN_OPEN_FAILED,		/* failed to open socket */
9481d9f076SRobert Johnston 	EIPMI_LAN_PING_FAILED,		/* RMCP Ping message failed */
9581d9f076SRobert Johnston 	EIPMI_LAN_PASSWD_NOTSUP, /* password authentication not supported */
9681d9f076SRobert Johnston 	EIPMI_LAN_CHALLENGE,		/* failure getting challenge */
9781d9f076SRobert Johnston 	EIPMI_LAN_SESSION,		/* failure activating session */
9881d9f076SRobert Johnston 	EIPMI_LAN_SETPRIV		/* failure setting session privs */
992eeaed14Srobj } ipmi_errno_t;
1009113a79cSeschrock 
1019113a79cSeschrock /*
1029113a79cSeschrock  * Basic library functions.
1039113a79cSeschrock  *
1049113a79cSeschrock  * The ipmi_handle is the primary interface to the library.  The library itself
1059113a79cSeschrock  * is not MT-safe, but it is safe within a single handle.  Multithreaded clients
1069113a79cSeschrock  * should either open multiple handles, or otherwise synchronize access to the
1079113a79cSeschrock  * same handle.
1089113a79cSeschrock  *
1099113a79cSeschrock  * There is a single command response buffer that is stored with the handle, to
1109113a79cSeschrock  * simplify memory management in the caller.  The memory referenced by a command
1119113a79cSeschrock  * response is only valid until the next command is issued.  The caller is
1129113a79cSeschrock  * responsible for making a copy of the response if it is needed.
1139113a79cSeschrock  */
11481d9f076SRobert Johnston extern ipmi_handle_t *ipmi_open(int *, char **, uint_t xport_type, nvlist_t *);
11581d9f076SRobert Johnston 
11681d9f076SRobert Johnston /*
11781d9f076SRobert Johnston  * Constants for nvpair names for the params nvlist that is passed to
11881d9f076SRobert Johnston  * ipmi_open().  If the IPMI_TRANSPORT_BMC is desired, then it is sufficient
11981d9f076SRobert Johnston  * to just specify NULL for the params nvlist.
12081d9f076SRobert Johnston  *
12181d9f076SRobert Johnston  * For IPMI_TRANSPORT_LAN, the params nvlist must contain the following
12281d9f076SRobert Johnston  * nvpairs:
12381d9f076SRobert Johnston  *
12481d9f076SRobert Johnston  * IPMI_LAN_HOST, IPMI_LAN_USER, IPMI_LAN_PASSWD
12581d9f076SRobert Johnston  *
12681d9f076SRobert Johnston  * IPMI_LAN_PORT is optional and will default to 623
12781d9f076SRobert Johnston  * IPMI_LAN_PRIVLVL is optional and will default to admin
12881d9f076SRobert Johnston  * IPMI_LAN_TIMEOUT is optional and will default to 3 seconds
12981d9f076SRobert Johnston  * IPMI_LAN_NUM_RETIES is optional and will default to 5
13081d9f076SRobert Johnston  */
13181d9f076SRobert Johnston #define	IPMI_TRANSPORT_TYPE	"transport-type"
13281d9f076SRobert Johnston #define	IPMI_TRANSPORT_BMC	0x01
13381d9f076SRobert Johnston #define	IPMI_TRANSPORT_LAN	0x02
13481d9f076SRobert Johnston 
13581d9f076SRobert Johnston #define	IPMI_LAN_HOST		"lan-host"
13681d9f076SRobert Johnston #define	IPMI_LAN_PORT		"lan-port"
13781d9f076SRobert Johnston #define	IPMI_LAN_USER		"lan-user"
13881d9f076SRobert Johnston #define	IPMI_LAN_PASSWD		"lan-passwd"
13981d9f076SRobert Johnston #define	IPMI_LAN_PRIVLVL	"lan-privlvl"
14081d9f076SRobert Johnston #define	IPMI_LAN_TIMEOUT	"lan-timeout"
14181d9f076SRobert Johnston #define	IPMI_LAN_NUM_RETRIES	"lan-num-retries"
14281d9f076SRobert Johnston 
1439113a79cSeschrock extern void ipmi_close(ipmi_handle_t *);
1449113a79cSeschrock 
1459113a79cSeschrock extern int ipmi_errno(ipmi_handle_t *);
1469113a79cSeschrock extern const char *ipmi_errmsg(ipmi_handle_t *);
1479113a79cSeschrock 
1489113a79cSeschrock /*
1499113a79cSeschrock  * Raw requests.  See section 5.
1509113a79cSeschrock  */
1519113a79cSeschrock typedef struct ipmi_cmd {
1529113a79cSeschrock 	uint8_t		ic_netfn:6;
1539113a79cSeschrock 	uint8_t		ic_lun:2;
1549113a79cSeschrock 	uint8_t		ic_cmd;
1559113a79cSeschrock 	uint16_t	ic_dlen;
1569113a79cSeschrock 	void		*ic_data;
1579113a79cSeschrock } ipmi_cmd_t;
1589113a79cSeschrock 
1599113a79cSeschrock extern ipmi_cmd_t *ipmi_send(ipmi_handle_t *, ipmi_cmd_t *);
1609113a79cSeschrock 
1619113a79cSeschrock /*
1629113a79cSeschrock  * Retrieve basic information about the IPMI device.  See section 20.1 "Get
1639113a79cSeschrock  * Device ID Command".
1649113a79cSeschrock  */
1659113a79cSeschrock #define	IPMI_CMD_GET_DEVICEID		0x01
1669113a79cSeschrock 
1679113a79cSeschrock typedef struct ipmi_deviceid {
1689113a79cSeschrock 	uint8_t		id_devid;
1692c32020fSeschrock 	DECL_BITFIELD3(
1702c32020fSeschrock 	    id_dev_rev		:4,
1712c32020fSeschrock 	    __reserved		:3,
1722c32020fSeschrock 	    id_dev_sdrs		:1);
1732c32020fSeschrock 	DECL_BITFIELD2(
1742c32020fSeschrock 	    id_firm_major	:7,
1752c32020fSeschrock 	    id_dev_available	:1);
1769113a79cSeschrock 	uint8_t		id_firm_minor;
1779113a79cSeschrock 	uint8_t		id_ipmi_rev;
1789113a79cSeschrock 	uint8_t		id_dev_support;
1799113a79cSeschrock 	uint8_t		id_manufacturer[3];
18081d9f076SRobert Johnston 	uint8_t		id_product[2];
1819113a79cSeschrock } ipmi_deviceid_t;
1829113a79cSeschrock 
1832eeaed14Srobj #define	IPMI_OEM_SUN		0x2a
1842eeaed14Srobj #define	IPMI_PROD_SUN_ILOM	0x4701
1859113a79cSeschrock 
1869113a79cSeschrock ipmi_deviceid_t *ipmi_get_deviceid(ipmi_handle_t *);
1879113a79cSeschrock 
1889113a79cSeschrock #define	ipmi_devid_manufacturer(dp)		\
1899113a79cSeschrock 	((dp)->id_manufacturer[0] |		\
1909113a79cSeschrock 	((dp)->id_manufacturer[1] << 8) |	\
1919113a79cSeschrock 	((dp)->id_manufacturer[2] << 16))
1929113a79cSeschrock 
19381d9f076SRobert Johnston #define	ipmi_devid_product(dp)		\
19481d9f076SRobert Johnston 	((dp)->id_product[0] |		\
19581d9f076SRobert Johnston 	((dp)->id_product[1] << 8))
19681d9f076SRobert Johnston 
1972eeaed14Srobj const char *ipmi_firmware_version(ipmi_handle_t *);
1982eeaed14Srobj 
19981d9f076SRobert Johnston /*
20081d9f076SRobert Johnston  * Get Channel Auth Caps.  See section 22.13.
20181d9f076SRobert Johnston  */
20281d9f076SRobert Johnston typedef struct ipmi_channel_auth_caps {
20381d9f076SRobert Johnston 	uint8_t cap_channel;
20481d9f076SRobert Johnston 	DECL_BITFIELD3(
20581d9f076SRobert Johnston 	    cap_authtype	:6,
20681d9f076SRobert Johnston 	    __reserved1		:1,
20781d9f076SRobert Johnston 	    cap_ipmirev2	:1);
20881d9f076SRobert Johnston 	DECL_BITFIELD5(
20981d9f076SRobert Johnston 	    cap_anon		:3,
21081d9f076SRobert Johnston 	    cap_peruser		:1,
21181d9f076SRobert Johnston 	    cap_permesg		:1,
21281d9f076SRobert Johnston 	    cap_kgstatus	:1,
21381d9f076SRobert Johnston 	    __reserved2		:2);
21481d9f076SRobert Johnston 	uint8_t cap_ext;
21581d9f076SRobert Johnston 	uint8_t cap_oemid[3];
21681d9f076SRobert Johnston 	uint8_t cap_oemaux;
21781d9f076SRobert Johnston } ipmi_channel_auth_caps_t;
21881d9f076SRobert Johnston 
21981d9f076SRobert Johnston #define	IPMI_CMD_GET_CHANNEL_AUTH_CAPS	0x38
22081d9f076SRobert Johnston extern ipmi_channel_auth_caps_t *ipmi_get_channel_auth_caps(ipmi_handle_t *,
22181d9f076SRobert Johnston     uint8_t, uint8_t);
22281d9f076SRobert Johnston 
223283bfb4dSEric Schrock /*
224283bfb4dSEric Schrock  * Get Channel Info.  See section 22.24.
225283bfb4dSEric Schrock  */
226283bfb4dSEric Schrock typedef struct ipmi_channel_info {
227283bfb4dSEric Schrock 	DECL_BITFIELD2(
228283bfb4dSEric Schrock 	    ici_number		:4,
229283bfb4dSEric Schrock 	    __reserved1		:4);
230283bfb4dSEric Schrock 	DECL_BITFIELD2(
231283bfb4dSEric Schrock 	    ici_medium		:7,
232283bfb4dSEric Schrock 	    __reserved2		:1);
233283bfb4dSEric Schrock 	DECL_BITFIELD2(
234283bfb4dSEric Schrock 	    ici_protocol	:5,
235283bfb4dSEric Schrock 	    __reserved3		:3);
236283bfb4dSEric Schrock 	DECL_BITFIELD3(
237283bfb4dSEric Schrock 	    ici_session_count	:6,
238283bfb4dSEric Schrock 	    ici_single_session	:1,
239283bfb4dSEric Schrock 	    ici_multi_Session	:1);
240283bfb4dSEric Schrock 	uint8_t		ici_vendor[3];
241283bfb4dSEric Schrock 	uint8_t		ici_auxinfo[2];
242283bfb4dSEric Schrock } ipmi_channel_info_t;
243283bfb4dSEric Schrock 
244283bfb4dSEric Schrock #define	IPMI_CMD_GET_CHANNEL_INFO	0x42
245283bfb4dSEric Schrock 
246283bfb4dSEric Schrock /*
247283bfb4dSEric Schrock  * Channel Numbers.  See section 6.3.
248283bfb4dSEric Schrock  */
249283bfb4dSEric Schrock #define	IPMI_CHANNEL_PRIMARY		0x0
250283bfb4dSEric Schrock #define	IPMI_CHANNEL_MIN		0x1
251283bfb4dSEric Schrock #define	IPMI_CHANNEL_MAX		0xB
252283bfb4dSEric Schrock #define	IPMI_CHANNEL_CURRENT		0xE
253283bfb4dSEric Schrock #define	IPMI_CHANNEL_SYSTEM		0xF
254283bfb4dSEric Schrock 
255283bfb4dSEric Schrock extern ipmi_channel_info_t *ipmi_get_channel_info(ipmi_handle_t *, int);
256283bfb4dSEric Schrock 
257283bfb4dSEric Schrock /*
258283bfb4dSEric Schrock  * Channel Protocol Types.  See section 6.4.
259283bfb4dSEric Schrock  */
260283bfb4dSEric Schrock #define	IPMI_PROTOCOL_IPMB		0x1
261283bfb4dSEric Schrock #define	IPMI_PROTOCOL_ICMB		0x2
262283bfb4dSEric Schrock #define	IPMI_PROTOCOL_SMBUS		0x4
263283bfb4dSEric Schrock #define	IPMI_PROTOCOL_KCS		0x5
264283bfb4dSEric Schrock #define	IPMI_PROTOCOL_SMIC		0x6
265283bfb4dSEric Schrock #define	IPMI_PROTOCOL_BT10		0x7
266283bfb4dSEric Schrock #define	IPMI_PROTOCOL_BT15		0x8
267283bfb4dSEric Schrock #define	IPMI_PROTOCOL_TMODE		0x9
268283bfb4dSEric Schrock #define	IPMI_PROTOCOL_OEM1		0xC
269283bfb4dSEric Schrock #define	IPMI_PROTOCOL_OEM2		0xD
270283bfb4dSEric Schrock #define	IPMI_PROTOCOL_OEM3		0xE
271283bfb4dSEric Schrock #define	IPMI_PROTOCOL_OEM4		0xF
272283bfb4dSEric Schrock 
273283bfb4dSEric Schrock /*
274283bfb4dSEric Schrock  * Channel Medium Types.  See section 6.5.
275283bfb4dSEric Schrock  */
276283bfb4dSEric Schrock #define	IPMI_MEDIUM_IPMB		0x1
277283bfb4dSEric Schrock #define	IPMI_MEDIUM_ICMB10		0x2
278283bfb4dSEric Schrock #define	IPMI_MEDIUM_ICMB09		0x3
279283bfb4dSEric Schrock #define	IPMI_MEDIUM_8023LAN		0x4
280283bfb4dSEric Schrock #define	IPMI_MEDIUM_RS232		0x5
281283bfb4dSEric Schrock #define	IPMI_MEDIUM_OTHERLAN		0x6
282283bfb4dSEric Schrock #define	IPMI_MEDIUM_PCISMBUS		0x7
283283bfb4dSEric Schrock #define	IPMI_MEDIUM_SMBUS10		0x8
284283bfb4dSEric Schrock #define	IPMI_MEDIUM_SMBUS20		0x9
285283bfb4dSEric Schrock #define	IPMI_MEDIUM_USB1		0xA
286283bfb4dSEric Schrock #define	IPMI_MEDIUM_USB2		0xB
287283bfb4dSEric Schrock #define	IPMI_MEDIUM_SYSTEM		0xC
288283bfb4dSEric Schrock 
289283bfb4dSEric Schrock /*
290283bfb4dSEric Schrock  * LAN Configuration.  See section 23.  While the underlying mechanism is
291283bfb4dSEric Schrock  * implemented via a sequence of get/set parameter commands, we assume that
292283bfb4dSEric Schrock  * consumers prefer to get and set information in chunks, and therefore expose
293283bfb4dSEric Schrock  * the configuration as a structure, with some of the less useful fields
294283bfb4dSEric Schrock  * removed.  When making changes, the consumer specifies which fields to apply
295283bfb4dSEric Schrock  * along with the structure the library takes care of the rest of the work.
296283bfb4dSEric Schrock  *
297283bfb4dSEric Schrock  * This can be expanded in the future as needed.
298283bfb4dSEric Schrock  */
299283bfb4dSEric Schrock 
300283bfb4dSEric Schrock typedef struct ipmi_lan_config {
301283bfb4dSEric Schrock 	boolean_t	ilc_set_in_progress;
302283bfb4dSEric Schrock 	uint32_t	ilc_ipaddr;
303283bfb4dSEric Schrock 	uint8_t		ilc_ipaddr_source;
304283bfb4dSEric Schrock 	uint8_t		ilc_macaddr[6];
305283bfb4dSEric Schrock 	uint32_t	ilc_subnet;
306283bfb4dSEric Schrock 	uint32_t	ilc_gateway_addr;
307283bfb4dSEric Schrock } ipmi_lan_config_t;
308283bfb4dSEric Schrock 
309283bfb4dSEric Schrock #define	IPMI_LAN_SRC_UNSPECIFIED	0x0
310283bfb4dSEric Schrock #define	IPMI_LAN_SRC_STATIC		0x1
311283bfb4dSEric Schrock #define	IPMI_LAN_SRC_DHCP		0x2
312283bfb4dSEric Schrock #define	IPMI_LAN_SRC_BIOS		0x3
313283bfb4dSEric Schrock #define	IPMI_LAN_SRC_OTHER		0x4
314283bfb4dSEric Schrock 
315283bfb4dSEric Schrock #define	IPMI_LAN_SET_IPADDR		0x01
316283bfb4dSEric Schrock #define	IPMI_LAN_SET_IPADDR_SOURCE	0x02
317283bfb4dSEric Schrock #define	IPMI_LAN_SET_MACADDR		0x04
318283bfb4dSEric Schrock #define	IPMI_LAN_SET_SUBNET		0x08
319283bfb4dSEric Schrock #define	IPMI_LAN_SET_GATEWAY_ADDR	0x10
320283bfb4dSEric Schrock 
321283bfb4dSEric Schrock #define	IPMI_CMD_SET_LAN_CONFIG		0x01
322283bfb4dSEric Schrock #define	IPMI_CMD_GET_LAN_CONFIG		0x02
323283bfb4dSEric Schrock 
324283bfb4dSEric Schrock extern int ipmi_lan_get_config(ipmi_handle_t *, int,
325283bfb4dSEric Schrock     ipmi_lan_config_t *);
326283bfb4dSEric Schrock extern int ipmi_lan_set_config(ipmi_handle_t *, int, ipmi_lan_config_t *, int);
327283bfb4dSEric Schrock 
3282eeaed14Srobj /*
3292eeaed14Srobj  * SEL (System Event Log) commands.  Currently the library only provides
3302eeaed14Srobj  * commands for reading the SEL.
3312eeaed14Srobj  */
3322eeaed14Srobj 
3332eeaed14Srobj /*
3342eeaed14Srobj  * 31.2 Get SEL Info Command
3352eeaed14Srobj  */
3362eeaed14Srobj #define	IPMI_CMD_GET_SEL_INFO		0x40
3372eeaed14Srobj 
3382eeaed14Srobj typedef struct ipmi_sel_info {
3392eeaed14Srobj 	uint8_t		isel_version;
3402eeaed14Srobj 	uint16_t	isel_entries;
3412eeaed14Srobj 	uint16_t	isel_free;
3422eeaed14Srobj 	uint32_t	isel_add_ts;
3432eeaed14Srobj 	uint32_t	isel_erase_ts;
3442eeaed14Srobj 	DECL_BITFIELD6(
3452eeaed14Srobj 	    isel_supp_allocation	:1,
3462eeaed14Srobj 	    isel_supp_reserve		:1,
3472eeaed14Srobj 	    isel_supp_partial		:1,
3482eeaed14Srobj 	    isel_supp_delete		:1,
3492eeaed14Srobj 	    __reserved			:3,
3502eeaed14Srobj 	    isel_overflow		:1);
3512eeaed14Srobj } ipmi_sel_info_t;
3522eeaed14Srobj 
3532eeaed14Srobj extern ipmi_sel_info_t *ipmi_sel_get_info(ipmi_handle_t *);
3542eeaed14Srobj extern boolean_t ipmi_sdr_changed(ipmi_handle_t *);
3552eeaed14Srobj extern int ipmi_sdr_refresh(ipmi_handle_t *);
3562eeaed14Srobj 
3572eeaed14Srobj /*
3582eeaed14Srobj  * 32.1 SEL Event Records
3592eeaed14Srobj  */
3602eeaed14Srobj typedef struct ipmi_sel_event {
3612eeaed14Srobj 	uint16_t	isel_ev_next;
3622eeaed14Srobj 	uint16_t	isel_ev_recid;
3632eeaed14Srobj 	uint8_t		isel_ev_rectype;
3642eeaed14Srobj 	uint32_t	isel_ev_ts;
3652eeaed14Srobj 	DECL_BITFIELD2(
3662eeaed14Srobj 	    isel_ev_software	:1,
3672eeaed14Srobj 	    isel_ev_addr_or_id	:7);
3682eeaed14Srobj 	DECL_BITFIELD3(
3692eeaed14Srobj 	    isel_ev_lun		:2,
3702eeaed14Srobj 	    __reserved		:2,
3712eeaed14Srobj 	    isel_ev_channel	:4);
3722eeaed14Srobj 	uint8_t		isel_ev_rev;
3732eeaed14Srobj 	uint8_t		isel_ev_sensor_type;
3742eeaed14Srobj 	uint8_t		isel_ev_sensor_number;
3752eeaed14Srobj 	DECL_BITFIELD2(
3762eeaed14Srobj 	    isel_ev_type	:7,
3772eeaed14Srobj 	    isel_ev_dir		:1);
3782eeaed14Srobj 	uint8_t		isel_ev_data[3];
3792eeaed14Srobj } ipmi_sel_event_t;
3802eeaed14Srobj 
3812eeaed14Srobj #define	IPMI_EV_REV15		0x04
3822eeaed14Srobj #define	IPMI_EV_REV1		0x03
3832eeaed14Srobj 
3842eeaed14Srobj #define	IPMI_SEL_SYSTEM		0x02
3852eeaed14Srobj #define	IPMI_SEL_OEMTS_LO	0xC0
3862eeaed14Srobj #define	IPMI_SEL_OEMTS_HI	0xDF
3872eeaed14Srobj #define	IPMI_SEL_OEM_LO		0xE0
3882eeaed14Srobj #define	IPMI_SEL_OEM_HI		0xFF
3892eeaed14Srobj 
3902eeaed14Srobj #define	IPMI_EV_ASSERT		0x0
3912eeaed14Srobj #define	IPMI_EV_DEASSERT	0x1
3922eeaed14Srobj 
3932eeaed14Srobj /*
3942eeaed14Srobj  * 32.2 OEM SEL Record (with timestamp)
3952eeaed14Srobj  */
3962eeaed14Srobj typedef struct ipmi_sel_oem_ts {
3972eeaed14Srobj 	uint16_t	isel_oem_next;
3982eeaed14Srobj 	uint16_t	isel_oem_id;
3992eeaed14Srobj 	uint8_t		isel_oem_type;
4002eeaed14Srobj 	uint32_t	isel_oem_ts;
4012eeaed14Srobj 	uint8_t		isel_oem_devid[3];
4022eeaed14Srobj 	uint8_t		isel_oem_data[6];
4032eeaed14Srobj } ipmi_sel_oem_ts_t;
4042eeaed14Srobj 
4052eeaed14Srobj /*
4062eeaed14Srobj  * 32.3 OEM SEL Record (no timestamp)
4072eeaed14Srobj  */
4082eeaed14Srobj typedef struct ipmi_sel_oem {
4092eeaed14Srobj 	uint16_t	isel_oem_next;
4102eeaed14Srobj 	uint16_t	isel_oem_id;
4112eeaed14Srobj 	uint8_t		isel_oem_type;
4122eeaed14Srobj 	uint8_t		isel_oem_data[13];
4132eeaed14Srobj } ipmi_sel_oem_t;
4142eeaed14Srobj 
415283bfb4dSEric Schrock /*
416283bfb4dSEric Schrock  * 29.3 Platform Event Message Command.
417283bfb4dSEric Schrock  */
418283bfb4dSEric Schrock typedef struct ipmi_platform_event_message {
419283bfb4dSEric Schrock 	uint8_t		ipem_generator;
420283bfb4dSEric Schrock 	uint8_t		ipem_rev;
421283bfb4dSEric Schrock 	uint8_t		ipem_sensor_type;
422283bfb4dSEric Schrock 	uint8_t		ipem_sensor_num;
423283bfb4dSEric Schrock 	DECL_BITFIELD2(
424283bfb4dSEric Schrock 	    ipem_event_type	:7,
425283bfb4dSEric Schrock 	    ipem_event_dir	:1);
426283bfb4dSEric Schrock 	uint8_t		ipem_event_data[3];
427283bfb4dSEric Schrock } ipmi_platform_event_message_t;
428283bfb4dSEric Schrock 
429283bfb4dSEric Schrock #define	IPMI_CMD_PLATFORM_EVENT_MESSAGE	0x02
430283bfb4dSEric Schrock 
431283bfb4dSEric Schrock extern int ipmi_event_platform_message(ipmi_handle_t *,
432283bfb4dSEric Schrock     ipmi_platform_event_message_t *);
433283bfb4dSEric Schrock 
4342eeaed14Srobj /*
4352eeaed14Srobj  * 29.7 Event Data Field Formats.  Consumers can cast the data field of the
4362eeaed14Srobj  * event record to the appropriate type depending on the sensor class.
4372eeaed14Srobj  */
4382eeaed14Srobj 
4392eeaed14Srobj typedef struct ipmi_event_threshold {
4402eeaed14Srobj 	DECL_BITFIELD3(
4412eeaed14Srobj 	    iev_offset		:4,
4422eeaed14Srobj 	    iev_desc_byte3	:2,
4432eeaed14Srobj 	    iev_desc_byte2	:2);
4442eeaed14Srobj 	uint8_t		iev_reading;
4452eeaed14Srobj 	uint8_t		iev_threshold;
4462eeaed14Srobj } ipmi_event_threshold_t;
4472eeaed14Srobj 
4482eeaed14Srobj #define	IPMI_EV_DESC_UNSPECIFIED	0x00
4492eeaed14Srobj #define	IPMI_EV_DESC_TRIGGER		0x01
4502eeaed14Srobj #define	IPMI_EV_DESC_OEM		0x02
4512eeaed14Srobj #define	IPMI_EV_DESC_SPECIFIC		0x03
4522eeaed14Srobj 
4532eeaed14Srobj typedef struct ipmi_event_discrete {
4542eeaed14Srobj 	DECL_BITFIELD3(
4552eeaed14Srobj 	    iev_offset		:4,
4562eeaed14Srobj 	    iev_desc_byte3	:2,
4572eeaed14Srobj 	    iev_desc_byte2	:2);
4582eeaed14Srobj 	DECL_BITFIELD2(
4592eeaed14Srobj 	    iev_offset_type	:4,
4602eeaed14Srobj 	    iev_offset_severity	:4);
4612eeaed14Srobj 	uint8_t		iev_oem_code;
4622eeaed14Srobj } ipmi_event_discrete_t;
4632eeaed14Srobj 
4642eeaed14Srobj #define	IPMI_EV_DESC_PREVSTATE		0x01
4652eeaed14Srobj #define	IPMI_EV_DESC_SPECIFIC		0x03
4662eeaed14Srobj 
4672eeaed14Srobj typedef struct ipmi_event_oem {
4682eeaed14Srobj 	DECL_BITFIELD3(
4692eeaed14Srobj 	    iev_offset		:4,
4702eeaed14Srobj 	    iev_desc_byte3	:2,
4712eeaed14Srobj 	    iev_desc_byte2	:2);
4722eeaed14Srobj 	DECL_BITFIELD2(
4732eeaed14Srobj 	    iev_offset_type	:4,
4742eeaed14Srobj 	    iev_offset_severity	:4);
4752eeaed14Srobj 	uint8_t		iev_oem_code;
4762eeaed14Srobj } ipmi_event_oem_t;
4772eeaed14Srobj 
4782eeaed14Srobj /*
4792eeaed14Srobj  * Get SEL Entry Command.  See section 31.5.  We don't support partial reads, so
4802eeaed14Srobj  * this interface is quite a bit simpler than in the spec.  We default to
4812eeaed14Srobj  * returning event records, though the consumer should check the type field and
4822eeaed14Srobj  * cast it to the appropriate type if it is no IPMI_SEL_SYSTEM.
4832eeaed14Srobj  */
4842eeaed14Srobj #define	IPMI_CMD_GET_SEL_ENTRY		0x43
4852eeaed14Srobj 
4862eeaed14Srobj extern ipmi_sel_event_t *ipmi_sel_get_entry(ipmi_handle_t *, uint16_t);
4872eeaed14Srobj 
4882eeaed14Srobj #define	IPMI_SEL_FIRST_ENTRY		0x0000
4892eeaed14Srobj #define	IPMI_SEL_LAST_ENTRY		0xFFFF
4902eeaed14Srobj 
4912eeaed14Srobj /*
4922eeaed14Srobj  * SEL time management.  See sections 31.10 and 31.11.
4932eeaed14Srobj  */
4942eeaed14Srobj #define	IPMI_CMD_GET_SEL_TIME		0x48
4952eeaed14Srobj #define	IPMI_CMD_SET_SEL_TIME		0x49
4962eeaed14Srobj #define	IPMI_CMD_GET_SEL_UTC_OFFSET	0x5C
4972eeaed14Srobj #define	IPMI_CMD_SET_SEL_UTC_OFFSET	0x5D
4982eeaed14Srobj 
4992eeaed14Srobj extern int ipmi_sel_get_time(ipmi_handle_t *, uint32_t *);
5002eeaed14Srobj extern int ipmi_sel_set_time(ipmi_handle_t *, uint32_t);
5012eeaed14Srobj extern int ipmi_sel_get_utc_offset(ipmi_handle_t *, int *);
5022eeaed14Srobj extern int ipmi_sel_set_utc_offset(ipmi_handle_t *, int);
5032eeaed14Srobj 
5049113a79cSeschrock /*
5059113a79cSeschrock  * SDR (Sensor Device Record) requests.  A cache of the current SDR repository
5062eeaed14Srobj  * is kept as part of the IPMI handle and updated when necessary.  This does the
5072eeaed14Srobj  * work of processing the SDR names and providing an easy way to lookup
5082eeaed14Srobj  * individual records and iterate over all records.
5099113a79cSeschrock  */
5109113a79cSeschrock 
5112eeaed14Srobj /*
5122eeaed14Srobj  * Get SDR Repository Info Command.  See section 33.9.
5132eeaed14Srobj  */
5142eeaed14Srobj #define	IPMI_CMD_GET_SDR_INFO		0x20
5152eeaed14Srobj 
5162eeaed14Srobj typedef struct ipmi_sdr_info {
5172eeaed14Srobj 	uint8_t		isi_version;
5182eeaed14Srobj 	uint16_t	isi_record_count;
5192eeaed14Srobj 	uint16_t	isi_free_space;
5202eeaed14Srobj 	uint32_t	isi_add_ts;
5212eeaed14Srobj 	uint32_t	isi_erase_ts;
5222eeaed14Srobj 	DECL_BITFIELD7(
5232eeaed14Srobj 	    isi_supp_allocation		:1,
5242eeaed14Srobj 	    isi_supp_reserve		:1,
5252eeaed14Srobj 	    isi_supp_partial		:1,
5262eeaed14Srobj 	    isi_supp_delete		:1,
5272eeaed14Srobj 	    __reserved			:1,
5282eeaed14Srobj 	    isi_modal			:2,
5292eeaed14Srobj 	    isi_overflow		:1);
5302eeaed14Srobj } ipmi_sdr_info_t;
5312eeaed14Srobj 
5322eeaed14Srobj extern ipmi_sdr_info_t *ipmi_sdr_get_info(ipmi_handle_t *);
5332eeaed14Srobj 
5349113a79cSeschrock /*
5359113a79cSeschrock  * Reserve repository command.  See section 33.11.
5369113a79cSeschrock  */
5379113a79cSeschrock #define	IPMI_CMD_RESERVE_SDR_REPOSITORY	0x22
5389113a79cSeschrock 
5399113a79cSeschrock /*
5409113a79cSeschrock  * Get SDR command.  See section 33.12.  This command accesses the raw SDR
5419113a79cSeschrock  * repository.  Clients can also use the lookup functions to retrieve a
5429113a79cSeschrock  * particular SDR record by name.
5439113a79cSeschrock  *
5449113a79cSeschrock  * The list of possible types is indicated in the sub-chapters of section 43.
5459113a79cSeschrock  */
5469113a79cSeschrock typedef struct ipmi_sdr {
5479113a79cSeschrock 	uint16_t	is_id;
5489113a79cSeschrock 	uint8_t		is_version;
5499113a79cSeschrock 	uint8_t		is_type;
5509113a79cSeschrock 	uint8_t		is_length;
5519113a79cSeschrock 	uint8_t		is_record[1];
5529113a79cSeschrock } ipmi_sdr_t;
5539113a79cSeschrock #define	IPMI_CMD_GET_SDR		0x23
5549113a79cSeschrock 
5559113a79cSeschrock #define	IPMI_SDR_FIRST			0x0000
5569113a79cSeschrock #define	IPMI_SDR_LAST			0xFFFF
5579113a79cSeschrock 
5589113a79cSeschrock extern ipmi_sdr_t *ipmi_sdr_get(ipmi_handle_t *, uint16_t, uint16_t *);
5599113a79cSeschrock 
5602eeaed14Srobj /*
5612eeaed14Srobj  * Full Sensor Record.  See 43.1
5622eeaed14Srobj  */
5632eeaed14Srobj #define	IPMI_SDR_TYPE_FULL_SENSOR		0x01
5642eeaed14Srobj 
5652eeaed14Srobj typedef struct ipmi_sdr_full_sensor {
5662eeaed14Srobj 	/* RECORD KEY BYTES */
5672eeaed14Srobj 	uint8_t		is_fs_owner;
5682eeaed14Srobj 	DECL_BITFIELD3(
5692eeaed14Srobj 	    is_fs_sensor_lun			:2,
5702eeaed14Srobj 	    __reserved1				:2,
5712eeaed14Srobj 	    is_fs_channel			:4);
5722eeaed14Srobj 	uint8_t		is_fs_number;
5732eeaed14Srobj 	/* RECORD BODY BYTES */
5742eeaed14Srobj 	uint8_t		is_fs_entity_id;
5752eeaed14Srobj 	DECL_BITFIELD2(
5762eeaed14Srobj 	    is_fs_entity_instance		:7,
5772eeaed14Srobj 	    is_fs_entity_logical		:1);
5782eeaed14Srobj 	DECL_BITFIELD8(
5792eeaed14Srobj 	    is_fs_sensor_scanning_enabled	:1,
5802eeaed14Srobj 	    is_fs_event_generation_enabled	:1,
5812eeaed14Srobj 	    is_fs_init_sensor_type		:1,
5822eeaed14Srobj 	    is_fs_init_hysteresis		:1,
5832eeaed14Srobj 	    is_fs_init_thresholds		:1,
5842eeaed14Srobj 	    is_fs_init_events			:1,
5852eeaed14Srobj 	    is_fs_init_scanning			:1,
5862eeaed14Srobj 	    is_fs_settable			:1);
5872eeaed14Srobj 	DECL_BITFIELD5(
5882eeaed14Srobj 	    is_fs_event_support			:2,
5892eeaed14Srobj 	    is_fs_threshold_support		:2,
5902eeaed14Srobj 	    is_fs_hysteresis_support		:2,
5912eeaed14Srobj 	    is_fs_rearm_support			:1,
5922eeaed14Srobj 	    is_fs_ignore			:1);
5932eeaed14Srobj 	uint8_t		is_fs_type;
5942eeaed14Srobj 	uint8_t		is_fs_reading_type;
5952eeaed14Srobj 	uint16_t	is_fs_assert_mask;
5962eeaed14Srobj 	uint16_t	is_fs_deassert_mask;
5972eeaed14Srobj 	uint16_t	is_fs_reading_mask;
5982eeaed14Srobj 	DECL_BITFIELD4(
5992eeaed14Srobj 	    is_fs_units_isprcnt			:1,
6002eeaed14Srobj 	    is_fs_mod_unit			:2,
6012eeaed14Srobj 	    is_fs_rate_unit			:3,
6022eeaed14Srobj 	    is_fs_analog_fmt			:2);
6032eeaed14Srobj 	uint8_t		is_fs_unit2;
6042eeaed14Srobj 	uint8_t		is_fs_unit3;
6052eeaed14Srobj 	/* Linearization */
6062eeaed14Srobj 	DECL_BITFIELD2(
6072eeaed14Srobj 	    is_fs_sensor_linear_type		:7,
6082eeaed14Srobj 	    __reserved2				:1);
6092eeaed14Srobj 	/* M, Tolerance */
6102eeaed14Srobj 	uint16_t	is_fs_mtol;
6112eeaed14Srobj 	/* B, Accuracy, R exp, B exp */
6122eeaed14Srobj 	uint32_t	is_fs_bacc;
6132eeaed14Srobj 	DECL_BITFIELD4(
6142eeaed14Srobj 	    is_fs_nominal_reading_spec		:1,
6152eeaed14Srobj 	    is_fs_normal_max_spec		:1,
6162eeaed14Srobj 	    is_fs_normal_min_spec		:1,
6172eeaed14Srobj 	    __reserved3				:5);
6182eeaed14Srobj 	uint8_t	is_fs_nominal_reading;
6192eeaed14Srobj 	uint8_t	is_fs_normal_maximum;
6202eeaed14Srobj 	uint8_t	is_fs_normal_minimum;
6212eeaed14Srobj 	uint8_t	is_fs_max;
6222eeaed14Srobj 	uint8_t	is_fs_min;
6232eeaed14Srobj 	uint8_t is_fs_upper_nonrecov;
6242eeaed14Srobj 	uint8_t	is_fs_upper_critical;
6252eeaed14Srobj 	uint8_t	is_fs_upper_noncrit;
6262eeaed14Srobj 	uint8_t	is_fs_lower_nonrecov;
6272eeaed14Srobj 	uint8_t	is_fs_lower_critical;
6282eeaed14Srobj 	uint8_t	is_fs_lower_noncrit;
6292eeaed14Srobj 	uint8_t		is_fs_hysteresis_positive;
6302eeaed14Srobj 	uint8_t		is_fs_hysteresis_negative;
6312eeaed14Srobj 	uint16_t	__reserved4;
6322eeaed14Srobj 	uint8_t		is_fs_oem;
6332eeaed14Srobj 	DECL_BITFIELD3(
6342eeaed14Srobj 	    is_fs_idlen				:5,
6352eeaed14Srobj 	    __reserved5				:1,
6362eeaed14Srobj 	    is_fs_idtype			:2);
6372eeaed14Srobj 	char		is_fs_idstring[1];
6382eeaed14Srobj } ipmi_sdr_full_sensor_t;
6392eeaed14Srobj 
6402eeaed14Srobj #define	IPMI_SDR_TYPE_COMPACT_SENSOR		0x02
6412eeaed14Srobj 
6422eeaed14Srobj /*
6432eeaed14Srobj  * Compact Sensor Record.  See section 43.2
6442eeaed14Srobj  */
6452eeaed14Srobj typedef struct ipmi_sdr_compact_sensor {
6462eeaed14Srobj 	/* RECORD KEY BYTES */
6472eeaed14Srobj 	uint8_t		is_cs_owner;
6482eeaed14Srobj 	DECL_BITFIELD3(
6492eeaed14Srobj 	    is_cs_sensor_lun			:2,
6502eeaed14Srobj 	    is_cs_fru_lun			:2,
6512eeaed14Srobj 	    is_cs_channel			:4);
6522eeaed14Srobj 	uint8_t		is_cs_number;
6532eeaed14Srobj 	/* RECORD BODY BYTES */
6542eeaed14Srobj 	uint8_t		is_cs_entity_id;
6552eeaed14Srobj 	DECL_BITFIELD2(
6562eeaed14Srobj 	    is_cs_entity_instance		:7,
6572eeaed14Srobj 	    is_cs_entity_logical		:1);
6582eeaed14Srobj 	DECL_BITFIELD8(
6592eeaed14Srobj 	    is_cs_sensor_scanning_enabled	:1,
6602eeaed14Srobj 	    is_cs_event_generation_enabled	:1,
6612eeaed14Srobj 	    is_cs_init_sensor_type		:1,
6622eeaed14Srobj 	    is_cs_init_hysteresis		:1,
6632eeaed14Srobj 	    __reserved1				:1,
6642eeaed14Srobj 	    is_cs_init_events			:1,
6652eeaed14Srobj 	    is_cs_init_scanning			:1,
6662eeaed14Srobj 	    is_cs_settable			:1);
6672eeaed14Srobj 	DECL_BITFIELD5(
6682eeaed14Srobj 	    is_cs_event_support			:2,
6692eeaed14Srobj 	    is_cs_threshold_support		:2,
6702eeaed14Srobj 	    is_cs_hysteresis_support		:2,
6712eeaed14Srobj 	    is_cs_rearm_support			:1,
6722eeaed14Srobj 	    is_cs_ignore			:1);
6732eeaed14Srobj 	uint8_t		is_cs_type;
6742eeaed14Srobj 	uint8_t		is_cs_reading_type;
6752eeaed14Srobj 	uint16_t	is_cs_assert_mask;
6762eeaed14Srobj 	uint16_t	is_cs_deassert_mask;
6772eeaed14Srobj 	uint16_t	is_cs_reading_mask;
6782eeaed14Srobj 	DECL_BITFIELD4(
6792eeaed14Srobj 	    is_cs_units_isprcnt			:1,
6802eeaed14Srobj 	    is_cs_mod_unit			:2,
6812eeaed14Srobj 	    is_cs_rate_unit			:3,
6822eeaed14Srobj 	    __reserved2				:2);
6832eeaed14Srobj 	uint8_t		is_cs_unit2;
6842eeaed14Srobj 	uint8_t		is_cs_unit3;
6852eeaed14Srobj 	DECL_BITFIELD3(
6862eeaed14Srobj 	    is_cs_share_count			:4,
6872eeaed14Srobj 	    is_cs_modifier_type			:2,
6882eeaed14Srobj 	    is_cs_direction			:2);
6892eeaed14Srobj 	DECL_BITFIELD2(
6902eeaed14Srobj 	    is_cs_modifier_offset		:7,
6912eeaed14Srobj 	    is_cs_sharing			:1);
6922eeaed14Srobj 	uint8_t		is_cs_hysteresis_positive;
6932eeaed14Srobj 	uint8_t		is_cs_hysteresis_negative;
6942eeaed14Srobj 	uint16_t	__reserved3;
6952eeaed14Srobj 	uint8_t		__reserved4;
6962eeaed14Srobj 	uint8_t		is_cs_oem;
6972eeaed14Srobj 	DECL_BITFIELD3(
6982eeaed14Srobj 	    is_cs_idlen				:5,
6992eeaed14Srobj 	    __reserved5				:1,
7002eeaed14Srobj 	    is_cs_idtype			:2);
7012eeaed14Srobj 	char		is_cs_idstring[1];
7022eeaed14Srobj } ipmi_sdr_compact_sensor_t;
7032eeaed14Srobj 
7042eeaed14Srobj /*
7052eeaed14Srobj  * Threshold sensor masks for is_cs_assert_mask and is_cs_deassert_mask.
7062eeaed14Srobj  */
7072eeaed14Srobj #define	IPMI_SENSOR_RETURN_NONRECOV	0x4000
7082eeaed14Srobj #define	IPMI_SENSOR_RETURN_CRIT		0x2000
7092eeaed14Srobj #define	IPMI_SENSOR_RETURN_NONCRIT	0x1000
7102eeaed14Srobj 
7112eeaed14Srobj #define	IPMI_SENSOR_MASK_UPPER_NONRECOV_HI	0x0800
7122eeaed14Srobj #define	IPMI_SENSOR_MASK_UPPER_NONRECOV_LO	0x0400
7132eeaed14Srobj #define	IPMI_SENSOR_MASK_UPPER_CRIT_HI		0x0200
7142eeaed14Srobj #define	IPMI_SENSOR_MASK_UPPER_CRIT_LO		0x0100
7152eeaed14Srobj #define	IPMI_SENSOR_MASK_UPPER_NONCRIT_HI	0x0080
7162eeaed14Srobj #define	IPMI_SENSOR_MASK_UPPER_NONCRIT_LO	0x0040
7172eeaed14Srobj #define	IPMI_SENSOR_MASK_LOWER_NONRECOV_HI	0x0020
7182eeaed14Srobj #define	IPMI_SENSOR_MASK_LOWER_NONRECOV_LO	0x0010
7192eeaed14Srobj #define	IPMI_SENSOR_MASK_LOWER_CRIT_HI		0x0008
7202eeaed14Srobj #define	IPMI_SENSOR_MASK_LOWER_CRIT_LO		0x0004
7212eeaed14Srobj #define	IPMI_SENSOR_MASK_LOWER_NONCRIT_HI	0x0002
7222eeaed14Srobj #define	IPMI_SENSOR_MASK_LOWER_NONCRIT_LO	0x0001
7232eeaed14Srobj 
7242eeaed14Srobj /*
7252eeaed14Srobj  * Threshold sensor masks for is_cs_reading_mask.
7262eeaed14Srobj  */
7272eeaed14Srobj #define	IPMI_SENSOR_SETTABLE_UPPER_NONRECOV	0x2000
7282eeaed14Srobj #define	IPMI_SENSOR_SETTABLE_UPPER_CRIT		0x1000
7292eeaed14Srobj #define	IPMI_SENSOR_SETTABLE_UPPER_NONCRIT	0x0800
7302eeaed14Srobj #define	IPMI_SENSOR_SETTABLE_LOWER_NONRECOV	0x0400
7312eeaed14Srobj #define	IPMI_SENSOR_SETTABLE_LOWER_CRIT		0x0200
7322eeaed14Srobj #define	IPMI_SENSOR_SETTABLE_LOWER_NONCRIT	0x0100
7332eeaed14Srobj #define	IPMI_SENSOR_READABLE_UPPER_NONRECOV	0x0020
7342eeaed14Srobj #define	IPMI_SENSOR_READABLE_UPPER_CRIT		0x0010
7352eeaed14Srobj #define	IPMI_SENSOR_READABLE_UPPER_NONCRIT	0x0008
7362eeaed14Srobj #define	IPMI_SENSOR_READABLE_LOWER_NONRECOV	0x0004
7372eeaed14Srobj #define	IPMI_SENSOR_READABLE_LOWER_CRIT		0x0002
7382eeaed14Srobj #define	IPMI_SENSOR_READABLE_LOWER_NONCRIT	0x0001
7392eeaed14Srobj 
7402eeaed14Srobj /*
7412eeaed14Srobj  * Values for is_cs_reading_type.  See table 42-2.
7422eeaed14Srobj  */
7432eeaed14Srobj #define	IPMI_RT_THRESHOLD			0x01
7442eeaed14Srobj #define	IPMI_RT_USAGE				0x02
7452eeaed14Srobj #define	IPMI_RT_STATE				0x03
7462eeaed14Srobj #define	IPMI_RT_PREDFAIL			0x04
7472eeaed14Srobj #define	IPMI_RT_LIMIT				0x05
7482eeaed14Srobj #define	IPMI_RT_PERFORMANCE			0x06
7492eeaed14Srobj #define	IPMI_RT_SEVERITY			0x07
7502eeaed14Srobj #define	IPMI_RT_PRESENT				0x08
7512eeaed14Srobj #define	IPMI_RT_ENABLED				0x09
7522eeaed14Srobj #define	IPMI_RT_AVAILABILITY			0x0A
7532eeaed14Srobj #define	IPMI_RT_REDUNDANCY			0x0B
7542eeaed14Srobj #define	IPMI_RT_ACPI				0x0C
7552eeaed14Srobj #define	IPMI_RT_SPECIFIC			0x6F
7562eeaed14Srobj 
7572eeaed14Srobj /*
7582eeaed14Srobj  * Bitmasks based on above reading types.  See table 42-2
7592eeaed14Srobj  */
7602eeaed14Srobj #define	IPMI_SR_THRESHOLD_LOWER_NONCRIT_LOW	0x0001
7612eeaed14Srobj #define	IPMI_SR_THRESHOLD_LOWER_NONCRIT_HIGH	0x0002
7622eeaed14Srobj #define	IPMI_SR_THRESHOLD_LOWER_CRIT_LOW	0x0004
7632eeaed14Srobj #define	IPMI_SR_THRESHOLD_LOWER_CRIT_HIGH	0x0008
7642eeaed14Srobj #define	IPMI_SR_THRESHOLD_LOWER_NONRECOV_LOW	0x0010
7652eeaed14Srobj #define	IPMI_SR_THRESHOLD_LOWER_NONRECOV_HIGH	0x0020
7662eeaed14Srobj #define	IPMI_SR_THRESHOLD_UPPER_NONCRIT_LOW	0x0040
7672eeaed14Srobj #define	IPMI_SR_THRESHOLD_UPPER_NONCRIT_HIGH	0x0080
7682eeaed14Srobj #define	IPMI_SR_THRESHOLD_UPPER_CRIT_LOW	0x0100
7692eeaed14Srobj #define	IPMI_SR_THRESHOLD_UPPER_CRIT_HIGH	0x0200
7702eeaed14Srobj #define	IPMI_SR_THRESHOLD_UPPER_NONRECOV_LOW	0x0400
7712eeaed14Srobj #define	IPMI_SR_THRESHOLD_UPPER_NONRECOV_HIGH	0x0800
7722eeaed14Srobj 
7732eeaed14Srobj #define	IPMI_SR_USAGE_IDLE			0x0001
7742eeaed14Srobj #define	IPMI_SR_USAGE_ACTIVE			0x0002
7752eeaed14Srobj #define	IPMI_SR_USAGE_BUSY			0x0004
7762eeaed14Srobj 
7772eeaed14Srobj #define	IPMI_SR_STATE_DEASSERT			0x0001
7782eeaed14Srobj #define	IPMI_SR_STATE_ASSERT			0x0002
7792eeaed14Srobj 
7802eeaed14Srobj #define	IPMI_SR_PREDFAIL_DEASSERT		0x0001
7812eeaed14Srobj #define	IPMI_SR_PREDFAIL_ASSERT			0x0002
7822eeaed14Srobj 
7832eeaed14Srobj #define	IPMI_SR_LIMIT_NOTEXCEEDED		0x0001
7842eeaed14Srobj #define	IPMI_SR_LIMIT_EXCEEDED			0x0002
7852eeaed14Srobj 
7862eeaed14Srobj #define	IPMI_SR_PERFORMANCE_MET			0x0001
7872eeaed14Srobj #define	IPMI_SR_PERFORMANCE_LAGS		0x0002
7882eeaed14Srobj 
7892eeaed14Srobj #define	IPMI_SR_SEVERITY_TO_OK			0x0001
7902eeaed14Srobj #define	IPMI_SR_SEVERITY_OK_TO_NONCRIT		0x0002
7912eeaed14Srobj #define	IPMI_SR_SEVERITY_LESS_TO_CRIT		0x0004
7922eeaed14Srobj #define	IPMI_SR_SEVERITY_LESS_TO_NONRECOV	0x0008
7932eeaed14Srobj #define	IPMI_SR_SEVERITY_MORE_TO_NONCRIT	0x0010
7942eeaed14Srobj #define	IPMI_SR_SEVERITY_NONRECOV_TO_CRIT	0x0020
7952eeaed14Srobj #define	IPMI_SR_SEVERITY_TO_NONRECOV		0x0040
7962eeaed14Srobj #define	IPMI_SR_SEVERITY_MONITOR		0x0080
7972eeaed14Srobj #define	IPMI_SR_SEVERITY_INFO			0x0100
7982eeaed14Srobj 
7992eeaed14Srobj #define	IPMI_SR_PRESENT_DEASSERT		0x0001
8002eeaed14Srobj #define	IPMI_SR_PRESENT_ASSERT			0x0002
8012eeaed14Srobj 
8022eeaed14Srobj #define	IPMI_SR_ENABLED_DEASSERT		0x0001
8032eeaed14Srobj #define	IPMI_SR_ENABLED_ASSERT			0x0002
8042eeaed14Srobj 
8052eeaed14Srobj #define	IPMI_SR_AVAILABILITY_RUNNING		0x0001
8062eeaed14Srobj #define	IPMI_SR_AVAILABILITY_INTEST		0x0002
8072eeaed14Srobj #define	IPMI_SR_AVAILABILITY_POWEROFF		0x0004
8082eeaed14Srobj #define	IPMI_SR_AVAILABILITY_ONLINE		0x0008
8092eeaed14Srobj #define	IPMI_SR_AVAILABILITY_OFFLINE		0x0010
8102eeaed14Srobj #define	IPMI_SR_AVAILABILITY_OFFDUTY		0x0020
8112eeaed14Srobj #define	IPMI_SR_AVAILABILITY_DEGRADED		0x0040
8122eeaed14Srobj #define	IPMI_SR_AVAILABILITY_POWERSAVE		0x0080
8132eeaed14Srobj #define	IPMI_SR_AVAILABILITY_INSTALLERR		0x0100
8142eeaed14Srobj 
8152eeaed14Srobj #define	IPMI_SR_REDUNDANCY_FULL			0x0001
8162eeaed14Srobj #define	IPMI_SR_REDUNDANCY_LOST			0x0002
8172eeaed14Srobj #define	IPMI_SR_REDUNDANCY_DEGRADED		0x0004
8182eeaed14Srobj #define	IPMI_SR_REDUNDANCY_NONE_MINIMAL		0x0008
8192eeaed14Srobj #define	IPMI_SR_REDUNDANCY_NONE_REGAINED	0x0010
8202eeaed14Srobj #define	IPMI_SR_REDUNDANCY_NONE_INSUFFFICIENT	0x0020
8212eeaed14Srobj #define	IPMI_SR_REDUNDANCY_DEG_FROM_FULL	0x0040
8222eeaed14Srobj #define	IPMI_SR_REDUNDANCY_DEG_FROM_NON		0x0080
8232eeaed14Srobj 
8242eeaed14Srobj #define	IPMI_SR_ACPI_DO				0x0001
8252eeaed14Srobj #define	IPMI_SR_ACPI_D1				0x0002
8262eeaed14Srobj #define	IPMI_SR_ACPI_D2				0x0004
8272eeaed14Srobj #define	IPMI_SR_ACPI_D3				0x0008
8282eeaed14Srobj 
8292eeaed14Srobj /*
8302eeaed14Srobj  * Bitmasks for sensor-specific reading type (0x6F).  See section 42.2.
8312eeaed14Srobj  */
8322eeaed14Srobj #define	IPMI_ST_RESERVED			0x00
8332eeaed14Srobj #define	IPMI_ST_TEMP				0x01
8342eeaed14Srobj #define	IPMI_ST_VOLTAGE				0x02
8352eeaed14Srobj #define	IPMI_ST_CURRENT				0x03
8362eeaed14Srobj #define	IPMI_ST_FAN				0x04
8372eeaed14Srobj #define	IPMI_ST_PHYSICAL			0x05
8382eeaed14Srobj 
8392eeaed14Srobj #define	IPMI_EV_PHYSICAL_GENERAL		0x0001
8402eeaed14Srobj #define	IPMI_EV_PHYSICAL_BAY			0x0002
8412eeaed14Srobj #define	IPMI_EV_PHYSICAL_CARD			0x0004
8422eeaed14Srobj #define	IPMI_EV_PHYSICAL_PROCESSOR		0x0008
8432eeaed14Srobj #define	IPMI_EV_PHYSICAL_LAN			0x0010
8442eeaed14Srobj #define	IPMI_EV_PHYSICAL_DOCK			0x0020
8452eeaed14Srobj #define	IPMI_EV_PHYSICAL_FAN			0x0040
8462eeaed14Srobj 
8472eeaed14Srobj #define	IPMI_ST_PLATFORM			0x06
8482eeaed14Srobj 
8492eeaed14Srobj #define	IPMI_EV_PLATFORM_SECURE			0x0001
8502eeaed14Srobj #define	IPMI_EV_PLATFORM_USER_PASS		0x0002
8512eeaed14Srobj #define	IPMI_EV_PLATFORM_SETUP_PASS		0x0004
8522eeaed14Srobj #define	IPMI_EV_PLATFORM_NETWORK_PASS		0x0008
8532eeaed14Srobj #define	IPMI_EV_PLATFORM_OTHER_PASS		0x0010
8542eeaed14Srobj #define	IPMI_EV_PLATFORM_OUT_OF_BAND		0x0020
8552eeaed14Srobj 
8562eeaed14Srobj #define	IPMI_ST_PROCESSOR			0x07
8572eeaed14Srobj 
8582eeaed14Srobj #define	IPMI_EV_PROCESSOR_IERR			0x0001
8592eeaed14Srobj #define	IPMI_EV_PROCESSOR_THERMAL		0x0002
8602eeaed14Srobj #define	IPMI_EV_PROCESSOR_FRB1			0x0004
8612eeaed14Srobj #define	IPMI_EV_PROCESSOR_FRB2			0x0008
8622eeaed14Srobj #define	IPMI_EV_PROCESSOR_FRB3			0x0010
8632eeaed14Srobj #define	IPMI_EV_PROCESSOR_CONFIG		0x0020
8642eeaed14Srobj #define	IPMI_EV_PROCESSOR_SMBIOS		0x0040
8652eeaed14Srobj #define	IPMI_EV_PROCESSOR_PRESENT		0x0080
8662eeaed14Srobj #define	IPMI_EV_PROCESSOR_DISABLED		0x0100
8672eeaed14Srobj #define	IPMI_EV_PROCESSOR_TERMINATOR		0x0200
8682eeaed14Srobj #define	IPMI_EV_PROCESSOR_THROTTLED		0x0400
8692eeaed14Srobj 
8702eeaed14Srobj #define	IPMI_ST_POWER_SUPPLY			0x08
8712eeaed14Srobj 
8722eeaed14Srobj #define	IPMI_EV_POWER_SUPPLY_PRESENT		0x0001
8732eeaed14Srobj #define	IPMI_EV_POWER_SUPPLY_FAILURE		0x0002
8742eeaed14Srobj #define	IPMI_EV_POWER_SUPPLY_PREDFAIL		0x0004
8752eeaed14Srobj #define	IPMI_EV_POWER_SUPPLY_INPUT_LOST		0x0008
8762eeaed14Srobj #define	IPMI_EV_POWER_SUPPLY_INPUT_RANGE	0x0010
8772eeaed14Srobj #define	IPMI_EV_POWER_SUPPLY_INPUT_RANGE_PRES	0x0020
8782eeaed14Srobj #define	IPMI_EV_POWER_SUPPLY_CONFIG_ERR		0x0040
8792eeaed14Srobj 
8802eeaed14Srobj #define	IPMI_ST_POWER_UNIT			0x09
8812eeaed14Srobj 
8822eeaed14Srobj #define	IPMI_EV_POWER_UNIT_OFF			0x0001
8832eeaed14Srobj #define	IPMI_EV_POWER_UNIT_CYCLE		0x0002
8842eeaed14Srobj #define	IPMI_EV_POWER_UNIT_240_DOWN		0x0004
8852eeaed14Srobj #define	IPMI_EV_POWER_UNIT_INTERLOCK_DOWN	0x0008
8862eeaed14Srobj #define	IPMI_EV_POWER_UNIT_AC_LOST		0x0010
8872eeaed14Srobj #define	IPMI_EV_POWER_UNIT_SOFT_FAILURE		0x0020
8882eeaed14Srobj #define	IPMI_EV_POWER_UNIT_FAIL			0x0040
8892eeaed14Srobj #define	IPMI_EV_POWER_UNIT_PREDFAIL		0x0080
8902eeaed14Srobj 
8912eeaed14Srobj #define	IPMI_ST_COOLING				0x0A
8922eeaed14Srobj #define	IPMI_ST_OTHER				0x0B
8932eeaed14Srobj #define	IPMI_ST_MEMORY				0x0C
8942eeaed14Srobj 
8952eeaed14Srobj #define	IPMI_EV_MEMORY_CE			0x0001
8962eeaed14Srobj #define	IPMI_EV_MEMORY_UE			0x0002
8972eeaed14Srobj #define	IPMI_EV_MEMORY_PARITY			0x0004
8982eeaed14Srobj #define	IPMI_EV_MEMORY_SCRUB_FAIL		0x0008
8992eeaed14Srobj #define	IPMI_EV_MEMORY_DISABLED			0x0010
9002eeaed14Srobj #define	IPMI_EV_MEMORY_CE_LOG_LIMIT		0x0020
9012eeaed14Srobj #define	IPMI_EV_MEMORY_PRESENT			0x0040
9022eeaed14Srobj #define	IPMI_EV_MEMORY_CONFIG_ERR		0x0080
9032eeaed14Srobj #define	IPMI_EV_MEMORY_SPARE			0x0100
9042eeaed14Srobj #define	IPMI_EV_MEMORY_THROTTLED		0x0200
9052eeaed14Srobj #define	IPMI_EV_MEMORY_OVERTEMP			0x0400
9062eeaed14Srobj 
9072eeaed14Srobj #define	IPMI_ST_BAY				0x0D
9082eeaed14Srobj 
9092eeaed14Srobj #define	IPMI_EV_BAY_PRESENT			0x0001
9102eeaed14Srobj #define	IPMI_EV_BAY_FAULT			0x0002
9112eeaed14Srobj #define	IPMI_EV_BAY_PREDFAIL			0x0004
9122eeaed14Srobj #define	IPMI_EV_BAY_SPARE			0x0008
9132eeaed14Srobj #define	IPMI_EV_BAY_CHECK			0x0010
9142eeaed14Srobj #define	IPMI_EV_BAY_CRITICAL			0x0020
9152eeaed14Srobj #define	IPMI_EV_BAY_FAILED			0x0040
9162eeaed14Srobj #define	IPMI_EV_BAY_REBUILDING			0x0080
9172eeaed14Srobj #define	IPMI_EV_BAY_ABORTED			0x0100
9182eeaed14Srobj 
9192eeaed14Srobj #define	IPMI_ST_POST_RESIZE			0x0E
9202eeaed14Srobj #define	IPMI_ST_FIRMWARE			0x0F
9212eeaed14Srobj 
9222eeaed14Srobj #define	IPMI_EV_FIRMWARE_ERROR			0x0001
9232eeaed14Srobj #define	IPMI_EV_FIRMWARE_HANG			0x0002
9242eeaed14Srobj #define	IPMI_EV_FIRMWARE_PROGRESS		0x0004
9252eeaed14Srobj 
9262eeaed14Srobj #define	IPMI_ST_EVENT_LOG			0x10
9272eeaed14Srobj 
9282eeaed14Srobj #define	IPMI_EV_EVENT_LOG_CE			0x0001
9292eeaed14Srobj #define	IPMI_EV_EVENT_LOG_TYPE			0x0002
9302eeaed14Srobj #define	IPMI_EV_EVENT_LOG_RESET			0x0004
9312eeaed14Srobj #define	IPMI_EV_EVENT_LOG_ALL			0x0008
9322eeaed14Srobj #define	IPMI_EV_EVENT_LOG_FULL			0x0010
9332eeaed14Srobj #define	IPMI_EV_EVENT_LOG_ALMOST_FULL		0x0020
9342eeaed14Srobj 
9352eeaed14Srobj #define	IPMI_ST_WATCHDOG1			0x11
9362eeaed14Srobj 
9372eeaed14Srobj #define	IPMI_EV_WATCHDOG_BIOS_RESET		0x0001
9382eeaed14Srobj #define	IPMI_EV_WATCHDOG_OS_RESET		0x0002
9392eeaed14Srobj #define	IPMI_EV_WATCHDOG_OS_SHUTDOWN		0x0004
9402eeaed14Srobj #define	IPMI_EV_WATCHDOG_OS_PWR_DOWN		0x0008
9412eeaed14Srobj #define	IPMI_EV_WATCHDOG_OS_PWR_CYCLE		0x0010
9422eeaed14Srobj #define	IPMI_EV_WATCHDOG_OS_NMI_DIAG		0x0020
9432eeaed14Srobj #define	IPMI_EV_WATCHDOG_EXPIRED		0x0040
9442eeaed14Srobj #define	IPMI_EV_WATCHDOG_PRE_TIMEOUT_INT	0x0080
9452eeaed14Srobj 
9462eeaed14Srobj #define	IPMI_ST_SYSTEM				0x12
9472eeaed14Srobj 
9482eeaed14Srobj #define	IPMI_EV_STSTEM_RECONF			0x0001
9492eeaed14Srobj #define	IPMI_EV_STSTEM_BOOT			0x0002
9502eeaed14Srobj #define	IPMI_EV_STSTEM_UNKNOWN_HW_FAILURE	0x0004
9512eeaed14Srobj #define	IPMI_EV_STSTEM_AUX_LOG_UPDATED		0x0008
9522eeaed14Srobj #define	IPMI_EV_STSTEM_PEF_ACTION		0x0010
9532eeaed14Srobj #define	IPMI_EV_SYSTEM_TIMETAMP_CLOCKSYNC	0x0020
9542eeaed14Srobj 
9552eeaed14Srobj #define	IPMI_ST_CRITICAL			0x13
9562eeaed14Srobj 
9572eeaed14Srobj #define	IPMI_EV_CRITICAL_EXT_NMI		0x0001
9582eeaed14Srobj #define	IPMI_EV_CRITICAL_BUS_TIMOEOUT		0x0002
9592eeaed14Srobj #define	IPMI_EV_CRITICAL_IO_NMI			0x0004
9602eeaed14Srobj #define	IPMI_EV_CRITICAL_SW_NMI			0x0008
9612eeaed14Srobj #define	IPMI_EV_CRITICAL_PCI_PERR		0x0010
9622eeaed14Srobj #define	IPMI_EV_CRITICAL_PCI_SERR		0x0020
9632eeaed14Srobj #define	IPMI_EV_CRITICAL_EISA_FAILSAFE		0x0040
9642eeaed14Srobj #define	IPMI_EV_CRITICAL_BUS_CE			0x0080
9652eeaed14Srobj #define	IPMI_EV_CRITICAL_BUS_UE			0x0100
9662eeaed14Srobj #define	IPMI_EV_CRITICAL_FATAL_NMI		0x0200
9672eeaed14Srobj #define	IPMI_EV_CRITICAL_BUS_FATAL_ERR		0x0400
9682eeaed14Srobj #define	IPMI_EV_CRITICAL_BUS_DEGRADED		0x0800
9692eeaed14Srobj 
9702eeaed14Srobj #define	IPMI_ST_BUTTON				0x14
9712eeaed14Srobj 
9722eeaed14Srobj #define	IPMI_EV_BUTTON_PWR			0x0001
9732eeaed14Srobj #define	IPMI_EV_BUTTON_SLEEP			0x0002
9742eeaed14Srobj #define	IPMI_EV_BUTTON_RESET			0x0004
9752eeaed14Srobj #define	IPMI_EV_BUTTON_FRU_LATCH		0x0008
9762eeaed14Srobj #define	IPMI_EV_BUTTON_FRU_SERVICE		0x0010
9772eeaed14Srobj 
9782eeaed14Srobj #define	IPMI_ST_MODULE				0x15
9792eeaed14Srobj #define	IPMI_ST_MICROCONTROLLER			0x16
9802eeaed14Srobj #define	IPMI_ST_CARD				0x17
9812eeaed14Srobj #define	IPMI_ST_CHASSIS				0x18
9822eeaed14Srobj 
9832eeaed14Srobj #define	IPMI_ST_CHIPSET				0x19
9842eeaed14Srobj 
9852eeaed14Srobj #define	IPMI_EV_CHIPSET_PWR_CTL_FAIL		0x0001
9862eeaed14Srobj 
9872eeaed14Srobj #define	IPMI_ST_FRU				0x1A
9882eeaed14Srobj #define	IPMI_ST_CABLE				0x1B
9892eeaed14Srobj 
9902eeaed14Srobj #define	IPMI_EV_CABLE_CONNECTED			0x0001
9912eeaed14Srobj #define	IPMI_EV_CABLE_CONFIG_ERR		0x0002
9922eeaed14Srobj 
9932eeaed14Srobj #define	IPMI_ST_TERMINATOR			0x1C
9942eeaed14Srobj 
9952eeaed14Srobj #define	IPMI_ST_BOOT				0x1D
9962eeaed14Srobj 
9972eeaed14Srobj #define	IPMI_EV_BOOT_BIOS_PWR_UP		0x0001
9982eeaed14Srobj #define	IPMI_EV_BOOT_BIOS_HARD_RESET		0x0002
9992eeaed14Srobj #define	IPMI_EV_BOOT_BIOS_WARM_RESET		0x0004
10002eeaed14Srobj #define	IPMI_EV_BOOT_PXE_BOOT			0x0008
10012eeaed14Srobj #define	IPMI_EV_BOOT_DIAG_BOOT			0x0010
10022eeaed14Srobj #define	IPMI_EV_BOOT_OS_HARD_RESET		0x0020
10032eeaed14Srobj #define	IPMI_EV_BOOT_OS_WARM_RESET		0x0040
10042eeaed14Srobj #define	IPMI_EV_BOOT_SYS_RESTART		0x0080
10052eeaed14Srobj 
10062eeaed14Srobj #define	IPMI_ST_BOOT_ERROR			0x1E
10072eeaed14Srobj 
10082eeaed14Srobj #define	IPMI_EV_BOOT_ERROR_NOMEDIA		0x0001
10092eeaed14Srobj #define	IPMI_EV_BOOT_ERROR_NON_BOOTABLE_DISK	0x0002
10102eeaed14Srobj #define	IPMI_EV_BOOT_ERROR_NO_PXE_SERVER	0x0004
10112eeaed14Srobj #define	IPMI_EV_BOOT_ERROR_INV_BOOT_SECT	0x0008
10122eeaed14Srobj #define	IPMI_EV_BOOT_ERROR_USR_SELECT_TIMEOUT	0x0010
10132eeaed14Srobj 
10142eeaed14Srobj #define	IPMI_ST_BOOT_OS				0x1F
10152eeaed14Srobj 
10162eeaed14Srobj #define	IPMI_EV_BOOT_OS_A_DRV_BOOT_COMPLETE	0x0001
10172eeaed14Srobj #define	IPMI_EV_BOOT_OS_C_DRV_BOOT_COMPLETE	0x0002
10182eeaed14Srobj #define	IPMI_EV_BOOT_OS_PXE_BOOT_COMPLETE	0x0004
10192eeaed14Srobj #define	IPMI_EV_BOOT_OS_DIAG_BOOT_COMPLETE	0x0008
10202eeaed14Srobj #define	IPMI_EV_BOOT_OS_CDROM_BOOT_COMPLETE	0x0010
10212eeaed14Srobj #define	IPMI_EV_BOOT_OS_ROM_BOOT_COMPLETE	0x0020
10222eeaed14Srobj #define	IPMI_EV_BOOT_OS_UNSPEC_BOOT_COMPLETE	0x0040
10232eeaed14Srobj 
10242eeaed14Srobj #define	IPMI_ST_OS_SHUTDOWN			0x20
10252eeaed14Srobj 
10262eeaed14Srobj #define	IPMI_EV_OS_SHUTDOWN_LOADING		0x0001
10272eeaed14Srobj #define	IPMI_EV_OS_SHUTDOWN_CRASH		0x0002
10282eeaed14Srobj #define	IPMI_EV_OS_STOP_GRACEFUL		0x0004
10292eeaed14Srobj #define	IPMI_EV_OS_SHUTDOWN_GRACEFUL		0x0008
10302eeaed14Srobj #define	IPMI_EV_OS_SHUTDOWN_PEF			0x0010
10312eeaed14Srobj #define	IPMI_EV_OS_SHUTDOWN_BMC			0x0020
10322eeaed14Srobj 
10332eeaed14Srobj #define	IPMI_ST_SLOT				0x21
10342eeaed14Srobj 
10352eeaed14Srobj #define	IPMI_EV_SLOT_FAULT_ASSERTED		0x0001
10362eeaed14Srobj #define	IPMI_EV_SLOT_IDENTIFY_ASSERTED		0x0002
10372eeaed14Srobj #define	IPMI_EV_SLOT_CONNECTED			0x0004
10382eeaed14Srobj #define	IPMI_EV_SLOT_INSTALL_READY		0x0008
10392eeaed14Srobj #define	IPMI_EV_SLOT_REMOVE_READY		0x0010
10402eeaed14Srobj #define	IPMI_EV_SLOT_PWR_OFF			0x0020
10412eeaed14Srobj #define	IPMI_EV_SLOT_REMOVED			0x0040
10422eeaed14Srobj #define	IPMI_EV_SLOT_INTERLOCK_ASSERTED		0x0080
10432eeaed14Srobj #define	IPMI_EV_SLOT_DISABLED			0x0100
10442eeaed14Srobj #define	IPMI_EV_SLOT_SPARE_DEVICE		0x0200
10452eeaed14Srobj 
10462eeaed14Srobj #define	IPMI_ST_ACPI				0x22
10472eeaed14Srobj 
10482eeaed14Srobj #define	IPMI_EV_ACPI_PSTATE_S0_G0		0x0001
10492eeaed14Srobj #define	IPMI_EV_ACPI_PSTATE_S1			0x0002
10502eeaed14Srobj #define	IPMI_EV_ACPI_PSTATE_S2			0x0004
10512eeaed14Srobj #define	IPMI_EV_ACPI_PSTATE_S3			0x0008
10522eeaed14Srobj #define	IPMI_EV_ACPI_PSTATE_S4			0x0010
10532eeaed14Srobj #define	IPMI_EV_ACPI_PSTATE_S5_G2_SOFT_OFF	0x0020
10542eeaed14Srobj #define	IPMI_EV_ACPI_PSTATE_S4_S5_SOFT_OFF	0x0040
10552eeaed14Srobj #define	IPMI_EV_ACPI_PSATTE_G3_MECH_OFF		0x0080
10562eeaed14Srobj #define	IPMI_EV_ACPI_PSTATE_S1_S2_S3_SLEEP	0x0100
10572eeaed14Srobj #define	IPMI_EV_ACPI_PSTATE_G1_SLEEP		0x0200
10582eeaed14Srobj #define	IPMI_EV_ACPI_PSTATE_S5_OVERRIDE		0x0400
10592eeaed14Srobj #define	IPMI_EV_ACPI_PSTATE_LEGACY_ON		0x0800
10602eeaed14Srobj #define	IPMI_EV_ACPI_PSTATE_LEGACY_OFF		0x1000
10612eeaed14Srobj #define	IPMI_EV_ACPI_PSTATE_UNKNOWN		0x2000
10622eeaed14Srobj 
10632eeaed14Srobj #define	IPMI_ST_WATCHDOG2			0x23
10642eeaed14Srobj 
10652eeaed14Srobj #define	IPMI_EV_WATCHDOG2_EXPIRED		0x0001
10662eeaed14Srobj #define	IPMI_EV_WATCHDOG2_HARD_RESET		0x0002
10672eeaed14Srobj #define	IPMI_EV_WATCHDOG2_PWR_DOWN		0x0004
10682eeaed14Srobj #define	IPMI_EV_WATCHDOG2_PWR_CYCLE		0x0008
10692eeaed14Srobj #define	IPMI_EV_WATCHDOG2_RESERVED1		0x0010
10702eeaed14Srobj #define	IPMI_EV_WATCHDOG2_RESERVED2		0x0020
10712eeaed14Srobj #define	IPMI_EV_WATCHDOG2_RESERVED3		0x0040
10722eeaed14Srobj #define	IPMI_EV_WATCHDOG2_RESERVED4		0x0080
10732eeaed14Srobj #define	IPMI_EV_WATCHDOG2_TIMEOUT_INT		0x0100
10742eeaed14Srobj 
10752eeaed14Srobj #define	IPMI_ST_ALERT				0x24
10762eeaed14Srobj 
10772eeaed14Srobj #define	IPMI_EV_ALERT_PLAT_PAGE			0x0001
10782eeaed14Srobj #define	IPMI_EV_ALERT_PLAT_LAN_ALERT		0x0002
10792eeaed14Srobj #define	IPMI_EV_ALERT_PLAT_EVT_TRAP		0x0004
10802eeaed14Srobj #define	IPMI_EV_ALERT_PLAT_SNMP_TRAP		0x0008
10812eeaed14Srobj 
10822eeaed14Srobj #define	IPMI_ST_PRESENCE			0x25
10832eeaed14Srobj 
10842eeaed14Srobj #define	IPMI_EV_PRESENCE_PRESENT		0x0001
10852eeaed14Srobj #define	IPMI_EV_PRESENCE_ABSENT			0x0002
10862eeaed14Srobj #define	IPMI_EV_PRESENCE_DISABLED		0x0004
10872eeaed14Srobj 
10882eeaed14Srobj #define	IPMI_ST_ASIC				0x26
10892eeaed14Srobj 
10902eeaed14Srobj #define	IPMI_ST_LAN				0x27
10912eeaed14Srobj 
10922eeaed14Srobj #define	IPMI_EV_LAN_HEARTBEAT_LOST		0x0001
10932eeaed14Srobj #define	IPMI_EV_LAN_HEARTBEAT			0x0002
10942eeaed14Srobj 
10952eeaed14Srobj #define	IPMI_ST_HEALTH				0x28
10962eeaed14Srobj 
10972eeaed14Srobj #define	IPMI_EV_HEALTH_SENSOR_ACC_DEGRADED	0x0001
10982eeaed14Srobj #define	IPMI_EV_HEALTH_CNTLR_ACC_DEGRADED	0x0002
10992eeaed14Srobj #define	IPMI_EV_HEALTH_CNTLR_OFFLINE		0x0004
11002eeaed14Srobj #define	IPMI_EV_HEALTH_CNTLR_UNAVAIL		0x0008
11012eeaed14Srobj #define	IPMI_EV_HEALTH_SENSOR_FAILURE		0x0010
11022eeaed14Srobj #define	IPMI_EV_HEALTH_FRU_FAILURE		0x0020
11032eeaed14Srobj 
11042eeaed14Srobj #define	IPMI_ST_BATTERY				0x29
11052eeaed14Srobj 
11062eeaed14Srobj #define	IPMI_EV_BATTERY_LOW			0x0001
11072eeaed14Srobj #define	IPMI_EV_BATTERY_FAILED			0x0002
11082eeaed14Srobj #define	IPMI_EV_BATTERY_PRESENCE		0x0004
11092eeaed14Srobj 
11102eeaed14Srobj #define	IPMI_ST_AUDIT				0x2A
11112eeaed14Srobj 
11122eeaed14Srobj #define	IPMI_EV_AUDIT_SESSION_ACTIVATED		0x0001
11132eeaed14Srobj #define	IPMI_EV_AUDIT_SESSION_DEACTIVATED	0x0002
11142eeaed14Srobj 
11152eeaed14Srobj #define	IPMI_ST_VERSION				0x2B
11162eeaed14Srobj 
11172eeaed14Srobj #define	IPMI_EV_VERSION_HW_CHANGE		0x0001
11182eeaed14Srobj #define	IPMI_EV_VERSION_SW_CHANGE		0x0002
11192eeaed14Srobj #define	IPMI_EV_VERSION_HW_INCOMPATIBLE		0x0004
11202eeaed14Srobj #define	IPMI_EV_VERSION_SW_INCOMPATIBLE		0x0008
11212eeaed14Srobj #define	IPMI_EV_VERSION_HW_INVAL		0x0010
11222eeaed14Srobj #define	IPMI_EV_VERSION_SW_INVAL		0x0020
11232eeaed14Srobj #define	IPMI_EV_VERSION_HW_CHANGE_SUCCESS	0x0040
11242eeaed14Srobj #define	IPMI_EV_VERSION_SW_CHANGE_SUCCESS	0x0080
11252eeaed14Srobj 
11262eeaed14Srobj #define	IPMI_ST_FRU_STATE			0x2C
11272eeaed14Srobj 
11282eeaed14Srobj #define	IPMI_EV_FRU_STATE_NOT_INSTALLED		0x0001
11292eeaed14Srobj #define	IPMI_EV_FRU_STATE_INACTIVE		0x0002
11302eeaed14Srobj #define	IPMI_EV_FRU_STATE_ACT_REQ		0x0004
11312eeaed14Srobj #define	IPMI_EV_FRU_STATE_ACT_INPROGRESS	0x0008
11322eeaed14Srobj #define	IPMI_EV_FRU_STATE_ACTIVE		0x0010
11332eeaed14Srobj #define	IPMI_EV_FRU_STATE_DEACT_REQ		0x0020
11342eeaed14Srobj #define	IPMI_EV_FRU_STATE_DEACT_INPROGRESS	0x0040
11352eeaed14Srobj #define	IPMI_EV_FRU_STATE_COMM_LOST		0x0080
11362eeaed14Srobj 
11372eeaed14Srobj /*
11382eeaed14Srobj  * Constants for unit type codes.  See Table 43-15.
11392eeaed14Srobj  */
11402eeaed14Srobj #define	IPMI_UNITS_UNSPECIFIED			0x00
11412eeaed14Srobj #define	IPMI_UNITS_DEGREES_C			0x01
11422eeaed14Srobj #define	IPMI_UNITS_DEGREES_F			0x02
11432eeaed14Srobj #define	IPMI_UNITS_DEGREES_K			0x03
11442eeaed14Srobj #define	IPMI_UNITS_VOLTS			0x04
11452eeaed14Srobj #define	IPMI_UNITS_AMPS				0x05
11462eeaed14Srobj #define	IPMI_UNITS_WATTS			0x06
11472eeaed14Srobj #define	IPMI_UNITS_JOULES			0x07
11482eeaed14Srobj #define	IPMI_UNITS_COULOMBS			0x08
11492eeaed14Srobj #define	IPMI_UNITS_VA				0x09
11502eeaed14Srobj #define	IPMI_UNITS_NITS				0x0A
11512eeaed14Srobj #define	IPMI_UNITS_LUMEN			0x0B
11522eeaed14Srobj #define	IPMI_UNITS_LUX				0x0C
11532eeaed14Srobj #define	IPMI_UNITS_CANDELA			0x0D
11542eeaed14Srobj #define	IPMI_UNITS_KPA				0x0E
11552eeaed14Srobj #define	IPMI_UNITS_PSI				0x0F
11562eeaed14Srobj 
11572eeaed14Srobj #define	IPMI_UNITS_NEWTON			0x10
11582eeaed14Srobj #define	IPMI_UNITS_CFM				0x11
11592eeaed14Srobj #define	IPMI_UNITS_RPM				0x12
11602eeaed14Srobj #define	IPMI_UNITS_HZ				0x13
11612eeaed14Srobj #define	IPMI_UNITS_MICROSEC			0x14
11622eeaed14Srobj #define	IPMI_UNITS_MILLISEC			0x15
11632eeaed14Srobj #define	IPMI_UNITS_SECS				0x16
11642eeaed14Srobj #define	IPMI_UNITS_MIN				0x17
11652eeaed14Srobj #define	IPMI_UNITS_HOUR				0x18
11662eeaed14Srobj #define	IPMI_UNITS_DAY				0x19
11672eeaed14Srobj #define	IPMI_UNITS_WEEK				0x1A
11682eeaed14Srobj #define	IPMI_UNITS_MIL				0x1B
11692eeaed14Srobj #define	IPMI_UNITS_INCHES			0x1C
11702eeaed14Srobj #define	IPMI_UNITS_FEET				0x1D
11712eeaed14Srobj #define	IPMI_UNITS_CUB_INCH			0x1E
11722eeaed14Srobj #define	IPMI_UNITS_CUB_FEET			0x1F
11732eeaed14Srobj 
11742eeaed14Srobj #define	IPMI_UNITS_MM				0x20
11752eeaed14Srobj #define	IPMI_UNITS_CM				0x21
11762eeaed14Srobj #define	IPMI_UNITS_METERS			0x22
11772eeaed14Srobj #define	IPMI_UNITS_CUB_CM			0x23
11782eeaed14Srobj #define	IPMI_UNITS_CUB_METER			0x24
11792eeaed14Srobj #define	IPMI_UNITS_LITERS			0x25
11802eeaed14Srobj #define	IPMI_UNITS_FLUID_OUNCE			0x26
11812eeaed14Srobj #define	IPMI_UNITS_RADIANS			0x27
11822eeaed14Srobj #define	IPMI_UNITS_STERADIANS			0x28
11832eeaed14Srobj #define	IPMI_UNITS_REVOLUTIONS			0x29
11842eeaed14Srobj #define	IPMI_UNITS_CYCLES			0x2A
11852eeaed14Srobj #define	IPMI_UNITS_GRAVITIES			0x2B
11862eeaed14Srobj #define	IPMI_UNITS_OUNCE			0x2C
11872eeaed14Srobj #define	IPMI_UNITS_POUND			0x2D
11882eeaed14Srobj #define	IPMI_UNITS_FOOT_POUND			0x2E
11892eeaed14Srobj #define	IPMI_UNITS_OZ_INCH			0x2F
11902eeaed14Srobj 
11912eeaed14Srobj #define	IPMI_UNITS_GAUSS			0x30
11922eeaed14Srobj #define	IPMI_UNITS_GILBERTS			0x31
11932eeaed14Srobj #define	IPMI_UNITS_HENRY			0x32
11942eeaed14Srobj #define	IPMI_UNITS_MILHENRY			0x33
11952eeaed14Srobj #define	IPMI_UNITS_FARAD			0x34
11962eeaed14Srobj #define	IPMI_UNITS_MICROFARAD			0x35
11972eeaed14Srobj #define	IPMI_UNITS_OHMS				0x36
11982eeaed14Srobj #define	IPMI_UNITS_SIEMENS			0x37
11992eeaed14Srobj #define	IPMI_UNITS_MOLE				0x38
12002eeaed14Srobj #define	IPMI_UNITS_BECQUEREL			0x39
12012eeaed14Srobj #define	IPMI_UNITS_PPM				0x3A
12022eeaed14Srobj /* 0x3B is reserved */
12032eeaed14Srobj #define	IPMI_UNITS_DECIBELS			0x3C
12042eeaed14Srobj #define	IPMI_UNITS_DBA				0x3D
12052eeaed14Srobj #define	IPMI_UNITS_DBC				0x3E
12062eeaed14Srobj #define	IPMI_UNITS_GRAY				0x3F
12072eeaed14Srobj 
12082eeaed14Srobj #define	IPMI_UNITS_SIEVERT			0x40
12092eeaed14Srobj #define	IPMI_UNITS_COLOR_TEMP_K			0x41
12102eeaed14Srobj #define	IPMI_UNITS_BIT				0x42
12112eeaed14Srobj #define	IPMI_UNITS_KILOBIT			0x43
12122eeaed14Srobj #define	IPMI_UNITS_MEGABIT			0x44
12132eeaed14Srobj #define	IPMI_UNITS_GIGABIT			0x45
12142eeaed14Srobj #define	IPMI_UNITS_BYTE				0x46
12152eeaed14Srobj #define	IPMI_UNITS_KILOBYTE			0x47
12162eeaed14Srobj #define	IPMI_UNITS_MEGABYTE			0x48
12172eeaed14Srobj #define	IPMI_UNITS_GIGABYTE			0x49
12182eeaed14Srobj #define	IPMI_UNITS_WORD				0x4A
12192eeaed14Srobj #define	IPMI_UNITS_DWORD			0x4B
12202eeaed14Srobj #define	IPMI_UNITS_QWORD			0x4C
12212eeaed14Srobj #define	IPMI_UNITS_MEMLINE			0x4D
12222eeaed14Srobj #define	IPMI_UNITS_HIT				0x4E
12232eeaed14Srobj #define	IPMI_UNITS_MISS				0x4F
12242eeaed14Srobj 
12252eeaed14Srobj #define	IPMI_UNITS_RETRY			0x50
12262eeaed14Srobj #define	IPMI_UNITS_RESET			0x51
12272eeaed14Srobj #define	IPMI_UNITS_OVERFLOW			0x52
12282eeaed14Srobj #define	IPMI_UNITS_UNDERRUN			0x53
12292eeaed14Srobj #define	IPMI_UNITS_COLLISION			0x54
12302eeaed14Srobj #define	IPMI_UNITS_PACKETS			0x55
12312eeaed14Srobj #define	IPMI_UNITS_MESSAGES			0x56
12322eeaed14Srobj #define	IPMI_UNITS_CHARACTERS			0x57
12332eeaed14Srobj #define	IPMI_UNITS_ERROR			0x58
12342eeaed14Srobj #define	IPMI_UNITS_CE				0x59
12352eeaed14Srobj #define	IPMI_UNITS_UE				0x5A
12362eeaed14Srobj #define	IPMI_UNITS_FATAL_ERROR			0x5B
12372eeaed14Srobj #define	IPMI_UNITS_GRAMS			0x5C
12382eeaed14Srobj 
12392eeaed14Srobj /*
12402eeaed14Srobj  * Event-Only Record.  See section 43.3.
12412eeaed14Srobj  */
12422eeaed14Srobj 
12432eeaed14Srobj #define	IPMI_SDR_TYPE_EVENT_ONLY		0x03
12442eeaed14Srobj 
12452eeaed14Srobj typedef struct ipmi_sdr_event_only {
12462eeaed14Srobj 	/* RECORD KEY BYTES */
12472eeaed14Srobj 	uint8_t		is_eo_owner;
12482eeaed14Srobj 	DECL_BITFIELD3(
12492eeaed14Srobj 	    is_eo_sensor_lun			:2,
12502eeaed14Srobj 	    is_eo_fru_lun			:2,
12512eeaed14Srobj 	    is_eo_channel			:4);
12522eeaed14Srobj 	uint8_t		is_eo_number;
12532eeaed14Srobj 	/* RECORD BODY BYTES */
12542eeaed14Srobj 	uint8_t		is_eo_entity_id;
12552eeaed14Srobj 	DECL_BITFIELD2(
12562eeaed14Srobj 	    is_eo_entity_instance		:7,
12572eeaed14Srobj 	    is_eo_entity_logical		:1);
12582eeaed14Srobj 	uint8_t		is_eo_sensor_type;
12592eeaed14Srobj 	uint8_t		is_eo_reading_type;
12602eeaed14Srobj 	DECL_BITFIELD3(
12612eeaed14Srobj 	    is_eo_share_count			:4,
12622eeaed14Srobj 	    is_eo_modifier_type			:2,
12632eeaed14Srobj 	    is_eo_direction			:2);
12642eeaed14Srobj 	DECL_BITFIELD2(
12652eeaed14Srobj 	    is_eo_modifier_offset		:7,
12662eeaed14Srobj 	    is_eo_sharing			:1);
12672eeaed14Srobj 	uint8_t		__reserved;
12682eeaed14Srobj 	uint8_t		is_eo_oem;
12692eeaed14Srobj 	DECL_BITFIELD3(
12702eeaed14Srobj 	    is_eo_idlen				:5,
12712eeaed14Srobj 	    __reserved1				:1,
12722eeaed14Srobj 	    is_eo_idtype			:2);
12732eeaed14Srobj 	char		is_eo_idstring[1];
12742eeaed14Srobj } ipmi_sdr_event_only_t;
12752eeaed14Srobj 
12762eeaed14Srobj /*
12772eeaed14Srobj  * Entity Association Record.  See section 43.4.
12782eeaed14Srobj  */
12792eeaed14Srobj 
12802eeaed14Srobj #define	IPMI_SDR_TYPE_ENTITY_ASSOCIATION	0x08
12812eeaed14Srobj 
12822eeaed14Srobj typedef struct ipmi_sdr_entity_association {
12832eeaed14Srobj 	/* RECORD KEY BYTES */
12842eeaed14Srobj 	uint8_t		is_ea_entity_id;
12852eeaed14Srobj 	uint8_t		is_ea_entity_instance;
12862eeaed14Srobj 	DECL_BITFIELD4(
12872eeaed14Srobj 	    __reserved		:5,
12882eeaed14Srobj 	    is_ea_presence	:1,
12892eeaed14Srobj 	    is_ea_record_link	:1,
12902eeaed14Srobj 	    is_ea_range		:1);
12912eeaed14Srobj 	/* RECORD BODY BYTES */
12922eeaed14Srobj 	struct {
12932eeaed14Srobj 		uint8_t		is_ea_sub_id;
12942eeaed14Srobj 		uint8_t		is_ea_sub_instance;
12952eeaed14Srobj 	} is_ea_sub[4];
12962eeaed14Srobj } ipmi_sdr_entity_association_t;
12972eeaed14Srobj 
12982eeaed14Srobj /*
12992eeaed14Srobj  * Device-relative Entity Association Record.  See section 43.5.
13002eeaed14Srobj  */
13012eeaed14Srobj 
13022eeaed14Srobj #define	IPMI_SDR_TYPE_DEVICE_RELATIVE		0x09
13032eeaed14Srobj 
13042eeaed14Srobj typedef struct ipmi_sdr_device_relative {
13052eeaed14Srobj 	/* RECORD KEY BYTES */
13062eeaed14Srobj 	uint8_t		is_dr_entity_id;
13072eeaed14Srobj 	uint8_t		is_dr_entity_instance;
13082eeaed14Srobj 	DECL_BITFIELD2(
13092eeaed14Srobj 	    __reserved1			:1,
13102eeaed14Srobj 	    is_dr_slaveaddr		:7);
13112eeaed14Srobj 	DECL_BITFIELD2(
13122eeaed14Srobj 	    __reserved2			:4,
13132eeaed14Srobj 	    is_dr_channel		:4);
13142eeaed14Srobj 	DECL_BITFIELD4(
13152eeaed14Srobj 	    __reserved			:5,
13162eeaed14Srobj 	    is_dr_presence		:1,
13172eeaed14Srobj 	    is_dr_record_link		:1,
13182eeaed14Srobj 	    is_dr_range			:1);
13192eeaed14Srobj 	/* RECORD BODY BYTES */
13202eeaed14Srobj 	struct {
13212eeaed14Srobj 		DECL_BITFIELD2(
13222eeaed14Srobj 		    __reserved3		:1,
13232eeaed14Srobj 		    is_dr_sub_slaveaddr	:7);
13242eeaed14Srobj 		DECL_BITFIELD2(
13252eeaed14Srobj 		    __reserved4		:4,
13262eeaed14Srobj 		    is_dr_sub_channel	:4);
13272eeaed14Srobj 		uint8_t		is_ea_sub_id;
13282eeaed14Srobj 		uint8_t		is_ea_sub_instance;
13292eeaed14Srobj 	} is_ea_sub[4];
13302eeaed14Srobj } ipmi_sdr_device_relative_t;
13312eeaed14Srobj 
13329113a79cSeschrock /*
13339113a79cSeschrock  * Generic Device Locator Record.  See section 43.7.
13349113a79cSeschrock  */
13359113a79cSeschrock 
13369113a79cSeschrock #define	IPMI_SDR_TYPE_GENERIC_LOCATOR		0x10
13379113a79cSeschrock 
13389113a79cSeschrock typedef struct ipmi_sdr_generic_locator {
13399113a79cSeschrock 	/* RECORD KEY BYTES */
13402c32020fSeschrock 	DECL_BITFIELD2(
13412c32020fSeschrock 	    __reserved1		:1,
13422c32020fSeschrock 	    is_gl_accessaddr	:7);
13432c32020fSeschrock 	DECL_BITFIELD2(
13442c32020fSeschrock 	    is_gl_channel_msb	:1,
13452c32020fSeschrock 	    is_gl_slaveaddr	:7);
13462c32020fSeschrock 	DECL_BITFIELD3(
13472c32020fSeschrock 	    is_gl_bus		:3,
13482c32020fSeschrock 	    is_gl_lun		:2,
13492c32020fSeschrock 	    is_gl_channel	:3);
13509113a79cSeschrock 	/* RECORD BODY BYTES */
13512c32020fSeschrock 	DECL_BITFIELD2(
13522c32020fSeschrock 	    is_gl_span		:3,
13532c32020fSeschrock 	    __reserved2		:5);
13549113a79cSeschrock 	uint8_t		__reserved3;
13559113a79cSeschrock 	uint8_t		is_gl_type;
13569113a79cSeschrock 	uint8_t		is_gl_modifier;
13579113a79cSeschrock 	uint8_t		is_gl_entity;
13589113a79cSeschrock 	uint8_t		is_gl_instance;
13599113a79cSeschrock 	uint8_t		is_gl_oem;
13602eeaed14Srobj 	DECL_BITFIELD3(
13612eeaed14Srobj 	    is_gl_idlen		:5,
13622eeaed14Srobj 	    __reserved4		:1,
13632c32020fSeschrock 	    is_gl_idtype	:2);
13649113a79cSeschrock 	char		is_gl_idstring[1];
13659113a79cSeschrock } ipmi_sdr_generic_locator_t;
13669113a79cSeschrock 
13679113a79cSeschrock /*
13689113a79cSeschrock  * FRU Device Locator Record.  See section 43.8.
13699113a79cSeschrock  */
13709113a79cSeschrock 
13719113a79cSeschrock #define	IPMI_SDR_TYPE_FRU_LOCATOR		0x11
13729113a79cSeschrock 
13739113a79cSeschrock typedef struct ipmi_sdr_fru_locator {
13749113a79cSeschrock 	/* RECORD KEY BYTES */
13752c32020fSeschrock 	DECL_BITFIELD2(
13762c32020fSeschrock 	    __reserved1		:1,
13772c32020fSeschrock 	    is_fl_accessaddr	:7);
13789113a79cSeschrock 	union {
13799113a79cSeschrock 		struct {
13809113a79cSeschrock 			uint8_t	_is_fl_devid;
13819113a79cSeschrock 		} _logical;
13829113a79cSeschrock 		struct {
13832c32020fSeschrock 			DECL_BITFIELD2(
13842c32020fSeschrock 			    __reserved		:1,
13852c32020fSeschrock 			    _is_fl_slaveaddr	:7);
13869113a79cSeschrock 		} _nonintelligent;
13879113a79cSeschrock 	} _devid_or_slaveaddr;
13882c32020fSeschrock 	DECL_BITFIELD4(
13892c32020fSeschrock 	    is_fl_bus		:3,
13902c32020fSeschrock 	    is_fl_lun		:2,
13912c32020fSeschrock 	    __reserved2		:2,
13922c32020fSeschrock 	    is_fl_logical	:1);
13932c32020fSeschrock 	DECL_BITFIELD2(
13942c32020fSeschrock 	    __reserved3		:4,
13952c32020fSeschrock 	    is_fl_channel	:4);
13969113a79cSeschrock 	/* RECORD BODY BYTES */
13979113a79cSeschrock 	uint8_t		__reserved4;
13989113a79cSeschrock 	uint8_t		is_fl_type;
13999113a79cSeschrock 	uint8_t		is_fl_modifier;
14009113a79cSeschrock 	uint8_t		is_fl_entity;
14019113a79cSeschrock 	uint8_t		is_fl_instance;
14029113a79cSeschrock 	uint8_t		is_fl_oem;
14032eeaed14Srobj 	DECL_BITFIELD3(
14042eeaed14Srobj 	    is_fl_idlen		:5,
14052eeaed14Srobj 	    __reserved5		:1,
14062c32020fSeschrock 	    is_fl_idtype	:2);
14079113a79cSeschrock 	char		is_fl_idstring[1];
14089113a79cSeschrock } ipmi_sdr_fru_locator_t;
14099113a79cSeschrock 
14109113a79cSeschrock #define	is_fl_devid	_devid_or_slaveaddr._logical._is_fl_devid
14119113a79cSeschrock #define	is_fl_slaveaddr	_devid_or_slaveaddr._nonintelligent._is_fl_slaveaddr
14129113a79cSeschrock 
14139113a79cSeschrock /*
14142eeaed14Srobj  * Management Controller Device Locator Record.  See section 43.9
14159113a79cSeschrock  */
14162eeaed14Srobj 
14172eeaed14Srobj #define	IPMI_SDR_TYPE_MANAGEMENT_LOCATOR	0x12
14182eeaed14Srobj 
14192eeaed14Srobj typedef struct ipmi_sdr_management_locator {
14202eeaed14Srobj 	/* RECORD KEY BYTES */
14212eeaed14Srobj 	DECL_BITFIELD2(
14222eeaed14Srobj 	    __reserved1			:1,
14232eeaed14Srobj 	    is_ml_devaddr		:7);
14242eeaed14Srobj 	DECL_BITFIELD2(
14252eeaed14Srobj 	    is_ml_channel		:4,
14262eeaed14Srobj 	    __reserved2			:4);
14272eeaed14Srobj 	/* RECORD BODY BYTES */
14282eeaed14Srobj 	DECL_BITFIELD7(
14292eeaed14Srobj 	    is_ml_init_message		:2,
14302eeaed14Srobj 	    is_ml_init_log		:1,
14312eeaed14Srobj 	    is_ml_init_controller_log	:1,
14322eeaed14Srobj 	    __reserved3			:1,
14332eeaed14Srobj 	    is_ml_static		:1,
14342eeaed14Srobj 	    is_ml_acpi_device		:1,
14352eeaed14Srobj 	    is_ml_acpi_system		:1);
14362eeaed14Srobj 	DECL_BITFIELD8(
14372eeaed14Srobj 	    is_ml_supp_sensor		:1,
14382eeaed14Srobj 	    is_ml_supp_sdr		:1,
14392eeaed14Srobj 	    is_ml_supp_sel		:1,
14402eeaed14Srobj 	    is_ml_supp_fru		:1,
14412eeaed14Srobj 	    is_ml_supp_event_receiver	:1,
14422eeaed14Srobj 	    is_ml_supp_event_generator	:1,
14432eeaed14Srobj 	    is_ml_supp_bridge		:1,
14442eeaed14Srobj 	    is_ml_supp_chassis		:1);
14452eeaed14Srobj 	uint8_t		__reserved4;
14462eeaed14Srobj 	uint16_t	__reserved5;
14472eeaed14Srobj 	uint8_t		is_ml_entity_id;
14482eeaed14Srobj 	uint8_t		is_ml_entity_instance;
14492eeaed14Srobj 	uint8_t		is_ml_oem;
14502eeaed14Srobj 	DECL_BITFIELD3(
14512eeaed14Srobj 	    is_ml_idlen		:5,
14522eeaed14Srobj 	    __reserved6		:1,
14532eeaed14Srobj 	    is_ml_idtype	:2);
14542eeaed14Srobj 	char		is_ml_idstring[1];
14552eeaed14Srobj } ipmi_sdr_management_locator_t;
14562eeaed14Srobj 
14572eeaed14Srobj #define	IPMI_MESSAGE_INIT_ENABLE		0x0
14582eeaed14Srobj #define	IPMI_MESSAGE_INIT_DISABLE		0x1
14592eeaed14Srobj #define	IPMI_MESSAGE_INIT_NONE			0x2
14602eeaed14Srobj 
14612eeaed14Srobj /*
14622eeaed14Srobj  *  Management Controller Confirmation Record.  See section 43.10
14632eeaed14Srobj  */
14642eeaed14Srobj 
14659113a79cSeschrock #define	IPMI_SDR_TYPE_MANAGEMENT_CONFIRMATION	0x13
14662eeaed14Srobj 
14672eeaed14Srobj typedef struct ipmi_sdr_management_confirmation {
14682eeaed14Srobj 	/* RECORD KEY BYTES */
14692eeaed14Srobj 	DECL_BITFIELD2(
14702eeaed14Srobj 	    __reserved1		:1,
14712eeaed14Srobj 	    is_mc_slaveaddr	:7);
14722eeaed14Srobj 	uint8_t		is_mc_deviceid;
14732eeaed14Srobj 	DECL_BITFIELD2(
14742eeaed14Srobj 	    is_mc_dev_revision	:4,
14752eeaed14Srobj 	    is_mc_channel	:4);
14762eeaed14Srobj 	/* RECORD BODY BYTES */
14772eeaed14Srobj 	DECL_BITFIELD2(
14782eeaed14Srobj 	    is_mc_major_rev	:7,
14792eeaed14Srobj 	    __reserved2		:1);
14802eeaed14Srobj 	uint8_t		is_mc_minor_rev;
14812eeaed14Srobj 	uint8_t		is_mc_impi_ver;
14822eeaed14Srobj 	uint8_t		is_mc_manufacturer[3];
14832eeaed14Srobj 	uint16_t	is_mc_product;
14842eeaed14Srobj 	uint8_t		is_mc_guid[16];
14852eeaed14Srobj } ipmi_sdr_management_confirmation_t;
14862eeaed14Srobj 
14872eeaed14Srobj /*
14882eeaed14Srobj  * BMC Message Channel Info Record.  See esction 43.11.
14892eeaed14Srobj  */
14902eeaed14Srobj 
14919113a79cSeschrock #define	IPMI_SDR_TYPE_BMC_MESSAGE_CHANNEL	0x14
14922eeaed14Srobj 
14932eeaed14Srobj typedef struct ipmi_sdr_bmc_channel {
14942eeaed14Srobj 	/* RECORD BODY BYTES */
14952eeaed14Srobj 	struct {
14962eeaed14Srobj 		DECL_BITFIELD3(
14972eeaed14Srobj 		    is_bc_protocol	:4,
14982eeaed14Srobj 		    is_bc_receive_lun	:3,
14992eeaed14Srobj 		    is_bc_transmit	:1);
15002eeaed14Srobj 	} is_bc_channel[8];
15012eeaed14Srobj 	uint8_t		is_bc_interrupt_type;
15022eeaed14Srobj 	uint8_t		is_bc_buffer_type;
15032eeaed14Srobj 	uint8_t		__reserved;
15042eeaed14Srobj } ipmi_sdr_bmc_channel_t;
15052eeaed14Srobj 
15062eeaed14Srobj /*
15072eeaed14Srobj  * OEM Record.  See ction 43.12.
15082eeaed14Srobj  */
15092eeaed14Srobj 
15109113a79cSeschrock #define	IPMI_SDR_TYPE_OEM			0xC0
15119113a79cSeschrock 
15122eeaed14Srobj typedef struct ipmi_sdr_oem {
15132eeaed14Srobj 	uint8_t		is_oem_manufacturer[3];
15142eeaed14Srobj 	uint8_t		is_oem_data[1];
15152eeaed14Srobj } ipmi_sdr_oem_t;
15162eeaed14Srobj 
15172eeaed14Srobj /*
15182eeaed14Srobj  * Iterate over the SDR repository.  This function does the work of parsing the
15192eeaed14Srobj  * name when available, and keeping the repository in a consistent state.
15202eeaed14Srobj  */
15212eeaed14Srobj extern int ipmi_sdr_iter(ipmi_handle_t *,
15222eeaed14Srobj     int (*)(ipmi_handle_t *, const char *, ipmi_sdr_t *, void *), void *);
15232eeaed14Srobj 
15249113a79cSeschrock /*
1525*ea30102cSRob Johnston  * Lookup the given sensor type by name or a combination of name and entity
1526*ea30102cSRob Johnston  * ID/instance.  These functions automatically read in and cache the complete
1527*ea30102cSRob Johnston  * SDR repository.
15289113a79cSeschrock  */
15292eeaed14Srobj extern ipmi_sdr_t *ipmi_sdr_lookup(ipmi_handle_t *, const char *);
1530*ea30102cSRob Johnston extern ipmi_sdr_t *ipmi_sdr_lookup_precise(ipmi_handle_t *, const char *,
1531*ea30102cSRob Johnston     uint8_t, uint8_t);
15329113a79cSeschrock extern ipmi_sdr_fru_locator_t *ipmi_sdr_lookup_fru(ipmi_handle_t *,
15339113a79cSeschrock     const char *);
15349113a79cSeschrock extern ipmi_sdr_generic_locator_t *ipmi_sdr_lookup_generic(ipmi_handle_t *,
15359113a79cSeschrock     const char *);
15362eeaed14Srobj extern ipmi_sdr_compact_sensor_t *ipmi_sdr_lookup_compact_sensor(
15372eeaed14Srobj     ipmi_handle_t *, const char *);
15382eeaed14Srobj extern ipmi_sdr_full_sensor_t *ipmi_sdr_lookup_full_sensor(
15392eeaed14Srobj     ipmi_handle_t *, const char *);
15402eeaed14Srobj 
15412eeaed14Srobj /*
15422eeaed14Srobj  * Entity ID codes.  See table 43.13.
15432eeaed14Srobj  */
15442eeaed14Srobj #define	IPMI_ET_UNSPECIFIED		0x00
15452eeaed14Srobj #define	IPMI_ET_OTHER			0x01
15462eeaed14Srobj #define	IPMI_ET_UNKNOWN			0x02
15472eeaed14Srobj #define	IPMI_ET_PROCESSOR		0x03
15482eeaed14Srobj #define	IPMI_ET_DISK			0x04
15492eeaed14Srobj #define	IPMI_ET_PERIPHERAL		0x05
15502eeaed14Srobj #define	IPMI_ET_MANAGEMENT_MODULE	0x06
15512eeaed14Srobj #define	IPMI_ET_MOTHERBOARD		0x07
15522eeaed14Srobj #define	IPMI_ET_MEMORY_MODULE		0x08
15532eeaed14Srobj #define	IPMI_ET_PROCESSOR_MODULE	0x09
15542eeaed14Srobj #define	IPMI_ET_PSU			0x0A
15552eeaed14Srobj #define	IPMI_ET_CARD			0x0B
15562eeaed14Srobj #define	IPMI_ET_FRONT_PANEL		0x0C
15572eeaed14Srobj #define	IPMI_ET_BACK_PANEL		0x0D
15582eeaed14Srobj #define	IPMI_ET_POWER_BOARD		0x0E
15592eeaed14Srobj #define	IPMI_ET_BACKPLANE		0x0F
15602eeaed14Srobj #define	IPMI_ET_EXPANSION_BOARD		0x10
15612eeaed14Srobj #define	IPMI_ET_OTHER_BOARD		0x11
15622eeaed14Srobj #define	IPMI_ET_PROCESSOR_BOARD		0x12
15632eeaed14Srobj #define	IPMI_ET_POWER_DOMAIN		0x13
15642eeaed14Srobj #define	IPMI_ET_POWER_CONVERTER		0x14
15652eeaed14Srobj #define	IPMI_ET_POWER_MANAGEMENT	0x15
15662eeaed14Srobj #define	IPMI_ET_BACK_CHASSIS		0x16
15672eeaed14Srobj #define	IPMI_ET_SYSTEM_CHASSIS		0x17
15682eeaed14Srobj #define	IPMI_ET_SUB_CHASSIS		0x18
15692eeaed14Srobj #define	IPMI_ET_OTHER_CHASSIS		0x19
15702eeaed14Srobj #define	IPMI_ET_DISK_BAY		0x1A
15712eeaed14Srobj #define	IPMI_ET_PERIPHERAL_BAY		0x1B
15722eeaed14Srobj #define	IPMI_ET_DEVICE_BAY		0x1C
15732eeaed14Srobj #define	IPMI_ET_FAN			0x1D
15742eeaed14Srobj #define	IPMI_ET_COOLING_DOMAIN		0x1E
15752eeaed14Srobj #define	IPMI_ET_CABLE			0x1F
15762eeaed14Srobj #define	IPMI_ET_MEMORY_DEVICE		0x20
15772eeaed14Srobj #define	IPMI_ET_MANAGEMENT_SOFTWARE	0x21
15782eeaed14Srobj #define	IPMI_ET_SYSTEM_FIRMWARE		0x22
15792eeaed14Srobj #define	IPMI_ET_OS			0x23
15802eeaed14Srobj #define	IPMI_ET_SYSTEM_BUS		0x24
15812eeaed14Srobj #define	IPMI_ET_GROUP			0x25
15822eeaed14Srobj #define	IPMI_ET_REMOTE			0x26
15832eeaed14Srobj #define	IPMI_ET_ENVIRONMENT		0x27
15842eeaed14Srobj #define	IPMI_ET_BATTERY			0x28
15852eeaed14Srobj #define	IPMI_ET_BLADE			0x29
15862eeaed14Srobj #define	IPMI_ET_SWITCH			0x2A
15872eeaed14Srobj #define	IPMI_ET_PROCMEM_MODULE		0x2B
15882eeaed14Srobj #define	IPMI_ET_IO_MODULE		0x2C
15892eeaed14Srobj #define	IPMI_ET_PROCIO_MODULE		0x2D
15902eeaed14Srobj #define	IPMI_ET_CONTROLLER_FIRMWARE	0x2E
15912eeaed14Srobj #define	IPMI_ET_CHANNEL			0x2F
15922eeaed14Srobj #define	IPMI_ET_PCI			0x30
15932eeaed14Srobj #define	IPMI_ET_PCIE			0x31
15942eeaed14Srobj #define	IPMI_ET_SCSI			0x32
15952eeaed14Srobj #define	IPMI_ET_SATA_SAS		0x33
15962eeaed14Srobj #define	IPMI_ET_FSB			0x34
15972eeaed14Srobj #define	IPMI_ET_RTC			0x35
15989113a79cSeschrock 
1599208e1562SRob Johnston /*
1600208e1562SRob Johnston  * Get Sensor Threshold.  See section 35.9
1601208e1562SRob Johnston  */
1602208e1562SRob Johnston #define	IPMI_CMD_GET_SENSOR_THRESHOLDS	0x27
1603208e1562SRob Johnston 
1604208e1562SRob Johnston typedef struct ipmi_sensor_thresholds {
1605208e1562SRob Johnston 	uint8_t ithr_readable_mask;
1606208e1562SRob Johnston 	uint8_t ithr_lower_noncrit;
1607208e1562SRob Johnston 	uint8_t ithr_lower_crit;
1608208e1562SRob Johnston 	uint8_t ithr_lower_nonrec;
1609208e1562SRob Johnston 	uint8_t ithr_upper_noncrit;
1610208e1562SRob Johnston 	uint8_t ithr_upper_crit;
1611208e1562SRob Johnston 	uint8_t ithr_upper_nonrec;
1612208e1562SRob Johnston } ipmi_sensor_thresholds_t;
1613208e1562SRob Johnston 
1614208e1562SRob Johnston extern int ipmi_get_sensor_thresholds(ipmi_handle_t *,
1615208e1562SRob Johnston     ipmi_sensor_thresholds_t *, uint8_t);
1616208e1562SRob Johnston 
16179113a79cSeschrock /*
16189113a79cSeschrock  * Get Sensor Reading.  See section 35.14.
16199113a79cSeschrock  */
16209113a79cSeschrock 
16219113a79cSeschrock #define	IPMI_CMD_GET_SENSOR_READING	0x2d
16229113a79cSeschrock 
16239113a79cSeschrock typedef struct ipmi_sensor_reading {
16249113a79cSeschrock 	uint8_t		isr_reading;
16252c32020fSeschrock 	DECL_BITFIELD4(
16262c32020fSeschrock 	    __reserved1			:5,
16272c32020fSeschrock 	    isr_state_unavailable	:1,
16282eeaed14Srobj 	    isr_scanning_enabled	:1,
16292eeaed14Srobj 	    isr_event_enabled		:1);
16309113a79cSeschrock 	uint16_t	isr_state;
16319113a79cSeschrock } ipmi_sensor_reading_t;
16329113a79cSeschrock 
16332eeaed14Srobj #define	IPMI_SENSOR_THRESHOLD_LOWER_NONCRIT		0x0001
16342eeaed14Srobj #define	IPMI_SENSOR_THRESHOLD_LOWER_CRIT		0x0002
16352eeaed14Srobj #define	IPMI_SENSOR_THRESHOLD_LOWER_NONRECOV		0x0004
16362eeaed14Srobj #define	IPMI_SENSOR_THRESHOLD_UPPER_NONCRIT		0x0008
16372eeaed14Srobj #define	IPMI_SENSOR_THRESHOLD_UPPER_CRIT		0x0010
16382eeaed14Srobj #define	IPMI_SENSOR_THRESHOLD_UPPER_NONRECOV		0x0020
16392eeaed14Srobj 
16409113a79cSeschrock extern ipmi_sensor_reading_t *ipmi_get_sensor_reading(ipmi_handle_t *, uint8_t);
1641825ba0f2Srobj extern int ipmi_sdr_conv_reading(ipmi_sdr_full_sensor_t *, uint8_t,
1642825ba0f2Srobj     double *);
16439113a79cSeschrock /*
16449113a79cSeschrock  * Set Sensor Reading.  See section 35.14.
16459113a79cSeschrock  */
16469113a79cSeschrock #define	IPMI_CMD_SET_SENSOR_READING	0x30
16479113a79cSeschrock 
16489113a79cSeschrock #define	IPMI_SENSOR_OP_CLEAR	0x3	/* clear '0' bits */
16499113a79cSeschrock #define	IPMI_SENSOR_OP_SET	0x2	/* set '1' bits */
16509113a79cSeschrock #define	IPMI_SENSOR_OP_EXACT	0x1	/* set bits exactly */
16519113a79cSeschrock 
16529113a79cSeschrock typedef struct ipmi_set_sensor_reading {
16539113a79cSeschrock 	uint8_t		iss_id;
16542c32020fSeschrock 	DECL_BITFIELD5(
16552c32020fSeschrock 	    iss_set_reading		:1,
16562c32020fSeschrock 	    __reserved			:1,
16572c32020fSeschrock 	    iss_deassrt_op		:2,
16582c32020fSeschrock 	    iss_assert_op		:2,
16592c32020fSeschrock 	    iss_data_bytes		:2);
16609113a79cSeschrock 	uint8_t		iss_sensor_reading;
16619113a79cSeschrock 	uint16_t	iss_assert_state;	/* optional */
16629113a79cSeschrock 	uint16_t	iss_deassert_state;	/* optional */
16639113a79cSeschrock 	uint8_t		iss_event_data1;	/* optional */
16649113a79cSeschrock 	uint8_t		iss_event_data2;	/* optional */
16659113a79cSeschrock 	uint8_t		iss_event_data3;	/* optional */
16669113a79cSeschrock } ipmi_set_sensor_reading_t;
16679113a79cSeschrock 
16689113a79cSeschrock extern int ipmi_set_sensor_reading(ipmi_handle_t *,
16699113a79cSeschrock     ipmi_set_sensor_reading_t *);
16709113a79cSeschrock 
16714557a2a1Srobj /*
16724557a2a1Srobj  * These IPMI message id/opcodes are documented in Appendix G in the IPMI spec.
16734557a2a1Srobj  *
16744557a2a1Srobj  * Payloads for these two commands are described in Sections 34.1 and 34.2 of
16754557a2a1Srobj  * the spec, respectively.
16764557a2a1Srobj  */
16774557a2a1Srobj #define	IPMI_CMD_GET_FRU_INV_AREA	0x10
16784557a2a1Srobj #define	IPMI_CMD_READ_FRU_DATA		0x11
16794557a2a1Srobj 
16804557a2a1Srobj /*
16814557a2a1Srobj  * Structs to hold the FRU Common Header and the FRU Product Info Area, as
16824557a2a1Srobj  * described in the IPMI Platform Management FRU Information Storage
16834557a2a1Srobj  * Definition (v1.1).
16844557a2a1Srobj  */
16854557a2a1Srobj typedef struct ipmi_fru_hdr
16864557a2a1Srobj {
16874557a2a1Srobj 	uint8_t		ifh_format;
16884557a2a1Srobj 	uint8_t		ifh_int_use_off;
16894557a2a1Srobj 	uint8_t		ifh_chassis_info_off;
16904557a2a1Srobj 	uint8_t		ifh_board_info_off;
16914557a2a1Srobj 	uint8_t		ifh_product_info_off;
16924557a2a1Srobj 	uint8_t		ifh_multi_rec_off;
16934557a2a1Srobj 	uint8_t		ifh_pad;
16944557a2a1Srobj 	uint8_t		ifh_chksum;
16954557a2a1Srobj } ipmi_fru_hdr_t;
16964557a2a1Srobj 
16974557a2a1Srobj /*
16984557a2a1Srobj  * Because only 6 bits are used to specify the length of each field in the FRU
16994557a2a1Srobj  * product and board info areas, the biggest string we would ever need to hold
17004557a2a1Srobj  * would be 63 chars plus a NULL.
17014557a2a1Srobj  */
17024557a2a1Srobj #define	FRU_INFO_MAXLEN	64
17034557a2a1Srobj 
17044557a2a1Srobj typedef struct ipmi_fru_brd_info
17054557a2a1Srobj {
17064557a2a1Srobj 	char	ifbi_manuf_date[3];
17074557a2a1Srobj 	char	ifbi_manuf_name[FRU_INFO_MAXLEN];
17084557a2a1Srobj 	char	ifbi_board_name[FRU_INFO_MAXLEN];
17094557a2a1Srobj 	char	ifbi_product_serial[FRU_INFO_MAXLEN];
17104557a2a1Srobj 	char	ifbi_part_number[FRU_INFO_MAXLEN];
17114557a2a1Srobj } ipmi_fru_brd_info_t;
17124557a2a1Srobj 
17134557a2a1Srobj typedef struct ipmi_fru_prod_info
17144557a2a1Srobj {
17154557a2a1Srobj 	char	ifpi_manuf_name[FRU_INFO_MAXLEN];
17164557a2a1Srobj 	char	ifpi_product_name[FRU_INFO_MAXLEN];
17174557a2a1Srobj 	char	ifpi_part_number[FRU_INFO_MAXLEN];
17184557a2a1Srobj 	char	ifpi_product_version[FRU_INFO_MAXLEN];
17194557a2a1Srobj 	char	ifpi_product_serial[FRU_INFO_MAXLEN];
17204557a2a1Srobj 	char	ifpi_asset_tag[FRU_INFO_MAXLEN];
17214557a2a1Srobj } ipmi_fru_prod_info_t;
17224557a2a1Srobj 
17232eeaed14Srobj extern int ipmi_fru_read(ipmi_handle_t *, ipmi_sdr_fru_locator_t *, char **);
17242eeaed14Srobj extern int ipmi_fru_parse_board(ipmi_handle_t *, char *, ipmi_fru_brd_info_t *);
17252eeaed14Srobj extern int ipmi_fru_parse_product(ipmi_handle_t *, char *,
17262eeaed14Srobj     ipmi_fru_prod_info_t *);
17272eeaed14Srobj 
17282eeaed14Srobj /*
17292eeaed14Srobj  * Routines to convert from entity and sensors defines into text strings.
17302eeaed14Srobj  */
17312eeaed14Srobj void ipmi_entity_name(uint8_t, char *, size_t);
17322eeaed14Srobj void ipmi_sensor_type_name(uint8_t, char *, size_t);
1733825ba0f2Srobj void ipmi_sensor_units_name(uint8_t, char *, size_t);
17342eeaed14Srobj void ipmi_sensor_reading_name(uint8_t, uint8_t, char *, size_t);
17352eeaed14Srobj 
17362eeaed14Srobj /*
17372eeaed14Srobj  * Entity management.  IPMI has a notion of 'entities', but these are not
17382eeaed14Srobj  * directly accessible from any commands.  Instead, their existence is inferred
17392eeaed14Srobj  * from examining the SDR repository.  Since this is rather unwieldy, and
17402eeaed14Srobj  * iterating over entities is a common operation, libipmi provides an entity
17412eeaed14Srobj  * abstraction that hides the implementation details.  This handles entity
17422eeaed14Srobj  * groupings as well as SDR associations.
17432eeaed14Srobj  */
17442eeaed14Srobj typedef struct ipmi_entity {
17452eeaed14Srobj 	uint8_t		ie_type;
17462eeaed14Srobj 	uint8_t		ie_instance;
17472eeaed14Srobj 	uint8_t		ie_children;
17482eeaed14Srobj 	boolean_t	ie_logical;
17492eeaed14Srobj } ipmi_entity_t;
17502eeaed14Srobj 
17512eeaed14Srobj extern int ipmi_entity_iter(ipmi_handle_t *, int (*)(ipmi_handle_t *,
17522eeaed14Srobj     ipmi_entity_t *, void *), void *);
17532eeaed14Srobj extern int ipmi_entity_iter_sdr(ipmi_handle_t *, ipmi_entity_t *,
17542eeaed14Srobj     int (*)(ipmi_handle_t *, ipmi_entity_t *, const char *, ipmi_sdr_t *,
17552eeaed14Srobj     void *), void *);
17562eeaed14Srobj extern int ipmi_entity_iter_children(ipmi_handle_t *, ipmi_entity_t *,
17572eeaed14Srobj     int (*)(ipmi_handle_t *, ipmi_entity_t *, void *), void *);
17582eeaed14Srobj extern ipmi_entity_t *ipmi_entity_lookup(ipmi_handle_t *, uint8_t,
17592eeaed14Srobj     uint8_t);
17602eeaed14Srobj extern ipmi_entity_t *ipmi_entity_lookup_sdr(ipmi_handle_t *, const char *);
17612eeaed14Srobj extern ipmi_entity_t *ipmi_entity_parent(ipmi_handle_t *, ipmi_entity_t *);
17622eeaed14Srobj extern int ipmi_entity_present(ipmi_handle_t *, ipmi_entity_t *, boolean_t *);
17632eeaed14Srobj extern int ipmi_entity_present_sdr(ipmi_handle_t *, ipmi_sdr_t *, boolean_t *);
17644557a2a1Srobj 
17651af98250Seschrock /*
17661af98250Seschrock  * User management.  The raw functions are private to libipmi, and only the
17671af98250Seschrock  * higher level abstraction (ipmi_user_t) is exported to consumers of the
17681af98250Seschrock  * library.
17691af98250Seschrock  */
17701af98250Seschrock 
17711af98250Seschrock #define	IPMI_USER_PRIV_CALLBACK		0x1
17721af98250Seschrock #define	IPMI_USER_PRIV_USER		0x2
17731af98250Seschrock #define	IPMI_USER_PRIV_OPERATOR		0x3
17741af98250Seschrock #define	IPMI_USER_PRIV_ADMIN		0x4
17751af98250Seschrock #define	IPMI_USER_PRIV_OEM		0x5
17761af98250Seschrock #define	IPMI_USER_PRIV_NONE		0xf
17771af98250Seschrock 
17781af98250Seschrock typedef struct ipmi_user {
17791af98250Seschrock 	uint8_t		iu_uid;
17801af98250Seschrock 	char		*iu_name;
17811af98250Seschrock 	boolean_t	iu_enabled;
17821af98250Seschrock 	boolean_t	iu_ipmi_msg_enable;
17831af98250Seschrock 	boolean_t	iu_link_auth_enable;
17841af98250Seschrock 	uint8_t		iu_priv;
17851af98250Seschrock } ipmi_user_t;
17861af98250Seschrock 
17871af98250Seschrock extern int ipmi_user_iter(ipmi_handle_t *,
17881af98250Seschrock     int (*)(ipmi_user_t *, void *), void *);
17891af98250Seschrock extern ipmi_user_t *ipmi_user_lookup_name(ipmi_handle_t *, const char *);
17901af98250Seschrock extern ipmi_user_t *ipmi_user_lookup_id(ipmi_handle_t *, uint8_t);
17911af98250Seschrock extern int ipmi_user_set_password(ipmi_handle_t *, uint8_t, const char *);
17921af98250Seschrock 
17939113a79cSeschrock /*
17949113a79cSeschrock  * The remaining functions are private to the implementation of the Sun ILOM
17959113a79cSeschrock  * service processor.  These function first check the manufacturer from the IPMI
17969113a79cSeschrock  * device ID, and will return EIPMI_NOT_SUPPORTED if attempted for non-Sun
17979113a79cSeschrock  * devices.
17989113a79cSeschrock  */
179981d9f076SRobert Johnston boolean_t ipmi_is_sun_ilom(ipmi_deviceid_t *);
18009113a79cSeschrock 
18019113a79cSeschrock /*
18029113a79cSeschrock  * Sun OEM LED requests.
18039113a79cSeschrock  */
18049113a79cSeschrock 
18059113a79cSeschrock #define	IPMI_SUNOEM_LED_MODE_OFF	0
18069113a79cSeschrock #define	IPMI_SUNOEM_LED_MODE_ON		1
18079113a79cSeschrock #define	IPMI_SUNOEM_LED_MODE_STANDBY	2
18089113a79cSeschrock #define	IPMI_SUNOEM_LED_MODE_SLOW	3
18099113a79cSeschrock #define	IPMI_SUNOEM_LED_MODE_FAST	4
18109113a79cSeschrock 
18119113a79cSeschrock /*
18129113a79cSeschrock  * These functions take a SDR record and construct the appropriate form of the
18139113a79cSeschrock  * above commands.
18149113a79cSeschrock  */
18159113a79cSeschrock extern int ipmi_sunoem_led_set(ipmi_handle_t *,
18169113a79cSeschrock     ipmi_sdr_generic_locator_t *, uint8_t);
18179113a79cSeschrock extern int ipmi_sunoem_led_get(ipmi_handle_t *,
18189113a79cSeschrock     ipmi_sdr_generic_locator_t *, uint8_t *);
18199113a79cSeschrock 
18209113a79cSeschrock /*
18219113a79cSeschrock  * Sun OEM uptime.  Note that the underlying command returns the uptime in big
18229113a79cSeschrock  * endian form.  This wrapper automatically converts to the appropriate native
18239113a79cSeschrock  * form.
18249113a79cSeschrock  */
18259113a79cSeschrock 
18269113a79cSeschrock #define	IPMI_CMD_SUNOEM_UPTIME		0x08
18279113a79cSeschrock 
18289113a79cSeschrock extern int ipmi_sunoem_uptime(ipmi_handle_t *, uint32_t *, uint32_t *);
18299113a79cSeschrock 
18309113a79cSeschrock /*
18319113a79cSeschrock  * Sun OEM FRU update.  The FRU information is managed through a generic
18329113a79cSeschrock  * identifier, and then a type-specific data portion.  The wrapper function will
18339113a79cSeschrock  * automatically fill in the data length field according to which type is
18349113a79cSeschrock  * specified.
18359113a79cSeschrock  */
18369113a79cSeschrock 
18379113a79cSeschrock #define	IPMI_CMD_SUNOEM_FRU_UPDATE	0x16
18389113a79cSeschrock 
18399113a79cSeschrock #define	IPMI_SUNOEM_FRU_DIMM	0x00
18409113a79cSeschrock #define	IPMI_SUNOEM_FRU_CPU	0x01
18419113a79cSeschrock #define	IPMI_SUNOEM_FRU_BIOS	0x02
18429113a79cSeschrock #define	IPMI_SUNOEM_FRU_DISK	0x03
18439113a79cSeschrock 
18449113a79cSeschrock typedef struct ipmi_sunoem_fru {
18459113a79cSeschrock 	uint8_t				isf_type;
18469113a79cSeschrock 	uint8_t				isf_id;
18479113a79cSeschrock 	uint8_t				isf_datalen;
18489113a79cSeschrock 	union {
18499113a79cSeschrock 		struct {
18509113a79cSeschrock 			uint8_t		isf_data[128];
18519113a79cSeschrock 		} dimm;
18529113a79cSeschrock 		struct {
18539113a79cSeschrock 			uint32_t	isf_thermtrip;
18549113a79cSeschrock 			uint32_t	isf_eax;
18559113a79cSeschrock 			char		isf_product[48];
18569113a79cSeschrock 		} cpu;
18579113a79cSeschrock 		struct {
18589113a79cSeschrock 			char		isf_part[16];
18599113a79cSeschrock 			char		isf_version[16];
18609113a79cSeschrock 		} bios;
18619113a79cSeschrock 		struct {
18629113a79cSeschrock 			char		isf_manufacturer[16];
18639113a79cSeschrock 			char		isf_model[28];
18649113a79cSeschrock 			char		isf_serial[20];
18659113a79cSeschrock 			char		isf_version[8];
18669113a79cSeschrock 			char		isf_capacity[16];
18679113a79cSeschrock 		} disk;
18689113a79cSeschrock 	} isf_data;
18699113a79cSeschrock } ipmi_sunoem_fru_t;
18709113a79cSeschrock 
18719113a79cSeschrock int ipmi_sunoem_update_fru(ipmi_handle_t *, ipmi_sunoem_fru_t *);
18729113a79cSeschrock 
18738f022dd6SRob Johnston /*
18748f022dd6SRob Johnston  * See section 28.2
18758f022dd6SRob Johnston  */
18768f022dd6SRob Johnston #define	IPMI_CMD_GET_CHASSIS_STATUS		0x01
18778f022dd6SRob Johnston 
18788f022dd6SRob Johnston /*
18798f022dd6SRob Johnston  * flags for ichs_current_pwr_state field
18808f022dd6SRob Johnston  */
18818f022dd6SRob Johnston #define	IPMI_CURR_PWR_STATE_ON		0x01
18828f022dd6SRob Johnston #define	IPMI_CURR_PWR_STATE_OVERLOAD	0x02
18838f022dd6SRob Johnston #define	IPMI_CURR_PWR_STATE_INTERLOCK	0x04
18848f022dd6SRob Johnston #define	IPMI_CURR_PWR_STATE_FAULT	0x08
18858f022dd6SRob Johnston #define	IPMI_CURR_PWR_STATE_CNTL_FAULT	0x10
18868f022dd6SRob Johnston 
18878f022dd6SRob Johnston /*
18888f022dd6SRob Johnston  * flags for ichs_last_pwr_state field
18898f022dd6SRob Johnston  */
18908f022dd6SRob Johnston #define	IPMI_LAST_PWR_STATE_ACFAILED	0x01
18918f022dd6SRob Johnston #define	IPMI_LAST_PWR_STATE_OVERLOAD	0x02
18928f022dd6SRob Johnston #define	IPMI_LAST_PWR_STATE_INTERLOCK	0x04
18938f022dd6SRob Johnston #define	IPMI_LAST_PWR_STATE_FAULT	0x08
18948f022dd6SRob Johnston #define	IPMI_LAST_PWR_STATE_CMD_ON	0x10
18958f022dd6SRob Johnston 
18968f022dd6SRob Johnston /*
18978f022dd6SRob Johnston  * flags for the ichs_pwr_restore_policy field
18988f022dd6SRob Johnston  */
18998f022dd6SRob Johnston #define	IPMI_PWR_POLICY_REMAIN_OFF	0x0
19008f022dd6SRob Johnston #define	IPMI_PWR_POLICY_RESTORE		0x1
19018f022dd6SRob Johnston #define	IPMI_PWR_POLICY_POWER_ON	0x2
19028f022dd6SRob Johnston #define	IPMI_PWR_POLICY_UNKNOWN		0x3
19038f022dd6SRob Johnston 
19048f022dd6SRob Johnston typedef struct ipmi_chassis_status {
19058f022dd6SRob Johnston 	DECL_BITFIELD3(
19068f022dd6SRob Johnston 	    ichs_current_pwr_state	:5,
19078f022dd6SRob Johnston 	    ichs_pwr_restore_policy	:2,
19088f022dd6SRob Johnston 	    __reserved1			:1);
19098f022dd6SRob Johnston 	DECL_BITFIELD2(
19108f022dd6SRob Johnston 	    ichs_last_pwr_state		:5,
19118f022dd6SRob Johnston 	    __reserved2			:3);
19128f022dd6SRob Johnston 	DECL_BITFIELD7(
19138f022dd6SRob Johnston 	    ichs_intrusion_asserted	:1,
19148f022dd6SRob Johnston 	    ichs_front_panel_disabled	:1,
19158f022dd6SRob Johnston 	    ichs_drive_fault_asserted	:1,
19168f022dd6SRob Johnston 	    ichs_fan_fault_asserted	:1,
19178f022dd6SRob Johnston 	    ichs_identify_state		:2,
19188f022dd6SRob Johnston 	    ichs_identify_supported	:1,
19198f022dd6SRob Johnston 	    __reserved3			:1);
19208f022dd6SRob Johnston } ipmi_chassis_status_t;
19218f022dd6SRob Johnston 
19228f022dd6SRob Johnston extern ipmi_chassis_status_t *ipmi_chassis_status(ipmi_handle_t *);
19238f022dd6SRob Johnston 
19248f022dd6SRob Johnston /*
19258f022dd6SRob Johnston  * See section 28.5
19268f022dd6SRob Johnston  */
1927aec67356SRobert Johnston #define	IPMI_CMD_CHASSIS_IDENTIFY	0x04
1928aec67356SRobert Johnston int ipmi_chassis_identify(ipmi_handle_t *, boolean_t);
1929aec67356SRobert Johnston 
19309113a79cSeschrock #pragma pack()
19319113a79cSeschrock 
19329113a79cSeschrock #ifdef	__cplusplus
19339113a79cSeschrock }
19349113a79cSeschrock #endif
19359113a79cSeschrock 
19369113a79cSeschrock #endif	/* _LIBIPMI_H */
1937