Commit 3919d905 authored by Arnd Bergmann's avatar Arnd Bergmann

Merge tag 'tegra-for-6.1-cbb' of...

Merge tag 'tegra-for-6.1-cbb' of git://git.kernel.org/pub/scm/linux/kernel/git/tegra/linux into arm/drivers

soc/tegra: cbb: Changes for v6.1-rc1

This introduces the CBB driver that is used to provide (a lot of)
information about SErrors when things go wrong, instead of the kernel
just crashing or hanging.

* tag 'tegra-for-6.1-cbb' of git://git.kernel.org/pub/scm/linux/kernel/git/tegra/linux:
  soc/tegra: cbb: Add support for Tegra241 (Grace)
  soc/tegra: cbb: Add driver for Tegra234 CBB 2.0
  soc/tegra: cbb: Add CBB 1.0 driver for Tegra194
  soc/tegra: Set ERD bit to mask inband errors

Link: https://lore.kernel.org/r/20220916101957.1635854-2-thierry.reding@gmail.comSigned-off-by: default avatarArnd Bergmann <arnd@arndb.de>
parents 4cb59d50 53283105
......@@ -161,3 +161,12 @@ config SOC_TEGRA30_VOLTAGE_COUPLER
bool "Voltage scaling support for Tegra30 SoCs"
depends on ARCH_TEGRA_3x_SOC || COMPILE_TEST
depends on REGULATOR
config SOC_TEGRA_CBB
tristate "Tegra driver to handle error from CBB"
depends on ARCH_TEGRA_194_SOC || ARCH_TEGRA_234_SOC
default y
help
Support for handling error from Tegra Control Backbone(CBB).
This driver handles the errors from CBB and prints debug
information about the failed transactions.
# SPDX-License-Identifier: GPL-2.0
obj-y += fuse/
obj-y += cbb/
obj-y += common.o
obj-$(CONFIG_SOC_TEGRA_FLOWCTRL) += flowctrl.o
......
# SPDX-License-Identifier: GPL-2.0
#
# Control Backbone Driver code.
#
ifdef CONFIG_SOC_TEGRA_CBB
obj-y += tegra-cbb.o
obj-$(CONFIG_ARCH_TEGRA_194_SOC) += tegra194-cbb.o
obj-$(CONFIG_ARCH_TEGRA_234_SOC) += tegra234-cbb.o
endif
// SPDX-License-Identifier: GPL-2.0
/*
* Copyright (c) 2021-2022, NVIDIA CORPORATION. All rights reserved
*/
#include <linux/clk.h>
#include <linux/cpufeature.h>
#include <linux/debugfs.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/of_device.h>
#include <linux/platform_device.h>
#include <linux/device.h>
#include <linux/io.h>
#include <linux/of_irq.h>
#include <linux/of_address.h>
#include <linux/interrupt.h>
#include <linux/ioport.h>
#include <linux/version.h>
#include <soc/tegra/fuse.h>
#include <soc/tegra/tegra-cbb.h>
void tegra_cbb_print_err(struct seq_file *file, const char *fmt, ...)
{
struct va_format vaf;
va_list args;
va_start(args, fmt);
if (file) {
seq_vprintf(file, fmt, args);
} else {
vaf.fmt = fmt;
vaf.va = &args;
pr_crit("%pV", &vaf);
}
va_end(args);
}
void tegra_cbb_print_cache(struct seq_file *file, u32 cache)
{
const char *buff_str, *mod_str, *rd_str, *wr_str;
buff_str = (cache & BIT(0)) ? "Bufferable " : "";
mod_str = (cache & BIT(1)) ? "Modifiable " : "";
rd_str = (cache & BIT(2)) ? "Read-Allocate " : "";
wr_str = (cache & BIT(3)) ? "Write-Allocate" : "";
if (cache == 0x0)
buff_str = "Device Non-Bufferable";
tegra_cbb_print_err(file, "\t Cache\t\t\t: 0x%x -- %s%s%s%s\n",
cache, buff_str, mod_str, rd_str, wr_str);
}
void tegra_cbb_print_prot(struct seq_file *file, u32 prot)
{
const char *data_str, *secure_str, *priv_str;
data_str = (prot & 0x4) ? "Instruction" : "Data";
secure_str = (prot & 0x2) ? "Non-Secure" : "Secure";
priv_str = (prot & 0x1) ? "Privileged" : "Unprivileged";
tegra_cbb_print_err(file, "\t Protection\t\t: 0x%x -- %s, %s, %s Access\n",
prot, priv_str, secure_str, data_str);
}
static int tegra_cbb_err_show(struct seq_file *file, void *data)
{
struct tegra_cbb *cbb = file->private;
return cbb->ops->debugfs_show(cbb, file, data);
}
static int tegra_cbb_err_open(struct inode *inode, struct file *file)
{
return single_open(file, tegra_cbb_err_show, inode->i_private);
}
static const struct file_operations tegra_cbb_err_fops = {
.open = tegra_cbb_err_open,
.read = seq_read,
.llseek = seq_lseek,
.release = single_release
};
static int tegra_cbb_err_debugfs_init(struct tegra_cbb *cbb)
{
static struct dentry *root;
if (!root) {
root = debugfs_create_file("tegra_cbb_err", 0444, NULL, cbb, &tegra_cbb_err_fops);
if (IS_ERR_OR_NULL(root)) {
pr_err("%s(): could not create debugfs node\n", __func__);
return PTR_ERR(root);
}
}
return 0;
}
void tegra_cbb_stall_enable(struct tegra_cbb *cbb)
{
if (cbb->ops->stall_enable)
cbb->ops->stall_enable(cbb);
}
void tegra_cbb_fault_enable(struct tegra_cbb *cbb)
{
if (cbb->ops->fault_enable)
cbb->ops->fault_enable(cbb);
}
void tegra_cbb_error_clear(struct tegra_cbb *cbb)
{
if (cbb->ops->error_clear)
cbb->ops->error_clear(cbb);
}
u32 tegra_cbb_get_status(struct tegra_cbb *cbb)
{
if (cbb->ops->get_status)
return cbb->ops->get_status(cbb);
return 0;
}
int tegra_cbb_get_irq(struct platform_device *pdev, unsigned int *nonsec_irq,
unsigned int *sec_irq)
{
unsigned int index = 0;
int num_intr = 0, irq;
num_intr = platform_irq_count(pdev);
if (!num_intr)
return -EINVAL;
if (num_intr == 2) {
irq = platform_get_irq(pdev, index);
if (irq <= 0) {
dev_err(&pdev->dev, "failed to get non-secure IRQ: %d\n", irq);
return -ENOENT;
}
*nonsec_irq = irq;
index++;
}
irq = platform_get_irq(pdev, index);
if (irq <= 0) {
dev_err(&pdev->dev, "failed to get secure IRQ: %d\n", irq);
return -ENOENT;
}
*sec_irq = irq;
if (num_intr == 1)
dev_dbg(&pdev->dev, "secure IRQ: %u\n", *sec_irq);
if (num_intr == 2)
dev_dbg(&pdev->dev, "secure IRQ: %u, non-secure IRQ: %u\n", *sec_irq, *nonsec_irq);
return 0;
}
int tegra_cbb_register(struct tegra_cbb *cbb)
{
int ret;
if (IS_ENABLED(CONFIG_DEBUG_FS)) {
ret = tegra_cbb_err_debugfs_init(cbb);
if (ret) {
dev_err(cbb->dev, "failed to create debugfs\n");
return ret;
}
}
/* register interrupt handler for errors due to different initiators */
ret = cbb->ops->interrupt_enable(cbb);
if (ret < 0) {
dev_err(cbb->dev, "Failed to register CBB Interrupt ISR");
return ret;
}
cbb->ops->error_enable(cbb);
dsb(sy);
return 0;
}
// SPDX-License-Identifier: GPL-2.0
/*
* Copyright (c) 2021-2022, NVIDIA CORPORATION. All rights reserved
*
* The driver handles Error's from Control Backbone(CBB) generated due to
* illegal accesses. When an error is reported from a NOC within CBB,
* the driver checks ErrVld status of all three Error Logger's of that NOC.
* It then prints debug information about failed transaction using ErrLog
* registers of error logger which has ErrVld set. Currently, SLV, DEC,
* TMO, SEC, UNS are the codes which are supported by CBB.
*/
#include <linux/clk.h>
#include <linux/cpufeature.h>
#include <linux/debugfs.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/of_device.h>
#include <linux/platform_device.h>
#include <linux/device.h>
#include <linux/io.h>
#include <linux/of_irq.h>
#include <linux/of_address.h>
#include <linux/interrupt.h>
#include <linux/ioport.h>
#include <linux/version.h>
#include <soc/tegra/fuse.h>
#include <soc/tegra/tegra-cbb.h>
#define ERRLOGGER_0_ID_COREID_0 0x00000000
#define ERRLOGGER_0_ID_REVISIONID_0 0x00000004
#define ERRLOGGER_0_FAULTEN_0 0x00000008
#define ERRLOGGER_0_ERRVLD_0 0x0000000c
#define ERRLOGGER_0_ERRCLR_0 0x00000010
#define ERRLOGGER_0_ERRLOG0_0 0x00000014
#define ERRLOGGER_0_ERRLOG1_0 0x00000018
#define ERRLOGGER_0_RSVD_00_0 0x0000001c
#define ERRLOGGER_0_ERRLOG3_0 0x00000020
#define ERRLOGGER_0_ERRLOG4_0 0x00000024
#define ERRLOGGER_0_ERRLOG5_0 0x00000028
#define ERRLOGGER_0_STALLEN_0 0x00000038
#define ERRLOGGER_1_ID_COREID_0 0x00000080
#define ERRLOGGER_1_ID_REVISIONID_0 0x00000084
#define ERRLOGGER_1_FAULTEN_0 0x00000088
#define ERRLOGGER_1_ERRVLD_0 0x0000008c
#define ERRLOGGER_1_ERRCLR_0 0x00000090
#define ERRLOGGER_1_ERRLOG0_0 0x00000094
#define ERRLOGGER_1_ERRLOG1_0 0x00000098
#define ERRLOGGER_1_RSVD_00_0 0x0000009c
#define ERRLOGGER_1_ERRLOG3_0 0x000000a0
#define ERRLOGGER_1_ERRLOG4_0 0x000000a4
#define ERRLOGGER_1_ERRLOG5_0 0x000000a8
#define ERRLOGGER_1_STALLEN_0 0x000000b8
#define ERRLOGGER_2_ID_COREID_0 0x00000100
#define ERRLOGGER_2_ID_REVISIONID_0 0x00000104
#define ERRLOGGER_2_FAULTEN_0 0x00000108
#define ERRLOGGER_2_ERRVLD_0 0x0000010c
#define ERRLOGGER_2_ERRCLR_0 0x00000110
#define ERRLOGGER_2_ERRLOG0_0 0x00000114
#define ERRLOGGER_2_ERRLOG1_0 0x00000118
#define ERRLOGGER_2_RSVD_00_0 0x0000011c
#define ERRLOGGER_2_ERRLOG3_0 0x00000120
#define ERRLOGGER_2_ERRLOG4_0 0x00000124
#define ERRLOGGER_2_ERRLOG5_0 0x00000128
#define ERRLOGGER_2_STALLEN_0 0x00000138
#define CBB_NOC_INITFLOW GENMASK(23, 20)
#define CBB_NOC_TARGFLOW GENMASK(19, 16)
#define CBB_NOC_TARG_SUBRANGE GENMASK(15, 9)
#define CBB_NOC_SEQID GENMASK(8, 0)
#define BPMP_NOC_INITFLOW GENMASK(20, 18)
#define BPMP_NOC_TARGFLOW GENMASK(17, 13)
#define BPMP_NOC_TARG_SUBRANGE GENMASK(12, 9)
#define BPMP_NOC_SEQID GENMASK(8, 0)
#define AON_NOC_INITFLOW GENMASK(22, 21)
#define AON_NOC_TARGFLOW GENMASK(20, 15)
#define AON_NOC_TARG_SUBRANGE GENMASK(14, 9)
#define AON_NOC_SEQID GENMASK(8, 0)
#define SCE_NOC_INITFLOW GENMASK(21, 19)
#define SCE_NOC_TARGFLOW GENMASK(18, 14)
#define SCE_NOC_TARG_SUBRANGE GENMASK(13, 9)
#define SCE_NOC_SEQID GENMASK(8, 0)
#define CBB_NOC_AXCACHE GENMASK(3, 0)
#define CBB_NOC_NON_MOD GENMASK(4, 4)
#define CBB_NOC_AXPROT GENMASK(7, 5)
#define CBB_NOC_FALCONSEC GENMASK(9, 8)
#define CBB_NOC_GRPSEC GENMASK(16, 10)
#define CBB_NOC_VQC GENMASK(18, 17)
#define CBB_NOC_MSTR_ID GENMASK(22, 19)
#define CBB_NOC_AXI_ID GENMASK(30, 23)
#define CLUSTER_NOC_AXCACHE GENMASK(3, 0)
#define CLUSTER_NOC_AXPROT GENMASK(6, 4)
#define CLUSTER_NOC_FALCONSEC GENMASK(8, 7)
#define CLUSTER_NOC_GRPSEC GENMASK(15, 9)
#define CLUSTER_NOC_VQC GENMASK(17, 16)
#define CLUSTER_NOC_MSTR_ID GENMASK(21, 18)
#define USRBITS_MSTR_ID GENMASK(21, 18)
#define CBB_ERR_OPC GENMASK(4, 1)
#define CBB_ERR_ERRCODE GENMASK(10, 8)
#define CBB_ERR_LEN1 GENMASK(27, 16)
#define DMAAPB_X_RAW_INTERRUPT_STATUS 0x2ec
struct tegra194_cbb_packet_header {
bool lock; // [0]
u8 opc; // [4:1]
u8 errcode; // [10:8]= RD, RDW, RDL, RDX, WR, WRW, WRC, PRE, URG
u16 len1; // [27:16]
bool format; // [31] = 1 -> FlexNoC versions 2.7 & above
};
struct tegra194_cbb_aperture {
u8 initflow;
u8 targflow;
u8 targ_subrange;
u8 init_mapping;
u32 init_localaddress;
u8 targ_mapping;
u32 targ_localaddress;
u16 seqid;
};
struct tegra194_cbb_userbits {
u8 axcache;
u8 non_mod;
u8 axprot;
u8 falconsec;
u8 grpsec;
u8 vqc;
u8 mstr_id;
u8 axi_id;
};
struct tegra194_cbb_noc_data {
const char *name;
bool erd_mask_inband_err;
const char * const *master_id;
unsigned int max_aperture;
const struct tegra194_cbb_aperture *noc_aperture;
const char * const *routeid_initflow;
const char * const *routeid_targflow;
void (*parse_routeid)(struct tegra194_cbb_aperture *info, u64 routeid);
void (*parse_userbits)(struct tegra194_cbb_userbits *usrbits, u32 elog_5);
};
struct tegra194_axi2apb_bridge {
struct resource res;
void __iomem *base;
};
struct tegra194_cbb {
struct tegra_cbb base;
const struct tegra194_cbb_noc_data *noc;
struct resource *res;
void __iomem *regs;
unsigned int num_intr;
unsigned int sec_irq;
unsigned int nonsec_irq;
u32 errlog0;
u32 errlog1;
u32 errlog2;
u32 errlog3;
u32 errlog4;
u32 errlog5;
struct tegra194_axi2apb_bridge *bridges;
unsigned int num_bridges;
};
static inline struct tegra194_cbb *to_tegra194_cbb(struct tegra_cbb *cbb)
{
return container_of(cbb, struct tegra194_cbb, base);
}
static LIST_HEAD(cbb_list);
static DEFINE_SPINLOCK(cbb_lock);
static const char * const tegra194_cbb_trantype[] = {
"RD - Read, Incrementing",
"RDW - Read, Wrap", /* Not Supported */
"RDX - Exclusive Read", /* Not Supported */
"RDL - Linked Read", /* Not Supported */
"WR - Write, Incrementing",
"WRW - Write, Wrap", /* Not Supported */
"WRC - Exclusive Write", /* Not Supported */
"PRE - Preamble Sequence for Fixed Accesses"
};
static const char * const tegra194_axi2apb_error[] = {
"SFIFONE - Status FIFO Not Empty interrupt",
"SFIFOF - Status FIFO Full interrupt",
"TIM - Timer(Timeout) interrupt",
"SLV - SLVERR interrupt",
"NULL",
"ERBF - Early response buffer Full interrupt",
"NULL",
"RDFIFOF - Read Response FIFO Full interrupt",
"WRFIFOF - Write Response FIFO Full interrupt",
"CH0DFIFOF - Ch0 Data FIFO Full interrupt",
"CH1DFIFOF - Ch1 Data FIFO Full interrupt",
"CH2DFIFOF - Ch2 Data FIFO Full interrupt",
"UAT - Unsupported alignment type error",
"UBS - Unsupported burst size error",
"UBE - Unsupported Byte Enable error",
"UBT - Unsupported burst type error",
"BFS - Block Firewall security error",
"ARFS - Address Range Firewall security error",
"CH0RFIFOF - Ch0 Request FIFO Full interrupt",
"CH1RFIFOF - Ch1 Request FIFO Full interrupt",
"CH2RFIFOF - Ch2 Request FIFO Full interrupt"
};
static const char * const tegra194_master_id[] = {
[0x0] = "CCPLEX",
[0x1] = "CCPLEX_DPMU",
[0x2] = "BPMP",
[0x3] = "AON",
[0x4] = "SCE",
[0x5] = "GPCDMA_PERIPHERAL",
[0x6] = "TSECA",
[0x7] = "TSECB",
[0x8] = "JTAGM_DFT",
[0x9] = "CORESIGHT_AXIAP",
[0xa] = "APE",
[0xb] = "PEATR",
[0xc] = "NVDEC",
[0xd] = "RCE",
[0xe] = "NVDEC1"
};
static const struct tegra_cbb_error tegra194_cbb_errors[] = {
{
.code = "SLV",
.source = "Target",
.desc = "Target error detected by CBB slave"
}, {
.code = "DEC",
.source = "Initiator NIU",
.desc = "Address decode error"
}, {
.code = "UNS",
.source = "Target NIU",
.desc = "Unsupported request. Not a valid transaction"
}, {
.code = "DISC", /* Not Supported by CBB */
.source = "Power Disconnect",
.desc = "Disconnected target or domain"
}, {
.code = "SEC",
.source = "Initiator NIU or Firewall",
.desc = "Security violation. Firewall error"
}, {
.code = "HIDE", /* Not Supported by CBB */
.source = "Firewall",
.desc = "Hidden security violation, reported as OK to initiator"
}, {
.code = "TMO",
.source = "Target NIU",
.desc = "Target time-out error"
}, {
.code = "RSV",
.source = "None",
.desc = "Reserved"
}
};
/*
* CBB NOC aperture lookup table as per file "cbb_central_noc_Structure.info".
*/
static const char * const tegra194_cbbcentralnoc_routeid_initflow[] = {
[0x0] = "aon_p2ps/I/aon",
[0x1] = "ape_p2ps/I/ape_p2ps",
[0x2] = "bpmp_p2ps/I/bpmp_p2ps",
[0x3] = "ccroc_p2ps/I/ccroc_p2ps",
[0x4] = "csite_p2ps/I/0",
[0x5] = "gpcdma_mmio_p2ps/I/0",
[0x6] = "jtag_p2ps/I/0",
[0x7] = "nvdec1_p2ps/I/0",
[0x8] = "nvdec_p2ps/I/0",
[0x9] = "rce_p2ps/I/rce_p2ps",
[0xa] = "sce_p2ps/I/sce_p2ps",
[0xb] = "tseca_p2ps/I/0",
[0xc] = "tsecb_p2ps/I/0",
[0xd] = "RESERVED",
[0xe] = "RESERVED",
[0xf] = "RESERVED"
};
static const char * const tegra194_cbbcentralnoc_routeid_targflow[] = {
[0x0] = "SVC/T/intreg",
[0x1] = "axis_satellite_axi2apb_p2pm/T/axis_satellite_axi2apb_p2pm",
[0x2] = "axis_satellite_grout/T/axis_satellite_grout",
[0x3] = "cbb_firewall/T/cbb_firewall",
[0x4] = "gpu_p2pm/T/gpu_p2pm",
[0x5] = "host1x_p2pm/T/host1x_p2pm",
[0x6] = "sapb_3_p2pm/T/sapb_3_p2pm",
[0x7] = "smmu0_p2pm/T/smmu0_p2pm",
[0x8] = "smmu1_p2pm/T/smmu1_p2pm",
[0x9] = "smmu2_p2pm/T/smmu2_p2pm",
[0xa] = "stm_p2pm/T/stm_p2pm",
[0xb] = "RESERVED",
[0xc] = "RESERVED",
[0xd] = "RESERVED",
[0xe] = "RESERVED",
[0xf] = "RESERVED"
};
/*
* Fields of CBB NOC lookup table:
* Init flow, Targ flow, Targ subrange, Init mapping, Init localAddress,
* Targ mapping, Targ localAddress
* ----------------------------------------------------------------------------
*/
static const struct tegra194_cbb_aperture tegra194_cbbcentralnoc_apert_lookup[] = {
{ 0x0, 0x0, 0x00, 0x0, 0x02300000, 0, 0x00000000 },
{ 0x0, 0x1, 0x00, 0x0, 0x02003000, 0, 0x02003000 },
{ 0x0, 0x1, 0x01, 0x0, 0x02006000, 2, 0x02006000 },
{ 0x0, 0x1, 0x02, 0x0, 0x02016000, 3, 0x02016000 },
{ 0x0, 0x1, 0x03, 0x0, 0x0201d000, 4, 0x0201d000 },
{ 0x0, 0x1, 0x04, 0x0, 0x0202b000, 6, 0x0202b000 },
{ 0x0, 0x1, 0x05, 0x0, 0x02434000, 20, 0x02434000 },
{ 0x0, 0x1, 0x06, 0x0, 0x02436000, 21, 0x02436000 },
{ 0x0, 0x1, 0x07, 0x0, 0x02438000, 22, 0x02438000 },
{ 0x0, 0x1, 0x08, 0x0, 0x02445000, 24, 0x02445000 },
{ 0x0, 0x1, 0x09, 0x0, 0x02446000, 25, 0x02446000 },
{ 0x0, 0x1, 0x0a, 0x0, 0x02004000, 1, 0x02004000 },
{ 0x0, 0x1, 0x0b, 0x0, 0x0201e000, 5, 0x0201e000 },
{ 0x0, 0x1, 0x0c, 0x0, 0x0202c000, 7, 0x0202c000 },
{ 0x0, 0x1, 0x0d, 0x0, 0x02204000, 8, 0x02204000 },
{ 0x0, 0x1, 0x0e, 0x0, 0x02214000, 9, 0x02214000 },
{ 0x0, 0x1, 0x0f, 0x0, 0x02224000, 10, 0x02224000 },
{ 0x0, 0x1, 0x10, 0x0, 0x02234000, 11, 0x02234000 },
{ 0x0, 0x1, 0x11, 0x0, 0x02244000, 12, 0x02244000 },
{ 0x0, 0x1, 0x12, 0x0, 0x02254000, 13, 0x02254000 },
{ 0x0, 0x1, 0x13, 0x0, 0x02264000, 14, 0x02264000 },
{ 0x0, 0x1, 0x14, 0x0, 0x02274000, 15, 0x02274000 },
{ 0x0, 0x1, 0x15, 0x0, 0x02284000, 16, 0x02284000 },
{ 0x0, 0x1, 0x16, 0x0, 0x0243a000, 23, 0x0243a000 },
{ 0x0, 0x1, 0x17, 0x0, 0x02370000, 17, 0x02370000 },
{ 0x0, 0x1, 0x18, 0x0, 0x023d0000, 18, 0x023d0000 },
{ 0x0, 0x1, 0x19, 0x0, 0x023e0000, 19, 0x023e0000 },
{ 0x0, 0x1, 0x1a, 0x0, 0x02450000, 26, 0x02450000 },
{ 0x0, 0x1, 0x1b, 0x0, 0x02460000, 27, 0x02460000 },
{ 0x0, 0x1, 0x1c, 0x0, 0x02490000, 28, 0x02490000 },
{ 0x0, 0x1, 0x1d, 0x0, 0x03130000, 31, 0x03130000 },
{ 0x0, 0x1, 0x1e, 0x0, 0x03160000, 32, 0x03160000 },
{ 0x0, 0x1, 0x1f, 0x0, 0x03270000, 33, 0x03270000 },
{ 0x0, 0x1, 0x20, 0x0, 0x032e0000, 35, 0x032e0000 },
{ 0x0, 0x1, 0x21, 0x0, 0x03300000, 36, 0x03300000 },
{ 0x0, 0x1, 0x22, 0x0, 0x13090000, 40, 0x13090000 },
{ 0x0, 0x1, 0x23, 0x0, 0x20120000, 43, 0x20120000 },
{ 0x0, 0x1, 0x24, 0x0, 0x20170000, 44, 0x20170000 },
{ 0x0, 0x1, 0x25, 0x0, 0x20190000, 45, 0x20190000 },
{ 0x0, 0x1, 0x26, 0x0, 0x201b0000, 46, 0x201b0000 },
{ 0x0, 0x1, 0x27, 0x0, 0x20250000, 47, 0x20250000 },
{ 0x0, 0x1, 0x28, 0x0, 0x20260000, 48, 0x20260000 },
{ 0x0, 0x1, 0x29, 0x0, 0x20420000, 49, 0x20420000 },
{ 0x0, 0x1, 0x2a, 0x0, 0x20460000, 50, 0x20460000 },
{ 0x0, 0x1, 0x2b, 0x0, 0x204f0000, 51, 0x204f0000 },
{ 0x0, 0x1, 0x2c, 0x0, 0x20520000, 52, 0x20520000 },
{ 0x0, 0x1, 0x2d, 0x0, 0x20580000, 53, 0x20580000 },
{ 0x0, 0x1, 0x2e, 0x0, 0x205a0000, 54, 0x205a0000 },
{ 0x0, 0x1, 0x2f, 0x0, 0x205c0000, 55, 0x205c0000 },
{ 0x0, 0x1, 0x30, 0x0, 0x20690000, 56, 0x20690000 },
{ 0x0, 0x1, 0x31, 0x0, 0x20770000, 57, 0x20770000 },
{ 0x0, 0x1, 0x32, 0x0, 0x20790000, 58, 0x20790000 },
{ 0x0, 0x1, 0x33, 0x0, 0x20880000, 59, 0x20880000 },
{ 0x0, 0x1, 0x34, 0x0, 0x20990000, 62, 0x20990000 },
{ 0x0, 0x1, 0x35, 0x0, 0x20e10000, 65, 0x20e10000 },
{ 0x0, 0x1, 0x36, 0x0, 0x20e70000, 66, 0x20e70000 },
{ 0x0, 0x1, 0x37, 0x0, 0x20e80000, 67, 0x20e80000 },
{ 0x0, 0x1, 0x38, 0x0, 0x20f30000, 68, 0x20f30000 },
{ 0x0, 0x1, 0x39, 0x0, 0x20f50000, 69, 0x20f50000 },
{ 0x0, 0x1, 0x3a, 0x0, 0x20fc0000, 70, 0x20fc0000 },
{ 0x0, 0x1, 0x3b, 0x0, 0x21110000, 72, 0x21110000 },
{ 0x0, 0x1, 0x3c, 0x0, 0x21270000, 73, 0x21270000 },
{ 0x0, 0x1, 0x3d, 0x0, 0x21290000, 74, 0x21290000 },
{ 0x0, 0x1, 0x3e, 0x0, 0x21840000, 75, 0x21840000 },
{ 0x0, 0x1, 0x3f, 0x0, 0x21880000, 76, 0x21880000 },
{ 0x0, 0x1, 0x40, 0x0, 0x218d0000, 77, 0x218d0000 },
{ 0x0, 0x1, 0x41, 0x0, 0x21950000, 78, 0x21950000 },
{ 0x0, 0x1, 0x42, 0x0, 0x21960000, 79, 0x21960000 },
{ 0x0, 0x1, 0x43, 0x0, 0x21a10000, 80, 0x21a10000 },
{ 0x0, 0x1, 0x44, 0x0, 0x024a0000, 29, 0x024a0000 },
{ 0x0, 0x1, 0x45, 0x0, 0x024c0000, 30, 0x024c0000 },
{ 0x0, 0x1, 0x46, 0x0, 0x032c0000, 34, 0x032c0000 },
{ 0x0, 0x1, 0x47, 0x0, 0x03400000, 37, 0x03400000 },
{ 0x0, 0x1, 0x48, 0x0, 0x130a0000, 41, 0x130a0000 },
{ 0x0, 0x1, 0x49, 0x0, 0x130c0000, 42, 0x130c0000 },
{ 0x0, 0x1, 0x4a, 0x0, 0x208a0000, 60, 0x208a0000 },
{ 0x0, 0x1, 0x4b, 0x0, 0x208c0000, 61, 0x208c0000 },
{ 0x0, 0x1, 0x4c, 0x0, 0x209a0000, 63, 0x209a0000 },
{ 0x0, 0x1, 0x4d, 0x0, 0x21a40000, 81, 0x21a40000 },
{ 0x0, 0x1, 0x4e, 0x0, 0x03440000, 38, 0x03440000 },
{ 0x0, 0x1, 0x4f, 0x0, 0x20d00000, 64, 0x20d00000 },
{ 0x0, 0x1, 0x50, 0x0, 0x21000000, 71, 0x21000000 },
{ 0x0, 0x1, 0x51, 0x0, 0x0b000000, 39, 0x0b000000 },
{ 0x0, 0x2, 0x00, 0x0, 0x00000000, 0, 0x00000000 },
{ 0x0, 0x3, 0x00, 0x0, 0x02340000, 0, 0x00000000 },
{ 0x0, 0x4, 0x00, 0x0, 0x17000000, 0, 0x17000000 },
{ 0x0, 0x4, 0x01, 0x0, 0x18000000, 1, 0x18000000 },
{ 0x0, 0x5, 0x00, 0x0, 0x13e80000, 1, 0x13e80000 },
{ 0x0, 0x5, 0x01, 0x0, 0x15810000, 12, 0x15810000 },
{ 0x0, 0x5, 0x02, 0x0, 0x15840000, 14, 0x15840000 },
{ 0x0, 0x5, 0x03, 0x0, 0x15a40000, 17, 0x15a40000 },
{ 0x0, 0x5, 0x04, 0x0, 0x13f00000, 3, 0x13f00000 },
{ 0x0, 0x5, 0x05, 0x0, 0x15820000, 13, 0x15820000 },
{ 0x0, 0x5, 0x06, 0x0, 0x13ec0000, 2, 0x13ec0000 },
{ 0x0, 0x5, 0x07, 0x0, 0x15200000, 6, 0x15200000 },
{ 0x0, 0x5, 0x08, 0x0, 0x15340000, 7, 0x15340000 },
{ 0x0, 0x5, 0x09, 0x0, 0x15380000, 8, 0x15380000 },
{ 0x0, 0x5, 0x0a, 0x0, 0x15500000, 10, 0x15500000 },
{ 0x0, 0x5, 0x0b, 0x0, 0x155c0000, 11, 0x155c0000 },
{ 0x0, 0x5, 0x0c, 0x0, 0x15a00000, 16, 0x15a00000 },
{ 0x0, 0x5, 0x0d, 0x0, 0x13e00000, 0, 0x13e00000 },
{ 0x0, 0x5, 0x0e, 0x0, 0x15100000, 5, 0x15100000 },
{ 0x0, 0x5, 0x0f, 0x0, 0x15480000, 9, 0x15480000 },
{ 0x0, 0x5, 0x10, 0x0, 0x15880000, 15, 0x15880000 },
{ 0x0, 0x5, 0x11, 0x0, 0x15a80000, 18, 0x15a80000 },
{ 0x0, 0x5, 0x12, 0x0, 0x15b00000, 19, 0x15b00000 },
{ 0x0, 0x5, 0x13, 0x0, 0x14800000, 4, 0x14800000 },
{ 0x0, 0x5, 0x14, 0x0, 0x15c00000, 20, 0x15c00000 },
{ 0x0, 0x5, 0x15, 0x0, 0x16000000, 21, 0x16000000 },
{ 0x0, 0x6, 0x00, 0x0, 0x02000000, 4, 0x02000000 },
{ 0x0, 0x6, 0x01, 0x0, 0x02007000, 5, 0x02007000 },
{ 0x0, 0x6, 0x02, 0x0, 0x02008000, 6, 0x02008000 },
{ 0x0, 0x6, 0x03, 0x0, 0x02013000, 7, 0x02013000 },
{ 0x0, 0x6, 0x04, 0x0, 0x0201c000, 8, 0x0201c000 },
{ 0x0, 0x6, 0x05, 0x0, 0x02020000, 9, 0x02020000 },
{ 0x0, 0x6, 0x06, 0x0, 0x0202a000, 10, 0x0202a000 },
{ 0x0, 0x6, 0x07, 0x0, 0x0202e000, 11, 0x0202e000 },
{ 0x0, 0x6, 0x08, 0x0, 0x06400000, 33, 0x06400000 },
{ 0x0, 0x6, 0x09, 0x0, 0x02038000, 12, 0x02038000 },
{ 0x0, 0x6, 0x0a, 0x0, 0x00100000, 0, 0x00100000 },
{ 0x0, 0x6, 0x0b, 0x0, 0x023b0000, 13, 0x023b0000 },
{ 0x0, 0x6, 0x0c, 0x0, 0x02800000, 16, 0x02800000 },
{ 0x0, 0x6, 0x0d, 0x0, 0x030e0000, 22, 0x030e0000 },
{ 0x0, 0x6, 0x0e, 0x0, 0x03800000, 23, 0x03800000 },
{ 0x0, 0x6, 0x0f, 0x0, 0x03980000, 25, 0x03980000 },
{ 0x0, 0x6, 0x10, 0x0, 0x03a60000, 26, 0x03a60000 },
{ 0x0, 0x6, 0x11, 0x0, 0x03d80000, 31, 0x03d80000 },
{ 0x0, 0x6, 0x12, 0x0, 0x20000000, 36, 0x20000000 },
{ 0x0, 0x6, 0x13, 0x0, 0x20050000, 38, 0x20050000 },
{ 0x0, 0x6, 0x14, 0x0, 0x201e0000, 40, 0x201e0000 },
{ 0x0, 0x6, 0x15, 0x0, 0x20280000, 42, 0x20280000 },
{ 0x0, 0x6, 0x16, 0x0, 0x202c0000, 43, 0x202c0000 },
{ 0x0, 0x6, 0x17, 0x0, 0x20390000, 44, 0x20390000 },
{ 0x0, 0x6, 0x18, 0x0, 0x20430000, 45, 0x20430000 },
{ 0x0, 0x6, 0x19, 0x0, 0x20440000, 46, 0x20440000 },
{ 0x0, 0x6, 0x1a, 0x0, 0x204e0000, 47, 0x204e0000 },
{ 0x0, 0x6, 0x1b, 0x0, 0x20550000, 48, 0x20550000 },
{ 0x0, 0x6, 0x1c, 0x0, 0x20570000, 49, 0x20570000 },
{ 0x0, 0x6, 0x1d, 0x0, 0x20590000, 50, 0x20590000 },
{ 0x0, 0x6, 0x1e, 0x0, 0x20730000, 52, 0x20730000 },
{ 0x0, 0x6, 0x1f, 0x0, 0x209f0000, 54, 0x209f0000 },
{ 0x0, 0x6, 0x20, 0x0, 0x20e20000, 55, 0x20e20000 },
{ 0x0, 0x6, 0x21, 0x0, 0x20ed0000, 56, 0x20ed0000 },
{ 0x0, 0x6, 0x22, 0x0, 0x20fd0000, 57, 0x20fd0000 },
{ 0x0, 0x6, 0x23, 0x0, 0x21120000, 59, 0x21120000 },
{ 0x0, 0x6, 0x24, 0x0, 0x211a0000, 60, 0x211a0000 },
{ 0x0, 0x6, 0x25, 0x0, 0x21850000, 61, 0x21850000 },
{ 0x0, 0x6, 0x26, 0x0, 0x21860000, 62, 0x21860000 },
{ 0x0, 0x6, 0x27, 0x0, 0x21890000, 63, 0x21890000 },
{ 0x0, 0x6, 0x28, 0x0, 0x21970000, 64, 0x21970000 },
{ 0x0, 0x6, 0x29, 0x0, 0x21990000, 65, 0x21990000 },
{ 0x0, 0x6, 0x2a, 0x0, 0x21a00000, 66, 0x21a00000 },
{ 0x0, 0x6, 0x2b, 0x0, 0x21a90000, 68, 0x21a90000 },
{ 0x0, 0x6, 0x2c, 0x0, 0x21ac0000, 70, 0x21ac0000 },
{ 0x0, 0x6, 0x2d, 0x0, 0x01f80000, 3, 0x01f80000 },
{ 0x0, 0x6, 0x2e, 0x0, 0x024e0000, 14, 0x024e0000 },
{ 0x0, 0x6, 0x2f, 0x0, 0x030c0000, 21, 0x030c0000 },
{ 0x0, 0x6, 0x30, 0x0, 0x03820000, 24, 0x03820000 },
{ 0x0, 0x6, 0x31, 0x0, 0x03aa0000, 27, 0x03aa0000 },
{ 0x0, 0x6, 0x32, 0x0, 0x03c80000, 29, 0x03c80000 },
{ 0x0, 0x6, 0x33, 0x0, 0x130e0000, 34, 0x130e0000 },
{ 0x0, 0x6, 0x34, 0x0, 0x20020000, 37, 0x20020000 },
{ 0x0, 0x6, 0x35, 0x0, 0x20060000, 39, 0x20060000 },
{ 0x0, 0x6, 0x36, 0x0, 0x20200000, 41, 0x20200000 },
{ 0x0, 0x6, 0x37, 0x0, 0x206a0000, 51, 0x206a0000 },
{ 0x0, 0x6, 0x38, 0x0, 0x20740000, 53, 0x20740000 },
{ 0x0, 0x6, 0x39, 0x0, 0x20fe0000, 58, 0x20fe0000 },
{ 0x0, 0x6, 0x3a, 0x0, 0x21a20000, 67, 0x21a20000 },
{ 0x0, 0x6, 0x3b, 0x0, 0x21aa0000, 69, 0x21aa0000 },
{ 0x0, 0x6, 0x3c, 0x0, 0x02b80000, 17, 0x02b80000 },
{ 0x0, 0x6, 0x3d, 0x0, 0x03080000, 20, 0x03080000 },
{ 0x0, 0x6, 0x3e, 0x0, 0x13100000, 35, 0x13100000 },
{ 0x0, 0x6, 0x3f, 0x0, 0x01f00000, 2, 0x01f00000 },
{ 0x0, 0x6, 0x40, 0x0, 0x03000000, 19, 0x03000000 },
{ 0x0, 0x6, 0x41, 0x0, 0x03c00000, 28, 0x03c00000 },
{ 0x0, 0x6, 0x42, 0x0, 0x03d00000, 30, 0x03d00000 },
{ 0x0, 0x6, 0x43, 0x0, 0x01700000, 1, 0x01700000 },
{ 0x0, 0x6, 0x44, 0x0, 0x02c00000, 18, 0x02c00000 },
{ 0x0, 0x6, 0x45, 0x0, 0x02600000, 15, 0x02600000 },
{ 0x0, 0x6, 0x46, 0x0, 0x06000000, 32, 0x06000000 },
{ 0x0, 0x6, 0x47, 0x0, 0x24000000, 71, 0x24000000 },
{ 0x0, 0x7, 0x00, 0x0, 0x12000000, 0, 0x12000000 },
{ 0x0, 0x8, 0x00, 0x0, 0x11000000, 0, 0x11000000 },
{ 0x0, 0x9, 0x00, 0x0, 0x10000000, 0, 0x10000000 },
{ 0x0, 0xa, 0x00, 0x0, 0x22000000, 0, 0x22000000 }
};
/*
* BPMP NOC aperture lookup table as per file "BPMP_NOC_Structure.info".
*/
static const char * const tegra194_bpmpnoc_routeid_initflow[] = {
[0x0] = "cbb_i/I/0",
[0x1] = "cpu_m_i/I/0",
[0x2] = "cpu_p_i/I/0",
[0x3] = "cvc_i/I/0",
[0x4] = "dma_m_i/I/0",
[0x5] = "dma_p_i/I/0",
[0x6] = "RESERVED",
[0x7] = "RESERVED"
};
static const char * const tegra194_bpmpnoc_routeid_targflow[] = {
[0x00] = "multiport0_t/T/actmon",
[0x01] = "multiport0_t/T/ast_0",
[0x02] = "multiport0_t/T/ast_1",
[0x03] = "multiport0_t/T/atcm_cfg",
[0x04] = "multiport0_t/T/car",
[0x05] = "multiport0_t/T/central_pwr_mgr",
[0x06] = "multiport0_t/T/central_vtg_ctlr",
[0x07] = "multiport0_t/T/cfg",
[0x08] = "multiport0_t/T/dma",
[0x09] = "multiport0_t/T/err_collator",
[0x0a] = "multiport0_t/T/err_collator_car",
[0x0b] = "multiport0_t/T/fpga_misc",
[0x0c] = "multiport0_t/T/fpga_uart",
[0x0d] = "multiport0_t/T/gte",
[0x0e] = "multiport0_t/T/hsp",
[0x0f] = "multiport0_t/T/misc",
[0x10] = "multiport0_t/T/pm",
[0x11] = "multiport0_t/T/simon0",
[0x12] = "multiport0_t/T/simon1",
[0x13] = "multiport0_t/T/simon2",
[0x14] = "multiport0_t/T/simon3",
[0x15] = "multiport0_t/T/simon4",
[0x16] = "multiport0_t/T/soc_therm",
[0x17] = "multiport0_t/T/tke",
[0x18] = "multiport0_t/T/vic_0",
[0x19] = "multiport0_t/T/vic_1",
[0x1a] = "ast0_t/T/0",
[0x1b] = "ast1_t/T/0",
[0x1c] = "bpmp_noc_firewall/T/0",
[0x1d] = "cbb_t/T/0",
[0x1e] = "cpu_t/T/0",
[0x1f] = "svc_t/T/0"
};
/*
* Fields of BPMP NOC lookup table:
* Init flow, Targ flow, Targ subrange, Init mapping, Init localAddress,
* Targ mapping, Targ localAddress
* ----------------------------------------------------------------------------
*/
static const struct tegra194_cbb_aperture tegra194_bpmpnoc_apert_lookup[] = {
{ 0x0, 0x1c, 0x0, 0x0, 0x0d640000, 0, 0x00000000 },
{ 0x0, 0x1e, 0x0, 0x0, 0x0d400000, 0, 0x0d400000 },
{ 0x0, 0x00, 0x0, 0x0, 0x0d230000, 0, 0x00000000 },
{ 0x0, 0x01, 0x0, 0x0, 0x0d040000, 0, 0x00000000 },
{ 0x0, 0x02, 0x0, 0x0, 0x0d050000, 0, 0x00000000 },
{ 0x0, 0x03, 0x0, 0x0, 0x0d000000, 0, 0x00000000 },
{ 0x0, 0x04, 0x0, 0x0, 0x20ae0000, 3, 0x000e0000 },
{ 0x0, 0x04, 0x1, 0x0, 0x20ac0000, 2, 0x000c0000 },
{ 0x0, 0x04, 0x2, 0x0, 0x20a80000, 1, 0x00080000 },
{ 0x0, 0x04, 0x3, 0x0, 0x20a00000, 0, 0x00000000 },
{ 0x0, 0x05, 0x0, 0x0, 0x0d2a0000, 0, 0x00000000 },
{ 0x0, 0x06, 0x0, 0x0, 0x0d290000, 0, 0x00000000 },
{ 0x0, 0x07, 0x0, 0x0, 0x0d2c0000, 0, 0x00000000 },
{ 0x0, 0x08, 0x0, 0x0, 0x0d0e0000, 4, 0x00080000 },
{ 0x0, 0x08, 0x1, 0x0, 0x0d060000, 0, 0x00000000 },
{ 0x0, 0x08, 0x2, 0x0, 0x0d080000, 1, 0x00020000 },
{ 0x0, 0x08, 0x3, 0x0, 0x0d0a0000, 2, 0x00040000 },
{ 0x0, 0x08, 0x4, 0x0, 0x0d0c0000, 3, 0x00060000 },
{ 0x0, 0x09, 0x0, 0x0, 0x0d650000, 0, 0x00000000 },
{ 0x0, 0x0a, 0x0, 0x0, 0x20af0000, 0, 0x00000000 },
{ 0x0, 0x0b, 0x0, 0x0, 0x0d3e0000, 0, 0x00000000 },
{ 0x0, 0x0c, 0x0, 0x0, 0x0d3d0000, 0, 0x00000000 },
{ 0x0, 0x0d, 0x0, 0x0, 0x0d1e0000, 0, 0x00000000 },
{ 0x0, 0x0e, 0x0, 0x0, 0x0d150000, 0, 0x00000000 },
{ 0x0, 0x0e, 0x1, 0x0, 0x0d160000, 1, 0x00010000 },
{ 0x0, 0x0e, 0x2, 0x0, 0x0d170000, 2, 0x00020000 },
{ 0x0, 0x0e, 0x3, 0x0, 0x0d180000, 3, 0x00030000 },
{ 0x0, 0x0e, 0x4, 0x0, 0x0d190000, 4, 0x00040000 },
{ 0x0, 0x0e, 0x5, 0x0, 0x0d1a0000, 5, 0x00050000 },
{ 0x0, 0x0e, 0x6, 0x0, 0x0d1b0000, 6, 0x00060000 },
{ 0x0, 0x0e, 0x7, 0x0, 0x0d1c0000, 7, 0x00070000 },
{ 0x0, 0x0e, 0x8, 0x0, 0x0d1d0000, 8, 0x00080000 },
{ 0x0, 0x0f, 0x0, 0x0, 0x0d660000, 0, 0x00000000 },
{ 0x0, 0x10, 0x0, 0x0, 0x0d1f0000, 0, 0x00000000 },
{ 0x0, 0x10, 0x1, 0x0, 0x0d200000, 1, 0x00010000 },
{ 0x0, 0x10, 0x2, 0x0, 0x0d210000, 2, 0x00020000 },
{ 0x0, 0x10, 0x3, 0x0, 0x0d220000, 3, 0x00030000 },
{ 0x0, 0x11, 0x0, 0x0, 0x0d240000, 0, 0x00000000 },
{ 0x0, 0x12, 0x0, 0x0, 0x0d250000, 0, 0x00000000 },
{ 0x0, 0x13, 0x0, 0x0, 0x0d260000, 0, 0x00000000 },
{ 0x0, 0x14, 0x0, 0x0, 0x0d270000, 0, 0x00000000 },
{ 0x0, 0x15, 0x0, 0x0, 0x0d2b0000, 0, 0x00000000 },
{ 0x0, 0x16, 0x0, 0x0, 0x0d280000, 0, 0x00000000 },
{ 0x0, 0x17, 0x0, 0x0, 0x0d0f0000, 0, 0x00000000 },
{ 0x0, 0x17, 0x1, 0x0, 0x0d100000, 1, 0x00010000 },
{ 0x0, 0x17, 0x2, 0x0, 0x0d110000, 2, 0x00020000 },
{ 0x0, 0x17, 0x3, 0x0, 0x0d120000, 3, 0x00030000 },
{ 0x0, 0x17, 0x4, 0x0, 0x0d130000, 4, 0x00040000 },
{ 0x0, 0x17, 0x5, 0x0, 0x0d140000, 5, 0x00050000 },
{ 0x0, 0x18, 0x0, 0x0, 0x0d020000, 0, 0x00000000 },
{ 0x0, 0x19, 0x0, 0x0, 0x0d030000, 0, 0x00000000 },
{ 0x0, 0x1f, 0x0, 0x0, 0x0d600000, 0, 0x00000000 },
{ 0x0, 0x1f, 0x1, 0x0, 0x00000000, 0, 0x00000000 },
{ 0x1, 0x1a, 0x0, 0x0, 0x40000000, 0, 0x40000000 },
{ 0x1, 0x1a, 0x1, 0x1, 0x80000000, 1, 0x80000000 },
{ 0x1, 0x1a, 0x2, 0x0, 0x00000000, 0, 0x00000000 },
{ 0x2, 0x1c, 0x0, 0x0, 0x0d640000, 0, 0x00000000 },
{ 0x2, 0x1d, 0x0, 0x0, 0x20b00000, 8, 0x20b00000 },
{ 0x2, 0x1d, 0x1, 0x0, 0x20800000, 7, 0x20800000 },
{ 0x2, 0x1d, 0x2, 0x0, 0x20c00000, 9, 0x20c00000 },
{ 0x2, 0x1d, 0x3, 0x0, 0x0d800000, 3, 0x0d800000 },
{ 0x2, 0x1d, 0x4, 0x0, 0x20000000, 6, 0x20000000 },
{ 0x2, 0x1d, 0x5, 0x0, 0x0c000000, 2, 0x0c000000 },
{ 0x2, 0x1d, 0x6, 0x0, 0x21000000, 10, 0x21000000 },
{ 0x2, 0x1d, 0x7, 0x0, 0x0e000000, 4, 0x0e000000 },
{ 0x2, 0x1d, 0x8, 0x0, 0x22000000, 11, 0x22000000 },
{ 0x2, 0x1d, 0x9, 0x0, 0x08000000, 1, 0x08000000 },
{ 0x2, 0x1d, 0xa, 0x0, 0x24000000, 12, 0x24000000 },
{ 0x2, 0x1d, 0xb, 0x0, 0x00000000, 0, 0x00000000 },
{ 0x2, 0x1d, 0xc, 0x0, 0x28000000, 13, 0x28000000 },
{ 0x2, 0x1d, 0xd, 0x0, 0x10000000, 5, 0x10000000 },
{ 0x2, 0x1d, 0xe, 0x0, 0x30000000, 14, 0x30000000 },
{ 0x2, 0x00, 0x0, 0x0, 0x0d230000, 0, 0x00000000 },
{ 0x2, 0x01, 0x0, 0x0, 0x0d040000, 0, 0x00000000 },
{ 0x2, 0x02, 0x0, 0x0, 0x0d050000, 0, 0x00000000 },
{ 0x2, 0x03, 0x0, 0x0, 0x0d000000, 0, 0x00000000 },
{ 0x2, 0x04, 0x0, 0x0, 0x20ae0000, 3, 0x000e0000 },
{ 0x2, 0x04, 0x1, 0x0, 0x20ac0000, 2, 0x000c0000 },
{ 0x2, 0x04, 0x2, 0x0, 0x20a80000, 1, 0x00080000 },
{ 0x2, 0x04, 0x3, 0x0, 0x20a00000, 0, 0x00000000 },
{ 0x2, 0x05, 0x0, 0x0, 0x0d2a0000, 0, 0x00000000 },
{ 0x2, 0x06, 0x0, 0x0, 0x0d290000, 0, 0x00000000 },
{ 0x2, 0x07, 0x0, 0x0, 0x0d2c0000, 0, 0x00000000 },
{ 0x2, 0x08, 0x0, 0x0, 0x0d0e0000, 4, 0x00080000 },
{ 0x2, 0x08, 0x1, 0x0, 0x0d060000, 0, 0x00000000 },
{ 0x2, 0x08, 0x2, 0x0, 0x0d080000, 1, 0x00020000 },
{ 0x2, 0x08, 0x3, 0x0, 0x0d0a0000, 2, 0x00040000 },
{ 0x2, 0x08, 0x4, 0x0, 0x0d0c0000, 3, 0x00060000 },
{ 0x2, 0x09, 0x0, 0x0, 0x0d650000, 0, 0x00000000 },
{ 0x2, 0x0a, 0x0, 0x0, 0x20af0000, 0, 0x00000000 },
{ 0x2, 0x0b, 0x0, 0x0, 0x0d3e0000, 0, 0x00000000 },
{ 0x2, 0x0c, 0x0, 0x0, 0x0d3d0000, 0, 0x00000000 },
{ 0x2, 0x0d, 0x0, 0x0, 0x0d1e0000, 0, 0x00000000 },
{ 0x2, 0x0e, 0x0, 0x0, 0x0d150000, 0, 0x00000000 },
{ 0x2, 0x0e, 0x1, 0x0, 0x0d160000, 1, 0x00010000 },
{ 0x2, 0x0e, 0x2, 0x0, 0x0d170000, 2, 0x00020000 },
{ 0x2, 0x0e, 0x3, 0x0, 0x0d180000, 3, 0x00030000 },
{ 0x2, 0x0e, 0x4, 0x0, 0x0d190000, 4, 0x00040000 },
{ 0x2, 0x0e, 0x5, 0x0, 0x0d1a0000, 5, 0x00050000 },
{ 0x2, 0x0e, 0x6, 0x0, 0x0d1b0000, 6, 0x00060000 },
{ 0x2, 0x0e, 0x7, 0x0, 0x0d1c0000, 7, 0x00070000 },
{ 0x2, 0x0e, 0x8, 0x0, 0x0d1d0000, 8, 0x00080000 },
{ 0x2, 0x0f, 0x0, 0x0, 0x0d660000, 0, 0x00000000 },
{ 0x2, 0x10, 0x0, 0x0, 0x0d1f0000, 0, 0x00000000 },
{ 0x2, 0x10, 0x1, 0x0, 0x0d200000, 1, 0x00010000 },
{ 0x2, 0x10, 0x2, 0x0, 0x0d210000, 2, 0x00020000 },
{ 0x2, 0x10, 0x3, 0x0, 0x0d220000, 3, 0x00030000 },
{ 0x2, 0x11, 0x0, 0x0, 0x0d240000, 0, 0x00000000 },
{ 0x2, 0x12, 0x0, 0x0, 0x0d250000, 0, 0x00000000 },
{ 0x2, 0x13, 0x0, 0x0, 0x0d260000, 0, 0x00000000 },
{ 0x2, 0x14, 0x0, 0x0, 0x0d270000, 0, 0x00000000 },
{ 0x2, 0x15, 0x0, 0x0, 0x0d2b0000, 0, 0x00000000 },
{ 0x2, 0x16, 0x0, 0x0, 0x0d280000, 0, 0x00000000 },
{ 0x2, 0x17, 0x0, 0x0, 0x0d0f0000, 0, 0x00000000 },
{ 0x2, 0x17, 0x1, 0x0, 0x0d100000, 1, 0x00010000 },
{ 0x2, 0x17, 0x2, 0x0, 0x0d110000, 2, 0x00020000 },
{ 0x2, 0x17, 0x3, 0x0, 0x0d120000, 3, 0x00030000 },
{ 0x2, 0x17, 0x4, 0x0, 0x0d130000, 4, 0x00040000 },
{ 0x2, 0x17, 0x5, 0x0, 0x0d140000, 5, 0x00050000 },
{ 0x2, 0x18, 0x0, 0x0, 0x0d020000, 0, 0x00000000 },
{ 0x2, 0x19, 0x0, 0x0, 0x0d030000, 0, 0x00000000 },
{ 0x2, 0x1f, 0x0, 0x0, 0x0d600000, 0, 0x00000000 },
{ 0x2, 0x1f, 0x1, 0x0, 0x00000000, 0, 0x00000000 },
{ 0x3, 0x1b, 0x0, 0x0, 0x40000000, 0, 0x40000000 },
{ 0x3, 0x1b, 0x1, 0x1, 0x80000000, 1, 0x80000000 },
{ 0x3, 0x1c, 0x0, 0x2, 0x0d640000, 0, 0x00000000 },
{ 0x3, 0x1d, 0x0, 0x2, 0x20b00000, 8, 0x20b00000 },
{ 0x3, 0x1d, 0x1, 0x2, 0x20800000, 7, 0x20800000 },
{ 0x3, 0x1d, 0x2, 0x2, 0x20c00000, 9, 0x20c00000 },
{ 0x3, 0x1d, 0x3, 0x2, 0x0d800000, 3, 0x0d800000 },
{ 0x3, 0x1d, 0x4, 0x2, 0x20000000, 6, 0x20000000 },
{ 0x3, 0x1d, 0x5, 0x2, 0x0c000000, 2, 0x0c000000 },
{ 0x3, 0x1d, 0x6, 0x2, 0x21000000, 10, 0x21000000 },
{ 0x3, 0x1d, 0x7, 0x2, 0x0e000000, 4, 0x0e000000 },
{ 0x3, 0x1d, 0x8, 0x2, 0x22000000, 11, 0x22000000 },
{ 0x3, 0x1d, 0x9, 0x2, 0x08000000, 1, 0x08000000 },
{ 0x3, 0x1d, 0xa, 0x2, 0x24000000, 12, 0x24000000 },
{ 0x3, 0x1d, 0xb, 0x2, 0x00000000, 0, 0x00000000 },
{ 0x3, 0x1d, 0xc, 0x2, 0x28000000, 13, 0x28000000 },
{ 0x3, 0x1d, 0xd, 0x2, 0x10000000, 5, 0x10000000 },
{ 0x3, 0x1d, 0xe, 0x2, 0x30000000, 14, 0x30000000 },
{ 0x3, 0x1e, 0x0, 0x2, 0x0d400000, 0, 0x0d400000 },
{ 0x3, 0x00, 0x0, 0x2, 0x0d230000, 0, 0x00000000 },
{ 0x3, 0x01, 0x0, 0x2, 0x0d040000, 0, 0x00000000 },
{ 0x3, 0x02, 0x0, 0x2, 0x0d050000, 0, 0x00000000 },
{ 0x3, 0x03, 0x0, 0x2, 0x0d000000, 0, 0x00000000 },
{ 0x3, 0x04, 0x0, 0x2, 0x20ae0000, 3, 0x000e0000 },
{ 0x3, 0x04, 0x1, 0x2, 0x20ac0000, 2, 0x000c0000 },
{ 0x3, 0x04, 0x2, 0x2, 0x20a80000, 1, 0x00080000 },
{ 0x3, 0x04, 0x3, 0x2, 0x20a00000, 0, 0x00000000 },
{ 0x3, 0x05, 0x0, 0x2, 0x0d2a0000, 0, 0x00000000 },
{ 0x3, 0x06, 0x0, 0x2, 0x0d290000, 0, 0x00000000 },
{ 0x3, 0x07, 0x0, 0x2, 0x0d2c0000, 0, 0x00000000 },
{ 0x3, 0x08, 0x0, 0x2, 0x0d0e0000, 4, 0x00080000 },
{ 0x3, 0x08, 0x1, 0x2, 0x0d060000, 0, 0x00000000 },
{ 0x3, 0x08, 0x2, 0x2, 0x0d080000, 1, 0x00020000 },
{ 0x3, 0x08, 0x3, 0x2, 0x0d0a0000, 2, 0x00040000 },
{ 0x3, 0x08, 0x4, 0x2, 0x0d0c0000, 3, 0x00060000 },
{ 0x3, 0x09, 0x0, 0x2, 0x0d650000, 0, 0x00000000 },
{ 0x3, 0x0a, 0x0, 0x2, 0x20af0000, 0, 0x00000000 },
{ 0x3, 0x0b, 0x0, 0x2, 0x0d3e0000, 0, 0x00000000 },
{ 0x3, 0x0c, 0x0, 0x2, 0x0d3d0000, 0, 0x00000000 },
{ 0x3, 0x0d, 0x0, 0x2, 0x0d1e0000, 0, 0x00000000 },
{ 0x3, 0x0e, 0x0, 0x2, 0x0d150000, 0, 0x00000000 },
{ 0x3, 0x0e, 0x1, 0x2, 0x0d160000, 1, 0x00010000 },
{ 0x3, 0x0e, 0x2, 0x2, 0x0d170000, 2, 0x00020000 },
{ 0x3, 0x0e, 0x3, 0x2, 0x0d180000, 3, 0x00030000 },
{ 0x3, 0x0e, 0x4, 0x2, 0x0d190000, 4, 0x00040000 },
{ 0x3, 0x0e, 0x5, 0x2, 0x0d1a0000, 5, 0x00050000 },
{ 0x3, 0x0e, 0x6, 0x2, 0x0d1b0000, 6, 0x00060000 },
{ 0x3, 0x0e, 0x7, 0x2, 0x0d1c0000, 7, 0x00070000 },
{ 0x3, 0x0e, 0x8, 0x2, 0x0d1d0000, 8, 0x00080000 },
{ 0x3, 0x0f, 0x0, 0x2, 0x0d660000, 0, 0x00000000 },
{ 0x3, 0x10, 0x0, 0x2, 0x0d1f0000, 0, 0x00000000 },
{ 0x3, 0x10, 0x1, 0x2, 0x0d200000, 1, 0x00010000 },
{ 0x3, 0x10, 0x2, 0x2, 0x0d210000, 2, 0x00020000 },
{ 0x3, 0x10, 0x3, 0x2, 0x0d220000, 3, 0x00030000 },
{ 0x3, 0x11, 0x0, 0x2, 0x0d240000, 0, 0x00000000 },
{ 0x3, 0x12, 0x0, 0x2, 0x0d250000, 0, 0x00000000 },
{ 0x3, 0x13, 0x0, 0x2, 0x0d260000, 0, 0x00000000 },
{ 0x3, 0x14, 0x0, 0x2, 0x0d270000, 0, 0x00000000 },
{ 0x3, 0x15, 0x0, 0x2, 0x0d2b0000, 0, 0x00000000 },
{ 0x3, 0x16, 0x0, 0x2, 0x0d280000, 0, 0x00000000 },
{ 0x3, 0x17, 0x0, 0x2, 0x0d0f0000, 0, 0x00000000 },
{ 0x3, 0x17, 0x1, 0x2, 0x0d100000, 1, 0x00010000 },
{ 0x3, 0x17, 0x2, 0x2, 0x0d110000, 2, 0x00020000 },
{ 0x3, 0x17, 0x3, 0x2, 0x0d120000, 3, 0x00030000 },
{ 0x3, 0x17, 0x4, 0x2, 0x0d130000, 4, 0x00040000 },
{ 0x3, 0x17, 0x5, 0x2, 0x0d140000, 5, 0x00050000 },
{ 0x3, 0x18, 0x0, 0x2, 0x0d020000, 0, 0x00000000 },
{ 0x3, 0x19, 0x0, 0x2, 0x0d030000, 0, 0x00000000 },
{ 0x3, 0x1f, 0x0, 0x2, 0x0d600000, 0, 0x00000000 },
{ 0x3, 0x1f, 0x1, 0x0, 0x00000000, 0, 0x00000000 },
{ 0x4, 0x1b, 0x0, 0x0, 0x40000000, 0, 0x40000000 },
{ 0x4, 0x1b, 0x1, 0x1, 0x80000000, 1, 0x80000000 },
{ 0x4, 0x1e, 0x0, 0x2, 0x0d400000, 0, 0x0d400000 },
{ 0x4, 0x1e, 0x1, 0x0, 0x00000000, 0, 0x00000000 },
{ 0x5, 0x1c, 0x0, 0x0, 0x0d640000, 0, 0x00000000 },
{ 0x5, 0x1d, 0x0, 0x0, 0x20b00000, 8, 0x20b00000 },
{ 0x5, 0x1d, 0x1, 0x0, 0x20800000, 7, 0x20800000 },
{ 0x5, 0x1d, 0x2, 0x0, 0x20c00000, 9, 0x20c00000 },
{ 0x5, 0x1d, 0x3, 0x0, 0x0d800000, 3, 0x0d800000 },
{ 0x5, 0x1d, 0x4, 0x0, 0x20000000, 6, 0x20000000 },
{ 0x5, 0x1d, 0x5, 0x0, 0x0c000000, 2, 0x0c000000 },
{ 0x5, 0x1d, 0x6, 0x0, 0x21000000, 10, 0x21000000 },
{ 0x5, 0x1d, 0x7, 0x0, 0x0e000000, 4, 0x0e000000 },
{ 0x5, 0x1d, 0x8, 0x0, 0x22000000, 11, 0x22000000 },
{ 0x5, 0x1d, 0x9, 0x0, 0x08000000, 1, 0x08000000 },
{ 0x5, 0x1d, 0xa, 0x0, 0x24000000, 12, 0x24000000 },
{ 0x5, 0x1d, 0xb, 0x0, 0x00000000, 0, 0x00000000 },
{ 0x5, 0x1d, 0xc, 0x0, 0x28000000, 13, 0x28000000 },
{ 0x5, 0x1d, 0xd, 0x0, 0x10000000, 5, 0x10000000 },
{ 0x5, 0x1d, 0xe, 0x0, 0x30000000, 14, 0x30000000 },
{ 0x5, 0x00, 0x0, 0x0, 0x0d230000, 0, 0x00000000 },
{ 0x5, 0x01, 0x0, 0x0, 0x0d040000, 0, 0x00000000 },
{ 0x5, 0x02, 0x0, 0x0, 0x0d050000, 0, 0x00000000 },
{ 0x5, 0x03, 0x0, 0x0, 0x0d000000, 0, 0x00000000 },
{ 0x5, 0x04, 0x0, 0x0, 0x20ae0000, 3, 0x000e0000 },
{ 0x5, 0x04, 0x1, 0x0, 0x20ac0000, 2, 0x000c0000 },
{ 0x5, 0x04, 0x2, 0x0, 0x20a80000, 1, 0x00080000 },
{ 0x5, 0x04, 0x3, 0x0, 0x20a00000, 0, 0x00000000 },
{ 0x5, 0x05, 0x0, 0x0, 0x0d2a0000, 0, 0x00000000 },
{ 0x5, 0x06, 0x0, 0x0, 0x0d290000, 0, 0x00000000 },
{ 0x5, 0x07, 0x0, 0x0, 0x0d2c0000, 0, 0x00000000 },
{ 0x5, 0x08, 0x0, 0x0, 0x0d0e0000, 4, 0x00080000 },
{ 0x5, 0x08, 0x1, 0x0, 0x0d060000, 0, 0x00000000 },
{ 0x5, 0x08, 0x2, 0x0, 0x0d080000, 1, 0x00020000 },
{ 0x5, 0x08, 0x3, 0x0, 0x0d0a0000, 2, 0x00040000 },
{ 0x5, 0x08, 0x4, 0x0, 0x0d0c0000, 3, 0x00060000 },
{ 0x5, 0x09, 0x0, 0x0, 0x0d650000, 0, 0x00000000 },
{ 0x5, 0x0a, 0x0, 0x0, 0x20af0000, 0, 0x00000000 },
{ 0x5, 0x0b, 0x0, 0x0, 0x0d3e0000, 0, 0x00000000 },
{ 0x5, 0x0c, 0x0, 0x0, 0x0d3d0000, 0, 0x00000000 },
{ 0x5, 0x0d, 0x0, 0x0, 0x0d1e0000, 0, 0x00000000 },
{ 0x5, 0x0e, 0x0, 0x0, 0x0d150000, 0, 0x00000000 },
{ 0x5, 0x0e, 0x1, 0x0, 0x0d160000, 1, 0x00010000 },
{ 0x5, 0x0e, 0x2, 0x0, 0x0d170000, 2, 0x00020000 },
{ 0x5, 0x0e, 0x3, 0x0, 0x0d180000, 3, 0x00030000 },
{ 0x5, 0x0e, 0x4, 0x0, 0x0d190000, 4, 0x00040000 },
{ 0x5, 0x0e, 0x5, 0x0, 0x0d1a0000, 5, 0x00050000 },
{ 0x5, 0x0e, 0x6, 0x0, 0x0d1b0000, 6, 0x00060000 },
{ 0x5, 0x0e, 0x7, 0x0, 0x0d1c0000, 7, 0x00070000 },
{ 0x5, 0x0e, 0x8, 0x0, 0x0d1d0000, 8, 0x00080000 },
{ 0x5, 0x0f, 0x0, 0x0, 0x0d660000, 0, 0x00000000 },
{ 0x5, 0x10, 0x0, 0x0, 0x0d1f0000, 0, 0x00000000 },
{ 0x5, 0x10, 0x1, 0x0, 0x0d200000, 1, 0x00010000 },
{ 0x5, 0x10, 0x2, 0x0, 0x0d210000, 2, 0x00020000 },
{ 0x5, 0x10, 0x3, 0x0, 0x0d220000, 3, 0x00030000 },
{ 0x5, 0x11, 0x0, 0x0, 0x0d240000, 0, 0x00000000 },
{ 0x5, 0x12, 0x0, 0x0, 0x0d250000, 0, 0x00000000 },
{ 0x5, 0x13, 0x0, 0x0, 0x0d260000, 0, 0x00000000 },
{ 0x5, 0x14, 0x0, 0x0, 0x0d270000, 0, 0x00000000 },
{ 0x5, 0x15, 0x0, 0x0, 0x0d2b0000, 0, 0x00000000 },
{ 0x5, 0x16, 0x0, 0x0, 0x0d280000, 0, 0x00000000 },
{ 0x5, 0x17, 0x0, 0x0, 0x0d0f0000, 0, 0x00000000 },
{ 0x5, 0x17, 0x1, 0x0, 0x0d100000, 1, 0x00010000 },
{ 0x5, 0x17, 0x2, 0x0, 0x0d110000, 2, 0x00020000 },
{ 0x5, 0x17, 0x3, 0x0, 0x0d120000, 3, 0x00030000 },
{ 0x5, 0x17, 0x4, 0x0, 0x0d130000, 4, 0x00040000 },
{ 0x5, 0x17, 0x5, 0x0, 0x0d140000, 5, 0x00050000 },
{ 0x5, 0x18, 0x0, 0x0, 0x0d020000, 0, 0x00000000 },
{ 0x5, 0x19, 0x0, 0x0, 0x0d030000, 0, 0x00000000 },
{ 0x5, 0x1f, 0x0, 0x0, 0x0d600000, 0, 0x00000000 },
{ 0x5, 0x1f, 0x1, 0x0, 0x00000000, 0, 0x00000000 }
};
/*
* AON NOC aperture lookup table as per file "AON_NOC_Structure.info".
*/
static const char * const tegra194_aonnoc_routeid_initflow[] = {
[0x0] = "cbb_i/I/0",
[0x1] = "cpu_p_i/I/0",
[0x2] = "dma_m_i/I/0",
[0x3] = "dma_p_i/I/0"
};
static const char * const tegra194_aonnoc_routeid_targflow[] = {
[0x00] = "multiport1_t/T/aon_misc",
[0x01] = "multiport1_t/T/avic0",
[0x02] = "multiport1_t/T/avic1",
[0x03] = "multiport1_t/T/can1",
[0x04] = "multiport1_t/T/can2",
[0x05] = "multiport1_t/T/dma",
[0x06] = "multiport1_t/T/dmic",
[0x07] = "multiport1_t/T/err_collator",
[0x08] = "multiport1_t/T/fpga_misc",
[0x09] = "multiport1_t/T/gte",
[0x0a] = "multiport1_t/T/hsp",
[0x0b] = "multiport1_t/T/i2c2",
[0x0c] = "multiport1_t/T/i2c8",
[0x0d] = "multiport1_t/T/pwm",
[0x0e] = "multiport1_t/T/spi2",
[0x0f] = "multiport1_t/T/tke",
[0x10] = "multiport1_t/T/uartg",
[0x11] = "RESERVED",
[0x12] = "RESERVED",
[0x13] = "RESERVED",
[0x14] = "RESERVED",
[0x15] = "RESERVED",
[0x16] = "RESERVED",
[0x17] = "RESERVED",
[0x18] = "RESERVED",
[0x19] = "RESERVED",
[0x1a] = "RESERVED",
[0x1b] = "RESERVED",
[0x1c] = "RESERVED",
[0x1d] = "RESERVED",
[0x1e] = "RESERVED",
[0x1f] = "RESERVED",
[0x20] = "multiport0_t/T/aovc",
[0x21] = "multiport0_t/T/atcm",
[0x22] = "multiport0_t/T/cast",
[0x23] = "multiport0_t/T/dast",
[0x24] = "multiport0_t/T/err_collator_car",
[0x25] = "multiport0_t/T/gpio",
[0x26] = "multiport0_t/T/i2c10",
[0x27] = "multiport0_t/T/mss",
[0x28] = "multiport0_t/T/padctl_a12",
[0x29] = "multiport0_t/T/padctl_a14",
[0x2a] = "multiport0_t/T/padctl_a15",
[0x2b] = "multiport0_t/T/rtc",
[0x2c] = "multiport0_t/T/tsc",
[0x2d] = "RESERVED",
[0x2e] = "RESERVED",
[0x2f] = "RESERVED",
[0x30] = "multiport2_t/T/aon_vref_ro",
[0x31] = "multiport2_t/T/aopm",
[0x32] = "multiport2_t/T/car",
[0x33] = "multiport2_t/T/pmc",
[0x34] = "ast1_t/T/0",
[0x35] = "cbb_t/T/0",
[0x36] = "cpu_t/T/0",
[0x37] = "firewall_t/T/0",
[0x38] = "svc_t/T/0",
[0x39] = "uartc/T/uartc",
[0x3a] = "RESERVED",
[0x3b] = "RESERVED",
[0x3c] = "RESERVED",
[0x3d] = "RESERVED",
[0x3e] = "RESERVED",
[0x3f] = "RESERVED"
};
/*
* Fields of AON NOC lookup table:
* Init flow, Targ flow, Targ subrange, Init mapping, Init localAddress,
* Targ mapping, Targ localAddress
* ----------------------------------------------------------------------------
*/
static const struct tegra194_cbb_aperture tegra194_aonnoc_aperture_lookup[] = {
{ 0x0, 0x37, 0x00, 0, 0x0c640000, 0, 0x00000000 },
{ 0x0, 0x20, 0x00, 0, 0x0c3b0000, 0, 0x00000000 },
{ 0x0, 0x21, 0x00, 0, 0x0c000000, 0, 0x00000000 },
{ 0x0, 0x22, 0x00, 0, 0x0c040000, 0, 0x00000000 },
{ 0x0, 0x23, 0x00, 0, 0x0c050000, 0, 0x00000000 },
{ 0x0, 0x24, 0x00, 0, 0x20cf0000, 0, 0x00000000 },
{ 0x0, 0x25, 0x00, 0, 0x0c2f0000, 0, 0x00000000 },
{ 0x0, 0x26, 0x00, 0, 0x0c230000, 0, 0x00000000 },
{ 0x0, 0x27, 0x00, 0, 0x0c350000, 0, 0x00000000 },
{ 0x0, 0x28, 0x00, 0, 0x0c301000, 0, 0x00000000 },
{ 0x0, 0x29, 0x00, 0, 0x0c302000, 0, 0x00000000 },
{ 0x0, 0x2a, 0x00, 0, 0x0c303000, 0, 0x00000000 },
{ 0x0, 0x2b, 0x00, 0, 0x0c2a0000, 0, 0x00000000 },
{ 0x0, 0x2c, 0x00, 0, 0x0c2b0000, 0, 0x00000000 },
{ 0x0, 0x2c, 0x01, 0, 0x0c2c0000, 1, 0x00010000 },
{ 0x0, 0x2c, 0x02, 0, 0x0c2d0000, 2, 0x00020000 },
{ 0x0, 0x2c, 0x03, 0, 0x0c2e0000, 3, 0x00030000 },
{ 0x0, 0x00, 0x00, 0, 0x0c660000, 0, 0x00000000 },
{ 0x0, 0x01, 0x00, 0, 0x0c020000, 0, 0x00000000 },
{ 0x0, 0x02, 0x00, 0, 0x0c030000, 0, 0x00000000 },
{ 0x0, 0x03, 0x00, 0, 0x0c310000, 0, 0x00000000 },
{ 0x0, 0x04, 0x00, 0, 0x0c320000, 0, 0x00000000 },
{ 0x0, 0x05, 0x00, 0, 0x0c0a0000, 2, 0x00040000 },
{ 0x0, 0x05, 0x01, 0, 0x0c0b0000, 3, 0x00050000 },
{ 0x0, 0x05, 0x02, 0, 0x0c0e0000, 5, 0x00080000 },
{ 0x0, 0x05, 0x03, 0, 0x0c060000, 0, 0x00000000 },
{ 0x0, 0x05, 0x04, 0, 0x0c080000, 1, 0x00020000 },
{ 0x0, 0x05, 0x05, 0, 0x0c0c0000, 4, 0x00060000 },
{ 0x0, 0x06, 0x00, 0, 0x0c330000, 0, 0x00000000 },
{ 0x0, 0x07, 0x00, 0, 0x0c650000, 0, 0x00000000 },
{ 0x0, 0x08, 0x00, 0, 0x0c3e0000, 0, 0x00000000 },
{ 0x0, 0x09, 0x00, 0, 0x0c1e0000, 0, 0x00000000 },
{ 0x0, 0x0a, 0x00, 0, 0x0c150000, 0, 0x00000000 },
{ 0x0, 0x0a, 0x01, 0, 0x0c160000, 1, 0x00010000 },
{ 0x0, 0x0a, 0x02, 0, 0x0c170000, 2, 0x00020000 },
{ 0x0, 0x0a, 0x03, 0, 0x0c180000, 3, 0x00030000 },
{ 0x0, 0x0a, 0x04, 0, 0x0c190000, 4, 0x00040000 },
{ 0x0, 0x0a, 0x05, 0, 0x0c1a0000, 5, 0x00050000 },
{ 0x0, 0x0a, 0x06, 0, 0x0c1b0000, 6, 0x00060000 },
{ 0x0, 0x0a, 0x07, 0, 0x0c1c0000, 7, 0x00070000 },
{ 0x0, 0x0a, 0x08, 0, 0x0c1d0000, 8, 0x00080000 },
{ 0x0, 0x0b, 0x00, 0, 0x0c240000, 0, 0x00000000 },
{ 0x0, 0x0c, 0x00, 0, 0x0c250000, 0, 0x00000000 },
{ 0x0, 0x0d, 0x00, 0, 0x0c340000, 0, 0x00000000 },
{ 0x0, 0x0e, 0x00, 0, 0x0c260000, 0, 0x00000000 },
{ 0x0, 0x0f, 0x00, 0, 0x0c0f0000, 0, 0x00000000 },
{ 0x0, 0x0f, 0x01, 0, 0x0c100000, 1, 0x00010000 },
{ 0x0, 0x0f, 0x02, 0, 0x0c110000, 2, 0x00020000 },
{ 0x0, 0x0f, 0x03, 0, 0x0c120000, 3, 0x00030000 },
{ 0x0, 0x0f, 0x04, 0, 0x0c130000, 4, 0x00040000 },
{ 0x0, 0x0f, 0x05, 0, 0x0c140000, 5, 0x00050000 },
{ 0x0, 0x10, 0x00, 0, 0x0c290000, 0, 0x00000000 },
{ 0x0, 0x30, 0x00, 0, 0x20ce0000, 0, 0x00000000 },
{ 0x0, 0x31, 0x00, 0, 0x0c1f0000, 0, 0x00000000 },
{ 0x0, 0x31, 0x01, 0, 0x0c200000, 1, 0x00010000 },
{ 0x0, 0x31, 0x02, 0, 0x0c210000, 2, 0x00020000 },
{ 0x0, 0x31, 0x03, 0, 0x0c220000, 3, 0x00030000 },
{ 0x0, 0x32, 0x00, 0, 0x20cc0000, 3, 0x001c0000 },
{ 0x0, 0x32, 0x01, 0, 0x20c80000, 2, 0x00180000 },
{ 0x0, 0x32, 0x02, 0, 0x20c00000, 1, 0x00100000 },
{ 0x0, 0x32, 0x03, 0, 0x20b00000, 0, 0x00000000 },
{ 0x0, 0x33, 0x00, 0, 0x0c360000, 0, 0x00000000 },
{ 0x0, 0x33, 0x01, 0, 0x0c370000, 1, 0x00010000 },
{ 0x0, 0x33, 0x02, 0, 0x0c3a0000, 3, 0x00040000 },
{ 0x0, 0x33, 0x03, 0, 0x0c380000, 2, 0x00020000 },
{ 0x0, 0x38, 0x00, 0, 0x0c600000, 0, 0x00000000 },
{ 0x0, 0x38, 0x01, 0, 0x00000000, 0, 0x00000000 },
{ 0x0, 0x39, 0x00, 0, 0x0c280000, 0, 0x00000000 },
{ 0x1, 0x35, 0x00, 0, 0x00000000, 0, 0x00000000 },
{ 0x1, 0x35, 0x01, 0, 0x00100000, 1, 0x00100000 },
{ 0x1, 0x35, 0x02, 0, 0x05a00000, 11, 0x05a00000 },
{ 0x1, 0x35, 0x03, 0, 0x05b00000, 32, 0x05b00000 },
{ 0x1, 0x35, 0x04, 0, 0x05c00000, 33, 0x05c00000 },
{ 0x1, 0x35, 0x05, 0, 0x05d00000, 12, 0x05d00000 },
{ 0x1, 0x35, 0x06, 0, 0x20000000, 19, 0x20000000 },
{ 0x1, 0x35, 0x07, 0, 0x20100000, 20, 0x20100000 },
{ 0x1, 0x35, 0x08, 0, 0x20a00000, 24, 0x20a00000 },
{ 0x1, 0x35, 0x09, 0, 0x20d00000, 25, 0x20d00000 },
{ 0x1, 0x35, 0x0a, 0, 0x00200000, 2, 0x00200000 },
{ 0x1, 0x35, 0x0b, 0, 0x05800000, 10, 0x05800000 },
{ 0x1, 0x35, 0x0c, 0, 0x05e00000, 13, 0x05e00000 },
{ 0x1, 0x35, 0x0d, 0, 0x20200000, 21, 0x20200000 },
{ 0x1, 0x35, 0x0e, 0, 0x20800000, 23, 0x20800000 },
{ 0x1, 0x35, 0x0f, 0, 0x20e00000, 26, 0x20e00000 },
{ 0x1, 0x35, 0x10, 0, 0x00400000, 3, 0x00400000 },
{ 0x1, 0x35, 0x11, 0, 0x20400000, 22, 0x20400000 },
{ 0x1, 0x35, 0x12, 0, 0x00800000, 4, 0x00800000 },
{ 0x1, 0x35, 0x13, 0, 0x05000000, 9, 0x05000000 },
{ 0x1, 0x35, 0x14, 0, 0x0c800000, 34, 0x0c800000 },
{ 0x1, 0x35, 0x15, 0, 0x01000000, 5, 0x01000000 },
{ 0x1, 0x35, 0x16, 0, 0x03000000, 7, 0x03000000 },
{ 0x1, 0x35, 0x17, 0, 0x04000000, 8, 0x04000000 },
{ 0x1, 0x35, 0x18, 0, 0x0d000000, 16, 0x0d000000 },
{ 0x1, 0x35, 0x19, 0, 0x21000000, 27, 0x21000000 },
{ 0x1, 0x35, 0x1a, 0, 0x02000000, 6, 0x02000000 },
{ 0x1, 0x35, 0x1b, 0, 0x06000000, 14, 0x06000000 },
{ 0x1, 0x35, 0x1c, 0, 0x0e000000, 17, 0x0e000000 },
{ 0x1, 0x35, 0x1d, 0, 0x22000000, 28, 0x22000000 },
{ 0x1, 0x35, 0x1e, 0, 0x08000000, 15, 0x08000000 },
{ 0x1, 0x35, 0x1f, 0, 0x24000000, 29, 0x24000000 },
{ 0x1, 0x35, 0x20, 0, 0x28000000, 30, 0x28000000 },
{ 0x1, 0x35, 0x21, 0, 0x10000000, 18, 0x10000000 },
{ 0x1, 0x35, 0x22, 0, 0x30000000, 31, 0x30000000 },
{ 0x1, 0x37, 0x00, 0, 0x0c640000, 0, 0x00000000 },
{ 0x1, 0x20, 0x00, 0, 0x0c3b0000, 0, 0x00000000 },
{ 0x1, 0x21, 0x00, 0, 0x0c000000, 0, 0x00000000 },
{ 0x1, 0x22, 0x00, 0, 0x0c040000, 0, 0x00000000 },
{ 0x1, 0x23, 0x00, 0, 0x0c050000, 0, 0x00000000 },
{ 0x1, 0x24, 0x00, 0, 0x20cf0000, 0, 0x00000000 },
{ 0x1, 0x25, 0x00, 0, 0x0c2f0000, 0, 0x00000000 },
{ 0x1, 0x26, 0x00, 0, 0x0c230000, 0, 0x00000000 },
{ 0x1, 0x27, 0x00, 0, 0x0c350000, 0, 0x00000000 },
{ 0x1, 0x28, 0x00, 0, 0x0c301000, 0, 0x00000000 },
{ 0x1, 0x29, 0x00, 0, 0x0c302000, 0, 0x00000000 },
{ 0x1, 0x2a, 0x00, 0, 0x0c303000, 0, 0x00000000 },
{ 0x1, 0x2b, 0x00, 0, 0x0c2a0000, 0, 0x00000000 },
{ 0x1, 0x2c, 0x00, 0, 0x0c2b0000, 0, 0x00000000 },
{ 0x1, 0x2c, 0x01, 0, 0x0c2c0000, 1, 0x00010000 },
{ 0x1, 0x2c, 0x02, 0, 0x0c2d0000, 2, 0x00020000 },
{ 0x1, 0x2c, 0x03, 0, 0x0c2e0000, 3, 0x00030000 },
{ 0x1, 0x00, 0x00, 0, 0x0c660000, 0, 0x00000000 },
{ 0x1, 0x01, 0x00, 0, 0x0c020000, 0, 0x00000000 },
{ 0x1, 0x02, 0x00, 0, 0x0c030000, 0, 0x00000000 },
{ 0x1, 0x03, 0x00, 0, 0x0c310000, 0, 0x00000000 },
{ 0x1, 0x04, 0x00, 0, 0x0c320000, 0, 0x00000000 },
{ 0x1, 0x05, 0x00, 0, 0x0c0a0000, 2, 0x00040000 },
{ 0x1, 0x05, 0x01, 0, 0x0c0b0000, 3, 0x00050000 },
{ 0x1, 0x05, 0x02, 0, 0x0c0e0000, 5, 0x00080000 },
{ 0x1, 0x05, 0x03, 0, 0x0c060000, 0, 0x00000000 },
{ 0x1, 0x05, 0x04, 0, 0x0c080000, 1, 0x00020000 },
{ 0x1, 0x05, 0x05, 0, 0x0c0c0000, 4, 0x00060000 },
{ 0x1, 0x06, 0x00, 0, 0x0c330000, 0, 0x00000000 },
{ 0x1, 0x07, 0x00, 0, 0x0c650000, 0, 0x00000000 },
{ 0x1, 0x08, 0x00, 0, 0x0c3e0000, 0, 0x00000000 },
{ 0x1, 0x09, 0x00, 0, 0x0c1e0000, 0, 0x00000000 },
{ 0x1, 0x0a, 0x00, 0, 0x0c150000, 0, 0x00000000 },
{ 0x1, 0x0a, 0x01, 0, 0x0c160000, 1, 0x00010000 },
{ 0x1, 0x0a, 0x02, 0, 0x0c170000, 2, 0x00020000 },
{ 0x1, 0x0a, 0x03, 0, 0x0c180000, 3, 0x00030000 },
{ 0x1, 0x0a, 0x04, 0, 0x0c190000, 4, 0x00040000 },
{ 0x1, 0x0a, 0x05, 0, 0x0c1a0000, 5, 0x00050000 },
{ 0x1, 0x0a, 0x06, 0, 0x0c1b0000, 6, 0x00060000 },
{ 0x1, 0x0a, 0x07, 0, 0x0c1c0000, 7, 0x00070000 },
{ 0x1, 0x0a, 0x08, 0, 0x0c1d0000, 8, 0x00080000 },
{ 0x1, 0x0b, 0x00, 0, 0x0c240000, 0, 0x00000000 },
{ 0x1, 0x0c, 0x00, 0, 0x0c250000, 0, 0x00000000 },
{ 0x1, 0x0d, 0x00, 0, 0x0c340000, 0, 0x00000000 },
{ 0x1, 0x0e, 0x00, 0, 0x0c260000, 0, 0x00000000 },
{ 0x1, 0x0f, 0x00, 0, 0x0c0f0000, 0, 0x00000000 },
{ 0x1, 0x0f, 0x01, 0, 0x0c100000, 1, 0x00010000 },
{ 0x1, 0x0f, 0x02, 0, 0x0c110000, 2, 0x00020000 },
{ 0x1, 0x0f, 0x03, 0, 0x0c120000, 3, 0x00030000 },
{ 0x1, 0x0f, 0x04, 0, 0x0c130000, 4, 0x00040000 },
{ 0x1, 0x0f, 0x05, 0, 0x0c140000, 5, 0x00050000 },
{ 0x1, 0x10, 0x00, 0, 0x0c290000, 0, 0x00000000 },
{ 0x1, 0x30, 0x00, 0, 0x20ce0000, 0, 0x00000000 },
{ 0x1, 0x31, 0x00, 0, 0x0c1f0000, 0, 0x00000000 },
{ 0x1, 0x31, 0x01, 0, 0x0c200000, 1, 0x00010000 },
{ 0x1, 0x31, 0x02, 0, 0x0c210000, 2, 0x00020000 },
{ 0x1, 0x31, 0x03, 0, 0x0c220000, 3, 0x00030000 },
{ 0x1, 0x32, 0x00, 0, 0x20cc0000, 3, 0x001c0000 },
{ 0x1, 0x32, 0x01, 0, 0x20c80000, 2, 0x00180000 },
{ 0x1, 0x32, 0x02, 0, 0x20c00000, 1, 0x00100000 },
{ 0x1, 0x32, 0x03, 0, 0x20b00000, 0, 0x00000000 },
{ 0x1, 0x33, 0x00, 0, 0x0c360000, 0, 0x00000000 },
{ 0x1, 0x33, 0x01, 0, 0x0c370000, 1, 0x00010000 },
{ 0x1, 0x33, 0x02, 0, 0x0c3a0000, 3, 0x00040000 },
{ 0x1, 0x33, 0x03, 0, 0x0c380000, 2, 0x00020000 },
{ 0x1, 0x38, 0x00, 0, 0x0c600000, 0, 0x00000000 },
{ 0x1, 0x38, 0x01, 0, 0x00000000, 0, 0x00000000 },
{ 0x1, 0x39, 0x00, 0, 0x0c280000, 0, 0x00000000 },
{ 0x2, 0x34, 0x00, 0, 0x40000000, 0, 0x40000000 },
{ 0x2, 0x34, 0x01, 0, 0x80000000, 1, 0x80000000 },
{ 0x2, 0x36, 0x00, 0, 0x0c400000, 0, 0x0c400000 },
{ 0x2, 0x36, 0x01, 0, 0x00000000, 0, 0x00000000 },
{ 0x3, 0x35, 0x00, 0, 0x00000000, 0, 0x00000000 },
{ 0x3, 0x35, 0x01, 0, 0x00100000, 1, 0x00100000 },
{ 0x3, 0x35, 0x02, 0, 0x05a00000, 11, 0x05a00000 },
{ 0x3, 0x35, 0x03, 0, 0x05b00000, 32, 0x05b00000 },
{ 0x3, 0x35, 0x04, 0, 0x05c00000, 33, 0x05c00000 },
{ 0x3, 0x35, 0x05, 0, 0x05d00000, 12, 0x05d00000 },
{ 0x3, 0x35, 0x06, 0, 0x20000000, 19, 0x20000000 },
{ 0x3, 0x35, 0x07, 0, 0x20100000, 20, 0x20100000 },
{ 0x3, 0x35, 0x08, 0, 0x20a00000, 24, 0x20a00000 },
{ 0x3, 0x35, 0x09, 0, 0x20d00000, 25, 0x20d00000 },
{ 0x3, 0x35, 0x0a, 0, 0x00200000, 2, 0x00200000 },
{ 0x3, 0x35, 0x0b, 0, 0x05800000, 10, 0x05800000 },
{ 0x3, 0x35, 0x0c, 0, 0x05e00000, 13, 0x05e00000 },
{ 0x3, 0x35, 0x0d, 0, 0x20200000, 21, 0x20200000 },
{ 0x3, 0x35, 0x0e, 0, 0x20800000, 23, 0x20800000 },
{ 0x3, 0x35, 0x0f, 0, 0x20e00000, 26, 0x20e00000 },
{ 0x3, 0x35, 0x10, 0, 0x00400000, 3, 0x00400000 },
{ 0x3, 0x35, 0x11, 0, 0x20400000, 22, 0x20400000 },
{ 0x3, 0x35, 0x12, 0, 0x00800000, 4, 0x00800000 },
{ 0x3, 0x35, 0x13, 0, 0x50000000, 9, 0x05000000 },
{ 0x3, 0x35, 0x14, 0, 0xc0800000, 34, 0x0c800000 },
{ 0x3, 0x35, 0x15, 0, 0x10000000, 5, 0x01000000 },
{ 0x3, 0x35, 0x16, 0, 0x30000000, 7, 0x03000000 },
{ 0x3, 0x35, 0x17, 0, 0x04000000, 8, 0x04000000 },
{ 0x3, 0x35, 0x18, 0, 0x0d000000, 16, 0x0d000000 },
{ 0x3, 0x35, 0x19, 0, 0x21000000, 27, 0x21000000 },
{ 0x3, 0x35, 0x1a, 0, 0x02000000, 6, 0x02000000 },
{ 0x3, 0x35, 0x1b, 0, 0x06000000, 14, 0x06000000 },
{ 0x3, 0x35, 0x1c, 0, 0x0e000000, 17, 0x0e000000 },
{ 0x3, 0x35, 0x1d, 0, 0x22000000, 28, 0x22000000 },
{ 0x3, 0x35, 0x1e, 0, 0x08000000, 15, 0x08000000 },
{ 0x3, 0x35, 0x1f, 0, 0x24000000, 29, 0x24000000 },
{ 0x3, 0x35, 0x20, 0, 0x28000000, 30, 0x28000000 },
{ 0x3, 0x35, 0x21, 0, 0x10000000, 18, 0x10000000 },
{ 0x3, 0x35, 0x22, 0, 0x30000000, 31, 0x30000000 },
{ 0x3, 0x37, 0x00, 0, 0x0c640000, 0, 0x00000000 },
{ 0x3, 0x20, 0x00, 0, 0x0c3b0000, 0, 0x00000000 },
{ 0x3, 0x21, 0x00, 0, 0x0c000000, 0, 0x00000000 },
{ 0x3, 0x22, 0x00, 0, 0x0c040000, 0, 0x00000000 },
{ 0x3, 0x23, 0x00, 0, 0x0c050000, 0, 0x00000000 },
{ 0x3, 0x24, 0x00, 0, 0x20cf0000, 0, 0x00000000 },
{ 0x3, 0x25, 0x00, 0, 0x0c2f0000, 0, 0x00000000 },
{ 0x3, 0x26, 0x00, 0, 0x0c230000, 0, 0x00000000 },
{ 0x3, 0x27, 0x00, 0, 0x0c350000, 0, 0x00000000 },
{ 0x3, 0x28, 0x00, 0, 0x0c301000, 0, 0x00000000 },
{ 0x3, 0x29, 0x00, 0, 0x0c302000, 0, 0x00000000 },
{ 0x3, 0x2a, 0x00, 0, 0x0c303000, 0, 0x00000000 },
{ 0x3, 0x2b, 0x00, 0, 0x0c2a0000, 0, 0x00000000 },
{ 0x3, 0x2c, 0x00, 0, 0x0c2b0000, 0, 0x00000000 },
{ 0x3, 0x2c, 0x01, 0, 0x0c2c0000, 1, 0x00010000 },
{ 0x3, 0x2c, 0x02, 0, 0x0c2d0000, 2, 0x00020000 },
{ 0x3, 0x2c, 0x03, 0, 0x0c2e0000, 3, 0x00030000 },
{ 0x3, 0x00, 0x00, 0, 0x0c660000, 0, 0x00000000 },
{ 0x3, 0x01, 0x00, 0, 0x0c020000, 0, 0x00000000 },
{ 0x3, 0x02, 0x00, 0, 0x0c030000, 0, 0x00000000 },
{ 0x3, 0x03, 0x00, 0, 0x0c310000, 0, 0x00000000 },
{ 0x3, 0x04, 0x00, 0, 0x0c320000, 0, 0x00000000 },
{ 0x3, 0x05, 0x00, 0, 0x0c0a0000, 2, 0x00040000 },
{ 0x3, 0x05, 0x01, 0, 0x0c0b0000, 3, 0x00050000 },
{ 0x3, 0x05, 0x02, 0, 0x0c0e0000, 5, 0x00080000 },
{ 0x3, 0x05, 0x03, 0, 0x0c060000, 0, 0x00000000 },
{ 0x3, 0x05, 0x04, 0, 0x0c080000, 1, 0x00020000 },
{ 0x3, 0x05, 0x05, 0, 0x0c0c0000, 4, 0x00060000 },
{ 0x3, 0x06, 0x00, 0, 0x0c330000, 0, 0x00000000 },
{ 0x3, 0x07, 0x00, 0, 0x0c650000, 0, 0x00000000 },
{ 0x3, 0x08, 0x00, 0, 0x0c3e0000, 0, 0x00000000 },
{ 0x3, 0x09, 0x00, 0, 0x0c1e0000, 0, 0x00000000 },
{ 0x3, 0x0a, 0x00, 0, 0x0c150000, 0, 0x00000000 },
{ 0x3, 0x0a, 0x01, 0, 0x0c160000, 1, 0x00010000 },
{ 0x3, 0x0a, 0x02, 0, 0x0c170000, 2, 0x00020000 },
{ 0x3, 0x0a, 0x03, 0, 0x0c180000, 3, 0x00030000 },
{ 0x3, 0x0a, 0x04, 0, 0x0c190000, 4, 0x00040000 },
{ 0x3, 0x0a, 0x05, 0, 0x0c1a0000, 5, 0x00050000 },
{ 0x3, 0x0a, 0x06, 0, 0x0c1b0000, 6, 0x00060000 },
{ 0x3, 0x0a, 0x07, 0, 0x0c1c0000, 7, 0x00070000 },
{ 0x3, 0x0a, 0x08, 0, 0x0c1d0000, 8, 0x00080000 },
{ 0x3, 0x0b, 0x00, 0, 0x0c240000, 0, 0x00000000 },
{ 0x3, 0x0c, 0x00, 0, 0x0c250000, 0, 0x00000000 },
{ 0x3, 0x0d, 0x00, 0, 0x0c340000, 0, 0x00000000 },
{ 0x3, 0x0e, 0x00, 0, 0x0c260000, 0, 0x00000000 },
{ 0x3, 0x0f, 0x00, 0, 0x0c0f0000, 0, 0x00000000 },
{ 0x3, 0x0f, 0x01, 0, 0x0c100000, 1, 0x00010000 },
{ 0x3, 0x0f, 0x02, 0, 0x0c110000, 2, 0x00020000 },
{ 0x3, 0x0f, 0x03, 0, 0x0c120000, 3, 0x00030000 },
{ 0x3, 0x0f, 0x04, 0, 0x0c130000, 4, 0x00040000 },
{ 0x3, 0x0f, 0x05, 0, 0x0c140000, 5, 0x00050000 },
{ 0x3, 0x10, 0x00, 0, 0x0c290000, 0, 0x00000000 },
{ 0x3, 0x30, 0x00, 0, 0x20ce0000, 0, 0x00000000 },
{ 0x3, 0x31, 0x00, 0, 0x0c1f0000, 0, 0x00000000 },
{ 0x3, 0x31, 0x01, 0, 0x0c200000, 1, 0x00010000 },
{ 0x3, 0x31, 0x02, 0, 0x0c210000, 2, 0x00020000 },
{ 0x3, 0x31, 0x03, 0, 0x0c220000, 3, 0x00030000 },
{ 0x3, 0x32, 0x00, 0, 0x20cc0000, 3, 0x001c0000 },
{ 0x3, 0x32, 0x01, 0, 0x20c80000, 2, 0x00180000 },
{ 0x3, 0x32, 0x02, 0, 0x20c00000, 1, 0x00100000 },
{ 0x3, 0x32, 0x03, 0, 0x20b00000, 0, 0x00000000 },
{ 0x3, 0x33, 0x00, 0, 0x0c360000, 0, 0x00000000 },
{ 0x3, 0x33, 0x01, 0, 0x0c370000, 1, 0x00010000 },
{ 0x3, 0x33, 0x02, 0, 0x0c3a0000, 3, 0x00040000 },
{ 0x3, 0x33, 0x03, 0, 0x0c380000, 2, 0x00020000 },
{ 0x3, 0x38, 0x00, 0, 0x0c600000, 0, 0x00000000 },
{ 0x3, 0x38, 0x01, 0, 0x00000000, 0, 0x00000000 },
{ 0x3, 0x39, 0x00, 0, 0x0c280000, 0, 0x00000000 }
};
/*
* SCE/RCE NOC aperture lookup table as per file "AON_NOC_Structure.info".
*/
static const char * const tegra194_scenoc_routeid_initflow[] = {
[0x0] = "cbb_i/I/0",
[0x1] = "cpu_m_i/I/0",
[0x2] = "cpu_p_i/I/0",
[0x3] = "dma_m_i/I/0",
[0x4] = "dma_p_i/I/0",
[0x5] = "RESERVED",
[0x6] = "RESERVED",
[0x7] = "RESERVED"
};
static const char * const tegra194_scenoc_routeid_targflow[] = {
[0x00] = "multiport0_t/T/atcm_cfg",
[0x01] = "multiport0_t/T/car",
[0x02] = "multiport0_t/T/cast",
[0x03] = "multiport0_t/T/cfg",
[0x04] = "multiport0_t/T/dast",
[0x05] = "multiport0_t/T/dma",
[0x06] = "multiport0_t/T/err_collator",
[0x07] = "multiport0_t/T/err_collator_car",
[0x08] = "multiport0_t/T/fpga_misc",
[0x09] = "multiport0_t/T/fpga_uart",
[0x0a] = "multiport0_t/T/gte",
[0x0b] = "multiport0_t/T/hsp",
[0x0c] = "multiport0_t/T/misc",
[0x0d] = "multiport0_t/T/pm",
[0x0e] = "multiport0_t/T/tke",
[0x0f] = "RESERVED",
[0x10] = "multiport1_t/T/hsm",
[0x11] = "multiport1_t/T/vic0",
[0x12] = "multiport1_t/T/vic1",
[0x13] = "ast0_t/T/0",
[0x14] = "ast1_t/T/0",
[0x15] = "cbb_t/T/0",
[0x16] = "cpu_t/T/0",
[0x17] = "sce_noc_firewall/T/0",
[0x18] = "svc_t/T/0",
[0x19] = "RESERVED",
[0x1a] = "RESERVED",
[0x1b] = "RESERVED",
[0x1c] = "RESERVED",
[0x1d] = "RESERVED",
[0x1e] = "RESERVED",
[0x1f] = "RESERVED"
};
/*
* Fields of SCE/RCE NOC lookup table:
* Init flow, Targ flow, Targ subrange, Init mapping, Init localAddress,
* Targ mapping, Targ localAddress
* ----------------------------------------------------------------------------
*/
static const struct tegra194_cbb_aperture tegra194_scenoc_apert_lookup[] = {
{ 0x0, 0x16, 0x0, 0, 0x0b400000, 0, 0x0b400000 },
{ 0x0, 0x16, 0x1, 0, 0x0bc00000, 1, 0x0bc00000 },
{ 0x0, 0x0, 0x0, 0, 0x0b000000, 0, 0x00000000 },
{ 0x0, 0x0, 0x1, 0, 0x0b800000, 1, 0x00000000 },
{ 0x0, 0x1, 0x0, 0, 0x20de0000, 3, 0x000e0000 },
{ 0x0, 0x1, 0x1, 0, 0x210e0000, 7, 0x000e0000 },
{ 0x0, 0x1, 0x2, 0, 0x20dc0000, 2, 0x000c0000 },
{ 0x0, 0x1, 0x3, 0, 0x210c0000, 6, 0x000c0000 },
{ 0x0, 0x1, 0x4, 0, 0x20d80000, 1, 0x00080000 },
{ 0x0, 0x1, 0x5, 0, 0x21080000, 5, 0x00080000 },
{ 0x0, 0x1, 0x6, 0, 0x20d00000, 0, 0x00000000 },
{ 0x0, 0x1, 0x7, 0, 0x21000000, 4, 0x00000000 },
{ 0x0, 0x2, 0x0, 0, 0x0b040000, 0, 0x00000000 },
{ 0x0, 0x2, 0x1, 0, 0x0b840000, 1, 0x00000000 },
{ 0x0, 0x3, 0x0, 0, 0x0b230000, 0, 0x00000000 },
{ 0x0, 0x3, 0x1, 0, 0x0ba30000, 1, 0x00000000 },
{ 0x0, 0x4, 0x0, 0, 0x0b050000, 0, 0x00000000 },
{ 0x0, 0x4, 0x1, 0, 0x0b850000, 1, 0x00000000 },
{ 0x0, 0x5, 0x0, 0, 0x0b060000, 0, 0x00000000 },
{ 0x0, 0x5, 0x1, 0, 0x0b070000, 1, 0x00010000 },
{ 0x0, 0x5, 0x2, 0, 0x0b080000, 2, 0x00020000 },
{ 0x0, 0x5, 0x3, 0, 0x0b090000, 3, 0x00030000 },
{ 0x0, 0x5, 0x4, 0, 0x0b0a0000, 4, 0x00040000 },
{ 0x0, 0x5, 0x5, 0, 0x0b0b0000, 5, 0x00050000 },
{ 0x0, 0x5, 0x6, 0, 0x0b0c0000, 6, 0x00060000 },
{ 0x0, 0x5, 0x7, 0, 0x0b0d0000, 7, 0x00070000 },
{ 0x0, 0x5, 0x8, 0, 0x0b0e0000, 8, 0x00080000 },
{ 0x0, 0x5, 0x9, 0, 0x0b860000, 9, 0x00000000 },
{ 0x0, 0x5, 0xa, 0, 0x0b870000, 10, 0x00010000 },
{ 0x0, 0x5, 0xb, 0, 0x0b880000, 11, 0x00020000 },
{ 0x0, 0x5, 0xc, 0, 0x0b890000, 12, 0x00030000 },
{ 0x0, 0x5, 0xd, 0, 0x0b8a0000, 13, 0x00040000 },
{ 0x0, 0x5, 0xe, 0, 0x0b8b0000, 14, 0x00050000 },
{ 0x0, 0x5, 0xf, 0, 0x0b8c0000, 15, 0x00060000 },
{ 0x0, 0x5, 0x10, 0, 0x0b8d0000, 16, 0x00070000 },
{ 0x0, 0x5, 0x11, 0, 0x0b8e0000, 17, 0x00080000 },
{ 0x0, 0x6, 0x0, 0, 0x0b650000, 0, 0x00000000 },
{ 0x0, 0x6, 0x1, 0, 0x0be50000, 1, 0x00000000 },
{ 0x0, 0x7, 0x0, 0, 0x20df0000, 0, 0x00000000 },
{ 0x0, 0x7, 0x1, 0, 0x210f0000, 1, 0x00000000 },
{ 0x0, 0x8, 0x0, 0, 0x0b3e0000, 0, 0x00000000 },
{ 0x0, 0x8, 0x1, 0, 0x0bbe0000, 1, 0x00000000 },
{ 0x0, 0x9, 0x0, 0, 0x0b3d0000, 0, 0x00000000 },
{ 0x0, 0x9, 0x1, 0, 0x0bbd0000, 1, 0x00000000 },
{ 0x0, 0xa, 0x0, 0, 0x0b1e0000, 0, 0x00000000 },
{ 0x0, 0xa, 0x1, 0, 0x0b9e0000, 1, 0x00000000 },
{ 0x0, 0xb, 0x0, 0, 0x0b150000, 0, 0x00000000 },
{ 0x0, 0xb, 0x1, 0, 0x0b160000, 1, 0x00010000 },
{ 0x0, 0xb, 0x2, 0, 0x0b170000, 2, 0x00020000 },
{ 0x0, 0xb, 0x3, 0, 0x0b180000, 3, 0x00030000 },
{ 0x0, 0xb, 0x4, 0, 0x0b190000, 4, 0x00040000 },
{ 0x0, 0xb, 0x5, 0, 0x0b1a0000, 5, 0x00050000 },
{ 0x0, 0xb, 0x6, 0, 0x0b1b0000, 6, 0x00060000 },
{ 0x0, 0xb, 0x7, 0, 0x0b1c0000, 7, 0x00070000 },
{ 0x0, 0xb, 0x8, 0, 0x0b1d0000, 8, 0x00080000 },
{ 0x0, 0xb, 0x9, 0, 0x0b950000, 9, 0x00000000 },
{ 0x0, 0xb, 0xa, 0, 0x0b960000, 10, 0x00010000 },
{ 0x0, 0xb, 0xb, 0, 0x0b970000, 11, 0x00020000 },
{ 0x0, 0xb, 0xc, 0, 0x0b980000, 12, 0x00030000 },
{ 0x0, 0xb, 0xd, 0, 0x0b990000, 13, 0x00040000 },
{ 0x0, 0xb, 0xe, 0, 0x0b9a0000, 14, 0x00050000 },
{ 0x0, 0xb, 0xf, 0, 0x0b9b0000, 15, 0x00060000 },
{ 0x0, 0xb, 0x10, 0, 0x0b9c0000, 16, 0x00070000 },
{ 0x0, 0xb, 0x11, 0, 0x0b9d0000, 17, 0x00080000 },
{ 0x0, 0xc, 0x0, 0, 0x0b660000, 0, 0x00000000 },
{ 0x0, 0xc, 0x1, 0, 0x0be60000, 1, 0x00000000 },
{ 0x0, 0xd, 0x0, 0, 0x0b1f0000, 0, 0x00000000 },
{ 0x0, 0xd, 0x1, 0, 0x0b200000, 1, 0x00010000 },
{ 0x0, 0xd, 0x2, 0, 0x0b210000, 2, 0x00020000 },
{ 0x0, 0xd, 0x3, 0, 0x0b220000, 3, 0x00030000 },
{ 0x0, 0xd, 0x4, 0, 0x0b9f0000, 4, 0x00000000 },
{ 0x0, 0xd, 0x5, 0, 0x0ba00000, 5, 0x00010000 },
{ 0x0, 0xd, 0x6, 0, 0x0ba10000, 6, 0x00020000 },
{ 0x0, 0xd, 0x7, 0, 0x0ba20000, 7, 0x00030000 },
{ 0x0, 0xe, 0x0, 0, 0x0b0f0000, 0, 0x00000000 },
{ 0x0, 0xe, 0x1, 0, 0x0b100000, 1, 0x00010000 },
{ 0x0, 0xe, 0x2, 0, 0x0b110000, 2, 0x00020000 },
{ 0x0, 0xe, 0x3, 0, 0x0b120000, 3, 0x00030000 },
{ 0x0, 0xe, 0x4, 0, 0x0b130000, 4, 0x00040000 },
{ 0x0, 0xe, 0x5, 0, 0x0b140000, 5, 0x00050000 },
{ 0x0, 0xe, 0x6, 0, 0x0b8f0000, 6, 0x00000000 },
{ 0x0, 0xe, 0x7, 0, 0x0b900000, 7, 0x00010000 },
{ 0x0, 0xe, 0x8, 0, 0x0b910000, 8, 0x00020000 },
{ 0x0, 0xe, 0x9, 0, 0x0b920000, 9, 0x00030000 },
{ 0x0, 0xe, 0xa, 0, 0x0b930000, 10, 0x00040000 },
{ 0x0, 0xe, 0xb, 0, 0x0b940000, 11, 0x00050000 },
{ 0x0, 0x10, 0x0, 0, 0x0b240000, 0, 0x00000000 },
{ 0x0, 0x10, 0x1, 0, 0x0ba40000, 1, 0x00000000 },
{ 0x0, 0x11, 0x0, 0, 0x0b020000, 0, 0x00000000 },
{ 0x0, 0x11, 0x1, 0, 0x0b820000, 1, 0x00000000 },
{ 0x0, 0x12, 0x0, 0, 0x0b030000, 0, 0x00000000 },
{ 0x0, 0x12, 0x1, 0, 0x0b830000, 1, 0x00000000 },
{ 0x0, 0x17, 0x0, 0, 0x0b640000, 0, 0x00000000 },
{ 0x0, 0x17, 0x1, 0, 0x0be40000, 1, 0x00000000 },
{ 0x0, 0x18, 0x0, 0, 0x0b600000, 0, 0x00000000 },
{ 0x0, 0x18, 0x1, 0, 0x0be00000, 1, 0x00000000 },
{ 0x0, 0x18, 0x2, 0, 0x00000000, 0, 0x00000000 },
{ 0x0, 0x18, 0x3, 0, 0x00000000, 0, 0x00000000 },
{ 0x1, 0x13, 0x0, 0, 0x40000000, 0, 0x40000000 },
{ 0x1, 0x13, 0x1, 1, 0x80000000, 1, 0x80000000 },
{ 0x1, 0x13, 0x2, 0, 0x00000000, 0, 0x00000000 },
{ 0x2, 0x15, 0x0, 0, 0x20c00000, 8, 0x20c00000 },
{ 0x2, 0x15, 0x1, 0, 0x21100000, 22, 0x21100000 },
{ 0x2, 0x15, 0x2, 0, 0x20e00000, 9, 0x20e00000 },
{ 0x2, 0x15, 0x3, 0, 0x21200000, 23, 0x21200000 },
{ 0x2, 0x15, 0x4, 0, 0x20800000, 7, 0x20800000 },
{ 0x2, 0x15, 0x5, 0, 0x21400000, 24, 0x21400000 },
{ 0x2, 0x15, 0x6, 0, 0x0b000000, 18, 0x0b000000 },
{ 0x2, 0x15, 0x7, 0, 0x0b800000, 3, 0x0b800000 },
{ 0x2, 0x15, 0x8, 0, 0x20000000, 6, 0x20000000 },
{ 0x2, 0x15, 0x9, 0, 0x21800000, 25, 0x21800000 },
{ 0x2, 0x15, 0xa, 0, 0x0a000000, 2, 0x0a000000 },
{ 0x2, 0x15, 0xb, 0, 0x0a000000, 17, 0x0a000000 },
{ 0x2, 0x15, 0xc, 0, 0x20000000, 21, 0x20000000 },
{ 0x2, 0x15, 0xd, 0, 0x21000000, 10, 0x21000000 },
{ 0x2, 0x15, 0xe, 0, 0x08000000, 1, 0x08000000 },
{ 0x2, 0x15, 0xf, 0, 0x08000000, 16, 0x08000000 },
{ 0x2, 0x15, 0x10, 0, 0x22000000, 11, 0x22000000 },
{ 0x2, 0x15, 0x11, 0, 0x22000000, 26, 0x22000000 },
{ 0x2, 0x15, 0x12, 0, 0x0c000000, 4, 0x0c000000 },
{ 0x2, 0x15, 0x13, 0, 0x0c000000, 19, 0x0c000000 },
{ 0x2, 0x15, 0x14, 0, 0x24000000, 12, 0x24000000 },
{ 0x2, 0x15, 0x15, 0, 0x24000000, 27, 0x24000000 },
{ 0x2, 0x15, 0x16, 0, 0x00000000, 0, 0x00000000 },
{ 0x2, 0x15, 0x17, 0, 0x00000000, 15, 0x00000000 },
{ 0x2, 0x15, 0x18, 0, 0x28000000, 13, 0x28000000 },
{ 0x2, 0x15, 0x19, 0, 0x28000000, 28, 0x28000000 },
{ 0x2, 0x15, 0x1a, 0, 0x10000000, 5, 0x10000000 },
{ 0x2, 0x15, 0x1b, 0, 0x10000000, 20, 0x10000000 },
{ 0x2, 0x15, 0x1c, 0, 0x30000000, 14, 0x30000000 },
{ 0x2, 0x15, 0x1d, 0, 0x30000000, 29, 0x30000000 },
{ 0x2, 0x0, 0x0, 0, 0x0b000000, 0, 0x00000000 },
{ 0x2, 0x0, 0x1, 0, 0x0b800000, 1, 0x00000000 },
{ 0x2, 0x1, 0x0, 0, 0x20de0000, 3, 0x000e0000 },
{ 0x2, 0x1, 0x1, 0, 0x210e0000, 7, 0x000e0000 },
{ 0x2, 0x1, 0x2, 0, 0x20dc0000, 2, 0x000c0000 },
{ 0x2, 0x1, 0x3, 0, 0x210c0000, 6, 0x000c0000 },
{ 0x2, 0x1, 0x4, 0, 0x20d80000, 1, 0x00080000 },
{ 0x2, 0x1, 0x5, 0, 0x21080000, 5, 0x00080000 },
{ 0x2, 0x1, 0x6, 0, 0x20d00000, 0, 0x00000000 },
{ 0x2, 0x1, 0x7, 0, 0x21000000, 4, 0x00000000 },
{ 0x2, 0x2, 0x0, 0, 0x0b040000, 0, 0x00000000 },
{ 0x2, 0x2, 0x1, 0, 0x0b840000, 1, 0x00000000 },
{ 0x2, 0x3, 0x0, 0, 0x0b230000, 0, 0x00000000 },
{ 0x2, 0x3, 0x1, 0, 0x0ba30000, 1, 0x00000000 },
{ 0x2, 0x4, 0x0, 0, 0x0b050000, 0, 0x00000000 },
{ 0x2, 0x4, 0x1, 0, 0x0b850000, 1, 0x00000000 },
{ 0x2, 0x5, 0x0, 0, 0x0b060000, 0, 0x00000000 },
{ 0x2, 0x5, 0x1, 0, 0x0b070000, 1, 0x00010000 },
{ 0x2, 0x5, 0x2, 0, 0x0b080000, 2, 0x00020000 },
{ 0x2, 0x5, 0x3, 0, 0x0b090000, 3, 0x00030000 },
{ 0x2, 0x5, 0x4, 0, 0x0b0a0000, 4, 0x00040000 },
{ 0x2, 0x5, 0x5, 0, 0x0b0b0000, 5, 0x00050000 },
{ 0x2, 0x5, 0x6, 0, 0x0b0c0000, 6, 0x00060000 },
{ 0x2, 0x5, 0x7, 0, 0x0b0d0000, 7, 0x00070000 },
{ 0x2, 0x5, 0x8, 0, 0x0b0e0000, 8, 0x00080000 },
{ 0x2, 0x5, 0x9, 0, 0x0b860000, 9, 0x00000000 },
{ 0x2, 0x5, 0xa, 0, 0x0b870000, 10, 0x00010000 },
{ 0x2, 0x5, 0xb, 0, 0x0b880000, 11, 0x00020000 },
{ 0x2, 0x5, 0xc, 0, 0x0b890000, 12, 0x00030000 },
{ 0x2, 0x5, 0xd, 0, 0x0b8a0000, 13, 0x00040000 },
{ 0x2, 0x5, 0xe, 0, 0x0b8b0000, 14, 0x00050000 },
{ 0x2, 0x5, 0xf, 0, 0x0b8c0000, 15, 0x00060000 },
{ 0x2, 0x5, 0x10, 0, 0x0b8d0000, 16, 0x00070000 },
{ 0x2, 0x5, 0x11, 0, 0x0b8e0000, 17, 0x00080000 },
{ 0x2, 0x6, 0x0, 0, 0x0b650000, 0, 0x00000000 },
{ 0x2, 0x6, 0x1, 0, 0x0be50000, 1, 0x00000000 },
{ 0x2, 0x7, 0x0, 0, 0x20df0000, 0, 0x00000000 },
{ 0x2, 0x7, 0x1, 0, 0x210f0000, 1, 0x00000000 },
{ 0x2, 0x8, 0x0, 0, 0x0b3e0000, 0, 0x00000000 },
{ 0x2, 0x8, 0x1, 0, 0x0bbe0000, 1, 0x00000000 },
{ 0x2, 0x9, 0x0, 0, 0x0b3d0000, 0, 0x00000000 },
{ 0x2, 0x9, 0x1, 0, 0x0bbd0000, 1, 0x00000000 },
{ 0x2, 0xa, 0x0, 0, 0x0b1e0000, 0, 0x00000000 },
{ 0x2, 0xa, 0x1, 0, 0x0b9e0000, 1, 0x00000000 },
{ 0x2, 0xb, 0x0, 0, 0x0b150000, 0, 0x00000000 },
{ 0x2, 0xb, 0x1, 0, 0x0b160000, 1, 0x00010000 },
{ 0x2, 0xb, 0x2, 0, 0x0b170000, 2, 0x00020000 },
{ 0x2, 0xb, 0x3, 0, 0x0b180000, 3, 0x00030000 },
{ 0x2, 0xb, 0x4, 0, 0x0b190000, 4, 0x00040000 },
{ 0x2, 0xb, 0x5, 0, 0x0b1a0000, 5, 0x00050000 },
{ 0x2, 0xb, 0x6, 0, 0x0b1b0000, 6, 0x00060000 },
{ 0x2, 0xb, 0x7, 0, 0x0b1c0000, 7, 0x00070000 },
{ 0x2, 0xb, 0x8, 0, 0x0b1d0000, 8, 0x00080000 },
{ 0x2, 0xb, 0x9, 0, 0x0b950000, 9, 0x00000000 },
{ 0x2, 0xb, 0xa, 0, 0x0b960000, 10, 0x00010000 },
{ 0x2, 0xb, 0xb, 0, 0x0b970000, 11, 0x00020000 },
{ 0x2, 0xb, 0xc, 0, 0x0b980000, 12, 0x00030000 },
{ 0x2, 0xb, 0xd, 0, 0x0b990000, 13, 0x00040000 },
{ 0x2, 0xb, 0xe, 0, 0x0b9a0000, 14, 0x00050000 },
{ 0x2, 0xb, 0xf, 0, 0x0b9b0000, 15, 0x00060000 },
{ 0x2, 0xb, 0x10, 0, 0x0b9c0000, 16, 0x00070000 },
{ 0x2, 0xb, 0x11, 0, 0x0b9d0000, 17, 0x00080000 },
{ 0x2, 0xc, 0x0, 0, 0x0b660000, 0, 0x00000000 },
{ 0x2, 0xc, 0x1, 0, 0x0be60000, 1, 0x00000000 },
{ 0x2, 0xd, 0x0, 0, 0x0b1f0000, 0, 0x00000000 },
{ 0x2, 0xd, 0x1, 0, 0x0b200000, 1, 0x00010000 },
{ 0x2, 0xd, 0x2, 0, 0x0b210000, 2, 0x00020000 },
{ 0x2, 0xd, 0x3, 0, 0x0b220000, 3, 0x00030000 },
{ 0x2, 0xd, 0x4, 0, 0x0b9f0000, 4, 0x00000000 },
{ 0x2, 0xd, 0x5, 0, 0x0ba00000, 5, 0x00010000 },
{ 0x2, 0xd, 0x6, 0, 0x0ba10000, 6, 0x00020000 },
{ 0x2, 0xd, 0x7, 0, 0x0ba20000, 7, 0x00030000 },
{ 0x2, 0xe, 0x0, 0, 0x0b0f0000, 0, 0x00000000 },
{ 0x2, 0xe, 0x1, 0, 0x0b100000, 1, 0x00010000 },
{ 0x2, 0xe, 0x2, 0, 0x0b110000, 2, 0x00020000 },
{ 0x2, 0xe, 0x3, 0, 0x0b120000, 3, 0x00030000 },
{ 0x2, 0xe, 0x4, 0, 0x0b130000, 4, 0x00040000 },
{ 0x2, 0xe, 0x5, 0, 0x0b140000, 5, 0x00050000 },
{ 0x2, 0xe, 0x6, 0, 0x0b8f0000, 6, 0x00000000 },
{ 0x2, 0xe, 0x7, 0, 0x0b900000, 7, 0x00010000 },
{ 0x2, 0xe, 0x8, 0, 0x0b910000, 8, 0x00020000 },
{ 0x2, 0xe, 0x9, 0, 0x0b920000, 9, 0x00030000 },
{ 0x2, 0xe, 0xa, 0, 0x0b930000, 10, 0x00040000 },
{ 0x2, 0xe, 0xb, 0, 0x0b940000, 11, 0x00050000 },
{ 0x2, 0x10, 0x0, 0, 0x0b240000, 0, 0x00000000 },
{ 0x2, 0x10, 0x1, 0, 0x0ba40000, 1, 0x00000000 },
{ 0x2, 0x11, 0x0, 0, 0x0b020000, 0, 0x00000000 },
{ 0x2, 0x11, 0x1, 0, 0x0b820000, 1, 0x00000000 },
{ 0x2, 0x12, 0x0, 0, 0x0b030000, 0, 0x00000000 },
{ 0x2, 0x12, 0x1, 0, 0x0b830000, 1, 0x00000000 },
{ 0x2, 0x17, 0x0, 0, 0x0b640000, 0, 0x00000000 },
{ 0x2, 0x17, 0x1, 0, 0x0be40000, 1, 0x00000000 },
{ 0x2, 0x18, 0x0, 0, 0x0b600000, 0, 0x00000000 },
{ 0x2, 0x18, 0x1, 0, 0x0be00000, 1, 0x00000000 },
{ 0x2, 0x18, 0x2, 0, 0x00000000, 0, 0x00000000 },
{ 0x2, 0x18, 0x3, 0, 0x00000000, 0, 0x00000000 },
{ 0x3, 0x14, 0x0, 0, 0x40000000, 0, 0x40000000 },
{ 0x3, 0x14, 0x1, 1, 0x80000000, 1, 0x80000000 },
{ 0x3, 0x16, 0x0, 2, 0x0b400000, 0, 0x0b400000 },
{ 0x3, 0x16, 0x1, 2, 0x0bc00000, 1, 0x0bc00000 },
{ 0x3, 0x16, 0x2, 0, 0x00000000, 0, 0x00000000 },
{ 0x3, 0x16, 0x3, 0, 0x00000000, 0, 0x00000000 },
{ 0x4, 0x15, 0x0, 0, 0x20c00000, 8, 0x20c00000 },
{ 0x4, 0x15, 0x1, 0, 0x21100000, 22, 0x21100000 },
{ 0x4, 0x15, 0x2, 0, 0x20e00000, 9, 0x20e00000 },
{ 0x4, 0x15, 0x3, 0, 0x21200000, 23, 0x21200000 },
{ 0x4, 0x15, 0x4, 0, 0x20800000, 7, 0x20800000 },
{ 0x4, 0x15, 0x5, 0, 0x21400000, 24, 0x21400000 },
{ 0x4, 0x15, 0x6, 0, 0x0b000000, 18, 0x0b000000 },
{ 0x4, 0x15, 0x7, 0, 0x0b800000, 3, 0x0b800000 },
{ 0x4, 0x15, 0x8, 0, 0x20000000, 6, 0x20000000 },
{ 0x4, 0x15, 0x9, 0, 0x21800000, 25, 0x21800000 },
{ 0x4, 0x15, 0xa, 0, 0x0a000000, 2, 0x0a000000 },
{ 0x4, 0x15, 0xb, 0, 0x0a000000, 17, 0x0a000000 },
{ 0x4, 0x15, 0xc, 0, 0x20000000, 21, 0x20000000 },
{ 0x4, 0x15, 0xd, 0, 0x21000000, 10, 0x21000000 },
{ 0x4, 0x15, 0xe, 0, 0x08000000, 1, 0x08000000 },
{ 0x4, 0x15, 0xf, 0, 0x08000000, 16, 0x08000000 },
{ 0x4, 0x15, 0x10, 0, 0x22000000, 11, 0x22000000 },
{ 0x4, 0x15, 0x11, 0, 0x22000000, 26, 0x22000000 },
{ 0x4, 0x15, 0x12, 0, 0x0c000000, 4, 0x0c000000 },
{ 0x4, 0x15, 0x13, 0, 0x0c000000, 19, 0x0c000000 },
{ 0x4, 0x15, 0x14, 0, 0x24000000, 12, 0x24000000 },
{ 0x4, 0x15, 0x15, 0, 0x24000000, 27, 0x24000000 },
{ 0x4, 0x15, 0x16, 0, 0x00000000, 0, 0x00000000 },
{ 0x4, 0x15, 0x17, 0, 0x00000000, 15, 0x00000000 },
{ 0x4, 0x15, 0x18, 0, 0x28000000, 13, 0x28000000 },
{ 0x4, 0x15, 0x19, 0, 0x28000000, 28, 0x28000000 },
{ 0x4, 0x15, 0x1a, 0, 0x10000000, 5, 0x10000000 },
{ 0x4, 0x15, 0x1b, 0, 0x10000000, 20, 0x10000000 },
{ 0x4, 0x15, 0x1c, 0, 0x30000000, 14, 0x30000000 },
{ 0x4, 0x15, 0x1d, 0, 0x30000000, 29, 0x30000000 },
{ 0x4, 0x0, 0x0, 0, 0x0b000000, 0, 0x00000000 },
{ 0x4, 0x0, 0x1, 0, 0x0b800000, 1, 0x00000000 },
{ 0x4, 0x1, 0x0, 0, 0x20de0000, 3, 0x000e0000 },
{ 0x4, 0x1, 0x1, 0, 0x210e0000, 7, 0x000e0000 },
{ 0x4, 0x1, 0x2, 0, 0x20dc0000, 2, 0x000c0000 },
{ 0x4, 0x1, 0x3, 0, 0x210c0000, 6, 0x000c0000 },
{ 0x4, 0x1, 0x4, 0, 0x20d80000, 1, 0x00080000 },
{ 0x4, 0x1, 0x5, 0, 0x21080000, 5, 0x00080000 },
{ 0x4, 0x1, 0x6, 0, 0x20d00000, 0, 0x00000000 },
{ 0x4, 0x1, 0x7, 0, 0x21000000, 4, 0x00000000 },
{ 0x4, 0x2, 0x0, 0, 0x0b040000, 0, 0x00000000 },
{ 0x4, 0x2, 0x1, 0, 0x0b840000, 1, 0x00000000 },
{ 0x4, 0x3, 0x0, 0, 0x0b230000, 0, 0x00000000 },
{ 0x4, 0x3, 0x1, 0, 0x0ba30000, 1, 0x00000000 },
{ 0x4, 0x4, 0x0, 0, 0x0b050000, 0, 0x00000000 },
{ 0x4, 0x4, 0x1, 0, 0x0b850000, 1, 0x00000000 },
{ 0x4, 0x5, 0x0, 0, 0x0b060000, 0, 0x00000000 },
{ 0x4, 0x5, 0x1, 0, 0x0b070000, 1, 0x00010000 },
{ 0x4, 0x5, 0x2, 0, 0x0b080000, 2, 0x00020000 },
{ 0x4, 0x5, 0x3, 0, 0x0b090000, 3, 0x00030000 },
{ 0x4, 0x5, 0x4, 0, 0x0b0a0000, 4, 0x00040000 },
{ 0x4, 0x5, 0x5, 0, 0x0b0b0000, 5, 0x00050000 },
{ 0x4, 0x5, 0x6, 0, 0x0b0c0000, 6, 0x00060000 },
{ 0x4, 0x5, 0x7, 0, 0x0b0d0000, 7, 0x00070000 },
{ 0x4, 0x5, 0x8, 0, 0x0b0e0000, 8, 0x00080000 },
{ 0x4, 0x5, 0x9, 0, 0x0b860000, 9, 0x00000000 },
{ 0x4, 0x5, 0xa, 0, 0x0b870000, 10, 0x00010000 },
{ 0x4, 0x5, 0xb, 0, 0x0b880000, 11, 0x00020000 },
{ 0x4, 0x5, 0xc, 0, 0x0b890000, 12, 0x00030000 },
{ 0x4, 0x5, 0xd, 0, 0x0b8a0000, 13, 0x00040000 },
{ 0x4, 0x5, 0xe, 0, 0x0b8b0000, 14, 0x00050000 },
{ 0x4, 0x5, 0xf, 0, 0x0b8c0000, 15, 0x00060000 },
{ 0x4, 0x5, 0x10, 0, 0x0b8d0000, 16, 0x00070000 },
{ 0x4, 0x5, 0x11, 0, 0x0b8e0000, 17, 0x00080000 },
{ 0x4, 0x6, 0x0, 0, 0x0b650000, 0, 0x00000000 },
{ 0x4, 0x6, 0x1, 0, 0x0be50000, 1, 0x00000000 },
{ 0x4, 0x7, 0x0, 0, 0x20df0000, 0, 0x00000000 },
{ 0x4, 0x7, 0x1, 0, 0x210f0000, 1, 0x00000000 },
{ 0x4, 0x8, 0x0, 0, 0x0b3e0000, 0, 0x00000000 },
{ 0x4, 0x8, 0x1, 0, 0x0bbe0000, 1, 0x00000000 },
{ 0x4, 0x9, 0x0, 0, 0x0b3d0000, 0, 0x00000000 },
{ 0x4, 0x9, 0x1, 0, 0x0bbd0000, 1, 0x00000000 },
{ 0x4, 0xa, 0x0, 0, 0x0b1e0000, 0, 0x00000000 },
{ 0x4, 0xa, 0x1, 0, 0x0b9e0000, 1, 0x00000000 },
{ 0x4, 0xb, 0x0, 0, 0x0b150000, 0, 0x00000000 },
{ 0x4, 0xb, 0x1, 0, 0x0b160000, 1, 0x00010000 },
{ 0x4, 0xb, 0x2, 0, 0x0b170000, 2, 0x00020000 },
{ 0x4, 0xb, 0x3, 0, 0x0b180000, 3, 0x00030000 },
{ 0x4, 0xb, 0x4, 0, 0x0b190000, 4, 0x00040000 },
{ 0x4, 0xb, 0x5, 0, 0x0b1a0000, 5, 0x00050000 },
{ 0x4, 0xb, 0x6, 0, 0x0b1b0000, 6, 0x00060000 },
{ 0x4, 0xb, 0x7, 0, 0x0b1c0000, 7, 0x00070000 },
{ 0x4, 0xb, 0x8, 0, 0x0b1d0000, 8, 0x00080000 },
{ 0x4, 0xb, 0x9, 0, 0x0b950000, 9, 0x00000000 },
{ 0x4, 0xb, 0xa, 0, 0x0b960000, 10, 0x00010000 },
{ 0x4, 0xb, 0xb, 0, 0x0b970000, 11, 0x00020000 },
{ 0x4, 0xb, 0xc, 0, 0x0b980000, 12, 0x00030000 },
{ 0x4, 0xb, 0xd, 0, 0x0b990000, 13, 0x00040000 },
{ 0x4, 0xb, 0xe, 0, 0x0b9a0000, 14, 0x00050000 },
{ 0x4, 0xb, 0xf, 0, 0x0b9b0000, 15, 0x00060000 },
{ 0x4, 0xb, 0x10, 0, 0x0b9c0000, 16, 0x00070000 },
{ 0x4, 0xb, 0x11, 0, 0x0b9d0000, 17, 0x00080000 },
{ 0x4, 0xc, 0x0, 0, 0x0b660000, 0, 0x00000000 },
{ 0x4, 0xc, 0x1, 0, 0x0be60000, 1, 0x00000000 },
{ 0x4, 0xd, 0x0, 0, 0x0b1f0000, 0, 0x00000000 },
{ 0x4, 0xd, 0x1, 0, 0x0b200000, 1, 0x00010000 },
{ 0x4, 0xd, 0x2, 0, 0x0b210000, 2, 0x00020000 },
{ 0x4, 0xd, 0x3, 0, 0x0b220000, 3, 0x00030000 },
{ 0x4, 0xd, 0x4, 0, 0x0b9f0000, 4, 0x00000000 },
{ 0x4, 0xd, 0x5, 0, 0x0ba00000, 5, 0x00010000 },
{ 0x4, 0xd, 0x6, 0, 0x0ba10000, 6, 0x00020000 },
{ 0x4, 0xd, 0x7, 0, 0x0ba20000, 7, 0x00030000 },
{ 0x4, 0xe, 0x0, 0, 0x0b0f0000, 0, 0x00000000 },
{ 0x4, 0xe, 0x1, 0, 0x0b100000, 1, 0x00010000 },
{ 0x4, 0xe, 0x2, 0, 0x0b110000, 2, 0x00020000 },
{ 0x4, 0xe, 0x3, 0, 0x0b120000, 3, 0x00030000 },
{ 0x4, 0xe, 0x4, 0, 0x0b130000, 4, 0x00040000 },
{ 0x4, 0xe, 0x5, 0, 0x0b140000, 5, 0x00050000 },
{ 0x4, 0xe, 0x6, 0, 0x0b8f0000, 6, 0x00000000 },
{ 0x4, 0xe, 0x7, 0, 0x0b900000, 7, 0x00010000 },
{ 0x4, 0xe, 0x8, 0, 0x0b910000, 8, 0x00020000 },
{ 0x4, 0xe, 0x9, 0, 0x0b920000, 9, 0x00030000 },
{ 0x4, 0xe, 0xa, 0, 0x0b930000, 10, 0x00040000 },
{ 0x4, 0xe, 0xb, 0, 0x0b940000, 11, 0x00050000 },
{ 0x4, 0x10, 0x0, 0, 0x0b240000, 0, 0x00000000 },
{ 0x4, 0x10, 0x1, 0, 0x0ba40000, 1, 0x00000000 },
{ 0x4, 0x11, 0x0, 0, 0x0b020000, 0, 0x00000000 },
{ 0x4, 0x11, 0x1, 0, 0x0b820000, 1, 0x00000000 },
{ 0x4, 0x12, 0x0, 0, 0x0b030000, 0, 0x00000000 },
{ 0x4, 0x12, 0x1, 0, 0x0b830000, 1, 0x00000000 },
{ 0x4, 0x17, 0x0, 0, 0x0b640000, 0, 0x00000000 },
{ 0x4, 0x17, 0x1, 0, 0x0be40000, 1, 0x00000000 },
{ 0x4, 0x18, 0x0, 0, 0x0b600000, 0, 0x00000000 },
{ 0x4, 0x18, 0x1, 0, 0x0be00000, 1, 0x00000000 },
{ 0x4, 0x18, 0x2, 0, 0x00000000, 0, 0x00000000 },
{ 0x4, 0x18, 0x3, 0, 0x00000000, 0, 0x00000000 }
};
static void cbbcentralnoc_parse_routeid(struct tegra194_cbb_aperture *info, u64 routeid)
{
info->initflow = FIELD_GET(CBB_NOC_INITFLOW, routeid);
info->targflow = FIELD_GET(CBB_NOC_TARGFLOW, routeid);
info->targ_subrange = FIELD_GET(CBB_NOC_TARG_SUBRANGE, routeid);
info->seqid = FIELD_GET(CBB_NOC_SEQID, routeid);
}
static void bpmpnoc_parse_routeid(struct tegra194_cbb_aperture *info, u64 routeid)
{
info->initflow = FIELD_GET(BPMP_NOC_INITFLOW, routeid);
info->targflow = FIELD_GET(BPMP_NOC_TARGFLOW, routeid);
info->targ_subrange = FIELD_GET(BPMP_NOC_TARG_SUBRANGE, routeid);
info->seqid = FIELD_GET(BPMP_NOC_SEQID, routeid);
}
static void aonnoc_parse_routeid(struct tegra194_cbb_aperture *info, u64 routeid)
{
info->initflow = FIELD_GET(AON_NOC_INITFLOW, routeid);
info->targflow = FIELD_GET(AON_NOC_TARGFLOW, routeid);
info->targ_subrange = FIELD_GET(AON_NOC_TARG_SUBRANGE, routeid);
info->seqid = FIELD_GET(AON_NOC_SEQID, routeid);
}
static void scenoc_parse_routeid(struct tegra194_cbb_aperture *info, u64 routeid)
{
info->initflow = FIELD_GET(SCE_NOC_INITFLOW, routeid);
info->targflow = FIELD_GET(SCE_NOC_TARGFLOW, routeid);
info->targ_subrange = FIELD_GET(SCE_NOC_TARG_SUBRANGE, routeid);
info->seqid = FIELD_GET(SCE_NOC_SEQID, routeid);
}
static void cbbcentralnoc_parse_userbits(struct tegra194_cbb_userbits *usrbits, u32 elog_5)
{
usrbits->axcache = FIELD_GET(CBB_NOC_AXCACHE, elog_5);
usrbits->non_mod = FIELD_GET(CBB_NOC_NON_MOD, elog_5);
usrbits->axprot = FIELD_GET(CBB_NOC_AXPROT, elog_5);
usrbits->falconsec = FIELD_GET(CBB_NOC_FALCONSEC, elog_5);
usrbits->grpsec = FIELD_GET(CBB_NOC_GRPSEC, elog_5);
usrbits->vqc = FIELD_GET(CBB_NOC_VQC, elog_5);
usrbits->mstr_id = FIELD_GET(CBB_NOC_MSTR_ID, elog_5) - 1;
usrbits->axi_id = FIELD_GET(CBB_NOC_AXI_ID, elog_5);
}
static void clusternoc_parse_userbits(struct tegra194_cbb_userbits *usrbits, u32 elog_5)
{
usrbits->axcache = FIELD_GET(CLUSTER_NOC_AXCACHE, elog_5);
usrbits->axprot = FIELD_GET(CLUSTER_NOC_AXCACHE, elog_5);
usrbits->falconsec = FIELD_GET(CLUSTER_NOC_FALCONSEC, elog_5);
usrbits->grpsec = FIELD_GET(CLUSTER_NOC_GRPSEC, elog_5);
usrbits->vqc = FIELD_GET(CLUSTER_NOC_VQC, elog_5);
usrbits->mstr_id = FIELD_GET(CLUSTER_NOC_MSTR_ID, elog_5) - 1;
}
static void tegra194_cbb_fault_enable(struct tegra_cbb *cbb)
{
struct tegra194_cbb *priv = to_tegra194_cbb(cbb);
writel(1, priv->regs + ERRLOGGER_0_FAULTEN_0);
writel(1, priv->regs + ERRLOGGER_1_FAULTEN_0);
writel(1, priv->regs + ERRLOGGER_2_FAULTEN_0);
}
static void tegra194_cbb_stall_enable(struct tegra_cbb *cbb)
{
struct tegra194_cbb *priv = to_tegra194_cbb(cbb);
writel(1, priv->regs + ERRLOGGER_0_STALLEN_0);
writel(1, priv->regs + ERRLOGGER_1_STALLEN_0);
writel(1, priv->regs + ERRLOGGER_2_STALLEN_0);
}
static void tegra194_cbb_error_clear(struct tegra_cbb *cbb)
{
struct tegra194_cbb *priv = to_tegra194_cbb(cbb);
writel(1, priv->regs + ERRLOGGER_0_ERRCLR_0);
writel(1, priv->regs + ERRLOGGER_1_ERRCLR_0);
writel(1, priv->regs + ERRLOGGER_2_ERRCLR_0);
dsb(sy);
}
static u32 tegra194_cbb_get_status(struct tegra_cbb *cbb)
{
struct tegra194_cbb *priv = to_tegra194_cbb(cbb);
u32 value;
value = readl(priv->regs + ERRLOGGER_0_ERRVLD_0);
value |= (readl(priv->regs + ERRLOGGER_1_ERRVLD_0) << 1);
value |= (readl(priv->regs + ERRLOGGER_2_ERRVLD_0) << 2);
dsb(sy);
return value;
}
static u32 tegra194_axi2apb_status(void __iomem *addr)
{
u32 value;
value = readl(addr + DMAAPB_X_RAW_INTERRUPT_STATUS);
writel(0xffffffff, addr + DMAAPB_X_RAW_INTERRUPT_STATUS);
return value;
}
static bool tegra194_axi2apb_fatal(struct seq_file *file, unsigned int bridge, u32 status)
{
bool is_fatal = true;
size_t i;
for (i = 0; i < ARRAY_SIZE(tegra194_axi2apb_error); i++) {
if (status & BIT(i)) {
tegra_cbb_print_err(file, "\t AXI2APB_%d bridge error: %s\n",
bridge + 1, tegra194_axi2apb_error[i]);
if (strstr(tegra194_axi2apb_error[i], "Firewall"))
is_fatal = false;
}
}
return is_fatal;
}
/*
* Fetch InitlocalAddress from NOC Aperture lookup table
* using Targflow, Targsubrange
*/
static u32 get_init_localaddress(const struct tegra194_cbb_aperture *info,
const struct tegra194_cbb_aperture *aper, unsigned int max)
{
unsigned int t_f = 0, t_sr = 0;
u32 addr = 0;
for (t_f = 0; t_f < max; t_f++) {
if (aper[t_f].targflow == info->targflow) {
t_sr = t_f;
do {
if (aper[t_sr].targ_subrange == info->targ_subrange) {
addr = aper[t_sr].init_localaddress;
return addr;
}
if (t_sr >= max)
return 0;
t_sr++;
} while (aper[t_sr].targflow == aper[t_sr - 1].targflow);
t_f = t_sr;
}
}
return addr;
}
static void print_errlog5(struct seq_file *file, struct tegra194_cbb *cbb)
{
struct tegra194_cbb_userbits userbits;
cbb->noc->parse_userbits(&userbits, cbb->errlog5);
if (!strcmp(cbb->noc->name, "cbb-noc")) {
tegra_cbb_print_err(file, "\t Non-Modify\t\t: %#x\n", userbits.non_mod);
tegra_cbb_print_err(file, "\t AXI ID\t\t: %#x\n", userbits.axi_id);
}
tegra_cbb_print_err(file, "\t Master ID\t\t: %s\n",
cbb->noc->master_id[userbits.mstr_id]);
tegra_cbb_print_err(file, "\t Security Group(GRPSEC): %#x\n", userbits.grpsec);
tegra_cbb_print_cache(file, userbits.axcache);
tegra_cbb_print_prot(file, userbits.axprot);
tegra_cbb_print_err(file, "\t FALCONSEC\t\t: %#x\n", userbits.falconsec);
tegra_cbb_print_err(file, "\t Virtual Queuing Channel(VQC): %#x\n", userbits.vqc);
}
/*
* Fetch Base Address/InitlocalAddress from NOC aperture lookup table using TargFlow &
* Targ_subRange extracted from RouteId. Perform address reconstruction as below:
*
* Address = Base Address + (ErrLog3 + ErrLog4)
*/
static void
print_errlog3_4(struct seq_file *file, u32 errlog3, u32 errlog4,
const struct tegra194_cbb_aperture *info,
const struct tegra194_cbb_aperture *aperture, unsigned int max)
{
u64 addr = (u64)errlog4 << 32 | errlog3;
/*
* If errlog4[7] = "1", then it's a joker entry. Joker entries are a rare phenomenon and
* such addresses are not reliable. Debugging should be done using only the RouteId
* information.
*/
if (errlog4 & 0x80)
tegra_cbb_print_err(file, "\t debug using RouteId alone as below address is a "
"joker entry and not reliable");
addr += get_init_localaddress(info, aperture, max);
tegra_cbb_print_err(file, "\t Address accessed\t: %#llx\n", addr);
}
/*
* Get RouteId from ErrLog1+ErrLog2 registers and fetch values of
* InitFlow, TargFlow, Targ_subRange and SeqId values from RouteId
*/
static void
print_errlog1_2(struct seq_file *file, struct tegra194_cbb *cbb,
struct tegra194_cbb_aperture *info)
{
u64 routeid = (u64)cbb->errlog2 << 32 | cbb->errlog1;
u32 seqid = 0;
tegra_cbb_print_err(file, "\t RouteId\t\t: %#llx\n", routeid);
cbb->noc->parse_routeid(info, routeid);
tegra_cbb_print_err(file, "\t InitFlow\t\t: %s\n",
cbb->noc->routeid_initflow[info->initflow]);
tegra_cbb_print_err(file, "\t Targflow\t\t: %s\n",
cbb->noc->routeid_targflow[info->targflow]);
tegra_cbb_print_err(file, "\t TargSubRange\t\t: %d\n", info->targ_subrange);
tegra_cbb_print_err(file, "\t SeqId\t\t\t: %d\n", seqid);
}
/*
* Print transcation type, error code and description from ErrLog0 for all
* errors. For NOC slave errors, all relevant error info is printed using
* ErrLog0 only. But additional information is printed for errors from
* APB slaves because for them:
* - All errors are logged as SLV(slave) errors due to APB having only single
* bit pslverr to report all errors.
* - Exact cause is printed by reading DMAAPB_X_RAW_INTERRUPT_STATUS register.
* - The driver prints information showing AXI2APB bridge and exact error
* only if there is error in any AXI2APB slave.
* - There is still no way to disambiguate a DEC error from SLV error type.
*/
static bool print_errlog0(struct seq_file *file, struct tegra194_cbb *cbb)
{
struct tegra194_cbb_packet_header hdr;
bool is_fatal = true;
hdr.lock = cbb->errlog0 & 0x1;
hdr.opc = FIELD_GET(CBB_ERR_OPC, cbb->errlog0);
hdr.errcode = FIELD_GET(CBB_ERR_ERRCODE, cbb->errlog0);
hdr.len1 = FIELD_GET(CBB_ERR_LEN1, cbb->errlog0);
hdr.format = (cbb->errlog0 >> 31);
tegra_cbb_print_err(file, "\t Transaction Type\t: %s\n",
tegra194_cbb_trantype[hdr.opc]);
tegra_cbb_print_err(file, "\t Error Code\t\t: %s\n",
tegra194_cbb_errors[hdr.errcode].code);
tegra_cbb_print_err(file, "\t Error Source\t\t: %s\n",
tegra194_cbb_errors[hdr.errcode].source);
tegra_cbb_print_err(file, "\t Error Description\t: %s\n",
tegra194_cbb_errors[hdr.errcode].desc);
/*
* Do not crash system for errors which are only notifications to indicate a transaction
* was not allowed to be attempted.
*/
if (!strcmp(tegra194_cbb_errors[hdr.errcode].code, "SEC") ||
!strcmp(tegra194_cbb_errors[hdr.errcode].code, "DEC") ||
!strcmp(tegra194_cbb_errors[hdr.errcode].code, "UNS") ||
!strcmp(tegra194_cbb_errors[hdr.errcode].code, "DISC")) {
is_fatal = false;
} else if (!strcmp(tegra194_cbb_errors[hdr.errcode].code, "SLV") &&
cbb->num_bridges > 0) {
unsigned int i;
u32 status;
/* For all SLV errors, read DMAAPB_X_RAW_INTERRUPT_STATUS
* register to get error status for all AXI2APB bridges.
* Print bridge details if a bit is set in a bridge's
* status register due to error in a APB slave connected
* to that bridge. For other NOC slaves, none of the status
* register will be set.
*/
for (i = 0; i < cbb->num_bridges; i++) {
status = tegra194_axi2apb_status(cbb->bridges[i].base);
if (status)
is_fatal = tegra194_axi2apb_fatal(file, i, status);
}
}
tegra_cbb_print_err(file, "\t Packet header Lock\t: %d\n", hdr.lock);
tegra_cbb_print_err(file, "\t Packet header Len1\t: %d\n", hdr.len1);
if (hdr.format)
tegra_cbb_print_err(file, "\t NOC protocol version\t: %s\n",
"version >= 2.7");
else
tegra_cbb_print_err(file, "\t NOC protocol version\t: %s\n",
"version < 2.7");
return is_fatal;
}
/*
* Print debug information about failed transaction using
* ErrLog registers of error loggger having ErrVld set
*/
static bool print_errloggerX_info(struct seq_file *file, struct tegra194_cbb *cbb,
int errloggerX)
{
struct tegra194_cbb_aperture info = { 0, };
bool is_fatal = true;
tegra_cbb_print_err(file, "\tError Logger\t\t: %d\n", errloggerX);
if (errloggerX == 0) {
cbb->errlog0 = readl(cbb->regs + ERRLOGGER_0_ERRLOG0_0);
cbb->errlog1 = readl(cbb->regs + ERRLOGGER_0_ERRLOG1_0);
cbb->errlog2 = readl(cbb->regs + ERRLOGGER_0_RSVD_00_0);
cbb->errlog3 = readl(cbb->regs + ERRLOGGER_0_ERRLOG3_0);
cbb->errlog4 = readl(cbb->regs + ERRLOGGER_0_ERRLOG4_0);
cbb->errlog5 = readl(cbb->regs + ERRLOGGER_0_ERRLOG5_0);
} else if (errloggerX == 1) {
cbb->errlog0 = readl(cbb->regs + ERRLOGGER_1_ERRLOG0_0);
cbb->errlog1 = readl(cbb->regs + ERRLOGGER_1_ERRLOG1_0);
cbb->errlog2 = readl(cbb->regs + ERRLOGGER_1_RSVD_00_0);
cbb->errlog3 = readl(cbb->regs + ERRLOGGER_1_ERRLOG3_0);
cbb->errlog4 = readl(cbb->regs + ERRLOGGER_1_ERRLOG4_0);
cbb->errlog5 = readl(cbb->regs + ERRLOGGER_1_ERRLOG5_0);
} else if (errloggerX == 2) {
cbb->errlog0 = readl(cbb->regs + ERRLOGGER_2_ERRLOG0_0);
cbb->errlog1 = readl(cbb->regs + ERRLOGGER_2_ERRLOG1_0);
cbb->errlog2 = readl(cbb->regs + ERRLOGGER_2_RSVD_00_0);
cbb->errlog3 = readl(cbb->regs + ERRLOGGER_2_ERRLOG3_0);
cbb->errlog4 = readl(cbb->regs + ERRLOGGER_2_ERRLOG4_0);
cbb->errlog5 = readl(cbb->regs + ERRLOGGER_2_ERRLOG5_0);
}
tegra_cbb_print_err(file, "\tErrLog0\t\t\t: %#x\n", cbb->errlog0);
is_fatal = print_errlog0(file, cbb);
tegra_cbb_print_err(file, "\tErrLog1\t\t\t: %#x\n", cbb->errlog1);
tegra_cbb_print_err(file, "\tErrLog2\t\t\t: %#x\n", cbb->errlog2);
print_errlog1_2(file, cbb, &info);
tegra_cbb_print_err(file, "\tErrLog3\t\t\t: %#x\n", cbb->errlog3);
tegra_cbb_print_err(file, "\tErrLog4\t\t\t: %#x\n", cbb->errlog4);
print_errlog3_4(file, cbb->errlog3, cbb->errlog4, &info, cbb->noc->noc_aperture,
cbb->noc->max_aperture);
tegra_cbb_print_err(file, "\tErrLog5\t\t\t: %#x\n", cbb->errlog5);
if (cbb->errlog5)
print_errlog5(file, cbb);
return is_fatal;
}
static bool print_errlog(struct seq_file *file, struct tegra194_cbb *cbb, u32 errvld)
{
bool is_fatal = true;
pr_crit("**************************************\n");
pr_crit("CPU:%d, Error:%s\n", smp_processor_id(), cbb->noc->name);
if (errvld & 0x1)
is_fatal = print_errloggerX_info(file, cbb, 0);
else if (errvld & 0x2)
is_fatal = print_errloggerX_info(file, cbb, 1);
else if (errvld & 0x4)
is_fatal = print_errloggerX_info(file, cbb, 2);
tegra_cbb_error_clear(&cbb->base);
tegra_cbb_print_err(file, "\t**************************************\n");
return is_fatal;
}
#ifdef CONFIG_DEBUG_FS
static DEFINE_MUTEX(cbb_err_mutex);
static int tegra194_cbb_debugfs_show(struct tegra_cbb *cbb, struct seq_file *file, void *data)
{
struct tegra_cbb *noc;
mutex_lock(&cbb_err_mutex);
list_for_each_entry(noc, &cbb_list, node) {
struct tegra194_cbb *priv = to_tegra194_cbb(noc);
u32 status;
status = tegra_cbb_get_status(noc);
if (status)
print_errlog(file, priv, status);
}
mutex_unlock(&cbb_err_mutex);
return 0;
}
#endif
/*
* Handler for CBB errors from different initiators
*/
static irqreturn_t tegra194_cbb_err_isr(int irq, void *data)
{
bool is_inband_err = false, is_fatal = false;
//struct tegra194_cbb *cbb = data;
struct tegra_cbb *noc;
unsigned long flags;
u8 mstr_id = 0;
spin_lock_irqsave(&cbb_lock, flags);
/* XXX only process interrupts for "cbb" instead of iterating over all NOCs? */
list_for_each_entry(noc, &cbb_list, node) {
struct tegra194_cbb *priv = to_tegra194_cbb(noc);
u32 status = 0;
status = tegra_cbb_get_status(noc);
if (status && ((irq == priv->sec_irq) || (irq == priv->nonsec_irq))) {
tegra_cbb_print_err(NULL, "CPU:%d, Error: %s@%llx, irq=%d\n",
smp_processor_id(), priv->noc->name, priv->res->start,
irq);
mstr_id = FIELD_GET(USRBITS_MSTR_ID, priv->errlog5) - 1;
is_fatal = print_errlog(NULL, priv, status);
/*
* If illegal request is from CCPLEX(0x1)
* initiator then call BUG() to crash system.
*/
if ((mstr_id == 0x1) && priv->noc->erd_mask_inband_err)
is_inband_err = 1;
}
}
spin_unlock_irqrestore(&cbb_lock, flags);
if (is_inband_err) {
if (is_fatal)
BUG();
else
WARN(true, "Warning due to CBB Error\n");
}
return IRQ_HANDLED;
}
/*
* Register handler for CBB_NONSECURE & CBB_SECURE interrupts
* for reporting CBB errors
*/
static int tegra194_cbb_interrupt_enable(struct tegra_cbb *cbb)
{
struct tegra194_cbb *priv = to_tegra194_cbb(cbb);
struct device *dev = cbb->dev;
int err;
if (priv->sec_irq) {
err = devm_request_irq(dev, priv->sec_irq, tegra194_cbb_err_isr, 0, dev_name(dev),
priv);
if (err) {
dev_err(dev, "failed to register interrupt %u: %d\n", priv->sec_irq, err);
return err;
}
}
if (priv->nonsec_irq) {
err = devm_request_irq(dev, priv->nonsec_irq, tegra194_cbb_err_isr, 0,
dev_name(dev), priv);
if (err) {
dev_err(dev, "failed to register interrupt %u: %d\n", priv->nonsec_irq,
err);
return err;
}
}
return 0;
}
static void tegra194_cbb_error_enable(struct tegra_cbb *cbb)
{
/*
* Set “StallEn=1” to enable queuing of error packets till
* first is served & cleared
*/
tegra_cbb_stall_enable(cbb);
/* set “FaultEn=1” to enable error reporting signal “Fault” */
tegra_cbb_fault_enable(cbb);
}
static const struct tegra_cbb_ops tegra194_cbb_ops = {
.get_status = tegra194_cbb_get_status,
.error_clear = tegra194_cbb_error_clear,
.fault_enable = tegra194_cbb_fault_enable,
.stall_enable = tegra194_cbb_stall_enable,
.error_enable = tegra194_cbb_error_enable,
.interrupt_enable = tegra194_cbb_interrupt_enable,
#ifdef CONFIG_DEBUG_FS
.debugfs_show = tegra194_cbb_debugfs_show,
#endif
};
static struct tegra194_cbb_noc_data tegra194_cbb_central_noc_data = {
.name = "cbb-noc",
.erd_mask_inband_err = true,
.master_id = tegra194_master_id,
.noc_aperture = tegra194_cbbcentralnoc_apert_lookup,
.max_aperture = ARRAY_SIZE(tegra194_cbbcentralnoc_apert_lookup),
.routeid_initflow = tegra194_cbbcentralnoc_routeid_initflow,
.routeid_targflow = tegra194_cbbcentralnoc_routeid_targflow,
.parse_routeid = cbbcentralnoc_parse_routeid,
.parse_userbits = cbbcentralnoc_parse_userbits
};
static struct tegra194_cbb_noc_data tegra194_aon_noc_data = {
.name = "aon-noc",
.erd_mask_inband_err = false,
.master_id = tegra194_master_id,
.noc_aperture = tegra194_aonnoc_aperture_lookup,
.max_aperture = ARRAY_SIZE(tegra194_aonnoc_aperture_lookup),
.routeid_initflow = tegra194_aonnoc_routeid_initflow,
.routeid_targflow = tegra194_aonnoc_routeid_targflow,
.parse_routeid = aonnoc_parse_routeid,
.parse_userbits = clusternoc_parse_userbits
};
static struct tegra194_cbb_noc_data tegra194_bpmp_noc_data = {
.name = "bpmp-noc",
.erd_mask_inband_err = false,
.master_id = tegra194_master_id,
.noc_aperture = tegra194_bpmpnoc_apert_lookup,
.max_aperture = ARRAY_SIZE(tegra194_bpmpnoc_apert_lookup),
.routeid_initflow = tegra194_bpmpnoc_routeid_initflow,
.routeid_targflow = tegra194_bpmpnoc_routeid_targflow,
.parse_routeid = bpmpnoc_parse_routeid,
.parse_userbits = clusternoc_parse_userbits
};
static struct tegra194_cbb_noc_data tegra194_rce_noc_data = {
.name = "rce-noc",
.erd_mask_inband_err = false,
.master_id = tegra194_master_id,
.noc_aperture = tegra194_scenoc_apert_lookup,
.max_aperture = ARRAY_SIZE(tegra194_scenoc_apert_lookup),
.routeid_initflow = tegra194_scenoc_routeid_initflow,
.routeid_targflow = tegra194_scenoc_routeid_targflow,
.parse_routeid = scenoc_parse_routeid,
.parse_userbits = clusternoc_parse_userbits
};
static struct tegra194_cbb_noc_data tegra194_sce_noc_data = {
.name = "sce-noc",
.erd_mask_inband_err = false,
.master_id = tegra194_master_id,
.noc_aperture = tegra194_scenoc_apert_lookup,
.max_aperture = ARRAY_SIZE(tegra194_scenoc_apert_lookup),
.routeid_initflow = tegra194_scenoc_routeid_initflow,
.routeid_targflow = tegra194_scenoc_routeid_targflow,
.parse_routeid = scenoc_parse_routeid,
.parse_userbits = clusternoc_parse_userbits
};
static const struct of_device_id tegra194_cbb_match[] = {
{ .compatible = "nvidia,tegra194-cbb-noc", .data = &tegra194_cbb_central_noc_data },
{ .compatible = "nvidia,tegra194-aon-noc", .data = &tegra194_aon_noc_data },
{ .compatible = "nvidia,tegra194-bpmp-noc", .data = &tegra194_bpmp_noc_data },
{ .compatible = "nvidia,tegra194-rce-noc", .data = &tegra194_rce_noc_data },
{ .compatible = "nvidia,tegra194-sce-noc", .data = &tegra194_sce_noc_data },
{ /* sentinel */ }
};
MODULE_DEVICE_TABLE(of, tegra194_cbb_match);
static int tegra194_cbb_get_bridges(struct tegra194_cbb *cbb, struct device_node *np)
{
struct tegra_cbb *entry;
struct resource res;
unsigned long flags;
unsigned int i;
int err;
spin_lock_irqsave(&cbb_lock, flags);
list_for_each_entry(entry, &cbb_list, node) {
struct tegra194_cbb *priv = to_tegra194_cbb(entry);
if (priv->bridges) {
cbb->num_bridges = priv->num_bridges;
cbb->bridges = priv->bridges;
break;
}
}
spin_unlock_irqrestore(&cbb_lock, flags);
if (!cbb->bridges) {
while (of_address_to_resource(np, cbb->num_bridges, &res) == 0)
cbb->num_bridges++;
cbb->bridges = devm_kcalloc(cbb->base.dev, cbb->num_bridges,
sizeof(*cbb->bridges), GFP_KERNEL);
if (!cbb->bridges)
return -ENOMEM;
for (i = 0; i < cbb->num_bridges; i++) {
err = of_address_to_resource(np, i, &cbb->bridges[i].res);
if (err < 0)
return err;
cbb->bridges[i].base = devm_ioremap_resource(cbb->base.dev,
&cbb->bridges[i].res);
if (IS_ERR(cbb->bridges[i].base)) {
dev_err(cbb->base.dev, "failed to map AXI2APB range\n");
return PTR_ERR(cbb->bridges[i].base);
}
}
}
if (cbb->num_bridges > 0) {
dev_dbg(cbb->base.dev, "AXI2APB bridge info present:\n");
for (i = 0; i < cbb->num_bridges; i++)
dev_dbg(cbb->base.dev, " %u: %pR\n", i, &cbb->bridges[i].res);
}
return 0;
}
static int tegra194_cbb_probe(struct platform_device *pdev)
{
const struct tegra194_cbb_noc_data *noc;
struct tegra194_cbb *cbb;
struct device_node *np;
unsigned long flags;
int err;
noc = of_device_get_match_data(&pdev->dev);
if (noc->erd_mask_inband_err) {
/*
* Set Error Response Disable(ERD) bit to mask SError/inband
* error and only trigger interrupts for illegal access from
* CCPLEX initiator.
*/
err = tegra194_miscreg_mask_serror();
if (err) {
dev_err(&pdev->dev, "couldn't mask inband errors\n");
return err;
}
}
cbb = devm_kzalloc(&pdev->dev, sizeof(*cbb), GFP_KERNEL);
if (!cbb)
return -ENOMEM;
INIT_LIST_HEAD(&cbb->base.node);
cbb->base.ops = &tegra194_cbb_ops;
cbb->base.dev = &pdev->dev;
cbb->noc = noc;
cbb->regs = devm_platform_get_and_ioremap_resource(pdev, 0, &cbb->res);
if (IS_ERR(cbb->regs))
return PTR_ERR(cbb->regs);
err = tegra_cbb_get_irq(pdev, &cbb->nonsec_irq, &cbb->sec_irq);
if (err)
return err;
np = of_parse_phandle(pdev->dev.of_node, "nvidia,axi2apb", 0);
if (np) {
err = tegra194_cbb_get_bridges(cbb, np);
of_node_put(np);
if (err < 0)
return err;
}
platform_set_drvdata(pdev, cbb);
spin_lock_irqsave(&cbb_lock, flags);
list_add(&cbb->base.node, &cbb_list);
spin_unlock_irqrestore(&cbb_lock, flags);
return tegra_cbb_register(&cbb->base);
}
static int tegra194_cbb_remove(struct platform_device *pdev)
{
struct tegra194_cbb *cbb = platform_get_drvdata(pdev);
struct tegra_cbb *noc, *tmp;
unsigned long flags;
spin_lock_irqsave(&cbb_lock, flags);
list_for_each_entry_safe(noc, tmp, &cbb_list, node) {
struct tegra194_cbb *priv = to_tegra194_cbb(noc);
if (cbb->res->start == priv->res->start) {
list_del(&noc->node);
break;
}
}
spin_unlock_irqrestore(&cbb_lock, flags);
return 0;
}
static int __maybe_unused tegra194_cbb_resume_noirq(struct device *dev)
{
struct tegra194_cbb *cbb = dev_get_drvdata(dev);
tegra194_cbb_error_enable(&cbb->base);
dsb(sy);
dev_dbg(dev, "%s resumed\n", cbb->noc->name);
return 0;
}
static const struct dev_pm_ops tegra194_cbb_pm = {
SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(NULL, tegra194_cbb_resume_noirq)
};
static struct platform_driver tegra194_cbb_driver = {
.probe = tegra194_cbb_probe,
.remove = tegra194_cbb_remove,
.driver = {
.name = "tegra194-cbb",
.of_match_table = of_match_ptr(tegra194_cbb_match),
.pm = &tegra194_cbb_pm,
},
};
static int __init tegra194_cbb_init(void)
{
return platform_driver_register(&tegra194_cbb_driver);
}
pure_initcall(tegra194_cbb_init);
static void __exit tegra194_cbb_exit(void)
{
platform_driver_unregister(&tegra194_cbb_driver);
}
module_exit(tegra194_cbb_exit);
MODULE_AUTHOR("Sumit Gupta <sumitg@nvidia.com>");
MODULE_DESCRIPTION("Control Backbone error handling driver for Tegra194");
MODULE_LICENSE("GPL");
// SPDX-License-Identifier: GPL-2.0
/*
* Copyright (c) 2021-2022, NVIDIA CORPORATION. All rights reserved
*
* The driver handles Error's from Control Backbone(CBB) version 2.0.
* generated due to illegal accesses. The driver prints debug information
* about failed transaction on receiving interrupt from Error Notifier.
* Error types supported by CBB2.0 are:
* UNSUPPORTED_ERR, PWRDOWN_ERR, TIMEOUT_ERR, FIREWALL_ERR, DECODE_ERR,
* SLAVE_ERR
*/
#include <linux/acpi.h>
#include <linux/clk.h>
#include <linux/cpufeature.h>
#include <linux/debugfs.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/of_device.h>
#include <linux/platform_device.h>
#include <linux/device.h>
#include <linux/io.h>
#include <linux/of_irq.h>
#include <linux/of_address.h>
#include <linux/interrupt.h>
#include <linux/ioport.h>
#include <linux/version.h>
#include <soc/tegra/fuse.h>
#include <soc/tegra/tegra-cbb.h>
#define FABRIC_EN_CFG_INTERRUPT_ENABLE_0_0 0x0
#define FABRIC_EN_CFG_STATUS_0_0 0x40
#define FABRIC_EN_CFG_ADDR_INDEX_0_0 0x60
#define FABRIC_EN_CFG_ADDR_LOW_0 0x80
#define FABRIC_EN_CFG_ADDR_HI_0 0x84
#define FABRIC_MN_MASTER_ERR_EN_0 0x200
#define FABRIC_MN_MASTER_ERR_FORCE_0 0x204
#define FABRIC_MN_MASTER_ERR_STATUS_0 0x208
#define FABRIC_MN_MASTER_ERR_OVERFLOW_STATUS_0 0x20c
#define FABRIC_MN_MASTER_LOG_ERR_STATUS_0 0x300
#define FABRIC_MN_MASTER_LOG_ADDR_LOW_0 0x304
#define FABRIC_MN_MASTER_LOG_ADDR_HIGH_0 0x308
#define FABRIC_MN_MASTER_LOG_ATTRIBUTES0_0 0x30c
#define FABRIC_MN_MASTER_LOG_ATTRIBUTES1_0 0x310
#define FABRIC_MN_MASTER_LOG_ATTRIBUTES2_0 0x314
#define FABRIC_MN_MASTER_LOG_USER_BITS0_0 0x318
#define AXI_SLV_TIMEOUT_STATUS_0_0 0x8
#define APB_BLOCK_TMO_STATUS_0 0xc00
#define APB_BLOCK_NUM_TMO_OFFSET 0x20
#define FAB_EM_EL_MSTRID GENMASK(29, 24)
#define FAB_EM_EL_VQC GENMASK(17, 16)
#define FAB_EM_EL_GRPSEC GENMASK(14, 8)
#define FAB_EM_EL_FALCONSEC GENMASK(1, 0)
#define FAB_EM_EL_FABID GENMASK(20, 16)
#define FAB_EM_EL_SLAVEID GENMASK(7, 0)
#define FAB_EM_EL_ACCESSID GENMASK(7, 0)
#define FAB_EM_EL_AXCACHE GENMASK(27, 24)
#define FAB_EM_EL_AXPROT GENMASK(22, 20)
#define FAB_EM_EL_BURSTLENGTH GENMASK(19, 12)
#define FAB_EM_EL_BURSTTYPE GENMASK(9, 8)
#define FAB_EM_EL_BEATSIZE GENMASK(6, 4)
#define FAB_EM_EL_ACCESSTYPE GENMASK(0, 0)
#define USRBITS_MSTR_ID GENMASK(29, 24)
#define REQ_SOCKET_ID GENMASK(27, 24)
enum tegra234_cbb_fabric_ids {
CBB_FAB_ID,
SCE_FAB_ID,
RCE_FAB_ID,
DCE_FAB_ID,
AON_FAB_ID,
PSC_FAB_ID,
BPMP_FAB_ID,
FSI_FAB_ID,
MAX_FAB_ID,
};
struct tegra234_slave_lookup {
const char *name;
unsigned int offset;
};
struct tegra234_cbb_fabric {
const char *name;
phys_addr_t off_mask_erd;
bool erd_mask_inband_err;
const char * const *master_id;
unsigned int notifier_offset;
const struct tegra_cbb_error *errors;
const struct tegra234_slave_lookup *slave_map;
};
struct tegra234_cbb {
struct tegra_cbb base;
const struct tegra234_cbb_fabric *fabric;
struct resource *res;
void __iomem *regs;
int num_intr;
int sec_irq;
/* record */
void __iomem *mon;
unsigned int type;
u32 mask;
u64 access;
u32 mn_attr0;
u32 mn_attr1;
u32 mn_attr2;
u32 mn_user_bits;
};
static inline struct tegra234_cbb *to_tegra234_cbb(struct tegra_cbb *cbb)
{
return container_of(cbb, struct tegra234_cbb, base);
}
static LIST_HEAD(cbb_list);
static DEFINE_SPINLOCK(cbb_lock);
static void tegra234_cbb_fault_enable(struct tegra_cbb *cbb)
{
struct tegra234_cbb *priv = to_tegra234_cbb(cbb);
void __iomem *addr;
addr = priv->regs + priv->fabric->notifier_offset;
writel(0x1ff, addr + FABRIC_EN_CFG_INTERRUPT_ENABLE_0_0);
dsb(sy);
}
static void tegra234_cbb_error_clear(struct tegra_cbb *cbb)
{
struct tegra234_cbb *priv = to_tegra234_cbb(cbb);
writel(0x3f, priv->mon + FABRIC_MN_MASTER_ERR_STATUS_0);
dsb(sy);
}
static u32 tegra234_cbb_get_status(struct tegra_cbb *cbb)
{
struct tegra234_cbb *priv = to_tegra234_cbb(cbb);
void __iomem *addr;
u32 value;
addr = priv->regs + priv->fabric->notifier_offset;
value = readl(addr + FABRIC_EN_CFG_STATUS_0_0);
dsb(sy);
return value;
}
static void tegra234_cbb_mask_serror(struct tegra234_cbb *cbb)
{
writel(0x1, cbb->regs + cbb->fabric->off_mask_erd);
dsb(sy);
}
static u32 tegra234_cbb_get_tmo_slv(void __iomem *addr)
{
u32 timeout;
timeout = readl(addr);
return timeout;
}
static void tegra234_cbb_tmo_slv(struct seq_file *file, const char *slave, void __iomem *addr,
u32 status)
{
tegra_cbb_print_err(file, "\t %s : %#x\n", slave, status);
}
static void tegra234_cbb_lookup_apbslv(struct seq_file *file, const char *slave,
void __iomem *base)
{
unsigned int block = 0;
void __iomem *addr;
char name[64];
u32 status;
status = tegra234_cbb_get_tmo_slv(base);
if (status)
tegra_cbb_print_err(file, "\t %s_BLOCK_TMO_STATUS : %#x\n", slave, status);
while (status) {
if (status & BIT(0)) {
u32 timeout, clients, client = 0;
addr = base + APB_BLOCK_NUM_TMO_OFFSET + (block * 4);
timeout = tegra234_cbb_get_tmo_slv(addr);
clients = timeout;
while (timeout) {
if (timeout & BIT(0)) {
if (clients != 0xffffffff)
clients &= BIT(client);
sprintf(name, "%s_BLOCK%d_TMO", slave, block);
tegra234_cbb_tmo_slv(file, name, addr, clients);
}
timeout >>= 1;
client++;
}
}
status >>= 1;
block++;
}
}
static void tegra234_lookup_slave_timeout(struct seq_file *file, struct tegra234_cbb *cbb,
u8 slave_id, u8 fab_id)
{
const struct tegra234_slave_lookup *map = cbb->fabric->slave_map;
void __iomem *addr;
/*
* 1) Get slave node name and address mapping using slave_id.
* 2) Check if the timed out slave node is APB or AXI.
* 3) If AXI, then print timeout register and reset axi slave
* using <FABRIC>_SN_<>_SLV_TIMEOUT_STATUS_0_0 register.
* 4) If APB, then perform an additional lookup to find the client
* which timed out.
* a) Get block number from the index of set bit in
* <FABRIC>_SN_AXI2APB_<>_BLOCK_TMO_STATUS_0 register.
* b) Get address of register repective to block number i.e.
* <FABRIC>_SN_AXI2APB_<>_BLOCK<index-set-bit>_TMO_0.
* c) Read the register in above step to get client_id which
* timed out as per the set bits.
* d) Reset the timedout client and print details.
* e) Goto step-a till all bits are set.
*/
addr = cbb->regs + map[slave_id].offset;
if (strstr(map[slave_id].name, "AXI2APB")) {
addr += APB_BLOCK_TMO_STATUS_0;
tegra234_cbb_lookup_apbslv(file, map[slave_id].name, addr);
} else {
char name[64];
u32 status;
addr += AXI_SLV_TIMEOUT_STATUS_0_0;
status = tegra234_cbb_get_tmo_slv(addr);
if (status) {
sprintf(name, "%s_SLV_TIMEOUT_STATUS", map[slave_id].name);
tegra234_cbb_tmo_slv(file, name, addr, status);
}
}
}
static void tegra234_cbb_print_error(struct seq_file *file, struct tegra234_cbb *cbb, u32 status,
u32 overflow)
{
unsigned int type = 0;
if (status & (status - 1))
tegra_cbb_print_err(file, "\t Multiple type of errors reported\n");
while (status) {
if (status & 0x1)
tegra_cbb_print_err(file, "\t Error Code\t\t: %s\n",
cbb->fabric->errors[type].code);
status >>= 1;
type++;
}
type = 0;
while (overflow) {
if (overflow & 0x1)
tegra_cbb_print_err(file, "\t Overflow\t\t: Multiple %s\n",
cbb->fabric->errors[type].code);
overflow >>= 1;
type++;
}
}
static void print_errlog_err(struct seq_file *file, struct tegra234_cbb *cbb)
{
u8 cache_type, prot_type, burst_length, mstr_id, grpsec, vqc, falconsec, beat_size;
u8 access_type, access_id, requester_socket_id, local_socket_id, slave_id, fab_id;
char fabric_name[20];
bool is_numa = false;
u8 burst_type;
if (num_possible_nodes() > 1)
is_numa = true;
mstr_id = FIELD_GET(FAB_EM_EL_MSTRID, cbb->mn_user_bits);
vqc = FIELD_GET(FAB_EM_EL_VQC, cbb->mn_user_bits);
grpsec = FIELD_GET(FAB_EM_EL_GRPSEC, cbb->mn_user_bits);
falconsec = FIELD_GET(FAB_EM_EL_FALCONSEC, cbb->mn_user_bits);
/*
* For SOC with multiple NUMA nodes, print cross socket access
* errors only if initiator/master_id is CCPLEX, CPMU or GPU.
*/
if (is_numa) {
local_socket_id = numa_node_id();
requester_socket_id = FIELD_GET(REQ_SOCKET_ID, cbb->mn_attr2);
if (requester_socket_id != local_socket_id) {
if ((mstr_id != 0x1) && (mstr_id != 0x2) && (mstr_id != 0xB))
return;
}
}
fab_id = FIELD_GET(FAB_EM_EL_FABID, cbb->mn_attr2);
slave_id = FIELD_GET(FAB_EM_EL_SLAVEID, cbb->mn_attr2);
access_id = FIELD_GET(FAB_EM_EL_ACCESSID, cbb->mn_attr1);
cache_type = FIELD_GET(FAB_EM_EL_AXCACHE, cbb->mn_attr0);
prot_type = FIELD_GET(FAB_EM_EL_AXPROT, cbb->mn_attr0);
burst_length = FIELD_GET(FAB_EM_EL_BURSTLENGTH, cbb->mn_attr0);
burst_type = FIELD_GET(FAB_EM_EL_BURSTTYPE, cbb->mn_attr0);
beat_size = FIELD_GET(FAB_EM_EL_BEATSIZE, cbb->mn_attr0);
access_type = FIELD_GET(FAB_EM_EL_ACCESSTYPE, cbb->mn_attr0);
tegra_cbb_print_err(file, "\n");
tegra_cbb_print_err(file, "\t Error Code\t\t: %s\n",
cbb->fabric->errors[cbb->type].code);
tegra_cbb_print_err(file, "\t MASTER_ID\t\t: %s\n", cbb->fabric->master_id[mstr_id]);
tegra_cbb_print_err(file, "\t Address\t\t: %#llx\n", cbb->access);
tegra_cbb_print_cache(file, cache_type);
tegra_cbb_print_prot(file, prot_type);
tegra_cbb_print_err(file, "\t Access_Type\t\t: %s", (access_type) ? "Write\n" : "Read\n");
tegra_cbb_print_err(file, "\t Access_ID\t\t: %#x", access_id);
if (fab_id == PSC_FAB_ID)
strcpy(fabric_name, "psc-fabric");
else if (fab_id == FSI_FAB_ID)
strcpy(fabric_name, "fsi-fabric");
else
strcpy(fabric_name, cbb->fabric->name);
if (is_numa) {
tegra_cbb_print_err(file, "\t Requester_Socket_Id\t: %#x\n",
requester_socket_id);
tegra_cbb_print_err(file, "\t Local_Socket_Id\t: %#x\n",
local_socket_id);
tegra_cbb_print_err(file, "\t No. of NUMA_NODES\t: %#x\n",
num_possible_nodes());
}
tegra_cbb_print_err(file, "\t Fabric\t\t: %s\n", fabric_name);
tegra_cbb_print_err(file, "\t Slave_Id\t\t: %#x\n", slave_id);
tegra_cbb_print_err(file, "\t Burst_length\t\t: %#x\n", burst_length);
tegra_cbb_print_err(file, "\t Burst_type\t\t: %#x\n", burst_type);
tegra_cbb_print_err(file, "\t Beat_size\t\t: %#x\n", beat_size);
tegra_cbb_print_err(file, "\t VQC\t\t\t: %#x\n", vqc);
tegra_cbb_print_err(file, "\t GRPSEC\t\t: %#x\n", grpsec);
tegra_cbb_print_err(file, "\t FALCONSEC\t\t: %#x\n", falconsec);
if ((fab_id == PSC_FAB_ID) || (fab_id == FSI_FAB_ID))
return;
if (!strcmp(cbb->fabric->errors[cbb->type].code, "TIMEOUT_ERR")) {
tegra234_lookup_slave_timeout(file, cbb, slave_id, fab_id);
return;
}
tegra_cbb_print_err(file, "\t Slave\t\t\t: %s\n", cbb->fabric->slave_map[slave_id].name);
}
static int print_errmonX_info(struct seq_file *file, struct tegra234_cbb *cbb)
{
u32 overflow, status, error;
status = readl(cbb->mon + FABRIC_MN_MASTER_ERR_STATUS_0);
if (!status) {
pr_err("Error Notifier received a spurious notification\n");
return -ENODATA;
}
if (status == 0xffffffff) {
pr_err("CBB registers returning all 1's which is invalid\n");
return -EINVAL;
}
overflow = readl(cbb->mon + FABRIC_MN_MASTER_ERR_OVERFLOW_STATUS_0);
tegra234_cbb_print_error(file, cbb, status, overflow);
error = readl(cbb->mon + FABRIC_MN_MASTER_LOG_ERR_STATUS_0);
if (!error) {
pr_info("Error Monitor doesn't have Error Logger\n");
return -EINVAL;
}
cbb->type = 0;
while (error) {
if (error & BIT(0)) {
u32 hi, lo;
hi = readl(cbb->mon + FABRIC_MN_MASTER_LOG_ADDR_HIGH_0);
lo = readl(cbb->mon + FABRIC_MN_MASTER_LOG_ADDR_LOW_0);
cbb->access = (u64)hi << 32 | lo;
cbb->mn_attr0 = readl(cbb->mon + FABRIC_MN_MASTER_LOG_ATTRIBUTES0_0);
cbb->mn_attr1 = readl(cbb->mon + FABRIC_MN_MASTER_LOG_ATTRIBUTES1_0);
cbb->mn_attr2 = readl(cbb->mon + FABRIC_MN_MASTER_LOG_ATTRIBUTES2_0);
cbb->mn_user_bits = readl(cbb->mon + FABRIC_MN_MASTER_LOG_USER_BITS0_0);
print_errlog_err(file, cbb);
}
cbb->type++;
error >>= 1;
}
return 0;
}
static int print_err_notifier(struct seq_file *file, struct tegra234_cbb *cbb, u32 status)
{
unsigned int index = 0;
int err;
pr_crit("**************************************\n");
pr_crit("CPU:%d, Error:%s, Errmon:%d\n", smp_processor_id(),
cbb->fabric->name, status);
while (status) {
if (status & BIT(0)) {
unsigned int notifier = cbb->fabric->notifier_offset;
u32 hi, lo, mask = BIT(index);
phys_addr_t addr;
u64 offset;
writel(mask, cbb->regs + notifier + FABRIC_EN_CFG_ADDR_INDEX_0_0);
hi = readl(cbb->regs + notifier + FABRIC_EN_CFG_ADDR_HI_0);
lo = readl(cbb->regs + notifier + FABRIC_EN_CFG_ADDR_LOW_0);
addr = (u64)hi << 32 | lo;
offset = addr - cbb->res->start;
cbb->mon = cbb->regs + offset;
cbb->mask = BIT(index);
err = print_errmonX_info(file, cbb);
tegra234_cbb_error_clear(&cbb->base);
if (err)
return err;
}
status >>= 1;
index++;
}
tegra_cbb_print_err(file, "\t**************************************\n");
return 0;
}
#ifdef CONFIG_DEBUG_FS
static DEFINE_MUTEX(cbb_debugfs_mutex);
static int tegra234_cbb_debugfs_show(struct tegra_cbb *cbb, struct seq_file *file, void *data)
{
int err = 0;
mutex_lock(&cbb_debugfs_mutex);
list_for_each_entry(cbb, &cbb_list, node) {
struct tegra234_cbb *priv = to_tegra234_cbb(cbb);
u32 status;
status = tegra_cbb_get_status(&priv->base);
if (status) {
err = print_err_notifier(file, priv, status);
if (err)
break;
}
}
mutex_unlock(&cbb_debugfs_mutex);
return err;
}
#endif
/*
* Handler for CBB errors
*/
static irqreturn_t tegra234_cbb_isr(int irq, void *data)
{
bool is_inband_err = false;
struct tegra_cbb *cbb;
unsigned long flags;
u8 mstr_id;
int err;
spin_lock_irqsave(&cbb_lock, flags);
list_for_each_entry(cbb, &cbb_list, node) {
struct tegra234_cbb *priv = to_tegra234_cbb(cbb);
u32 status = tegra_cbb_get_status(cbb);
if (status && (irq == priv->sec_irq)) {
tegra_cbb_print_err(NULL, "CPU:%d, Error: %s@%llx, irq=%d\n",
smp_processor_id(), priv->fabric->name,
priv->res->start, irq);
err = print_err_notifier(NULL, priv, status);
if (err)
goto unlock;
mstr_id = FIELD_GET(USRBITS_MSTR_ID, priv->mn_user_bits);
/*
* If illegal request is from CCPLEX(id:0x1) master then call BUG() to
* crash system.
*/
if ((mstr_id == 0x1) && priv->fabric->off_mask_erd)
is_inband_err = 1;
}
}
unlock:
spin_unlock_irqrestore(&cbb_lock, flags);
WARN_ON(is_inband_err);
return IRQ_HANDLED;
}
/*
* Register handler for CBB_SECURE interrupt for reporting errors
*/
static int tegra234_cbb_interrupt_enable(struct tegra_cbb *cbb)
{
struct tegra234_cbb *priv = to_tegra234_cbb(cbb);
if (priv->sec_irq) {
int err = devm_request_irq(cbb->dev, priv->sec_irq, tegra234_cbb_isr, 0,
dev_name(cbb->dev), priv);
if (err) {
dev_err(cbb->dev, "failed to register interrupt %u: %d\n", priv->sec_irq,
err);
return err;
}
}
return 0;
}
static void tegra234_cbb_error_enable(struct tegra_cbb *cbb)
{
tegra_cbb_fault_enable(cbb);
}
static const struct tegra_cbb_ops tegra234_cbb_ops = {
.get_status = tegra234_cbb_get_status,
.error_clear = tegra234_cbb_error_clear,
.fault_enable = tegra234_cbb_fault_enable,
.error_enable = tegra234_cbb_error_enable,
.interrupt_enable = tegra234_cbb_interrupt_enable,
#ifdef CONFIG_DEBUG_FS
.debugfs_show = tegra234_cbb_debugfs_show,
#endif
};
static const char * const tegra234_master_id[] = {
[0x00] = "TZ",
[0x01] = "CCPLEX",
[0x02] = "CCPMU",
[0x03] = "BPMP_FW",
[0x04] = "AON",
[0x05] = "SCE",
[0x06] = "GPCDMA_P",
[0x07] = "TSECA_NONSECURE",
[0x08] = "TSECA_LIGHTSECURE",
[0x09] = "TSECA_HEAVYSECURE",
[0x0a] = "CORESIGHT",
[0x0b] = "APE",
[0x0c] = "PEATRANS",
[0x0d] = "JTAGM_DFT",
[0x0e] = "RCE",
[0x0f] = "DCE",
[0x10] = "PSC_FW_USER",
[0x11] = "PSC_FW_SUPERVISOR",
[0x12] = "PSC_FW_MACHINE",
[0x13] = "PSC_BOOT",
[0x14] = "BPMP_BOOT",
[0x15] = "NVDEC_NONSECURE",
[0x16] = "NVDEC_LIGHTSECURE",
[0x17] = "NVDEC_HEAVYSECURE",
[0x18] = "CBB_INTERNAL",
[0x19] = "RSVD"
};
static const struct tegra_cbb_error tegra234_cbb_errors[] = {
{
.code = "SLAVE_ERR",
.desc = "Slave being accessed responded with an error"
}, {
.code = "DECODE_ERR",
.desc = "Attempt to access an address hole"
}, {
.code = "FIREWALL_ERR",
.desc = "Attempt to access a region which is firewall protected"
}, {
.code = "TIMEOUT_ERR",
.desc = "No response returned by slave"
}, {
.code = "PWRDOWN_ERR",
.desc = "Attempt to access a portion of fabric that is powered down"
}, {
.code = "UNSUPPORTED_ERR",
.desc = "Attempt to access a slave through an unsupported access"
}
};
static const struct tegra234_slave_lookup tegra234_aon_slave_map[] = {
{ "AXI2APB", 0x00000 },
{ "AST", 0x14000 },
{ "CBB", 0x15000 },
{ "CPU", 0x16000 },
};
static const struct tegra234_cbb_fabric tegra234_aon_fabric = {
.name = "aon-fabric",
.master_id = tegra234_master_id,
.slave_map = tegra234_aon_slave_map,
.errors = tegra234_cbb_errors,
.notifier_offset = 0x17000,
};
static const struct tegra234_slave_lookup tegra234_bpmp_slave_map[] = {
{ "AXI2APB", 0x00000 },
{ "AST0", 0x15000 },
{ "AST1", 0x16000 },
{ "CBB", 0x17000 },
{ "CPU", 0x18000 },
};
static const struct tegra234_cbb_fabric tegra234_bpmp_fabric = {
.name = "bpmp-fabric",
.master_id = tegra234_master_id,
.slave_map = tegra234_bpmp_slave_map,
.errors = tegra234_cbb_errors,
.notifier_offset = 0x19000,
};
static const struct tegra234_slave_lookup tegra234_cbb_slave_map[] = {
{ "AON", 0x40000 },
{ "BPMP", 0x41000 },
{ "CBB", 0x42000 },
{ "HOST1X", 0x43000 },
{ "STM", 0x44000 },
{ "FSI", 0x45000 },
{ "PSC", 0x46000 },
{ "PCIE_C1", 0x47000 },
{ "PCIE_C2", 0x48000 },
{ "PCIE_C3", 0x49000 },
{ "PCIE_C0", 0x4a000 },
{ "PCIE_C4", 0x4b000 },
{ "GPU", 0x4c000 },
{ "SMMU0", 0x4d000 },
{ "SMMU1", 0x4e000 },
{ "SMMU2", 0x4f000 },
{ "SMMU3", 0x50000 },
{ "SMMU4", 0x51000 },
{ "PCIE_C10", 0x52000 },
{ "PCIE_C7", 0x53000 },
{ "PCIE_C8", 0x54000 },
{ "PCIE_C9", 0x55000 },
{ "PCIE_C5", 0x56000 },
{ "PCIE_C6", 0x57000 },
{ "DCE", 0x58000 },
{ "RCE", 0x59000 },
{ "SCE", 0x5a000 },
{ "AXI2APB_1", 0x70000 },
{ "AXI2APB_10", 0x71000 },
{ "AXI2APB_11", 0x72000 },
{ "AXI2APB_12", 0x73000 },
{ "AXI2APB_13", 0x74000 },
{ "AXI2APB_14", 0x75000 },
{ "AXI2APB_15", 0x76000 },
{ "AXI2APB_16", 0x77000 },
{ "AXI2APB_17", 0x78000 },
{ "AXI2APB_18", 0x79000 },
{ "AXI2APB_19", 0x7a000 },
{ "AXI2APB_2", 0x7b000 },
{ "AXI2APB_20", 0x7c000 },
{ "AXI2APB_21", 0x7d000 },
{ "AXI2APB_22", 0x7e000 },
{ "AXI2APB_23", 0x7f000 },
{ "AXI2APB_25", 0x80000 },
{ "AXI2APB_26", 0x81000 },
{ "AXI2APB_27", 0x82000 },
{ "AXI2APB_28", 0x83000 },
{ "AXI2APB_29", 0x84000 },
{ "AXI2APB_30", 0x85000 },
{ "AXI2APB_31", 0x86000 },
{ "AXI2APB_32", 0x87000 },
{ "AXI2APB_33", 0x88000 },
{ "AXI2APB_34", 0x89000 },
{ "AXI2APB_35", 0x92000 },
{ "AXI2APB_4", 0x8b000 },
{ "AXI2APB_5", 0x8c000 },
{ "AXI2APB_6", 0x8d000 },
{ "AXI2APB_7", 0x8e000 },
{ "AXI2APB_8", 0x8f000 },
{ "AXI2APB_9", 0x90000 },
{ "AXI2APB_3", 0x91000 },
};
static const struct tegra234_cbb_fabric tegra234_cbb_fabric = {
.name = "cbb-fabric",
.master_id = tegra234_master_id,
.slave_map = tegra234_cbb_slave_map,
.errors = tegra234_cbb_errors,
.notifier_offset = 0x60000,
.off_mask_erd = 0x3a004
};
static const struct tegra234_slave_lookup tegra234_dce_slave_map[] = {
{ "AXI2APB", 0x00000 },
{ "AST0", 0x15000 },
{ "AST1", 0x16000 },
{ "CPU", 0x18000 },
};
static const struct tegra234_cbb_fabric tegra234_dce_fabric = {
.name = "dce-fabric",
.master_id = tegra234_master_id,
.slave_map = tegra234_dce_slave_map,
.errors = tegra234_cbb_errors,
.notifier_offset = 0x19000,
};
static const struct tegra234_slave_lookup tegra234_rce_slave_map[] = {
{ "AXI2APB", 0x00000 },
{ "AST0", 0x15000 },
{ "AST1", 0x16000 },
{ "CPU", 0x18000 },
};
static const struct tegra234_cbb_fabric tegra234_rce_fabric = {
.name = "rce-fabric",
.master_id = tegra234_master_id,
.slave_map = tegra234_rce_slave_map,
.errors = tegra234_cbb_errors,
.notifier_offset = 0x19000,
};
static const struct tegra234_slave_lookup tegra234_sce_slave_map[] = {
{ "AXI2APB", 0x00000 },
{ "AST0", 0x15000 },
{ "AST1", 0x16000 },
{ "CBB", 0x17000 },
{ "CPU", 0x18000 },
};
static const struct tegra234_cbb_fabric tegra234_sce_fabric = {
.name = "sce-fabric",
.master_id = tegra234_master_id,
.slave_map = tegra234_sce_slave_map,
.errors = tegra234_cbb_errors,
.notifier_offset = 0x19000,
};
static const char * const tegra241_master_id[] = {
[0x0] = "TZ",
[0x1] = "CCPLEX",
[0x2] = "CCPMU",
[0x3] = "BPMP_FW",
[0x4] = "PSC_FW_USER",
[0x5] = "PSC_FW_SUPERVISOR",
[0x6] = "PSC_FW_MACHINE",
[0x7] = "PSC_BOOT",
[0x8] = "BPMP_BOOT",
[0x9] = "JTAGM_DFT",
[0xa] = "CORESIGHT",
[0xb] = "GPU",
[0xc] = "PEATRANS",
[0xd ... 0x3f] = "RSVD"
};
/*
* Possible causes for Slave and Timeout errors.
* SLAVE_ERR:
* Slave being accessed responded with an error. Slave could return
* an error for various cases :
* Unsupported access, clamp setting when power gated, register
* level firewall(SCR), address hole within the slave, etc
*
* TIMEOUT_ERR:
* No response returned by slave. Can be due to slave being clock
* gated, under reset, powered down or slave inability to respond
* for an internal slave issue
*/
static const struct tegra_cbb_error tegra241_cbb_errors[] = {
{
.code = "SLAVE_ERR",
.desc = "Slave being accessed responded with an error."
}, {
.code = "DECODE_ERR",
.desc = "Attempt to access an address hole or Reserved region of memory."
}, {
.code = "FIREWALL_ERR",
.desc = "Attempt to access a region which is firewalled."
}, {
.code = "TIMEOUT_ERR",
.desc = "No response returned by slave."
}, {
.code = "PWRDOWN_ERR",
.desc = "Attempt to access a portion of the fabric that is powered down."
}, {
.code = "UNSUPPORTED_ERR",
.desc = "Attempt to access a slave through an unsupported access."
}, {
.code = "POISON_ERR",
.desc = "Slave responds with poison error to indicate error in data."
}, {
.code = "RSVD"
}, {
.code = "RSVD"
}, {
.code = "RSVD"
}, {
.code = "RSVD"
}, {
.code = "RSVD"
}, {
.code = "RSVD"
}, {
.code = "RSVD"
}, {
.code = "RSVD"
}, {
.code = "RSVD"
}, {
.code = "NO_SUCH_ADDRESS_ERR",
.desc = "The address belongs to the pri_target range but there is no register "
"implemented at the address."
}, {
.code = "TASK_ERR",
.desc = "Attempt to update a PRI task when the current task has still not "
"completed."
}, {
.code = "EXTERNAL_ERR",
.desc = "Indicates that an external PRI register access met with an error due to "
"any issue in the unit."
}, {
.code = "INDEX_ERR",
.desc = "Applicable to PRI index aperture pair, when the programmed index is "
"outside the range defined in the manual."
}, {
.code = "RESET_ERR",
.desc = "Target in Reset Error: Attempt to access a SubPri or external PRI "
"register but they are in reset."
}, {
.code = "REGISTER_RST_ERR",
.desc = "Attempt to access a PRI register but the register is partial or "
"completely in reset."
}, {
.code = "POWER_GATED_ERR",
.desc = "Returned by external PRI client when the external access goes to a power "
"gated domain."
}, {
.code = "SUBPRI_FS_ERR",
.desc = "Subpri is floorswept: Attempt to access a subpri through the main pri "
"target but subPri logic is floorswept."
}, {
.code = "SUBPRI_CLK_OFF_ERR",
.desc = "Subpri clock is off: Attempt to access a subpri through the main pri "
"target but subPris clock is gated/off."
},
};
static const struct tegra234_slave_lookup tegra241_cbb_slave_map[] = {
{ "CCPLEX", 0x50000 },
{ "PCIE_C8", 0x51000 },
{ "PCIE_C9", 0x52000 },
{ "RSVD", 0x00000 },
{ "RSVD", 0x00000 },
{ "RSVD", 0x00000 },
{ "RSVD", 0x00000 },
{ "RSVD", 0x00000 },
{ "RSVD", 0x00000 },
{ "RSVD", 0x00000 },
{ "RSVD", 0x00000 },
{ "AON", 0x5b000 },
{ "BPMP", 0x5c000 },
{ "RSVD", 0x00000 },
{ "RSVD", 0x00000 },
{ "PSC", 0x5d000 },
{ "STM", 0x5e000 },
{ "AXI2APB_1", 0x70000 },
{ "AXI2APB_10", 0x71000 },
{ "AXI2APB_11", 0x72000 },
{ "AXI2APB_12", 0x73000 },
{ "AXI2APB_13", 0x74000 },
{ "AXI2APB_14", 0x75000 },
{ "AXI2APB_15", 0x76000 },
{ "AXI2APB_16", 0x77000 },
{ "AXI2APB_17", 0x78000 },
{ "AXI2APB_18", 0x79000 },
{ "AXI2APB_19", 0x7a000 },
{ "AXI2APB_2", 0x7b000 },
{ "AXI2APB_20", 0x7c000 },
{ "AXI2APB_4", 0x87000 },
{ "AXI2APB_5", 0x88000 },
{ "AXI2APB_6", 0x89000 },
{ "AXI2APB_7", 0x8a000 },
{ "AXI2APB_8", 0x8b000 },
{ "AXI2APB_9", 0x8c000 },
{ "AXI2APB_3", 0x8d000 },
{ "AXI2APB_21", 0x7d000 },
{ "AXI2APB_22", 0x7e000 },
{ "AXI2APB_23", 0x7f000 },
{ "AXI2APB_24", 0x80000 },
{ "AXI2APB_25", 0x81000 },
{ "AXI2APB_26", 0x82000 },
{ "AXI2APB_27", 0x83000 },
{ "AXI2APB_28", 0x84000 },
{ "PCIE_C4", 0x53000 },
{ "PCIE_C5", 0x54000 },
{ "PCIE_C6", 0x55000 },
{ "PCIE_C7", 0x56000 },
{ "PCIE_C2", 0x57000 },
{ "PCIE_C3", 0x58000 },
{ "PCIE_C0", 0x59000 },
{ "PCIE_C1", 0x5a000 },
{ "AXI2APB_29", 0x85000 },
{ "AXI2APB_30", 0x86000 },
};
static const struct tegra234_cbb_fabric tegra241_cbb_fabric = {
.name = "cbb-fabric",
.master_id = tegra241_master_id,
.slave_map = tegra241_cbb_slave_map,
.errors = tegra241_cbb_errors,
.notifier_offset = 0x60000,
.off_mask_erd = 0x40004,
};
static const struct tegra234_slave_lookup tegra241_bpmp_slave_map[] = {
{ "RSVD", 0x00000 },
{ "RSVD", 0x00000 },
{ "CBB", 0x15000 },
{ "CPU", 0x16000 },
{ "AXI2APB", 0x00000 },
{ "DBB0", 0x17000 },
{ "DBB1", 0x18000 },
};
static const struct tegra234_cbb_fabric tegra241_bpmp_fabric = {
.name = "bpmp-fabric",
.master_id = tegra241_master_id,
.slave_map = tegra241_bpmp_slave_map,
.errors = tegra241_cbb_errors,
.notifier_offset = 0x19000,
};
static const struct of_device_id tegra234_cbb_dt_ids[] = {
{ .compatible = "nvidia,tegra234-cbb-fabric", .data = &tegra234_cbb_fabric },
{ .compatible = "nvidia,tegra234-aon-fabric", .data = &tegra234_aon_fabric },
{ .compatible = "nvidia,tegra234-bpmp-fabric", .data = &tegra234_bpmp_fabric },
{ .compatible = "nvidia,tegra234-dce-fabric", .data = &tegra234_dce_fabric },
{ .compatible = "nvidia,tegra234-rce-fabric", .data = &tegra234_rce_fabric },
{ .compatible = "nvidia,tegra234-sce-fabric", .data = &tegra234_sce_fabric },
{ /* sentinel */ },
};
MODULE_DEVICE_TABLE(of, tegra234_cbb_dt_ids);
struct tegra234_cbb_acpi_uid {
const char *hid;
const char *uid;
const struct tegra234_cbb_fabric *fabric;
};
static const struct tegra234_cbb_acpi_uid tegra234_cbb_acpi_uids[] = {
{ "NVDA1070", "1", &tegra241_cbb_fabric },
{ "NVDA1070", "2", &tegra241_bpmp_fabric },
{ },
};
static const struct
tegra234_cbb_fabric *tegra234_cbb_acpi_get_fabric(struct acpi_device *adev)
{
const struct tegra234_cbb_acpi_uid *entry;
for (entry = tegra234_cbb_acpi_uids; entry->hid; entry++) {
if (acpi_dev_hid_uid_match(adev, entry->hid, entry->uid))
return entry->fabric;
}
return NULL;
}
static const struct acpi_device_id tegra241_cbb_acpi_ids[] = {
{ "NVDA1070" },
{ },
};
MODULE_DEVICE_TABLE(acpi, tegra241_cbb_acpi_ids);
static int tegra234_cbb_probe(struct platform_device *pdev)
{
const struct tegra234_cbb_fabric *fabric;
struct tegra234_cbb *cbb;
unsigned long flags = 0;
int err;
if (pdev->dev.of_node) {
fabric = of_device_get_match_data(&pdev->dev);
} else {
struct acpi_device *device = ACPI_COMPANION(&pdev->dev);
if (!device)
return -ENODEV;
fabric = tegra234_cbb_acpi_get_fabric(device);
if (!fabric) {
dev_err(&pdev->dev, "no device match found\n");
return -ENODEV;
}
}
cbb = devm_kzalloc(&pdev->dev, sizeof(*cbb), GFP_KERNEL);
if (!cbb)
return -ENOMEM;
INIT_LIST_HEAD(&cbb->base.node);
cbb->base.ops = &tegra234_cbb_ops;
cbb->base.dev = &pdev->dev;
cbb->fabric = fabric;
cbb->regs = devm_platform_get_and_ioremap_resource(pdev, 0, &cbb->res);
if (IS_ERR(cbb->regs))
return PTR_ERR(cbb->regs);
err = tegra_cbb_get_irq(pdev, NULL, &cbb->sec_irq);
if (err)
return err;
platform_set_drvdata(pdev, cbb);
spin_lock_irqsave(&cbb_lock, flags);
list_add(&cbb->base.node, &cbb_list);
spin_unlock_irqrestore(&cbb_lock, flags);
/* set ERD bit to mask SError and generate interrupt to report error */
if (cbb->fabric->off_mask_erd)
tegra234_cbb_mask_serror(cbb);
return tegra_cbb_register(&cbb->base);
}
static int tegra234_cbb_remove(struct platform_device *pdev)
{
return 0;
}
static int __maybe_unused tegra234_cbb_resume_noirq(struct device *dev)
{
struct tegra234_cbb *cbb = dev_get_drvdata(dev);
tegra234_cbb_error_enable(&cbb->base);
dev_dbg(dev, "%s resumed\n", cbb->fabric->name);
return 0;
}
static const struct dev_pm_ops tegra234_cbb_pm = {
SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(NULL, tegra234_cbb_resume_noirq)
};
static struct platform_driver tegra234_cbb_driver = {
.probe = tegra234_cbb_probe,
.remove = tegra234_cbb_remove,
.driver = {
.name = "tegra234-cbb",
.of_match_table = tegra234_cbb_dt_ids,
.acpi_match_table = tegra241_cbb_acpi_ids,
.pm = &tegra234_cbb_pm,
},
};
static int __init tegra234_cbb_init(void)
{
return platform_driver_register(&tegra234_cbb_driver);
}
pure_initcall(tegra234_cbb_init);
static void __exit tegra234_cbb_exit(void)
{
platform_driver_unregister(&tegra234_cbb_driver);
}
module_exit(tegra234_cbb_exit);
MODULE_DESCRIPTION("Control Backbone 2.0 error handling driver for Tegra234");
MODULE_LICENSE("GPL");
......@@ -16,12 +16,16 @@
#define FUSE_SKU_INFO 0x10
#define ERD_ERR_CONFIG 0x120c
#define ERD_MASK_INBAND_ERR 0x1
#define PMC_STRAPPING_OPT_A_RAM_CODE_SHIFT 4
#define PMC_STRAPPING_OPT_A_RAM_CODE_MASK_LONG \
(0xf << PMC_STRAPPING_OPT_A_RAM_CODE_SHIFT)
#define PMC_STRAPPING_OPT_A_RAM_CODE_MASK_SHORT \
(0x3 << PMC_STRAPPING_OPT_A_RAM_CODE_SHIFT)
static void __iomem *apbmisc_base;
static bool long_ram_code;
static u32 strapping;
static u32 chipid;
......@@ -93,6 +97,28 @@ u32 tegra_read_ram_code(void)
}
EXPORT_SYMBOL_GPL(tegra_read_ram_code);
/*
* The function sets ERD(Error Response Disable) bit.
* This allows to mask inband errors and always send an
* OKAY response from CBB to the master which caused error.
*/
int tegra194_miscreg_mask_serror(void)
{
if (!apbmisc_base)
return -EPROBE_DEFER;
if (!of_machine_is_compatible("nvidia,tegra194")) {
WARN(1, "Only supported for Tegra194 devices!\n");
return -EOPNOTSUPP;
}
writel_relaxed(ERD_MASK_INBAND_ERR,
apbmisc_base + ERD_ERR_CONFIG);
return 0;
}
EXPORT_SYMBOL(tegra194_miscreg_mask_serror);
static const struct of_device_id apbmisc_match[] __initconst = {
{ .compatible = "nvidia,tegra20-apbmisc", },
{ .compatible = "nvidia,tegra186-misc", },
......@@ -134,7 +160,7 @@ void __init tegra_init_revision(void)
void __init tegra_init_apbmisc(void)
{
void __iomem *apbmisc_base, *strapping_base;
void __iomem *strapping_base;
struct resource apbmisc, straps;
struct device_node *np;
......@@ -196,7 +222,6 @@ void __init tegra_init_apbmisc(void)
pr_err("failed to map APBMISC registers\n");
} else {
chipid = readl_relaxed(apbmisc_base + 4);
iounmap(apbmisc_base);
}
strapping_base = ioremap(straps.start, resource_size(&straps));
......
......@@ -58,6 +58,7 @@ u32 tegra_read_chipid(void);
u8 tegra_get_chip_id(void);
u8 tegra_get_platform(void);
bool tegra_is_silicon(void);
int tegra194_miscreg_mask_serror(void);
#else
static struct tegra_sku_info tegra_sku_info __maybe_unused;
......@@ -95,6 +96,11 @@ static inline bool tegra_is_silicon(void)
{
return false;
}
static inline int tegra194_miscreg_mask_serror(void)
{
return false;
}
#endif
struct device *tegra_soc_device_register(void);
......
/* SPDX-License-Identifier: GPL-2.0 */
/*
* Copyright (c) 2021-2022, NVIDIA CORPORATION. All rights reserved
*/
#ifndef TEGRA_CBB_H
#define TEGRA_CBB_H
#include <linux/list.h>
struct tegra_cbb_error {
const char *code;
const char *source;
const char *desc;
};
struct tegra_cbb {
struct device *dev;
const struct tegra_cbb_ops *ops;
struct list_head node;
};
struct tegra_cbb_ops {
int (*debugfs_show)(struct tegra_cbb *cbb, struct seq_file *s, void *v);
int (*interrupt_enable)(struct tegra_cbb *cbb);
void (*error_enable)(struct tegra_cbb *cbb);
void (*fault_enable)(struct tegra_cbb *cbb);
void (*stall_enable)(struct tegra_cbb *cbb);
void (*error_clear)(struct tegra_cbb *cbb);
u32 (*get_status)(struct tegra_cbb *cbb);
};
int tegra_cbb_get_irq(struct platform_device *pdev, unsigned int *nonsec_irq,
unsigned int *sec_irq);
__printf(2, 3)
void tegra_cbb_print_err(struct seq_file *file, const char *fmt, ...);
void tegra_cbb_print_cache(struct seq_file *file, u32 cache);
void tegra_cbb_print_prot(struct seq_file *file, u32 prot);
int tegra_cbb_register(struct tegra_cbb *cbb);
void tegra_cbb_fault_enable(struct tegra_cbb *cbb);
void tegra_cbb_stall_enable(struct tegra_cbb *cbb);
void tegra_cbb_error_clear(struct tegra_cbb *cbb);
u32 tegra_cbb_get_status(struct tegra_cbb *cbb);
#endif /* TEGRA_CBB_H */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment