summaryrefslogtreecommitdiff
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
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>
-rw-r--r--baseboard/asurada/baseboard.c4
-rw-r--r--baseboard/cherry/baseboard.c4
-rw-r--r--baseboard/goroh/baseboard.c4
-rw-r--r--baseboard/herobrine/baseboard.c4
-rw-r--r--baseboard/kukui/baseboard.c5
-rw-r--r--baseboard/trogdor/baseboard.c8
-rw-r--r--board/rainier/board.c2
-rw-r--r--board/scarlet/board.c4
-rw-r--r--common/i2c_controller.c29
-rw-r--r--include/i2c.h17
-rw-r--r--zephyr/projects/corsola/src/kingler/i2c.c4
-rw-r--r--zephyr/projects/corsola/src/krabby/i2c.c4
-rw-r--r--zephyr/projects/herobrine/src/i2c.c4
-rw-r--r--zephyr/projects/trogdor/lazor/src/i2c.c4
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