xref: /onnv-gate/usr/src/lib/libipmi/common/libipmi.h (revision 12315:e8f2d0caeb31)
13798Seschrock /*
23798Seschrock  * CDDL HEADER START
33798Seschrock  *
43798Seschrock  * The contents of this file are subject to the terms of the
53798Seschrock  * Common Development and Distribution License (the "License").
63798Seschrock  * You may not use this file except in compliance with the License.
73798Seschrock  *
83798Seschrock  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
93798Seschrock  * or http://www.opensolaris.org/os/licensing.
103798Seschrock  * See the License for the specific language governing permissions
113798Seschrock  * and limitations under the License.
123798Seschrock  *
133798Seschrock  * When distributing Covered Code, include this CDDL HEADER in each
143798Seschrock  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
153798Seschrock  * If applicable, add the following below this CDDL HEADER, with the
163798Seschrock  * fields enclosed by brackets "[]" replaced with your own identifying
173798Seschrock  * information: Portions Copyright [yyyy] [name of copyright owner]
183798Seschrock  *
193798Seschrock  * CDDL HEADER END
203798Seschrock  */
213798Seschrock /*
22*12315SRobert.Johnston@Sun.COM  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
233798Seschrock  */
243798Seschrock 
253798Seschrock #ifndef	_LIBIPMI_H
263798Seschrock #define	_LIBIPMI_H
273798Seschrock 
283798Seschrock #include <sys/bmc_intf.h>
293798Seschrock #include <sys/byteorder.h>
3011756SRobert.Johnston@Sun.COM #include <sys/nvpair.h>
315621Seschrock #include <sys/sysmacros.h>
323798Seschrock 
333798Seschrock /*
343798Seschrock  * Private interfaces for communicating with attached services over IPMI.  This
353798Seschrock  * library is designed for system software communicating with Sun-supported
363798Seschrock  * service processors over /dev/bmc.  It is not a generic IPMI library.
373798Seschrock  *
383798Seschrock  * Documentation references refer to "Intelligent Platform Management Interface
393798Seschrock  * Specification Second Generation v2.0", document revision 1.0 with Februrary
403798Seschrock  * 15, 2006 Markup from "IPMI v2.0 Addenda, Errata, and Clarifications Revision
413798Seschrock  * 3".
423798Seschrock  */
433798Seschrock 
443798Seschrock #ifdef	__cplusplus
453798Seschrock extern "C" {
463798Seschrock #endif
473798Seschrock 
483798Seschrock typedef struct ipmi_handle ipmi_handle_t;
493798Seschrock 
503798Seschrock #pragma pack(1)
513798Seschrock 
523798Seschrock /*
533798Seschrock  * Basic netfn definitions.  See section 5.1.
543798Seschrock  */
55*12315SRobert.Johnston@Sun.COM #define	IPMI_NETFN_CHASSIS		BMC_NETFN_CHASSIS
563798Seschrock #define	IPMI_NETFN_APP			BMC_NETFN_APP
573798Seschrock #define	IPMI_NETFN_STORAGE		BMC_NETFN_STORAGE
583798Seschrock #define	IPMI_NETFN_SE			BMC_NETFN_SE
598339SEric.Schrock@Sun.COM #define	IPMI_NETFN_TRANSPORT		0x0C
603798Seschrock #define	IPMI_NETFN_OEM			0x2e
613798Seschrock 
623798Seschrock /*
633798Seschrock  * Error definitions
643798Seschrock  */
653798Seschrock #define	EIPMI_BASE	2000
663798Seschrock 
676070Srobj typedef enum {
683798Seschrock 	EIPMI_NOMEM = EIPMI_BASE,	/* memory allocation failure */
693798Seschrock 	EIPMI_BMC_OPEN_FAILED,		/* failed to open /dev/bmc */
706070Srobj 	EIPMI_BMC_PUTMSG,		/* failed to send message to /dev/bmc */
716070Srobj 	EIPMI_BMC_GETMSG,	/* failed to read response from /dev/bmc */
723798Seschrock 	EIPMI_BMC_RESPONSE,		/* response from /dev/bmc failed */
733798Seschrock 	EIPMI_INVALID_COMMAND,		/* invalid command */
743798Seschrock 	EIPMI_COMMAND_TIMEOUT,		/* command timeout */
753798Seschrock 	EIPMI_DATA_LENGTH_EXCEEDED,	/* maximum data length exceeded */
763798Seschrock 	EIPMI_SEND_FAILED,		/* failed to send BMC request */
776070Srobj 	EIPMI_UNSPECIFIED,		/* unspecified BMC error */
783798Seschrock 	EIPMI_UNKNOWN,			/* unknown error */
793798Seschrock 	EIPMI_BAD_RESPONSE,		/* received unexpected response */
803798Seschrock 	EIPMI_BAD_RESPONSE_LENGTH,	/* unexpected response length */
816070Srobj 	EIPMI_INVALID_RESERVATION,	/* invalid or cancelled reservation */
823798Seschrock 	EIPMI_NOT_PRESENT,		/* requested entity not present */
836070Srobj 	EIPMI_INVALID_REQUEST,		/* malformed request data */
846070Srobj 	EIPMI_BUSY,			/* service processor is busy */
856070Srobj 	EIPMI_NOSPACE,			/* service processor is out of space */
866070Srobj 	EIPMI_UNAVAILABLE,		/* service processor is unavailable */
878339SEric.Schrock@Sun.COM 	EIPMI_ACCESS,			/* insufficient privileges */
888339SEric.Schrock@Sun.COM 	EIPMI_BADPARAM,			/* parameter is not supported */
898339SEric.Schrock@Sun.COM 	EIPMI_READONLY,			/* attempt to write read-only param */
9011756SRobert.Johnston@Sun.COM 	EIPMI_WRITEONLY,		/* attempt to read write-only param */
9111756SRobert.Johnston@Sun.COM 	EIPMI_LAN_OPEN_FAILED,		/* failed to open socket */
9211756SRobert.Johnston@Sun.COM 	EIPMI_LAN_PING_FAILED,		/* RMCP Ping message failed */
9311756SRobert.Johnston@Sun.COM 	EIPMI_LAN_PASSWD_NOTSUP, /* password authentication not supported */
9411756SRobert.Johnston@Sun.COM 	EIPMI_LAN_CHALLENGE,		/* failure getting challenge */
9511756SRobert.Johnston@Sun.COM 	EIPMI_LAN_SESSION,		/* failure activating session */
9611756SRobert.Johnston@Sun.COM 	EIPMI_LAN_SETPRIV		/* failure setting session privs */
976070Srobj } ipmi_errno_t;
983798Seschrock 
993798Seschrock /*
1003798Seschrock  * Basic library functions.
1013798Seschrock  *
1023798Seschrock  * The ipmi_handle is the primary interface to the library.  The library itself
1033798Seschrock  * is not MT-safe, but it is safe within a single handle.  Multithreaded clients
1043798Seschrock  * should either open multiple handles, or otherwise synchronize access to the
1053798Seschrock  * same handle.
1063798Seschrock  *
1073798Seschrock  * There is a single command response buffer that is stored with the handle, to
1083798Seschrock  * simplify memory management in the caller.  The memory referenced by a command
1093798Seschrock  * response is only valid until the next command is issued.  The caller is
1103798Seschrock  * responsible for making a copy of the response if it is needed.
1113798Seschrock  */
11211756SRobert.Johnston@Sun.COM extern ipmi_handle_t *ipmi_open(int *, char **, uint_t xport_type, nvlist_t *);
11311756SRobert.Johnston@Sun.COM 
11411756SRobert.Johnston@Sun.COM /*
11511756SRobert.Johnston@Sun.COM  * Constants for nvpair names for the params nvlist that is passed to
11611756SRobert.Johnston@Sun.COM  * ipmi_open().  If the IPMI_TRANSPORT_BMC is desired, then it is sufficient
11711756SRobert.Johnston@Sun.COM  * to just specify NULL for the params nvlist.
11811756SRobert.Johnston@Sun.COM  *
11911756SRobert.Johnston@Sun.COM  * For IPMI_TRANSPORT_LAN, the params nvlist must contain the following
12011756SRobert.Johnston@Sun.COM  * nvpairs:
12111756SRobert.Johnston@Sun.COM  *
12211756SRobert.Johnston@Sun.COM  * IPMI_LAN_HOST, IPMI_LAN_USER, IPMI_LAN_PASSWD
12311756SRobert.Johnston@Sun.COM  *
12411756SRobert.Johnston@Sun.COM  * IPMI_LAN_PORT is optional and will default to 623
12511756SRobert.Johnston@Sun.COM  * IPMI_LAN_PRIVLVL is optional and will default to admin
12611756SRobert.Johnston@Sun.COM  * IPMI_LAN_TIMEOUT is optional and will default to 3 seconds
12711756SRobert.Johnston@Sun.COM  * IPMI_LAN_NUM_RETIES is optional and will default to 5
12811756SRobert.Johnston@Sun.COM  */
12911756SRobert.Johnston@Sun.COM #define	IPMI_TRANSPORT_TYPE	"transport-type"
13011756SRobert.Johnston@Sun.COM #define	IPMI_TRANSPORT_BMC	0x01
13111756SRobert.Johnston@Sun.COM #define	IPMI_TRANSPORT_LAN	0x02
13211756SRobert.Johnston@Sun.COM 
13311756SRobert.Johnston@Sun.COM #define	IPMI_LAN_HOST		"lan-host"
13411756SRobert.Johnston@Sun.COM #define	IPMI_LAN_PORT		"lan-port"
13511756SRobert.Johnston@Sun.COM #define	IPMI_LAN_USER		"lan-user"
13611756SRobert.Johnston@Sun.COM #define	IPMI_LAN_PASSWD		"lan-passwd"
13711756SRobert.Johnston@Sun.COM #define	IPMI_LAN_PRIVLVL	"lan-privlvl"
13811756SRobert.Johnston@Sun.COM #define	IPMI_LAN_TIMEOUT	"lan-timeout"
13911756SRobert.Johnston@Sun.COM #define	IPMI_LAN_NUM_RETRIES	"lan-num-retries"
14011756SRobert.Johnston@Sun.COM 
1413798Seschrock extern void ipmi_close(ipmi_handle_t *);
1423798Seschrock 
1433798Seschrock extern int ipmi_errno(ipmi_handle_t *);
1443798Seschrock extern const char *ipmi_errmsg(ipmi_handle_t *);
1453798Seschrock 
1463798Seschrock /*
1473798Seschrock  * Raw requests.  See section 5.
1483798Seschrock  */
1493798Seschrock typedef struct ipmi_cmd {
1503798Seschrock 	uint8_t		ic_netfn:6;
1513798Seschrock 	uint8_t		ic_lun:2;
1523798Seschrock 	uint8_t		ic_cmd;
1533798Seschrock 	uint16_t	ic_dlen;
1543798Seschrock 	void		*ic_data;
1553798Seschrock } ipmi_cmd_t;
1563798Seschrock 
1573798Seschrock extern ipmi_cmd_t *ipmi_send(ipmi_handle_t *, ipmi_cmd_t *);
1583798Seschrock 
1593798Seschrock /*
1603798Seschrock  * Retrieve basic information about the IPMI device.  See section 20.1 "Get
1613798Seschrock  * Device ID Command".
1623798Seschrock  */
1633798Seschrock #define	IPMI_CMD_GET_DEVICEID		0x01
1643798Seschrock 
1653798Seschrock typedef struct ipmi_deviceid {
1663798Seschrock 	uint8_t		id_devid;
1675621Seschrock 	DECL_BITFIELD3(
1685621Seschrock 	    id_dev_rev		:4,
1695621Seschrock 	    __reserved		:3,
1705621Seschrock 	    id_dev_sdrs		:1);
1715621Seschrock 	DECL_BITFIELD2(
1725621Seschrock 	    id_firm_major	:7,
1735621Seschrock 	    id_dev_available	:1);
1743798Seschrock 	uint8_t		id_firm_minor;
1753798Seschrock 	uint8_t		id_ipmi_rev;
1763798Seschrock 	uint8_t		id_dev_support;
1773798Seschrock 	uint8_t		id_manufacturer[3];
17811756SRobert.Johnston@Sun.COM 	uint8_t		id_product[2];
1793798Seschrock } ipmi_deviceid_t;
1803798Seschrock 
1816070Srobj #define	IPMI_OEM_SUN		0x2a
1826070Srobj #define	IPMI_PROD_SUN_ILOM	0x4701
1833798Seschrock 
1843798Seschrock ipmi_deviceid_t *ipmi_get_deviceid(ipmi_handle_t *);
1853798Seschrock 
1863798Seschrock #define	ipmi_devid_manufacturer(dp)		\
1873798Seschrock 	((dp)->id_manufacturer[0] |		\
1883798Seschrock 	((dp)->id_manufacturer[1] << 8) |	\
1893798Seschrock 	((dp)->id_manufacturer[2] << 16))
1903798Seschrock 
19111756SRobert.Johnston@Sun.COM #define	ipmi_devid_product(dp)		\
19211756SRobert.Johnston@Sun.COM 	((dp)->id_product[0] |		\
19311756SRobert.Johnston@Sun.COM 	((dp)->id_product[1] << 8))
19411756SRobert.Johnston@Sun.COM 
1956070Srobj const char *ipmi_firmware_version(ipmi_handle_t *);
1966070Srobj 
1976070Srobj /*
19811756SRobert.Johnston@Sun.COM  * Get Channel Auth Caps.  See section 22.13.
19911756SRobert.Johnston@Sun.COM  */
20011756SRobert.Johnston@Sun.COM typedef struct ipmi_channel_auth_caps {
20111756SRobert.Johnston@Sun.COM 	uint8_t cap_channel;
20211756SRobert.Johnston@Sun.COM 	DECL_BITFIELD3(
20311756SRobert.Johnston@Sun.COM 	    cap_authtype	:6,
20411756SRobert.Johnston@Sun.COM 	    __reserved1		:1,
20511756SRobert.Johnston@Sun.COM 	    cap_ipmirev2	:1);
20611756SRobert.Johnston@Sun.COM 	DECL_BITFIELD5(
20711756SRobert.Johnston@Sun.COM 	    cap_anon		:3,
20811756SRobert.Johnston@Sun.COM 	    cap_peruser		:1,
20911756SRobert.Johnston@Sun.COM 	    cap_permesg		:1,
21011756SRobert.Johnston@Sun.COM 	    cap_kgstatus	:1,
21111756SRobert.Johnston@Sun.COM 	    __reserved2		:2);
21211756SRobert.Johnston@Sun.COM 	uint8_t cap_ext;
21311756SRobert.Johnston@Sun.COM 	uint8_t cap_oemid[3];
21411756SRobert.Johnston@Sun.COM 	uint8_t cap_oemaux;
21511756SRobert.Johnston@Sun.COM } ipmi_channel_auth_caps_t;
21611756SRobert.Johnston@Sun.COM 
21711756SRobert.Johnston@Sun.COM #define	IPMI_CMD_GET_CHANNEL_AUTH_CAPS	0x38
21811756SRobert.Johnston@Sun.COM extern ipmi_channel_auth_caps_t *ipmi_get_channel_auth_caps(ipmi_handle_t *,
21911756SRobert.Johnston@Sun.COM     uint8_t, uint8_t);
22011756SRobert.Johnston@Sun.COM 
22111756SRobert.Johnston@Sun.COM /*
2228339SEric.Schrock@Sun.COM  * Get Channel Info.  See section 22.24.
2238339SEric.Schrock@Sun.COM  */
2248339SEric.Schrock@Sun.COM typedef struct ipmi_channel_info {
2258339SEric.Schrock@Sun.COM 	DECL_BITFIELD2(
2268339SEric.Schrock@Sun.COM 	    ici_number		:4,
2278339SEric.Schrock@Sun.COM 	    __reserved1		:4);
2288339SEric.Schrock@Sun.COM 	DECL_BITFIELD2(
2298339SEric.Schrock@Sun.COM 	    ici_medium		:7,
2308339SEric.Schrock@Sun.COM 	    __reserved2		:1);
2318339SEric.Schrock@Sun.COM 	DECL_BITFIELD2(
2328339SEric.Schrock@Sun.COM 	    ici_protocol	:5,
2338339SEric.Schrock@Sun.COM 	    __reserved3		:3);
2348339SEric.Schrock@Sun.COM 	DECL_BITFIELD3(
2358339SEric.Schrock@Sun.COM 	    ici_session_count	:6,
2368339SEric.Schrock@Sun.COM 	    ici_single_session	:1,
2378339SEric.Schrock@Sun.COM 	    ici_multi_Session	:1);
2388339SEric.Schrock@Sun.COM 	uint8_t		ici_vendor[3];
2398339SEric.Schrock@Sun.COM 	uint8_t		ici_auxinfo[2];
2408339SEric.Schrock@Sun.COM } ipmi_channel_info_t;
2418339SEric.Schrock@Sun.COM 
2428339SEric.Schrock@Sun.COM #define	IPMI_CMD_GET_CHANNEL_INFO	0x42
2438339SEric.Schrock@Sun.COM 
2448339SEric.Schrock@Sun.COM /*
2458339SEric.Schrock@Sun.COM  * Channel Numbers.  See section 6.3.
2468339SEric.Schrock@Sun.COM  */
2478339SEric.Schrock@Sun.COM #define	IPMI_CHANNEL_PRIMARY		0x0
2488339SEric.Schrock@Sun.COM #define	IPMI_CHANNEL_MIN		0x1
2498339SEric.Schrock@Sun.COM #define	IPMI_CHANNEL_MAX		0xB
2508339SEric.Schrock@Sun.COM #define	IPMI_CHANNEL_CURRENT		0xE
2518339SEric.Schrock@Sun.COM #define	IPMI_CHANNEL_SYSTEM		0xF
2528339SEric.Schrock@Sun.COM 
2538339SEric.Schrock@Sun.COM extern ipmi_channel_info_t *ipmi_get_channel_info(ipmi_handle_t *, int);
2548339SEric.Schrock@Sun.COM 
2558339SEric.Schrock@Sun.COM /*
2568339SEric.Schrock@Sun.COM  * Channel Protocol Types.  See section 6.4.
2578339SEric.Schrock@Sun.COM  */
2588339SEric.Schrock@Sun.COM #define	IPMI_PROTOCOL_IPMB		0x1
2598339SEric.Schrock@Sun.COM #define	IPMI_PROTOCOL_ICMB		0x2
2608339SEric.Schrock@Sun.COM #define	IPMI_PROTOCOL_SMBUS		0x4
2618339SEric.Schrock@Sun.COM #define	IPMI_PROTOCOL_KCS		0x5
2628339SEric.Schrock@Sun.COM #define	IPMI_PROTOCOL_SMIC		0x6
2638339SEric.Schrock@Sun.COM #define	IPMI_PROTOCOL_BT10		0x7
2648339SEric.Schrock@Sun.COM #define	IPMI_PROTOCOL_BT15		0x8
2658339SEric.Schrock@Sun.COM #define	IPMI_PROTOCOL_TMODE		0x9
2668339SEric.Schrock@Sun.COM #define	IPMI_PROTOCOL_OEM1		0xC
2678339SEric.Schrock@Sun.COM #define	IPMI_PROTOCOL_OEM2		0xD
2688339SEric.Schrock@Sun.COM #define	IPMI_PROTOCOL_OEM3		0xE
2698339SEric.Schrock@Sun.COM #define	IPMI_PROTOCOL_OEM4		0xF
2708339SEric.Schrock@Sun.COM 
2718339SEric.Schrock@Sun.COM /*
2728339SEric.Schrock@Sun.COM  * Channel Medium Types.  See section 6.5.
2738339SEric.Schrock@Sun.COM  */
2748339SEric.Schrock@Sun.COM #define	IPMI_MEDIUM_IPMB		0x1
2758339SEric.Schrock@Sun.COM #define	IPMI_MEDIUM_ICMB10		0x2
2768339SEric.Schrock@Sun.COM #define	IPMI_MEDIUM_ICMB09		0x3
2778339SEric.Schrock@Sun.COM #define	IPMI_MEDIUM_8023LAN		0x4
2788339SEric.Schrock@Sun.COM #define	IPMI_MEDIUM_RS232		0x5
2798339SEric.Schrock@Sun.COM #define	IPMI_MEDIUM_OTHERLAN		0x6
2808339SEric.Schrock@Sun.COM #define	IPMI_MEDIUM_PCISMBUS		0x7
2818339SEric.Schrock@Sun.COM #define	IPMI_MEDIUM_SMBUS10		0x8
2828339SEric.Schrock@Sun.COM #define	IPMI_MEDIUM_SMBUS20		0x9
2838339SEric.Schrock@Sun.COM #define	IPMI_MEDIUM_USB1		0xA
2848339SEric.Schrock@Sun.COM #define	IPMI_MEDIUM_USB2		0xB
2858339SEric.Schrock@Sun.COM #define	IPMI_MEDIUM_SYSTEM		0xC
2868339SEric.Schrock@Sun.COM 
2878339SEric.Schrock@Sun.COM /*
2888339SEric.Schrock@Sun.COM  * LAN Configuration.  See section 23.  While the underlying mechanism is
2898339SEric.Schrock@Sun.COM  * implemented via a sequence of get/set parameter commands, we assume that
2908339SEric.Schrock@Sun.COM  * consumers prefer to get and set information in chunks, and therefore expose
2918339SEric.Schrock@Sun.COM  * the configuration as a structure, with some of the less useful fields
2928339SEric.Schrock@Sun.COM  * removed.  When making changes, the consumer specifies which fields to apply
2938339SEric.Schrock@Sun.COM  * along with the structure the library takes care of the rest of the work.
2948339SEric.Schrock@Sun.COM  *
2958339SEric.Schrock@Sun.COM  * This can be expanded in the future as needed.
2968339SEric.Schrock@Sun.COM  */
2978339SEric.Schrock@Sun.COM 
2988339SEric.Schrock@Sun.COM typedef struct ipmi_lan_config {
2998339SEric.Schrock@Sun.COM 	boolean_t	ilc_set_in_progress;
3008339SEric.Schrock@Sun.COM 	uint32_t	ilc_ipaddr;
3018339SEric.Schrock@Sun.COM 	uint8_t		ilc_ipaddr_source;
3028339SEric.Schrock@Sun.COM 	uint8_t		ilc_macaddr[6];
3038339SEric.Schrock@Sun.COM 	uint32_t	ilc_subnet;
3048339SEric.Schrock@Sun.COM 	uint32_t	ilc_gateway_addr;
3058339SEric.Schrock@Sun.COM } ipmi_lan_config_t;
3068339SEric.Schrock@Sun.COM 
3078339SEric.Schrock@Sun.COM #define	IPMI_LAN_SRC_UNSPECIFIED	0x0
3088339SEric.Schrock@Sun.COM #define	IPMI_LAN_SRC_STATIC		0x1
3098339SEric.Schrock@Sun.COM #define	IPMI_LAN_SRC_DHCP		0x2
3108339SEric.Schrock@Sun.COM #define	IPMI_LAN_SRC_BIOS		0x3
3118339SEric.Schrock@Sun.COM #define	IPMI_LAN_SRC_OTHER		0x4
3128339SEric.Schrock@Sun.COM 
3138339SEric.Schrock@Sun.COM #define	IPMI_LAN_SET_IPADDR		0x01
3148339SEric.Schrock@Sun.COM #define	IPMI_LAN_SET_IPADDR_SOURCE	0x02
3158339SEric.Schrock@Sun.COM #define	IPMI_LAN_SET_MACADDR		0x04
3168339SEric.Schrock@Sun.COM #define	IPMI_LAN_SET_SUBNET		0x08
3178339SEric.Schrock@Sun.COM #define	IPMI_LAN_SET_GATEWAY_ADDR	0x10
3188339SEric.Schrock@Sun.COM 
3198339SEric.Schrock@Sun.COM #define	IPMI_CMD_SET_LAN_CONFIG		0x01
3208339SEric.Schrock@Sun.COM #define	IPMI_CMD_GET_LAN_CONFIG		0x02
3218339SEric.Schrock@Sun.COM 
3228339SEric.Schrock@Sun.COM extern int ipmi_lan_get_config(ipmi_handle_t *, int,
3238339SEric.Schrock@Sun.COM     ipmi_lan_config_t *);
3248339SEric.Schrock@Sun.COM extern int ipmi_lan_set_config(ipmi_handle_t *, int, ipmi_lan_config_t *, int);
3258339SEric.Schrock@Sun.COM 
3268339SEric.Schrock@Sun.COM /*
3276070Srobj  * SEL (System Event Log) commands.  Currently the library only provides
3286070Srobj  * commands for reading the SEL.
3296070Srobj  */
3306070Srobj 
3316070Srobj /*
3326070Srobj  * 31.2 Get SEL Info Command
3336070Srobj  */
3346070Srobj #define	IPMI_CMD_GET_SEL_INFO		0x40
3356070Srobj 
3366070Srobj typedef struct ipmi_sel_info {
3376070Srobj 	uint8_t		isel_version;
3386070Srobj 	uint16_t	isel_entries;
3396070Srobj 	uint16_t	isel_free;
3406070Srobj 	uint32_t	isel_add_ts;
3416070Srobj 	uint32_t	isel_erase_ts;
3426070Srobj 	DECL_BITFIELD6(
3436070Srobj 	    isel_supp_allocation	:1,
3446070Srobj 	    isel_supp_reserve		:1,
3456070Srobj 	    isel_supp_partial		:1,
3466070Srobj 	    isel_supp_delete		:1,
3476070Srobj 	    __reserved			:3,
3486070Srobj 	    isel_overflow		:1);
3496070Srobj } ipmi_sel_info_t;
3506070Srobj 
3516070Srobj extern ipmi_sel_info_t *ipmi_sel_get_info(ipmi_handle_t *);
3526070Srobj extern boolean_t ipmi_sdr_changed(ipmi_handle_t *);
3536070Srobj extern int ipmi_sdr_refresh(ipmi_handle_t *);
3546070Srobj 
3556070Srobj /*
3566070Srobj  * 32.1 SEL Event Records
3576070Srobj  */
3586070Srobj typedef struct ipmi_sel_event {
3596070Srobj 	uint16_t	isel_ev_next;
3606070Srobj 	uint16_t	isel_ev_recid;
3616070Srobj 	uint8_t		isel_ev_rectype;
3626070Srobj 	uint32_t	isel_ev_ts;
3636070Srobj 	DECL_BITFIELD2(
3646070Srobj 	    isel_ev_software	:1,
3656070Srobj 	    isel_ev_addr_or_id	:7);
3666070Srobj 	DECL_BITFIELD3(
3676070Srobj 	    isel_ev_lun		:2,
3686070Srobj 	    __reserved		:2,
3696070Srobj 	    isel_ev_channel	:4);
3706070Srobj 	uint8_t		isel_ev_rev;
3716070Srobj 	uint8_t		isel_ev_sensor_type;
3726070Srobj 	uint8_t		isel_ev_sensor_number;
3736070Srobj 	DECL_BITFIELD2(
3746070Srobj 	    isel_ev_type	:7,
3756070Srobj 	    isel_ev_dir		:1);
3766070Srobj 	uint8_t		isel_ev_data[3];
3776070Srobj } ipmi_sel_event_t;
3786070Srobj 
3796070Srobj #define	IPMI_EV_REV15		0x04
3806070Srobj #define	IPMI_EV_REV1		0x03
3816070Srobj 
3826070Srobj #define	IPMI_SEL_SYSTEM		0x02
3836070Srobj #define	IPMI_SEL_OEMTS_LO	0xC0
3846070Srobj #define	IPMI_SEL_OEMTS_HI	0xDF
3856070Srobj #define	IPMI_SEL_OEM_LO		0xE0
3866070Srobj #define	IPMI_SEL_OEM_HI		0xFF
3876070Srobj 
3886070Srobj #define	IPMI_EV_ASSERT		0x0
3896070Srobj #define	IPMI_EV_DEASSERT	0x1
3906070Srobj 
3916070Srobj /*
3926070Srobj  * 32.2 OEM SEL Record (with timestamp)
3936070Srobj  */
3946070Srobj typedef struct ipmi_sel_oem_ts {
3956070Srobj 	uint16_t	isel_oem_next;
3966070Srobj 	uint16_t	isel_oem_id;
3976070Srobj 	uint8_t		isel_oem_type;
3986070Srobj 	uint32_t	isel_oem_ts;
3996070Srobj 	uint8_t		isel_oem_devid[3];
4006070Srobj 	uint8_t		isel_oem_data[6];
4016070Srobj } ipmi_sel_oem_ts_t;
4026070Srobj 
4036070Srobj /*
4046070Srobj  * 32.3 OEM SEL Record (no timestamp)
4056070Srobj  */
4066070Srobj typedef struct ipmi_sel_oem {
4076070Srobj 	uint16_t	isel_oem_next;
4086070Srobj 	uint16_t	isel_oem_id;
4096070Srobj 	uint8_t		isel_oem_type;
4106070Srobj 	uint8_t		isel_oem_data[13];
4116070Srobj } ipmi_sel_oem_t;
4126070Srobj 
4136070Srobj /*
4148339SEric.Schrock@Sun.COM  * 29.3 Platform Event Message Command.
4158339SEric.Schrock@Sun.COM  */
4168339SEric.Schrock@Sun.COM typedef struct ipmi_platform_event_message {
4178339SEric.Schrock@Sun.COM 	uint8_t		ipem_generator;
4188339SEric.Schrock@Sun.COM 	uint8_t		ipem_rev;
4198339SEric.Schrock@Sun.COM 	uint8_t		ipem_sensor_type;
4208339SEric.Schrock@Sun.COM 	uint8_t		ipem_sensor_num;
4218339SEric.Schrock@Sun.COM 	DECL_BITFIELD2(
4228339SEric.Schrock@Sun.COM 	    ipem_event_type	:7,
4238339SEric.Schrock@Sun.COM 	    ipem_event_dir	:1);
4248339SEric.Schrock@Sun.COM 	uint8_t		ipem_event_data[3];
4258339SEric.Schrock@Sun.COM } ipmi_platform_event_message_t;
4268339SEric.Schrock@Sun.COM 
4278339SEric.Schrock@Sun.COM #define	IPMI_CMD_PLATFORM_EVENT_MESSAGE	0x02
4288339SEric.Schrock@Sun.COM 
4298339SEric.Schrock@Sun.COM extern int ipmi_event_platform_message(ipmi_handle_t *,
4308339SEric.Schrock@Sun.COM     ipmi_platform_event_message_t *);
4318339SEric.Schrock@Sun.COM 
4328339SEric.Schrock@Sun.COM /*
4336070Srobj  * 29.7 Event Data Field Formats.  Consumers can cast the data field of the
4346070Srobj  * event record to the appropriate type depending on the sensor class.
4356070Srobj  */
4366070Srobj 
4376070Srobj typedef struct ipmi_event_threshold {
4386070Srobj 	DECL_BITFIELD3(
4396070Srobj 	    iev_offset		:4,
4406070Srobj 	    iev_desc_byte3	:2,
4416070Srobj 	    iev_desc_byte2	:2);
4426070Srobj 	uint8_t		iev_reading;
4436070Srobj 	uint8_t		iev_threshold;
4446070Srobj } ipmi_event_threshold_t;
4456070Srobj 
4466070Srobj #define	IPMI_EV_DESC_UNSPECIFIED	0x00
4476070Srobj #define	IPMI_EV_DESC_TRIGGER		0x01
4486070Srobj #define	IPMI_EV_DESC_OEM		0x02
4496070Srobj #define	IPMI_EV_DESC_SPECIFIC		0x03
4506070Srobj 
4516070Srobj typedef struct ipmi_event_discrete {
4526070Srobj 	DECL_BITFIELD3(
4536070Srobj 	    iev_offset		:4,
4546070Srobj 	    iev_desc_byte3	:2,
4556070Srobj 	    iev_desc_byte2	:2);
4566070Srobj 	DECL_BITFIELD2(
4576070Srobj 	    iev_offset_type	:4,
4586070Srobj 	    iev_offset_severity	:4);
4596070Srobj 	uint8_t		iev_oem_code;
4606070Srobj } ipmi_event_discrete_t;
4616070Srobj 
4626070Srobj #define	IPMI_EV_DESC_PREVSTATE		0x01
4636070Srobj #define	IPMI_EV_DESC_SPECIFIC		0x03
4646070Srobj 
4656070Srobj typedef struct ipmi_event_oem {
4666070Srobj 	DECL_BITFIELD3(
4676070Srobj 	    iev_offset		:4,
4686070Srobj 	    iev_desc_byte3	:2,
4696070Srobj 	    iev_desc_byte2	:2);
4706070Srobj 	DECL_BITFIELD2(
4716070Srobj 	    iev_offset_type	:4,
4726070Srobj 	    iev_offset_severity	:4);
4736070Srobj 	uint8_t		iev_oem_code;
4746070Srobj } ipmi_event_oem_t;
4756070Srobj 
4766070Srobj /*
4776070Srobj  * Get SEL Entry Command.  See section 31.5.  We don't support partial reads, so
4786070Srobj  * this interface is quite a bit simpler than in the spec.  We default to
4796070Srobj  * returning event records, though the consumer should check the type field and
4806070Srobj  * cast it to the appropriate type if it is no IPMI_SEL_SYSTEM.
4816070Srobj  */
4826070Srobj #define	IPMI_CMD_GET_SEL_ENTRY		0x43
4836070Srobj 
4846070Srobj extern ipmi_sel_event_t *ipmi_sel_get_entry(ipmi_handle_t *, uint16_t);
4856070Srobj 
4866070Srobj #define	IPMI_SEL_FIRST_ENTRY		0x0000
4876070Srobj #define	IPMI_SEL_LAST_ENTRY		0xFFFF
4886070Srobj 
4896070Srobj /*
4906070Srobj  * SEL time management.  See sections 31.10 and 31.11.
4916070Srobj  */
4926070Srobj #define	IPMI_CMD_GET_SEL_TIME		0x48
4936070Srobj #define	IPMI_CMD_SET_SEL_TIME		0x49
4946070Srobj #define	IPMI_CMD_GET_SEL_UTC_OFFSET	0x5C
4956070Srobj #define	IPMI_CMD_SET_SEL_UTC_OFFSET	0x5D
4966070Srobj 
4976070Srobj extern int ipmi_sel_get_time(ipmi_handle_t *, uint32_t *);
4986070Srobj extern int ipmi_sel_set_time(ipmi_handle_t *, uint32_t);
4996070Srobj extern int ipmi_sel_get_utc_offset(ipmi_handle_t *, int *);
5006070Srobj extern int ipmi_sel_set_utc_offset(ipmi_handle_t *, int);
5016070Srobj 
5023798Seschrock /*
5033798Seschrock  * SDR (Sensor Device Record) requests.  A cache of the current SDR repository
5046070Srobj  * is kept as part of the IPMI handle and updated when necessary.  This does the
5056070Srobj  * work of processing the SDR names and providing an easy way to lookup
5066070Srobj  * individual records and iterate over all records.
5076070Srobj  */
5086070Srobj 
5096070Srobj /*
5106070Srobj  * Get SDR Repository Info Command.  See section 33.9.
5113798Seschrock  */
5126070Srobj #define	IPMI_CMD_GET_SDR_INFO		0x20
5136070Srobj 
5146070Srobj typedef struct ipmi_sdr_info {
5156070Srobj 	uint8_t		isi_version;
5166070Srobj 	uint16_t	isi_record_count;
5176070Srobj 	uint16_t	isi_free_space;
5186070Srobj 	uint32_t	isi_add_ts;
5196070Srobj 	uint32_t	isi_erase_ts;
5206070Srobj 	DECL_BITFIELD7(
5216070Srobj 	    isi_supp_allocation		:1,
5226070Srobj 	    isi_supp_reserve		:1,
5236070Srobj 	    isi_supp_partial		:1,
5246070Srobj 	    isi_supp_delete		:1,
5256070Srobj 	    __reserved			:1,
5266070Srobj 	    isi_modal			:2,
5276070Srobj 	    isi_overflow		:1);
5286070Srobj } ipmi_sdr_info_t;
5296070Srobj 
5306070Srobj extern ipmi_sdr_info_t *ipmi_sdr_get_info(ipmi_handle_t *);
5313798Seschrock 
5323798Seschrock /*
5333798Seschrock  * Reserve repository command.  See section 33.11.
5343798Seschrock  */
5353798Seschrock #define	IPMI_CMD_RESERVE_SDR_REPOSITORY	0x22
5363798Seschrock 
5373798Seschrock /*
5383798Seschrock  * Get SDR command.  See section 33.12.  This command accesses the raw SDR
5393798Seschrock  * repository.  Clients can also use the lookup functions to retrieve a
5403798Seschrock  * particular SDR record by name.
5413798Seschrock  *
5423798Seschrock  * The list of possible types is indicated in the sub-chapters of section 43.
5433798Seschrock  */
5443798Seschrock typedef struct ipmi_sdr {
5453798Seschrock 	uint16_t	is_id;
5463798Seschrock 	uint8_t		is_version;
5473798Seschrock 	uint8_t		is_type;
5483798Seschrock 	uint8_t		is_length;
5493798Seschrock 	uint8_t		is_record[1];
5503798Seschrock } ipmi_sdr_t;
5513798Seschrock #define	IPMI_CMD_GET_SDR		0x23
5523798Seschrock 
5533798Seschrock #define	IPMI_SDR_FIRST			0x0000
5543798Seschrock #define	IPMI_SDR_LAST			0xFFFF
5553798Seschrock 
5563798Seschrock extern ipmi_sdr_t *ipmi_sdr_get(ipmi_handle_t *, uint16_t, uint16_t *);
5573798Seschrock 
5583798Seschrock /*
5596070Srobj  * Full Sensor Record.  See 43.1
5606070Srobj  */
5616070Srobj #define	IPMI_SDR_TYPE_FULL_SENSOR		0x01
5626070Srobj 
5636070Srobj typedef struct ipmi_sdr_full_sensor {
5646070Srobj 	/* RECORD KEY BYTES */
5656070Srobj 	uint8_t		is_fs_owner;
5666070Srobj 	DECL_BITFIELD3(
5676070Srobj 	    is_fs_sensor_lun			:2,
5686070Srobj 	    __reserved1				:2,
5696070Srobj 	    is_fs_channel			:4);
5706070Srobj 	uint8_t		is_fs_number;
5716070Srobj 	/* RECORD BODY BYTES */
5726070Srobj 	uint8_t		is_fs_entity_id;
5736070Srobj 	DECL_BITFIELD2(
5746070Srobj 	    is_fs_entity_instance		:7,
5756070Srobj 	    is_fs_entity_logical		:1);
5766070Srobj 	DECL_BITFIELD8(
5776070Srobj 	    is_fs_sensor_scanning_enabled	:1,
5786070Srobj 	    is_fs_event_generation_enabled	:1,
5796070Srobj 	    is_fs_init_sensor_type		:1,
5806070Srobj 	    is_fs_init_hysteresis		:1,
5816070Srobj 	    is_fs_init_thresholds		:1,
5826070Srobj 	    is_fs_init_events			:1,
5836070Srobj 	    is_fs_init_scanning			:1,
5846070Srobj 	    is_fs_settable			:1);
5856070Srobj 	DECL_BITFIELD5(
5866070Srobj 	    is_fs_event_support			:2,
5876070Srobj 	    is_fs_threshold_support		:2,
5886070Srobj 	    is_fs_hysteresis_support		:2,
5896070Srobj 	    is_fs_rearm_support			:1,
5906070Srobj 	    is_fs_ignore			:1);
5916070Srobj 	uint8_t		is_fs_type;
5926070Srobj 	uint8_t		is_fs_reading_type;
5936070Srobj 	uint16_t	is_fs_assert_mask;
5946070Srobj 	uint16_t	is_fs_deassert_mask;
5956070Srobj 	uint16_t	is_fs_reading_mask;
5966070Srobj 	DECL_BITFIELD4(
5976070Srobj 	    is_fs_units_isprcnt			:1,
5986070Srobj 	    is_fs_mod_unit			:2,
5996070Srobj 	    is_fs_rate_unit			:3,
6006070Srobj 	    is_fs_analog_fmt			:2);
6016070Srobj 	uint8_t		is_fs_unit2;
6026070Srobj 	uint8_t		is_fs_unit3;
6036070Srobj 	/* Linearization */
6046070Srobj 	DECL_BITFIELD2(
6056070Srobj 	    is_fs_sensor_linear_type		:7,
6066070Srobj 	    __reserved2				:1);
6076070Srobj 	/* M, Tolerance */
6086070Srobj 	uint16_t	is_fs_mtol;
6096070Srobj 	/* B, Accuracy, R exp, B exp */
6106070Srobj 	uint32_t	is_fs_bacc;
6116070Srobj 	DECL_BITFIELD4(
6126070Srobj 	    is_fs_nominal_reading_spec		:1,
6136070Srobj 	    is_fs_normal_max_spec		:1,
6146070Srobj 	    is_fs_normal_min_spec		:1,
6156070Srobj 	    __reserved3				:5);
6166070Srobj 	uint8_t	is_fs_nominal_reading;
6176070Srobj 	uint8_t	is_fs_normal_maximum;
6186070Srobj 	uint8_t	is_fs_normal_minimum;
6196070Srobj 	uint8_t	is_fs_max;
6206070Srobj 	uint8_t	is_fs_min;
6216070Srobj 	uint8_t is_fs_upper_nonrecov;
6226070Srobj 	uint8_t	is_fs_upper_critical;
6236070Srobj 	uint8_t	is_fs_upper_noncrit;
6246070Srobj 	uint8_t	is_fs_lower_nonrecov;
6256070Srobj 	uint8_t	is_fs_lower_critical;
6266070Srobj 	uint8_t	is_fs_lower_noncrit;
6276070Srobj 	uint8_t		is_fs_hysteresis_positive;
6286070Srobj 	uint8_t		is_fs_hysteresis_negative;
6296070Srobj 	uint16_t	__reserved4;
6306070Srobj 	uint8_t		is_fs_oem;
6316070Srobj 	DECL_BITFIELD3(
6326070Srobj 	    is_fs_idlen				:5,
6336070Srobj 	    __reserved5				:1,
6346070Srobj 	    is_fs_idtype			:2);
6356070Srobj 	char		is_fs_idstring[1];
6366070Srobj } ipmi_sdr_full_sensor_t;
6376070Srobj 
6386070Srobj #define	IPMI_SDR_TYPE_COMPACT_SENSOR		0x02
6396070Srobj 
6406070Srobj /*
6416070Srobj  * Compact Sensor Record.  See section 43.2
6426070Srobj  */
6436070Srobj typedef struct ipmi_sdr_compact_sensor {
6446070Srobj 	/* RECORD KEY BYTES */
6456070Srobj 	uint8_t		is_cs_owner;
6466070Srobj 	DECL_BITFIELD3(
6476070Srobj 	    is_cs_sensor_lun			:2,
6486070Srobj 	    is_cs_fru_lun			:2,
6496070Srobj 	    is_cs_channel			:4);
6506070Srobj 	uint8_t		is_cs_number;
6516070Srobj 	/* RECORD BODY BYTES */
6526070Srobj 	uint8_t		is_cs_entity_id;
6536070Srobj 	DECL_BITFIELD2(
6546070Srobj 	    is_cs_entity_instance		:7,
6556070Srobj 	    is_cs_entity_logical		:1);
6566070Srobj 	DECL_BITFIELD8(
6576070Srobj 	    is_cs_sensor_scanning_enabled	:1,
6586070Srobj 	    is_cs_event_generation_enabled	:1,
6596070Srobj 	    is_cs_init_sensor_type		:1,
6606070Srobj 	    is_cs_init_hysteresis		:1,
6616070Srobj 	    __reserved1				:1,
6626070Srobj 	    is_cs_init_events			:1,
6636070Srobj 	    is_cs_init_scanning			:1,
6646070Srobj 	    is_cs_settable			:1);
6656070Srobj 	DECL_BITFIELD5(
6666070Srobj 	    is_cs_event_support			:2,
6676070Srobj 	    is_cs_threshold_support		:2,
6686070Srobj 	    is_cs_hysteresis_support		:2,
6696070Srobj 	    is_cs_rearm_support			:1,
6706070Srobj 	    is_cs_ignore			:1);
6716070Srobj 	uint8_t		is_cs_type;
6726070Srobj 	uint8_t		is_cs_reading_type;
6736070Srobj 	uint16_t	is_cs_assert_mask;
6746070Srobj 	uint16_t	is_cs_deassert_mask;
6756070Srobj 	uint16_t	is_cs_reading_mask;
6766070Srobj 	DECL_BITFIELD4(
6776070Srobj 	    is_cs_units_isprcnt			:1,
6786070Srobj 	    is_cs_mod_unit			:2,
6796070Srobj 	    is_cs_rate_unit			:3,
6806070Srobj 	    __reserved2				:2);
6816070Srobj 	uint8_t		is_cs_unit2;
6826070Srobj 	uint8_t		is_cs_unit3;
6836070Srobj 	DECL_BITFIELD3(
6846070Srobj 	    is_cs_share_count			:4,
6856070Srobj 	    is_cs_modifier_type			:2,
6866070Srobj 	    is_cs_direction			:2);
6876070Srobj 	DECL_BITFIELD2(
6886070Srobj 	    is_cs_modifier_offset		:7,
6896070Srobj 	    is_cs_sharing			:1);
6906070Srobj 	uint8_t		is_cs_hysteresis_positive;
6916070Srobj 	uint8_t		is_cs_hysteresis_negative;
6926070Srobj 	uint16_t	__reserved3;
6936070Srobj 	uint8_t		__reserved4;
6946070Srobj 	uint8_t		is_cs_oem;
6956070Srobj 	DECL_BITFIELD3(
6966070Srobj 	    is_cs_idlen				:5,
6976070Srobj 	    __reserved5				:1,
6986070Srobj 	    is_cs_idtype			:2);
6996070Srobj 	char		is_cs_idstring[1];
7006070Srobj } ipmi_sdr_compact_sensor_t;
7016070Srobj 
7026070Srobj /*
7036070Srobj  * Threshold sensor masks for is_cs_assert_mask and is_cs_deassert_mask.
7046070Srobj  */
7056070Srobj #define	IPMI_SENSOR_RETURN_NONRECOV	0x4000
7066070Srobj #define	IPMI_SENSOR_RETURN_CRIT		0x2000
7076070Srobj #define	IPMI_SENSOR_RETURN_NONCRIT	0x1000
7086070Srobj 
7096070Srobj #define	IPMI_SENSOR_MASK_UPPER_NONRECOV_HI	0x0800
7106070Srobj #define	IPMI_SENSOR_MASK_UPPER_NONRECOV_LO	0x0400
7116070Srobj #define	IPMI_SENSOR_MASK_UPPER_CRIT_HI		0x0200
7126070Srobj #define	IPMI_SENSOR_MASK_UPPER_CRIT_LO		0x0100
7136070Srobj #define	IPMI_SENSOR_MASK_UPPER_NONCRIT_HI	0x0080
7146070Srobj #define	IPMI_SENSOR_MASK_UPPER_NONCRIT_LO	0x0040
7156070Srobj #define	IPMI_SENSOR_MASK_LOWER_NONRECOV_HI	0x0020
7166070Srobj #define	IPMI_SENSOR_MASK_LOWER_NONRECOV_LO	0x0010
7176070Srobj #define	IPMI_SENSOR_MASK_LOWER_CRIT_HI		0x0008
7186070Srobj #define	IPMI_SENSOR_MASK_LOWER_CRIT_LO		0x0004
7196070Srobj #define	IPMI_SENSOR_MASK_LOWER_NONCRIT_HI	0x0002
7206070Srobj #define	IPMI_SENSOR_MASK_LOWER_NONCRIT_LO	0x0001
7216070Srobj 
7226070Srobj /*
7236070Srobj  * Threshold sensor masks for is_cs_reading_mask.
7246070Srobj  */
7256070Srobj #define	IPMI_SENSOR_SETTABLE_UPPER_NONRECOV	0x2000
7266070Srobj #define	IPMI_SENSOR_SETTABLE_UPPER_CRIT		0x1000
7276070Srobj #define	IPMI_SENSOR_SETTABLE_UPPER_NONCRIT	0x0800
7286070Srobj #define	IPMI_SENSOR_SETTABLE_LOWER_NONRECOV	0x0400
7296070Srobj #define	IPMI_SENSOR_SETTABLE_LOWER_CRIT		0x0200
7306070Srobj #define	IPMI_SENSOR_SETTABLE_LOWER_NONCRIT	0x0100
7316070Srobj #define	IPMI_SENSOR_READABLE_UPPER_NONRECOV	0x0020
7326070Srobj #define	IPMI_SENSOR_READABLE_UPPER_CRIT		0x0010
7336070Srobj #define	IPMI_SENSOR_READABLE_UPPER_NONCRIT	0x0008
7346070Srobj #define	IPMI_SENSOR_READABLE_LOWER_NONRECOV	0x0004
7356070Srobj #define	IPMI_SENSOR_READABLE_LOWER_CRIT		0x0002
7366070Srobj #define	IPMI_SENSOR_READABLE_LOWER_NONCRIT	0x0001
7376070Srobj 
7386070Srobj /*
7396070Srobj  * Values for is_cs_reading_type.  See table 42-2.
7406070Srobj  */
7416070Srobj #define	IPMI_RT_THRESHOLD			0x01
7426070Srobj #define	IPMI_RT_USAGE				0x02
7436070Srobj #define	IPMI_RT_STATE				0x03
7446070Srobj #define	IPMI_RT_PREDFAIL			0x04
7456070Srobj #define	IPMI_RT_LIMIT				0x05
7466070Srobj #define	IPMI_RT_PERFORMANCE			0x06
7476070Srobj #define	IPMI_RT_SEVERITY			0x07
7486070Srobj #define	IPMI_RT_PRESENT				0x08
7496070Srobj #define	IPMI_RT_ENABLED				0x09
7506070Srobj #define	IPMI_RT_AVAILABILITY			0x0A
7516070Srobj #define	IPMI_RT_REDUNDANCY			0x0B
7526070Srobj #define	IPMI_RT_ACPI				0x0C
7536070Srobj #define	IPMI_RT_SPECIFIC			0x6F
7546070Srobj 
7556070Srobj /*
7566070Srobj  * Bitmasks based on above reading types.  See table 42-2
7576070Srobj  */
7586070Srobj #define	IPMI_SR_THRESHOLD_LOWER_NONCRIT_LOW	0x0001
7596070Srobj #define	IPMI_SR_THRESHOLD_LOWER_NONCRIT_HIGH	0x0002
7606070Srobj #define	IPMI_SR_THRESHOLD_LOWER_CRIT_LOW	0x0004
7616070Srobj #define	IPMI_SR_THRESHOLD_LOWER_CRIT_HIGH	0x0008
7626070Srobj #define	IPMI_SR_THRESHOLD_LOWER_NONRECOV_LOW	0x0010
7636070Srobj #define	IPMI_SR_THRESHOLD_LOWER_NONRECOV_HIGH	0x0020
7646070Srobj #define	IPMI_SR_THRESHOLD_UPPER_NONCRIT_LOW	0x0040
7656070Srobj #define	IPMI_SR_THRESHOLD_UPPER_NONCRIT_HIGH	0x0080
7666070Srobj #define	IPMI_SR_THRESHOLD_UPPER_CRIT_LOW	0x0100
7676070Srobj #define	IPMI_SR_THRESHOLD_UPPER_CRIT_HIGH	0x0200
7686070Srobj #define	IPMI_SR_THRESHOLD_UPPER_NONRECOV_LOW	0x0400
7696070Srobj #define	IPMI_SR_THRESHOLD_UPPER_NONRECOV_HIGH	0x0800
7706070Srobj 
7716070Srobj #define	IPMI_SR_USAGE_IDLE			0x0001
7726070Srobj #define	IPMI_SR_USAGE_ACTIVE			0x0002
7736070Srobj #define	IPMI_SR_USAGE_BUSY			0x0004
7746070Srobj 
7756070Srobj #define	IPMI_SR_STATE_DEASSERT			0x0001
7766070Srobj #define	IPMI_SR_STATE_ASSERT			0x0002
7776070Srobj 
7786070Srobj #define	IPMI_SR_PREDFAIL_DEASSERT		0x0001
7796070Srobj #define	IPMI_SR_PREDFAIL_ASSERT			0x0002
7806070Srobj 
7816070Srobj #define	IPMI_SR_LIMIT_NOTEXCEEDED		0x0001
7826070Srobj #define	IPMI_SR_LIMIT_EXCEEDED			0x0002
7836070Srobj 
7846070Srobj #define	IPMI_SR_PERFORMANCE_MET			0x0001
7856070Srobj #define	IPMI_SR_PERFORMANCE_LAGS		0x0002
7866070Srobj 
7876070Srobj #define	IPMI_SR_SEVERITY_TO_OK			0x0001
7886070Srobj #define	IPMI_SR_SEVERITY_OK_TO_NONCRIT		0x0002
7896070Srobj #define	IPMI_SR_SEVERITY_LESS_TO_CRIT		0x0004
7906070Srobj #define	IPMI_SR_SEVERITY_LESS_TO_NONRECOV	0x0008
7916070Srobj #define	IPMI_SR_SEVERITY_MORE_TO_NONCRIT	0x0010
7926070Srobj #define	IPMI_SR_SEVERITY_NONRECOV_TO_CRIT	0x0020
7936070Srobj #define	IPMI_SR_SEVERITY_TO_NONRECOV		0x0040
7946070Srobj #define	IPMI_SR_SEVERITY_MONITOR		0x0080
7956070Srobj #define	IPMI_SR_SEVERITY_INFO			0x0100
7966070Srobj 
7976070Srobj #define	IPMI_SR_PRESENT_DEASSERT		0x0001
7986070Srobj #define	IPMI_SR_PRESENT_ASSERT			0x0002
7996070Srobj 
8006070Srobj #define	IPMI_SR_ENABLED_DEASSERT		0x0001
8016070Srobj #define	IPMI_SR_ENABLED_ASSERT			0x0002
8026070Srobj 
8036070Srobj #define	IPMI_SR_AVAILABILITY_RUNNING		0x0001
8046070Srobj #define	IPMI_SR_AVAILABILITY_INTEST		0x0002
8056070Srobj #define	IPMI_SR_AVAILABILITY_POWEROFF		0x0004
8066070Srobj #define	IPMI_SR_AVAILABILITY_ONLINE		0x0008
8076070Srobj #define	IPMI_SR_AVAILABILITY_OFFLINE		0x0010
8086070Srobj #define	IPMI_SR_AVAILABILITY_OFFDUTY		0x0020
8096070Srobj #define	IPMI_SR_AVAILABILITY_DEGRADED		0x0040
8106070Srobj #define	IPMI_SR_AVAILABILITY_POWERSAVE		0x0080
8116070Srobj #define	IPMI_SR_AVAILABILITY_INSTALLERR		0x0100
8126070Srobj 
8136070Srobj #define	IPMI_SR_REDUNDANCY_FULL			0x0001
8146070Srobj #define	IPMI_SR_REDUNDANCY_LOST			0x0002
8156070Srobj #define	IPMI_SR_REDUNDANCY_DEGRADED		0x0004
8166070Srobj #define	IPMI_SR_REDUNDANCY_NONE_MINIMAL		0x0008
8176070Srobj #define	IPMI_SR_REDUNDANCY_NONE_REGAINED	0x0010
8186070Srobj #define	IPMI_SR_REDUNDANCY_NONE_INSUFFFICIENT	0x0020
8196070Srobj #define	IPMI_SR_REDUNDANCY_DEG_FROM_FULL	0x0040
8206070Srobj #define	IPMI_SR_REDUNDANCY_DEG_FROM_NON		0x0080
8216070Srobj 
8226070Srobj #define	IPMI_SR_ACPI_DO				0x0001
8236070Srobj #define	IPMI_SR_ACPI_D1				0x0002
8246070Srobj #define	IPMI_SR_ACPI_D2				0x0004
8256070Srobj #define	IPMI_SR_ACPI_D3				0x0008
8266070Srobj 
8276070Srobj /*
8286070Srobj  * Bitmasks for sensor-specific reading type (0x6F).  See section 42.2.
8296070Srobj  */
8306070Srobj #define	IPMI_ST_RESERVED			0x00
8316070Srobj #define	IPMI_ST_TEMP				0x01
8326070Srobj #define	IPMI_ST_VOLTAGE				0x02
8336070Srobj #define	IPMI_ST_CURRENT				0x03
8346070Srobj #define	IPMI_ST_FAN				0x04
8356070Srobj #define	IPMI_ST_PHYSICAL			0x05
8366070Srobj 
8376070Srobj #define	IPMI_EV_PHYSICAL_GENERAL		0x0001
8386070Srobj #define	IPMI_EV_PHYSICAL_BAY			0x0002
8396070Srobj #define	IPMI_EV_PHYSICAL_CARD			0x0004
8406070Srobj #define	IPMI_EV_PHYSICAL_PROCESSOR		0x0008
8416070Srobj #define	IPMI_EV_PHYSICAL_LAN			0x0010
8426070Srobj #define	IPMI_EV_PHYSICAL_DOCK			0x0020
8436070Srobj #define	IPMI_EV_PHYSICAL_FAN			0x0040
8446070Srobj 
8456070Srobj #define	IPMI_ST_PLATFORM			0x06
8466070Srobj 
8476070Srobj #define	IPMI_EV_PLATFORM_SECURE			0x0001
8486070Srobj #define	IPMI_EV_PLATFORM_USER_PASS		0x0002
8496070Srobj #define	IPMI_EV_PLATFORM_SETUP_PASS		0x0004
8506070Srobj #define	IPMI_EV_PLATFORM_NETWORK_PASS		0x0008
8516070Srobj #define	IPMI_EV_PLATFORM_OTHER_PASS		0x0010
8526070Srobj #define	IPMI_EV_PLATFORM_OUT_OF_BAND		0x0020
8536070Srobj 
8546070Srobj #define	IPMI_ST_PROCESSOR			0x07
8556070Srobj 
8566070Srobj #define	IPMI_EV_PROCESSOR_IERR			0x0001
8576070Srobj #define	IPMI_EV_PROCESSOR_THERMAL		0x0002
8586070Srobj #define	IPMI_EV_PROCESSOR_FRB1			0x0004
8596070Srobj #define	IPMI_EV_PROCESSOR_FRB2			0x0008
8606070Srobj #define	IPMI_EV_PROCESSOR_FRB3			0x0010
8616070Srobj #define	IPMI_EV_PROCESSOR_CONFIG		0x0020
8626070Srobj #define	IPMI_EV_PROCESSOR_SMBIOS		0x0040
8636070Srobj #define	IPMI_EV_PROCESSOR_PRESENT		0x0080
8646070Srobj #define	IPMI_EV_PROCESSOR_DISABLED		0x0100
8656070Srobj #define	IPMI_EV_PROCESSOR_TERMINATOR		0x0200
8666070Srobj #define	IPMI_EV_PROCESSOR_THROTTLED		0x0400
8676070Srobj 
8686070Srobj #define	IPMI_ST_POWER_SUPPLY			0x08
8696070Srobj 
8706070Srobj #define	IPMI_EV_POWER_SUPPLY_PRESENT		0x0001
8716070Srobj #define	IPMI_EV_POWER_SUPPLY_FAILURE		0x0002
8726070Srobj #define	IPMI_EV_POWER_SUPPLY_PREDFAIL		0x0004
8736070Srobj #define	IPMI_EV_POWER_SUPPLY_INPUT_LOST		0x0008
8746070Srobj #define	IPMI_EV_POWER_SUPPLY_INPUT_RANGE	0x0010
8756070Srobj #define	IPMI_EV_POWER_SUPPLY_INPUT_RANGE_PRES	0x0020
8766070Srobj #define	IPMI_EV_POWER_SUPPLY_CONFIG_ERR		0x0040
8776070Srobj 
8786070Srobj #define	IPMI_ST_POWER_UNIT			0x09
8796070Srobj 
8806070Srobj #define	IPMI_EV_POWER_UNIT_OFF			0x0001
8816070Srobj #define	IPMI_EV_POWER_UNIT_CYCLE		0x0002
8826070Srobj #define	IPMI_EV_POWER_UNIT_240_DOWN		0x0004
8836070Srobj #define	IPMI_EV_POWER_UNIT_INTERLOCK_DOWN	0x0008
8846070Srobj #define	IPMI_EV_POWER_UNIT_AC_LOST		0x0010
8856070Srobj #define	IPMI_EV_POWER_UNIT_SOFT_FAILURE		0x0020
8866070Srobj #define	IPMI_EV_POWER_UNIT_FAIL			0x0040
8876070Srobj #define	IPMI_EV_POWER_UNIT_PREDFAIL		0x0080
8886070Srobj 
8896070Srobj #define	IPMI_ST_COOLING				0x0A
8906070Srobj #define	IPMI_ST_OTHER				0x0B
8916070Srobj #define	IPMI_ST_MEMORY				0x0C
8926070Srobj 
8936070Srobj #define	IPMI_EV_MEMORY_CE			0x0001
8946070Srobj #define	IPMI_EV_MEMORY_UE			0x0002
8956070Srobj #define	IPMI_EV_MEMORY_PARITY			0x0004
8966070Srobj #define	IPMI_EV_MEMORY_SCRUB_FAIL		0x0008
8976070Srobj #define	IPMI_EV_MEMORY_DISABLED			0x0010
8986070Srobj #define	IPMI_EV_MEMORY_CE_LOG_LIMIT		0x0020
8996070Srobj #define	IPMI_EV_MEMORY_PRESENT			0x0040
9006070Srobj #define	IPMI_EV_MEMORY_CONFIG_ERR		0x0080
9016070Srobj #define	IPMI_EV_MEMORY_SPARE			0x0100
9026070Srobj #define	IPMI_EV_MEMORY_THROTTLED		0x0200
9036070Srobj #define	IPMI_EV_MEMORY_OVERTEMP			0x0400
9046070Srobj 
9056070Srobj #define	IPMI_ST_BAY				0x0D
9066070Srobj 
9076070Srobj #define	IPMI_EV_BAY_PRESENT			0x0001
9086070Srobj #define	IPMI_EV_BAY_FAULT			0x0002
9096070Srobj #define	IPMI_EV_BAY_PREDFAIL			0x0004
9106070Srobj #define	IPMI_EV_BAY_SPARE			0x0008
9116070Srobj #define	IPMI_EV_BAY_CHECK			0x0010
9126070Srobj #define	IPMI_EV_BAY_CRITICAL			0x0020
9136070Srobj #define	IPMI_EV_BAY_FAILED			0x0040
9146070Srobj #define	IPMI_EV_BAY_REBUILDING			0x0080
9156070Srobj #define	IPMI_EV_BAY_ABORTED			0x0100
9166070Srobj 
9176070Srobj #define	IPMI_ST_POST_RESIZE			0x0E
9186070Srobj #define	IPMI_ST_FIRMWARE			0x0F
9196070Srobj 
9206070Srobj #define	IPMI_EV_FIRMWARE_ERROR			0x0001
9216070Srobj #define	IPMI_EV_FIRMWARE_HANG			0x0002
9226070Srobj #define	IPMI_EV_FIRMWARE_PROGRESS		0x0004
9236070Srobj 
9246070Srobj #define	IPMI_ST_EVENT_LOG			0x10
9256070Srobj 
9266070Srobj #define	IPMI_EV_EVENT_LOG_CE			0x0001
9276070Srobj #define	IPMI_EV_EVENT_LOG_TYPE			0x0002
9286070Srobj #define	IPMI_EV_EVENT_LOG_RESET			0x0004
9296070Srobj #define	IPMI_EV_EVENT_LOG_ALL			0x0008
9306070Srobj #define	IPMI_EV_EVENT_LOG_FULL			0x0010
9316070Srobj #define	IPMI_EV_EVENT_LOG_ALMOST_FULL		0x0020
9326070Srobj 
9336070Srobj #define	IPMI_ST_WATCHDOG1			0x11
9346070Srobj 
9356070Srobj #define	IPMI_EV_WATCHDOG_BIOS_RESET		0x0001
9366070Srobj #define	IPMI_EV_WATCHDOG_OS_RESET		0x0002
9376070Srobj #define	IPMI_EV_WATCHDOG_OS_SHUTDOWN		0x0004
9386070Srobj #define	IPMI_EV_WATCHDOG_OS_PWR_DOWN		0x0008
9396070Srobj #define	IPMI_EV_WATCHDOG_OS_PWR_CYCLE		0x0010
9406070Srobj #define	IPMI_EV_WATCHDOG_OS_NMI_DIAG		0x0020
9416070Srobj #define	IPMI_EV_WATCHDOG_EXPIRED		0x0040
9426070Srobj #define	IPMI_EV_WATCHDOG_PRE_TIMEOUT_INT	0x0080
9436070Srobj 
9446070Srobj #define	IPMI_ST_SYSTEM				0x12
9456070Srobj 
9466070Srobj #define	IPMI_EV_STSTEM_RECONF			0x0001
9476070Srobj #define	IPMI_EV_STSTEM_BOOT			0x0002
9486070Srobj #define	IPMI_EV_STSTEM_UNKNOWN_HW_FAILURE	0x0004
9496070Srobj #define	IPMI_EV_STSTEM_AUX_LOG_UPDATED		0x0008
9506070Srobj #define	IPMI_EV_STSTEM_PEF_ACTION		0x0010
9516070Srobj #define	IPMI_EV_SYSTEM_TIMETAMP_CLOCKSYNC	0x0020
9526070Srobj 
9536070Srobj #define	IPMI_ST_CRITICAL			0x13
9546070Srobj 
9556070Srobj #define	IPMI_EV_CRITICAL_EXT_NMI		0x0001
9566070Srobj #define	IPMI_EV_CRITICAL_BUS_TIMOEOUT		0x0002
9576070Srobj #define	IPMI_EV_CRITICAL_IO_NMI			0x0004
9586070Srobj #define	IPMI_EV_CRITICAL_SW_NMI			0x0008
9596070Srobj #define	IPMI_EV_CRITICAL_PCI_PERR		0x0010
9606070Srobj #define	IPMI_EV_CRITICAL_PCI_SERR		0x0020
9616070Srobj #define	IPMI_EV_CRITICAL_EISA_FAILSAFE		0x0040
9626070Srobj #define	IPMI_EV_CRITICAL_BUS_CE			0x0080
9636070Srobj #define	IPMI_EV_CRITICAL_BUS_UE			0x0100
9646070Srobj #define	IPMI_EV_CRITICAL_FATAL_NMI		0x0200
9656070Srobj #define	IPMI_EV_CRITICAL_BUS_FATAL_ERR		0x0400
9666070Srobj #define	IPMI_EV_CRITICAL_BUS_DEGRADED		0x0800
9676070Srobj 
9686070Srobj #define	IPMI_ST_BUTTON				0x14
9696070Srobj 
9706070Srobj #define	IPMI_EV_BUTTON_PWR			0x0001
9716070Srobj #define	IPMI_EV_BUTTON_SLEEP			0x0002
9726070Srobj #define	IPMI_EV_BUTTON_RESET			0x0004
9736070Srobj #define	IPMI_EV_BUTTON_FRU_LATCH		0x0008
9746070Srobj #define	IPMI_EV_BUTTON_FRU_SERVICE		0x0010
9756070Srobj 
9766070Srobj #define	IPMI_ST_MODULE				0x15
9776070Srobj #define	IPMI_ST_MICROCONTROLLER			0x16
9786070Srobj #define	IPMI_ST_CARD				0x17
9796070Srobj #define	IPMI_ST_CHASSIS				0x18
9806070Srobj 
9816070Srobj #define	IPMI_ST_CHIPSET				0x19
9826070Srobj 
9836070Srobj #define	IPMI_EV_CHIPSET_PWR_CTL_FAIL		0x0001
9846070Srobj 
9856070Srobj #define	IPMI_ST_FRU				0x1A
9866070Srobj #define	IPMI_ST_CABLE				0x1B
9876070Srobj 
9886070Srobj #define	IPMI_EV_CABLE_CONNECTED			0x0001
9896070Srobj #define	IPMI_EV_CABLE_CONFIG_ERR		0x0002
9906070Srobj 
9916070Srobj #define	IPMI_ST_TERMINATOR			0x1C
9926070Srobj 
9936070Srobj #define	IPMI_ST_BOOT				0x1D
9946070Srobj 
9956070Srobj #define	IPMI_EV_BOOT_BIOS_PWR_UP		0x0001
9966070Srobj #define	IPMI_EV_BOOT_BIOS_HARD_RESET		0x0002
9976070Srobj #define	IPMI_EV_BOOT_BIOS_WARM_RESET		0x0004
9986070Srobj #define	IPMI_EV_BOOT_PXE_BOOT			0x0008
9996070Srobj #define	IPMI_EV_BOOT_DIAG_BOOT			0x0010
10006070Srobj #define	IPMI_EV_BOOT_OS_HARD_RESET		0x0020
10016070Srobj #define	IPMI_EV_BOOT_OS_WARM_RESET		0x0040
10026070Srobj #define	IPMI_EV_BOOT_SYS_RESTART		0x0080
10036070Srobj 
10046070Srobj #define	IPMI_ST_BOOT_ERROR			0x1E
10056070Srobj 
10066070Srobj #define	IPMI_EV_BOOT_ERROR_NOMEDIA		0x0001
10076070Srobj #define	IPMI_EV_BOOT_ERROR_NON_BOOTABLE_DISK	0x0002
10086070Srobj #define	IPMI_EV_BOOT_ERROR_NO_PXE_SERVER	0x0004
10096070Srobj #define	IPMI_EV_BOOT_ERROR_INV_BOOT_SECT	0x0008
10106070Srobj #define	IPMI_EV_BOOT_ERROR_USR_SELECT_TIMEOUT	0x0010
10116070Srobj 
10126070Srobj #define	IPMI_ST_BOOT_OS				0x1F
10136070Srobj 
10146070Srobj #define	IPMI_EV_BOOT_OS_A_DRV_BOOT_COMPLETE	0x0001
10156070Srobj #define	IPMI_EV_BOOT_OS_C_DRV_BOOT_COMPLETE	0x0002
10166070Srobj #define	IPMI_EV_BOOT_OS_PXE_BOOT_COMPLETE	0x0004
10176070Srobj #define	IPMI_EV_BOOT_OS_DIAG_BOOT_COMPLETE	0x0008
10186070Srobj #define	IPMI_EV_BOOT_OS_CDROM_BOOT_COMPLETE	0x0010
10196070Srobj #define	IPMI_EV_BOOT_OS_ROM_BOOT_COMPLETE	0x0020
10206070Srobj #define	IPMI_EV_BOOT_OS_UNSPEC_BOOT_COMPLETE	0x0040
10216070Srobj 
10226070Srobj #define	IPMI_ST_OS_SHUTDOWN			0x20
10236070Srobj 
10246070Srobj #define	IPMI_EV_OS_SHUTDOWN_LOADING		0x0001
10256070Srobj #define	IPMI_EV_OS_SHUTDOWN_CRASH		0x0002
10266070Srobj #define	IPMI_EV_OS_STOP_GRACEFUL		0x0004
10276070Srobj #define	IPMI_EV_OS_SHUTDOWN_GRACEFUL		0x0008
10286070Srobj #define	IPMI_EV_OS_SHUTDOWN_PEF			0x0010
10296070Srobj #define	IPMI_EV_OS_SHUTDOWN_BMC			0x0020
10306070Srobj 
10316070Srobj #define	IPMI_ST_SLOT				0x21
10326070Srobj 
10336070Srobj #define	IPMI_EV_SLOT_FAULT_ASSERTED		0x0001
10346070Srobj #define	IPMI_EV_SLOT_IDENTIFY_ASSERTED		0x0002
10356070Srobj #define	IPMI_EV_SLOT_CONNECTED			0x0004
10366070Srobj #define	IPMI_EV_SLOT_INSTALL_READY		0x0008
10376070Srobj #define	IPMI_EV_SLOT_REMOVE_READY		0x0010
10386070Srobj #define	IPMI_EV_SLOT_PWR_OFF			0x0020
10396070Srobj #define	IPMI_EV_SLOT_REMOVED			0x0040
10406070Srobj #define	IPMI_EV_SLOT_INTERLOCK_ASSERTED		0x0080
10416070Srobj #define	IPMI_EV_SLOT_DISABLED			0x0100
10426070Srobj #define	IPMI_EV_SLOT_SPARE_DEVICE		0x0200
10436070Srobj 
10446070Srobj #define	IPMI_ST_ACPI				0x22
10456070Srobj 
10466070Srobj #define	IPMI_EV_ACPI_PSTATE_S0_G0		0x0001
10476070Srobj #define	IPMI_EV_ACPI_PSTATE_S1			0x0002
10486070Srobj #define	IPMI_EV_ACPI_PSTATE_S2			0x0004
10496070Srobj #define	IPMI_EV_ACPI_PSTATE_S3			0x0008
10506070Srobj #define	IPMI_EV_ACPI_PSTATE_S4			0x0010
10516070Srobj #define	IPMI_EV_ACPI_PSTATE_S5_G2_SOFT_OFF	0x0020
10526070Srobj #define	IPMI_EV_ACPI_PSTATE_S4_S5_SOFT_OFF	0x0040
10536070Srobj #define	IPMI_EV_ACPI_PSATTE_G3_MECH_OFF		0x0080
10546070Srobj #define	IPMI_EV_ACPI_PSTATE_S1_S2_S3_SLEEP	0x0100
10556070Srobj #define	IPMI_EV_ACPI_PSTATE_G1_SLEEP		0x0200
10566070Srobj #define	IPMI_EV_ACPI_PSTATE_S5_OVERRIDE		0x0400
10576070Srobj #define	IPMI_EV_ACPI_PSTATE_LEGACY_ON		0x0800
10586070Srobj #define	IPMI_EV_ACPI_PSTATE_LEGACY_OFF		0x1000
10596070Srobj #define	IPMI_EV_ACPI_PSTATE_UNKNOWN		0x2000
10606070Srobj 
10616070Srobj #define	IPMI_ST_WATCHDOG2			0x23
10626070Srobj 
10636070Srobj #define	IPMI_EV_WATCHDOG2_EXPIRED		0x0001
10646070Srobj #define	IPMI_EV_WATCHDOG2_HARD_RESET		0x0002
10656070Srobj #define	IPMI_EV_WATCHDOG2_PWR_DOWN		0x0004
10666070Srobj #define	IPMI_EV_WATCHDOG2_PWR_CYCLE		0x0008
10676070Srobj #define	IPMI_EV_WATCHDOG2_RESERVED1		0x0010
10686070Srobj #define	IPMI_EV_WATCHDOG2_RESERVED2		0x0020
10696070Srobj #define	IPMI_EV_WATCHDOG2_RESERVED3		0x0040
10706070Srobj #define	IPMI_EV_WATCHDOG2_RESERVED4		0x0080
10716070Srobj #define	IPMI_EV_WATCHDOG2_TIMEOUT_INT		0x0100
10726070Srobj 
10736070Srobj #define	IPMI_ST_ALERT				0x24
10746070Srobj 
10756070Srobj #define	IPMI_EV_ALERT_PLAT_PAGE			0x0001
10766070Srobj #define	IPMI_EV_ALERT_PLAT_LAN_ALERT		0x0002
10776070Srobj #define	IPMI_EV_ALERT_PLAT_EVT_TRAP		0x0004
10786070Srobj #define	IPMI_EV_ALERT_PLAT_SNMP_TRAP		0x0008
10796070Srobj 
10806070Srobj #define	IPMI_ST_PRESENCE			0x25
10816070Srobj 
10826070Srobj #define	IPMI_EV_PRESENCE_PRESENT		0x0001
10836070Srobj #define	IPMI_EV_PRESENCE_ABSENT			0x0002
10846070Srobj #define	IPMI_EV_PRESENCE_DISABLED		0x0004
10856070Srobj 
10866070Srobj #define	IPMI_ST_ASIC				0x26
10876070Srobj 
10886070Srobj #define	IPMI_ST_LAN				0x27
10896070Srobj 
10906070Srobj #define	IPMI_EV_LAN_HEARTBEAT_LOST		0x0001
10916070Srobj #define	IPMI_EV_LAN_HEARTBEAT			0x0002
10926070Srobj 
10936070Srobj #define	IPMI_ST_HEALTH				0x28
10946070Srobj 
10956070Srobj #define	IPMI_EV_HEALTH_SENSOR_ACC_DEGRADED	0x0001
10966070Srobj #define	IPMI_EV_HEALTH_CNTLR_ACC_DEGRADED	0x0002
10976070Srobj #define	IPMI_EV_HEALTH_CNTLR_OFFLINE		0x0004
10986070Srobj #define	IPMI_EV_HEALTH_CNTLR_UNAVAIL		0x0008
10996070Srobj #define	IPMI_EV_HEALTH_SENSOR_FAILURE		0x0010
11006070Srobj #define	IPMI_EV_HEALTH_FRU_FAILURE		0x0020
11016070Srobj 
11026070Srobj #define	IPMI_ST_BATTERY				0x29
11036070Srobj 
11046070Srobj #define	IPMI_EV_BATTERY_LOW			0x0001
11056070Srobj #define	IPMI_EV_BATTERY_FAILED			0x0002
11066070Srobj #define	IPMI_EV_BATTERY_PRESENCE		0x0004
11076070Srobj 
11086070Srobj #define	IPMI_ST_AUDIT				0x2A
11096070Srobj 
11106070Srobj #define	IPMI_EV_AUDIT_SESSION_ACTIVATED		0x0001
11116070Srobj #define	IPMI_EV_AUDIT_SESSION_DEACTIVATED	0x0002
11126070Srobj 
11136070Srobj #define	IPMI_ST_VERSION				0x2B
11146070Srobj 
11156070Srobj #define	IPMI_EV_VERSION_HW_CHANGE		0x0001
11166070Srobj #define	IPMI_EV_VERSION_SW_CHANGE		0x0002
11176070Srobj #define	IPMI_EV_VERSION_HW_INCOMPATIBLE		0x0004
11186070Srobj #define	IPMI_EV_VERSION_SW_INCOMPATIBLE		0x0008
11196070Srobj #define	IPMI_EV_VERSION_HW_INVAL		0x0010
11206070Srobj #define	IPMI_EV_VERSION_SW_INVAL		0x0020
11216070Srobj #define	IPMI_EV_VERSION_HW_CHANGE_SUCCESS	0x0040
11226070Srobj #define	IPMI_EV_VERSION_SW_CHANGE_SUCCESS	0x0080
11236070Srobj 
11246070Srobj #define	IPMI_ST_FRU_STATE			0x2C
11256070Srobj 
11266070Srobj #define	IPMI_EV_FRU_STATE_NOT_INSTALLED		0x0001
11276070Srobj #define	IPMI_EV_FRU_STATE_INACTIVE		0x0002
11286070Srobj #define	IPMI_EV_FRU_STATE_ACT_REQ		0x0004
11296070Srobj #define	IPMI_EV_FRU_STATE_ACT_INPROGRESS	0x0008
11306070Srobj #define	IPMI_EV_FRU_STATE_ACTIVE		0x0010
11316070Srobj #define	IPMI_EV_FRU_STATE_DEACT_REQ		0x0020
11326070Srobj #define	IPMI_EV_FRU_STATE_DEACT_INPROGRESS	0x0040
11336070Srobj #define	IPMI_EV_FRU_STATE_COMM_LOST		0x0080
11346070Srobj 
11356070Srobj /*
11366070Srobj  * Constants for unit type codes.  See Table 43-15.
11376070Srobj  */
11386070Srobj #define	IPMI_UNITS_UNSPECIFIED			0x00
11396070Srobj #define	IPMI_UNITS_DEGREES_C			0x01
11406070Srobj #define	IPMI_UNITS_DEGREES_F			0x02
11416070Srobj #define	IPMI_UNITS_DEGREES_K			0x03
11426070Srobj #define	IPMI_UNITS_VOLTS			0x04
11436070Srobj #define	IPMI_UNITS_AMPS				0x05
11446070Srobj #define	IPMI_UNITS_WATTS			0x06
11456070Srobj #define	IPMI_UNITS_JOULES			0x07
11466070Srobj #define	IPMI_UNITS_COULOMBS			0x08
11476070Srobj #define	IPMI_UNITS_VA				0x09
11486070Srobj #define	IPMI_UNITS_NITS				0x0A
11496070Srobj #define	IPMI_UNITS_LUMEN			0x0B
11506070Srobj #define	IPMI_UNITS_LUX				0x0C
11516070Srobj #define	IPMI_UNITS_CANDELA			0x0D
11526070Srobj #define	IPMI_UNITS_KPA				0x0E
11536070Srobj #define	IPMI_UNITS_PSI				0x0F
11546070Srobj 
11556070Srobj #define	IPMI_UNITS_NEWTON			0x10
11566070Srobj #define	IPMI_UNITS_CFM				0x11
11576070Srobj #define	IPMI_UNITS_RPM				0x12
11586070Srobj #define	IPMI_UNITS_HZ				0x13
11596070Srobj #define	IPMI_UNITS_MICROSEC			0x14
11606070Srobj #define	IPMI_UNITS_MILLISEC			0x15
11616070Srobj #define	IPMI_UNITS_SECS				0x16
11626070Srobj #define	IPMI_UNITS_MIN				0x17
11636070Srobj #define	IPMI_UNITS_HOUR				0x18
11646070Srobj #define	IPMI_UNITS_DAY				0x19
11656070Srobj #define	IPMI_UNITS_WEEK				0x1A
11666070Srobj #define	IPMI_UNITS_MIL				0x1B
11676070Srobj #define	IPMI_UNITS_INCHES			0x1C
11686070Srobj #define	IPMI_UNITS_FEET				0x1D
11696070Srobj #define	IPMI_UNITS_CUB_INCH			0x1E
11706070Srobj #define	IPMI_UNITS_CUB_FEET			0x1F
11716070Srobj 
11726070Srobj #define	IPMI_UNITS_MM				0x20
11736070Srobj #define	IPMI_UNITS_CM				0x21
11746070Srobj #define	IPMI_UNITS_METERS			0x22
11756070Srobj #define	IPMI_UNITS_CUB_CM			0x23
11766070Srobj #define	IPMI_UNITS_CUB_METER			0x24
11776070Srobj #define	IPMI_UNITS_LITERS			0x25
11786070Srobj #define	IPMI_UNITS_FLUID_OUNCE			0x26
11796070Srobj #define	IPMI_UNITS_RADIANS			0x27
11806070Srobj #define	IPMI_UNITS_STERADIANS			0x28
11816070Srobj #define	IPMI_UNITS_REVOLUTIONS			0x29
11826070Srobj #define	IPMI_UNITS_CYCLES			0x2A
11836070Srobj #define	IPMI_UNITS_GRAVITIES			0x2B
11846070Srobj #define	IPMI_UNITS_OUNCE			0x2C
11856070Srobj #define	IPMI_UNITS_POUND			0x2D
11866070Srobj #define	IPMI_UNITS_FOOT_POUND			0x2E
11876070Srobj #define	IPMI_UNITS_OZ_INCH			0x2F
11886070Srobj 
11896070Srobj #define	IPMI_UNITS_GAUSS			0x30
11906070Srobj #define	IPMI_UNITS_GILBERTS			0x31
11916070Srobj #define	IPMI_UNITS_HENRY			0x32
11926070Srobj #define	IPMI_UNITS_MILHENRY			0x33
11936070Srobj #define	IPMI_UNITS_FARAD			0x34
11946070Srobj #define	IPMI_UNITS_MICROFARAD			0x35
11956070Srobj #define	IPMI_UNITS_OHMS				0x36
11966070Srobj #define	IPMI_UNITS_SIEMENS			0x37
11976070Srobj #define	IPMI_UNITS_MOLE				0x38
11986070Srobj #define	IPMI_UNITS_BECQUEREL			0x39
11996070Srobj #define	IPMI_UNITS_PPM				0x3A
12006070Srobj /* 0x3B is reserved */
12016070Srobj #define	IPMI_UNITS_DECIBELS			0x3C
12026070Srobj #define	IPMI_UNITS_DBA				0x3D
12036070Srobj #define	IPMI_UNITS_DBC				0x3E
12046070Srobj #define	IPMI_UNITS_GRAY				0x3F
12056070Srobj 
12066070Srobj #define	IPMI_UNITS_SIEVERT			0x40
12076070Srobj #define	IPMI_UNITS_COLOR_TEMP_K			0x41
12086070Srobj #define	IPMI_UNITS_BIT				0x42
12096070Srobj #define	IPMI_UNITS_KILOBIT			0x43
12106070Srobj #define	IPMI_UNITS_MEGABIT			0x44
12116070Srobj #define	IPMI_UNITS_GIGABIT			0x45
12126070Srobj #define	IPMI_UNITS_BYTE				0x46
12136070Srobj #define	IPMI_UNITS_KILOBYTE			0x47
12146070Srobj #define	IPMI_UNITS_MEGABYTE			0x48
12156070Srobj #define	IPMI_UNITS_GIGABYTE			0x49
12166070Srobj #define	IPMI_UNITS_WORD				0x4A
12176070Srobj #define	IPMI_UNITS_DWORD			0x4B
12186070Srobj #define	IPMI_UNITS_QWORD			0x4C
12196070Srobj #define	IPMI_UNITS_MEMLINE			0x4D
12206070Srobj #define	IPMI_UNITS_HIT				0x4E
12216070Srobj #define	IPMI_UNITS_MISS				0x4F
12226070Srobj 
12236070Srobj #define	IPMI_UNITS_RETRY			0x50
12246070Srobj #define	IPMI_UNITS_RESET			0x51
12256070Srobj #define	IPMI_UNITS_OVERFLOW			0x52
12266070Srobj #define	IPMI_UNITS_UNDERRUN			0x53
12276070Srobj #define	IPMI_UNITS_COLLISION			0x54
12286070Srobj #define	IPMI_UNITS_PACKETS			0x55
12296070Srobj #define	IPMI_UNITS_MESSAGES			0x56
12306070Srobj #define	IPMI_UNITS_CHARACTERS			0x57
12316070Srobj #define	IPMI_UNITS_ERROR			0x58
12326070Srobj #define	IPMI_UNITS_CE				0x59
12336070Srobj #define	IPMI_UNITS_UE				0x5A
12346070Srobj #define	IPMI_UNITS_FATAL_ERROR			0x5B
12356070Srobj #define	IPMI_UNITS_GRAMS			0x5C
12366070Srobj 
12376070Srobj /*
12386070Srobj  * Event-Only Record.  See section 43.3.
12396070Srobj  */
12406070Srobj 
12416070Srobj #define	IPMI_SDR_TYPE_EVENT_ONLY		0x03
12426070Srobj 
12436070Srobj typedef struct ipmi_sdr_event_only {
12446070Srobj 	/* RECORD KEY BYTES */
12456070Srobj 	uint8_t		is_eo_owner;
12466070Srobj 	DECL_BITFIELD3(
12476070Srobj 	    is_eo_sensor_lun			:2,
12486070Srobj 	    is_eo_fru_lun			:2,
12496070Srobj 	    is_eo_channel			:4);
12506070Srobj 	uint8_t		is_eo_number;
12516070Srobj 	/* RECORD BODY BYTES */
12526070Srobj 	uint8_t		is_eo_entity_id;
12536070Srobj 	DECL_BITFIELD2(
12546070Srobj 	    is_eo_entity_instance		:7,
12556070Srobj 	    is_eo_entity_logical		:1);
12566070Srobj 	uint8_t		is_eo_sensor_type;
12576070Srobj 	uint8_t		is_eo_reading_type;
12586070Srobj 	DECL_BITFIELD3(
12596070Srobj 	    is_eo_share_count			:4,
12606070Srobj 	    is_eo_modifier_type			:2,
12616070Srobj 	    is_eo_direction			:2);
12626070Srobj 	DECL_BITFIELD2(
12636070Srobj 	    is_eo_modifier_offset		:7,
12646070Srobj 	    is_eo_sharing			:1);
12656070Srobj 	uint8_t		__reserved;
12666070Srobj 	uint8_t		is_eo_oem;
12676070Srobj 	DECL_BITFIELD3(
12686070Srobj 	    is_eo_idlen				:5,
12696070Srobj 	    __reserved1				:1,
12706070Srobj 	    is_eo_idtype			:2);
12716070Srobj 	char		is_eo_idstring[1];
12726070Srobj } ipmi_sdr_event_only_t;
12736070Srobj 
12746070Srobj /*
12756070Srobj  * Entity Association Record.  See section 43.4.
12766070Srobj  */
12776070Srobj 
12786070Srobj #define	IPMI_SDR_TYPE_ENTITY_ASSOCIATION	0x08
12796070Srobj 
12806070Srobj typedef struct ipmi_sdr_entity_association {
12816070Srobj 	/* RECORD KEY BYTES */
12826070Srobj 	uint8_t		is_ea_entity_id;
12836070Srobj 	uint8_t		is_ea_entity_instance;
12846070Srobj 	DECL_BITFIELD4(
12856070Srobj 	    __reserved		:5,
12866070Srobj 	    is_ea_presence	:1,
12876070Srobj 	    is_ea_record_link	:1,
12886070Srobj 	    is_ea_range		:1);
12896070Srobj 	/* RECORD BODY BYTES */
12906070Srobj 	struct {
12916070Srobj 		uint8_t		is_ea_sub_id;
12926070Srobj 		uint8_t		is_ea_sub_instance;
12936070Srobj 	} is_ea_sub[4];
12946070Srobj } ipmi_sdr_entity_association_t;
12956070Srobj 
12966070Srobj /*
12976070Srobj  * Device-relative Entity Association Record.  See section 43.5.
12986070Srobj  */
12996070Srobj 
13006070Srobj #define	IPMI_SDR_TYPE_DEVICE_RELATIVE		0x09
13016070Srobj 
13026070Srobj typedef struct ipmi_sdr_device_relative {
13036070Srobj 	/* RECORD KEY BYTES */
13046070Srobj 	uint8_t		is_dr_entity_id;
13056070Srobj 	uint8_t		is_dr_entity_instance;
13066070Srobj 	DECL_BITFIELD2(
13076070Srobj 	    __reserved1			:1,
13086070Srobj 	    is_dr_slaveaddr		:7);
13096070Srobj 	DECL_BITFIELD2(
13106070Srobj 	    __reserved2			:4,
13116070Srobj 	    is_dr_channel		:4);
13126070Srobj 	DECL_BITFIELD4(
13136070Srobj 	    __reserved			:5,
13146070Srobj 	    is_dr_presence		:1,
13156070Srobj 	    is_dr_record_link		:1,
13166070Srobj 	    is_dr_range			:1);
13176070Srobj 	/* RECORD BODY BYTES */
13186070Srobj 	struct {
13196070Srobj 		DECL_BITFIELD2(
13206070Srobj 		    __reserved3		:1,
13216070Srobj 		    is_dr_sub_slaveaddr	:7);
13226070Srobj 		DECL_BITFIELD2(
13236070Srobj 		    __reserved4		:4,
13246070Srobj 		    is_dr_sub_channel	:4);
13256070Srobj 		uint8_t		is_ea_sub_id;
13266070Srobj 		uint8_t		is_ea_sub_instance;
13276070Srobj 	} is_ea_sub[4];
13286070Srobj } ipmi_sdr_device_relative_t;
13296070Srobj 
13306070Srobj /*
13313798Seschrock  * Generic Device Locator Record.  See section 43.7.
13323798Seschrock  */
13333798Seschrock 
13343798Seschrock #define	IPMI_SDR_TYPE_GENERIC_LOCATOR		0x10
13353798Seschrock 
13363798Seschrock typedef struct ipmi_sdr_generic_locator {
13373798Seschrock 	/* RECORD KEY BYTES */
13385621Seschrock 	DECL_BITFIELD2(
13395621Seschrock 	    __reserved1		:1,
13405621Seschrock 	    is_gl_accessaddr	:7);
13415621Seschrock 	DECL_BITFIELD2(
13425621Seschrock 	    is_gl_channel_msb	:1,
13435621Seschrock 	    is_gl_slaveaddr	:7);
13445621Seschrock 	DECL_BITFIELD3(
13455621Seschrock 	    is_gl_bus		:3,
13465621Seschrock 	    is_gl_lun		:2,
13475621Seschrock 	    is_gl_channel	:3);
13483798Seschrock 	/* RECORD BODY BYTES */
13495621Seschrock 	DECL_BITFIELD2(
13505621Seschrock 	    is_gl_span		:3,
13515621Seschrock 	    __reserved2		:5);
13523798Seschrock 	uint8_t		__reserved3;
13533798Seschrock 	uint8_t		is_gl_type;
13543798Seschrock 	uint8_t		is_gl_modifier;
13553798Seschrock 	uint8_t		is_gl_entity;
13563798Seschrock 	uint8_t		is_gl_instance;
13573798Seschrock 	uint8_t		is_gl_oem;
13586070Srobj 	DECL_BITFIELD3(
13596070Srobj 	    is_gl_idlen		:5,
13606070Srobj 	    __reserved4		:1,
13615621Seschrock 	    is_gl_idtype	:2);
13623798Seschrock 	char		is_gl_idstring[1];
13633798Seschrock } ipmi_sdr_generic_locator_t;
13643798Seschrock 
13653798Seschrock /*
13663798Seschrock  * FRU Device Locator Record.  See section 43.8.
13673798Seschrock  */
13683798Seschrock 
13693798Seschrock #define	IPMI_SDR_TYPE_FRU_LOCATOR		0x11
13703798Seschrock 
13713798Seschrock typedef struct ipmi_sdr_fru_locator {
13723798Seschrock 	/* RECORD KEY BYTES */
13735621Seschrock 	DECL_BITFIELD2(
13745621Seschrock 	    __reserved1		:1,
13755621Seschrock 	    is_fl_accessaddr	:7);
13763798Seschrock 	union {
13773798Seschrock 		struct {
13783798Seschrock 			uint8_t	_is_fl_devid;
13793798Seschrock 		} _logical;
13803798Seschrock 		struct {
13815621Seschrock 			DECL_BITFIELD2(
13825621Seschrock 			    __reserved		:1,
13835621Seschrock 			    _is_fl_slaveaddr	:7);
13843798Seschrock 		} _nonintelligent;
13853798Seschrock 	} _devid_or_slaveaddr;
13865621Seschrock 	DECL_BITFIELD4(
13875621Seschrock 	    is_fl_bus		:3,
13885621Seschrock 	    is_fl_lun		:2,
13895621Seschrock 	    __reserved2		:2,
13905621Seschrock 	    is_fl_logical	:1);
13915621Seschrock 	DECL_BITFIELD2(
13925621Seschrock 	    __reserved3		:4,
13935621Seschrock 	    is_fl_channel	:4);
13943798Seschrock 	/* RECORD BODY BYTES */
13953798Seschrock 	uint8_t		__reserved4;
13963798Seschrock 	uint8_t		is_fl_type;
13973798Seschrock 	uint8_t		is_fl_modifier;
13983798Seschrock 	uint8_t		is_fl_entity;
13993798Seschrock 	uint8_t		is_fl_instance;
14003798Seschrock 	uint8_t		is_fl_oem;
14016070Srobj 	DECL_BITFIELD3(
14026070Srobj 	    is_fl_idlen		:5,
14036070Srobj 	    __reserved5		:1,
14045621Seschrock 	    is_fl_idtype	:2);
14053798Seschrock 	char		is_fl_idstring[1];
14063798Seschrock } ipmi_sdr_fru_locator_t;
14073798Seschrock 
14083798Seschrock #define	is_fl_devid	_devid_or_slaveaddr._logical._is_fl_devid
14093798Seschrock #define	is_fl_slaveaddr	_devid_or_slaveaddr._nonintelligent._is_fl_slaveaddr
14103798Seschrock 
14113798Seschrock /*
14126070Srobj  * Management Controller Device Locator Record.  See section 43.9
14136070Srobj  */
14146070Srobj 
14156070Srobj #define	IPMI_SDR_TYPE_MANAGEMENT_LOCATOR	0x12
14166070Srobj 
14176070Srobj typedef struct ipmi_sdr_management_locator {
14186070Srobj 	/* RECORD KEY BYTES */
14196070Srobj 	DECL_BITFIELD2(
14206070Srobj 	    __reserved1			:1,
14216070Srobj 	    is_ml_devaddr		:7);
14226070Srobj 	DECL_BITFIELD2(
14236070Srobj 	    is_ml_channel		:4,
14246070Srobj 	    __reserved2			:4);
14256070Srobj 	/* RECORD BODY BYTES */
14266070Srobj 	DECL_BITFIELD7(
14276070Srobj 	    is_ml_init_message		:2,
14286070Srobj 	    is_ml_init_log		:1,
14296070Srobj 	    is_ml_init_controller_log	:1,
14306070Srobj 	    __reserved3			:1,
14316070Srobj 	    is_ml_static		:1,
14326070Srobj 	    is_ml_acpi_device		:1,
14336070Srobj 	    is_ml_acpi_system		:1);
14346070Srobj 	DECL_BITFIELD8(
14356070Srobj 	    is_ml_supp_sensor		:1,
14366070Srobj 	    is_ml_supp_sdr		:1,
14376070Srobj 	    is_ml_supp_sel		:1,
14386070Srobj 	    is_ml_supp_fru		:1,
14396070Srobj 	    is_ml_supp_event_receiver	:1,
14406070Srobj 	    is_ml_supp_event_generator	:1,
14416070Srobj 	    is_ml_supp_bridge		:1,
14426070Srobj 	    is_ml_supp_chassis		:1);
14436070Srobj 	uint8_t		__reserved4;
14446070Srobj 	uint16_t	__reserved5;
14456070Srobj 	uint8_t		is_ml_entity_id;
14466070Srobj 	uint8_t		is_ml_entity_instance;
14476070Srobj 	uint8_t		is_ml_oem;
14486070Srobj 	DECL_BITFIELD3(
14496070Srobj 	    is_ml_idlen		:5,
14506070Srobj 	    __reserved6		:1,
14516070Srobj 	    is_ml_idtype	:2);
14526070Srobj 	char		is_ml_idstring[1];
14536070Srobj } ipmi_sdr_management_locator_t;
14546070Srobj 
14556070Srobj #define	IPMI_MESSAGE_INIT_ENABLE		0x0
14566070Srobj #define	IPMI_MESSAGE_INIT_DISABLE		0x1
14576070Srobj #define	IPMI_MESSAGE_INIT_NONE			0x2
14586070Srobj 
14596070Srobj /*
14606070Srobj  *  Management Controller Confirmation Record.  See section 43.10
14613798Seschrock  */
14626070Srobj 
14633798Seschrock #define	IPMI_SDR_TYPE_MANAGEMENT_CONFIRMATION	0x13
14646070Srobj 
14656070Srobj typedef struct ipmi_sdr_management_confirmation {
14666070Srobj 	/* RECORD KEY BYTES */
14676070Srobj 	DECL_BITFIELD2(
14686070Srobj 	    __reserved1		:1,
14696070Srobj 	    is_mc_slaveaddr	:7);
14706070Srobj 	uint8_t		is_mc_deviceid;
14716070Srobj 	DECL_BITFIELD2(
14726070Srobj 	    is_mc_dev_revision	:4,
14736070Srobj 	    is_mc_channel	:4);
14746070Srobj 	/* RECORD BODY BYTES */
14756070Srobj 	DECL_BITFIELD2(
14766070Srobj 	    is_mc_major_rev	:7,
14776070Srobj 	    __reserved2		:1);
14786070Srobj 	uint8_t		is_mc_minor_rev;
14796070Srobj 	uint8_t		is_mc_impi_ver;
14806070Srobj 	uint8_t		is_mc_manufacturer[3];
14816070Srobj 	uint16_t	is_mc_product;
14826070Srobj 	uint8_t		is_mc_guid[16];
14836070Srobj } ipmi_sdr_management_confirmation_t;
14846070Srobj 
14856070Srobj /*
14866070Srobj  * BMC Message Channel Info Record.  See esction 43.11.
14876070Srobj  */
14886070Srobj 
14893798Seschrock #define	IPMI_SDR_TYPE_BMC_MESSAGE_CHANNEL	0x14
14906070Srobj 
14916070Srobj typedef struct ipmi_sdr_bmc_channel {
14926070Srobj 	/* RECORD BODY BYTES */
14936070Srobj 	struct {
14946070Srobj 		DECL_BITFIELD3(
14956070Srobj 		    is_bc_protocol	:4,
14966070Srobj 		    is_bc_receive_lun	:3,
14976070Srobj 		    is_bc_transmit	:1);
14986070Srobj 	} is_bc_channel[8];
14996070Srobj 	uint8_t		is_bc_interrupt_type;
15006070Srobj 	uint8_t		is_bc_buffer_type;
15016070Srobj 	uint8_t		__reserved;
15026070Srobj } ipmi_sdr_bmc_channel_t;
15036070Srobj 
15046070Srobj /*
15056070Srobj  * OEM Record.  See ction 43.12.
15066070Srobj  */
15076070Srobj 
15083798Seschrock #define	IPMI_SDR_TYPE_OEM			0xC0
15093798Seschrock 
15106070Srobj typedef struct ipmi_sdr_oem {
15116070Srobj 	uint8_t		is_oem_manufacturer[3];
15126070Srobj 	uint8_t		is_oem_data[1];
15136070Srobj } ipmi_sdr_oem_t;
15146070Srobj 
15156070Srobj /*
15166070Srobj  * Iterate over the SDR repository.  This function does the work of parsing the
15176070Srobj  * name when available, and keeping the repository in a consistent state.
15186070Srobj  */
15196070Srobj extern int ipmi_sdr_iter(ipmi_handle_t *,
15206070Srobj     int (*)(ipmi_handle_t *, const char *, ipmi_sdr_t *, void *), void *);
15216070Srobj 
15223798Seschrock /*
15233798Seschrock  * Lookup the given sensor type by name.  These functions automatically read in
15243798Seschrock  * and cache the complete SDR repository.
15253798Seschrock  */
15266070Srobj extern ipmi_sdr_t *ipmi_sdr_lookup(ipmi_handle_t *, const char *);
15273798Seschrock extern ipmi_sdr_fru_locator_t *ipmi_sdr_lookup_fru(ipmi_handle_t *,
15283798Seschrock     const char *);
15293798Seschrock extern ipmi_sdr_generic_locator_t *ipmi_sdr_lookup_generic(ipmi_handle_t *,
15303798Seschrock     const char *);
15316070Srobj extern ipmi_sdr_compact_sensor_t *ipmi_sdr_lookup_compact_sensor(
15326070Srobj     ipmi_handle_t *, const char *);
15336070Srobj extern ipmi_sdr_full_sensor_t *ipmi_sdr_lookup_full_sensor(
15346070Srobj     ipmi_handle_t *, const char *);
15356070Srobj 
15366070Srobj /*
15376070Srobj  * Entity ID codes.  See table 43.13.
15386070Srobj  */
15396070Srobj #define	IPMI_ET_UNSPECIFIED		0x00
15406070Srobj #define	IPMI_ET_OTHER			0x01
15416070Srobj #define	IPMI_ET_UNKNOWN			0x02
15426070Srobj #define	IPMI_ET_PROCESSOR		0x03
15436070Srobj #define	IPMI_ET_DISK			0x04
15446070Srobj #define	IPMI_ET_PERIPHERAL		0x05
15456070Srobj #define	IPMI_ET_MANAGEMENT_MODULE	0x06
15466070Srobj #define	IPMI_ET_MOTHERBOARD		0x07
15476070Srobj #define	IPMI_ET_MEMORY_MODULE		0x08
15486070Srobj #define	IPMI_ET_PROCESSOR_MODULE	0x09
15496070Srobj #define	IPMI_ET_PSU			0x0A
15506070Srobj #define	IPMI_ET_CARD			0x0B
15516070Srobj #define	IPMI_ET_FRONT_PANEL		0x0C
15526070Srobj #define	IPMI_ET_BACK_PANEL		0x0D
15536070Srobj #define	IPMI_ET_POWER_BOARD		0x0E
15546070Srobj #define	IPMI_ET_BACKPLANE		0x0F
15556070Srobj #define	IPMI_ET_EXPANSION_BOARD		0x10
15566070Srobj #define	IPMI_ET_OTHER_BOARD		0x11
15576070Srobj #define	IPMI_ET_PROCESSOR_BOARD		0x12
15586070Srobj #define	IPMI_ET_POWER_DOMAIN		0x13
15596070Srobj #define	IPMI_ET_POWER_CONVERTER		0x14
15606070Srobj #define	IPMI_ET_POWER_MANAGEMENT	0x15
15616070Srobj #define	IPMI_ET_BACK_CHASSIS		0x16
15626070Srobj #define	IPMI_ET_SYSTEM_CHASSIS		0x17
15636070Srobj #define	IPMI_ET_SUB_CHASSIS		0x18
15646070Srobj #define	IPMI_ET_OTHER_CHASSIS		0x19
15656070Srobj #define	IPMI_ET_DISK_BAY		0x1A
15666070Srobj #define	IPMI_ET_PERIPHERAL_BAY		0x1B
15676070Srobj #define	IPMI_ET_DEVICE_BAY		0x1C
15686070Srobj #define	IPMI_ET_FAN			0x1D
15696070Srobj #define	IPMI_ET_COOLING_DOMAIN		0x1E
15706070Srobj #define	IPMI_ET_CABLE			0x1F
15716070Srobj #define	IPMI_ET_MEMORY_DEVICE		0x20
15726070Srobj #define	IPMI_ET_MANAGEMENT_SOFTWARE	0x21
15736070Srobj #define	IPMI_ET_SYSTEM_FIRMWARE		0x22
15746070Srobj #define	IPMI_ET_OS			0x23
15756070Srobj #define	IPMI_ET_SYSTEM_BUS		0x24
15766070Srobj #define	IPMI_ET_GROUP			0x25
15776070Srobj #define	IPMI_ET_REMOTE			0x26
15786070Srobj #define	IPMI_ET_ENVIRONMENT		0x27
15796070Srobj #define	IPMI_ET_BATTERY			0x28
15806070Srobj #define	IPMI_ET_BLADE			0x29
15816070Srobj #define	IPMI_ET_SWITCH			0x2A
15826070Srobj #define	IPMI_ET_PROCMEM_MODULE		0x2B
15836070Srobj #define	IPMI_ET_IO_MODULE		0x2C
15846070Srobj #define	IPMI_ET_PROCIO_MODULE		0x2D
15856070Srobj #define	IPMI_ET_CONTROLLER_FIRMWARE	0x2E
15866070Srobj #define	IPMI_ET_CHANNEL			0x2F
15876070Srobj #define	IPMI_ET_PCI			0x30
15886070Srobj #define	IPMI_ET_PCIE			0x31
15896070Srobj #define	IPMI_ET_SCSI			0x32
15906070Srobj #define	IPMI_ET_SATA_SAS		0x33
15916070Srobj #define	IPMI_ET_FSB			0x34
15926070Srobj #define	IPMI_ET_RTC			0x35
15933798Seschrock 
15943798Seschrock /*
15953798Seschrock  * Get Sensor Reading.  See section 35.14.
15963798Seschrock  */
15973798Seschrock 
15983798Seschrock #define	IPMI_CMD_GET_SENSOR_READING	0x2d
15993798Seschrock 
16003798Seschrock typedef struct ipmi_sensor_reading {
16013798Seschrock 	uint8_t		isr_reading;
16025621Seschrock 	DECL_BITFIELD4(
16035621Seschrock 	    __reserved1			:5,
16045621Seschrock 	    isr_state_unavailable	:1,
16056070Srobj 	    isr_scanning_enabled	:1,
16066070Srobj 	    isr_event_enabled		:1);
16073798Seschrock 	uint16_t	isr_state;
16083798Seschrock } ipmi_sensor_reading_t;
16093798Seschrock 
16106070Srobj #define	IPMI_SENSOR_THRESHOLD_LOWER_NONCRIT		0x0001
16116070Srobj #define	IPMI_SENSOR_THRESHOLD_LOWER_CRIT		0x0002
16126070Srobj #define	IPMI_SENSOR_THRESHOLD_LOWER_NONRECOV		0x0004
16136070Srobj #define	IPMI_SENSOR_THRESHOLD_UPPER_NONCRIT		0x0008
16146070Srobj #define	IPMI_SENSOR_THRESHOLD_UPPER_CRIT		0x0010
16156070Srobj #define	IPMI_SENSOR_THRESHOLD_UPPER_NONRECOV		0x0020
16166070Srobj 
16173798Seschrock extern ipmi_sensor_reading_t *ipmi_get_sensor_reading(ipmi_handle_t *, uint8_t);
16187243Srobj extern int ipmi_sdr_conv_reading(ipmi_sdr_full_sensor_t *, uint8_t,
16197243Srobj     double *);
16203798Seschrock /*
16213798Seschrock  * Set Sensor Reading.  See section 35.14.
16223798Seschrock  */
16233798Seschrock #define	IPMI_CMD_SET_SENSOR_READING	0x30
16243798Seschrock 
16253798Seschrock #define	IPMI_SENSOR_OP_CLEAR	0x3	/* clear '0' bits */
16263798Seschrock #define	IPMI_SENSOR_OP_SET	0x2	/* set '1' bits */
16273798Seschrock #define	IPMI_SENSOR_OP_EXACT	0x1	/* set bits exactly */
16283798Seschrock 
16293798Seschrock typedef struct ipmi_set_sensor_reading {
16303798Seschrock 	uint8_t		iss_id;
16315621Seschrock 	DECL_BITFIELD5(
16325621Seschrock 	    iss_set_reading		:1,
16335621Seschrock 	    __reserved			:1,
16345621Seschrock 	    iss_deassrt_op		:2,
16355621Seschrock 	    iss_assert_op		:2,
16365621Seschrock 	    iss_data_bytes		:2);
16373798Seschrock 	uint8_t		iss_sensor_reading;
16383798Seschrock 	uint16_t	iss_assert_state;	/* optional */
16393798Seschrock 	uint16_t	iss_deassert_state;	/* optional */
16403798Seschrock 	uint8_t		iss_event_data1;	/* optional */
16413798Seschrock 	uint8_t		iss_event_data2;	/* optional */
16423798Seschrock 	uint8_t		iss_event_data3;	/* optional */
16433798Seschrock } ipmi_set_sensor_reading_t;
16443798Seschrock 
16453798Seschrock extern int ipmi_set_sensor_reading(ipmi_handle_t *,
16463798Seschrock     ipmi_set_sensor_reading_t *);
16473798Seschrock 
16483798Seschrock /*
16495068Srobj  * These IPMI message id/opcodes are documented in Appendix G in the IPMI spec.
16505068Srobj  *
16515068Srobj  * Payloads for these two commands are described in Sections 34.1 and 34.2 of
16525068Srobj  * the spec, respectively.
16535068Srobj  */
16545068Srobj #define	IPMI_CMD_GET_FRU_INV_AREA	0x10
16555068Srobj #define	IPMI_CMD_READ_FRU_DATA		0x11
16565068Srobj 
16575068Srobj /*
16585068Srobj  * Structs to hold the FRU Common Header and the FRU Product Info Area, as
16595068Srobj  * described in the IPMI Platform Management FRU Information Storage
16605068Srobj  * Definition (v1.1).
16615068Srobj  */
16625068Srobj typedef struct ipmi_fru_hdr
16635068Srobj {
16645068Srobj 	uint8_t		ifh_format;
16655068Srobj 	uint8_t		ifh_int_use_off;
16665068Srobj 	uint8_t		ifh_chassis_info_off;
16675068Srobj 	uint8_t		ifh_board_info_off;
16685068Srobj 	uint8_t		ifh_product_info_off;
16695068Srobj 	uint8_t		ifh_multi_rec_off;
16705068Srobj 	uint8_t		ifh_pad;
16715068Srobj 	uint8_t		ifh_chksum;
16725068Srobj } ipmi_fru_hdr_t;
16735068Srobj 
16745068Srobj /*
16755068Srobj  * Because only 6 bits are used to specify the length of each field in the FRU
16765068Srobj  * product and board info areas, the biggest string we would ever need to hold
16775068Srobj  * would be 63 chars plus a NULL.
16785068Srobj  */
16795068Srobj #define	FRU_INFO_MAXLEN	64
16805068Srobj 
16815068Srobj typedef struct ipmi_fru_brd_info
16825068Srobj {
16835068Srobj 	char	ifbi_manuf_date[3];
16845068Srobj 	char	ifbi_manuf_name[FRU_INFO_MAXLEN];
16855068Srobj 	char	ifbi_board_name[FRU_INFO_MAXLEN];
16865068Srobj 	char	ifbi_product_serial[FRU_INFO_MAXLEN];
16875068Srobj 	char	ifbi_part_number[FRU_INFO_MAXLEN];
16885068Srobj } ipmi_fru_brd_info_t;
16895068Srobj 
16905068Srobj typedef struct ipmi_fru_prod_info
16915068Srobj {
16925068Srobj 	char	ifpi_manuf_name[FRU_INFO_MAXLEN];
16935068Srobj 	char	ifpi_product_name[FRU_INFO_MAXLEN];
16945068Srobj 	char	ifpi_part_number[FRU_INFO_MAXLEN];
16955068Srobj 	char	ifpi_product_version[FRU_INFO_MAXLEN];
16965068Srobj 	char	ifpi_product_serial[FRU_INFO_MAXLEN];
16975068Srobj 	char	ifpi_asset_tag[FRU_INFO_MAXLEN];
16985068Srobj } ipmi_fru_prod_info_t;
16995068Srobj 
17006070Srobj extern int ipmi_fru_read(ipmi_handle_t *, ipmi_sdr_fru_locator_t *, char **);
17016070Srobj extern int ipmi_fru_parse_board(ipmi_handle_t *, char *, ipmi_fru_brd_info_t *);
17026070Srobj extern int ipmi_fru_parse_product(ipmi_handle_t *, char *,
17036070Srobj     ipmi_fru_prod_info_t *);
17046070Srobj 
17056070Srobj /*
17066070Srobj  * Routines to convert from entity and sensors defines into text strings.
17076070Srobj  */
17086070Srobj void ipmi_entity_name(uint8_t, char *, size_t);
17096070Srobj void ipmi_sensor_type_name(uint8_t, char *, size_t);
17107243Srobj void ipmi_sensor_units_name(uint8_t, char *, size_t);
17116070Srobj void ipmi_sensor_reading_name(uint8_t, uint8_t, char *, size_t);
17126070Srobj 
17136070Srobj /*
17146070Srobj  * Entity management.  IPMI has a notion of 'entities', but these are not
17156070Srobj  * directly accessible from any commands.  Instead, their existence is inferred
17166070Srobj  * from examining the SDR repository.  Since this is rather unwieldy, and
17176070Srobj  * iterating over entities is a common operation, libipmi provides an entity
17186070Srobj  * abstraction that hides the implementation details.  This handles entity
17196070Srobj  * groupings as well as SDR associations.
17206070Srobj  */
17216070Srobj typedef struct ipmi_entity {
17226070Srobj 	uint8_t		ie_type;
17236070Srobj 	uint8_t		ie_instance;
17246070Srobj 	uint8_t		ie_children;
17256070Srobj 	boolean_t	ie_logical;
17266070Srobj } ipmi_entity_t;
17276070Srobj 
17286070Srobj extern int ipmi_entity_iter(ipmi_handle_t *, int (*)(ipmi_handle_t *,
17296070Srobj     ipmi_entity_t *, void *), void *);
17306070Srobj extern int ipmi_entity_iter_sdr(ipmi_handle_t *, ipmi_entity_t *,
17316070Srobj     int (*)(ipmi_handle_t *, ipmi_entity_t *, const char *, ipmi_sdr_t *,
17326070Srobj     void *), void *);
17336070Srobj extern int ipmi_entity_iter_children(ipmi_handle_t *, ipmi_entity_t *,
17346070Srobj     int (*)(ipmi_handle_t *, ipmi_entity_t *, void *), void *);
17356070Srobj extern ipmi_entity_t *ipmi_entity_lookup(ipmi_handle_t *, uint8_t,
17366070Srobj     uint8_t);
17376070Srobj extern ipmi_entity_t *ipmi_entity_lookup_sdr(ipmi_handle_t *, const char *);
17386070Srobj extern ipmi_entity_t *ipmi_entity_parent(ipmi_handle_t *, ipmi_entity_t *);
17396070Srobj extern int ipmi_entity_present(ipmi_handle_t *, ipmi_entity_t *, boolean_t *);
17406070Srobj extern int ipmi_entity_present_sdr(ipmi_handle_t *, ipmi_sdr_t *, boolean_t *);
17415068Srobj 
17425068Srobj /*
17435345Seschrock  * User management.  The raw functions are private to libipmi, and only the
17445345Seschrock  * higher level abstraction (ipmi_user_t) is exported to consumers of the
17455345Seschrock  * library.
17465345Seschrock  */
17475345Seschrock 
17485345Seschrock #define	IPMI_USER_PRIV_CALLBACK		0x1
17495345Seschrock #define	IPMI_USER_PRIV_USER		0x2
17505345Seschrock #define	IPMI_USER_PRIV_OPERATOR		0x3
17515345Seschrock #define	IPMI_USER_PRIV_ADMIN		0x4
17525345Seschrock #define	IPMI_USER_PRIV_OEM		0x5
17535345Seschrock #define	IPMI_USER_PRIV_NONE		0xf
17545345Seschrock 
17555345Seschrock typedef struct ipmi_user {
17565345Seschrock 	uint8_t		iu_uid;
17575345Seschrock 	char		*iu_name;
17585345Seschrock 	boolean_t	iu_enabled;
17595345Seschrock 	boolean_t	iu_ipmi_msg_enable;
17605345Seschrock 	boolean_t	iu_link_auth_enable;
17615345Seschrock 	uint8_t		iu_priv;
17625345Seschrock } ipmi_user_t;
17635345Seschrock 
17645345Seschrock extern int ipmi_user_iter(ipmi_handle_t *,
17655345Seschrock     int (*)(ipmi_user_t *, void *), void *);
17665345Seschrock extern ipmi_user_t *ipmi_user_lookup_name(ipmi_handle_t *, const char *);
17675345Seschrock extern ipmi_user_t *ipmi_user_lookup_id(ipmi_handle_t *, uint8_t);
17685345Seschrock extern int ipmi_user_set_password(ipmi_handle_t *, uint8_t, const char *);
17695345Seschrock 
17705345Seschrock /*
17713798Seschrock  * The remaining functions are private to the implementation of the Sun ILOM
17723798Seschrock  * service processor.  These function first check the manufacturer from the IPMI
17733798Seschrock  * device ID, and will return EIPMI_NOT_SUPPORTED if attempted for non-Sun
17743798Seschrock  * devices.
17753798Seschrock  */
177611756SRobert.Johnston@Sun.COM boolean_t ipmi_is_sun_ilom(ipmi_deviceid_t *);
17773798Seschrock 
17783798Seschrock /*
17793798Seschrock  * Sun OEM LED requests.
17803798Seschrock  */
17813798Seschrock 
17823798Seschrock #define	IPMI_SUNOEM_LED_MODE_OFF	0
17833798Seschrock #define	IPMI_SUNOEM_LED_MODE_ON		1
17843798Seschrock #define	IPMI_SUNOEM_LED_MODE_STANDBY	2
17853798Seschrock #define	IPMI_SUNOEM_LED_MODE_SLOW	3
17863798Seschrock #define	IPMI_SUNOEM_LED_MODE_FAST	4
17873798Seschrock 
17883798Seschrock /*
17893798Seschrock  * These functions take a SDR record and construct the appropriate form of the
17903798Seschrock  * above commands.
17913798Seschrock  */
17923798Seschrock extern int ipmi_sunoem_led_set(ipmi_handle_t *,
17933798Seschrock     ipmi_sdr_generic_locator_t *, uint8_t);
17943798Seschrock extern int ipmi_sunoem_led_get(ipmi_handle_t *,
17953798Seschrock     ipmi_sdr_generic_locator_t *, uint8_t *);
17963798Seschrock 
17973798Seschrock /*
17983798Seschrock  * Sun OEM uptime.  Note that the underlying command returns the uptime in big
17993798Seschrock  * endian form.  This wrapper automatically converts to the appropriate native
18003798Seschrock  * form.
18013798Seschrock  */
18023798Seschrock 
18033798Seschrock #define	IPMI_CMD_SUNOEM_UPTIME		0x08
18043798Seschrock 
18053798Seschrock extern int ipmi_sunoem_uptime(ipmi_handle_t *, uint32_t *, uint32_t *);
18063798Seschrock 
18073798Seschrock /*
18083798Seschrock  * Sun OEM FRU update.  The FRU information is managed through a generic
18093798Seschrock  * identifier, and then a type-specific data portion.  The wrapper function will
18103798Seschrock  * automatically fill in the data length field according to which type is
18113798Seschrock  * specified.
18123798Seschrock  */
18133798Seschrock 
18143798Seschrock #define	IPMI_CMD_SUNOEM_FRU_UPDATE	0x16
18153798Seschrock 
18163798Seschrock #define	IPMI_SUNOEM_FRU_DIMM	0x00
18173798Seschrock #define	IPMI_SUNOEM_FRU_CPU	0x01
18183798Seschrock #define	IPMI_SUNOEM_FRU_BIOS	0x02
18193798Seschrock #define	IPMI_SUNOEM_FRU_DISK	0x03
18203798Seschrock 
18213798Seschrock typedef struct ipmi_sunoem_fru {
18223798Seschrock 	uint8_t				isf_type;
18233798Seschrock 	uint8_t				isf_id;
18243798Seschrock 	uint8_t				isf_datalen;
18253798Seschrock 	union {
18263798Seschrock 		struct {
18273798Seschrock 			uint8_t		isf_data[128];
18283798Seschrock 		} dimm;
18293798Seschrock 		struct {
18303798Seschrock 			uint32_t	isf_thermtrip;
18313798Seschrock 			uint32_t	isf_eax;
18323798Seschrock 			char		isf_product[48];
18333798Seschrock 		} cpu;
18343798Seschrock 		struct {
18353798Seschrock 			char		isf_part[16];
18363798Seschrock 			char		isf_version[16];
18373798Seschrock 		} bios;
18383798Seschrock 		struct {
18393798Seschrock 			char		isf_manufacturer[16];
18403798Seschrock 			char		isf_model[28];
18413798Seschrock 			char		isf_serial[20];
18423798Seschrock 			char		isf_version[8];
18433798Seschrock 			char		isf_capacity[16];
18443798Seschrock 		} disk;
18453798Seschrock 	} isf_data;
18463798Seschrock } ipmi_sunoem_fru_t;
18473798Seschrock 
18483798Seschrock int ipmi_sunoem_update_fru(ipmi_handle_t *, ipmi_sunoem_fru_t *);
18493798Seschrock 
1850*12315SRobert.Johnston@Sun.COM #define	IPMI_CMD_CHASSIS_IDENTIFY	0x04
1851*12315SRobert.Johnston@Sun.COM int ipmi_chassis_identify(ipmi_handle_t *, boolean_t);
1852*12315SRobert.Johnston@Sun.COM 
18533798Seschrock #pragma pack()
18543798Seschrock 
18553798Seschrock #ifdef	__cplusplus
18563798Seschrock }
18573798Seschrock #endif
18583798Seschrock 
18593798Seschrock #endif	/* _LIBIPMI_H */
1860