// 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>
 */

#include <linux/delay.h>
#include <linux/device.h>
#include <linux/dma-mapping.h>
#include <linux/io.h>
#include <linux/of.h>

#include "internal.h"
#include "mcu.h"
#include "trm-debugfs.h"
#include "trm-fs.h"
#include "trm-mcu.h"
#include "trm.h"

#define TOPS_OCD_RETRY_TIMES		(3)

#define TOPS_OCD_DCRSET			(0x200C)
#define ENABLE_OCD			(1 << 0)
#define DEBUG_INT			(1 << 1)

#define TOPS_OCD_DSR			(0x2010)
#define EXEC_DONE			(1 << 0)
#define EXEC_EXCE			(1 << 1)
#define EXEC_BUSY			(1 << 2)
#define STOPPED				(1 << 4)
#define DEBUG_PEND_HOST			(1 << 17)

#define TOPS_OCD_DDR			(0x2014)

#define TOPS_OCD_DIR0EXEC		(0x201C)

struct tops_ocd_dev {
	void __iomem *base;
	u32 base_offset;
	struct clk *debugsys_clk;
};

static struct tops_ocd_dev ocd;

struct core_dump_fram cd_frams[CORE_TOPS_NUM];

static inline void ocd_write(struct tops_ocd_dev *ocd, u32 reg, u32 val)
{
	writel(val, ocd->base + ocd->base_offset + reg);
}

static inline u32 ocd_read(struct tops_ocd_dev *ocd, u32 reg)
{
	return readl(ocd->base + ocd->base_offset + reg);
}

static inline void ocd_set(struct tops_ocd_dev *ocd, u32 reg, u32 mask)
{
	setbits(ocd->base + ocd->base_offset + reg, mask);
}

static inline void ocd_clr(struct tops_ocd_dev *ocd, u32 reg, u32 mask)
{
	clrbits(ocd->base + ocd->base_offset + reg, mask);
}

static int core_exec_instr(u32 instr)
{
	u32 rty = 0;
	int ret;

	ocd_set(&ocd, TOPS_OCD_DSR, EXEC_DONE);
	ocd_set(&ocd, TOPS_OCD_DSR, EXEC_EXCE);

	ocd_write(&ocd, TOPS_OCD_DIR0EXEC, instr);

	while ((ocd_read(&ocd, TOPS_OCD_DSR) & EXEC_BUSY)) {
		if (rty++ < TOPS_OCD_RETRY_TIMES) {
			usleep_range(1000, 1500);
		} else {
			TRM_ERR("run instruction(0x%x) timeout\n", instr);
			ret = -1;
			goto out;
		}
	}

	ret = ocd_read(&ocd, TOPS_OCD_DSR) & EXEC_EXCE ? -1 : 0;
	if (ret)
		TRM_ERR("run instruction(0x%x) fail\n", instr);

out:
	return ret;
}

