From 20eb3506ca3d29ef59de81fb0070628582682751 Mon Sep 17 00:00:00 2001 From: Angel Pons Date: Mon, 21 Dec 2020 19:46:03 +0100 Subject: mb/prodrive/hermes: Improve board config EEPROM handling * Check and print errors returned from reading from I2C * Rework offset calculation by using more macros * Get rid of stage-specific preprocessor code * Define the EEPROM layout as struct * Make use of the defined EEPROM layout to calculate offsets * Read the UPD to disable VT-d from EEPROM Change-Id: Iad77811318c7dfd3a3a4f8d523cfa0f457f168b6 Signed-off-by: Patrick Rudolph Signed-off-by: Angel Pons Reviewed-on: https://review.coreboot.org/c/coreboot/+/48808 Reviewed-by: Patrick Rudolph Tested-by: build bot (Jenkins) --- .../hermes/variants/baseboard/include/eeprom.h | 60 ++++++++++++++-------- 1 file changed, 40 insertions(+), 20 deletions(-) (limited to 'src/mainboard/prodrive/hermes/variants/baseboard/include') diff --git a/src/mainboard/prodrive/hermes/variants/baseboard/include/eeprom.h b/src/mainboard/prodrive/hermes/variants/baseboard/include/eeprom.h index d5a79cd9f9..cdb5cea1fa 100644 --- a/src/mainboard/prodrive/hermes/variants/baseboard/include/eeprom.h +++ b/src/mainboard/prodrive/hermes/variants/baseboard/include/eeprom.h @@ -2,22 +2,6 @@ #include -#if ENV_ROMSTAGE -#define FSP_UPD_SIGNATURE FSPM_UPD_SIGNATURE -#define EEPROM_OFFSET_FSP_SIGNATURE 0 -#define EEPROM_OFFSET_FSP_CONFIG 0 - -#define GET_VALUE(x) {.offset = sizeof(FSP_UPD_HEADER) + sizeof(FSPM_ARCH_UPD) \ - + offsetof(FSP_M_CONFIG, x), .size = member_size(FSP_M_CONFIG, x)} -#else - -#define FSP_UPD_SIGNATURE FSPS_UPD_SIGNATURE -#define EEPROM_OFFSET_FSP_SIGNATURE 0x0600 -#define EEPROM_OFFSET_FSP_CONFIG (EEPROM_OFFSET_FSP_SIGNATURE + sizeof(FSP_UPD_HEADER)) -#define GET_VALUE(x) {.offset = offsetof(FSP_S_CONFIG, x), \ - .size = member_size(FSP_S_CONFIG, x)} -#endif /* ENV_ROMSTAGE */ - __packed struct eeprom_board_settings { uint32_t signature; union { @@ -36,11 +20,47 @@ __packed struct eeprom_board_settings { }; }; -typedef struct { - size_t offset; - size_t size; -} fsp_params; +/* The EEPROM on address 0x57 has the following vendor defined layout: */ +__packed struct eeprom_layout { + union { + uint8_t RawFSPMUPD[0x600]; + FSPM_UPD mupd; + }; + union { + uint8_t RawFSPSUPD[0xC00]; + FSPS_UPD supd; + }; + uint8_t BoardLayout[0x400]; + uint8_t BootOrder[0x900]; + union { + uint8_t RawBoardSetting[0x100]; + struct eeprom_board_settings BoardSettings; + }; +}; + +_Static_assert(sizeof(FSPM_UPD) <= 0x600, "FSPM_UPD too big"); +_Static_assert(sizeof(FSPS_UPD) <= 0xC00, "FSPS_UPD too big"); +_Static_assert(sizeof(struct eeprom_layout) == 0x2000, "EEPROM layout size mismatch"); bool read_write_config(void *blob, size_t read_offset, size_t write_offset, size_t size); int check_signature(const size_t offset, const uint64_t signature); struct eeprom_board_settings *get_board_settings(void); +void report_eeprom_error(const size_t off); + +#define READ_EEPROM(section_type, section_name, dest, opt_name) \ + do { \ + typeof(dest->opt_name) __tmp; \ + size_t __off = offsetof(struct eeprom_layout, section_name); \ + bool ret = read_write_config(&__tmp, \ + __off + offsetof(section_type, opt_name), \ + 0, \ + sizeof(__tmp)); \ + if (ret) { \ + report_eeprom_error(__off + offsetof(section_type, opt_name)); \ + } else { \ + dest->opt_name = __tmp; \ + } \ + } while (0) + +#define READ_EEPROM_FSP_M(dest, opt_name) READ_EEPROM(FSPM_UPD, RawFSPMUPD, dest, opt_name) +#define READ_EEPROM_FSP_S(dest, opt_name) READ_EEPROM(FSPS_UPD, RawFSPSUPD, dest, opt_name) -- cgit v1.2.3