ARM: tegra: mcerr: Use special VPR and SEC registers
[linux-2.6.git] / arch / arm / mach-tegra / mcerr.h
1 /*
2  * arch/arm/mach-tegra/mcerr.h
3  *
4  * MC error interrupt handling header file. Various defines and declarations
5  * across T20, T30, and T11x.
6  *
7  * Copyright (c) 2010-2012, NVIDIA Corporation. All rights reserved.
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful, but WITHOUT
15  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
16  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
17  * more details.
18  *
19  * You should have received a copy of the GNU General Public License along
20  * with this program; if not, write to the Free Software Foundation, Inc.,
21  * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
22  */
23
24 #ifndef __MCERR_H
25 #define __MCERR_H
26
27 #include <linux/kernel.h>
28 #include <linux/debugfs.h>
29 #include <linux/spinlock.h>
30
31 /* Pull in chip specific EMC header. */
32 #if defined(CONFIG_ARCH_TEGRA_3x_SOC)
33 #include "tegra3_emc.h"
34 #define MC_LATENCY_ALLOWANCE_BASE       MC_LATENCY_ALLOWANCE_AFI
35 #elif defined(CONFIG_ARCH_TEGRA_11x_SOC)
36 #include "tegra11_emc.h"
37 #define MC_LATENCY_ALLOWANCE_BASE       MC_LATENCY_ALLOWANCE_AVPC_0
38 #endif
39
40 #define MAX_PRINTS                      6
41
42 #define MC_INT_STATUS                   0x0
43 #define MC_INT_MASK                     0x4
44 #define MC_ERROR_STATUS                 0x8
45 #define MC_ERROR_ADDRESS                0xC
46 #define MC_ERR_VPR_STATUS               0x654
47 #define MC_ERR_VPR_ADR                  0x658
48 #define MC_ERR_SEC_STATUS               0x67c
49 #define MC_ERR_SEC_ADR                  0x680
50
51 #define MC_INT_EXT_INTR_IN              (1<<1)
52 #define MC_INT_DECERR_EMEM              (1<<6)
53 #define MC_INT_SECURITY_VIOLATION       (1<<8)
54 #define MC_INT_ARBITRATION_EMEM         (1<<9)
55 #define MC_INT_INVALID_SMMU_PAGE        (1<<10)
56 #define MC_INT_DECERR_VPR               (1<<12)
57 #define MC_INT_SECERR_SEC               (1<<13)
58
59 /*
60  * Number of unique interrupts we have for this chip.
61  */
62 #ifdef CONFIG_ARCH_TEGRA_11x_SOC
63 #define INTR_COUNT      6
64 #else
65 #define INTR_COUNT      4
66 #endif
67
68 #define MC_ERR_DECERR_EMEM              (2)
69 #define MC_ERR_SECURITY_TRUSTZONE       (3)
70 #define MC_ERR_SECURITY_CARVEOUT        (4)
71 #define MC_ERR_INVALID_SMMU_PAGE        (6)
72
73 #if defined(CONFIG_ARCH_TEGRA_3x_SOC)
74 #define _MC_INT_EN_MASK (MC_INT_DECERR_EMEM |           \
75                          MC_INT_SECURITY_VIOLATION |    \
76                          MC_INT_INVALID_SMMU_PAGE)
77
78
79 #elif defined(CONFIG_ARCH_TEGRA_11x_SOC)
80 #define MC_DUAL_CHANNEL
81 #define _MC_INT_EN_MASK (MC_INT_EXT_INTR_IN |           \
82                          MC_INT_DECERR_EMEM |           \
83                          MC_INT_SECURITY_VIOLATION |    \
84                          MC_INT_INVALID_SMMU_PAGE |     \
85                          MC_INT_DECERR_VPR |            \
86                          MC_INT_SECERR_SEC)
87 #endif
88
89 #ifdef CONFIG_TEGRA_ARBITRATION_EMEM_INTR
90 #define MC_INT_EN_MASK  (_MC_INT_EN_MASK | MC_INT_ARBITRATION_EMEM)
91 )
92 #else
93 #define MC_INT_EN_MASK  (_MC_INT_EN_MASK)
94 #endif
95
96 extern void __iomem *mc;
97
98 struct mc_client {
99         const char *name;
100         unsigned int intr_counts[INTR_COUNT];
101 };
102
103 struct mcerr_chip_specific {
104
105         const char      *(*mcerr_info)(u32 status);
106         void             (*mcerr_info_update)(struct mc_client *c, u32 status);
107         const char      *(*mcerr_type)(u32 err);
108         void             (*mcerr_print)(const char *mc_err, u32 err, u32 addr,
109                                         const struct mc_client *client,
110                                         int is_secure, int is_write,
111                                         const char *mc_err_info);
112         int              (*mcerr_debugfs_show)(struct seq_file *s, void *v);
113
114         /* Numeric fields that must be set by the different architectures. */
115         unsigned int     nr_clients;
116 };
117
118 #define client(_name) { .name = _name }
119
120 /*
121  * Error MMA tracking.
122  */
123 #define MMA_HISTORY_SAMPLES 20
124 struct arb_emem_intr_info {
125         int arb_intr_mma;
126         u64 time;
127         spinlock_t lock;
128 };
129
130 /*
131  * Externs that get defined by the chip specific code. This way the generic
132  * T3x/T11x can handle a much as possible.
133  */
134 extern struct mc_client mc_clients[];
135 extern void mcerr_chip_specific_setup(struct mcerr_chip_specific *spec);
136
137 #endif /* __MCERR_H */