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 /*
223798Seschrock  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
233798Seschrock  * Use is subject to license terms.
243798Seschrock  */
253798Seschrock 
263798Seschrock #ifndef	_LIBIPMI_H
273798Seschrock #define	_LIBIPMI_H
283798Seschrock 
293798Seschrock #pragma ident	"%Z%%M%	%I%	%E% SMI"
303798Seschrock 
313798Seschrock #include <sys/bmc_intf.h>
323798Seschrock #include <sys/byteorder.h>
33*5621Seschrock #include <sys/sysmacros.h>
343798Seschrock 
353798Seschrock /*
363798Seschrock  * Private interfaces for communicating with attached services over IPMI.  This
373798Seschrock  * library is designed for system software communicating with Sun-supported
383798Seschrock  * service processors over /dev/bmc.  It is not a generic IPMI library.
393798Seschrock  *
403798Seschrock  * Documentation references refer to "Intelligent Platform Management Interface
413798Seschrock  * Specification Second Generation v2.0", document revision 1.0 with Februrary
423798Seschrock  * 15, 2006 Markup from "IPMI v2.0 Addenda, Errata, and Clarifications Revision
433798Seschrock  * 3".
443798Seschrock  */
453798Seschrock 
463798Seschrock #ifdef	__cplusplus
473798Seschrock extern "C" {
483798Seschrock #endif
493798Seschrock 
503798Seschrock typedef struct ipmi_handle ipmi_handle_t;
513798Seschrock 
523798Seschrock #pragma pack(1)
533798Seschrock 
543798Seschrock /*
553798Seschrock  * Basic netfn definitions.  See section 5.1.
563798Seschrock  */
573798Seschrock #define	IPMI_NETFN_APP			BMC_NETFN_APP
583798Seschrock #define	IPMI_NETFN_STORAGE		BMC_NETFN_STORAGE
593798Seschrock #define	IPMI_NETFN_SE			BMC_NETFN_SE
603798Seschrock #define	IPMI_NETFN_OEM			0x2e
613798Seschrock 
623798Seschrock /*
633798Seschrock  * Error definitions
643798Seschrock  */
653798Seschrock #define	EIPMI_BASE	2000
663798Seschrock 
673798Seschrock enum {
683798Seschrock 	EIPMI_NOMEM = EIPMI_BASE,	/* memory allocation failure */
693798Seschrock 	EIPMI_BMC_OPEN_FAILED,		/* failed to open /dev/bmc */
703798Seschrock 	EIPMI_BMC_PUTMSG,		/* putmsg() failed */
713798Seschrock 	EIPMI_BMC_GETMSG,		/* getmsg() failed */
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 */
773798Seschrock 	EIPMI_UNSPECIFIED,		/* unspecified error */
783798Seschrock 	EIPMI_UNKNOWN,			/* unknown error */
793798Seschrock 	EIPMI_BAD_RESPONSE,		/* received unexpected response */
803798Seschrock 	EIPMI_BAD_RESPONSE_LENGTH,	/* unexpected response length */
813798Seschrock 	EIPMI_INVALID_RESERVATION,	/* invalid reservation */
823798Seschrock 	EIPMI_NOT_PRESENT,		/* requested entity not present */
833798Seschrock 	EIPMI_INVALID_REQUEST,		/* malformed request */
843798Seschrock 	EIPMI_BUSY,			/* SP is busy */
853798Seschrock 	EIPMI_NOSPACE,			/* SP is out of space */
863798Seschrock 	EIPMI_UNAVAILABLE,		/* SP is present but unavailable */
873798Seschrock 	EIPMI_ACCESS			/* insufficient privileges */
883798Seschrock };
893798Seschrock 
903798Seschrock /*
913798Seschrock  * Basic library functions.
923798Seschrock  *
933798Seschrock  * The ipmi_handle is the primary interface to the library.  The library itself
943798Seschrock  * is not MT-safe, but it is safe within a single handle.  Multithreaded clients
953798Seschrock  * should either open multiple handles, or otherwise synchronize access to the
963798Seschrock  * same handle.
973798Seschrock  *
983798Seschrock  * There is a single command response buffer that is stored with the handle, to
993798Seschrock  * simplify memory management in the caller.  The memory referenced by a command
1003798Seschrock  * response is only valid until the next command is issued.  The caller is
1013798Seschrock  * responsible for making a copy of the response if it is needed.
1023798Seschrock  */
1033798Seschrock extern ipmi_handle_t *ipmi_open(int *, char **);
1043798Seschrock extern void ipmi_close(ipmi_handle_t *);
1053798Seschrock 
1063798Seschrock extern int ipmi_errno(ipmi_handle_t *);
1073798Seschrock extern const char *ipmi_errmsg(ipmi_handle_t *);
1083798Seschrock 
1093798Seschrock /*
1103798Seschrock  * Raw requests.  See section 5.
1113798Seschrock  */
1123798Seschrock typedef struct ipmi_cmd {
1133798Seschrock 	uint8_t		ic_netfn:6;
1143798Seschrock 	uint8_t		ic_lun:2;
1153798Seschrock 	uint8_t		ic_cmd;
1163798Seschrock 	uint16_t	ic_dlen;
1173798Seschrock 	void		*ic_data;
1183798Seschrock } ipmi_cmd_t;
1193798Seschrock 
1203798Seschrock extern ipmi_cmd_t *ipmi_send(ipmi_handle_t *, ipmi_cmd_t *);
1213798Seschrock 
1223798Seschrock /*
1233798Seschrock  * Retrieve basic information about the IPMI device.  See section 20.1 "Get
1243798Seschrock  * Device ID Command".
1253798Seschrock  */
1263798Seschrock #define	IPMI_CMD_GET_DEVICEID		0x01
1273798Seschrock 
1283798Seschrock typedef struct ipmi_deviceid {
1293798Seschrock 	uint8_t		id_devid;
130*5621Seschrock 	DECL_BITFIELD3(
131*5621Seschrock 	    id_dev_rev		:4,
132*5621Seschrock 	    __reserved		:3,
133*5621Seschrock 	    id_dev_sdrs		:1);
134*5621Seschrock 	DECL_BITFIELD2(
135*5621Seschrock 	    id_firm_major	:7,
136*5621Seschrock 	    id_dev_available	:1);
1373798Seschrock 	uint8_t		id_firm_minor;
1383798Seschrock 	uint8_t		id_ipmi_rev;
1393798Seschrock 	uint8_t		id_dev_support;
1403798Seschrock 	uint8_t		id_manufacturer[3];
1413798Seschrock 	uint16_t	id_product;
1423798Seschrock } ipmi_deviceid_t;
1433798Seschrock 
1443798Seschrock #define	IPMI_OEM_SUN	0x2a
1453798Seschrock 
1463798Seschrock ipmi_deviceid_t *ipmi_get_deviceid(ipmi_handle_t *);
1473798Seschrock 
1483798Seschrock #define	ipmi_devid_manufacturer(dp)		\
1493798Seschrock 	((dp)->id_manufacturer[0] |		\
1503798Seschrock 	((dp)->id_manufacturer[1] << 8) |	\
1513798Seschrock 	((dp)->id_manufacturer[2] << 16))
1523798Seschrock 
1533798Seschrock /*
1543798Seschrock  * SDR (Sensor Device Record) requests.  A cache of the current SDR repository
1553798Seschrock  * is kept as part of the IPMI handle and updated when necessary.  Routines to
1563798Seschrock  * access the raw SDR repository are also provided.
1573798Seschrock  */
1583798Seschrock 
1593798Seschrock /*
1603798Seschrock  * Reserve repository command.  See section 33.11.
1613798Seschrock  */
1623798Seschrock #define	IPMI_CMD_RESERVE_SDR_REPOSITORY	0x22
1633798Seschrock 
1643798Seschrock /*
1653798Seschrock  * Get SDR command.  See section 33.12.  This command accesses the raw SDR
1663798Seschrock  * repository.  Clients can also use the lookup functions to retrieve a
1673798Seschrock  * particular SDR record by name.
1683798Seschrock  *
1693798Seschrock  * The list of possible types is indicated in the sub-chapters of section 43.
1703798Seschrock  */
1713798Seschrock typedef struct ipmi_sdr {
1723798Seschrock 	uint16_t	is_id;
1733798Seschrock 	uint8_t		is_version;
1743798Seschrock 	uint8_t		is_type;
1753798Seschrock 	uint8_t		is_length;
1763798Seschrock 	uint8_t		is_record[1];
1773798Seschrock } ipmi_sdr_t;
1783798Seschrock #define	IPMI_CMD_GET_SDR		0x23
1793798Seschrock 
1803798Seschrock #define	IPMI_SDR_FIRST			0x0000
1813798Seschrock #define	IPMI_SDR_LAST			0xFFFF
1823798Seschrock 
1833798Seschrock extern ipmi_sdr_t *ipmi_sdr_get(ipmi_handle_t *, uint16_t, uint16_t *);
1843798Seschrock 
1853798Seschrock /*
1863798Seschrock  * Generic Device Locator Record.  See section 43.7.
1873798Seschrock  */
1883798Seschrock 
1893798Seschrock #define	IPMI_SDR_TYPE_GENERIC_LOCATOR		0x10
1903798Seschrock 
1913798Seschrock typedef struct ipmi_sdr_generic_locator {
1923798Seschrock 	/* RECORD KEY BYTES */
193*5621Seschrock 	DECL_BITFIELD2(
194*5621Seschrock 	    __reserved1		:1,
195*5621Seschrock 	    is_gl_accessaddr	:7);
196*5621Seschrock 	DECL_BITFIELD2(
197*5621Seschrock 	    is_gl_channel_msb	:1,
198*5621Seschrock 	    is_gl_slaveaddr	:7);
199*5621Seschrock 	DECL_BITFIELD3(
200*5621Seschrock 	    is_gl_bus		:3,
201*5621Seschrock 	    is_gl_lun		:2,
202*5621Seschrock 	    is_gl_channel	:3);
2033798Seschrock 	/* RECORD BODY BYTES */
204*5621Seschrock 	DECL_BITFIELD2(
205*5621Seschrock 	    is_gl_span		:3,
206*5621Seschrock 	    __reserved2		:5);
2073798Seschrock 	uint8_t		__reserved3;
2083798Seschrock 	uint8_t		is_gl_type;
2093798Seschrock 	uint8_t		is_gl_modifier;
2103798Seschrock 	uint8_t		is_gl_entity;
2113798Seschrock 	uint8_t		is_gl_instance;
2123798Seschrock 	uint8_t		is_gl_oem;
213*5621Seschrock 	DECL_BITFIELD2(
214*5621Seschrock 	    is_gl_idlen		:6,
215*5621Seschrock 	    is_gl_idtype	:2);
2163798Seschrock 	char		is_gl_idstring[1];
2173798Seschrock } ipmi_sdr_generic_locator_t;
2183798Seschrock 
2193798Seschrock /*
2203798Seschrock  * FRU Device Locator Record.  See section 43.8.
2213798Seschrock  */
2223798Seschrock 
2233798Seschrock #define	IPMI_SDR_TYPE_FRU_LOCATOR		0x11
2243798Seschrock 
2253798Seschrock typedef struct ipmi_sdr_fru_locator {
2263798Seschrock 	/* RECORD KEY BYTES */
227*5621Seschrock 	DECL_BITFIELD2(
228*5621Seschrock 	    __reserved1		:1,
229*5621Seschrock 	    is_fl_accessaddr	:7);
2303798Seschrock 	union {
2313798Seschrock 		struct {
2323798Seschrock 			uint8_t	_is_fl_devid;
2333798Seschrock 		} _logical;
2343798Seschrock 		struct {
235*5621Seschrock 			DECL_BITFIELD2(
236*5621Seschrock 			    __reserved		:1,
237*5621Seschrock 			    _is_fl_slaveaddr	:7);
2383798Seschrock 		} _nonintelligent;
2393798Seschrock 	} _devid_or_slaveaddr;
240*5621Seschrock 	DECL_BITFIELD4(
241*5621Seschrock 	    is_fl_bus		:3,
242*5621Seschrock 	    is_fl_lun		:2,
243*5621Seschrock 	    __reserved2		:2,
244*5621Seschrock 	    is_fl_logical	:1);
245*5621Seschrock 	DECL_BITFIELD2(
246*5621Seschrock 	    __reserved3		:4,
247*5621Seschrock 	    is_fl_channel	:4);
2483798Seschrock 	/* RECORD BODY BYTES */
2493798Seschrock 	uint8_t		__reserved4;
2503798Seschrock 	uint8_t		is_fl_type;
2513798Seschrock 	uint8_t		is_fl_modifier;
2523798Seschrock 	uint8_t		is_fl_entity;
2533798Seschrock 	uint8_t		is_fl_instance;
2543798Seschrock 	uint8_t		is_fl_oem;
255*5621Seschrock 	DECL_BITFIELD2(
256*5621Seschrock 	    is_fl_idlen		:6,
257*5621Seschrock 	    is_fl_idtype	:2);
2583798Seschrock 	char		is_fl_idstring[1];
2593798Seschrock } ipmi_sdr_fru_locator_t;
2603798Seschrock 
2613798Seschrock #define	is_fl_devid	_devid_or_slaveaddr._logical._is_fl_devid
2623798Seschrock #define	is_fl_slaveaddr	_devid_or_slaveaddr._nonintelligent._is_fl_slaveaddr
2633798Seschrock 
2643798Seschrock /*
2653798Seschrock  * The remaining SDR types do not have an associated structure, yet.
2663798Seschrock  */
2673798Seschrock #define	IPMI_SDR_TYPE_FULL_SENSOR		0x01
2683798Seschrock #define	IPMI_SDR_TYPE_COMPACT_SENSOR		0x02
2693798Seschrock #define	IPMI_SDR_TYPE_EVENT_ONLY		0x03
2703798Seschrock #define	IPMI_SDR_TYPE_ENTITY_ASSOCIATION	0x08
2713798Seschrock #define	IPMI_SDR_TYPE_DEVICE_RELATIVE		0x09
2723798Seschrock #define	IPMI_SDR_TYPE_MANAGEMENT_DEVICE		0x12
2733798Seschrock #define	IPMI_SDR_TYPE_MANAGEMENT_CONFIRMATION	0x13
2743798Seschrock #define	IPMI_SDR_TYPE_BMC_MESSAGE_CHANNEL	0x14
2753798Seschrock #define	IPMI_SDR_TYPE_OEM			0xC0
2763798Seschrock 
2773798Seschrock /*
2783798Seschrock  * Lookup the given sensor type by name.  These functions automatically read in
2793798Seschrock  * and cache the complete SDR repository.
2803798Seschrock  */
2813798Seschrock extern ipmi_sdr_fru_locator_t *ipmi_sdr_lookup_fru(ipmi_handle_t *,
2823798Seschrock     const char *);
2833798Seschrock extern ipmi_sdr_generic_locator_t *ipmi_sdr_lookup_generic(ipmi_handle_t *,
2843798Seschrock     const char *);
2853798Seschrock 
2863798Seschrock /*
2873798Seschrock  * Get Sensor Reading.  See section 35.14.
2883798Seschrock  */
2893798Seschrock 
2903798Seschrock #define	IPMI_CMD_GET_SENSOR_READING	0x2d
2913798Seschrock 
2923798Seschrock typedef struct ipmi_sensor_reading {
2933798Seschrock 	uint8_t		isr_reading;
294*5621Seschrock 	DECL_BITFIELD4(
295*5621Seschrock 	    __reserved1			:5,
296*5621Seschrock 	    isr_state_unavailable	:1,
297*5621Seschrock 	    isr_scanning_disabled	:1,
298*5621Seschrock 	    isr_event_disabled		:1);
2993798Seschrock 	uint16_t	isr_state;
3003798Seschrock } ipmi_sensor_reading_t;
3013798Seschrock 
3023798Seschrock extern ipmi_sensor_reading_t *ipmi_get_sensor_reading(ipmi_handle_t *, uint8_t);
3033798Seschrock 
3043798Seschrock /*
3053798Seschrock  * Set Sensor Reading.  See section 35.14.
3063798Seschrock  */
3073798Seschrock #define	IPMI_CMD_SET_SENSOR_READING	0x30
3083798Seschrock 
3093798Seschrock #define	IPMI_SENSOR_OP_CLEAR	0x3	/* clear '0' bits */
3103798Seschrock #define	IPMI_SENSOR_OP_SET	0x2	/* set '1' bits */
3113798Seschrock #define	IPMI_SENSOR_OP_EXACT	0x1	/* set bits exactly */
3123798Seschrock 
3133798Seschrock typedef struct ipmi_set_sensor_reading {
3143798Seschrock 	uint8_t		iss_id;
315*5621Seschrock 	DECL_BITFIELD5(
316*5621Seschrock 	    iss_set_reading		:1,
317*5621Seschrock 	    __reserved			:1,
318*5621Seschrock 	    iss_deassrt_op		:2,
319*5621Seschrock 	    iss_assert_op		:2,
320*5621Seschrock 	    iss_data_bytes		:2);
3213798Seschrock 	uint8_t		iss_sensor_reading;
3223798Seschrock 	uint16_t	iss_assert_state;	/* optional */
3233798Seschrock 	uint16_t	iss_deassert_state;	/* optional */
3243798Seschrock 	uint8_t		iss_event_data1;	/* optional */
3253798Seschrock 	uint8_t		iss_event_data2;	/* optional */
3263798Seschrock 	uint8_t		iss_event_data3;	/* optional */
3273798Seschrock } ipmi_set_sensor_reading_t;
3283798Seschrock 
3293798Seschrock extern int ipmi_set_sensor_reading(ipmi_handle_t *,
3303798Seschrock     ipmi_set_sensor_reading_t *);
3313798Seschrock 
3323798Seschrock /*
3335068Srobj  * These IPMI message id/opcodes are documented in Appendix G in the IPMI spec.
3345068Srobj  *
3355068Srobj  * Payloads for these two commands are described in Sections 34.1 and 34.2 of
3365068Srobj  * the spec, respectively.
3375068Srobj  */
3385068Srobj #define	IPMI_CMD_GET_FRU_INV_AREA	0x10
3395068Srobj #define	IPMI_CMD_READ_FRU_DATA		0x11
3405068Srobj 
3415068Srobj /*
3425068Srobj  * Structs to hold the FRU Common Header and the FRU Product Info Area, as
3435068Srobj  * described in the IPMI Platform Management FRU Information Storage
3445068Srobj  * Definition (v1.1).
3455068Srobj  */
3465068Srobj typedef struct ipmi_fru_hdr
3475068Srobj {
3485068Srobj 	uint8_t		ifh_format;
3495068Srobj 	uint8_t		ifh_int_use_off;
3505068Srobj 	uint8_t		ifh_chassis_info_off;
3515068Srobj 	uint8_t		ifh_board_info_off;
3525068Srobj 	uint8_t		ifh_product_info_off;
3535068Srobj 	uint8_t		ifh_multi_rec_off;
3545068Srobj 	uint8_t		ifh_pad;
3555068Srobj 	uint8_t		ifh_chksum;
3565068Srobj } ipmi_fru_hdr_t;
3575068Srobj 
3585068Srobj /*
3595068Srobj  * Because only 6 bits are used to specify the length of each field in the FRU
3605068Srobj  * product and board info areas, the biggest string we would ever need to hold
3615068Srobj  * would be 63 chars plus a NULL.
3625068Srobj  */
3635068Srobj #define	FRU_INFO_MAXLEN	64
3645068Srobj 
3655068Srobj typedef struct ipmi_fru_brd_info
3665068Srobj {
3675068Srobj 	char	ifbi_manuf_date[3];
3685068Srobj 	char	ifbi_manuf_name[FRU_INFO_MAXLEN];
3695068Srobj 	char	ifbi_board_name[FRU_INFO_MAXLEN];
3705068Srobj 	char	ifbi_product_serial[FRU_INFO_MAXLEN];
3715068Srobj 	char	ifbi_part_number[FRU_INFO_MAXLEN];
3725068Srobj } ipmi_fru_brd_info_t;
3735068Srobj 
3745068Srobj typedef struct ipmi_fru_prod_info
3755068Srobj {
3765068Srobj 	char	ifpi_manuf_name[FRU_INFO_MAXLEN];
3775068Srobj 	char	ifpi_product_name[FRU_INFO_MAXLEN];
3785068Srobj 	char	ifpi_part_number[FRU_INFO_MAXLEN];
3795068Srobj 	char	ifpi_product_version[FRU_INFO_MAXLEN];
3805068Srobj 	char	ifpi_product_serial[FRU_INFO_MAXLEN];
3815068Srobj 	char	ifpi_asset_tag[FRU_INFO_MAXLEN];
3825068Srobj } ipmi_fru_prod_info_t;
3835068Srobj 
3845068Srobj int ipmi_fru_read(ipmi_handle_t *, ipmi_sdr_fru_locator_t *, char **);
3855068Srobj int ipmi_fru_parse_board(ipmi_handle_t *, char *, ipmi_fru_brd_info_t *);
3865068Srobj int ipmi_fru_parse_product(ipmi_handle_t *, char *, ipmi_fru_prod_info_t *);
3875068Srobj 
3885068Srobj /*
3895345Seschrock  * User management.  The raw functions are private to libipmi, and only the
3905345Seschrock  * higher level abstraction (ipmi_user_t) is exported to consumers of the
3915345Seschrock  * library.
3925345Seschrock  */
3935345Seschrock 
3945345Seschrock #define	IPMI_USER_PRIV_CALLBACK		0x1
3955345Seschrock #define	IPMI_USER_PRIV_USER		0x2
3965345Seschrock #define	IPMI_USER_PRIV_OPERATOR		0x3
3975345Seschrock #define	IPMI_USER_PRIV_ADMIN		0x4
3985345Seschrock #define	IPMI_USER_PRIV_OEM		0x5
3995345Seschrock #define	IPMI_USER_PRIV_NONE		0xf
4005345Seschrock 
4015345Seschrock typedef struct ipmi_user {
4025345Seschrock 	uint8_t		iu_uid;
4035345Seschrock 	char		*iu_name;
4045345Seschrock 	boolean_t	iu_enabled;
4055345Seschrock 	boolean_t	iu_ipmi_msg_enable;
4065345Seschrock 	boolean_t	iu_link_auth_enable;
4075345Seschrock 	uint8_t		iu_priv;
4085345Seschrock 	struct ipmi_user *iu_next;
4095345Seschrock } ipmi_user_t;
4105345Seschrock 
4115345Seschrock extern int ipmi_user_iter(ipmi_handle_t *,
4125345Seschrock     int (*)(ipmi_user_t *, void *), void *);
4135345Seschrock extern ipmi_user_t *ipmi_user_lookup_name(ipmi_handle_t *, const char *);
4145345Seschrock extern ipmi_user_t *ipmi_user_lookup_id(ipmi_handle_t *, uint8_t);
4155345Seschrock extern int ipmi_user_set_password(ipmi_handle_t *, uint8_t, const char *);
4165345Seschrock 
4175345Seschrock /*
4183798Seschrock  * The remaining functions are private to the implementation of the Sun ILOM
4193798Seschrock  * service processor.  These function first check the manufacturer from the IPMI
4203798Seschrock  * device ID, and will return EIPMI_NOT_SUPPORTED if attempted for non-Sun
4213798Seschrock  * devices.
4223798Seschrock  */
4233798Seschrock 
4243798Seschrock /*
4253798Seschrock  * Sun OEM LED requests.
4263798Seschrock  */
4273798Seschrock 
4283798Seschrock #define	IPMI_SUNOEM_LED_MODE_OFF	0
4293798Seschrock #define	IPMI_SUNOEM_LED_MODE_ON		1
4303798Seschrock #define	IPMI_SUNOEM_LED_MODE_STANDBY	2
4313798Seschrock #define	IPMI_SUNOEM_LED_MODE_SLOW	3
4323798Seschrock #define	IPMI_SUNOEM_LED_MODE_FAST	4
4333798Seschrock 
4343798Seschrock /*
4353798Seschrock  * These functions take a SDR record and construct the appropriate form of the
4363798Seschrock  * above commands.
4373798Seschrock  */
4383798Seschrock extern int ipmi_sunoem_led_set(ipmi_handle_t *,
4393798Seschrock     ipmi_sdr_generic_locator_t *, uint8_t);
4403798Seschrock extern int ipmi_sunoem_led_get(ipmi_handle_t *,
4413798Seschrock     ipmi_sdr_generic_locator_t *, uint8_t *);
4423798Seschrock 
4433798Seschrock /*
4443798Seschrock  * Sun OEM uptime.  Note that the underlying command returns the uptime in big
4453798Seschrock  * endian form.  This wrapper automatically converts to the appropriate native
4463798Seschrock  * form.
4473798Seschrock  */
4483798Seschrock 
4493798Seschrock #define	IPMI_CMD_SUNOEM_UPTIME		0x08
4503798Seschrock 
4513798Seschrock extern int ipmi_sunoem_uptime(ipmi_handle_t *, uint32_t *, uint32_t *);
4523798Seschrock 
4533798Seschrock /*
4543798Seschrock  * Sun OEM FRU update.  The FRU information is managed through a generic
4553798Seschrock  * identifier, and then a type-specific data portion.  The wrapper function will
4563798Seschrock  * automatically fill in the data length field according to which type is
4573798Seschrock  * specified.
4583798Seschrock  */
4593798Seschrock 
4603798Seschrock #define	IPMI_CMD_SUNOEM_FRU_UPDATE	0x16
4613798Seschrock 
4623798Seschrock #define	IPMI_SUNOEM_FRU_DIMM	0x00
4633798Seschrock #define	IPMI_SUNOEM_FRU_CPU	0x01
4643798Seschrock #define	IPMI_SUNOEM_FRU_BIOS	0x02
4653798Seschrock #define	IPMI_SUNOEM_FRU_DISK	0x03
4663798Seschrock 
4673798Seschrock typedef struct ipmi_sunoem_fru {
4683798Seschrock 	uint8_t				isf_type;
4693798Seschrock 	uint8_t				isf_id;
4703798Seschrock 	uint8_t				isf_datalen;
4713798Seschrock 	union {
4723798Seschrock 		struct {
4733798Seschrock 			uint8_t		isf_data[128];
4743798Seschrock 		} dimm;
4753798Seschrock 		struct {
4763798Seschrock 			uint32_t	isf_thermtrip;
4773798Seschrock 			uint32_t	isf_eax;
4783798Seschrock 			char		isf_product[48];
4793798Seschrock 		} cpu;
4803798Seschrock 		struct {
4813798Seschrock 			char		isf_part[16];
4823798Seschrock 			char		isf_version[16];
4833798Seschrock 		} bios;
4843798Seschrock 		struct {
4853798Seschrock 			char		isf_manufacturer[16];
4863798Seschrock 			char		isf_model[28];
4873798Seschrock 			char		isf_serial[20];
4883798Seschrock 			char		isf_version[8];
4893798Seschrock 			char		isf_capacity[16];
4903798Seschrock 		} disk;
4913798Seschrock 	} isf_data;
4923798Seschrock } ipmi_sunoem_fru_t;
4933798Seschrock 
4943798Seschrock int ipmi_sunoem_update_fru(ipmi_handle_t *, ipmi_sunoem_fru_t *);
4953798Seschrock 
4963798Seschrock #pragma pack()
4973798Seschrock 
4983798Seschrock #ifdef	__cplusplus
4993798Seschrock }
5003798Seschrock #endif
5013798Seschrock 
5023798Seschrock #endif	/* _LIBIPMI_H */
503