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