/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
 * Copyright (c) 2023 MediaTek Inc. All Rights Reserved.
 *
 * Author: Ren-Ting Wang <ren-ting.wang@mediatek.com>
 */

#ifndef _TOPS_MBOX_H_
#define _TOPS_MBOX_H_

#include <linux/list.h>

#include "mbox_id.h"
#include "tops.h"

/* mbox device macros */
#define MBOX_DEV(core_id, cmd)				\
	.core = core_id,					\
	.cmd_id = cmd,

#define MBOX_SEND_DEV(core_id, cmd)			\
	{						\
		MBOX_DEV(core_id, cmd)			\
	}

#define MBOX_SEND_MGMT_DEV(cmd)				\
	MBOX_SEND_DEV(CORE_MGMT, MBOX_AP2CM_CMD_ ## cmd)

#define MBOX_SEND_OFFLOAD_DEV(core_id, cmd)		\
	MBOX_SEND_DEV(CORE_OFFLOAD_ ## core_id, MBOX_AP2CX_CMD_ ## cmd)

#define MBOX_RECV_DEV(core_id, cmd, handler)		\
	{						\
		MBOX_DEV(core_id, cmd)			\
		.mbox_handler = handler,		\
	}

#define MBOX_RECV_MGMT_DEV(cmd, handler)		\
	MBOX_RECV_DEV(CORE_MGMT, MBOX_CM2AP_CMD_ ## cmd, handler)

#define MBOX_RECV_OFFLOAD_DEV(core_id, cmd, handler)	\
	MBOX_RECV_DEV(CORE_OFFLOAD_ ## core_id, MBOX_CX2AP_CMD_ ## cmd, handler)

/* Base Address */
#define MBOX_TOP_BASE				(0x010000)
#define MBOX_CLUST0_BASE			(0x510000)

/* TOP Mailbox */
#define TOPS_TOP_CM_SLOT			(MBOX_TOP_BASE + 0x000)
#define TOPS_TOP_AP_SLOT			(MBOX_TOP_BASE + 0x004)

#define TOPS_TOP_AP_TO_CM_CMD_SET		(MBOX_TOP_BASE + 0x200)
#define TOPS_TOP_AP_TO_CM_CMD_CLR		(MBOX_TOP_BASE + 0x204)
#define TOPS_TOP_CM_TO_AP_CMD_SET		(MBOX_TOP_BASE + 0x21C)
#define TOPS_TOP_CM_TO_AP_CMD_CLR		(MBOX_TOP_BASE + 0x220)

#define TOPS_TOP_AP_TO_CM_MSG_N(n)		(MBOX_TOP_BASE + 0x208 + 0x4 * (n))
#define TOPS_TOP_CM_TO_AP_MSG_N(n)		(MBOX_TOP_BASE + 0x224 + 0x4 * (n))

/* CLUST Mailbox */
#define TOPS_CLUST0_CX_SLOT(x)			(MBOX_CLUST0_BASE + (0x4 * (x)))
#define TOPS_CLUST0_CM_SLOT			(MBOX_CLUST0_BASE + 0x10)
#define TOPS_CLUST0_AP_SLOT			(MBOX_CLUST0_BASE + 0x14)

#define TOPS_CLUST0_CX_TO_CY_CMD_SET(x, y)	\
		(MBOX_CLUST0_BASE + 0x100 + ((x) * 0x200) + ((y) * 0x40))
#define TOPS_CLUST0_CX_TO_CY_CMD_CLR(x, y)	\
		(MBOX_CLUST0_BASE + 0x104 + ((x) * 0x200) + ((y) * 0x40))
#define TOPS_CLUST0_CX_TO_CM_CMD_SET(x)		\
		(MBOX_CLUST0_BASE + 0x200 + ((x) * 0x200))
#define TOPS_CLUST0_CX_TO_CM_CMD_CLR(x)		\
		(MBOX_CLUST0_BASE + 0x204 + ((x) * 0x200))
#define TOPS_CLUST0_CX_TO_AP_CMD_SET(x)		\
		(MBOX_CLUST0_BASE + 0x240 + ((x) * 0x200))
#define TOPS_CLUST0_CX_TO_AP_CMD_CLR(x)		\
		(MBOX_CLUST0_BASE + 0x244 + ((x) * 0x200))
#define TOPS_CLUST0_CM_TO_CX_CMD_SET(x)		\
		(MBOX_CLUST0_BASE + 0x900 + ((x) * 0x40))
#define TOPS_CLUST0_CM_TO_CX_CMD_CLR(x)		\
		(MBOX_CLUST0_BASE + 0x904 + ((x) * 0x40))
#define TOPS_CLUST0_AP_TO_CX_CMD_SET(x)		\
		(MBOX_CLUST0_BASE + 0xB00 + ((x) * 0x40))
#define TOPS_CLUST0_AP_TO_CX_CMD_CLR(x)		\
		(MBOX_CLUST0_BASE + 0xB04 + ((x) * 0x40))

#define TOPS_CLUST0_CX_TO_CY_MSG_N(x, y, n)	\
		(MBOX_CLUST0_BASE + 0x108 + ((n) * 0x4) + ((x) * 0x200) + ((y) * 0x40))
#define TOPS_CLUST0_CX_TO_CM_MSG_N(x, n)	\
		(MBOX_CLUST0_BASE + 0x208 + ((n) * 0x4) + ((x) * 0x200))
#define TOPS_CLUST0_CX_TO_AP_MSG_N(x, n)	\
		(MBOX_CLUST0_BASE + 0x248 + ((n) * 0x4) + ((x) * 0x200))
#define TOPS_CLUST0_CM_TO_CX_MSG_N(x, n)	\
		(MBOX_CLUST0_BASE + 0x908 + ((n) * 0x4) + ((x) * 0x40))
#define TOPS_CLUST0_AP_TO_CX_MSG_N(x, n)	\
		(MBOX_CLUST0_BASE + 0xB08 + ((n) * 0x4) + ((x) * 0x40))

#define MBOX_TOP_MBOX_FROM_C0			(0x1)
#define MBOX_TOP_MBOX_FROM_C1			(0x2)
#define MBOX_TOP_MBOX_FROM_C2			(0x4)
#define MBOX_TOP_MBOX_FROM_C3			(0x8)
#define MBOX_TOP_MBOX_FROM_AP			(0x10)
#define MBOX_TOP_MBOX_FROM_CM			(0x20) /* TODO: need DE update */

#define MBOX_CLUST0_MBOX_FROM_C0		(0x1)
#define MBOX_CLUST0_MBOX_FROM_C1		(0x2)
#define MBOX_CLUST0_MBOX_FROM_C2		(0x4)
#define MBOX_CLUST0_MBOX_FROM_C3		(0x8)
#define MBOX_CLUST0_MBOX_FROM_CM		(0x10)
#define MBOX_CLUST0_MBOX_FROM_AP		(0x20)

struct mailbox_msg;
struct mailbox_dev;
enum mbox_msg_cnt;

typedef void (*mbox_ret_func_t)(void *priv, struct mailbox_msg *msg);
typedef enum mbox_msg_cnt (*mbox_handler_func_t)(struct mailbox_dev *mdev,
						 struct mailbox_msg *msg);

enum mbox_act {
	MBOX_SEND,
	MBOX_RECV,
	MBOX_ACT_MAX,
};

enum mbox_msg_cnt {
	MBOX_NO_RET_MSG,
	MBOX_RET_MSG1,
	MBOX_RET_MSG2,
	MBOX_RET_MSG3,
	MBOX_RET_MSG4,
};

struct mailbox_msg {
	u32 msg1;
	u32 msg2;
	u32 msg3;
	u32 msg4;
};

struct mailbox_dev {
	struct list_head list;
	enum core_id core;
	mbox_handler_func_t mbox_handler;
	void *priv;
	u8 cmd_id;
};

int mbox_send_msg_no_wait_irq(struct mailbox_dev *mdev, struct mailbox_msg *msg);
int mbox_send_msg_no_wait(struct mailbox_dev *mdev, struct mailbox_msg *msg);
int mbox_send_msg(struct mailbox_dev *mdev, struct mailbox_msg *msg, void *priv,
		  mbox_ret_func_t ret_handler);
int register_mbox_dev(enum mbox_act act, struct mailbox_dev *mdev);
int unregister_mbox_dev(enum mbox_act act, struct mailbox_dev *mdev);
void mtk_tops_mbox_clear_all_cmd(void);
int mtk_tops_mbox_init(void);
void mtk_tops_mbox_exit(void);
#endif /* _TOPS_MBOX_H_ */
