soc/amd/common/block/spi: Mainboard to override SPI Read Mode

On certain mainboards due to hardware design limitations, certain SPI
Read Modes eg. (Dual I/O 1-2-2) cannot be supported. Add ability to
override SPI read modes in boards which do not have hardware
limitations. Currently there is an API to override SPI fast speeds.
Update this API for mainboards to override SPI read mode as well.

BUG=b:225213679
TEST=Build and boot to OS in Skyrim. Observe a boot time improvement of
~25 ms with 100 MHz SPI speeds.
Before:
  11:start of bootblock                                688,046
  14:finished loading romstage                         30,865
  16:FSP-M finished LZMA decompress (ignore for x86)   91,049
Total Time: 1,972,625

After:
  11:start of bootblock                                667,642
  14:finished loading romstage                         29,798
  16:FSP-M finished LZMA decompress (ignore for x86)   87,743
Total Time: 1,943,924

Change-Id: I160b56f6201a798ce59e977ca40301e23ab63805
Signed-off-by: Karthikeyan Ramasubramanian <kramasub@google.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/68946
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Jon Murphy <jpmurphy@google.com>
This commit is contained in:
Karthikeyan Ramasubramanian
2022-10-28 10:23:39 -06:00
committed by Felix Held
parent d08deaabe1
commit 5717ce6e99
5 changed files with 15 additions and 6 deletions

View File

@@ -4,7 +4,7 @@
#include <boardid.h>
#include <stdint.h>
void mainboard_spi_fast_speed_override(uint8_t *fast_speed)
void mainboard_spi_cfg_override(uint8_t *fast_speed, uint8_t *read_mode)
{
uint32_t board_ver = board_id();

View File

@@ -107,7 +107,8 @@ config VBOOT_STARTS_IN_BOOTBLOCK
if !EM100 # EM100 defaults in soc/amd/common/blocks/spi/Kconfig
config EFS_SPI_READ_MODE
default 2 # Dual IO (1-1-2)
default 2 if BOARD_GOOGLE_SKYRIM # Dual IO (1-1-2)
default 4 # Dual IO (1-2-2)
config EFS_SPI_SPEED
default 0 # 66MHz

View File

@@ -4,10 +4,18 @@
#include <boardid.h>
#include <stdint.h>
void mainboard_spi_fast_speed_override(uint8_t *fast_speed)
void mainboard_spi_cfg_override(uint8_t *fast_speed, uint8_t *read_mode)
{
uint32_t board_ver = board_id();
if (board_ver >= CONFIG_OVERRIDE_EFS_SPI_SPEED_MIN_BOARD)
*fast_speed = CONFIG_OVERRIDE_EFS_SPI_SPEED;
/*
* Due to a hardware limitation, Dual I/O 1-2-2 Read mode is supported starting
* board version 3. This hardware limitation applies only to Skyrim reference
* design.
*/
if (CONFIG(BOARD_GOOGLE_SKYRIM) && board_ver >= 3)
*read_mode = SPI_READ_MODE_DUAL122;
}

View File

@@ -118,7 +118,7 @@ void spi_write16(uint8_t reg, uint16_t val);
void spi_write32(uint8_t reg, uint32_t val);
void fch_spi_config_modes(void);
void mainboard_spi_fast_speed_override(uint8_t *fast_speed);
void mainboard_spi_cfg_override(uint8_t *fast_speed, uint8_t *read_mode);
/* Ensure you hold the mutex when performing SPI transactions */
extern struct thread_mutex spi_hw_mutex;

View File

@@ -50,7 +50,7 @@ void show_spi_speeds_and_modes(void)
printk(BIOS_DEBUG, "SPI Read Mode: %s\n", read_mode_str[DECODE_SPI_READ_MODE(val32)]);
}
void __weak mainboard_spi_fast_speed_override(uint8_t *fast_speed)
void __weak mainboard_spi_cfg_override(uint8_t *fast_speed, uint8_t *read_mode)
{
/* No overriding SPI speeds. */
}
@@ -107,7 +107,7 @@ void fch_spi_config_modes(void)
read_mode = CONFIG_EFS_SPI_READ_MODE;
fast_speed = CONFIG_EFS_SPI_SPEED;
}
mainboard_spi_fast_speed_override(&fast_speed);
mainboard_spi_cfg_override(&fast_speed, &read_mode);
if (fast_speed != CONFIG_EFS_SPI_SPEED) {
normal_speed = lower_speed(normal_speed, fast_speed);