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