ipc: icmsg & icbmsg: Add support for POSIX arch targets
Add support in this IPC backends for POSIX arch targets in general, and ensure the nrf5340bsim defines the buffer which will be used. Signed-off-by: Alberto Escolar Piedras <alberto.escolar.piedras@nordicsemi.no>
This commit is contained in:
parent
5dc810e261
commit
b5b91b3edb
4 changed files with 50 additions and 12 deletions
|
@ -35,6 +35,13 @@ extern "C" {
|
||||||
*/
|
*/
|
||||||
#define _PBUF_MIN_DATA_LEN ROUND_UP(PBUF_PACKET_LEN_SZ + 1 + _PBUF_IDX_SIZE, _PBUF_IDX_SIZE)
|
#define _PBUF_MIN_DATA_LEN ROUND_UP(PBUF_PACKET_LEN_SZ + 1 + _PBUF_IDX_SIZE, _PBUF_IDX_SIZE)
|
||||||
|
|
||||||
|
#if defined(CONFIG_ARCH_POSIX)
|
||||||
|
/* For the native simulated boards we need to modify some pointers at init */
|
||||||
|
#define PBUF_MAYBE_CONST
|
||||||
|
#else
|
||||||
|
#define PBUF_MAYBE_CONST const
|
||||||
|
#endif
|
||||||
|
|
||||||
/** @brief Control block of packet buffer.
|
/** @brief Control block of packet buffer.
|
||||||
*
|
*
|
||||||
* The structure contains configuration data.
|
* The structure contains configuration data.
|
||||||
|
@ -87,9 +94,9 @@ struct pbuf_data {
|
||||||
* written in a way to protect the data from being corrupted.
|
* written in a way to protect the data from being corrupted.
|
||||||
*/
|
*/
|
||||||
struct pbuf {
|
struct pbuf {
|
||||||
const struct pbuf_cfg *const cfg; /* Configuration of the
|
PBUF_MAYBE_CONST struct pbuf_cfg *const cfg; /* Configuration of the
|
||||||
* buffer.
|
* buffer.
|
||||||
*/
|
*/
|
||||||
struct pbuf_data data; /* Data used to read and write
|
struct pbuf_data data; /* Data used to read and write
|
||||||
* to the buffer
|
* to the buffer
|
||||||
*/
|
*/
|
||||||
|
@ -144,8 +151,7 @@ struct pbuf {
|
||||||
"Misaligned memory."); \
|
"Misaligned memory."); \
|
||||||
BUILD_ASSERT(size >= (MAX(dcache_align, _PBUF_IDX_SIZE) + _PBUF_IDX_SIZE + \
|
BUILD_ASSERT(size >= (MAX(dcache_align, _PBUF_IDX_SIZE) + _PBUF_IDX_SIZE + \
|
||||||
_PBUF_MIN_DATA_LEN), "Insufficient size."); \
|
_PBUF_MIN_DATA_LEN), "Insufficient size."); \
|
||||||
\
|
static PBUF_MAYBE_CONST struct pbuf_cfg cfg_##name = \
|
||||||
static const struct pbuf_cfg cfg_##name = \
|
|
||||||
PBUF_CFG_INIT(mem_addr, size, dcache_align); \
|
PBUF_CFG_INIT(mem_addr, size, dcache_align); \
|
||||||
static struct pbuf name = { \
|
static struct pbuf name = { \
|
||||||
.cfg = &cfg_##name, \
|
.cfg = &cfg_##name, \
|
||||||
|
|
|
@ -87,6 +87,13 @@
|
||||||
#include <zephyr/ipc/ipc_service_backend.h>
|
#include <zephyr/ipc/ipc_service_backend.h>
|
||||||
#include <zephyr/cache.h>
|
#include <zephyr/cache.h>
|
||||||
|
|
||||||
|
#if defined(CONFIG_ARCH_POSIX)
|
||||||
|
#include <soc.h>
|
||||||
|
#define MAYBE_CONST
|
||||||
|
#else
|
||||||
|
#define MAYBE_CONST const
|
||||||
|
#endif
|
||||||
|
|
||||||
LOG_MODULE_REGISTER(ipc_icbmsg,
|
LOG_MODULE_REGISTER(ipc_icbmsg,
|
||||||
CONFIG_IPC_SERVICE_BACKEND_ICBMSG_LOG_LEVEL);
|
CONFIG_IPC_SERVICE_BACKEND_ICBMSG_LOG_LEVEL);
|
||||||
|
|
||||||
|
@ -1178,12 +1185,17 @@ static int release_rx_buffer(const struct device *instance, void *token, void *d
|
||||||
*/
|
*/
|
||||||
static int backend_init(const struct device *instance)
|
static int backend_init(const struct device *instance)
|
||||||
{
|
{
|
||||||
const struct icbmsg_config *conf = instance->config;
|
MAYBE_CONST struct icbmsg_config *conf = (struct icbmsg_config *)instance->config;
|
||||||
struct backend_data *dev_data = instance->data;
|
struct backend_data *dev_data = instance->data;
|
||||||
#ifdef CONFIG_MULTITHREADING
|
#ifdef CONFIG_MULTITHREADING
|
||||||
static K_THREAD_STACK_DEFINE(ep_bound_work_q_stack, EP_BOUND_WORK_Q_STACK_SIZE);
|
static K_THREAD_STACK_DEFINE(ep_bound_work_q_stack, EP_BOUND_WORK_Q_STACK_SIZE);
|
||||||
static bool is_work_q_started;
|
static bool is_work_q_started;
|
||||||
|
|
||||||
|
#if defined(CONFIG_ARCH_POSIX)
|
||||||
|
native_emb_addr_remap((void **)&conf->tx.blocks_ptr);
|
||||||
|
native_emb_addr_remap((void **)&conf->rx.blocks_ptr);
|
||||||
|
#endif
|
||||||
|
|
||||||
if (!is_work_q_started) {
|
if (!is_work_q_started) {
|
||||||
k_work_queue_init(&ep_bound_work_q);
|
k_work_queue_init(&ep_bound_work_q);
|
||||||
k_work_queue_start(&ep_bound_work_q, ep_bound_work_q_stack,
|
k_work_queue_start(&ep_bound_work_q, ep_bound_work_q_stack,
|
||||||
|
@ -1341,7 +1353,7 @@ const static struct ipc_service_backend backend_ops = {
|
||||||
.rx_pb = &rx_icbmsg_pb_##i, \
|
.rx_pb = &rx_icbmsg_pb_##i, \
|
||||||
} \
|
} \
|
||||||
}; \
|
}; \
|
||||||
static const struct icbmsg_config backend_config_##i = \
|
static MAYBE_CONST struct icbmsg_config backend_config_##i = \
|
||||||
{ \
|
{ \
|
||||||
.control_config = { \
|
.control_config = { \
|
||||||
.mbox_tx = MBOX_DT_SPEC_INST_GET(i, tx), \
|
.mbox_tx = MBOX_DT_SPEC_INST_GET(i, tx), \
|
||||||
|
|
|
@ -11,6 +11,10 @@
|
||||||
#include <zephyr/ipc/pbuf.h>
|
#include <zephyr/ipc/pbuf.h>
|
||||||
#include <zephyr/sys/byteorder.h>
|
#include <zephyr/sys/byteorder.h>
|
||||||
|
|
||||||
|
#if defined(CONFIG_ARCH_POSIX)
|
||||||
|
#include <soc.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Helper funciton for getting numer of bytes being written to the bufer. */
|
/* Helper funciton for getting numer of bytes being written to the bufer. */
|
||||||
static uint32_t idx_occupied(uint32_t len, uint32_t wr_idx, uint32_t rd_idx)
|
static uint32_t idx_occupied(uint32_t len, uint32_t wr_idx, uint32_t rd_idx)
|
||||||
{
|
{
|
||||||
|
@ -54,11 +58,23 @@ static int validate_cfg(const struct pbuf_cfg *cfg)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(CONFIG_ARCH_POSIX)
|
||||||
|
void pbuf_native_addr_remap(struct pbuf *pb)
|
||||||
|
{
|
||||||
|
native_emb_addr_remap((void **)&pb->cfg->rd_idx_loc);
|
||||||
|
native_emb_addr_remap((void **)&pb->cfg->wr_idx_loc);
|
||||||
|
native_emb_addr_remap((void **)&pb->cfg->data_loc);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
int pbuf_tx_init(struct pbuf *pb)
|
int pbuf_tx_init(struct pbuf *pb)
|
||||||
{
|
{
|
||||||
if (validate_cfg(pb->cfg) != 0) {
|
if (validate_cfg(pb->cfg) != 0) {
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
#if defined(CONFIG_ARCH_POSIX)
|
||||||
|
pbuf_native_addr_remap(pb);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Initialize local copy of indexes. */
|
/* Initialize local copy of indexes. */
|
||||||
pb->data.wr_idx = 0;
|
pb->data.wr_idx = 0;
|
||||||
|
@ -82,6 +98,10 @@ int pbuf_rx_init(struct pbuf *pb)
|
||||||
if (validate_cfg(pb->cfg) != 0) {
|
if (validate_cfg(pb->cfg) != 0) {
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
#if defined(CONFIG_ARCH_POSIX)
|
||||||
|
pbuf_native_addr_remap(pb);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Initialize local copy of indexes. */
|
/* Initialize local copy of indexes. */
|
||||||
pb->data.wr_idx = 0;
|
pb->data.wr_idx = 0;
|
||||||
pb->data.rd_idx = 0;
|
pb->data.rd_idx = 0;
|
||||||
|
|
|
@ -48,7 +48,7 @@ ZTEST(test_pbuf, test_rw)
|
||||||
* order to avoid clang complains about memory_area not being constant
|
* order to avoid clang complains about memory_area not being constant
|
||||||
* expression.
|
* expression.
|
||||||
*/
|
*/
|
||||||
static const struct pbuf_cfg cfg = PBUF_CFG_INIT(memory_area, MEM_AREA_SZ, 0);
|
static PBUF_MAYBE_CONST struct pbuf_cfg cfg = PBUF_CFG_INIT(memory_area, MEM_AREA_SZ, 0);
|
||||||
|
|
||||||
static struct pbuf pb = {
|
static struct pbuf pb = {
|
||||||
.cfg = &cfg,
|
.cfg = &cfg,
|
||||||
|
@ -115,9 +115,9 @@ ZTEST(test_pbuf, test_retcodes)
|
||||||
* order to avoid clang complains about memory_area not being constant
|
* order to avoid clang complains about memory_area not being constant
|
||||||
* expression.
|
* expression.
|
||||||
*/
|
*/
|
||||||
static const struct pbuf_cfg cfg0 = PBUF_CFG_INIT(memory_area, MEM_AREA_SZ, 32);
|
static PBUF_MAYBE_CONST struct pbuf_cfg cfg0 = PBUF_CFG_INIT(memory_area, MEM_AREA_SZ, 32);
|
||||||
static const struct pbuf_cfg cfg1 = PBUF_CFG_INIT(memory_area, MEM_AREA_SZ, 0);
|
static PBUF_MAYBE_CONST struct pbuf_cfg cfg1 = PBUF_CFG_INIT(memory_area, MEM_AREA_SZ, 0);
|
||||||
static const struct pbuf_cfg cfg2 = PBUF_CFG_INIT(memory_area, 20, 4);
|
static PBUF_MAYBE_CONST struct pbuf_cfg cfg2 = PBUF_CFG_INIT(memory_area, 20, 4);
|
||||||
|
|
||||||
static struct pbuf pb0 = {
|
static struct pbuf pb0 = {
|
||||||
.cfg = &cfg0,
|
.cfg = &cfg0,
|
||||||
|
@ -268,7 +268,7 @@ ZTEST(test_pbuf, test_stress)
|
||||||
* order to avoid clang complains about buffer not being constant
|
* order to avoid clang complains about buffer not being constant
|
||||||
* expression.
|
* expression.
|
||||||
*/
|
*/
|
||||||
static const struct pbuf_cfg cfg = PBUF_CFG_INIT(buffer, MEM_AREA_SZ, 4);
|
static PBUF_MAYBE_CONST struct pbuf_cfg cfg = PBUF_CFG_INIT(buffer, MEM_AREA_SZ, 4);
|
||||||
|
|
||||||
static struct pbuf pb = {
|
static struct pbuf pb = {
|
||||||
.cfg = &cfg,
|
.cfg = &cfg,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue