123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- /*
- * Copyright (c) 2019-2020, Broadcom
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
- #ifndef FRU_H
- #define FRU_H
- #include <stdbool.h>
- #include <stdint.h>
- /* max string length */
- #define FRU_MAX_STR_LEN 32
- /* max number of DDR channels */
- #define BCM_MAX_NR_DDR 3
- /* max supported FRU table size */
- #define BCM_MAX_FRU_LEN 512
- /* FRU table starting offset */
- #define BCM_FRU_TBL_OFFSET 0x300000
- /* FRU time constants */
- #define MINS_PER_DAY 1440
- #define MINS_PER_HOUR 60
- #define FRU_YEAR_START 1996
- #define FRU_MONTH_START 1
- #define FRU_DAY_START 1
- #define MONTHS_PER_YEAR 12
- /*
- * FRU areas based on the spec
- */
- enum fru_area_name {
- FRU_AREA_INTERNAL = 0,
- FRU_AREA_CHASSIS_INFO,
- FRU_AREA_BOARD_INFO,
- FRU_AREA_PRODUCT_INFO,
- FRU_AREA_MRECORD_INFO,
- FRU_MAX_NR_AREAS
- };
- /*
- * FRU area information
- *
- * @use: indicate this area is being used
- * @version: format version
- * @offset: offset of this area from the beginning of the FRU table
- * @len: total length of the area
- */
- struct fru_area_info {
- bool use;
- uint8_t version;
- unsigned int offset;
- unsigned int len;
- };
- /*
- * DDR MCB information
- *
- * @idx: DDR channel index
- * @size_mb: DDR size of this channel in MB
- * @ref_id: DDR MCB reference ID
- */
- struct ddr_mcb {
- unsigned int idx;
- unsigned int size_mb;
- uint32_t ref_id;
- };
- /*
- * DDR information
- *
- * @ddr_info: array that contains MCB related info for each channel
- */
- struct ddr_info {
- struct ddr_mcb mcb[BCM_MAX_NR_DDR];
- };
- /*
- * FRU board area information
- *
- * @lang: Language code
- * @mfg_date: Manufacturing date
- * @manufacturer: Manufacturer
- * @product_name: Product name
- * @serial_number: Serial number
- * @part_number: Part number
- * @file_id: FRU file ID
- */
- struct fru_board_info {
- unsigned char lang;
- unsigned int mfg_date;
- unsigned char manufacturer[FRU_MAX_STR_LEN];
- unsigned char product_name[FRU_MAX_STR_LEN];
- unsigned char serial_number[FRU_MAX_STR_LEN];
- unsigned char part_number[FRU_MAX_STR_LEN];
- unsigned char file_id[FRU_MAX_STR_LEN];
- };
- /*
- * FRU manufacture date in human readable format
- */
- struct fru_time {
- unsigned int min;
- unsigned int hour;
- unsigned int day;
- unsigned int month;
- unsigned int year;
- };
- #ifdef USE_FRU
- int fru_validate(uint8_t *data, struct fru_area_info *fru_area);
- int fru_parse_ddr(uint8_t *data, struct fru_area_info *area,
- struct ddr_info *ddr);
- int fru_parse_board(uint8_t *data, struct fru_area_info *area,
- struct fru_board_info *board);
- void fru_format_time(unsigned int min, struct fru_time *tm);
- #else
- static inline int fru_validate(uint8_t *data, struct fru_area_info *fru_area)
- {
- return -1;
- }
- static inline int fru_parse_ddr(uint8_t *data, struct fru_area_info *area,
- struct ddr_info *ddr)
- {
- return -1;
- }
- static inline int fru_parse_board(uint8_t *data, struct fru_area_info *area,
- struct fru_board_info *board)
- {
- return -1;
- }
- static inline void fru_format_time(unsigned int min, struct fru_time *tm)
- {
- }
- #endif /* USE_FRU */
- #endif /* FRU_H */
|