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; +}