@@ -312,7 +312,17 @@ class MLNX_ID(object):
312312 ]},
313313}
314314
315+ # FAN "fixed fileds" FRU fields description
316+ FIXED_FIELD_FAN_VPD = {"type" : "FIXED_FILED_VPD" ,
317+ "blk_type" : "FIXED_FIELD_FAN_VPD_BLK" ,
318+ "format" : [
319+ ["PN" , 0 , 16 , "FT_ASCII" ],
320+ ["SN" , 16 , 16 , "FT_ASCII" ]
321+ ]}
322+
315323MLNX_VENDOR_BLK_FIELDS = ["name" , "minor_version" , "offset" , "length" , "info_type" , "type" ]
324+ FIXED_FIELD_BLK_FIELDS = ["name" , "offset" , "length" , "type" ]
325+
316326MLNX_CPU_VPD = MLNX_VENDOR_BLK
317327MLNX_FAN_VPD = MLNX_VENDOR_BLK
318328MLNX_PDB_VPD = MLNX_VENDOR_BLK
@@ -350,6 +360,54 @@ def format_unpack(_data, item, blk_header, verbose=False):
350360 return val
351361
352362
363+ def parse_fru_fixed_fields_bin (data , blk_hdr , verbose = False ):
364+ if "format" not in blk_hdr .keys ():
365+ return "-"
366+ block_format = blk_hdr ["format" ]
367+ printv ("Block_type {}\n " .format (blk_hdr ["blk_type" ]), verbose )
368+ rec_list = []
369+ for rec in block_format :
370+ rec_dict = dict (list (zip (FIXED_FIELD_BLK_FIELDS , rec )))
371+ rec_size = rec_dict ["length" ]
372+ rec_offset = rec_dict ["offset" ]
373+
374+ rec_type = rec_dict ["type" ]
375+ if rec_type == "FT_RESERVED" :
376+ continue
377+
378+ printv ("rec: {}" .format (rec ), verbose )
379+
380+ _data = data [rec_offset : rec_offset + rec_size ]
381+ rec_name = rec_dict ["name" ]
382+ if rec_type == "FT_ASCII" :
383+ item_format = "{}s" .format (rec_size )
384+ val = struct .unpack (item_format , _data )[0 ]
385+ val = val .split (b'\x00 ' )[0 ]
386+ elif rec_type == "FT_NUM" :
387+ _data_str = struct .unpack ("{}B" .format (rec_size ), _data )
388+ val = int_unpack_be (_data_str )
389+ elif rec_type == "FT_NUM_INV" :
390+ _data_str = struct .unpack ("{}B" .format (rec_size ), _data )
391+ val = int_unpack_le (_data_str )
392+ elif rec_type == "FT_HEX" :
393+ _data_str = struct .unpack ("{}B" .format (rec_size ), _data )
394+ val = hex (int_unpack_be (_data_str ))
395+ elif rec_type == "FT_HEX_INV" :
396+ _data_str = struct .unpack ("{}B" .format (rec_size ), _data )
397+ val = hex (int_unpack_le (_data_str ))
398+ elif rec_type == "FT_MAC" :
399+ _data_str = struct .unpack ("{}B" .format (rec_size ), _data )
400+ val = ':' .join (['{:02X}' .format (byte ) for byte in _data_str ])
401+ else :
402+ continue
403+
404+ printv ("BIN: {}" .format (binascii .hexlify (_data )), verbose )
405+ printv ("{} : {}\n " .format (rec_name , bin_decode (val )), verbose )
406+
407+ rec_list .append ([rec_name , bin_decode (val )])
408+
409+ return {'items' : rec_list }
410+
353411def mlnx_blk_unpack (data , blk_hdr , size , verbose = False ):
354412 if "format" not in blk_hdr .keys ():
355413 return "-"
@@ -585,6 +643,8 @@ def parse_fru_bin(data, VPD_TYPE, verbose):
585643 res = parse_fru_onie_bin (data , FRU_ITEMS , verbose )
586644 elif FRU_ITEMS ["type" ] == "MLNX" :
587645 res = parse_fru_mlnx_bin (data , FRU_ITEMS , verbose )
646+ elif FRU_ITEMS ["type" ] == "FIXED_FILED_VPD" :
647+ res = parse_fru_fixed_fields_bin (data , FRU_ITEMS , verbose )
588648 else :
589649 res = parse_fru_onie_bin (data , SYSTEM_VPD , verbose )
590650 if not res :
@@ -670,6 +730,7 @@ def check_crc32(data_bin, crc32):
670730 "SYSTEM_VPD" ,
671731 "MLNX_CPU_VPD" ,
672732 "MLNX_FAN_VPD" ,
733+ "FIXED_FIELD_FAN_VPD" ,
673734 "MLNX_PDB_VPD" ,
674735 "MLNX_CARTRIDGE_VPD" ])
675736 parser .add_argument ('--verbose' , dest = 'verbose' , required = False , default = 0 , help = argparse .SUPPRESS )
0 commit comments