summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShawn Nematbakhsh <shawnn@chromium.org>2016-10-26 16:11:45 -0700
committerChromeOS Commit Bot <chromeos-commit-bot@chromium.org>2016-10-26 23:58:40 +0000
commitd29fdb5484b994937c6586a50dd2818028f15f3f (patch)
tree7dc067a9ac499b0a36df601479b2d3654dd4aca6
parent52b937797b04b78eb3d569e589e4b48639de418a (diff)
downloadchrome-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.c5
-rw-r--r--board/kevin/board.h1
-rw-r--r--board/rambi/board.c5
-rw-r--r--common/i2c.c15
-rw-r--r--include/i2c.h9
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 */