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