b13f94caafb57d1d3ca6a1145f4f9f23ea04304f
[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
47 #define MC_INT_EXT_INTR_IN              (1<<1)
48 #define MC_INT_DECERR_EMEM              (1<<6)
49 #define MC_INT_SECURITY_VIOLATION       (1<<8)
50 #define MC_INT_ARBITRATION_EMEM         (1<<9)
51 #define MC_INT_INVALID_SMMU_PAGE        (1<<10)
52 #define MC_INT_DECERR_VPR               (1<<12)
53 #define MC_INT_SECERR_SEC               (1<<13)
54
55 /*
56  * Number of unique interrupts we have for this chip.
57  */
58 #ifdef CONFIG_ARCH_TEGRA_11x_SOC
59 #define INTR_COUNT      6
60 #else
61 #define INTR_COUNT      4
62 #endif
63
64 #define MC_ERR_DECERR_EMEM              (2)
65 #define MC_ERR_SECURITY_TRUSTZONE       (3)
66 #define MC_ERR_SECURITY_CARVEOUT        (4)
67 #define MC_ERR_INVALID_SMMU_PAGE        (6)
68
69 #if defined(CONFIG_ARCH_TEGRA_3x_SOC)
70 #define _MC_INT_EN_MASK (MC_INT_DECERR_EMEM |           \
71                          MC_INT_SECURITY_VIOLATION |    \
72                          MC_INT_INVALID_SMMU_PAGE)
73
74
75 #elif defined(CONFIG_ARCH_TEGRA_11x_SOC)
76 #define MC_DUAL_CHANNEL
77 #define _MC_INT_EN_MASK (MC_INT_EXT_INTR_IN |           \
78                          MC_INT_DECERR_EMEM |           \
79                          MC_INT_SECURITY_VIOLATION |    \
80                          MC_INT_INVALID_SMMU_PAGE |     \
81                          MC_INT_DECERR_VPR |            \
82                          MC_INT_SECERR_SEC)
83 #endif
84
85 #ifdef CONFIG_TEGRA_ARBITRATION_EMEM_INTR
86 #define MC_INT_EN_MASK  (_MC_INT_EN_MASK | MC_INT_ARBITRATION_EMEM)
87 )
88 #else
89 #define MC_INT_EN_MASK  (_MC_INT_EN_MASK)
90 #endif
91
92 extern void __iomem *mc;
93
94 struct mc_client {
95         const char *name;
96         unsigned int intr_counts[INTR_COUNT];
97 };
98
99 struct mcerr_chip_specific {
100
101         const char      *(*mcerr_info)(u32 status);
102         void             (*mcerr_info_update)(struct mc_client *c, u32 status);
103         const char      *(*mcerr_type)(u32 err);
104         void             (*mcerr_print)(const char *mc_err, u32 err, u32 addr,
105                                         const struct mc_client *client,
106                                         int is_secure, int is_write,
107                                         const char *mc_err_info);
108         int              (*mcerr_debugfs_show)(struct seq_file *s, void *v);
109
110         /* Numeric fields that must be set by the different architectures. */
111         unsigned int     nr_clients;
112 };
113
114 #define client(_name) { .name = _name }
115
116 /*
117  * Error MMA tracking.
118  */
119 #define MMA_HISTORY_SAMPLES 20
120 struct arb_emem_intr_info {
121         int arb_intr_mma;
122         u64 time;
123         spinlock_t lock;
124 };
125
126 /*
127  * Externs that get defined by the chip specific code. This way the generic
128  * T3x/T11x can handle a much as possible.
129  */
130 extern struct mc_client mc_clients[];
131 extern void mcerr_chip_specific_setup(struct mcerr_chip_specific *spec);
132
133 #endif /* __MCERR_H */