summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShiyu Sun <sshiyu@google.com>2020-12-17 02:31:40 +1100
committerEdward O'Callaghan <quasisec@chromium.org>2020-12-23 01:37:28 +0000
commit10d71d9393d7293ee42ee7e95786ac7f09f183bd (patch)
treeea9b7b310ec24a481c360cf09754a079bd7c5fa8
parent55583c0d9dac40302dad4097da51ecabd26adf0d (diff)
downloadflashrom-10d71d9393d7293ee42ee7e95786ac7f09f183bd.tar.gz
flashrom-10d71d9393d7293ee42ee7e95786ac7f09f183bd.tar.bz2
flashrom-10d71d9393d7293ee42ee7e95786ac7f09f183bd.zip
realtek_mst_i2c_spi.c: Add ISP mode check
Check ISP mode before doing reset and add waiting after the enter ISP mode command. BUG=None TEST=build and run mst commands Signed-off-by: Shiyu Sun <sshiyu@chromium.org> Change-Id: Ib1ab8370eb6335a77bb293fc98a8ab7be465db4f Reviewed-on: https://review.coreboot.org/c/flashrom/+/48662 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Edward O'Callaghan <quasisec@chromium.org>
-rw-r--r--realtek_mst_i2c_spi.c17
1 files changed, 14 insertions, 3 deletions
diff --git a/realtek_mst_i2c_spi.c b/realtek_mst_i2c_spi.c
index 538b07ac9..80caf8669 100644
--- a/realtek_mst_i2c_spi.c
+++ b/realtek_mst_i2c_spi.c
@@ -32,7 +32,7 @@
#define MAX_SPI_WAIT_RETRIES 1000
#define MCU_MODE 0x6F
-#define ENTER_ISP_MODE 0x80
+#define MCU_ISP_MODE_MASK 0x80
#define START_WRITE_XFER 0xA0
#define WRITE_XFER_STATUS_MASK 0x20
@@ -119,7 +119,12 @@ static int realtek_mst_i2c_spi_wait_command_done(int fd, unsigned int offset, in
static int realtek_mst_i2c_spi_enter_isp_mode(int fd)
{
- int ret = realtek_mst_i2c_spi_write_register(fd, MCU_MODE, ENTER_ISP_MODE);
+ int ret = realtek_mst_i2c_spi_write_register(fd, MCU_MODE, MCU_ISP_MODE_MASK);
+ /* wait for ISP mode enter success */
+ ret |= realtek_mst_i2c_spi_wait_command_done(fd, MCU_MODE, MCU_ISP_MODE_MASK, MCU_ISP_MODE_MASK, 1);
+
+ if (ret)
+ return ret;
// set internal osc divider register to default to speed up MCU
// 0x06A0 = 0x74
@@ -140,7 +145,13 @@ static int realtek_mst_i2c_execute_write(int fd)
static int realtek_mst_i2c_spi_reset_mpu(int fd)
{
- int ret = 0;
+ uint8_t mcu_mode_val;
+ int ret = realtek_mst_i2c_spi_read_register(fd, MCU_MODE, &mcu_mode_val);
+ if (ret || (mcu_mode_val & MCU_ISP_MODE_MASK) == 0) {
+ msg_perr("%s: MST not in ISP mode, cannot perform MCU reset.\n", __func__);
+ return SPI_GENERIC_ERROR;
+ }
+
// 0xFFEE[1] = 1;
uint8_t val = 0;
ret |= realtek_mst_i2c_spi_read_register(fd, 0xEE, &val);