You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
145 lines
3.0 KiB
145 lines
3.0 KiB
/*
|
|
* 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 */
|