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

#ifndef _TOPS_TRM_H_
#define _TOPS_TRM_H_

#include <linux/platform_device.h>

extern struct device *trm_dev;

#define TRM_DBG(fmt, ...)		dev_dbg(trm_dev, "[TRM] " fmt, ##__VA_ARGS__)
#define TRM_INFO(fmt, ...)		dev_info(trm_dev, "[TRM] " fmt, ##__VA_ARGS__)
#define TRM_NOTICE(fmt, ...)		dev_notice(trm_dev, "[TRM] " fmt, ##__VA_ARGS__)
#define TRM_WARN(fmt, ...)		dev_warn(trm_dev, "[TRM] " fmt, ##__VA_ARGS__)
#define TRM_ERR(fmt, ...)		dev_err(trm_dev, "[TRM] " fmt, ##__VA_ARGS__)

#define TRM_CONFIG_NAME_MAX_LEN			32

/* TRM Configuration */
#define TRM_CFG(_name, _addr, _len, _ofs, _size, _flag)				\
	.name = _name,								\
	.addr = _addr,								\
	.len = _len,								\
	.offset = _ofs,								\
	.size = _size,								\
	.flag = _flag,

#define TRM_CFG_EN(name, addr, len, ofs, size, flag)				\
	TRM_CFG(name, addr, len, ofs, size, TRM_CONFIG_F_ENABLE | (flag))

#define TRM_CFG_CORE_DUMP_EN(name, addr, len, ofs, size, flag, core_id)		\
	TRM_CFG_EN(name, addr, len, ofs, size, TRM_CONFIG_F_CORE_DUMP | flag)	\
	.core = core_id

/* TRM configuration flags */
#define TRM_CONFIG_F(trm_cfg_bit)		\
	(BIT(TRM_CONFIG_F_ ## trm_cfg_bit ## _BIT))
#define TRM_CONFIG_F_CX_CORE_DUMP_MASK		(GENMASK(CORE_TOPS_NUM, 0))
#define TRM_CONFIG_F_CX_CORE_DUMP_SHIFT		(0)

/* TRM reason flag */
#define TRM_RSN(trm_rsn_bit)			(BIT(TRM_RSN_ ## trm_rsn_bit ## _BIT))

/* TRM Reason */
#define TRM_RSN_NULL				(0x0000)
#define TRM_RSN_WDT_TIMEOUT_CORE0		(TRM_RSN(C0_WDT))
#define TRM_RSN_WDT_TIMEOUT_CORE1		(TRM_RSN(C1_WDT))
#define TRM_RSN_WDT_TIMEOUT_CORE2		(TRM_RSN(C2_WDT))
#define TRM_RSN_WDT_TIMEOUT_CORE3		(TRM_RSN(C3_WDT))
#define TRM_RSN_WDT_TIMEOUT_COREM		(TRM_RSN(CM_WDT))
#define TRM_RSN_FE_RESET			(TRM_RSN(FE_RESET))
#define TRM_RSN_MCU_STATE_ACT_FAIL		(TRM_RSN(MCU_STATE_ACT_FAIL))

enum trm_config_flag {
	TRM_CONFIG_F_ENABLE_BIT,
	TRM_CONFIG_F_CORE_DUMP_BIT,
};

enum trm_rsn {
	TRM_RSN_C0_WDT_BIT,
	TRM_RSN_C1_WDT_BIT,
	TRM_RSN_C2_WDT_BIT,
	TRM_RSN_C3_WDT_BIT,
	TRM_RSN_CM_WDT_BIT,
	TRM_RSN_FE_RESET_BIT,
	TRM_RSN_MCU_STATE_ACT_FAIL_BIT,
};

enum trm_hardware {
	TRM_TOPS,
	TRM_NETSYS,
	TRM_TDMA,

	__TRM_HARDWARE_MAX,
};

struct trm_config {
	char name[TRM_CONFIG_NAME_MAX_LEN];
	enum core_id core;	/* valid if TRM_CONFIG_F_CORE_DUMP is set */
	u32 addr;		/* memory address of the dump info */
	u32 len;		/* total length of the dump info */
	u32 offset;		/* dump offset */
	u32 size;		/* dump size */
	u8 flag;
#define TRM_CONFIG_F_CORE_DUMP			(TRM_CONFIG_F(CORE_DUMP))
#define TRM_CONFIG_F_ENABLE			(TRM_CONFIG_F(ENABLE))
};

struct trm_hw_config {
	struct trm_config *trm_cfgs;
	u32 cfg_len;
	int (*trm_hw_dump)(void *dst, u32 ofs, u32 len);
};

int mtk_trm_dump(u32 dump_rsn);
int mtk_trm_cfg_setup(char *name, u32 offset, u32 size, u8 enable);
int mtk_tops_trm_init(void);
void mtk_tops_trm_exit(void);
int mtk_trm_hw_config_register(enum trm_hardware trm_hw,
			       struct trm_hw_config *trm_hw_cfg);
void mtk_trm_hw_config_unregister(enum trm_hardware trm_hw,
				  struct trm_hw_config *trm_hw_cfg);
#endif /* _TOPS_TRM_H_ */
