/* SPDX-License-Identifier: GPL-2.0+ */ /* * (C) Copyright 2019 Xilinx, Inc. * Siva Durga Prasad Paladugu */ #ifndef __FRU_H #define __FRU_H #include struct fru_common_hdr { u8 version; u8 off_internal; u8 off_chassis; u8 off_board; u8 off_product; u8 off_multirec; u8 pad; u8 crc; }; #define FRU_BOARD_MAX_LEN 32 #define FRU_MAX_NO_OF_MAC_ADDR 4 struct __packed fru_board_info_header { u8 ver; u8 len; u8 lang_code; u8 time[3]; }; struct __packed fru_board_info_member { u8 type_len; u8 *name; }; struct fru_board_data { u8 ver; u8 len; u8 lang_code; u8 time[3]; u8 manufacturer_type_len; u8 manufacturer_name[FRU_BOARD_MAX_LEN]; u8 product_name_type_len; u8 product_name[FRU_BOARD_MAX_LEN]; u8 serial_number_type_len; u8 serial_number[FRU_BOARD_MAX_LEN]; u8 part_number_type_len; u8 part_number[FRU_BOARD_MAX_LEN]; u8 file_id_type_len; u8 file_id[FRU_BOARD_MAX_LEN]; /* Xilinx custom fields */ u8 rev_type_len; u8 rev[FRU_BOARD_MAX_LEN]; u8 pcie_type_len; u8 pcie[FRU_BOARD_MAX_LEN]; u8 uuid_type_len; u8 uuid[FRU_BOARD_MAX_LEN]; }; struct fru_multirec_hdr { u8 rec_type; u8 type; u8 len; u8 csum; u8 hdr_csum; }; struct fru_multirec_mac { u8 xlnx_iana_id[3]; u8 ver; u8 macid[FRU_MAX_NO_OF_MAC_ADDR][ETH_ALEN]; }; struct fru_table { struct fru_common_hdr hdr; struct fru_board_data brd; struct fru_multirec_mac mac; bool captured; }; #define FRU_TYPELEN_CODE_MASK 0xC0 #define FRU_TYPELEN_LEN_MASK 0x3F #define FRU_COMMON_HDR_VER_MASK 0xF #define FRU_COMMON_HDR_LEN_MULTIPLIER 8 #define FRU_LANG_CODE_ENGLISH 0 #define FRU_LANG_CODE_ENGLISH_1 25 #define FRU_TYPELEN_EOF 0xC1 #define FRU_MULTIREC_TYPE_OEM 0xD2 #define FRU_MULTIREC_MAC_OFFSET 4 #define FRU_LAST_REC BIT(7) #define FRU_DUT_MACID 0x31 /* This should be minimum of fields */ #define FRU_BOARD_AREA_TOTAL_FIELDS 5 #define FRU_TYPELEN_TYPE_SHIFT 6 #define FRU_TYPELEN_TYPE_BINARY 0 #define FRU_TYPELEN_TYPE_ASCII8 3 int fru_display(int verbose); int fru_capture(unsigned long addr); int fru_generate(unsigned long addr, char *manufacturer, char *board_name, char *serial_no, char *part_no, char *revision); u8 fru_checksum(u8 *addr, u8 len); extern struct fru_table fru_data; #endif /* FRU_H */