1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 /* 22 * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 23 * Use is subject to license terms. 24 */ 25 26 #ifndef _LIBIPMI_H 27 #define _LIBIPMI_H 28 29 #pragma ident "%Z%%M% %I% %E% SMI" 30 31 #include <sys/bmc_intf.h> 32 #include <sys/byteorder.h> 33 #include <sys/sysmacros.h> 34 35 /* 36 * Private interfaces for communicating with attached services over IPMI. This 37 * library is designed for system software communicating with Sun-supported 38 * service processors over /dev/bmc. It is not a generic IPMI library. 39 * 40 * Documentation references refer to "Intelligent Platform Management Interface 41 * Specification Second Generation v2.0", document revision 1.0 with Februrary 42 * 15, 2006 Markup from "IPMI v2.0 Addenda, Errata, and Clarifications Revision 43 * 3". 44 */ 45 46 #ifdef __cplusplus 47 extern "C" { 48 #endif 49 50 typedef struct ipmi_handle ipmi_handle_t; 51 52 #pragma pack(1) 53 54 /* 55 * Basic netfn definitions. See section 5.1. 56 */ 57 #define IPMI_NETFN_APP BMC_NETFN_APP 58 #define IPMI_NETFN_STORAGE BMC_NETFN_STORAGE 59 #define IPMI_NETFN_SE BMC_NETFN_SE 60 #define IPMI_NETFN_OEM 0x2e 61 62 /* 63 * Error definitions 64 */ 65 #define EIPMI_BASE 2000 66 67 typedef enum { 68 EIPMI_NOMEM = EIPMI_BASE, /* memory allocation failure */ 69 EIPMI_BMC_OPEN_FAILED, /* failed to open /dev/bmc */ 70 EIPMI_BMC_PUTMSG, /* failed to send message to /dev/bmc */ 71 EIPMI_BMC_GETMSG, /* failed to read response from /dev/bmc */ 72 EIPMI_BMC_RESPONSE, /* response from /dev/bmc failed */ 73 EIPMI_INVALID_COMMAND, /* invalid command */ 74 EIPMI_COMMAND_TIMEOUT, /* command timeout */ 75 EIPMI_DATA_LENGTH_EXCEEDED, /* maximum data length exceeded */ 76 EIPMI_SEND_FAILED, /* failed to send BMC request */ 77 EIPMI_UNSPECIFIED, /* unspecified BMC error */ 78 EIPMI_UNKNOWN, /* unknown error */ 79 EIPMI_BAD_RESPONSE, /* received unexpected response */ 80 EIPMI_BAD_RESPONSE_LENGTH, /* unexpected response length */ 81 EIPMI_INVALID_RESERVATION, /* invalid or cancelled reservation */ 82 EIPMI_NOT_PRESENT, /* requested entity not present */ 83 EIPMI_INVALID_REQUEST, /* malformed request data */ 84 EIPMI_BUSY, /* service processor is busy */ 85 EIPMI_NOSPACE, /* service processor is out of space */ 86 EIPMI_UNAVAILABLE, /* service processor is unavailable */ 87 EIPMI_ACCESS /* insufficient privileges */ 88 } ipmi_errno_t; 89 90 /* 91 * Basic library functions. 92 * 93 * The ipmi_handle is the primary interface to the library. The library itself 94 * is not MT-safe, but it is safe within a single handle. Multithreaded clients 95 * should either open multiple handles, or otherwise synchronize access to the 96 * same handle. 97 * 98 * There is a single command response buffer that is stored with the handle, to 99 * simplify memory management in the caller. The memory referenced by a command 100 * response is only valid until the next command is issued. The caller is 101 * responsible for making a copy of the response if it is needed. 102 */ 103 extern ipmi_handle_t *ipmi_open(int *, char **); 104 extern void ipmi_close(ipmi_handle_t *); 105 106 extern int ipmi_errno(ipmi_handle_t *); 107 extern const char *ipmi_errmsg(ipmi_handle_t *); 108 109 /* 110 * Raw requests. See section 5. 111 */ 112 typedef struct ipmi_cmd { 113 uint8_t ic_netfn:6; 114 uint8_t ic_lun:2; 115 uint8_t ic_cmd; 116 uint16_t ic_dlen; 117 void *ic_data; 118 } ipmi_cmd_t; 119 120 extern ipmi_cmd_t *ipmi_send(ipmi_handle_t *, ipmi_cmd_t *); 121 122 /* 123 * Retrieve basic information about the IPMI device. See section 20.1 "Get 124 * Device ID Command". 125 */ 126 #define IPMI_CMD_GET_DEVICEID 0x01 127 128 typedef struct ipmi_deviceid { 129 uint8_t id_devid; 130 DECL_BITFIELD3( 131 id_dev_rev :4, 132 __reserved :3, 133 id_dev_sdrs :1); 134 DECL_BITFIELD2( 135 id_firm_major :7, 136 id_dev_available :1); 137 uint8_t id_firm_minor; 138 uint8_t id_ipmi_rev; 139 uint8_t id_dev_support; 140 uint8_t id_manufacturer[3]; 141 uint16_t id_product; 142 } ipmi_deviceid_t; 143 144 #define IPMI_OEM_SUN 0x2a 145 #define IPMI_PROD_SUN_ILOM 0x4701 146 147 ipmi_deviceid_t *ipmi_get_deviceid(ipmi_handle_t *); 148 149 #define ipmi_devid_manufacturer(dp) \ 150 ((dp)->id_manufacturer[0] | \ 151 ((dp)->id_manufacturer[1] << 8) | \ 152 ((dp)->id_manufacturer[2] << 16)) 153 154 const char *ipmi_firmware_version(ipmi_handle_t *); 155 156 /* 157 * SEL (System Event Log) commands. Currently the library only provides 158 * commands for reading the SEL. 159 */ 160 161 /* 162 * 31.2 Get SEL Info Command 163 */ 164 #define IPMI_CMD_GET_SEL_INFO 0x40 165 166 typedef struct ipmi_sel_info { 167 uint8_t isel_version; 168 uint16_t isel_entries; 169 uint16_t isel_free; 170 uint32_t isel_add_ts; 171 uint32_t isel_erase_ts; 172 DECL_BITFIELD6( 173 isel_supp_allocation :1, 174 isel_supp_reserve :1, 175 isel_supp_partial :1, 176 isel_supp_delete :1, 177 __reserved :3, 178 isel_overflow :1); 179 } ipmi_sel_info_t; 180 181 extern ipmi_sel_info_t *ipmi_sel_get_info(ipmi_handle_t *); 182 extern boolean_t ipmi_sdr_changed(ipmi_handle_t *); 183 extern int ipmi_sdr_refresh(ipmi_handle_t *); 184 185 /* 186 * 32.1 SEL Event Records 187 */ 188 typedef struct ipmi_sel_event { 189 uint16_t isel_ev_next; 190 uint16_t isel_ev_recid; 191 uint8_t isel_ev_rectype; 192 uint32_t isel_ev_ts; 193 DECL_BITFIELD2( 194 isel_ev_software :1, 195 isel_ev_addr_or_id :7); 196 DECL_BITFIELD3( 197 isel_ev_lun :2, 198 __reserved :2, 199 isel_ev_channel :4); 200 uint8_t isel_ev_rev; 201 uint8_t isel_ev_sensor_type; 202 uint8_t isel_ev_sensor_number; 203 DECL_BITFIELD2( 204 isel_ev_type :7, 205 isel_ev_dir :1); 206 uint8_t isel_ev_data[3]; 207 } ipmi_sel_event_t; 208 209 #define IPMI_EV_REV15 0x04 210 #define IPMI_EV_REV1 0x03 211 212 #define IPMI_SEL_SYSTEM 0x02 213 #define IPMI_SEL_OEMTS_LO 0xC0 214 #define IPMI_SEL_OEMTS_HI 0xDF 215 #define IPMI_SEL_OEM_LO 0xE0 216 #define IPMI_SEL_OEM_HI 0xFF 217 218 #define IPMI_EV_ASSERT 0x0 219 #define IPMI_EV_DEASSERT 0x1 220 221 /* 222 * 32.2 OEM SEL Record (with timestamp) 223 */ 224 typedef struct ipmi_sel_oem_ts { 225 uint16_t isel_oem_next; 226 uint16_t isel_oem_id; 227 uint8_t isel_oem_type; 228 uint32_t isel_oem_ts; 229 uint8_t isel_oem_devid[3]; 230 uint8_t isel_oem_data[6]; 231 } ipmi_sel_oem_ts_t; 232 233 /* 234 * 32.3 OEM SEL Record (no timestamp) 235 */ 236 typedef struct ipmi_sel_oem { 237 uint16_t isel_oem_next; 238 uint16_t isel_oem_id; 239 uint8_t isel_oem_type; 240 uint8_t isel_oem_data[13]; 241 } ipmi_sel_oem_t; 242 243 /* 244 * 29.7 Event Data Field Formats. Consumers can cast the data field of the 245 * event record to the appropriate type depending on the sensor class. 246 */ 247 248 typedef struct ipmi_event_threshold { 249 DECL_BITFIELD3( 250 iev_offset :4, 251 iev_desc_byte3 :2, 252 iev_desc_byte2 :2); 253 uint8_t iev_reading; 254 uint8_t iev_threshold; 255 } ipmi_event_threshold_t; 256 257 #define IPMI_EV_DESC_UNSPECIFIED 0x00 258 #define IPMI_EV_DESC_TRIGGER 0x01 259 #define IPMI_EV_DESC_OEM 0x02 260 #define IPMI_EV_DESC_SPECIFIC 0x03 261 262 typedef struct ipmi_event_discrete { 263 DECL_BITFIELD3( 264 iev_offset :4, 265 iev_desc_byte3 :2, 266 iev_desc_byte2 :2); 267 DECL_BITFIELD2( 268 iev_offset_type :4, 269 iev_offset_severity :4); 270 uint8_t iev_oem_code; 271 } ipmi_event_discrete_t; 272 273 #define IPMI_EV_DESC_PREVSTATE 0x01 274 #define IPMI_EV_DESC_SPECIFIC 0x03 275 276 typedef struct ipmi_event_oem { 277 DECL_BITFIELD3( 278 iev_offset :4, 279 iev_desc_byte3 :2, 280 iev_desc_byte2 :2); 281 DECL_BITFIELD2( 282 iev_offset_type :4, 283 iev_offset_severity :4); 284 uint8_t iev_oem_code; 285 } ipmi_event_oem_t; 286 287 /* 288 * Get SEL Entry Command. See section 31.5. We don't support partial reads, so 289 * this interface is quite a bit simpler than in the spec. We default to 290 * returning event records, though the consumer should check the type field and 291 * cast it to the appropriate type if it is no IPMI_SEL_SYSTEM. 292 */ 293 #define IPMI_CMD_GET_SEL_ENTRY 0x43 294 295 extern ipmi_sel_event_t *ipmi_sel_get_entry(ipmi_handle_t *, uint16_t); 296 297 #define IPMI_SEL_FIRST_ENTRY 0x0000 298 #define IPMI_SEL_LAST_ENTRY 0xFFFF 299 300 /* 301 * SEL time management. See sections 31.10 and 31.11. 302 */ 303 #define IPMI_CMD_GET_SEL_TIME 0x48 304 #define IPMI_CMD_SET_SEL_TIME 0x49 305 #define IPMI_CMD_GET_SEL_UTC_OFFSET 0x5C 306 #define IPMI_CMD_SET_SEL_UTC_OFFSET 0x5D 307 308 extern int ipmi_sel_get_time(ipmi_handle_t *, uint32_t *); 309 extern int ipmi_sel_set_time(ipmi_handle_t *, uint32_t); 310 extern int ipmi_sel_get_utc_offset(ipmi_handle_t *, int *); 311 extern int ipmi_sel_set_utc_offset(ipmi_handle_t *, int); 312 313 /* 314 * SDR (Sensor Device Record) requests. A cache of the current SDR repository 315 * is kept as part of the IPMI handle and updated when necessary. This does the 316 * work of processing the SDR names and providing an easy way to lookup 317 * individual records and iterate over all records. 318 */ 319 320 /* 321 * Get SDR Repository Info Command. See section 33.9. 322 */ 323 #define IPMI_CMD_GET_SDR_INFO 0x20 324 325 typedef struct ipmi_sdr_info { 326 uint8_t isi_version; 327 uint16_t isi_record_count; 328 uint16_t isi_free_space; 329 uint32_t isi_add_ts; 330 uint32_t isi_erase_ts; 331 DECL_BITFIELD7( 332 isi_supp_allocation :1, 333 isi_supp_reserve :1, 334 isi_supp_partial :1, 335 isi_supp_delete :1, 336 __reserved :1, 337 isi_modal :2, 338 isi_overflow :1); 339 } ipmi_sdr_info_t; 340 341 extern ipmi_sdr_info_t *ipmi_sdr_get_info(ipmi_handle_t *); 342 343 /* 344 * Reserve repository command. See section 33.11. 345 */ 346 #define IPMI_CMD_RESERVE_SDR_REPOSITORY 0x22 347 348 /* 349 * Get SDR command. See section 33.12. This command accesses the raw SDR 350 * repository. Clients can also use the lookup functions to retrieve a 351 * particular SDR record by name. 352 * 353 * The list of possible types is indicated in the sub-chapters of section 43. 354 */ 355 typedef struct ipmi_sdr { 356 uint16_t is_id; 357 uint8_t is_version; 358 uint8_t is_type; 359 uint8_t is_length; 360 uint8_t is_record[1]; 361 } ipmi_sdr_t; 362 #define IPMI_CMD_GET_SDR 0x23 363 364 #define IPMI_SDR_FIRST 0x0000 365 #define IPMI_SDR_LAST 0xFFFF 366 367 extern ipmi_sdr_t *ipmi_sdr_get(ipmi_handle_t *, uint16_t, uint16_t *); 368 369 /* 370 * Full Sensor Record. See 43.1 371 */ 372 #define IPMI_SDR_TYPE_FULL_SENSOR 0x01 373 374 typedef struct ipmi_sdr_full_sensor { 375 /* RECORD KEY BYTES */ 376 uint8_t is_fs_owner; 377 DECL_BITFIELD3( 378 is_fs_sensor_lun :2, 379 __reserved1 :2, 380 is_fs_channel :4); 381 uint8_t is_fs_number; 382 /* RECORD BODY BYTES */ 383 uint8_t is_fs_entity_id; 384 DECL_BITFIELD2( 385 is_fs_entity_instance :7, 386 is_fs_entity_logical :1); 387 DECL_BITFIELD8( 388 is_fs_sensor_scanning_enabled :1, 389 is_fs_event_generation_enabled :1, 390 is_fs_init_sensor_type :1, 391 is_fs_init_hysteresis :1, 392 is_fs_init_thresholds :1, 393 is_fs_init_events :1, 394 is_fs_init_scanning :1, 395 is_fs_settable :1); 396 DECL_BITFIELD5( 397 is_fs_event_support :2, 398 is_fs_threshold_support :2, 399 is_fs_hysteresis_support :2, 400 is_fs_rearm_support :1, 401 is_fs_ignore :1); 402 uint8_t is_fs_type; 403 uint8_t is_fs_reading_type; 404 uint16_t is_fs_assert_mask; 405 uint16_t is_fs_deassert_mask; 406 uint16_t is_fs_reading_mask; 407 DECL_BITFIELD4( 408 is_fs_units_isprcnt :1, 409 is_fs_mod_unit :2, 410 is_fs_rate_unit :3, 411 is_fs_analog_fmt :2); 412 uint8_t is_fs_unit2; 413 uint8_t is_fs_unit3; 414 /* Linearization */ 415 DECL_BITFIELD2( 416 is_fs_sensor_linear_type :7, 417 __reserved2 :1); 418 /* M, Tolerance */ 419 uint16_t is_fs_mtol; 420 /* B, Accuracy, R exp, B exp */ 421 uint32_t is_fs_bacc; 422 DECL_BITFIELD4( 423 is_fs_nominal_reading_spec :1, 424 is_fs_normal_max_spec :1, 425 is_fs_normal_min_spec :1, 426 __reserved3 :5); 427 uint8_t is_fs_nominal_reading; 428 uint8_t is_fs_normal_maximum; 429 uint8_t is_fs_normal_minimum; 430 uint8_t is_fs_max; 431 uint8_t is_fs_min; 432 uint8_t is_fs_upper_nonrecov; 433 uint8_t is_fs_upper_critical; 434 uint8_t is_fs_upper_noncrit; 435 uint8_t is_fs_lower_nonrecov; 436 uint8_t is_fs_lower_critical; 437 uint8_t is_fs_lower_noncrit; 438 uint8_t is_fs_hysteresis_positive; 439 uint8_t is_fs_hysteresis_negative; 440 uint16_t __reserved4; 441 uint8_t is_fs_oem; 442 DECL_BITFIELD3( 443 is_fs_idlen :5, 444 __reserved5 :1, 445 is_fs_idtype :2); 446 char is_fs_idstring[1]; 447 } ipmi_sdr_full_sensor_t; 448 449 #define IPMI_SDR_TYPE_COMPACT_SENSOR 0x02 450 451 /* 452 * Compact Sensor Record. See section 43.2 453 */ 454 typedef struct ipmi_sdr_compact_sensor { 455 /* RECORD KEY BYTES */ 456 uint8_t is_cs_owner; 457 DECL_BITFIELD3( 458 is_cs_sensor_lun :2, 459 is_cs_fru_lun :2, 460 is_cs_channel :4); 461 uint8_t is_cs_number; 462 /* RECORD BODY BYTES */ 463 uint8_t is_cs_entity_id; 464 DECL_BITFIELD2( 465 is_cs_entity_instance :7, 466 is_cs_entity_logical :1); 467 DECL_BITFIELD8( 468 is_cs_sensor_scanning_enabled :1, 469 is_cs_event_generation_enabled :1, 470 is_cs_init_sensor_type :1, 471 is_cs_init_hysteresis :1, 472 __reserved1 :1, 473 is_cs_init_events :1, 474 is_cs_init_scanning :1, 475 is_cs_settable :1); 476 DECL_BITFIELD5( 477 is_cs_event_support :2, 478 is_cs_threshold_support :2, 479 is_cs_hysteresis_support :2, 480 is_cs_rearm_support :1, 481 is_cs_ignore :1); 482 uint8_t is_cs_type; 483 uint8_t is_cs_reading_type; 484 uint16_t is_cs_assert_mask; 485 uint16_t is_cs_deassert_mask; 486 uint16_t is_cs_reading_mask; 487 DECL_BITFIELD4( 488 is_cs_units_isprcnt :1, 489 is_cs_mod_unit :2, 490 is_cs_rate_unit :3, 491 __reserved2 :2); 492 uint8_t is_cs_unit2; 493 uint8_t is_cs_unit3; 494 DECL_BITFIELD3( 495 is_cs_share_count :4, 496 is_cs_modifier_type :2, 497 is_cs_direction :2); 498 DECL_BITFIELD2( 499 is_cs_modifier_offset :7, 500 is_cs_sharing :1); 501 uint8_t is_cs_hysteresis_positive; 502 uint8_t is_cs_hysteresis_negative; 503 uint16_t __reserved3; 504 uint8_t __reserved4; 505 uint8_t is_cs_oem; 506 DECL_BITFIELD3( 507 is_cs_idlen :5, 508 __reserved5 :1, 509 is_cs_idtype :2); 510 char is_cs_idstring[1]; 511 } ipmi_sdr_compact_sensor_t; 512 513 /* 514 * Threshold sensor masks for is_cs_assert_mask and is_cs_deassert_mask. 515 */ 516 #define IPMI_SENSOR_RETURN_NONRECOV 0x4000 517 #define IPMI_SENSOR_RETURN_CRIT 0x2000 518 #define IPMI_SENSOR_RETURN_NONCRIT 0x1000 519 520 #define IPMI_SENSOR_MASK_UPPER_NONRECOV_HI 0x0800 521 #define IPMI_SENSOR_MASK_UPPER_NONRECOV_LO 0x0400 522 #define IPMI_SENSOR_MASK_UPPER_CRIT_HI 0x0200 523 #define IPMI_SENSOR_MASK_UPPER_CRIT_LO 0x0100 524 #define IPMI_SENSOR_MASK_UPPER_NONCRIT_HI 0x0080 525 #define IPMI_SENSOR_MASK_UPPER_NONCRIT_LO 0x0040 526 #define IPMI_SENSOR_MASK_LOWER_NONRECOV_HI 0x0020 527 #define IPMI_SENSOR_MASK_LOWER_NONRECOV_LO 0x0010 528 #define IPMI_SENSOR_MASK_LOWER_CRIT_HI 0x0008 529 #define IPMI_SENSOR_MASK_LOWER_CRIT_LO 0x0004 530 #define IPMI_SENSOR_MASK_LOWER_NONCRIT_HI 0x0002 531 #define IPMI_SENSOR_MASK_LOWER_NONCRIT_LO 0x0001 532 533 /* 534 * Threshold sensor masks for is_cs_reading_mask. 535 */ 536 #define IPMI_SENSOR_SETTABLE_UPPER_NONRECOV 0x2000 537 #define IPMI_SENSOR_SETTABLE_UPPER_CRIT 0x1000 538 #define IPMI_SENSOR_SETTABLE_UPPER_NONCRIT 0x0800 539 #define IPMI_SENSOR_SETTABLE_LOWER_NONRECOV 0x0400 540 #define IPMI_SENSOR_SETTABLE_LOWER_CRIT 0x0200 541 #define IPMI_SENSOR_SETTABLE_LOWER_NONCRIT 0x0100 542 #define IPMI_SENSOR_READABLE_UPPER_NONRECOV 0x0020 543 #define IPMI_SENSOR_READABLE_UPPER_CRIT 0x0010 544 #define IPMI_SENSOR_READABLE_UPPER_NONCRIT 0x0008 545 #define IPMI_SENSOR_READABLE_LOWER_NONRECOV 0x0004 546 #define IPMI_SENSOR_READABLE_LOWER_CRIT 0x0002 547 #define IPMI_SENSOR_READABLE_LOWER_NONCRIT 0x0001 548 549 /* 550 * Values for is_cs_reading_type. See table 42-2. 551 */ 552 #define IPMI_RT_THRESHOLD 0x01 553 #define IPMI_RT_USAGE 0x02 554 #define IPMI_RT_STATE 0x03 555 #define IPMI_RT_PREDFAIL 0x04 556 #define IPMI_RT_LIMIT 0x05 557 #define IPMI_RT_PERFORMANCE 0x06 558 #define IPMI_RT_SEVERITY 0x07 559 #define IPMI_RT_PRESENT 0x08 560 #define IPMI_RT_ENABLED 0x09 561 #define IPMI_RT_AVAILABILITY 0x0A 562 #define IPMI_RT_REDUNDANCY 0x0B 563 #define IPMI_RT_ACPI 0x0C 564 #define IPMI_RT_SPECIFIC 0x6F 565 566 /* 567 * Bitmasks based on above reading types. See table 42-2 568 */ 569 #define IPMI_SR_THRESHOLD_LOWER_NONCRIT_LOW 0x0001 570 #define IPMI_SR_THRESHOLD_LOWER_NONCRIT_HIGH 0x0002 571 #define IPMI_SR_THRESHOLD_LOWER_CRIT_LOW 0x0004 572 #define IPMI_SR_THRESHOLD_LOWER_CRIT_HIGH 0x0008 573 #define IPMI_SR_THRESHOLD_LOWER_NONRECOV_LOW 0x0010 574 #define IPMI_SR_THRESHOLD_LOWER_NONRECOV_HIGH 0x0020 575 #define IPMI_SR_THRESHOLD_UPPER_NONCRIT_LOW 0x0040 576 #define IPMI_SR_THRESHOLD_UPPER_NONCRIT_HIGH 0x0080 577 #define IPMI_SR_THRESHOLD_UPPER_CRIT_LOW 0x0100 578 #define IPMI_SR_THRESHOLD_UPPER_CRIT_HIGH 0x0200 579 #define IPMI_SR_THRESHOLD_UPPER_NONRECOV_LOW 0x0400 580 #define IPMI_SR_THRESHOLD_UPPER_NONRECOV_HIGH 0x0800 581 582 #define IPMI_SR_USAGE_IDLE 0x0001 583 #define IPMI_SR_USAGE_ACTIVE 0x0002 584 #define IPMI_SR_USAGE_BUSY 0x0004 585 586 #define IPMI_SR_STATE_DEASSERT 0x0001 587 #define IPMI_SR_STATE_ASSERT 0x0002 588 589 #define IPMI_SR_PREDFAIL_DEASSERT 0x0001 590 #define IPMI_SR_PREDFAIL_ASSERT 0x0002 591 592 #define IPMI_SR_LIMIT_NOTEXCEEDED 0x0001 593 #define IPMI_SR_LIMIT_EXCEEDED 0x0002 594 595 #define IPMI_SR_PERFORMANCE_MET 0x0001 596 #define IPMI_SR_PERFORMANCE_LAGS 0x0002 597 598 #define IPMI_SR_SEVERITY_TO_OK 0x0001 599 #define IPMI_SR_SEVERITY_OK_TO_NONCRIT 0x0002 600 #define IPMI_SR_SEVERITY_LESS_TO_CRIT 0x0004 601 #define IPMI_SR_SEVERITY_LESS_TO_NONRECOV 0x0008 602 #define IPMI_SR_SEVERITY_MORE_TO_NONCRIT 0x0010 603 #define IPMI_SR_SEVERITY_NONRECOV_TO_CRIT 0x0020 604 #define IPMI_SR_SEVERITY_TO_NONRECOV 0x0040 605 #define IPMI_SR_SEVERITY_MONITOR 0x0080 606 #define IPMI_SR_SEVERITY_INFO 0x0100 607 608 #define IPMI_SR_PRESENT_DEASSERT 0x0001 609 #define IPMI_SR_PRESENT_ASSERT 0x0002 610 611 #define IPMI_SR_ENABLED_DEASSERT 0x0001 612 #define IPMI_SR_ENABLED_ASSERT 0x0002 613 614 #define IPMI_SR_AVAILABILITY_RUNNING 0x0001 615 #define IPMI_SR_AVAILABILITY_INTEST 0x0002 616 #define IPMI_SR_AVAILABILITY_POWEROFF 0x0004 617 #define IPMI_SR_AVAILABILITY_ONLINE 0x0008 618 #define IPMI_SR_AVAILABILITY_OFFLINE 0x0010 619 #define IPMI_SR_AVAILABILITY_OFFDUTY 0x0020 620 #define IPMI_SR_AVAILABILITY_DEGRADED 0x0040 621 #define IPMI_SR_AVAILABILITY_POWERSAVE 0x0080 622 #define IPMI_SR_AVAILABILITY_INSTALLERR 0x0100 623 624 #define IPMI_SR_REDUNDANCY_FULL 0x0001 625 #define IPMI_SR_REDUNDANCY_LOST 0x0002 626 #define IPMI_SR_REDUNDANCY_DEGRADED 0x0004 627 #define IPMI_SR_REDUNDANCY_NONE_MINIMAL 0x0008 628 #define IPMI_SR_REDUNDANCY_NONE_REGAINED 0x0010 629 #define IPMI_SR_REDUNDANCY_NONE_INSUFFFICIENT 0x0020 630 #define IPMI_SR_REDUNDANCY_DEG_FROM_FULL 0x0040 631 #define IPMI_SR_REDUNDANCY_DEG_FROM_NON 0x0080 632 633 #define IPMI_SR_ACPI_DO 0x0001 634 #define IPMI_SR_ACPI_D1 0x0002 635 #define IPMI_SR_ACPI_D2 0x0004 636 #define IPMI_SR_ACPI_D3 0x0008 637 638 /* 639 * Bitmasks for sensor-specific reading type (0x6F). See section 42.2. 640 */ 641 #define IPMI_ST_RESERVED 0x00 642 #define IPMI_ST_TEMP 0x01 643 #define IPMI_ST_VOLTAGE 0x02 644 #define IPMI_ST_CURRENT 0x03 645 #define IPMI_ST_FAN 0x04 646 #define IPMI_ST_PHYSICAL 0x05 647 648 #define IPMI_EV_PHYSICAL_GENERAL 0x0001 649 #define IPMI_EV_PHYSICAL_BAY 0x0002 650 #define IPMI_EV_PHYSICAL_CARD 0x0004 651 #define IPMI_EV_PHYSICAL_PROCESSOR 0x0008 652 #define IPMI_EV_PHYSICAL_LAN 0x0010 653 #define IPMI_EV_PHYSICAL_DOCK 0x0020 654 #define IPMI_EV_PHYSICAL_FAN 0x0040 655 656 #define IPMI_ST_PLATFORM 0x06 657 658 #define IPMI_EV_PLATFORM_SECURE 0x0001 659 #define IPMI_EV_PLATFORM_USER_PASS 0x0002 660 #define IPMI_EV_PLATFORM_SETUP_PASS 0x0004 661 #define IPMI_EV_PLATFORM_NETWORK_PASS 0x0008 662 #define IPMI_EV_PLATFORM_OTHER_PASS 0x0010 663 #define IPMI_EV_PLATFORM_OUT_OF_BAND 0x0020 664 665 #define IPMI_ST_PROCESSOR 0x07 666 667 #define IPMI_EV_PROCESSOR_IERR 0x0001 668 #define IPMI_EV_PROCESSOR_THERMAL 0x0002 669 #define IPMI_EV_PROCESSOR_FRB1 0x0004 670 #define IPMI_EV_PROCESSOR_FRB2 0x0008 671 #define IPMI_EV_PROCESSOR_FRB3 0x0010 672 #define IPMI_EV_PROCESSOR_CONFIG 0x0020 673 #define IPMI_EV_PROCESSOR_SMBIOS 0x0040 674 #define IPMI_EV_PROCESSOR_PRESENT 0x0080 675 #define IPMI_EV_PROCESSOR_DISABLED 0x0100 676 #define IPMI_EV_PROCESSOR_TERMINATOR 0x0200 677 #define IPMI_EV_PROCESSOR_THROTTLED 0x0400 678 679 #define IPMI_ST_POWER_SUPPLY 0x08 680 681 #define IPMI_EV_POWER_SUPPLY_PRESENT 0x0001 682 #define IPMI_EV_POWER_SUPPLY_FAILURE 0x0002 683 #define IPMI_EV_POWER_SUPPLY_PREDFAIL 0x0004 684 #define IPMI_EV_POWER_SUPPLY_INPUT_LOST 0x0008 685 #define IPMI_EV_POWER_SUPPLY_INPUT_RANGE 0x0010 686 #define IPMI_EV_POWER_SUPPLY_INPUT_RANGE_PRES 0x0020 687 #define IPMI_EV_POWER_SUPPLY_CONFIG_ERR 0x0040 688 689 #define IPMI_ST_POWER_UNIT 0x09 690 691 #define IPMI_EV_POWER_UNIT_OFF 0x0001 692 #define IPMI_EV_POWER_UNIT_CYCLE 0x0002 693 #define IPMI_EV_POWER_UNIT_240_DOWN 0x0004 694 #define IPMI_EV_POWER_UNIT_INTERLOCK_DOWN 0x0008 695 #define IPMI_EV_POWER_UNIT_AC_LOST 0x0010 696 #define IPMI_EV_POWER_UNIT_SOFT_FAILURE 0x0020 697 #define IPMI_EV_POWER_UNIT_FAIL 0x0040 698 #define IPMI_EV_POWER_UNIT_PREDFAIL 0x0080 699 700 #define IPMI_ST_COOLING 0x0A 701 #define IPMI_ST_OTHER 0x0B 702 #define IPMI_ST_MEMORY 0x0C 703 704 #define IPMI_EV_MEMORY_CE 0x0001 705 #define IPMI_EV_MEMORY_UE 0x0002 706 #define IPMI_EV_MEMORY_PARITY 0x0004 707 #define IPMI_EV_MEMORY_SCRUB_FAIL 0x0008 708 #define IPMI_EV_MEMORY_DISABLED 0x0010 709 #define IPMI_EV_MEMORY_CE_LOG_LIMIT 0x0020 710 #define IPMI_EV_MEMORY_PRESENT 0x0040 711 #define IPMI_EV_MEMORY_CONFIG_ERR 0x0080 712 #define IPMI_EV_MEMORY_SPARE 0x0100 713 #define IPMI_EV_MEMORY_THROTTLED 0x0200 714 #define IPMI_EV_MEMORY_OVERTEMP 0x0400 715 716 #define IPMI_ST_BAY 0x0D 717 718 #define IPMI_EV_BAY_PRESENT 0x0001 719 #define IPMI_EV_BAY_FAULT 0x0002 720 #define IPMI_EV_BAY_PREDFAIL 0x0004 721 #define IPMI_EV_BAY_SPARE 0x0008 722 #define IPMI_EV_BAY_CHECK 0x0010 723 #define IPMI_EV_BAY_CRITICAL 0x0020 724 #define IPMI_EV_BAY_FAILED 0x0040 725 #define IPMI_EV_BAY_REBUILDING 0x0080 726 #define IPMI_EV_BAY_ABORTED 0x0100 727 728 #define IPMI_ST_POST_RESIZE 0x0E 729 #define IPMI_ST_FIRMWARE 0x0F 730 731 #define IPMI_EV_FIRMWARE_ERROR 0x0001 732 #define IPMI_EV_FIRMWARE_HANG 0x0002 733 #define IPMI_EV_FIRMWARE_PROGRESS 0x0004 734 735 #define IPMI_ST_EVENT_LOG 0x10 736 737 #define IPMI_EV_EVENT_LOG_CE 0x0001 738 #define IPMI_EV_EVENT_LOG_TYPE 0x0002 739 #define IPMI_EV_EVENT_LOG_RESET 0x0004 740 #define IPMI_EV_EVENT_LOG_ALL 0x0008 741 #define IPMI_EV_EVENT_LOG_FULL 0x0010 742 #define IPMI_EV_EVENT_LOG_ALMOST_FULL 0x0020 743 744 #define IPMI_ST_WATCHDOG1 0x11 745 746 #define IPMI_EV_WATCHDOG_BIOS_RESET 0x0001 747 #define IPMI_EV_WATCHDOG_OS_RESET 0x0002 748 #define IPMI_EV_WATCHDOG_OS_SHUTDOWN 0x0004 749 #define IPMI_EV_WATCHDOG_OS_PWR_DOWN 0x0008 750 #define IPMI_EV_WATCHDOG_OS_PWR_CYCLE 0x0010 751 #define IPMI_EV_WATCHDOG_OS_NMI_DIAG 0x0020 752 #define IPMI_EV_WATCHDOG_EXPIRED 0x0040 753 #define IPMI_EV_WATCHDOG_PRE_TIMEOUT_INT 0x0080 754 755 #define IPMI_ST_SYSTEM 0x12 756 757 #define IPMI_EV_STSTEM_RECONF 0x0001 758 #define IPMI_EV_STSTEM_BOOT 0x0002 759 #define IPMI_EV_STSTEM_UNKNOWN_HW_FAILURE 0x0004 760 #define IPMI_EV_STSTEM_AUX_LOG_UPDATED 0x0008 761 #define IPMI_EV_STSTEM_PEF_ACTION 0x0010 762 #define IPMI_EV_SYSTEM_TIMETAMP_CLOCKSYNC 0x0020 763 764 #define IPMI_ST_CRITICAL 0x13 765 766 #define IPMI_EV_CRITICAL_EXT_NMI 0x0001 767 #define IPMI_EV_CRITICAL_BUS_TIMOEOUT 0x0002 768 #define IPMI_EV_CRITICAL_IO_NMI 0x0004 769 #define IPMI_EV_CRITICAL_SW_NMI 0x0008 770 #define IPMI_EV_CRITICAL_PCI_PERR 0x0010 771 #define IPMI_EV_CRITICAL_PCI_SERR 0x0020 772 #define IPMI_EV_CRITICAL_EISA_FAILSAFE 0x0040 773 #define IPMI_EV_CRITICAL_BUS_CE 0x0080 774 #define IPMI_EV_CRITICAL_BUS_UE 0x0100 775 #define IPMI_EV_CRITICAL_FATAL_NMI 0x0200 776 #define IPMI_EV_CRITICAL_BUS_FATAL_ERR 0x0400 777 #define IPMI_EV_CRITICAL_BUS_DEGRADED 0x0800 778 779 #define IPMI_ST_BUTTON 0x14 780 781 #define IPMI_EV_BUTTON_PWR 0x0001 782 #define IPMI_EV_BUTTON_SLEEP 0x0002 783 #define IPMI_EV_BUTTON_RESET 0x0004 784 #define IPMI_EV_BUTTON_FRU_LATCH 0x0008 785 #define IPMI_EV_BUTTON_FRU_SERVICE 0x0010 786 787 #define IPMI_ST_MODULE 0x15 788 #define IPMI_ST_MICROCONTROLLER 0x16 789 #define IPMI_ST_CARD 0x17 790 #define IPMI_ST_CHASSIS 0x18 791 792 #define IPMI_ST_CHIPSET 0x19 793 794 #define IPMI_EV_CHIPSET_PWR_CTL_FAIL 0x0001 795 796 #define IPMI_ST_FRU 0x1A 797 #define IPMI_ST_CABLE 0x1B 798 799 #define IPMI_EV_CABLE_CONNECTED 0x0001 800 #define IPMI_EV_CABLE_CONFIG_ERR 0x0002 801 802 #define IPMI_ST_TERMINATOR 0x1C 803 804 #define IPMI_ST_BOOT 0x1D 805 806 #define IPMI_EV_BOOT_BIOS_PWR_UP 0x0001 807 #define IPMI_EV_BOOT_BIOS_HARD_RESET 0x0002 808 #define IPMI_EV_BOOT_BIOS_WARM_RESET 0x0004 809 #define IPMI_EV_BOOT_PXE_BOOT 0x0008 810 #define IPMI_EV_BOOT_DIAG_BOOT 0x0010 811 #define IPMI_EV_BOOT_OS_HARD_RESET 0x0020 812 #define IPMI_EV_BOOT_OS_WARM_RESET 0x0040 813 #define IPMI_EV_BOOT_SYS_RESTART 0x0080 814 815 #define IPMI_ST_BOOT_ERROR 0x1E 816 817 #define IPMI_EV_BOOT_ERROR_NOMEDIA 0x0001 818 #define IPMI_EV_BOOT_ERROR_NON_BOOTABLE_DISK 0x0002 819 #define IPMI_EV_BOOT_ERROR_NO_PXE_SERVER 0x0004 820 #define IPMI_EV_BOOT_ERROR_INV_BOOT_SECT 0x0008 821 #define IPMI_EV_BOOT_ERROR_USR_SELECT_TIMEOUT 0x0010 822 823 #define IPMI_ST_BOOT_OS 0x1F 824 825 #define IPMI_EV_BOOT_OS_A_DRV_BOOT_COMPLETE 0x0001 826 #define IPMI_EV_BOOT_OS_C_DRV_BOOT_COMPLETE 0x0002 827 #define IPMI_EV_BOOT_OS_PXE_BOOT_COMPLETE 0x0004 828 #define IPMI_EV_BOOT_OS_DIAG_BOOT_COMPLETE 0x0008 829 #define IPMI_EV_BOOT_OS_CDROM_BOOT_COMPLETE 0x0010 830 #define IPMI_EV_BOOT_OS_ROM_BOOT_COMPLETE 0x0020 831 #define IPMI_EV_BOOT_OS_UNSPEC_BOOT_COMPLETE 0x0040 832 833 #define IPMI_ST_OS_SHUTDOWN 0x20 834 835 #define IPMI_EV_OS_SHUTDOWN_LOADING 0x0001 836 #define IPMI_EV_OS_SHUTDOWN_CRASH 0x0002 837 #define IPMI_EV_OS_STOP_GRACEFUL 0x0004 838 #define IPMI_EV_OS_SHUTDOWN_GRACEFUL 0x0008 839 #define IPMI_EV_OS_SHUTDOWN_PEF 0x0010 840 #define IPMI_EV_OS_SHUTDOWN_BMC 0x0020 841 842 #define IPMI_ST_SLOT 0x21 843 844 #define IPMI_EV_SLOT_FAULT_ASSERTED 0x0001 845 #define IPMI_EV_SLOT_IDENTIFY_ASSERTED 0x0002 846 #define IPMI_EV_SLOT_CONNECTED 0x0004 847 #define IPMI_EV_SLOT_INSTALL_READY 0x0008 848 #define IPMI_EV_SLOT_REMOVE_READY 0x0010 849 #define IPMI_EV_SLOT_PWR_OFF 0x0020 850 #define IPMI_EV_SLOT_REMOVED 0x0040 851 #define IPMI_EV_SLOT_INTERLOCK_ASSERTED 0x0080 852 #define IPMI_EV_SLOT_DISABLED 0x0100 853 #define IPMI_EV_SLOT_SPARE_DEVICE 0x0200 854 855 #define IPMI_ST_ACPI 0x22 856 857 #define IPMI_EV_ACPI_PSTATE_S0_G0 0x0001 858 #define IPMI_EV_ACPI_PSTATE_S1 0x0002 859 #define IPMI_EV_ACPI_PSTATE_S2 0x0004 860 #define IPMI_EV_ACPI_PSTATE_S3 0x0008 861 #define IPMI_EV_ACPI_PSTATE_S4 0x0010 862 #define IPMI_EV_ACPI_PSTATE_S5_G2_SOFT_OFF 0x0020 863 #define IPMI_EV_ACPI_PSTATE_S4_S5_SOFT_OFF 0x0040 864 #define IPMI_EV_ACPI_PSATTE_G3_MECH_OFF 0x0080 865 #define IPMI_EV_ACPI_PSTATE_S1_S2_S3_SLEEP 0x0100 866 #define IPMI_EV_ACPI_PSTATE_G1_SLEEP 0x0200 867 #define IPMI_EV_ACPI_PSTATE_S5_OVERRIDE 0x0400 868 #define IPMI_EV_ACPI_PSTATE_LEGACY_ON 0x0800 869 #define IPMI_EV_ACPI_PSTATE_LEGACY_OFF 0x1000 870 #define IPMI_EV_ACPI_PSTATE_UNKNOWN 0x2000 871 872 #define IPMI_ST_WATCHDOG2 0x23 873 874 #define IPMI_EV_WATCHDOG2_EXPIRED 0x0001 875 #define IPMI_EV_WATCHDOG2_HARD_RESET 0x0002 876 #define IPMI_EV_WATCHDOG2_PWR_DOWN 0x0004 877 #define IPMI_EV_WATCHDOG2_PWR_CYCLE 0x0008 878 #define IPMI_EV_WATCHDOG2_RESERVED1 0x0010 879 #define IPMI_EV_WATCHDOG2_RESERVED2 0x0020 880 #define IPMI_EV_WATCHDOG2_RESERVED3 0x0040 881 #define IPMI_EV_WATCHDOG2_RESERVED4 0x0080 882 #define IPMI_EV_WATCHDOG2_TIMEOUT_INT 0x0100 883 884 #define IPMI_ST_ALERT 0x24 885 886 #define IPMI_EV_ALERT_PLAT_PAGE 0x0001 887 #define IPMI_EV_ALERT_PLAT_LAN_ALERT 0x0002 888 #define IPMI_EV_ALERT_PLAT_EVT_TRAP 0x0004 889 #define IPMI_EV_ALERT_PLAT_SNMP_TRAP 0x0008 890 891 #define IPMI_ST_PRESENCE 0x25 892 893 #define IPMI_EV_PRESENCE_PRESENT 0x0001 894 #define IPMI_EV_PRESENCE_ABSENT 0x0002 895 #define IPMI_EV_PRESENCE_DISABLED 0x0004 896 897 #define IPMI_ST_ASIC 0x26 898 899 #define IPMI_ST_LAN 0x27 900 901 #define IPMI_EV_LAN_HEARTBEAT_LOST 0x0001 902 #define IPMI_EV_LAN_HEARTBEAT 0x0002 903 904 #define IPMI_ST_HEALTH 0x28 905 906 #define IPMI_EV_HEALTH_SENSOR_ACC_DEGRADED 0x0001 907 #define IPMI_EV_HEALTH_CNTLR_ACC_DEGRADED 0x0002 908 #define IPMI_EV_HEALTH_CNTLR_OFFLINE 0x0004 909 #define IPMI_EV_HEALTH_CNTLR_UNAVAIL 0x0008 910 #define IPMI_EV_HEALTH_SENSOR_FAILURE 0x0010 911 #define IPMI_EV_HEALTH_FRU_FAILURE 0x0020 912 913 #define IPMI_ST_BATTERY 0x29 914 915 #define IPMI_EV_BATTERY_LOW 0x0001 916 #define IPMI_EV_BATTERY_FAILED 0x0002 917 #define IPMI_EV_BATTERY_PRESENCE 0x0004 918 919 #define IPMI_ST_AUDIT 0x2A 920 921 #define IPMI_EV_AUDIT_SESSION_ACTIVATED 0x0001 922 #define IPMI_EV_AUDIT_SESSION_DEACTIVATED 0x0002 923 924 #define IPMI_ST_VERSION 0x2B 925 926 #define IPMI_EV_VERSION_HW_CHANGE 0x0001 927 #define IPMI_EV_VERSION_SW_CHANGE 0x0002 928 #define IPMI_EV_VERSION_HW_INCOMPATIBLE 0x0004 929 #define IPMI_EV_VERSION_SW_INCOMPATIBLE 0x0008 930 #define IPMI_EV_VERSION_HW_INVAL 0x0010 931 #define IPMI_EV_VERSION_SW_INVAL 0x0020 932 #define IPMI_EV_VERSION_HW_CHANGE_SUCCESS 0x0040 933 #define IPMI_EV_VERSION_SW_CHANGE_SUCCESS 0x0080 934 935 #define IPMI_ST_FRU_STATE 0x2C 936 937 #define IPMI_EV_FRU_STATE_NOT_INSTALLED 0x0001 938 #define IPMI_EV_FRU_STATE_INACTIVE 0x0002 939 #define IPMI_EV_FRU_STATE_ACT_REQ 0x0004 940 #define IPMI_EV_FRU_STATE_ACT_INPROGRESS 0x0008 941 #define IPMI_EV_FRU_STATE_ACTIVE 0x0010 942 #define IPMI_EV_FRU_STATE_DEACT_REQ 0x0020 943 #define IPMI_EV_FRU_STATE_DEACT_INPROGRESS 0x0040 944 #define IPMI_EV_FRU_STATE_COMM_LOST 0x0080 945 946 /* 947 * Constants for unit type codes. See Table 43-15. 948 */ 949 #define IPMI_UNITS_UNSPECIFIED 0x00 950 #define IPMI_UNITS_DEGREES_C 0x01 951 #define IPMI_UNITS_DEGREES_F 0x02 952 #define IPMI_UNITS_DEGREES_K 0x03 953 #define IPMI_UNITS_VOLTS 0x04 954 #define IPMI_UNITS_AMPS 0x05 955 #define IPMI_UNITS_WATTS 0x06 956 #define IPMI_UNITS_JOULES 0x07 957 #define IPMI_UNITS_COULOMBS 0x08 958 #define IPMI_UNITS_VA 0x09 959 #define IPMI_UNITS_NITS 0x0A 960 #define IPMI_UNITS_LUMEN 0x0B 961 #define IPMI_UNITS_LUX 0x0C 962 #define IPMI_UNITS_CANDELA 0x0D 963 #define IPMI_UNITS_KPA 0x0E 964 #define IPMI_UNITS_PSI 0x0F 965 966 #define IPMI_UNITS_NEWTON 0x10 967 #define IPMI_UNITS_CFM 0x11 968 #define IPMI_UNITS_RPM 0x12 969 #define IPMI_UNITS_HZ 0x13 970 #define IPMI_UNITS_MICROSEC 0x14 971 #define IPMI_UNITS_MILLISEC 0x15 972 #define IPMI_UNITS_SECS 0x16 973 #define IPMI_UNITS_MIN 0x17 974 #define IPMI_UNITS_HOUR 0x18 975 #define IPMI_UNITS_DAY 0x19 976 #define IPMI_UNITS_WEEK 0x1A 977 #define IPMI_UNITS_MIL 0x1B 978 #define IPMI_UNITS_INCHES 0x1C 979 #define IPMI_UNITS_FEET 0x1D 980 #define IPMI_UNITS_CUB_INCH 0x1E 981 #define IPMI_UNITS_CUB_FEET 0x1F 982 983 #define IPMI_UNITS_MM 0x20 984 #define IPMI_UNITS_CM 0x21 985 #define IPMI_UNITS_METERS 0x22 986 #define IPMI_UNITS_CUB_CM 0x23 987 #define IPMI_UNITS_CUB_METER 0x24 988 #define IPMI_UNITS_LITERS 0x25 989 #define IPMI_UNITS_FLUID_OUNCE 0x26 990 #define IPMI_UNITS_RADIANS 0x27 991 #define IPMI_UNITS_STERADIANS 0x28 992 #define IPMI_UNITS_REVOLUTIONS 0x29 993 #define IPMI_UNITS_CYCLES 0x2A 994 #define IPMI_UNITS_GRAVITIES 0x2B 995 #define IPMI_UNITS_OUNCE 0x2C 996 #define IPMI_UNITS_POUND 0x2D 997 #define IPMI_UNITS_FOOT_POUND 0x2E 998 #define IPMI_UNITS_OZ_INCH 0x2F 999 1000 #define IPMI_UNITS_GAUSS 0x30 1001 #define IPMI_UNITS_GILBERTS 0x31 1002 #define IPMI_UNITS_HENRY 0x32 1003 #define IPMI_UNITS_MILHENRY 0x33 1004 #define IPMI_UNITS_FARAD 0x34 1005 #define IPMI_UNITS_MICROFARAD 0x35 1006 #define IPMI_UNITS_OHMS 0x36 1007 #define IPMI_UNITS_SIEMENS 0x37 1008 #define IPMI_UNITS_MOLE 0x38 1009 #define IPMI_UNITS_BECQUEREL 0x39 1010 #define IPMI_UNITS_PPM 0x3A 1011 /* 0x3B is reserved */ 1012 #define IPMI_UNITS_DECIBELS 0x3C 1013 #define IPMI_UNITS_DBA 0x3D 1014 #define IPMI_UNITS_DBC 0x3E 1015 #define IPMI_UNITS_GRAY 0x3F 1016 1017 #define IPMI_UNITS_SIEVERT 0x40 1018 #define IPMI_UNITS_COLOR_TEMP_K 0x41 1019 #define IPMI_UNITS_BIT 0x42 1020 #define IPMI_UNITS_KILOBIT 0x43 1021 #define IPMI_UNITS_MEGABIT 0x44 1022 #define IPMI_UNITS_GIGABIT 0x45 1023 #define IPMI_UNITS_BYTE 0x46 1024 #define IPMI_UNITS_KILOBYTE 0x47 1025 #define IPMI_UNITS_MEGABYTE 0x48 1026 #define IPMI_UNITS_GIGABYTE 0x49 1027 #define IPMI_UNITS_WORD 0x4A 1028 #define IPMI_UNITS_DWORD 0x4B 1029 #define IPMI_UNITS_QWORD 0x4C 1030 #define IPMI_UNITS_MEMLINE 0x4D 1031 #define IPMI_UNITS_HIT 0x4E 1032 #define IPMI_UNITS_MISS 0x4F 1033 1034 #define IPMI_UNITS_RETRY 0x50 1035 #define IPMI_UNITS_RESET 0x51 1036 #define IPMI_UNITS_OVERFLOW 0x52 1037 #define IPMI_UNITS_UNDERRUN 0x53 1038 #define IPMI_UNITS_COLLISION 0x54 1039 #define IPMI_UNITS_PACKETS 0x55 1040 #define IPMI_UNITS_MESSAGES 0x56 1041 #define IPMI_UNITS_CHARACTERS 0x57 1042 #define IPMI_UNITS_ERROR 0x58 1043 #define IPMI_UNITS_CE 0x59 1044 #define IPMI_UNITS_UE 0x5A 1045 #define IPMI_UNITS_FATAL_ERROR 0x5B 1046 #define IPMI_UNITS_GRAMS 0x5C 1047 1048 /* 1049 * Event-Only Record. See section 43.3. 1050 */ 1051 1052 #define IPMI_SDR_TYPE_EVENT_ONLY 0x03 1053 1054 typedef struct ipmi_sdr_event_only { 1055 /* RECORD KEY BYTES */ 1056 uint8_t is_eo_owner; 1057 DECL_BITFIELD3( 1058 is_eo_sensor_lun :2, 1059 is_eo_fru_lun :2, 1060 is_eo_channel :4); 1061 uint8_t is_eo_number; 1062 /* RECORD BODY BYTES */ 1063 uint8_t is_eo_entity_id; 1064 DECL_BITFIELD2( 1065 is_eo_entity_instance :7, 1066 is_eo_entity_logical :1); 1067 uint8_t is_eo_sensor_type; 1068 uint8_t is_eo_reading_type; 1069 DECL_BITFIELD3( 1070 is_eo_share_count :4, 1071 is_eo_modifier_type :2, 1072 is_eo_direction :2); 1073 DECL_BITFIELD2( 1074 is_eo_modifier_offset :7, 1075 is_eo_sharing :1); 1076 uint8_t __reserved; 1077 uint8_t is_eo_oem; 1078 DECL_BITFIELD3( 1079 is_eo_idlen :5, 1080 __reserved1 :1, 1081 is_eo_idtype :2); 1082 char is_eo_idstring[1]; 1083 } ipmi_sdr_event_only_t; 1084 1085 /* 1086 * Entity Association Record. See section 43.4. 1087 */ 1088 1089 #define IPMI_SDR_TYPE_ENTITY_ASSOCIATION 0x08 1090 1091 typedef struct ipmi_sdr_entity_association { 1092 /* RECORD KEY BYTES */ 1093 uint8_t is_ea_entity_id; 1094 uint8_t is_ea_entity_instance; 1095 DECL_BITFIELD4( 1096 __reserved :5, 1097 is_ea_presence :1, 1098 is_ea_record_link :1, 1099 is_ea_range :1); 1100 /* RECORD BODY BYTES */ 1101 struct { 1102 uint8_t is_ea_sub_id; 1103 uint8_t is_ea_sub_instance; 1104 } is_ea_sub[4]; 1105 } ipmi_sdr_entity_association_t; 1106 1107 /* 1108 * Device-relative Entity Association Record. See section 43.5. 1109 */ 1110 1111 #define IPMI_SDR_TYPE_DEVICE_RELATIVE 0x09 1112 1113 typedef struct ipmi_sdr_device_relative { 1114 /* RECORD KEY BYTES */ 1115 uint8_t is_dr_entity_id; 1116 uint8_t is_dr_entity_instance; 1117 DECL_BITFIELD2( 1118 __reserved1 :1, 1119 is_dr_slaveaddr :7); 1120 DECL_BITFIELD2( 1121 __reserved2 :4, 1122 is_dr_channel :4); 1123 DECL_BITFIELD4( 1124 __reserved :5, 1125 is_dr_presence :1, 1126 is_dr_record_link :1, 1127 is_dr_range :1); 1128 /* RECORD BODY BYTES */ 1129 struct { 1130 DECL_BITFIELD2( 1131 __reserved3 :1, 1132 is_dr_sub_slaveaddr :7); 1133 DECL_BITFIELD2( 1134 __reserved4 :4, 1135 is_dr_sub_channel :4); 1136 uint8_t is_ea_sub_id; 1137 uint8_t is_ea_sub_instance; 1138 } is_ea_sub[4]; 1139 } ipmi_sdr_device_relative_t; 1140 1141 /* 1142 * Generic Device Locator Record. See section 43.7. 1143 */ 1144 1145 #define IPMI_SDR_TYPE_GENERIC_LOCATOR 0x10 1146 1147 typedef struct ipmi_sdr_generic_locator { 1148 /* RECORD KEY BYTES */ 1149 DECL_BITFIELD2( 1150 __reserved1 :1, 1151 is_gl_accessaddr :7); 1152 DECL_BITFIELD2( 1153 is_gl_channel_msb :1, 1154 is_gl_slaveaddr :7); 1155 DECL_BITFIELD3( 1156 is_gl_bus :3, 1157 is_gl_lun :2, 1158 is_gl_channel :3); 1159 /* RECORD BODY BYTES */ 1160 DECL_BITFIELD2( 1161 is_gl_span :3, 1162 __reserved2 :5); 1163 uint8_t __reserved3; 1164 uint8_t is_gl_type; 1165 uint8_t is_gl_modifier; 1166 uint8_t is_gl_entity; 1167 uint8_t is_gl_instance; 1168 uint8_t is_gl_oem; 1169 DECL_BITFIELD3( 1170 is_gl_idlen :5, 1171 __reserved4 :1, 1172 is_gl_idtype :2); 1173 char is_gl_idstring[1]; 1174 } ipmi_sdr_generic_locator_t; 1175 1176 /* 1177 * FRU Device Locator Record. See section 43.8. 1178 */ 1179 1180 #define IPMI_SDR_TYPE_FRU_LOCATOR 0x11 1181 1182 typedef struct ipmi_sdr_fru_locator { 1183 /* RECORD KEY BYTES */ 1184 DECL_BITFIELD2( 1185 __reserved1 :1, 1186 is_fl_accessaddr :7); 1187 union { 1188 struct { 1189 uint8_t _is_fl_devid; 1190 } _logical; 1191 struct { 1192 DECL_BITFIELD2( 1193 __reserved :1, 1194 _is_fl_slaveaddr :7); 1195 } _nonintelligent; 1196 } _devid_or_slaveaddr; 1197 DECL_BITFIELD4( 1198 is_fl_bus :3, 1199 is_fl_lun :2, 1200 __reserved2 :2, 1201 is_fl_logical :1); 1202 DECL_BITFIELD2( 1203 __reserved3 :4, 1204 is_fl_channel :4); 1205 /* RECORD BODY BYTES */ 1206 uint8_t __reserved4; 1207 uint8_t is_fl_type; 1208 uint8_t is_fl_modifier; 1209 uint8_t is_fl_entity; 1210 uint8_t is_fl_instance; 1211 uint8_t is_fl_oem; 1212 DECL_BITFIELD3( 1213 is_fl_idlen :5, 1214 __reserved5 :1, 1215 is_fl_idtype :2); 1216 char is_fl_idstring[1]; 1217 } ipmi_sdr_fru_locator_t; 1218 1219 #define is_fl_devid _devid_or_slaveaddr._logical._is_fl_devid 1220 #define is_fl_slaveaddr _devid_or_slaveaddr._nonintelligent._is_fl_slaveaddr 1221 1222 /* 1223 * Management Controller Device Locator Record. See section 43.9 1224 */ 1225 1226 #define IPMI_SDR_TYPE_MANAGEMENT_LOCATOR 0x12 1227 1228 typedef struct ipmi_sdr_management_locator { 1229 /* RECORD KEY BYTES */ 1230 DECL_BITFIELD2( 1231 __reserved1 :1, 1232 is_ml_devaddr :7); 1233 DECL_BITFIELD2( 1234 is_ml_channel :4, 1235 __reserved2 :4); 1236 /* RECORD BODY BYTES */ 1237 DECL_BITFIELD7( 1238 is_ml_init_message :2, 1239 is_ml_init_log :1, 1240 is_ml_init_controller_log :1, 1241 __reserved3 :1, 1242 is_ml_static :1, 1243 is_ml_acpi_device :1, 1244 is_ml_acpi_system :1); 1245 DECL_BITFIELD8( 1246 is_ml_supp_sensor :1, 1247 is_ml_supp_sdr :1, 1248 is_ml_supp_sel :1, 1249 is_ml_supp_fru :1, 1250 is_ml_supp_event_receiver :1, 1251 is_ml_supp_event_generator :1, 1252 is_ml_supp_bridge :1, 1253 is_ml_supp_chassis :1); 1254 uint8_t __reserved4; 1255 uint16_t __reserved5; 1256 uint8_t is_ml_entity_id; 1257 uint8_t is_ml_entity_instance; 1258 uint8_t is_ml_oem; 1259 DECL_BITFIELD3( 1260 is_ml_idlen :5, 1261 __reserved6 :1, 1262 is_ml_idtype :2); 1263 char is_ml_idstring[1]; 1264 } ipmi_sdr_management_locator_t; 1265 1266 #define IPMI_MESSAGE_INIT_ENABLE 0x0 1267 #define IPMI_MESSAGE_INIT_DISABLE 0x1 1268 #define IPMI_MESSAGE_INIT_NONE 0x2 1269 1270 /* 1271 * Management Controller Confirmation Record. See section 43.10 1272 */ 1273 1274 #define IPMI_SDR_TYPE_MANAGEMENT_CONFIRMATION 0x13 1275 1276 typedef struct ipmi_sdr_management_confirmation { 1277 /* RECORD KEY BYTES */ 1278 DECL_BITFIELD2( 1279 __reserved1 :1, 1280 is_mc_slaveaddr :7); 1281 uint8_t is_mc_deviceid; 1282 DECL_BITFIELD2( 1283 is_mc_dev_revision :4, 1284 is_mc_channel :4); 1285 /* RECORD BODY BYTES */ 1286 DECL_BITFIELD2( 1287 is_mc_major_rev :7, 1288 __reserved2 :1); 1289 uint8_t is_mc_minor_rev; 1290 uint8_t is_mc_impi_ver; 1291 uint8_t is_mc_manufacturer[3]; 1292 uint16_t is_mc_product; 1293 uint8_t is_mc_guid[16]; 1294 } ipmi_sdr_management_confirmation_t; 1295 1296 /* 1297 * BMC Message Channel Info Record. See esction 43.11. 1298 */ 1299 1300 #define IPMI_SDR_TYPE_BMC_MESSAGE_CHANNEL 0x14 1301 1302 typedef struct ipmi_sdr_bmc_channel { 1303 /* RECORD BODY BYTES */ 1304 struct { 1305 DECL_BITFIELD3( 1306 is_bc_protocol :4, 1307 is_bc_receive_lun :3, 1308 is_bc_transmit :1); 1309 } is_bc_channel[8]; 1310 uint8_t is_bc_interrupt_type; 1311 uint8_t is_bc_buffer_type; 1312 uint8_t __reserved; 1313 } ipmi_sdr_bmc_channel_t; 1314 1315 /* 1316 * OEM Record. See ction 43.12. 1317 */ 1318 1319 #define IPMI_SDR_TYPE_OEM 0xC0 1320 1321 typedef struct ipmi_sdr_oem { 1322 uint8_t is_oem_manufacturer[3]; 1323 uint8_t is_oem_data[1]; 1324 } ipmi_sdr_oem_t; 1325 1326 /* 1327 * Iterate over the SDR repository. This function does the work of parsing the 1328 * name when available, and keeping the repository in a consistent state. 1329 */ 1330 extern int ipmi_sdr_iter(ipmi_handle_t *, 1331 int (*)(ipmi_handle_t *, const char *, ipmi_sdr_t *, void *), void *); 1332 1333 /* 1334 * Lookup the given sensor type by name. These functions automatically read in 1335 * and cache the complete SDR repository. 1336 */ 1337 extern ipmi_sdr_t *ipmi_sdr_lookup(ipmi_handle_t *, const char *); 1338 extern ipmi_sdr_fru_locator_t *ipmi_sdr_lookup_fru(ipmi_handle_t *, 1339 const char *); 1340 extern ipmi_sdr_generic_locator_t *ipmi_sdr_lookup_generic(ipmi_handle_t *, 1341 const char *); 1342 extern ipmi_sdr_compact_sensor_t *ipmi_sdr_lookup_compact_sensor( 1343 ipmi_handle_t *, const char *); 1344 extern ipmi_sdr_full_sensor_t *ipmi_sdr_lookup_full_sensor( 1345 ipmi_handle_t *, const char *); 1346 1347 /* 1348 * Entity ID codes. See table 43.13. 1349 */ 1350 #define IPMI_ET_UNSPECIFIED 0x00 1351 #define IPMI_ET_OTHER 0x01 1352 #define IPMI_ET_UNKNOWN 0x02 1353 #define IPMI_ET_PROCESSOR 0x03 1354 #define IPMI_ET_DISK 0x04 1355 #define IPMI_ET_PERIPHERAL 0x05 1356 #define IPMI_ET_MANAGEMENT_MODULE 0x06 1357 #define IPMI_ET_MOTHERBOARD 0x07 1358 #define IPMI_ET_MEMORY_MODULE 0x08 1359 #define IPMI_ET_PROCESSOR_MODULE 0x09 1360 #define IPMI_ET_PSU 0x0A 1361 #define IPMI_ET_CARD 0x0B 1362 #define IPMI_ET_FRONT_PANEL 0x0C 1363 #define IPMI_ET_BACK_PANEL 0x0D 1364 #define IPMI_ET_POWER_BOARD 0x0E 1365 #define IPMI_ET_BACKPLANE 0x0F 1366 #define IPMI_ET_EXPANSION_BOARD 0x10 1367 #define IPMI_ET_OTHER_BOARD 0x11 1368 #define IPMI_ET_PROCESSOR_BOARD 0x12 1369 #define IPMI_ET_POWER_DOMAIN 0x13 1370 #define IPMI_ET_POWER_CONVERTER 0x14 1371 #define IPMI_ET_POWER_MANAGEMENT 0x15 1372 #define IPMI_ET_BACK_CHASSIS 0x16 1373 #define IPMI_ET_SYSTEM_CHASSIS 0x17 1374 #define IPMI_ET_SUB_CHASSIS 0x18 1375 #define IPMI_ET_OTHER_CHASSIS 0x19 1376 #define IPMI_ET_DISK_BAY 0x1A 1377 #define IPMI_ET_PERIPHERAL_BAY 0x1B 1378 #define IPMI_ET_DEVICE_BAY 0x1C 1379 #define IPMI_ET_FAN 0x1D 1380 #define IPMI_ET_COOLING_DOMAIN 0x1E 1381 #define IPMI_ET_CABLE 0x1F 1382 #define IPMI_ET_MEMORY_DEVICE 0x20 1383 #define IPMI_ET_MANAGEMENT_SOFTWARE 0x21 1384 #define IPMI_ET_SYSTEM_FIRMWARE 0x22 1385 #define IPMI_ET_OS 0x23 1386 #define IPMI_ET_SYSTEM_BUS 0x24 1387 #define IPMI_ET_GROUP 0x25 1388 #define IPMI_ET_REMOTE 0x26 1389 #define IPMI_ET_ENVIRONMENT 0x27 1390 #define IPMI_ET_BATTERY 0x28 1391 #define IPMI_ET_BLADE 0x29 1392 #define IPMI_ET_SWITCH 0x2A 1393 #define IPMI_ET_PROCMEM_MODULE 0x2B 1394 #define IPMI_ET_IO_MODULE 0x2C 1395 #define IPMI_ET_PROCIO_MODULE 0x2D 1396 #define IPMI_ET_CONTROLLER_FIRMWARE 0x2E 1397 #define IPMI_ET_CHANNEL 0x2F 1398 #define IPMI_ET_PCI 0x30 1399 #define IPMI_ET_PCIE 0x31 1400 #define IPMI_ET_SCSI 0x32 1401 #define IPMI_ET_SATA_SAS 0x33 1402 #define IPMI_ET_FSB 0x34 1403 #define IPMI_ET_RTC 0x35 1404 1405 /* 1406 * Get Sensor Reading. See section 35.14. 1407 */ 1408 1409 #define IPMI_CMD_GET_SENSOR_READING 0x2d 1410 1411 typedef struct ipmi_sensor_reading { 1412 uint8_t isr_reading; 1413 DECL_BITFIELD4( 1414 __reserved1 :5, 1415 isr_state_unavailable :1, 1416 isr_scanning_enabled :1, 1417 isr_event_enabled :1); 1418 uint16_t isr_state; 1419 } ipmi_sensor_reading_t; 1420 1421 #define IPMI_SENSOR_THRESHOLD_LOWER_NONCRIT 0x0001 1422 #define IPMI_SENSOR_THRESHOLD_LOWER_CRIT 0x0002 1423 #define IPMI_SENSOR_THRESHOLD_LOWER_NONRECOV 0x0004 1424 #define IPMI_SENSOR_THRESHOLD_UPPER_NONCRIT 0x0008 1425 #define IPMI_SENSOR_THRESHOLD_UPPER_CRIT 0x0010 1426 #define IPMI_SENSOR_THRESHOLD_UPPER_NONRECOV 0x0020 1427 1428 extern ipmi_sensor_reading_t *ipmi_get_sensor_reading(ipmi_handle_t *, uint8_t); 1429 extern int ipmi_sdr_conv_reading(ipmi_sdr_full_sensor_t *, uint8_t, 1430 double *); 1431 /* 1432 * Set Sensor Reading. See section 35.14. 1433 */ 1434 #define IPMI_CMD_SET_SENSOR_READING 0x30 1435 1436 #define IPMI_SENSOR_OP_CLEAR 0x3 /* clear '0' bits */ 1437 #define IPMI_SENSOR_OP_SET 0x2 /* set '1' bits */ 1438 #define IPMI_SENSOR_OP_EXACT 0x1 /* set bits exactly */ 1439 1440 typedef struct ipmi_set_sensor_reading { 1441 uint8_t iss_id; 1442 DECL_BITFIELD5( 1443 iss_set_reading :1, 1444 __reserved :1, 1445 iss_deassrt_op :2, 1446 iss_assert_op :2, 1447 iss_data_bytes :2); 1448 uint8_t iss_sensor_reading; 1449 uint16_t iss_assert_state; /* optional */ 1450 uint16_t iss_deassert_state; /* optional */ 1451 uint8_t iss_event_data1; /* optional */ 1452 uint8_t iss_event_data2; /* optional */ 1453 uint8_t iss_event_data3; /* optional */ 1454 } ipmi_set_sensor_reading_t; 1455 1456 extern int ipmi_set_sensor_reading(ipmi_handle_t *, 1457 ipmi_set_sensor_reading_t *); 1458 1459 /* 1460 * These IPMI message id/opcodes are documented in Appendix G in the IPMI spec. 1461 * 1462 * Payloads for these two commands are described in Sections 34.1 and 34.2 of 1463 * the spec, respectively. 1464 */ 1465 #define IPMI_CMD_GET_FRU_INV_AREA 0x10 1466 #define IPMI_CMD_READ_FRU_DATA 0x11 1467 1468 /* 1469 * Structs to hold the FRU Common Header and the FRU Product Info Area, as 1470 * described in the IPMI Platform Management FRU Information Storage 1471 * Definition (v1.1). 1472 */ 1473 typedef struct ipmi_fru_hdr 1474 { 1475 uint8_t ifh_format; 1476 uint8_t ifh_int_use_off; 1477 uint8_t ifh_chassis_info_off; 1478 uint8_t ifh_board_info_off; 1479 uint8_t ifh_product_info_off; 1480 uint8_t ifh_multi_rec_off; 1481 uint8_t ifh_pad; 1482 uint8_t ifh_chksum; 1483 } ipmi_fru_hdr_t; 1484 1485 /* 1486 * Because only 6 bits are used to specify the length of each field in the FRU 1487 * product and board info areas, the biggest string we would ever need to hold 1488 * would be 63 chars plus a NULL. 1489 */ 1490 #define FRU_INFO_MAXLEN 64 1491 1492 typedef struct ipmi_fru_brd_info 1493 { 1494 char ifbi_manuf_date[3]; 1495 char ifbi_manuf_name[FRU_INFO_MAXLEN]; 1496 char ifbi_board_name[FRU_INFO_MAXLEN]; 1497 char ifbi_product_serial[FRU_INFO_MAXLEN]; 1498 char ifbi_part_number[FRU_INFO_MAXLEN]; 1499 } ipmi_fru_brd_info_t; 1500 1501 typedef struct ipmi_fru_prod_info 1502 { 1503 char ifpi_manuf_name[FRU_INFO_MAXLEN]; 1504 char ifpi_product_name[FRU_INFO_MAXLEN]; 1505 char ifpi_part_number[FRU_INFO_MAXLEN]; 1506 char ifpi_product_version[FRU_INFO_MAXLEN]; 1507 char ifpi_product_serial[FRU_INFO_MAXLEN]; 1508 char ifpi_asset_tag[FRU_INFO_MAXLEN]; 1509 } ipmi_fru_prod_info_t; 1510 1511 extern int ipmi_fru_read(ipmi_handle_t *, ipmi_sdr_fru_locator_t *, char **); 1512 extern int ipmi_fru_parse_board(ipmi_handle_t *, char *, ipmi_fru_brd_info_t *); 1513 extern int ipmi_fru_parse_product(ipmi_handle_t *, char *, 1514 ipmi_fru_prod_info_t *); 1515 1516 /* 1517 * Routines to convert from entity and sensors defines into text strings. 1518 */ 1519 void ipmi_entity_name(uint8_t, char *, size_t); 1520 void ipmi_sensor_type_name(uint8_t, char *, size_t); 1521 void ipmi_sensor_units_name(uint8_t, char *, size_t); 1522 void ipmi_sensor_reading_name(uint8_t, uint8_t, char *, size_t); 1523 1524 /* 1525 * Entity management. IPMI has a notion of 'entities', but these are not 1526 * directly accessible from any commands. Instead, their existence is inferred 1527 * from examining the SDR repository. Since this is rather unwieldy, and 1528 * iterating over entities is a common operation, libipmi provides an entity 1529 * abstraction that hides the implementation details. This handles entity 1530 * groupings as well as SDR associations. 1531 */ 1532 typedef struct ipmi_entity { 1533 uint8_t ie_type; 1534 uint8_t ie_instance; 1535 uint8_t ie_children; 1536 boolean_t ie_logical; 1537 } ipmi_entity_t; 1538 1539 extern int ipmi_entity_iter(ipmi_handle_t *, int (*)(ipmi_handle_t *, 1540 ipmi_entity_t *, void *), void *); 1541 extern int ipmi_entity_iter_sdr(ipmi_handle_t *, ipmi_entity_t *, 1542 int (*)(ipmi_handle_t *, ipmi_entity_t *, const char *, ipmi_sdr_t *, 1543 void *), void *); 1544 extern int ipmi_entity_iter_children(ipmi_handle_t *, ipmi_entity_t *, 1545 int (*)(ipmi_handle_t *, ipmi_entity_t *, void *), void *); 1546 extern ipmi_entity_t *ipmi_entity_lookup(ipmi_handle_t *, uint8_t, 1547 uint8_t); 1548 extern ipmi_entity_t *ipmi_entity_lookup_sdr(ipmi_handle_t *, const char *); 1549 extern ipmi_entity_t *ipmi_entity_parent(ipmi_handle_t *, ipmi_entity_t *); 1550 extern int ipmi_entity_present(ipmi_handle_t *, ipmi_entity_t *, boolean_t *); 1551 extern int ipmi_entity_present_sdr(ipmi_handle_t *, ipmi_sdr_t *, boolean_t *); 1552 1553 /* 1554 * User management. The raw functions are private to libipmi, and only the 1555 * higher level abstraction (ipmi_user_t) is exported to consumers of the 1556 * library. 1557 */ 1558 1559 #define IPMI_USER_PRIV_CALLBACK 0x1 1560 #define IPMI_USER_PRIV_USER 0x2 1561 #define IPMI_USER_PRIV_OPERATOR 0x3 1562 #define IPMI_USER_PRIV_ADMIN 0x4 1563 #define IPMI_USER_PRIV_OEM 0x5 1564 #define IPMI_USER_PRIV_NONE 0xf 1565 1566 typedef struct ipmi_user { 1567 uint8_t iu_uid; 1568 char *iu_name; 1569 boolean_t iu_enabled; 1570 boolean_t iu_ipmi_msg_enable; 1571 boolean_t iu_link_auth_enable; 1572 uint8_t iu_priv; 1573 } ipmi_user_t; 1574 1575 extern int ipmi_user_iter(ipmi_handle_t *, 1576 int (*)(ipmi_user_t *, void *), void *); 1577 extern ipmi_user_t *ipmi_user_lookup_name(ipmi_handle_t *, const char *); 1578 extern ipmi_user_t *ipmi_user_lookup_id(ipmi_handle_t *, uint8_t); 1579 extern int ipmi_user_set_password(ipmi_handle_t *, uint8_t, const char *); 1580 1581 /* 1582 * The remaining functions are private to the implementation of the Sun ILOM 1583 * service processor. These function first check the manufacturer from the IPMI 1584 * device ID, and will return EIPMI_NOT_SUPPORTED if attempted for non-Sun 1585 * devices. 1586 */ 1587 1588 /* 1589 * Sun OEM LED requests. 1590 */ 1591 1592 #define IPMI_SUNOEM_LED_MODE_OFF 0 1593 #define IPMI_SUNOEM_LED_MODE_ON 1 1594 #define IPMI_SUNOEM_LED_MODE_STANDBY 2 1595 #define IPMI_SUNOEM_LED_MODE_SLOW 3 1596 #define IPMI_SUNOEM_LED_MODE_FAST 4 1597 1598 /* 1599 * These functions take a SDR record and construct the appropriate form of the 1600 * above commands. 1601 */ 1602 extern int ipmi_sunoem_led_set(ipmi_handle_t *, 1603 ipmi_sdr_generic_locator_t *, uint8_t); 1604 extern int ipmi_sunoem_led_get(ipmi_handle_t *, 1605 ipmi_sdr_generic_locator_t *, uint8_t *); 1606 1607 /* 1608 * Sun OEM uptime. Note that the underlying command returns the uptime in big 1609 * endian form. This wrapper automatically converts to the appropriate native 1610 * form. 1611 */ 1612 1613 #define IPMI_CMD_SUNOEM_UPTIME 0x08 1614 1615 extern int ipmi_sunoem_uptime(ipmi_handle_t *, uint32_t *, uint32_t *); 1616 1617 /* 1618 * Sun OEM FRU update. The FRU information is managed through a generic 1619 * identifier, and then a type-specific data portion. The wrapper function will 1620 * automatically fill in the data length field according to which type is 1621 * specified. 1622 */ 1623 1624 #define IPMI_CMD_SUNOEM_FRU_UPDATE 0x16 1625 1626 #define IPMI_SUNOEM_FRU_DIMM 0x00 1627 #define IPMI_SUNOEM_FRU_CPU 0x01 1628 #define IPMI_SUNOEM_FRU_BIOS 0x02 1629 #define IPMI_SUNOEM_FRU_DISK 0x03 1630 1631 typedef struct ipmi_sunoem_fru { 1632 uint8_t isf_type; 1633 uint8_t isf_id; 1634 uint8_t isf_datalen; 1635 union { 1636 struct { 1637 uint8_t isf_data[128]; 1638 } dimm; 1639 struct { 1640 uint32_t isf_thermtrip; 1641 uint32_t isf_eax; 1642 char isf_product[48]; 1643 } cpu; 1644 struct { 1645 char isf_part[16]; 1646 char isf_version[16]; 1647 } bios; 1648 struct { 1649 char isf_manufacturer[16]; 1650 char isf_model[28]; 1651 char isf_serial[20]; 1652 char isf_version[8]; 1653 char isf_capacity[16]; 1654 } disk; 1655 } isf_data; 1656 } ipmi_sunoem_fru_t; 1657 1658 int ipmi_sunoem_update_fru(ipmi_handle_t *, ipmi_sunoem_fru_t *); 1659 1660 #pragma pack() 1661 1662 #ifdef __cplusplus 1663 } 1664 #endif 1665 1666 #endif /* _LIBIPMI_H */ 1667