common/util/fru.c (82 lines of code) (raw):

#include <stdio.h> #include "fru.h" #include "plat_fru.h" #include <string.h> EEPROM_CFG fru_config[FRU_CFG_NUM]; static uint8_t find_FRU_ID(uint8_t FRUID) { uint8_t ret; for (ret = 0; ret < MAX_FRU_ID; ret++) { if (FRUID == fru_config[ret].dev_id) { break; } } if (ret == MAX_FRU_ID) { // FRU ID not found return -1; } return ret; } uint8_t get_FRU_access(uint8_t FRUID) { uint8_t ID_No; ID_No = find_FRU_ID(FRUID); if (ID_No == -1) { // FRU ID not found return 0xFF; } return fru_config[ID_No].access; } uint16_t find_FRU_size(uint8_t FRUID) { uint8_t ID_No; ID_No = find_FRU_ID(FRUID); if (ID_No == -1) { // FRU ID not found return 0xFFFF; } return fru_config[ID_No].max_size; } uint8_t FRU_read(EEPROM_ENTRY *entry) { uint8_t status; if (entry->config.dev_id >= MAX_FRU_ID) { // check if FRU is defined printf("fru read device ID %x not exist\n", entry->config.dev_id); return FRU_INVALID_ID; } if ((entry->offset + entry->data_len) >= (FRU_START + FRU_SIZE)) { // Check data write out of range printf("fru read out of range, type: %x, ID: %x\n", entry->config.dev_type, entry->config.dev_id); return FRU_OUT_OF_RANGE; } memcpy(&entry->config, &fru_config[entry->config.dev_id], sizeof(fru_config[entry->config.dev_id])); status = eeprom_read(entry); if (!status) { return FRU_FAIL_TO_ACCESS; } return FRU_READ_SUCCESS; } uint8_t FRU_write(EEPROM_ENTRY *entry) { uint8_t status; if (entry->config.dev_id >= MAX_FRU_ID) { // check if FRU is defined printf("fru write device ID %x not exist\n", entry->config.dev_id); return FRU_INVALID_ID; } if ((entry->offset + entry->data_len) >= (FRU_START + FRU_SIZE)) { // Check data write out of range printf("fru write out of range, type: %x, ID: %x\n", entry->config.dev_type, entry->config.dev_id); return FRU_OUT_OF_RANGE; } memcpy(&entry->config, &fru_config[entry->config.dev_id], sizeof(fru_config[entry->config.dev_id])); status = eeprom_write(entry); if (!status) { return FRU_FAIL_TO_ACCESS; } return FRU_WRITE_SUCCESS; } void FRU_init(void) { pal_load_fru_config(); }