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