unplugged-kernel/drivers/misc/mediatek/emi/mt6768/plat_debug_api.c

133 lines
4.2 KiB
C

/* SPDX-License-Identifier: GPL-2.0 */
/*
* Copyright (c) 2019 MediaTek Inc.
*/
#include <linux/platform_device.h>
#include <linux/of_address.h>
#include <linux/delay.h>
#include <mt-plat/sync_write.h>
#include <mt-plat/mtk_io.h>
#ifdef CONFIG_MTK_AEE_FEATURE
#include <mt-plat/aee.h>
#include <mt-plat/mboot_params.h>
#endif
#include "mt_emi_api.h"
#include <../emi_ctrl_v1.h>
#include "mt_emi.h"
#include "plat_debug_api.h"
static void __iomem *cen_emi_base;
static void __iomem *base0;
static void __iomem *base1;
static void __iomem *base2;
void plat_debug_api_init(void)
{
cen_emi_base = mt_cen_emi_base_get();
base0 = mt_emi_dbg_base_get(0);
base1 = mt_chn_emi_base_get(0);
base2 = mt_chn_emi_base_get(1);
pr_debug("[EMI] >> cen: %p\n", cen_emi_base);
pr_debug("[EMI] >> base0: %p\n", base0);
pr_debug("[EMI] >> base1: %p\n", base1);
pr_debug("[EMI] >> base2: %p\n", base2);
}
static void infra_dbg0(unsigned int v0, unsigned int v1,
unsigned int v2, unsigned int v3,
const char *str)
{
writel(v0, base0+0x100);
writel(v1, base0+0x104);
writel(v2, base0+0x108);
writel(v3, base0+0x10c);
pr_debug("[EMI] %s: 0x%x\n", str, readl(cen_emi_base+0x7fc));
}
static void infra_dbg1(unsigned int v0, unsigned int v1,
const char *str)
{
writel(v0, base1+0xa88);
writel(v1, base1+0xa8c);
pr_debug("[EMI] %s: 0x%x\n", str, readl(base1+0xa84));
}
static void infra_dbg2(unsigned int v0, unsigned int v1,
const char *str)
{
writel(v0, base2+0xa88);
writel(v1, base2+0xa8c);
pr_debug("[EMI] %s: 0x%x\n", str, readl(base2+0xa84));
}
static void one_shot(void)
{
pr_debug("\n----------------\n");
writel(readl(cen_emi_base+0xe8)|(0x1<<8), cen_emi_base+0xe8);
infra_dbg0(0x20, 0x40, 0x60, 0x80, "CEN_EMI_DEBUG_0");
infra_dbg0(0xa0, 0xc0, 0xe0, 0x100, "CEN_EMI_DEBUG_1");
infra_dbg0(0x120, 0x140, 0x160, 0x180, "CEN_EMI_DEBUG_2");
infra_dbg0(0x1a0, 0x1c0, 0x1e0, 0x200, "CEN_EMI_DEBUG_3");
infra_dbg0(0x220, 0x240, 0x260, 0x280, "CEN_EMI_DEBUG_4");
infra_dbg0(0x2a0, 0x2c0, 0x2e0, 0x300, "CEN_EMI_DEBUG_5");
infra_dbg0(0x320, 0x340, 0x360, 0x380, "CEN_EMI_DEBUG_6");
infra_dbg0(0x3a0, 0x3c0, 0x3e0, 0x400, "CEN_EMI_DEBUG_7");
infra_dbg0(0x420, 0x4e0, 0x500, 0x520, "CEN_EMI_DEBUG_8");
infra_dbg0(0x540, 0x560, 0x580, 0x5a0, "CEN_EMI_DEBUG_9");
infra_dbg0(0x6c0, 0x6e0, 0x700, 0x720, "CEN_EMI_DEBUG_A");
infra_dbg0(0x740, 0x7a0, 0x7c0, 0x7e0, "CEN_EMI_DEBUG_B");
pr_debug("[EMI] %s: 0x%x\n", "EMI_IOCL", readl(cen_emi_base+0xd0));
pr_debug("[EMI] %s: 0x%x\n", "EMI_IOCL_2ND", readl(cen_emi_base+0xd4));
pr_debug("[EMI] %s: 0x%x\n", "EMI_IOCM", readl(cen_emi_base+0xd8));
pr_debug("[EMI] %s: 0x%x\n", "EMI_IOCM_2ND", readl(cen_emi_base+0xdc));
writel(readl(base1+0xa80)|0x1, base1+0xa80);
infra_dbg1(0x10000, 0x30002, "CHN0_EMI_DBG_0");
infra_dbg1(0x50004, 0x70006, "CHN0_EMI_DBG_1");
infra_dbg1(0x90008, 0xb000a, "CHN0_EMI_DBG_2");
infra_dbg1(0xd000c, 0xf000e, "CHN0_EMI_DBG_3");
infra_dbg1(0x110010, 0x130012, "CHN0_EMI_DBG_4");
infra_dbg1(0x150014, 0x170016, "CHN0_EMI_DBG_5");
infra_dbg1(0x190018, 0x1b001a, "CHN0_EMI_DBG_6");
infra_dbg1(0x1d001c, 0x1f001e, "CHN0_EMI_DBG_7");
infra_dbg1(0x210020, 0x230022, "CHN0_EMI_DBG_8");
infra_dbg1(0x250024, 0x270026, "CHN0_EMI_DBG_9");
infra_dbg1(0x290028, 0x310030, "CHN0_EMI_DBG_A");
infra_dbg1(0x370036, 0x390038, "CHN0_EMI_DBG_B");
writel(readl(base2+0xa80)|0x1, base2+0xa80);
infra_dbg2(0x10000, 0x30002, "CHN1_EMI_DBG_0");
infra_dbg2(0x50004, 0x70006, "CHN1_EMI_DBG_1");
infra_dbg2(0x90008, 0xb000a, "CHN1_EMI_DBG_2");
infra_dbg2(0xd000c, 0xf000e, "CHN1_EMI_DBG_3");
infra_dbg2(0x110010, 0x130012, "CHN1_EMI_DBG_4");
infra_dbg2(0x150014, 0x170016, "CHN1_EMI_DBG_5");
infra_dbg2(0x190018, 0x1b001a, "CHN1_EMI_DBG_6");
infra_dbg2(0x1d001c, 0x1f001e, "CHN1_EMI_DBG_7");
infra_dbg2(0x210020, 0x230022, "CHN1_EMI_DBG_8");
infra_dbg2(0x250024, 0x270026, "CHN1_EMI_DBG_9");
infra_dbg2(0x290028, 0x310030, "CHN1_EMI_DBG_A");
infra_dbg2(0x370036, 0x390038, "CHN1_EMI_DBG_B");
}
void dump_emi_outstanding(void)
{
if (is_infra_timeout()) {
lastbus_timeout_dump();
one_shot();
mdelay(1);
one_shot();
mdelay(1);
one_shot();
} else {
pr_debug("[BUS] no infra timeout now\n");
pr_debug("[BUS] should check those before bus\n");
}
}