From 4a79754dd55e7f9b2431af62469cef871e5b4347 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hubert=20Mi=C5=9B?= Date: Thu, 10 Nov 2022 14:29:34 +0100 Subject: [PATCH] ipc: icmsg capability to clear rx buffer headers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit On system startup icmsg headers space must be cleared before cores start handshake procedure. The simplest way to enforce it is to clear memory by the core responsible by enabling the remote core, before the remote core is enabled and before the handshake is started. This patch ensures that nRF53 APP core clears both TX and RX memory for icmsg before it starts NET core. Signed-off-by: Hubert Miś --- include/zephyr/ipc/icmsg.h | 12 ++++++++++++ .../ipc/ipc_service/backends/ipc_icmsg_me_follower.c | 1 + .../ipc_service/backends/ipc_icmsg_me_initiator.c | 1 + subsys/ipc/ipc_service/lib/icmsg.c | 8 ++++++++ 4 files changed, 22 insertions(+) diff --git a/include/zephyr/ipc/icmsg.h b/include/zephyr/ipc/icmsg.h index 27f4764ad57..2c817c50877 100644 --- a/include/zephyr/ipc/icmsg.h +++ b/include/zephyr/ipc/icmsg.h @@ -145,3 +145,15 @@ int icmsg_send(const struct icmsg_config_t *conf, * @retval 0 on success. */ int icmsg_clear_tx_memory(const struct icmsg_config_t *conf); + +/** @brief Clear memory in RX buffer. + * + * This function is intended to be called at an early stage of boot process, + * before the instance is initialized and before the remote core has started. + * + * @param[in] conf Structure containing configuration parameters for the icmsg + * instance being created. + * + * @retval 0 on success. + */ +int icmsg_clear_rx_memory(const struct icmsg_config_t *conf); diff --git a/subsys/ipc/ipc_service/backends/ipc_icmsg_me_follower.c b/subsys/ipc/ipc_service/backends/ipc_icmsg_me_follower.c index 769242daec9..a5932149ba5 100644 --- a/subsys/ipc/ipc_service/backends/ipc_icmsg_me_follower.c +++ b/subsys/ipc/ipc_service/backends/ipc_icmsg_me_follower.c @@ -366,6 +366,7 @@ static int shared_memory_prepare(const struct device *arg) backend_config < backend_configs + ARRAY_SIZE(backend_configs); backend_config++) { icmsg_clear_tx_memory(backend_config); + icmsg_clear_rx_memory(backend_config); } return 0; diff --git a/subsys/ipc/ipc_service/backends/ipc_icmsg_me_initiator.c b/subsys/ipc/ipc_service/backends/ipc_icmsg_me_initiator.c index 5b8bf688e1a..4dd0010f6ca 100644 --- a/subsys/ipc/ipc_service/backends/ipc_icmsg_me_initiator.c +++ b/subsys/ipc/ipc_service/backends/ipc_icmsg_me_initiator.c @@ -255,6 +255,7 @@ static int shared_memory_prepare(const struct device *arg) backend_config < backend_configs + ARRAY_SIZE(backend_configs); backend_config++) { icmsg_clear_tx_memory(backend_config); + icmsg_clear_rx_memory(backend_config); } return 0; diff --git a/subsys/ipc/ipc_service/lib/icmsg.c b/subsys/ipc/ipc_service/lib/icmsg.c index 0af0f6e6007..aa476a5480d 100644 --- a/subsys/ipc/ipc_service/lib/icmsg.c +++ b/subsys/ipc/ipc_service/lib/icmsg.c @@ -246,3 +246,11 @@ int icmsg_clear_tx_memory(const struct icmsg_config_t *conf) return 0; } + +int icmsg_clear_rx_memory(const struct icmsg_config_t *conf) +{ + /* Clear spsc_pbuf header and a part of the magic number. */ + memset((void *)conf->rx_shm_addr, 0, sizeof(struct spsc_pbuf) + sizeof(int)); + + return 0; +}