summaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
authorRicardo Quesada <ricardoq@google.com>2022-02-15 13:48:26 -0800
committerCommit Bot <commit-bot@chromium.org>2022-03-17 20:07:22 +0000
commitaba3906e91a688ea6ce5eea1fd8ffb694eece1be (patch)
tree12f0d52f526d4fee88cc9e8f86f38748cd27d047 /common
parent940026601876cc7a959ed47c04bb53c879cf4448 (diff)
downloadchrome-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.c29
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
}