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