ARM: tegra: mcerr: Update client arrays
[linux-3.10.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-2013, 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 #elif defined(CONFIG_ARCH_TEGRA_14x_SOC)
39 #include "tegra14_emc.h"
40 #define MC_LATENCY_ALLOWANCE_BASE       MC_LATENCY_ALLOWANCE_AVPC_0
41 #elif defined(CONFIG_ARCH_TEGRA_12x_SOC)
42 #include "tegra12_emc.h"
43 #define MC_LATENCY_ALLOWANCE_BASE       MC_LATENCY_ALLOWANCE_AVPC_0
44 #endif
45
46 #define MAX_PRINTS                      6
47
48 #define MC_INT_STATUS                   0x0
49 #define MC_INT_MASK                     0x4
50 #define MC_ERR_STATUS                   0x8
51 #define MC_ERR_ADR                      0xC
52 #define MC_ERR_BBC_STATUS               0x84
53 #define MC_ERR_BBC_ADR                  0x88
54 #define MC_ERR_VPR_STATUS               0x654
55 #define MC_ERR_VPR_ADR                  0x658
56 #define MC_ERR_SEC_STATUS               0x67c
57 #define MC_ERR_SEC_ADR                  0x680
58
59 #define MC_ERR_SMMU_MASK                (0x7 << 25)
60 #define MC_ERR_SMMU_BITS(err)           (((err) & MC_ERR_SMMU_MASK) >> 25)
61 #define MC_ERR_STATUS_WRITE             (1 << 16)
62 #define MC_ERR_STATUS_SECURE            (1 << 17)
63 #define MC_ERR_STATUS_ADR_HI            (3 << 20)
64
65 #define MC_INT_EXT_INTR_IN                      (1<<1)
66 #define MC_INT_DECERR_EMEM                      (1<<6)
67 #define MC_INT_SECURITY_VIOLATION               (1<<8)
68 #define MC_INT_ARBITRATION_EMEM                 (1<<9)
69 #define MC_INT_INVALID_SMMU_PAGE                (1<<10)
70 #define MC_INT_INVALID_APB_ASID_UPDATE          (1<<11)
71 #define MC_INT_DECERR_VPR                       (1<<12)
72 #define MC_INT_SECERR_SEC                       (1<<13)
73 #define MC_INT_BBC_PRIVATE_MEM_VIOLATION        (1<<14)
74 #define MC_INT_DECERR_BBC                       (1<<15)
75 #define MC_INT_DECERR_MTS                       (1<<16)
76
77 /*
78  * Number of unique interrupts we have for this chip.
79  */
80 #if defined(CONFIG_ARCH_TEGRA_11x_SOC)
81 #define INTR_COUNT      6
82 #elif defined(CONFIG_ARCH_TEGRA_14x_SOC)
83 #define INTR_COUNT      8
84 #elif defined(CONFIG_ARCH_TEGRA_12x_SOC)
85 #define INTR_COUNT      8
86 #else
87 #define INTR_COUNT      4
88 #endif
89
90 #define MC_ERR_DECERR_EMEM              (2)
91 #define MC_ERR_SECURITY_TRUSTZONE       (3)
92 #define MC_ERR_SECURITY_CARVEOUT        (4)
93 #define MC_ERR_INVALID_SMMU_PAGE        (6)
94
95 #if defined(CONFIG_ARCH_TEGRA_3x_SOC)
96 #define _MC_INT_EN_MASK (MC_INT_DECERR_EMEM |           \
97                          MC_INT_SECURITY_VIOLATION |    \
98                          MC_INT_INVALID_SMMU_PAGE)
99 #elif defined(CONFIG_ARCH_TEGRA_11x_SOC)
100 #define MC_DUAL_CHANNEL
101 #define _MC_INT_EN_MASK (MC_INT_EXT_INTR_IN |           \
102                          MC_INT_DECERR_EMEM |           \
103                          MC_INT_SECURITY_VIOLATION |    \
104                          MC_INT_INVALID_SMMU_PAGE |     \
105                          MC_INT_DECERR_VPR |            \
106                          MC_INT_SECERR_SEC)
107 #elif defined(CONFIG_ARCH_TEGRA_14x_SOC)
108 #define _MC_INT_EN_MASK (MC_INT_DECERR_EMEM |                   \
109                          MC_INT_SECURITY_VIOLATION |            \
110                          MC_INT_INVALID_SMMU_PAGE |             \
111                          MC_INT_DECERR_VPR |                    \
112                          MC_INT_SECERR_SEC |                    \
113                          MC_INT_BBC_PRIVATE_MEM_VIOLATION |     \
114                          MC_INT_DECERR_BBC)
115 #elif defined(CONFIG_ARCH_TEGRA_12x_SOC)
116 #define _MC_INT_EN_MASK (MC_INT_DECERR_EMEM |           \
117                          MC_INT_SECURITY_VIOLATION |    \
118                          MC_INT_ARBITRATION_EMEM |      \
119                          MC_INT_INVALID_SMMU_PAGE |     \
120                          MC_INT_INVALID_APB_ASID_UPDATE | \
121                          MC_INT_DECERR_VPR |            \
122                          MC_INT_SECERR_SEC |            \
123                          MC_INT_DECERR_MTS)
124 #endif
125
126 #ifdef CONFIG_TEGRA_ARBITRATION_EMEM_INTR
127 #define MC_INT_EN_MASK  (_MC_INT_EN_MASK | MC_INT_ARBITRATION_EMEM)
128 #else
129 #define MC_INT_EN_MASK  (_MC_INT_EN_MASK)
130 #endif
131
132 extern void __iomem *mc;
133
134 struct mc_client {
135         const char *name;
136         const char *swgid;
137         unsigned int intr_counts[INTR_COUNT];
138 };
139
140 /*
141  * This describes errors that can be generated by the MC. One is defined for
142  * each possibility.
143  *
144  * @sig Interrupt signiture for the error.
145  * @msg Error description.
146  * @flags Relevant flags for the error.
147  * @stat_reg Register offset that holds the status of the error.
148  * @addr_reg Register offset that holds the faulting address.
149  */
150 struct mc_error {
151         const char *msg;
152         u32         sig;
153         int         flags;
154         u32         stat_reg;
155         u32         addr_reg;
156 };
157
158 #define E_SMMU       (1<<0)
159 #define E_NO_STATUS  (1<<1)
160
161 extern int mc_client_last;
162
163 struct mcerr_chip_specific {
164
165         /*
166          * Return a pointer to the relevant mc_error struct for the passed
167          * interrupt signature.
168          *
169          * Called in interrupt context - no sleeping, etc.
170          */
171         const struct mc_error *(*mcerr_info)(u32 intr);
172
173         /*
174          * Update the interrupt info for the passed client. This is called once
175          * the client who generated the error is determined.
176          *
177          * Called in interrupt context - no sleeping, etc.
178          */
179         void (*mcerr_info_update)(struct mc_client *c, u32 status);
180
181         /*
182          * Provide actual user feed back to the kernel log. The passed data is
183          * everything that could be determined about the fault.
184          *
185          * Note: @smmu_info may be NULL if the error occured without involving
186          * the SMMU. This is something @mcerr_print must handle gracefully.
187          *
188          * Called in interrupt context - no sleeping, etc.
189          */
190         void (*mcerr_print)(const struct mc_error *err,
191                             const struct mc_client *client,
192                             u32 status, phys_addr_t addr,
193                             int secure, int rw, const char *smmu_info);
194
195         /*
196          * Show the statistics for each client. This is called from a debugfs
197          * context - that means you can sleep and do general kernel stuff here.
198          */
199         int (*mcerr_debugfs_show)(struct seq_file *s, void *v);
200
201         /* Numeric fields that must be set by the different architectures. */
202         unsigned int     nr_clients;
203 };
204
205 #define client(_swgid, _name) { .swgid = _swgid, .name = _name }
206 #define MC_ERR(_sig, _msg, _flags, _stat_reg, _addr_reg)                \
207         { .sig = _sig, .msg = _msg, .flags = _flags,                    \
208                         .stat_reg = _stat_reg, .addr_reg = _addr_reg }
209
210 /*
211  * Error MMA tracking.
212  */
213 #define MMA_HISTORY_SAMPLES 20
214 struct arb_emem_intr_info {
215         int arb_intr_mma;
216         u64 time;
217         spinlock_t lock;
218 };
219
220 /*
221  * Externs that get defined by the chip specific code. This way the generic
222  * T3x/T11x/T12x can handle a much as possible.
223  */
224 extern struct mc_client mc_clients[];
225 extern void mcerr_chip_specific_setup(struct mcerr_chip_specific *spec);
226
227 #endif /* __MCERR_H */