blob: 4b5118f10e2ebab90fa4d19821fbe7dc8612232d [file] [log] [blame]
/* 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_ */