static int core_dump(struct core_dump_fram *cd_fram)
{
	cd_fram->magic = CORE_DUMP_FRAM_MAGIC;
	cd_fram->num_areg = XCHAL_NUM_AREG;

	/*
	 * save
	 * PC, PS, WINDOWSTART, WINDOWBASE,
	 * EPC1, EXCCAUSE, EXCVADDR, EXCSAVE1
	 */
	core_exec_instr(0x13f500);

	core_exec_instr(0x03b500);
	core_exec_instr(0x136800);
	cd_fram->pc = ocd_read(&ocd, TOPS_OCD_DDR);

	core_exec_instr(0x03e600);
	core_exec_instr(0x136800);
	cd_fram->ps = ocd_read(&ocd, TOPS_OCD_DDR);

	core_exec_instr(0x034900);
	core_exec_instr(0x136800);
	cd_fram->windowstart = ocd_read(&ocd, TOPS_OCD_DDR);

	core_exec_instr(0x034800);
	core_exec_instr(0x136800);
	cd_fram->windowbase = ocd_read(&ocd, TOPS_OCD_DDR);

	core_exec_instr(0x03b100);
	core_exec_instr(0x136800);
	cd_fram->epc1 = ocd_read(&ocd, TOPS_OCD_DDR);

	core_exec_instr(0x03e800);
	core_exec_instr(0x136800);
	cd_fram->exccause = ocd_read(&ocd, TOPS_OCD_DDR);

	core_exec_instr(0x03ee00);
	core_exec_instr(0x136800);
	cd_fram->excvaddr = ocd_read(&ocd, TOPS_OCD_DDR);

	core_exec_instr(0x03d100);
	core_exec_instr(0x136800);
	cd_fram->excsave1 = ocd_read(&ocd, TOPS_OCD_DDR);

	core_exec_instr(0x03f500);

	/*
	 * save
	 * a0, a1, a2, a3, a4, a5, a6, a7
	 */
	core_exec_instr(0x136800);
	cd_fram->areg[0] = ocd_read(&ocd, TOPS_OCD_DDR);

	core_exec_instr(0x136810);
	cd_fram->areg[1] = ocd_read(&ocd, TOPS_OCD_DDR);

	core_exec_instr(0x136820);
	cd_fram->areg[2] = ocd_read(&ocd, TOPS_OCD_DDR);

	core_exec_instr(0x136830);
	cd_fram->areg[3] = ocd_read(&ocd, TOPS_OCD_DDR);

	core_exec_instr(0x136840);
	cd_fram->areg[4] = ocd_read(&ocd, TOPS_OCD_DDR);

	core_exec_instr(0x136850);
	cd_fram->areg[5] = ocd_read(&ocd, TOPS_OCD_DDR);

	core_exec_instr(0x136860);
	cd_fram->areg[6] = ocd_read(&ocd, TOPS_OCD_DDR);

	core_exec_instr(0x136870);
	cd_fram->areg[7] = ocd_read(&ocd, TOPS_OCD_DDR);

	/*
	 * save
	 * a8, a9, a10, a11, a12, a13, a14, a15
	 */
	core_exec_instr(0x136880);
	cd_fram->areg[8] = ocd_read(&ocd, TOPS_OCD_DDR);

	core_exec_instr(0x136890);
	cd_fram->areg[9] = ocd_read(&ocd, TOPS_OCD_DDR);

	core_exec_instr(0x1368a0);
	cd_fram->areg[10] = ocd_read(&ocd, TOPS_OCD_DDR);

	core_exec_instr(0x1368b0);
	cd_fram->areg[11] = ocd_read(&ocd, TOPS_OCD_DDR);

	core_exec_instr(0x1368c0);
	cd_fram->areg[12] = ocd_read(&ocd, TOPS_OCD_DDR);

	core_exec_instr(0x1368d0);
	cd_fram->areg[13] = ocd_read(&ocd, TOPS_OCD_DDR);

	core_exec_instr(0x1368e0);
	cd_fram->areg[14] = ocd_read(&ocd, TOPS_OCD_DDR);

	core_exec_instr(0x1368f0);
	cd_fram->areg[15] = ocd_read(&ocd, TOPS_OCD_DDR);

	core_exec_instr(0x408020);

	/*
	 * save
	 * a16, a17, a18, a19, a20, a21, a22, a23
	 */
	core_exec_instr(0x136880);
	cd_fram->areg[16] = ocd_read(&ocd, TOPS_OCD_DDR);

	core_exec_instr(0x136890);
	cd_fram->areg[17] = ocd_read(&ocd, TOPS_OCD_DDR);

	core_exec_instr(0x1368a0);
	cd_fram->areg[18] = ocd_read(&ocd, TOPS_OCD_DDR);

	core_exec_instr(0x1368b0);
	cd_fram->areg[19] = ocd_read(&ocd, TOPS_OCD_DDR);

	core_exec_instr(0x1368c0);
	cd_fram->areg[20] = ocd_read(&ocd, TOPS_OCD_DDR);

	core_exec_instr(0x1368d0);
	cd_fram->areg[21] = ocd_read(&ocd, TOPS_OCD_DDR);

	core_exec_instr(0x1368e0);
	cd_fram->areg[22] = ocd_read(&ocd, TOPS_OCD_DDR);

	core_exec_instr(0x1368f0);
	cd_fram->areg[23] = ocd_read(&ocd, TOPS_OCD_DDR);

	core_exec_instr(0x408020);

	/*
	 * save
	 * a24, a25, a26, a27, a28, a29, a30, a31
	 */
	core_exec_instr(0x136880);
	cd_fram->areg[24] = ocd_read(&ocd, TOPS_OCD_DDR);

	core_exec_instr(0x136890);
	cd_fram->areg[25] = ocd_read(&ocd, TOPS_OCD_DDR);

	core_exec_instr(0x1368a0);
	cd_fram->areg[26] = ocd_read(&ocd, TOPS_OCD_DDR);

	core_exec_instr(0x1368b0);
	cd_fram->areg[27] = ocd_read(&ocd, TOPS_OCD_DDR);

	core_exec_instr(0x1368c0);
	cd_fram->areg[28] = ocd_read(&ocd, TOPS_OCD_DDR);

	core_exec_instr(0x1368d0);
	cd_fram->areg[29] = ocd_read(&ocd, TOPS_OCD_DDR);

	core_exec_instr(0x1368e0);
	cd_fram->areg[30] = ocd_read(&ocd, TOPS_OCD_DDR);

	core_exec_instr(0x1368f0);
	cd_fram->areg[31] = ocd_read(&ocd, TOPS_OCD_DDR);

	core_exec_instr(0x408040);

	core_exec_instr(0xf1e000);

	return 0;
}

