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