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 /common | |
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>
Diffstat (limited to 'common')
-rw-r--r-- | common/i2c_controller.c | 29 |
1 files changed, 24 insertions, 5 deletions
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 } |