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 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 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 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 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