1 /* SPDX-License-Identifier: GPL-2.0+ */
2 /*
3  * (C) Copyright 2019 Xilinx, Inc.
4  * Siva Durga Prasad Paladugu <siva.durga.paladugu@xilinx.com>
5  */
6 
7 #ifndef __FRU_H
8 #define __FRU_H
9 #include <net.h>
10 
11 struct 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 
25 struct __packed fru_board_info_header {
26 	u8 ver;
27 	u8 len;
28 	u8 lang_code;
29 	u8 time[3];
30 };
31 
32 struct __packed fru_board_info_member {
33 	u8 type_len;
34 	u8 *name;
35 };
36 
37 struct 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 
61 struct fru_multirec_hdr {
62 	u8 rec_type;
63 	u8 type;
64 	u8 len;
65 	u8 csum;
66 	u8 hdr_csum;
67 };
68 
69 struct 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 
75 struct 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 
101 int fru_display(int verbose);
102 int fru_capture(unsigned long addr);
103 int fru_generate(unsigned long addr, char *manufacturer, char *board_name,
104 		 char *serial_no, char *part_no, char *revision);
105 u8 fru_checksum(u8 *addr, u8 len);
106 
107 extern struct fru_table fru_data;
108 
109 #endif /* FRU_H */
110