summaryrefslogtreecommitdiffstats
path: root/realtek_mst_i2c_spi.c
diff options
context:
space:
mode:
authorShiyu Sun <sshiyu@google.com>2020-10-21 04:10:58 +1100
committerAngel Pons <th3fanbus@gmail.com>2020-10-24 09:15:08 +0000
commit3e4f8d7f5fe9216785eb0edd8fb863f4ecd7c58e (patch)
treedee5ab3a950212ae9f7081af0033896cb6798101 /realtek_mst_i2c_spi.c
parentea9106a91c97852dc3da56adf9b5c4585b99badf (diff)
downloadflashrom-3e4f8d7f5fe9216785eb0edd8fb863f4ecd7c58e.tar.gz
flashrom-3e4f8d7f5fe9216785eb0edd8fb863f4ecd7c58e.tar.bz2
flashrom-3e4f8d7f5fe9216785eb0edd8fb863f4ecd7c58e.zip
realtek_mst_i2c_spi.c: Introduce ISP enter param
This is needed to avoid attempt entering ISP mode multiple times. The ISP mode can only exit after a reset, so once the reset MCU parameter is set to 0, the device will not able to exit from ISP mode and hence shouldn't enter ISP again on the next operation. Without exit ISP mode, the device data, like firmware version, will not show the correct value, this param will also help to identify this situation. BUG=b:152558985,b:148745673 BRANCH=none TEST=build and run: $ flashrom -p realtek_mst_i2c_spi:bus=x,reset-mcu=0,enter-isp=1 \ -l layout -i PARTITION1:fw -w $ flashrom -p realtek_mst_i2c_spi:bus=x,reset-mcu=0,enter-isp=0 \ -l layout -i FLAG1:flag -w then either reset computer to allow update to take effect, or: $ flashrom -p realtek_mst_i2c_spi:bus=x,reset-mcu=1,enter-isp=0 \ --flash-size to trigger the update. Signed-off-by: Shiyu Sun <sshiyu@chromium.org> Change-Id: I58931ac8b42ab55829f102d243aea6fcfd632e3e Reviewed-on: https://review.coreboot.org/c/flashrom/+/46623 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Edward O'Callaghan <quasisec@chromium.org> Reviewed-by: Angel Pons <th3fanbus@gmail.com>
Diffstat (limited to 'realtek_mst_i2c_spi.c')
-rw-r--r--realtek_mst_i2c_spi.c32
1 files changed, 24 insertions, 8 deletions
diff --git a/realtek_mst_i2c_spi.c b/realtek_mst_i2c_spi.c
index 43cf25b25..538b07ac9 100644
--- a/realtek_mst_i2c_spi.c
+++ b/realtek_mst_i2c_spi.c
@@ -432,10 +432,10 @@ static int realtek_mst_i2c_spi_shutdown(void *data)
return ret;
}
-static int get_params(int *i2c_bus, int *reset)
+static int get_params(int *i2c_bus, int *reset, int *enter_isp)
{
- char *bus_str = NULL, *reset_str = NULL;
- int ret = SPI_GENERIC_ERROR;
+ char *bus_str = NULL, *reset_str = NULL, *isp_str = NULL;
+ int ret = SPI_GENERIC_ERROR;
bus_str = extract_programmer_param("bus");
if (bus_str) {
@@ -478,6 +478,20 @@ static int get_params(int *i2c_bus, int *reset)
*reset = 0; /* Default behaviour is no MCU reset on tear-down. */
free(reset_str);
+ isp_str = extract_programmer_param("enter-isp");
+ if (isp_str) {
+ if (isp_str[0] == '1')
+ *enter_isp = 1;
+ else if (isp_str[0] == '0')
+ *enter_isp = 0;
+ else {
+ msg_perr("%s: Incorrect param format, enter-isp=1 or 0.\n", __func__);
+ ret = SPI_GENERIC_ERROR;
+ }
+ } else
+ *enter_isp = 1; /* Default behaviour is enter ISP on setup. */
+ free(isp_str);
+
_get_params_failed:
if (bus_str)
free(bus_str);
@@ -488,18 +502,20 @@ _get_params_failed:
int realtek_mst_i2c_spi_init(void)
{
int ret = 0;
- int i2c_bus = 0, reset = 0;
+ int i2c_bus = 0, reset = 0, enter_isp = 0;
- if (get_params(&i2c_bus, &reset))
+ if (get_params(&i2c_bus, &reset, &enter_isp))
return SPI_GENERIC_ERROR;
int fd = i2c_open(i2c_bus, REGISTER_ADDRESS, 0);
if (fd < 0)
return fd;
- ret |= realtek_mst_i2c_spi_enter_isp_mode(fd);
- if (ret)
- return ret;
+ if (enter_isp) {
+ ret |= realtek_mst_i2c_spi_enter_isp_mode(fd);
+ if (ret)
+ return ret;
+ }
struct realtek_mst_i2c_spi_data *data = calloc(1, sizeof(struct realtek_mst_i2c_spi_data));
if (!data) {