/*
 * Copyright (c) 2022 Nordic Semiconductor ASA
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include "ipc_icmsg.h"

#include <zephyr/kernel.h>
#include <zephyr/device.h>
#include <zephyr/ipc/icmsg.h>

#include <zephyr/ipc/ipc_service_backend.h>

#define DT_DRV_COMPAT	zephyr_ipc_icmsg

static int register_ept(const struct device *instance, void **token,
			const struct ipc_ept_cfg *cfg)
{
	const struct icmsg_config_t *conf = instance->config;
	struct icmsg_data_t *dev_data = instance->data;

	/* Only one endpoint is supported. No need for a token. */
	*token = NULL;

	return icmsg_open(conf, dev_data, &cfg->cb, cfg->priv);
}

static int deregister_ept(const struct device *instance, void *token)
{
	const struct icmsg_config_t *conf = instance->config;
	struct icmsg_data_t *dev_data = instance->data;

	return icmsg_close(conf, dev_data);
}

static int send(const struct device *instance, void *token,
		const void *msg, size_t len)
{
	const struct icmsg_config_t *conf = instance->config;
	struct icmsg_data_t *dev_data = instance->data;

	return icmsg_send(conf, dev_data, msg, len);
}

const static struct ipc_service_backend backend_ops = {
	.register_endpoint = register_ept,
	.deregister_endpoint = deregister_ept,
	.send = send,
};

static int backend_init(const struct device *instance)
{
	const struct icmsg_config_t *conf = instance->config;
	struct icmsg_data_t *dev_data = instance->data;

	return icmsg_init(conf, dev_data);
}

#define DEFINE_BACKEND_DEVICE(i)						\
	static const struct icmsg_config_t backend_config_##i = {		\
		.tx_shm_size = DT_REG_SIZE(DT_INST_PHANDLE(i, tx_region)),	\
		.tx_shm_addr = DT_REG_ADDR(DT_INST_PHANDLE(i, tx_region)),	\
		.rx_shm_size = DT_REG_SIZE(DT_INST_PHANDLE(i, rx_region)),	\
		.rx_shm_addr = DT_REG_ADDR(DT_INST_PHANDLE(i, rx_region)),	\
		.mbox_tx = MBOX_DT_CHANNEL_GET(DT_DRV_INST(i), tx),		\
		.mbox_rx = MBOX_DT_CHANNEL_GET(DT_DRV_INST(i), rx),		\
	};									\
										\
	BUILD_ASSERT(DT_REG_SIZE(DT_INST_PHANDLE(i, tx_region)) >		\
			sizeof(struct spsc_pbuf));				\
	static struct icmsg_data_t backend_data_##i;				\
										\
	DEVICE_DT_INST_DEFINE(i,						\
			 &backend_init,						\
			 NULL,							\
			 &backend_data_##i,					\
			 &backend_config_##i,					\
			 POST_KERNEL,						\
			 CONFIG_IPC_SERVICE_REG_BACKEND_PRIORITY,		\
			 &backend_ops);

DT_INST_FOREACH_STATUS_OKAY(DEFINE_BACKEND_DEVICE)