static int __mtk_trm_mcu_core_dump(enum core_id core)
{
	u32 rty = 0;
	int ret;

	ocd.base_offset = (core == CORE_MGMT) ? (0x0) : (0x5000 + (core * 0x4000));

	/* enable OCD */
	ocd_set(&ocd, TOPS_OCD_DCRSET, ENABLE_OCD);

	/* assert debug interrupt to core */
	ocd_set(&ocd, TOPS_OCD_DCRSET, DEBUG_INT);

	/* wait core into stopped state */
	while (!(ocd_read(&ocd, TOPS_OCD_DSR) & STOPPED)) {
		if (rty++ < TOPS_OCD_RETRY_TIMES) {
			usleep_range(10000, 15000);
		} else {
			TRM_ERR("wait core(%d) into stopped state timeout\n", core);
			ret = -1;
			goto out;
		}
	}

	/* deassert debug interrupt to core */
	ocd_set(&ocd, TOPS_OCD_DSR, DEBUG_PEND_HOST);

	/* dump core's registers and let core into running state */
	ret = core_dump(&cd_frams[core]);

out:
	return ret;
}

int mtk_trm_mcu_core_dump(void)
{
	enum core_id core;
	int ret;

	ret = clk_prepare_enable(ocd.debugsys_clk);
	if (ret) {
		TRM_ERR("debugsys clk enable failed: %d\n", ret);
		goto out;
	}

	memset(cd_frams, 0, sizeof(cd_frams));

	for (core = CORE_OFFLOAD_0; core <= CORE_MGMT; core++) {
		ret = __mtk_trm_mcu_core_dump(core);
		if (ret)
			break;
	}

	clk_disable_unprepare(ocd.debugsys_clk);

out:
	return ret;
}

static int mtk_tops_ocd_probe(struct platform_device *pdev)
{
	struct resource *res = NULL;
	int ret;

	trm_dev = &pdev->dev;

	ocd.debugsys_clk = devm_clk_get(trm_dev, "debugsys");
	if (IS_ERR(ocd.debugsys_clk)) {
		TRM_ERR("get debugsys clk failed: %ld\n", PTR_ERR(ocd.debugsys_clk));
		return PTR_ERR(ocd.debugsys_clk);
	}

	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "tops-ocd-base");
	if (!res)
		return -ENXIO;

	ocd.base = devm_ioremap(trm_dev, res->start, resource_size(res));
	if (!ocd.base)
		return -ENOMEM;

	ret = mtk_trm_debugfs_init();
	if (ret)
		return ret;

	ret = mtk_trm_fs_init();
	if (ret)
		return ret;

	TRM_INFO("tops-ocd init done\n");

	return 0;
}

static int mtk_tops_ocd_remove(struct platform_device *pdev)
{
	mtk_trm_fs_deinit();

	mtk_trm_debugfs_deinit();

	return 0;
}

static struct of_device_id mtk_tops_ocd_match[] = {
	{ .compatible = "mediatek,tops-ocd", },
	{ },
};

static struct platform_driver mtk_tops_ocd_driver = {
	.probe = mtk_tops_ocd_probe,
	.remove = mtk_tops_ocd_remove,
	.driver = {
		.name = "mediatek,tops-ocd",
		.owner = THIS_MODULE,
		.of_match_table = mtk_tops_ocd_match,
	},
};

int __init mtk_tops_trm_mcu_init(void)
{
	return platform_driver_register(&mtk_tops_ocd_driver);
}

void __exit mtk_tops_trm_mcu_exit(void)
{
	platform_driver_unregister(&mtk_tops_ocd_driver);
}
