diff options
author | Ricardo Quesada <ricardoq@google.com> | 2022-02-15 13:48:26 -0800 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2022-03-17 20:07:22 +0000 |
commit | aba3906e91a688ea6ce5eea1fd8ffb694eece1be (patch) | |
tree | 12f0d52f526d4fee88cc9e8f86f38748cd27d047 | |
parent | 940026601876cc7a959ed47c04bb53c879cf4448 (diff) | |
download | chrome-ec-aba3906e91a688ea6ce5eea1fd8ffb694eece1be.tar.gz |
i2c: Add addr_flags and cmd to board_allow_i2c_passthru()
This CL adds addr_flags and cmd_id (AKA offset) to
board_allow_i2c_passthru().
This CL is a kind-of-cherrypick of this other CL:
https://crrev.com/c/1588492
BRANCH=none
BUG=b:135642493
TEST=make buildall passes
tested in Madoo where I manually added a board_allow_i2c_passthru()
function that was blocking port 5 (battery) and did:
With EC unlocked:
dut # ectool i2cread 8 0x05 22 1
Read from I2C port 5 at 0x16 offset 0x1 = 0x67
With EC locked:
dut # ectool i2cread 8 0x05 22 1
EC result 4 (ACCESS_DENIED)
Change-Id: Ifba59f21f63f99345b81dd250296214a5cd29eba
Signed-off-by: Ricardo Quesada <ricardoq@google.com>
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3466422
Reviewed-by: Aseda Aboagye <aaboagye@chromium.org>
Tested-by: Ricardo Quesada <ricardoq@chromium.org>
Auto-Submit: Ricardo Quesada <ricardoq@chromium.org>
Commit-Queue: Ricardo Quesada <ricardoq@chromium.org>
-rw-r--r-- | baseboard/asurada/baseboard.c | 4 | ||||
-rw-r--r-- | baseboard/cherry/baseboard.c | 4 | ||||
-rw-r--r-- | baseboard/goroh/baseboard.c | 4 | ||||
-rw-r--r-- | baseboard/herobrine/baseboard.c | 4 | ||||
-rw-r--r-- | baseboard/kukui/baseboard.c | 5 | ||||
-rw-r--r-- | baseboard/trogdor/baseboard.c | 8 | ||||
-rw-r--r-- | board/rainier/board.c | 2 | ||||
-rw-r--r-- | board/scarlet/board.c | 4 | ||||
-rw-r--r-- | common/i2c_controller.c | 29 | ||||
-rw-r--r-- | include/i2c.h | 17 | ||||
-rw-r--r-- | zephyr/projects/corsola/src/kingler/i2c.c | 4 | ||||
-rw-r--r-- | zephyr/projects/corsola/src/krabby/i2c.c | 4 | ||||
-rw-r--r-- | zephyr/projects/herobrine/src/i2c.c | 4 | ||||
-rw-r--r-- | zephyr/projects/trogdor/lazor/src/i2c.c | 4 |
14 files changed, 63 insertions, 34 deletions
diff --git a/baseboard/asurada/baseboard.c b/baseboard/asurada/baseboard.c index c0ba896e61..1a86950281 100644 --- a/baseboard/asurada/baseboard.c +++ b/baseboard/asurada/baseboard.c @@ -102,9 +102,9 @@ const struct i2c_port_t i2c_ports[] = { }; const unsigned int i2c_ports_used = ARRAY_SIZE(i2c_ports); -int board_allow_i2c_passthru(int port) +int board_allow_i2c_passthru(const struct i2c_cmd_desc_t *cmd_desc) { - return (port == I2C_PORT_VIRTUAL_BATTERY); + return (cmd_desc->port == I2C_PORT_VIRTUAL_BATTERY); } const struct cc_para_t *board_get_cc_tuning_parameter(enum usbpd_port port) diff --git a/baseboard/cherry/baseboard.c b/baseboard/cherry/baseboard.c index 4e6b2e324d..d7ab72565a 100644 --- a/baseboard/cherry/baseboard.c +++ b/baseboard/cherry/baseboard.c @@ -346,9 +346,9 @@ const struct i2c_port_t i2c_ports[] = { }; const unsigned int i2c_ports_used = ARRAY_SIZE(i2c_ports); -int board_allow_i2c_passthru(int port) +int board_allow_i2c_passthru(const struct i2c_cmd_desc_t *cmd_desc) { - return (port == I2C_PORT_VIRTUAL_BATTERY); + return (cmd_desc->port == I2C_PORT_VIRTUAL_BATTERY); } /* TCPC */ diff --git a/baseboard/goroh/baseboard.c b/baseboard/goroh/baseboard.c index 8fd32b315c..d51b881753 100644 --- a/baseboard/goroh/baseboard.c +++ b/baseboard/goroh/baseboard.c @@ -140,9 +140,9 @@ const struct i2c_port_t i2c_ports[] = { }; const unsigned int i2c_ports_used = ARRAY_SIZE(i2c_ports); -int board_allow_i2c_passthru(int port) +int board_allow_i2c_passthru(const struct i2c_cmd_desc_t *cmd_desc) { - return (port == I2C_PORT_VIRTUAL_BATTERY); + return (cmd_desc->port == I2C_PORT_VIRTUAL_BATTERY); } diff --git a/baseboard/herobrine/baseboard.c b/baseboard/herobrine/baseboard.c index 3103aaf4c5..41d40dd7ae 100644 --- a/baseboard/herobrine/baseboard.c +++ b/baseboard/herobrine/baseboard.c @@ -7,7 +7,7 @@ #include "i2c.h" -int board_allow_i2c_passthru(int port) +int board_allow_i2c_passthru(const struct i2c_cmd_desc_t *cmd_desc) { - return (port == I2C_PORT_VIRTUAL_BATTERY); + return (cmd_desc->port == I2C_PORT_VIRTUAL_BATTERY); } diff --git a/baseboard/kukui/baseboard.c b/baseboard/kukui/baseboard.c index 3f9a1c36c6..c9831ed300 100644 --- a/baseboard/kukui/baseboard.c +++ b/baseboard/kukui/baseboard.c @@ -9,6 +9,7 @@ #include "dma.h" #include "gpio.h" #include "hooks.h" +#include "i2c.h" #include "keyboard_scan.h" #include "registers.h" #include "timer.h" @@ -194,9 +195,9 @@ static void baseboard_spi_init(void) } DECLARE_HOOK(HOOK_INIT, baseboard_spi_init, HOOK_PRIO_INIT_SPI + 1); -int board_allow_i2c_passthru(int port) +int board_allow_i2c_passthru(const struct i2c_cmd_desc_t *cmd_desc) { - return (port == I2C_PORT_VIRTUAL_BATTERY); + return (cmd_desc->port == I2C_PORT_VIRTUAL_BATTERY); } /* Enable or disable input devices, based on chipset state and tablet mode */ diff --git a/baseboard/trogdor/baseboard.c b/baseboard/trogdor/baseboard.c index 21fb7cd9e1..6f49ecb4ae 100644 --- a/baseboard/trogdor/baseboard.c +++ b/baseboard/trogdor/baseboard.c @@ -17,9 +17,9 @@ enum gpio_signal hibernate_wake_pins[] = { int hibernate_wake_pins_used = ARRAY_SIZE(hibernate_wake_pins); BUILD_ASSERT(ARRAY_SIZE(hibernate_wake_pins) >= 3); -int board_allow_i2c_passthru(int port) +int board_allow_i2c_passthru(const struct i2c_cmd_desc_t *cmd_desc) { - return (port == I2C_PORT_VIRTUAL_BATTERY || - port == I2C_PORT_TCPC0 || - port == I2C_PORT_TCPC1); + return (cmd_desc->port == I2C_PORT_VIRTUAL_BATTERY || + cmd_desc->port == I2C_PORT_TCPC0 || + cmd_desc->port == I2C_PORT_TCPC1); } diff --git a/board/rainier/board.c b/board/rainier/board.c index 15fbfeb8ef..c992584d76 100644 --- a/board/rainier/board.c +++ b/board/rainier/board.c @@ -428,7 +428,7 @@ struct motion_sensor_t motion_sensors[] = { }; const unsigned int motion_sensor_count = ARRAY_SIZE(motion_sensors); -int board_allow_i2c_passthru(int port) +int board_allow_i2c_passthru(const struct i2c_cmd_desc_t *cmd_desc) { /* * Battery port is the only port passthru is allowed on and this board diff --git a/board/scarlet/board.c b/board/scarlet/board.c index 3120ef1efb..3d9049c983 100644 --- a/board/scarlet/board.c +++ b/board/scarlet/board.c @@ -465,7 +465,7 @@ struct motion_sensor_t motion_sensors[] = { }; const unsigned int motion_sensor_count = ARRAY_SIZE(motion_sensors); -int board_allow_i2c_passthru(int port) +int board_allow_i2c_passthru(const struct i2c_cmd_desc_t *cmd_desc) { - return (port == I2C_PORT_VIRTUAL_BATTERY); + return (cmd_desc->port == I2C_PORT_VIRTUAL_BATTERY); } diff --git a/common/i2c_controller.c b/common/i2c_controller.c index a7368d85ed..d1a14cb11d 100644 --- a/common/i2c_controller.c +++ b/common/i2c_controller.c @@ -1205,6 +1205,11 @@ static int check_i2c_params(const struct host_cmd_handler_args *args) unsigned int size; int msgnum; +#ifdef CONFIG_I2C_PASSTHRU_RESTRICTED + uint8_t cmd_id = 0xff; + const uint8_t *out; +#endif + if (args->params_size < sizeof(*params)) { PTHRUPRINTS("no params, params_size=%d, need at least %d", args->params_size, sizeof(*params)); @@ -1217,6 +1222,10 @@ static int check_i2c_params(const struct host_cmd_handler_args *args) return EC_RES_INVALID_PARAM; } +#ifdef CONFIG_I2C_PASSTHRU_RESTRICTED + out = (uint8_t *) args->params + size; +#endif + /* Loop and process messages */; for (msgnum = 0, msg = params->msg; msgnum < params->num_msgs; msgnum++, msg++) { @@ -1228,14 +1237,24 @@ static int check_i2c_params(const struct host_cmd_handler_args *args) addr_flags & EC_I2C_ADDR_MASK, msg->len); - if (addr_flags & EC_I2C_FLAG_READ) + if (addr_flags & EC_I2C_FLAG_READ) { read_len += msg->len; - else + } else { +#ifdef CONFIG_I2C_PASSTHRU_RESTRICTED + cmd_id = out[write_len]; +#endif write_len += msg->len; + } #ifdef CONFIG_I2C_PASSTHRU_RESTRICTED - if (system_is_locked() && - !board_allow_i2c_passthru(params->port)) { - return EC_RES_ACCESS_DENIED; + if (system_is_locked()) { + const struct i2c_cmd_desc_t cmd_desc = { + .port = params->port, + .addr_flags = addr_flags, + .cmd = cmd_id, + }; + if (!board_allow_i2c_passthru( + &cmd_desc)) + return EC_RES_ACCESS_DENIED; } #endif } diff --git a/include/i2c.h b/include/i2c.h index aaffbd6c09..b31a7d6343 100644 --- a/include/i2c.h +++ b/include/i2c.h @@ -162,6 +162,15 @@ extern struct i2c_stress_test i2c_stress_tests[]; extern const int i2c_test_dev_used; #endif +/* + * Data structure to define I2C Parameters for a command + */ +struct i2c_cmd_desc_t { + uint8_t port; /* I2C port */ + uint16_t addr_flags; /* Peripheral address and flags */ + uint8_t cmd; /* command, only valid on write operations */ +}; + /* Flags for i2c_xfer_unlocked() */ #define I2C_XFER_START BIT(0) /* Start smbus session from idle state */ #define I2C_XFER_STOP BIT(1) /* Terminate smbus session with stop bit */ @@ -502,13 +511,13 @@ void i2c_init(void); /** * Board-level function to determine whether i2c passthru should be allowed - * on a given port. + * on a given I2C command. * - * @parm port I2C port + * @parm cmd_desc I2C command * - * @return true, if passthru should be allowed on the port. + * @return true, if passthru should be allowed on the I2C command. */ -int board_allow_i2c_passthru(int port); +int board_allow_i2c_passthru(const struct i2c_cmd_desc_t *cmd_desc); /** * Board level function that can indicate if a particular i2c bus is known to be diff --git a/zephyr/projects/corsola/src/kingler/i2c.c b/zephyr/projects/corsola/src/kingler/i2c.c index dc18b937c3..a431050012 100644 --- a/zephyr/projects/corsola/src/kingler/i2c.c +++ b/zephyr/projects/corsola/src/kingler/i2c.c @@ -9,9 +9,9 @@ /* Kingler board specific i2c implementation */ #ifdef CONFIG_PLATFORM_EC_I2C_PASSTHRU_RESTRICTED -int board_allow_i2c_passthru(int port) +int board_allow_i2c_passthru(const struct i2c_cmd_desc_t *cmd_desc) { - return (i2c_get_device_for_port(port) == + return (i2c_get_device_for_port(cmd_desc->port) == i2c_get_device_for_port(I2C_PORT_VIRTUAL_BATTERY)); } #endif diff --git a/zephyr/projects/corsola/src/krabby/i2c.c b/zephyr/projects/corsola/src/krabby/i2c.c index 12f626847c..3b5108e115 100644 --- a/zephyr/projects/corsola/src/krabby/i2c.c +++ b/zephyr/projects/corsola/src/krabby/i2c.c @@ -9,9 +9,9 @@ /* Krabby board specific i2c implementation */ #ifdef CONFIG_PLATFORM_EC_I2C_PASSTHRU_RESTRICTED -int board_allow_i2c_passthru(int port) +int board_allow_i2c_passthru(const struct i2c_cmd_desc_t *cmd_desc) { - return (i2c_get_device_for_port(port) == + return (i2c_get_device_for_port(cmd_desc->port) == i2c_get_device_for_port(I2C_PORT_VIRTUAL_BATTERY)); } #endif diff --git a/zephyr/projects/herobrine/src/i2c.c b/zephyr/projects/herobrine/src/i2c.c index f78ea56513..3f9abe4674 100644 --- a/zephyr/projects/herobrine/src/i2c.c +++ b/zephyr/projects/herobrine/src/i2c.c @@ -9,9 +9,9 @@ /* Herobrine-NPCX9 board specific i2c implementation */ #ifdef CONFIG_PLATFORM_EC_I2C_PASSTHRU_RESTRICTED -int board_allow_i2c_passthru(int port) +int board_allow_i2c_passthru(const struct i2c_cmd_desc_t *cmd_desc) { - return (i2c_get_device_for_port(port) == + return (i2c_get_device_for_port(cmd_desc->port) == i2c_get_device_for_port(I2C_PORT_VIRTUAL_BATTERY)); } #endif diff --git a/zephyr/projects/trogdor/lazor/src/i2c.c b/zephyr/projects/trogdor/lazor/src/i2c.c index a7ce970843..89e576f81a 100644 --- a/zephyr/projects/trogdor/lazor/src/i2c.c +++ b/zephyr/projects/trogdor/lazor/src/i2c.c @@ -9,9 +9,9 @@ /* Lazor board specific i2c implementation */ #ifdef CONFIG_PLATFORM_EC_I2C_PASSTHRU_RESTRICTED -int board_allow_i2c_passthru(int port) +int board_allow_i2c_passthru(const struct i2c_cmd_desc_t *cmd_desc) { - return (i2c_get_device_for_port(port) == + return (i2c_get_device_for_port(cmd_desc->port) == i2c_get_device_for_port(I2C_PORT_VIRTUAL_BATTERY)); } #endif |