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