1 /* 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 */ 36 enum 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 */ 53 struct 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 */ 67 struct 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 */ 78 struct 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 */ 93 struct 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 */ 106 struct 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 115 int fru_validate(uint8_t *data, struct fru_area_info *fru_area); 116 int fru_parse_ddr(uint8_t *data, struct fru_area_info *area, 117 struct ddr_info *ddr); 118 int fru_parse_board(uint8_t *data, struct fru_area_info *area, 119 struct fru_board_info *board); 120 void fru_format_time(unsigned int min, struct fru_time *tm); 121 #else 122 static inline int fru_validate(uint8_t *data, struct fru_area_info *fru_area) 123 { 124 return -1; 125 } 126 127 static inline int fru_parse_ddr(uint8_t *data, struct fru_area_info *area, 128 struct ddr_info *ddr) 129 { 130 return -1; 131 } 132 133 static 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 139 static inline void fru_format_time(unsigned int min, struct fru_time *tm) 140 { 141 } 142 #endif /* USE_FRU */ 143 144 #endif /* FRU_H */ 145