ARM: tegra: power: implement LP1 suspend/resume for Tegra3
[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 #ifdef CONFIG_CACHE_L2X0
23 #define USE_TEGRA_CPU_SUSPEND   1
24 #else
25 #define USE_TEGRA_CPU_SUSPEND   0
26 #endif
27 /* FIXME: The core associated with this should be removed if our change to
28    save the diagnostic regsiter in the CPU context is accepted. */
29 #define USE_TEGRA_DIAG_REG_SAVE 1
30
31 #define TEGRA_POWER_SDRAM_SELFREFRESH   (1 << 26) /* SDRAM is in self-refresh */
32 #define TEGRA_POWER_HOTPLUG_SHUTDOWN    (1 << 27) /* Hotplug shutdown */
33 #define TEGRA_POWER_CLUSTER_G           (1 << 28) /* G CPU */
34 #define TEGRA_POWER_CLUSTER_LP          (1 << 29) /* LP CPU */
35 #define TEGRA_POWER_CLUSTER_MASK        (TEGRA_POWER_CLUSTER_G | \
36                                                 TEGRA_POWER_CLUSTER_LP)
37 #define TEGRA_POWER_CLUSTER_IMMEDIATE   (1 << 30) /* Immediate wake */
38 #define TEGRA_POWER_CLUSTER_FORCE       (1 << 31) /* Force switch */
39
40 #define TEGRA_IRAM_CODE_AREA            (TEGRA_IRAM_BASE + SZ_4K)
41
42 /* PMC_SCRATCH37-39 and 41 are used for tegra_pen_lock in Tegra2 idle */
43 #define PMC_SCRATCH37                   0x130
44 #define PMC_SCRATCH38                   0x134
45 /* PMC_SCRATCH39 stores the reset vector of the AVP (always 0) after LP0 */
46 #define PMC_SCRATCH39                   0x138
47 /* PMC_SCRATCH41 stores the reset vector of the CPU after LP0 and LP1 */
48 #define PMC_SCRATCH41                   0x140
49
50 #ifdef CONFIG_ARCH_TEGRA_2x_SOC
51 #define CPU_RESETTABLE                  2
52 #define CPU_RESETTABLE_SOON             1
53 #define CPU_NOT_RESETTABLE              0
54 #endif
55
56 #define TEGRA_ARM_PERIF_VIRT (TEGRA_ARM_PERIF_BASE - IO_CPU_PHYS \
57                                         + IO_CPU_VIRT)
58 #define TEGRA_FLOW_CTRL_VIRT (TEGRA_FLOW_CTRL_BASE - IO_PPSB_PHYS \
59                                         + IO_PPSB_VIRT)
60 #define TEGRA_CLK_RESET_VIRT (TEGRA_CLK_RESET_BASE - IO_PPSB_PHYS \
61                                         + IO_PPSB_VIRT)
62
63 #ifdef __ASSEMBLY__
64 /* waits until the microsecond counter (base) ticks, for exact timing loops */
65 .macro  wait_for_us, rd, base, tmp
66         ldr    \rd, [\base]
67 1001:   ldr    \tmp, [\base]
68         cmp    \rd, \tmp
69         beq    1001b
70         mov    \tmp, \rd
71 .endm
72
73 /* waits until the microsecond counter (base) is > rn */
74 .macro  wait_until, rn, base, tmp
75         add     \rn, \rn, #1
76 1002:   ldr     \tmp, [\base]
77         sub     \tmp, \tmp, \rn
78         ands    \tmp, \tmp, #0x80000000
79         dmb
80         bne     1002b
81 .endm
82
83 /* returns the offset of the flow controller halt register for a cpu */
84 .macro cpu_to_halt_reg rd, rcpu
85         cmp     \rcpu, #0
86         subne   \rd, \rcpu, #1
87         movne   \rd, \rd, lsl #3
88         addne   \rd, \rd, #0x14
89         moveq   \rd, #0
90 .endm
91
92 /* returns the offset of the flow controller csr register for a cpu */
93 .macro cpu_to_csr_reg rd, rcpu
94         cmp     \rcpu, #0
95         subne   \rd, \rcpu, #1
96         movne   \rd, \rd, lsl #3
97         addne   \rd, \rd, #0x18
98         moveq   \rd, #8
99 .endm
100
101 /* returns the ID of the current processor */
102 .macro cpu_id, rd
103         mrc     p15, 0, \rd, c0, c0, 5
104         and     \rd, \rd, #0xF
105 .endm
106
107 /* loads a 32-bit value into a register without a data access */
108 .macro mov32, reg, val
109         movw    \reg, #:lower16:\val
110         movt    \reg, #:upper16:\val
111 .endm
112
113 /* Macro to exit SMP coherency. */
114 .macro exit_smp, tmp1, tmp2
115         mrc     p15, 0, \tmp1, c1, c0, 1        @ ACTLR
116         bic     \tmp1, \tmp1, #(1<<6) | (1<<0)  @ clear ACTLR.SMP | ACTLR.FW
117         mcr     p15, 0, \tmp1, c1, c0, 1        @ ACTLR
118         isb
119         cpu_id  \tmp1
120         mov     \tmp1, \tmp1, lsl #2
121         mov     \tmp2, #0xf
122         mov     \tmp2, \tmp2, lsl \tmp1
123         mov32   \tmp1, TEGRA_ARM_PERIF_VIRT + 0xC
124         str     \tmp2, [\tmp1]                  @ invalidate SCU tags for CPU
125         dsb
126 .endm
127
128 #define DEBUG_CONTEXT_STACK     0
129
130 /* pops a debug check token from the stack */
131 .macro  pop_stack_token tmp1, tmp2
132 #if DEBUG_CONTEXT_STACK
133         mov32   \tmp1, 0xBAB1F00D
134         ldmfd   sp!, {\tmp2}
135         cmp     \tmp1, \tmp2
136         movne   pc, #0
137 #endif
138 .endm
139
140 /* pushes a debug check token onto the stack */
141 .macro  push_stack_token tmp1
142 #if DEBUG_CONTEXT_STACK
143         mov32   \tmp1, 0xBAB1F00D
144         stmfd   sp!, {\tmp1}
145 #endif
146 .endm
147
148 .macro push_ctx_regs, tmp1
149         push_stack_token \tmp1          @ debug check word
150         stmfd   sp!, {r4 - r11, lr}
151 #if USE_TEGRA_DIAG_REG_SAVE
152         mrc     p15, 0, r4, c15, c0, 1  @ read diagnostic register
153         stmfd   sp!, {r4}
154 #endif
155 .endm
156
157 .macro pop_ctx_regs, tmp1, tmp2
158 #if USE_TEGRA_DIAG_REG_SAVE
159         ldmfd   sp!, {r4}
160         mcr     p15, 0, r4, c15, c0, 1  @ write diagnostic register
161 #endif
162         ldmfd   sp!, {r4 - r11, lr}
163         pop_stack_token \tmp1, \tmp2    @ debug stack debug token
164 .endm
165
166 #else
167
168 #ifdef CONFIG_HOTPLUG_CPU
169 void tegra20_hotplug_init(void);
170 void tegra30_hotplug_init(void);
171 #else
172 static inline void tegra20_hotplug_init(void) {}
173 static inline void tegra30_hotplug_init(void) {}
174 #endif
175
176 void tegra_pen_lock(void);
177 void tegra_pen_unlock(void);
178 void tegra_cpu_wfi(void);
179
180 #ifdef CONFIG_ARCH_TEGRA_2x_SOC
181 extern void tegra2_iram_start;
182 extern void tegra2_iram_end;
183 int  tegra2_cpu_is_resettable_soon(void);
184 void tegra2_cpu_reset(int cpu);
185 void tegra2_cpu_set_resettable_soon(void);
186 void tegra2_cpu_clear_resettable(void);
187 void tegra2_sleep_core(unsigned long v2p);
188 void tegra2_sleep_wfi(unsigned long v2p);
189 #else
190 extern void tegra3_iram_start;
191 extern void tegra3_iram_end;
192 void tegra3_sleep_core(unsigned long v2p);
193 void tegra3_sleep_cpu_secondary(unsigned long v2p);
194 #endif
195
196 static inline void *tegra_iram_start(void)
197 {
198 #ifdef CONFIG_ARCH_TEGRA_2x_SOC
199         return &tegra2_iram_start;
200 #else
201         return &tegra3_iram_start;
202 #endif
203 }
204
205 static inline void *tegra_iram_end(void)
206 {
207 #ifdef CONFIG_ARCH_TEGRA_2x_SOC
208         return &tegra2_iram_end;
209 #else
210         return &tegra3_iram_end;
211 #endif
212 }
213
214 static inline void tegra_sleep_core(unsigned long v2p)
215 {
216 #ifdef CONFIG_ARCH_TEGRA_2x_SOC
217         tegra2_sleep_core(v2p);
218 #else
219         tegra3_sleep_core(v2p);
220 #endif
221 }
222
223 void tegra_sleep_cpu(unsigned long v2p);
224 void tegra_resume(void);
225
226 #endif
227
228 #endif