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