summaryrefslogtreecommitdiff
path: root/chip/ish/heci.c
diff options
context:
space:
mode:
authorTom Hughes <tomhughes@chromium.org>2022-09-21 14:08:36 -0700
committerTom Hughes <tomhughes@chromium.org>2022-09-22 12:59:38 -0700
commitc453fd704268ef72de871b0c5ac7a989de662334 (patch)
treefcf6ce5810f9ff9e3c8cce434812dd75492269ed /chip/ish/heci.c
parent6c1587ca70f558b4f96b3f0b18ad8b027d3ba99d (diff)
parent28712dae9d7ed1e694f7622cc083afa71090d4d5 (diff)
downloadchrome-ec-c453fd704268ef72de871b0c5ac7a989de662334.tar.gz
Merge remote-tracking branch cros/main into firmware-fpmcu-dartmonkey-releasefirmware-fpmcu-dartmonkey-release
Generated by: ./util/update_release_branch.py --board dartmonkey --relevant_paths_file ./util/fingerprint-relevant-paths.txt firmware-fpmcu-dartmonkey-release Relevant changes: git log --oneline 6c1587ca70..28712dae9d -- board/nocturne_fp board/dartmonkey common/fpsensor docs/fingerprint driver/fingerprint util/getversion.sh ded9307b79 util/getversion.sh: Fix version when not in a git repo 956055e692 board: change Google USB vendor info 71b2ef709d Update license boilerplate text in source code files 33e11afda0 Revert "fpsensor: Build fpsensor source file with C++" c8d0360723 fpsensor: Build fpsensor source file with C++ bc113abd53 fpsensor: Fix g++ compiler error 150a58a0dc fpsensor: Fix fp_set_sensor_mode return type b33b5ce85b fpsensor: Remove nested designators for C++ compatibility 2e864b2539 tree-wide: const-ify argv for console commands 56d8b360f9 test: Add test for get ikm failure when seed not set 3a3d6c3690 test: Add test for fpsensor trivial key failure 233e6bbd08 fpsensor_crypto: Abstract calls to hmac_SHA256 0a041b285b docs/fingerprint: Typo correction c03fab67e2 docs/fingerprint: Fix the path of fputils.py 0b5d4baf5a util/getversion.sh: Fix empty file list handling 6e128fe760 FPMCU dev board environment with Satlab 3eb29b6aa5 builtin: Move ssize_t to sys/types.h 345d62ebd1 docs/fingerprint: Update power numbers for latest dartmonkey release c25ffdb316 common: Conditionally support printf %l and %i modifiers 9a3c514b45 test: Add a test to check if the debugger is connected 54e603413f Move standard library tests to their own file 43fa6b4bf8 docs/fingerprint: Update power numbers for latest bloonchipper release 25536f9a84 driver/fingerprint/fpc/bep/fpc_sensor_spi.c: Format with clang-format 4face99efd driver/fingerprint/fpc/libfp/fpc_sensor_pal.h: Format with clang-format 738de2b575 trng: Rename rand to trng_rand 14b8270edd docs/fingerprint: Update dragonclaw power numbers 0b268f93d1 driver/fingerprint/fpc/libfp/fpc_private.c: Format with clang-format f80da163f2 driver/fingerprint/fpc/libfp/fpc_private.h: Format with clang-format a0751778f4 board/nocturne_fp/ro_workarounds.c: Format with clang-format 5e9c85c9b1 driver/fingerprint/fpc/libfp/fpc_sensor_pal.c: Format with clang-format c1f9dd3cf8 driver/fingerprint/fpc/libfp/fpc_bio_algorithm.h: Format with clang-format eb1e1bed8d driver/fingerprint/fpc/libfp/fpc1145_private.h: Format with clang-format 6e7b611821 driver/fingerprint/fpc/bep/fpc_bio_algorithm.h: Format with clang-format e0589cd5e2 driver/fingerprint/fpc/bep/fpc1035_private.h: Format with clang-format 58f0246dbe board/nocturne_fp/board_ro.c: Format with clang-format 7905e556a0 common/fpsensor/fpsensor_crypto.c: Format with clang-format 21289d170c driver/fingerprint/fpc/bep/fpc1025_private.h: Format with clang-format 98a20f937e common/fpsensor/fpsensor_state.c: Format with clang-format a2d255d8af common/fpsensor/fpsensor.c: Format with clang-format 84e53a65da board/nocturne_fp/board.h: Format with clang-format 73055eeb3f driver/fingerprint/fpc/bep/fpc_private.c: Format with clang-format 0f7b5cb509 common/fpsensor/fpsensor_private.h: Format with clang-format 1ceade6e65 driver/fingerprint/fpc/bep/fpc_private.h: Format with clang-format dca9d74321 Revert "trng: Rename rand to trng_rand" a6b0b3554f trng: Rename rand to trng_rand 28d0b75b70 third_party/boringssl: Remove unused header BRANCH=None BUG=b:244387210 b:242720240 b:215613183 b:242720910 b:236386294 BUG=b:234181908 b:244781166 b:234781655 b:234143158 b:234181908 BUG=b:237344361 b:236025198 b:234181908 b:180945056 chromium:1098010 BUG=b:246424843 b:234181908 b:131913998 TEST=`make -j buildall` TEST=./util/run_device_tests.py --board dartmonkey Test "aes": PASSED Test "cec": PASSED Test "cortexm_fpu": PASSED Test "crc": PASSED Test "flash_physical": PASSED Test "flash_write_protect": PASSED Test "fpsensor_hw": PASSED Test "fpsensor_spi_ro": PASSED Test "fpsensor_spi_rw": PASSED Test "fpsensor_uart_ro": PASSED Test "fpsensor_uart_rw": PASSED Test "mpu_ro": PASSED Test "mpu_rw": PASSED Test "mutex": PASSED Test "pingpong": PASSED Test "printf": PASSED Test "queue": PASSED Test "rollback_region0": PASSED Test "rollback_region1": PASSED Test "rollback_entropy": PASSED Test "rtc": PASSED Test "sha256": PASSED Test "sha256_unrolled": PASSED Test "static_if": PASSED Test "stdlib": PASSED Test "system_is_locked_wp_on": PASSED Test "system_is_locked_wp_off": PASSED Test "timer_dos": PASSED Test "utils": PASSED Test "utils_str": PASSED Test "panic_data_dartmonkey_v2.0.2887": PASSED Test "panic_data_nocturne_fp_v2.2.64": PASSED Test "panic_data_nami_fp_v2.2.144": PASSED Force-Relevant-Builds: all Signed-off-by: Tom Hughes <tomhughes@chromium.org> Change-Id: I2c312583a709fedae8fe11d92c22328c3b634bc7
Diffstat (limited to 'chip/ish/heci.c')
-rw-r--r--chip/ish/heci.c109
1 files changed, 56 insertions, 53 deletions
diff --git a/chip/ish/heci.c b/chip/ish/heci.c
index 4a9bc9551b..6f99a486e7 100644
--- a/chip/ish/heci.c
+++ b/chip/ish/heci.c
@@ -1,9 +1,10 @@
-/* Copyright 2018 The Chromium OS Authors. All rights reserved.
+/* Copyright 2018 The ChromiumOS Authors
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include "atomic.h"
+#include "builtin/assert.h"
#include "compile_time_macros.h"
#include "console.h"
#include "hbm.h"
@@ -15,19 +16,19 @@
#include "util.h"
#define CPUTS(outstr) cputs(CC_LPC, outstr)
-#define CPRINTS(format, args...) cprints(CC_LPC, format, ## args)
-#define CPRINTF(format, args...) cprintf(CC_LPC, format, ## args)
+#define CPRINTS(format, args...) cprints(CC_LPC, format, ##args)
+#define CPRINTF(format, args...) cprintf(CC_LPC, format, ##args)
struct heci_header {
uint8_t fw_addr;
uint8_t host_addr;
uint16_t length; /* [8:0] length, [14:9] reserved, [15] msg_complete */
} __packed;
-#define HECI_MSG_CMPL_SHIFT 15
-#define HECI_MSG_LENGTH_MASK 0x01FF
-#define HECI_MSG_LENGTH(length) ((length) & HECI_MSG_LENGTH_MASK)
+#define HECI_MSG_CMPL_SHIFT 15
+#define HECI_MSG_LENGTH_MASK 0x01FF
+#define HECI_MSG_LENGTH(length) ((length)&HECI_MSG_LENGTH_MASK)
#define HECI_MSG_IS_COMPLETED(length) \
- (!!((length) & (0x01 << HECI_MSG_CMPL_SHIFT)))
+ (!!((length) & (0x01 << HECI_MSG_CMPL_SHIFT)))
BUILD_ASSERT(HECI_IPC_PAYLOAD_SIZE ==
(IPC_MAX_PAYLOAD_SIZE - sizeof(struct heci_header)));
@@ -38,26 +39,26 @@ struct heci_msg {
} __packed;
/* HECI addresses */
-#define HECI_HBM_ADDRESS 0 /* HECI Bus Message */
-#define HECI_DYN_CLIENT_ADDR_START 0x20 /* Dynamic client start addr */
+#define HECI_HBM_ADDRESS 0 /* HECI Bus Message */
+#define HECI_DYN_CLIENT_ADDR_START 0x20 /* Dynamic client start addr */
/* A fw client has the same value for both handle and fw address */
-#define TO_FW_ADDR(handle) ((uintptr_t)(handle))
-#define TO_HECI_HANDLE(fw_addr) ((heci_handle_t)(uintptr_t)(fw_addr))
+#define TO_FW_ADDR(handle) ((uintptr_t)(handle))
+#define TO_HECI_HANDLE(fw_addr) ((heci_handle_t)(uintptr_t)(fw_addr))
/* convert client fw address to client context index */
-#define TO_CLIENT_CTX_IDX(fw_addr) ((fw_addr) - HECI_DYN_CLIENT_ADDR_START)
+#define TO_CLIENT_CTX_IDX(fw_addr) ((fw_addr)-HECI_DYN_CLIENT_ADDR_START)
/* should be less than HECI_INVALID_HANDLE - 1 */
BUILD_ASSERT(HECI_MAX_NUM_OF_CLIENTS < 0x0FE);
struct heci_client_connect {
- uint8_t is_connected; /* client is connected to host */
- uint8_t host_addr; /* connected host address */
+ uint8_t is_connected; /* client is connected to host */
+ uint8_t host_addr; /* connected host address */
/* receiving message */
uint8_t ignore_rx_msg;
- uint8_t rx_msg[HECI_MAX_MSG_SIZE];
- size_t rx_msg_length;
+ uint8_t rx_msg[HECI_MAX_MSG_SIZE];
+ size_t rx_msg_length;
uint32_t flow_ctrl_creds; /* flow control */
struct mutex lock; /* protects against 2 writers */
@@ -67,7 +68,7 @@ struct heci_client_connect {
struct heci_client_context {
const struct heci_client *client;
- void *data; /* client specific data */
+ void *data; /* client specific data */
struct heci_client_connect connect; /* connection context */
struct ss_subsys_device ss_device; /* system state receiver device */
@@ -82,7 +83,7 @@ struct heci_bus_context {
/* declare heci bus */
struct heci_bus_context heci_bus_ctx = {
- .ipc_handle = IPC_INVALID_HANDLE,
+ .ipc_handle = IPC_INVALID_HANDLE,
};
static inline struct heci_client_context *
@@ -118,11 +119,14 @@ static inline int heci_is_valid_handle(const heci_handle_t handle)
/* find heci device that contains this system state device in it */
#define ss_device_to_heci_client_context(ss_dev) \
- ((struct heci_client_context *)((void *)(ss_dev) - \
- (void *)(&(((struct heci_client_context *)0)->ss_device))))
-#define client_context_to_handle(cli_ctx) \
- ((heci_handle_t)((uint32_t)((cli_ctx) - &heci_bus_ctx.client_ctxs[0]) \
- / sizeof(heci_bus_ctx.client_ctxs[0]) + 1))
+ ((struct heci_client_context \
+ *)((void *)(ss_dev) - \
+ (void *)(&( \
+ ((struct heci_client_context *)0)->ss_device))))
+#define client_context_to_handle(cli_ctx) \
+ ((heci_handle_t)((uint32_t)((cli_ctx) - &heci_bus_ctx.client_ctxs[0]) / \
+ sizeof(heci_bus_ctx.client_ctxs[0]) + \
+ 1))
/*
* each heci device registered as system state device which gets
@@ -132,7 +136,7 @@ static inline int heci_is_valid_handle(const heci_handle_t handle)
static int heci_client_suspend(struct ss_subsys_device *ss_device)
{
struct heci_client_context *cli_ctx =
- ss_device_to_heci_client_context(ss_device);
+ ss_device_to_heci_client_context(ss_device);
heci_handle_t handle = client_context_to_handle(cli_ctx);
if (cli_ctx->client->cbs->suspend)
@@ -144,7 +148,7 @@ static int heci_client_suspend(struct ss_subsys_device *ss_device)
static int heci_client_resume(struct ss_subsys_device *ss_device)
{
struct heci_client_context *cli_ctx =
- ss_device_to_heci_client_context(ss_device);
+ ss_device_to_heci_client_context(ss_device);
heci_handle_t handle = client_context_to_handle(cli_ctx);
if (cli_ctx->client->cbs->resume)
@@ -239,8 +243,8 @@ static int heci_send_heci_msg_timestamp(struct heci_msg *msg,
timestamp);
if (written != length) {
- CPRINTF("%s error : len = %d err = %d\n", __func__,
- (int)length, written);
+ CPRINTF("%s error : len = %d err = %d\n", __func__, (int)length,
+ written);
return -EC_ERROR_UNKNOWN;
}
@@ -381,7 +385,6 @@ int heci_send_msg(const heci_handle_t handle, uint8_t *buf,
return heci_send_msg_timestamp(handle, buf, buf_size, NULL);
}
-
int heci_send_msgs(const heci_handle_t handle,
const struct heci_msg_list *msg_list)
{
@@ -453,8 +456,8 @@ int heci_send_msgs(const heci_handle_t handle,
/* no leftovers, send the last msg here */
if (msg_sent == total_size) {
- msg.hdr.length |=
- (uint16_t)1 << HECI_MSG_CMPL_SHIFT;
+ msg.hdr.length |= (uint16_t)1
+ << HECI_MSG_CMPL_SHIFT;
}
heci_send_heci_msg(&msg);
@@ -488,7 +491,6 @@ err_locked:
mutex_unlock(&connect->lock);
return total_size;
-
}
/* For now, we only support fixed client payload size < IPC payload size */
@@ -535,9 +537,9 @@ static int handle_version_req(struct hbm_version_req *ver_req)
return EC_SUCCESS;
}
-#define BITS_PER_BYTE 8
+#define BITS_PER_BYTE 8
/* get number of bits for one element of "valid_addresses" array */
-#define BITS_PER_ELEMENT \
+#define BITS_PER_ELEMENT \
(sizeof(((struct hbm_enum_res *)0)->valid_addresses[0]) * BITS_PER_BYTE)
static int handle_enum_req(struct hbm_enum_req *enum_req)
@@ -604,11 +606,11 @@ static int handle_client_prop_req(struct hbm_client_prop_req *client_prop_req)
client_prop->protocol_name = client->protocol_id;
client_prop->protocol_version = client->protocol_ver;
client_prop->max_number_of_connections =
- client->max_n_of_connections;
+ client->max_n_of_connections;
client_prop->max_msg_length = client->max_msg_size;
client_prop->dma_hdr_len = client->dma_header_length;
- client_prop->dma_hdr_len |= client->dma_enabled ?
- CLIENT_DMA_ENABLE : 0;
+ client_prop->dma_hdr_len |=
+ client->dma_enabled ? CLIENT_DMA_ENABLE : 0;
}
heci_send_heci_msg(&heci_msg);
@@ -642,8 +644,8 @@ static int heci_send_flow_control(uint8_t fw_addr)
return EC_SUCCESS;
}
-static int handle_client_connect_req(
- struct hbm_client_connect_req *client_connect_req)
+static int
+handle_client_connect_req(struct hbm_client_connect_req *client_connect_req)
{
struct hbm_client_connect_res *client_connect_res;
struct heci_msg heci_msg;
@@ -663,7 +665,7 @@ static int handle_client_connect_req(
client_connect_res->host_addr = client_connect_req->host_addr;
if (!heci_is_valid_client_addr(client_connect_req->fw_addr)) {
client_connect_res->status =
- HECI_CONNECT_STATUS_CLIENT_NOT_FOUND;
+ HECI_CONNECT_STATUS_CLIENT_NOT_FOUND;
} else if (!client_connect_req->host_addr) {
client_connect_res->status =
HECI_CONNECT_STATUS_INVALID_PARAMETER;
@@ -671,7 +673,7 @@ static int handle_client_connect_req(
connect = heci_get_client_connect(client_connect_req->fw_addr);
if (connect->is_connected) {
client_connect_res->status =
- HECI_CONNECT_STATUS_ALREADY_EXISTS;
+ HECI_CONNECT_STATUS_ALREADY_EXISTS;
} else {
connect->is_connected = 1;
connect->host_addr = client_connect_req->host_addr;
@@ -729,8 +731,7 @@ static void heci_handle_client_msg(struct heci_msg *msg, size_t length)
connect = &cli_ctx->connect;
payload_size = HECI_MSG_LENGTH(msg->hdr.length);
- if (connect->is_connected &&
- msg->hdr.host_addr == connect->host_addr) {
+ if (connect->is_connected && msg->hdr.host_addr == connect->host_addr) {
if (!connect->ignore_rx_msg &&
connect->rx_msg_length + payload_size > HECI_MAX_MSG_SIZE) {
connect->ignore_rx_msg = 1; /* too big. discard */
@@ -760,7 +761,7 @@ static void heci_handle_client_msg(struct heci_msg *msg, size_t length)
}
static int handle_client_disconnect_req(
- struct hbm_client_disconnect_req *client_disconnect_req)
+ struct hbm_client_disconnect_req *client_disconnect_req)
{
struct hbm_client_disconnect_res *client_disconnect_res;
struct heci_msg heci_msg;
@@ -772,8 +773,9 @@ static int handle_client_disconnect_req(
CPRINTS("Got HECI disconnect request");
- heci_build_hbm_header(&heci_msg.hdr, sizeof(i2h->cmd) +
- sizeof(*client_disconnect_res));
+ heci_build_hbm_header(&heci_msg.hdr,
+ sizeof(i2h->cmd) +
+ sizeof(*client_disconnect_res));
i2h = (struct hbm_i2h *)heci_msg.payload;
i2h->cmd = HECI_BUS_MSG_CLIENT_DISCONNECT_RESP;
@@ -789,7 +791,7 @@ static int handle_client_disconnect_req(
if (!heci_is_valid_client_addr(fw_addr) ||
!heci_is_client_connected(fw_addr)) {
client_disconnect_res->status =
- HECI_CONNECT_STATUS_CLIENT_NOT_FOUND;
+ HECI_CONNECT_STATUS_CLIENT_NOT_FOUND;
} else {
connect = heci_get_client_connect(fw_addr);
if (connect->host_addr != host_addr) {
@@ -891,8 +893,8 @@ static int is_hbm_validity(struct hbm_h2i *h2i, size_t length)
}
if (valid_msg_len != length) {
- CPRINTF("invalid cmd(%d) valid : %d, cur : %zd\n",
- h2i->cmd, valid_msg_len, length);
+ CPRINTF("invalid cmd(%d) valid : %d, cur : %zd\n", h2i->cmd,
+ valid_msg_len, length);
/* TODO: invalid cmd. not sure to reply with error ? */
return 0;
}
@@ -922,7 +924,7 @@ static void heci_handle_hbm(struct hbm_h2i *h2i, size_t length)
case HECI_BUS_MSG_CLIENT_CONNECT_REQ:
handle_client_connect_req(
- (struct hbm_client_connect_req *)data);
+ (struct hbm_client_connect_req *)data);
break;
case HECI_BUS_MSG_FLOW_CONTROL:
@@ -931,7 +933,7 @@ static void heci_handle_hbm(struct hbm_h2i *h2i, size_t length)
case HECI_BUS_MSG_CLIENT_DISCONNECT_REQ:
handle_client_disconnect_req(
- (struct hbm_client_disconnect_req *)data);
+ (struct hbm_client_disconnect_req *)data);
break;
case HECI_BUS_MSG_HOST_STOP_REQ:
@@ -991,7 +993,7 @@ static void heci_handle_heci_msg(struct heci_msg *heci_msg, size_t msg_length)
}
/* event flag for HECI msg */
-#define EVENT_FLAG_BIT_HECI_MSG TASK_EVENT_CUSTOM_BIT(0)
+#define EVENT_FLAG_BIT_HECI_MSG TASK_EVENT_CUSTOM_BIT(0)
void heci_rx_task(void)
{
@@ -1017,8 +1019,9 @@ void heci_rx_task(void)
continue;
}
- if (HECI_MSG_LENGTH(heci_msg.hdr.length) + sizeof(heci_msg.hdr)
- == msg_len)
+ if (HECI_MSG_LENGTH(heci_msg.hdr.length) +
+ sizeof(heci_msg.hdr) ==
+ msg_len)
heci_handle_heci_msg(&heci_msg, msg_len);
else
CPRINTS("msg len mismatch.. discard..");