From a97bbba09a2cb145685cc2a6715f9b1cdcdd197e Mon Sep 17 00:00:00 2001 From: Edward O'Callaghan Date: Thu, 30 Jun 2022 19:53:16 +1000 Subject: mediatek_i2c_spi.c: Add allow_brick=yes programmer param Currently i2c programmers do not have a safe allow listing mechanism via board_enable to facilitate fully qualified chip detection. Since i2c addresses alone can overlap a user may make the mistake of using the wrong programmer. Although unlikely, it is within the realm of possibility that a user could accidently somehow program another chip on their board. Change-Id: I2b8f7a9bfae68354105f3196cc40b9d5e795afdf Signed-off-by: Edward O'Callaghan Reviewed-on: https://review.coreboot.org/c/flashrom/+/65554 Tested-by: build bot (Jenkins) Reviewed-by: Felix Singer Reviewed-by: Anastasia Klimchuk Reviewed-by: Thomas Heijligen --- mediatek_i2c_spi.c | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/mediatek_i2c_spi.c b/mediatek_i2c_spi.c index 5757f31e..4929fbf9 100644 --- a/mediatek_i2c_spi.c +++ b/mediatek_i2c_spi.c @@ -464,9 +464,46 @@ static const struct spi_master spi_master_i2c_mediatek = { .probe_opcode = default_spi_probe_opcode, }; +static int get_params(bool *allow_brick) +{ + char *brick_str = NULL; + int ret = 0; + + *allow_brick = false; /* Default behaviour is to bail. */ + brick_str = extract_programmer_param_str("allow_brick"); + if (brick_str) { + if (!strcmp(brick_str, "yes")) { + *allow_brick = true; + } else { + msg_perr("%s: Incorrect param format, allow_brick=yes.\n", __func__); + ret = SPI_GENERIC_ERROR; + } + } + free(brick_str); + + return ret; +} + static int mediatek_init(void) { int ret; + bool allow_brick; + + if (get_params(&allow_brick)) + return SPI_GENERIC_ERROR; + + /* + * TODO: Once board_enable can facilitate safe i2c allow listing + * then this can be removed. + */ + if (!allow_brick) { + msg_perr("%s: For i2c drivers you must explicitly 'allow_brick=yes'. ", __func__); + msg_perr("There is currently no way to determine if the programmer works on a board " + "as i2c device address space can be overloaded. Set 'allow_brick=yes' if " + "you are sure you know what you are doing.\n"); + return SPI_GENERIC_ERROR; + } + int fd = i2c_open_from_programmer_params(ISP_PORT, 0); if (fd < 0) { msg_perr("Failed to open i2c\n"); -- cgit v1.2.3