diff options
author | Shawn Nematbakhsh <shawnn@chromium.org> | 2016-10-26 16:11:45 -0700 |
---|---|---|
committer | ChromeOS Commit Bot <chromeos-commit-bot@chromium.org> | 2016-10-26 23:58:40 +0000 |
commit | d29fdb5484b994937c6586a50dd2818028f15f3f (patch) | |
tree | 7dc067a9ac499b0a36df601479b2d3654dd4aca6 | |
parent | 52b937797b04b78eb3d569e589e4b48639de418a (diff) | |
download | chrome-ec-d29fdb5484b994937c6586a50dd2818028f15f3f.tar.gz |
i2c: Lock out i2c passthru except for desired ports
Lock out all non-essential i2c passthru ports when system is protected.
BUG=chrome-os-partner:58859
BRANCH=gru
TEST='ectool i2cxfer 0 0 0 0' on locked system, verify that "ACCESS
DENIED" is returned.
Change-Id: If4119bbb319aa491d0e79a9ed80c94daa7950c2f
Signed-off-by: Shawn Nematbakhsh <shawnn@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/403543
Tested-by: Philip Chen <philipchen@chromium.org>
Reviewed-by: Aseda Aboagye <aaboagye@chromium.org>
Reviewed-by: Philip Chen <philipchen@chromium.org>
Commit-Queue: Philip Chen <philipchen@chromium.org>
-rw-r--r-- | board/kevin/board.c | 5 | ||||
-rw-r--r-- | board/kevin/board.h | 1 | ||||
-rw-r--r-- | board/rambi/board.c | 5 | ||||
-rw-r--r-- | common/i2c.c | 15 | ||||
-rw-r--r-- | include/i2c.h | 9 |
5 files changed, 29 insertions, 6 deletions
diff --git a/board/kevin/board.c b/board/kevin/board.c index 3028a68e2e..34036071e0 100644 --- a/board/kevin/board.c +++ b/board/kevin/board.c @@ -678,3 +678,8 @@ static void pwm_displight_preserve_state(void) sizeof(pwm_displight_duty), &pwm_displight_duty); } DECLARE_HOOK(HOOK_SYSJUMP, pwm_displight_preserve_state, HOOK_PRIO_DEFAULT); + +int board_allow_i2c_passthru(int port) +{ + return (port == I2C_PORT_VIRTUAL_BATTERY); +} diff --git a/board/kevin/board.h b/board/kevin/board.h index 88a4668a20..0578423377 100644 --- a/board/kevin/board.h +++ b/board/kevin/board.h @@ -17,6 +17,7 @@ #define CONFIG_I2C #define CONFIG_I2C_MASTER #define CONFIG_I2C_VIRTUAL_BATTERY +#define CONFIG_I2C_PASSTHRU_RESTRICTED #define CONFIG_LED_COMMON #define CONFIG_LOW_POWER_IDLE #define CONFIG_POWER_COMMON diff --git a/board/rambi/board.c b/board/rambi/board.c index 452838adfe..bf8f50523e 100644 --- a/board/rambi/board.c +++ b/board/rambi/board.c @@ -103,3 +103,8 @@ const struct temp_sensor_t temp_sensors[] = { {"Battery", TEMP_SENSOR_TYPE_BATTERY, charge_temp_sensor_get_val, 0, 4}, }; BUILD_ASSERT(ARRAY_SIZE(temp_sensors) == TEMP_SENSOR_COUNT); + +int board_allow_i2c_passthru(int port) +{ + return 0; +} diff --git a/common/i2c.c b/common/i2c.c index 59e37ed302..c40c7e7d5a 100644 --- a/common/i2c.c +++ b/common/i2c.c @@ -542,11 +542,6 @@ static int i2c_command_passthru(struct host_cmd_handler_args *args) uint8_t batt_param = 0; #endif -#ifdef CONFIG_I2C_PASSTHRU_RESTRICTED - if (system_is_locked()) - return EC_RES_ACCESS_DENIED; -#endif - #ifdef CONFIG_BATTERY_CUT_OFF /* * Some batteries would wake up after cut-off if we talk to it. @@ -624,9 +619,17 @@ static int i2c_command_passthru(struct host_cmd_handler_args *args) "write_len=%x, data=%p, read_len=%x, flags=%x", params->port, addr, out, write_len, &resp->data[in_len], read_len, xferflags); - if (rv) + if (rv) { +#ifdef CONFIG_I2C_PASSTHRU_RESTRICTED + if (system_is_locked() && + !board_allow_i2c_passthru(params->port)) { + i2c_lock(params->port, 0); + return EC_RES_ACCESS_DENIED; + } +#endif rv = i2c_xfer(params->port, addr, out, write_len, &resp->data[in_len], read_len, xferflags); + } if (rv) { /* Driver will have sent a stop bit here */ diff --git a/include/i2c.h b/include/i2c.h index ed9b8db40b..7a25d8b2e7 100644 --- a/include/i2c.h +++ b/include/i2c.h @@ -256,4 +256,13 @@ int i2c_read_string(int port, int slave_addr, int offset, uint8_t *data, */ int i2c_port_to_controller(int port); +/** + * Board-level function to determine whether i2c passthru should be allowed + * on a given port. + * + * @parm port I2C port + * + * @return true, if passthru should be allowed on the port. + */ +int board_allow_i2c_passthru(int port); #endif /* __CROS_EC_I2C_H */ |