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