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