43afbd03c6ee8c631e4d94c123a89a1c5de2d6d6
[linux-3.10.git] / arch / arm / mach-tegra / sleep.h
1 /*
2  * Copyright (c) 2010-2012, NVIDIA Corporation. All rights reserved.
3  *
4  * This program is free software; you can redistribute it and/or modify it
5  * under the terms and conditions of the GNU General Public License,
6  * version 2, as published by the Free Software Foundation.
7  *
8  * This program is distributed in the hope it will be useful, but WITHOUT
9  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
11  * more details.
12  *
13  * You should have received a copy of the GNU General Public License
14  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
15  */
16
17 #ifndef __MACH_TEGRA_SLEEP_H
18 #define __MACH_TEGRA_SLEEP_H
19
20 #include "iomap.h"
21
22 #ifndef CONFIG_TRUSTED_FOUNDATIONS
23 /* FIXME: The code associated with this should be removed if our change to
24    save the diagnostic regsiter in the CPU context is accepted. */
25 #define USE_TEGRA_DIAG_REG_SAVE 1
26 #else
27 #define USE_TEGRA_DIAG_REG_SAVE 0
28 #endif
29
30 #define TEGRA_POWER_LP1_AUDIO           (1 << 25) /* do not turn off pll-p in LP1 */
31
32 #ifdef CONFIG_ARCH_TEGRA_HAS_SYMMETRIC_CPU_PWR_GATE
33 #define TEGRA_POWER_CLUSTER_PART_CRAIL  (1 << 24) /* Power gate CRAIL partition */
34 #define TEGRA_POWER_CLUSTER_PART_NONCPU (1 << 25) /* Power gate CxNC partition */
35 #define TEGRA_POWER_CLUSTER_PART_MASK   (TEGRA_POWER_CLUSTER_PART_CRAIL | \
36                                                 TEGRA_POWER_CLUSTER_PART_NONCPU)
37 #define TEGRA_POWER_CLUSTER_PART_DEFAULT TEGRA_POWER_CLUSTER_PART_CRAIL
38 #else
39 #define TEGRA_POWER_CLUSTER_PART_DEFAULT 0
40 #endif
41
42 #define TEGRA_POWER_SDRAM_SELFREFRESH   (1 << 26) /* SDRAM is in self-refresh */
43 #define TEGRA_POWER_HOTPLUG_SHUTDOWN    (1 << 27) /* Hotplug shutdown */
44 #define TEGRA_POWER_CLUSTER_G           (1 << 28) /* G CPU */
45 #define TEGRA_POWER_CLUSTER_LP          (1 << 29) /* LP CPU */
46 #define TEGRA_POWER_CLUSTER_MASK        (TEGRA_POWER_CLUSTER_G | \
47                                                 TEGRA_POWER_CLUSTER_LP)
48 #define TEGRA_POWER_CLUSTER_IMMEDIATE   (1 << 30) /* Immediate wake */
49 #define TEGRA_POWER_CLUSTER_FORCE       (1 << 31) /* Force switch */
50
51 #define TEGRA_IRAM_CODE_AREA            (TEGRA_IRAM_BASE + SZ_4K)
52
53 /* PMC_SCRATCH2 is used for PLLM boot state if PLLM auto-restart is enabled */
54 #define PMC_SCRATCH2                    0x58
55 /* PMC_SCRATCH37-39 and 41 are used for tegra_pen_lock in Tegra2 idle */
56 #define PMC_SCRATCH37                   0x130
57 #define PMC_SCRATCH38                   0x134
58 /* PMC_SCRATCH39 stores the reset vector of the AVP (always 0) after LP0 */
59 #define PMC_SCRATCH39                   0x138
60 /* PMC_SCRATCH41 stores the reset vector of the CPU after LP0 and LP1 */
61 #define PMC_SCRATCH41                   0x140
62
63 #ifdef CONFIG_ARCH_TEGRA_2x_SOC
64 #define CPU_RESETTABLE                  2
65 #define CPU_RESETTABLE_SOON             1
66 #define CPU_NOT_RESETTABLE              0
67 #endif
68
69 #define FLOW_CTRL_HALT_CPU0_EVENTS      0x0
70 #define   FLOW_CTRL_WAITEVENT           (2 << 29)
71 #define   FLOW_CTRL_WAIT_FOR_INTERRUPT  (4 << 29)
72 #define   FLOW_CTRL_JTAG_RESUME         (1 << 28)
73 #define   FLOW_CTRL_HALT_CPU_IRQ        (1 << 10)
74 #define   FLOW_CTRL_HALT_CPU_FIQ        (1 << 8)
75 #define   FLOW_CTRL_HALT_LIC_IRQ        (1 << 11)
76 #define   FLOW_CTRL_HALT_LIC_FIQ        (1 << 10)
77 #define   FLOW_CTRL_HALT_GIC_IRQ        (1 << 9)
78 #define   FLOW_CTRL_HALT_GIC_FIQ        (1 << 8)
79 #define   FLOW_CTRL_IMMEDIATE_WAKE      (1 << 3)
80 #define FLOW_CTRL_CPU0_CSR              0x8
81 #define   FLOW_CTRL_CSR_INTR_FLAG               (1 << 15)
82 #define   FLOW_CTRL_CSR_EVENT_FLAG              (1 << 14)
83 #define   FLOW_CTRL_CSR_ENABLE_EXT_NONE (0)
84 #define   FLOW_CTRL_CSR_ENABLE_EXT_CRAIL        (1<<13)
85 #define   FLOW_CTRL_CSR_ENABLE_EXT_NCPU (1<<12)
86 #define   FLOW_CTRL_CSR_ENABLE_EXT_MASK ( \
87                                         FLOW_CTRL_CSR_ENABLE_EXT_NCPU | \
88                                         FLOW_CTRL_CSR_ENABLE_EXT_CRAIL )
89 #define   FLOW_CTRL_CSR_ENABLE_EXT_EMU FLOW_CTRL_CSR_ENABLE_EXT_MASK
90 #define   FLOW_CTRL_CSR_IMMEDIATE_WAKE          (1<<3)
91 #define   FLOW_CTRL_CSR_SWITCH_CLUSTER          (1<<2)
92 #define   FLOW_CTRL_CSR_ENABLE                  (1 << 0)
93
94 #define FLOW_CTRL_HALT_CPU1_EVENTS      0x14
95 #define FLOW_CTRL_CPU1_CSR              0x18
96
97 #ifdef CONFIG_ARCH_TEGRA_2x_SOC
98 #define FLOW_CTRL_CSR_WFE_CPU0          (1 << 4)
99 #define FLOW_CTRL_CSR_WFE_BITMAP        (3 << 4)
100 #define FLOW_CTRL_CSR_WFI_BITMAP        0
101 #else
102 #define FLOW_CTRL_CSR_WFE_BITMAP        (0xF << 4)
103 #define FLOW_CTRL_CSR_WFI_CPU0          (1 << 8)
104 #define FLOW_CTRL_CSR_WFI_BITMAP        (0xF << 8)
105 #endif
106
107 #ifdef CONFIG_CACHE_L2X0
108 #define TEGRA_PL310_VIRT (TEGRA_ARM_PL310_BASE - IO_CPU_PHYS + IO_CPU_VIRT)
109 #endif
110 #ifdef CONFIG_HAVE_ARM_SCU
111 #define TEGRA_ARM_PERIF_VIRT (TEGRA_ARM_PERIF_BASE - IO_CPU_PHYS \
112                                         + IO_CPU_VIRT)
113 #endif
114 #define TEGRA_FLOW_CTRL_VIRT (TEGRA_FLOW_CTRL_BASE - IO_PPSB_PHYS \
115                                         + IO_PPSB_VIRT)
116 #define TEGRA_CLK_RESET_VIRT (TEGRA_CLK_RESET_BASE - IO_PPSB_PHYS \
117                                         + IO_PPSB_VIRT)
118
119 #ifdef __ASSEMBLY__
120 /* waits until the microsecond counter (base) ticks, for exact timing loops */
121 .macro  wait_for_us, rd, base, tmp
122         ldr    \rd, [\base]
123 1001:   ldr    \tmp, [\base]
124         cmp    \rd, \tmp
125         beq    1001b
126         mov    \tmp, \rd
127 .endm
128
129 /* waits until the microsecond counter (base) is > rn */
130 .macro  wait_until, rn, base, tmp
131         add     \rn, \rn, #1
132 1002:   ldr     \tmp, [\base]
133         sub     \tmp, \tmp, \rn
134         ands    \tmp, \tmp, #0x80000000
135         dmb
136         bne     1002b
137 .endm
138
139 /* returns the offset of the flow controller halt register for a cpu */
140 .macro cpu_to_halt_reg rd, rcpu
141         cmp     \rcpu, #0
142         subne   \rd, \rcpu, #1
143         movne   \rd, \rd, lsl #3
144         addne   \rd, \rd, #0x14
145         moveq   \rd, #0
146 .endm
147
148 /* returns the offset of the flow controller csr register for a cpu */
149 .macro cpu_to_csr_reg rd, rcpu
150         cmp     \rcpu, #0
151         subne   \rd, \rcpu, #1
152         movne   \rd, \rd, lsl #3
153         addne   \rd, \rd, #0x18
154         moveq   \rd, #8
155 .endm
156
157 /* returns the ID of the current processor */
158 .macro cpu_id, rd
159         mrc     p15, 0, \rd, c0, c0, 5
160         and     \rd, \rd, #0xF
161 .endm
162
163 /* loads a 32-bit value into a register without a data access */
164 .macro mov32, reg, val
165         movw    \reg, #:lower16:\val
166         movt    \reg, #:upper16:\val
167 .endm
168
169 /* Macro to exit SMP coherency. */
170 .macro exit_smp, tmp1, tmp2
171         mrc     p15, 0, \tmp1, c1, c0, 1        @ ACTLR
172         bic     \tmp1, \tmp1, #(1<<6) | (1<<0)  @ clear ACTLR.SMP | ACTLR.FW
173         mcr     p15, 0, \tmp1, c1, c0, 1        @ ACTLR
174         isb
175 #ifdef CONFIG_HAVE_ARM_SCU
176         cpu_id  \tmp1
177         mov     \tmp1, \tmp1, lsl #2
178         mov     \tmp2, #0xf
179         mov     \tmp2, \tmp2, lsl \tmp1
180         mov32   \tmp1, TEGRA_ARM_PERIF_VIRT + 0xC
181         str     \tmp2, [\tmp1]                  @ invalidate SCU tags for CPU
182         dsb
183 #endif
184 .endm
185
186 #define DEBUG_CONTEXT_STACK     0
187
188 /* pops a debug check token from the stack */
189 .macro  pop_stack_token tmp1, tmp2
190 #if DEBUG_CONTEXT_STACK
191         mov32   \tmp1, 0xBAB1F00D
192         ldmfd   sp!, {\tmp2}
193         cmp     \tmp1, \tmp2
194         movne   pc, #0
195 #endif
196 .endm
197
198 /* pushes a debug check token onto the stack */
199 .macro  push_stack_token tmp1
200 #if DEBUG_CONTEXT_STACK
201         mov32   \tmp1, 0xBAB1F00D
202         stmfd   sp!, {\tmp1}
203 #endif
204 .endm
205
206 #else   /* !defined(__ASSEMBLY__) */
207
208 #include <linux/io.h>
209
210 #ifdef CONFIG_HOTPLUG_CPU
211 void tegra20_hotplug_init(void);
212 void tegra30_hotplug_init(void);
213 #else
214 static inline void tegra20_hotplug_init(void) {}
215 static inline void tegra30_hotplug_init(void) {}
216 #endif
217
218 #define FLOW_CTRL_HALT_CPU(cpu) (IO_ADDRESS(TEGRA_FLOW_CTRL_BASE) +     \
219         ((cpu) ? (FLOW_CTRL_HALT_CPU1_EVENTS + 8 * ((cpu) - 1)) :       \
220          FLOW_CTRL_HALT_CPU0_EVENTS))
221
222 #define FLOW_CTRL_CPU_CSR(cpu)  (IO_ADDRESS(TEGRA_FLOW_CTRL_BASE) +     \
223         ((cpu) ? (FLOW_CTRL_CPU1_CSR + 8 * ((cpu) - 1)) :       \
224          FLOW_CTRL_CPU0_CSR))
225
226 static inline void flowctrl_writel(unsigned long val, void __iomem *addr)
227 {
228         writel(val, addr);
229 #ifdef CONFIG_ARCH_TEGRA_2x_SOC
230         wmb();
231 #endif
232         (void)__raw_readl(addr);
233 }
234
235 void tegra_pen_lock(void);
236 void tegra_pen_unlock(void);
237 void tegra_cpu_wfi(void);
238 int tegra_sleep_cpu_finish(unsigned long v2p);
239 void tegra_resume(void);
240 void tegra_flush_l1_cache(void);
241
242 #ifdef CONFIG_ARCH_TEGRA_2x_SOC
243 extern unsigned int tegra2_iram_start;
244 extern unsigned int tegra2_iram_end;
245 int  tegra2_cpu_is_resettable_soon(void);
246 void tegra2_cpu_reset(int cpu);
247 void tegra2_cpu_set_resettable_soon(void);
248 void tegra2_cpu_clear_resettable(void);
249 int tegra2_sleep_core_finish(unsigned long int);
250 void tegra2_sleep_wfi(unsigned long v2p);
251 int tegra2_finish_sleep_cpu_secondary(unsigned long int);
252 #else
253 extern unsigned int tegra3_iram_start;
254 extern unsigned int tegra3_iram_end;
255 extern unsigned int lp1_register_pmuslave_addr;
256 extern unsigned int lp1_register_i2c_base_addr;
257 extern unsigned int lp1_register_core_lowvolt;
258 extern unsigned int lp1_register_core_highvolt;
259 int tegra3_sleep_core_finish(unsigned long int);
260 int tegra3_sleep_cpu_secondary_finish(unsigned long int);
261 #endif
262
263 static inline void *tegra_iram_start(void)
264 {
265 #ifdef CONFIG_ARCH_TEGRA_2x_SOC
266         return &tegra2_iram_start;
267 #else
268         return &tegra3_iram_start;
269 #endif
270 }
271
272 static inline void *tegra_iram_end(void)
273 {
274 #ifdef CONFIG_ARCH_TEGRA_2x_SOC
275         return &tegra2_iram_end;
276 #else
277         return &tegra3_iram_end;
278 #endif
279 }
280
281 static inline void *tegra_lp1_register_pmuslave_addr(void)
282 {
283 #ifdef CONFIG_ARCH_TEGRA_2x_SOC
284         return NULL;
285 #else
286         return &lp1_register_pmuslave_addr;
287 #endif
288 }
289
290 static inline void *tegra_lp1_register_i2c_base_addr(void)
291 {
292 #ifdef CONFIG_ARCH_TEGRA_2x_SOC
293         return NULL;
294 #else
295         return &lp1_register_i2c_base_addr;
296 #endif
297 }
298
299 static inline void *tegra_lp1_register_core_lowvolt(void)
300 {
301 #ifdef CONFIG_ARCH_TEGRA_2x_SOC
302         return NULL;
303 #else
304         return &lp1_register_core_lowvolt;
305 #endif
306 }
307
308 static inline void *tegra_lp1_register_core_highvolt(void)
309 {
310 #ifdef CONFIG_ARCH_TEGRA_2x_SOC
311         return NULL;
312 #else
313         return &lp1_register_core_highvolt;
314 #endif
315 }
316 #endif
317 #endif