1/* SPDX-License-Identifier: GPL-2.0+ */ 2/* 3 * (C) Copyright 2019 Xilinx, Inc. 4 * Siva Durga Prasad Paladugu <siva.durga.prasad.paladugu@amd.com>> 5 */ 6 7#ifndef __FRU_H 8#define __FRU_H 9#include <net.h> 10 11struct fru_common_hdr { 12 u8 version; 13 u8 off_internal; 14 u8 off_chassis; 15 u8 off_board; 16 u8 off_product; 17 u8 off_multirec; 18 u8 pad; 19 u8 crc; 20}; 21 22#define FRU_BOARD_MAX_LEN 32 23#define FRU_MAX_NO_OF_MAC_ADDR 4 24 25struct __packed fru_board_info_header { 26 u8 ver; 27 u8 len; 28 u8 lang_code; 29 u8 time[3]; 30}; 31 32struct __packed fru_board_info_member { 33 u8 type_len; 34 u8 *name; 35}; 36 37struct fru_board_data { 38 u8 ver; 39 u8 len; 40 u8 lang_code; 41 u8 time[3]; 42 u8 manufacturer_type_len; 43 u8 manufacturer_name[FRU_BOARD_MAX_LEN]; 44 u8 product_name_type_len; 45 u8 product_name[FRU_BOARD_MAX_LEN]; 46 u8 serial_number_type_len; 47 u8 serial_number[FRU_BOARD_MAX_LEN]; 48 u8 part_number_type_len; 49 u8 part_number[FRU_BOARD_MAX_LEN]; 50 u8 file_id_type_len; 51 u8 file_id[FRU_BOARD_MAX_LEN]; 52 /* Xilinx custom fields */ 53 u8 rev_type_len; 54 u8 rev[FRU_BOARD_MAX_LEN]; 55 u8 pcie_type_len; 56 u8 pcie[FRU_BOARD_MAX_LEN]; 57 u8 uuid_type_len; 58 u8 uuid[FRU_BOARD_MAX_LEN]; 59}; 60 61struct fru_multirec_hdr { 62 u8 rec_type; 63 u8 type; 64 u8 len; 65 u8 csum; 66 u8 hdr_csum; 67}; 68 69struct fru_multirec_mac { 70 u8 xlnx_iana_id[3]; 71 u8 ver; 72 u8 macid[FRU_MAX_NO_OF_MAC_ADDR][ETH_ALEN]; 73}; 74 75struct fru_table { 76 struct fru_common_hdr hdr; 77 struct fru_board_data brd; 78 struct fru_multirec_mac mac; 79 bool captured; 80}; 81 82#define FRU_TYPELEN_CODE_MASK 0xC0 83#define FRU_TYPELEN_LEN_MASK 0x3F 84#define FRU_COMMON_HDR_VER_MASK 0xF 85#define FRU_COMMON_HDR_LEN_MULTIPLIER 8 86#define FRU_LANG_CODE_ENGLISH 0 87#define FRU_LANG_CODE_ENGLISH_1 25 88#define FRU_TYPELEN_EOF 0xC1 89#define FRU_MULTIREC_TYPE_OEM 0xD2 90#define FRU_MULTIREC_MAC_OFFSET 4 91#define FRU_LAST_REC BIT(7) 92#define FRU_DUT_MACID 0x31 93#define FRU_SC_MACID 0x11 94 95/* This should be minimum of fields */ 96#define FRU_BOARD_AREA_TOTAL_FIELDS 5 97#define FRU_TYPELEN_TYPE_SHIFT 6 98#define FRU_TYPELEN_TYPE_BINARY 0 99#define FRU_TYPELEN_TYPE_ASCII8 3 100 101int fru_display(int verbose); 102int fru_capture(unsigned long addr); 103int fru_generate(unsigned long addr, char *manufacturer, char *board_name, 104 char *serial_no, char *part_no, char *revision); 105u8 fru_checksum(u8 *addr, u8 len); 106 107extern struct fru_table fru_data; 108 109#endif /* FRU_H */ 110