1 /* 2 * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 8 * Redistribution of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 11 * Redistribution in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 15 * Neither the name of Sun Microsystems, Inc. or the names of 16 * contributors may be used to endorse or promote products derived 17 * from this software without specific prior written permission. 18 * 19 * This software is provided "AS IS," without a warranty of any kind. 20 * ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, 21 * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A 22 * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. 23 * SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE 24 * FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING 25 * OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL 26 * SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, 27 * OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR 28 * PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF 29 * LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, 30 * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 31 */ 32 33 #ifndef IPMI_FRU_H 34 #define IPMI_FRU_H 35 36 #include <inttypes.h> 37 #include <ipmitool/ipmi.h> 38 #include <ipmitool/ipmi_sdr.h> 39 40 #if HAVE_CONFIG_H 41 # include <config.h> 42 #endif 43 44 #define GET_FRU_INFO 0x10 45 #define GET_FRU_DATA 0x11 46 #define SET_FRU_DATA 0x12 47 48 enum { 49 FRU_CHASSIS_PARTNO, 50 FRU_CHASSIS_SERIAL, 51 FRU_BOARD_MANUF, 52 FRU_BOARD_PRODUCT, 53 FRU_BOARD_SERIAL, 54 FRU_BOARD_PARTNO, 55 FRU_PRODUCT_MANUF, 56 FRU_PRODUCT_NAME, 57 FRU_PRODUCT_PARTNO, 58 FRU_PRODUCT_VERSION, 59 FRU_PRODUCT_SERIAL, 60 FRU_PRODUCT_ASSET, 61 }; 62 63 struct fru_info { 64 uint16_t size; 65 uint8_t access:1; 66 uint8_t max_read_size; 67 uint8_t max_write_size; 68 }; 69 70 #ifdef HAVE_PRAGMA_PACK 71 #pragma pack(1) 72 #endif 73 struct fru_header { 74 uint8_t version; 75 union { 76 struct { 77 uint8_t internal; 78 uint8_t chassis; 79 uint8_t board; 80 uint8_t product; 81 uint8_t multi; 82 } offset; 83 uint8_t offsets[5]; 84 }; 85 uint8_t pad; 86 uint8_t checksum; 87 }ATTRIBUTE_PACKING; 88 #ifdef HAVE_PRAGMA_PACK 89 #pragma pack(0) 90 #endif 91 92 struct fru_area_chassis { 93 uint8_t area_ver; 94 uint8_t type; 95 uint16_t area_len; 96 char * part; 97 char * serial; 98 }; 99 100 struct fru_area_board { 101 uint8_t area_ver; 102 uint8_t lang; 103 uint16_t area_len; 104 uint32_t mfg_date_time; 105 char * mfg; 106 char * prod; 107 char * serial; 108 char * part; 109 char * fru; 110 }; 111 112 struct fru_area_product { 113 uint8_t area_ver; 114 uint8_t lang; 115 uint16_t area_len; 116 char * mfg; 117 char * name; 118 char * part; 119 char * version; 120 char * serial; 121 char * asset; 122 char * fru; 123 }; 124 125 #ifdef HAVE_PRAGMA_PACK 126 #pragma pack(1) 127 #endif 128 struct fru_multirec_header { 129 #define FRU_RECORD_TYPE_POWER_SUPPLY_INFORMATION 0x00 130 #define FRU_RECORD_TYPE_DC_OUTPUT 0x01 131 #define FRU_RECORD_TYPE_DC_LOAD 0x02 132 #define FRU_RECORD_TYPE_MANAGEMENT_ACCESS 0x03 133 #define FRU_RECORD_TYPE_BASE_COMPATIBILITY 0x04 134 #define FRU_RECORD_TYPE_EXTENDED_COMPATIBILITY 0x05 135 #define FRU_RECORD_TYPE_OEM_EXTENSION 0xc0 136 uint8_t type; 137 uint8_t format; 138 uint8_t len; 139 uint8_t record_checksum; 140 uint8_t header_checksum; 141 }ATTRIBUTE_PACKING; 142 #ifdef HAVE_PRAGMA_PACK 143 #pragma pack(0) 144 #endif 145 146 #ifdef HAVE_PRAGMA_PACK 147 #pragma pack(1) 148 #endif 149 struct fru_multirec_powersupply { 150 #if WORDS_BIGENDIAN 151 uint16_t capacity; 152 #else 153 uint16_t capacity:12; 154 uint16_t __reserved1:4; 155 #endif 156 uint16_t peak_va; 157 uint8_t inrush_current; 158 uint8_t inrush_interval; 159 uint16_t lowend_input1; 160 uint16_t highend_input1; 161 uint16_t lowend_input2; 162 uint16_t highend_input2; 163 uint8_t lowend_freq; 164 uint8_t highend_freq; 165 uint8_t dropout_tolerance; 166 #if WORDS_BIGENDIAN 167 uint8_t __reserved2:3; 168 uint8_t tach:1; 169 uint8_t hotswap:1; 170 uint8_t autoswitch:1; 171 uint8_t pfc:1; 172 uint8_t predictive_fail:1; 173 #else 174 uint8_t predictive_fail:1; 175 uint8_t pfc:1; 176 uint8_t autoswitch:1; 177 uint8_t hotswap:1; 178 uint8_t tach:1; 179 uint8_t __reserved2:3; 180 #endif 181 uint16_t peak_cap_ht; 182 #if WORDS_BIGENDIAN 183 uint8_t combined_voltage1:4; 184 uint8_t combined_voltage2:4; 185 #else 186 uint8_t combined_voltage2:4; 187 uint8_t combined_voltage1:4; 188 #endif 189 uint16_t combined_capacity; 190 uint8_t rps_threshold; 191 }ATTRIBUTE_PACKING; 192 #ifdef HAVE_PRAGMA_PACK 193 #pragma pack(0) 194 #endif 195 196 static const char * combined_voltage_desc[] __attribute__((unused)) = { 197 "12 V", "-12 V", "5 V", "3.3 V"}; 198 199 #ifdef HAVE_PRAGMA_PACK 200 #pragma pack(1) 201 #endif 202 struct fru_multirec_dcoutput { 203 #if WORDS_BIGENDIAN 204 uint8_t standby:1; 205 uint8_t __reserved:3; 206 uint8_t output_number:4; 207 #else 208 uint8_t output_number:4; 209 uint8_t __reserved:3; 210 uint8_t standby:1; 211 #endif 212 short nominal_voltage; 213 short max_neg_dev; 214 short max_pos_dev; 215 uint16_t ripple_and_noise; 216 uint16_t min_current; 217 uint16_t max_current; 218 }ATTRIBUTE_PACKING; 219 #ifdef HAVE_PRAGMA_PACK 220 #pragma pack(0) 221 #endif 222 223 #ifdef HAVE_PRAGMA_PACK 224 #pragma pack(1) 225 #endif 226 struct fru_multirec_dcload { 227 #if WORDS_BIGENDIAN 228 uint8_t __reserved:4; 229 uint8_t output_number:4; 230 #else 231 uint8_t output_number:4; 232 uint8_t __reserved:4; 233 #endif 234 short nominal_voltage; 235 short min_voltage; 236 short max_voltage; 237 uint16_t ripple_and_noise; 238 uint16_t min_current; 239 uint16_t max_current; 240 }ATTRIBUTE_PACKING; 241 #ifdef HAVE_PRAGMA_PACK 242 #pragma pack(0) 243 #endif 244 245 #ifdef HAVE_PRAGMA_PACK 246 #pragma pack(1) 247 #endif 248 struct fru_multirec_oem_header { 249 unsigned char mfg_id[3]; 250 #define FRU_PICMG_BACKPLANE_P2P 0x04 251 #define FRU_PICMG_ADDRESS_TABLE 0x10 252 #define FRU_PICMG_SHELF_POWER_DIST 0x11 253 #define FRU_PICMG_SHELF_ACTIVATION 0x12 254 #define FRU_PICMG_SHMC_IP_CONN 0x13 255 #define FRU_PICMG_BOARD_P2P 0x14 256 #define FRU_AMC_CURRENT 0x16 257 #define FRU_AMC_ACTIVATION 0x17 258 #define FRU_AMC_CARRIER_P2P 0x18 259 #define FRU_AMC_P2P 0x19 260 #define FRU_AMC_CARRIER_INFO 0x1a 261 #define FRU_UTCA_FRU_INFO_TABLE 0x20 262 #define FRU_UTCA_CARRIER_MNG_IP 0x21 263 #define FRU_UTCA_CARRIER_INFO 0x22 264 #define FRU_UTCA_CARRIER_LOCATION 0x23 265 #define FRU_UTCA_SHMC_IP_LINK 0x24 266 #define FRU_UTCA_POWER_POLICY 0x25 267 #define FRU_UTCA_ACTIVATION 0x26 268 #define FRU_UTCA_PM_CAPABILTY 0x27 269 #define FRU_UTCA_FAN_GEOGRAPHY 0x28 270 #define FRU_UTCA_CLOCK_MAPPING 0x29 271 #define FRU_UTCA_MSG_BRIDGE_POLICY 0x2A 272 #define FRU_UTCA_OEM_MODULE_DESC 0x2B 273 #define FRU_PICMG_CLK_CARRIER_P2P 0x2C 274 #define FRU_PICMG_CLK_CONFIG 0x2D 275 unsigned char record_id; 276 unsigned char record_version; 277 }ATTRIBUTE_PACKING; 278 #ifdef HAVE_PRAGMA_PACK 279 #pragma pack(0) 280 #endif 281 282 #ifdef HAVE_PRAGMA_PACK 283 #pragma pack(1) 284 #endif 285 struct fru_picmgext_guid { 286 unsigned char guid[16]; 287 }ATTRIBUTE_PACKING; 288 #ifdef HAVE_PRAGMA_PACK 289 #pragma pack(0) 290 #endif 291 292 #ifdef HAVE_PRAGMA_PACK 293 #pragma pack(1) 294 #endif 295 struct fru_picmgext_link_desc { 296 #ifndef WORDS_BIGENDIAN 297 unsigned int desig_channel:6; 298 unsigned int desig_if:2; 299 unsigned int desig_port:4; 300 #define FRU_PICMGEXT_LINK_TYPE_BASE 0x01 301 #define FRU_PICMGEXT_LINK_TYPE_FABRIC_ETHERNET 0x02 302 #define FRU_PICMGEXT_LINK_TYPE_FABRIC_INFINIBAND 0x03 303 #define FRU_PICMGEXT_LINK_TYPE_FABRIC_STAR 0x04 304 #define FRU_PICMGEXT_LINK_TYPE_PCIE 0x05 305 unsigned int type:8; 306 unsigned int ext:4; 307 unsigned int grouping:8; 308 #else 309 unsigned int grouping:8; 310 unsigned int ext:4; 311 #define FRU_PICMGEXT_LINK_TYPE_BASE 0x01 312 #define FRU_PICMGEXT_LINK_TYPE_FABRIC_ETHERNET 0x02 313 #define FRU_PICMGEXT_LINK_TYPE_FABRIC_INFINIBAND 0x03 314 #define FRU_PICMGEXT_LINK_TYPE_FABRIC_STAR 0x04 315 #define FRU_PICMGEXT_LINK_TYPE_PCIE 0x05 316 unsigned int type:8; 317 unsigned int desig_port:4; 318 unsigned int desig_if:2; 319 unsigned int desig_channel:6; 320 #endif 321 }ATTRIBUTE_PACKING; 322 #ifdef HAVE_PRAGMA_PACK 323 #pragma pack(0) 324 #endif 325 326 327 #define FRU_PICMGEXT_AMC_LINK_TYPE_RESERVED 0x00 328 #define FRU_PICMGEXT_AMC_LINK_TYPE_RESERVED1 0x01 329 #define FRU_PICMGEXT_AMC_LINK_TYPE_PCI_EXPRESS 0x02 330 #define FRU_PICMGEXT_AMC_LINK_TYPE_ADVANCED_SWITCHING1 0x03 331 #define FRU_PICMGEXT_AMC_LINK_TYPE_ADVANCED_SWITCHING2 0x04 332 #define FRU_PICMGEXT_AMC_LINK_TYPE_ETHERNET 0x05 333 #define FRU_PICMGEXT_AMC_LINK_TYPE_RAPIDIO 0x06 334 #define FRU_PICMGEXT_AMC_LINK_TYPE_STORAGE 0x07 335 336 #ifdef HAVE_PRAGMA_PACK 337 #pragma pack(1) 338 #endif 339 /* This is used in command, not in FRU */ 340 struct fru_picmgext_amc_link_info { 341 unsigned char linkInfo[3]; 342 }ATTRIBUTE_PACKING; 343 #ifdef HAVE_PRAGMA_PACK 344 #pragma pack(0) 345 #endif 346 347 #ifdef HAVE_PRAGMA_PACK 348 #pragma pack(1) 349 #endif 350 struct fru_picmgext_amc_link_desc_core { 351 #ifndef WORDS_BIGENDIAN 352 unsigned int designator:12; 353 unsigned int type:8; 354 unsigned int ext:4; 355 unsigned int grouping:8; 356 #else 357 unsigned int grouping:8; 358 unsigned int ext:4; 359 unsigned int type:8; 360 unsigned int designator:12; 361 #endif 362 }ATTRIBUTE_PACKING; 363 #ifdef HAVE_PRAGMA_PACK 364 #pragma pack(0) 365 #endif 366 367 #ifdef HAVE_PRAGMA_PACK 368 #pragma pack(1) 369 #endif 370 struct fru_picmgext_amc_link_desc_extra { 371 #ifndef WORDS_BIGENDIAN 372 unsigned char asymetricMatch:2; 373 unsigned char reserved:6; 374 #else 375 unsigned char reserved:6; 376 unsigned char asymetricMatch:2; 377 #endif 378 }ATTRIBUTE_PACKING; 379 #ifdef HAVE_PRAGMA_PACK 380 #pragma pack(0) 381 #endif 382 383 384 #ifdef HAVE_PRAGMA_PACK 385 #pragma pack(1) 386 #endif 387 struct fru_picmgext_amc_link_desc { 388 #ifndef WORDS_BIGENDIAN 389 struct fru_picmgext_amc_link_desc_core core;/* lsb */ 390 struct fru_picmgext_amc_link_desc_extra extra; 391 #else 392 struct fru_picmgext_amc_link_desc_extra extra; 393 struct fru_picmgext_amc_link_desc_core core;/* lsb */ 394 #endif 395 }ATTRIBUTE_PACKING; 396 #ifdef HAVE_PRAGMA_PACK 397 #pragma pack(0) 398 #endif 399 400 401 #define FRU_PICMGEXT_OEM_SWFW 0x03 402 #define OEM_SWFW_NBLOCK_OFFSET 0x05 403 #define OEM_SWFW_FIELD_START_OFFSET 0x06 404 405 #define FRU_PICMGEXT_CHN_DESC_RECORD_SIZE 3 406 #ifdef HAVE_PRAGMA_PACK 407 #pragma pack(1) 408 #endif 409 struct fru_picmgext_chn_desc { 410 #ifndef WORDS_BIGENDIAN 411 unsigned int remote_slot:8; 412 unsigned int remote_chn:5; 413 unsigned int local_chn:5; 414 unsigned int res:14; 415 #else 416 unsigned int res:14; 417 unsigned int local_chn:5; 418 unsigned int remote_chn:5; 419 unsigned int remote_slot:8; 420 #endif 421 }ATTRIBUTE_PACKING; 422 #ifdef HAVE_PRAGMA_PACK 423 #pragma pack(0) 424 #endif 425 426 #ifdef HAVE_PRAGMA_PACK 427 #pragma pack(1) 428 #endif 429 struct fru_picmgext_slot_desc { 430 unsigned char chan_type; 431 unsigned char slot_addr; 432 unsigned char chn_count; 433 }ATTRIBUTE_PACKING; 434 #ifdef HAVE_PRAGMA_PACK 435 #pragma pack(0) 436 #endif 437 438 #define FRU_PICMGEXT_DESIGN_IF_BASE 0x00 439 #define FRU_PICMGEXT_DESIGN_IF_FABRIC 0x01 440 #define FRU_PICMGEXT_DESIGN_IF_UPDATE_CHANNEL 0x02 441 #define FRU_PICMGEXT_DESIGN_IF_RESERVED 0x03 442 443 #ifdef HAVE_PRAGMA_PACK 444 #pragma pack(1) 445 #endif 446 struct fru_picmgext_carrier_activation_record { 447 unsigned short max_internal_curr; 448 unsigned char allowance_for_readiness; 449 unsigned char module_activation_record_count; 450 }ATTRIBUTE_PACKING; 451 #ifdef HAVE_PRAGMA_PACK 452 #pragma pack(0) 453 #endif 454 455 #ifdef HAVE_PRAGMA_PACK 456 #pragma pack(1) 457 #endif 458 struct fru_picmgext_activation_record { 459 unsigned char ibmb_addr; 460 unsigned char max_module_curr; 461 unsigned char reserved; 462 }ATTRIBUTE_PACKING; 463 #ifdef HAVE_PRAGMA_PACK 464 #pragma pack(0) 465 #endif 466 467 #ifdef HAVE_PRAGMA_PACK 468 #pragma pack(1) 469 #endif 470 struct fru_picmgext_carrier_p2p_record { 471 unsigned char resource_id; 472 unsigned char p2p_count; 473 }ATTRIBUTE_PACKING; 474 #ifdef HAVE_PRAGMA_PACK 475 #pragma pack(0) 476 #endif 477 478 #ifdef HAVE_PRAGMA_PACK 479 #pragma pack(1) 480 #endif 481 struct fru_picmgext_carrier_p2p_descriptor { 482 #ifndef WORDS_BIGENDIAN 483 unsigned char remote_resource_id; 484 unsigned short remote_port:5; 485 unsigned short local_port:5; 486 unsigned short reserved:6; 487 #else 488 unsigned short reserved:6; 489 unsigned short local_port:5; 490 unsigned short remote_port:5; 491 unsigned char remote_resource_id; 492 #endif 493 }ATTRIBUTE_PACKING; 494 #ifdef HAVE_PRAGMA_PACK 495 #pragma pack(0) 496 #endif 497 498 #ifdef HAVE_PRAGMA_PACK 499 #pragma pack(1) 500 #endif 501 struct fru_picmgext_amc_p2p_record { 502 #ifndef WORDS_BIGENDIAN 503 unsigned char resource_id :4; 504 unsigned char /* reserved */ :3; 505 unsigned char record_type :1; 506 #else 507 unsigned char record_type :1; 508 unsigned char /* reserved */ :3; 509 unsigned char resource_id :4; 510 #endif 511 }ATTRIBUTE_PACKING; 512 #ifdef HAVE_PRAGMA_PACK 513 #pragma pack(0) 514 #endif 515 516 #define FRU_PICMGEXT_AMC_CHANNEL_DESC_RECORD_SIZE 3 517 #ifdef HAVE_PRAGMA_PACK 518 #pragma pack(1) 519 #endif 520 struct fru_picmgext_amc_channel_desc_record { 521 #ifndef WORDS_BIGENDIAN 522 unsigned int lane0port :5; 523 unsigned int lane1port :5; 524 unsigned int lane2port :5; 525 unsigned int lane3port :5; 526 unsigned int /* reserved */ :12; 527 #else 528 unsigned int /* reserved */ :12; 529 unsigned int lane3port :5; 530 unsigned int lane2port :5; 531 unsigned int lane1port :5; 532 unsigned int lane0port :5; 533 #endif 534 }ATTRIBUTE_PACKING; 535 #ifdef HAVE_PRAGMA_PACK 536 #pragma pack(0) 537 #endif 538 539 #define FRU_PICMGEXT_AMC_LINK_DESC_RECORD_SIZE 5 540 #ifdef HAVE_PRAGMA_PACK 541 #pragma pack(1) 542 #endif 543 struct fru_picmgext_amc_link_desc_record { 544 #define FRU_PICMGEXT_AMC_LINK_TYPE_PCIE 0x02 545 #define FRU_PICMGEXT_AMC_LINK_TYPE_PCIE_AS1 0x03 546 #define FRU_PICMGEXT_AMC_LINK_TYPE_PCIE_AS2 0x04 547 #define FRU_PICMGEXT_AMC_LINK_TYPE_ETHERNET 0x05 548 #define FRU_PICMGEXT_AMC_LINK_TYPE_RAPIDIO 0x06 549 #define FRU_PICMGEXT_AMC_LINK_TYPE_STORAGE 0x07 550 551 #define AMC_LINK_TYPE_EXT_PCIE_G1_NSSC 0x00 552 #define AMC_LINK_TYPE_EXT_PCIE_G1_SSC 0x01 553 #define AMC_LINK_TYPE_EXT_PCIE_G2_NSSC 0x02 554 #define AMC_LINK_TYPE_EXT_PCIE_G2_SSC 0x03 555 556 #define AMC_LINK_TYPE_EXT_ETH_1000_BX 0x00 557 #define AMC_LINK_TYPE_EXT_ETH_10G_XAUI 0x01 558 559 #define AMC_LINK_TYPE_EXT_STORAGE_FC 0x00 560 #define AMC_LINK_TYPE_EXT_STORAGE_SATA 0x01 561 #define AMC_LINK_TYPE_EXT_STORAGE_SAS 0x02 562 #ifndef WORDS_BIGENDIAN 563 unsigned int channel_id :8; 564 unsigned int port_flag_0 :1; 565 unsigned int port_flag_1 :1; 566 unsigned int port_flag_2 :1; 567 unsigned int port_flag_3 :1; 568 unsigned int type :8; 569 unsigned int type_ext :4; 570 unsigned int group_id :8; 571 unsigned int asym_match :2; 572 unsigned int /* reserved */ :30; 573 #else 574 unsigned int group_id :8; 575 unsigned int type_ext :4; 576 unsigned int type :8; 577 unsigned int port_flag_3 :1; 578 unsigned int port_flag_2 :1; 579 unsigned int port_flag_1 :1; 580 unsigned int port_flag_0 :1; 581 unsigned int channel_id :8; 582 583 unsigned int /* reserved */ :30; 584 unsigned int asym_match :2; 585 #endif 586 }ATTRIBUTE_PACKING; 587 #ifdef HAVE_PRAGMA_PACK 588 #pragma pack(0) 589 #endif 590 591 /* FRU Board manufacturing date */ 592 static const uint64_t secs_from_1970_1996 = 820454400; 593 static const char * chassis_type_desc[] __attribute__((unused)) = { 594 "Unspecified", "Other", "Unknown", 595 "Desktop", "Low Profile Desktop", "Pizza Box", 596 "Mini Tower", "Tower", 597 "Portable", "LapTop", "Notebook", "Hand Held", 598 "Docking Station", "All in One", "Sub Notebook", 599 "Space-saving", "Lunch Box", "Main Server Chassis", 600 "Expansion Chassis", "SubChassis", "Bus Expansion Chassis", 601 "Peripheral Chassis", "RAID Chassis", "Rack Mount Chassis", 602 "Sealed-case PC", "Multi-system Chassis", "CompactPCI", 603 "AdvancedTCA", "Blade", "Blade Enclosure" 604 }; 605 606 typedef struct ipmi_fru_bloc { 607 struct ipmi_fru_bloc * next; 608 uint16_t start; 609 uint16_t size; 610 uint8_t blocId[32]; 611 } t_ipmi_fru_bloc; 612 613 static const char *section_id[4] = { 614 "Internal Use Section", 615 "Chassis Section", 616 "Board Section", 617 "Product Section" 618 }; 619 620 int ipmi_fru_main(struct ipmi_intf *intf, int argc, char **argv); 621 int ipmi_fru_print(struct ipmi_intf *intf, struct sdr_record_fru_locator *fru); 622 623 #endif /* IPMI_FRU_H */ 624