xref: /arm-trusted-firmware/include/drivers/brcm/fru.h (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright (c) 2019-2020, Broadcom
3*91f16700Schasinglulu  *
4*91f16700Schasinglulu  * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu  */
6*91f16700Schasinglulu 
7*91f16700Schasinglulu #ifndef FRU_H
8*91f16700Schasinglulu #define FRU_H
9*91f16700Schasinglulu 
10*91f16700Schasinglulu #include <stdbool.h>
11*91f16700Schasinglulu #include <stdint.h>
12*91f16700Schasinglulu 
13*91f16700Schasinglulu /* max string length */
14*91f16700Schasinglulu #define FRU_MAX_STR_LEN      32
15*91f16700Schasinglulu 
16*91f16700Schasinglulu /* max number of DDR channels */
17*91f16700Schasinglulu #define BCM_MAX_NR_DDR       3
18*91f16700Schasinglulu 
19*91f16700Schasinglulu /* max supported FRU table size */
20*91f16700Schasinglulu #define BCM_MAX_FRU_LEN      512
21*91f16700Schasinglulu 
22*91f16700Schasinglulu /* FRU table starting offset */
23*91f16700Schasinglulu #define BCM_FRU_TBL_OFFSET   0x300000
24*91f16700Schasinglulu 
25*91f16700Schasinglulu /* FRU time constants */
26*91f16700Schasinglulu #define MINS_PER_DAY        1440
27*91f16700Schasinglulu #define MINS_PER_HOUR       60
28*91f16700Schasinglulu #define FRU_YEAR_START      1996
29*91f16700Schasinglulu #define FRU_MONTH_START     1
30*91f16700Schasinglulu #define FRU_DAY_START       1
31*91f16700Schasinglulu #define MONTHS_PER_YEAR     12
32*91f16700Schasinglulu 
33*91f16700Schasinglulu /*
34*91f16700Schasinglulu  * FRU areas based on the spec
35*91f16700Schasinglulu  */
36*91f16700Schasinglulu enum fru_area_name {
37*91f16700Schasinglulu 	FRU_AREA_INTERNAL = 0,
38*91f16700Schasinglulu 	FRU_AREA_CHASSIS_INFO,
39*91f16700Schasinglulu 	FRU_AREA_BOARD_INFO,
40*91f16700Schasinglulu 	FRU_AREA_PRODUCT_INFO,
41*91f16700Schasinglulu 	FRU_AREA_MRECORD_INFO,
42*91f16700Schasinglulu 	FRU_MAX_NR_AREAS
43*91f16700Schasinglulu };
44*91f16700Schasinglulu 
45*91f16700Schasinglulu /*
46*91f16700Schasinglulu  * FRU area information
47*91f16700Schasinglulu  *
48*91f16700Schasinglulu  * @use: indicate this area is being used
49*91f16700Schasinglulu  * @version: format version
50*91f16700Schasinglulu  * @offset: offset of this area from the beginning of the FRU table
51*91f16700Schasinglulu  * @len: total length of the area
52*91f16700Schasinglulu  */
53*91f16700Schasinglulu struct fru_area_info {
54*91f16700Schasinglulu 	bool use;
55*91f16700Schasinglulu 	uint8_t version;
56*91f16700Schasinglulu 	unsigned int offset;
57*91f16700Schasinglulu 	unsigned int len;
58*91f16700Schasinglulu };
59*91f16700Schasinglulu 
60*91f16700Schasinglulu /*
61*91f16700Schasinglulu  * DDR MCB information
62*91f16700Schasinglulu  *
63*91f16700Schasinglulu  * @idx: DDR channel index
64*91f16700Schasinglulu  * @size_mb: DDR size of this channel in MB
65*91f16700Schasinglulu  * @ref_id: DDR MCB reference ID
66*91f16700Schasinglulu  */
67*91f16700Schasinglulu struct ddr_mcb {
68*91f16700Schasinglulu 	unsigned int idx;
69*91f16700Schasinglulu 	unsigned int size_mb;
70*91f16700Schasinglulu 	uint32_t ref_id;
71*91f16700Schasinglulu };
72*91f16700Schasinglulu 
73*91f16700Schasinglulu /*
74*91f16700Schasinglulu  * DDR information
75*91f16700Schasinglulu  *
76*91f16700Schasinglulu  * @ddr_info: array that contains MCB related info for each channel
77*91f16700Schasinglulu  */
78*91f16700Schasinglulu struct ddr_info {
79*91f16700Schasinglulu 	struct ddr_mcb mcb[BCM_MAX_NR_DDR];
80*91f16700Schasinglulu };
81*91f16700Schasinglulu 
82*91f16700Schasinglulu /*
83*91f16700Schasinglulu  * FRU board area information
84*91f16700Schasinglulu  *
85*91f16700Schasinglulu  * @lang: Language code
86*91f16700Schasinglulu  * @mfg_date: Manufacturing date
87*91f16700Schasinglulu  * @manufacturer: Manufacturer
88*91f16700Schasinglulu  * @product_name: Product name
89*91f16700Schasinglulu  * @serial_number: Serial number
90*91f16700Schasinglulu  * @part_number: Part number
91*91f16700Schasinglulu  * @file_id: FRU file ID
92*91f16700Schasinglulu  */
93*91f16700Schasinglulu struct fru_board_info {
94*91f16700Schasinglulu 	unsigned char lang;
95*91f16700Schasinglulu 	unsigned int mfg_date;
96*91f16700Schasinglulu 	unsigned char manufacturer[FRU_MAX_STR_LEN];
97*91f16700Schasinglulu 	unsigned char product_name[FRU_MAX_STR_LEN];
98*91f16700Schasinglulu 	unsigned char serial_number[FRU_MAX_STR_LEN];
99*91f16700Schasinglulu 	unsigned char part_number[FRU_MAX_STR_LEN];
100*91f16700Schasinglulu 	unsigned char file_id[FRU_MAX_STR_LEN];
101*91f16700Schasinglulu };
102*91f16700Schasinglulu 
103*91f16700Schasinglulu /*
104*91f16700Schasinglulu  * FRU manufacture date in human readable format
105*91f16700Schasinglulu  */
106*91f16700Schasinglulu struct fru_time {
107*91f16700Schasinglulu 	unsigned int min;
108*91f16700Schasinglulu 	unsigned int hour;
109*91f16700Schasinglulu 	unsigned int day;
110*91f16700Schasinglulu 	unsigned int month;
111*91f16700Schasinglulu 	unsigned int year;
112*91f16700Schasinglulu };
113*91f16700Schasinglulu 
114*91f16700Schasinglulu #ifdef USE_FRU
115*91f16700Schasinglulu int fru_validate(uint8_t *data, struct fru_area_info *fru_area);
116*91f16700Schasinglulu int fru_parse_ddr(uint8_t *data, struct fru_area_info *area,
117*91f16700Schasinglulu 		  struct ddr_info *ddr);
118*91f16700Schasinglulu int fru_parse_board(uint8_t *data, struct fru_area_info *area,
119*91f16700Schasinglulu 		    struct fru_board_info *board);
120*91f16700Schasinglulu void fru_format_time(unsigned int min, struct fru_time *tm);
121*91f16700Schasinglulu #else
122*91f16700Schasinglulu static inline int fru_validate(uint8_t *data, struct fru_area_info *fru_area)
123*91f16700Schasinglulu {
124*91f16700Schasinglulu 	return -1;
125*91f16700Schasinglulu }
126*91f16700Schasinglulu 
127*91f16700Schasinglulu static inline int fru_parse_ddr(uint8_t *data, struct fru_area_info *area,
128*91f16700Schasinglulu 				struct ddr_info *ddr)
129*91f16700Schasinglulu {
130*91f16700Schasinglulu 	return -1;
131*91f16700Schasinglulu }
132*91f16700Schasinglulu 
133*91f16700Schasinglulu static inline int fru_parse_board(uint8_t *data, struct fru_area_info *area,
134*91f16700Schasinglulu 				  struct fru_board_info *board)
135*91f16700Schasinglulu {
136*91f16700Schasinglulu 	return -1;
137*91f16700Schasinglulu }
138*91f16700Schasinglulu 
139*91f16700Schasinglulu static inline void fru_format_time(unsigned int min, struct fru_time *tm)
140*91f16700Schasinglulu {
141*91f16700Schasinglulu }
142*91f16700Schasinglulu #endif /* USE_FRU */
143*91f16700Schasinglulu 
144*91f16700Schasinglulu #endif /* FRU_H */
145