78c40fe31b
Add a mailbox driver for VEVIF. The driver can be built in either 'local' or 'remote' configuration. This depends on the existence of the 'interrupts' property, which signals that the instance is managed locally. VEVIF is, as expected, always managed by a VPR core. Signed-off-by: Gerard Marull-Paretas <gerard@teslabs.com>
77 lines
2.4 KiB
C
77 lines
2.4 KiB
C
/*
|
|
* Copyright (c) 2024 Nordic Semiconductor ASA
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#define DT_DRV_COMPAT nordic_nrf_vevif_remote
|
|
|
|
#include <zephyr/devicetree.h>
|
|
#include <zephyr/drivers/mbox.h>
|
|
|
|
#include <haly/nrfy_vpr.h>
|
|
|
|
struct mbox_vevif_remote_conf {
|
|
NRF_VPR_Type *vpr;
|
|
uint32_t tasks_mask;
|
|
uint8_t tasks;
|
|
};
|
|
|
|
static inline bool vevif_remote_is_task_valid(const struct device *dev, uint32_t id)
|
|
{
|
|
const struct mbox_vevif_remote_conf *config = dev->config;
|
|
|
|
return (id < config->tasks) && ((config->tasks_mask & BIT(id)) != 0U);
|
|
}
|
|
|
|
static int vevif_remote_send(const struct device *dev, uint32_t id, const struct mbox_msg *msg)
|
|
{
|
|
const struct mbox_vevif_remote_conf *config = dev->config;
|
|
|
|
if (!vevif_remote_is_task_valid(dev, id)) {
|
|
return -EINVAL;
|
|
}
|
|
|
|
if (msg != NULL) {
|
|
return -ENOTSUP;
|
|
}
|
|
|
|
nrfy_vpr_task_trigger(config->vpr, nrfy_vpr_trigger_task_get(id));
|
|
|
|
return 0;
|
|
}
|
|
|
|
static int vevif_remote_mtu_get(const struct device *dev)
|
|
{
|
|
ARG_UNUSED(dev);
|
|
|
|
return 0;
|
|
}
|
|
|
|
static uint32_t vevif_remote_max_channels_get(const struct device *dev)
|
|
{
|
|
const struct mbox_vevif_remote_conf *config = dev->config;
|
|
|
|
return config->tasks;
|
|
}
|
|
|
|
static const struct mbox_driver_api vevif_remote_driver_api = {
|
|
.send = vevif_remote_send,
|
|
.mtu_get = vevif_remote_mtu_get,
|
|
.max_channels_get = vevif_remote_max_channels_get,
|
|
};
|
|
|
|
#define VEVIF_REMOTE_DEFINE(inst) \
|
|
BUILD_ASSERT(DT_INST_PROP(inst, nordic_tasks) <= VPR_TASKS_TRIGGER_MaxCount, \
|
|
"Number of tasks exceeds maximum"); \
|
|
\
|
|
static const struct mbox_vevif_remote_conf conf##inst = { \
|
|
.vpr = (NRF_VPR_Type *)DT_INST_REG_ADDR(inst), \
|
|
.tasks = DT_INST_PROP(inst, nordic_tasks), \
|
|
.tasks_mask = DT_INST_PROP(inst, nordic_tasks_mask), \
|
|
}; \
|
|
\
|
|
DEVICE_DT_INST_DEFINE(inst, NULL, NULL, NULL, &conf##inst, POST_KERNEL, \
|
|
CONFIG_MBOX_INIT_PRIORITY, &vevif_remote_driver_api);
|
|
|
|
DT_INST_FOREACH_STATUS_OKAY(VEVIF_REMOTE_DEFINE)
|