unknown changes from android-tegra-nv-3.4
[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 #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 FLOW_CTRL_HALT_CPU0_EVENTS      0x0
57 #define   FLOW_CTRL_WAITEVENT           (2 << 29)
58 #define   FLOW_CTRL_WAIT_FOR_INTERRUPT  (4 << 29)
59 #define   FLOW_CTRL_JTAG_RESUME         (1 << 28)
60 #define   FLOW_CTRL_HALT_CPU_IRQ        (1 << 10)
61 #define   FLOW_CTRL_HALT_CPU_FIQ        (1 << 8)
62 #define FLOW_CTRL_CPU0_CSR              0x8
63 #define   FLOW_CTRL_CSR_INTR_FLAG       (1 << 15)
64 #define   FLOW_CTRL_CSR_EVENT_FLAG      (1 << 14)
65 #define   FLOW_CTRL_CSR_ENABLE          (1 << 0)
66 #define FLOW_CTRL_HALT_CPU1_EVENTS      0x14
67 #define FLOW_CTRL_CPU1_CSR              0x18
68
69 #ifdef CONFIG_ARCH_TEGRA_2x_SOC
70 #define FLOW_CTRL_CSR_WFE_CPU0          (1 << 4)
71 #define FLOW_CTRL_CSR_WFE_BITMAP        (3 << 4)
72 #define FLOW_CTRL_CSR_WFI_BITMAP        0
73 #else
74 #define FLOW_CTRL_CSR_WFE_BITMAP        (0xF << 4)
75 #define FLOW_CTRL_CSR_WFI_CPU0          (1 << 8)
76 #define FLOW_CTRL_CSR_WFI_BITMAP        (0xF << 8)
77 #endif
78
79 #define TEGRA_PL310_VIRT (TEGRA_ARM_PL310_BASE - IO_CPU_PHYS + IO_CPU_VIRT)
80 #define TEGRA_ARM_PERIF_VIRT (TEGRA_ARM_PERIF_BASE - IO_CPU_PHYS \
81                                         + IO_CPU_VIRT)
82 #define TEGRA_FLOW_CTRL_VIRT (TEGRA_FLOW_CTRL_BASE - IO_PPSB_PHYS \
83                                         + IO_PPSB_VIRT)
84 #define TEGRA_CLK_RESET_VIRT (TEGRA_CLK_RESET_BASE - IO_PPSB_PHYS \
85                                         + IO_PPSB_VIRT)
86
87 #ifdef __ASSEMBLY__
88 /* waits until the microsecond counter (base) ticks, for exact timing loops */
89 .macro  wait_for_us, rd, base, tmp
90         ldr    \rd, [\base]
91 1001:   ldr    \tmp, [\base]
92         cmp    \rd, \tmp
93         beq    1001b
94         mov    \tmp, \rd
95 .endm
96
97 /* waits until the microsecond counter (base) is > rn */
98 .macro  wait_until, rn, base, tmp
99         add     \rn, \rn, #1
100 1002:   ldr     \tmp, [\base]
101         sub     \tmp, \tmp, \rn
102         ands    \tmp, \tmp, #0x80000000
103         dmb
104         bne     1002b
105 .endm
106
107 /* returns the offset of the flow controller halt register for a cpu */
108 .macro cpu_to_halt_reg rd, rcpu
109         cmp     \rcpu, #0
110         subne   \rd, \rcpu, #1
111         movne   \rd, \rd, lsl #3
112         addne   \rd, \rd, #0x14
113         moveq   \rd, #0
114 .endm
115
116 /* returns the offset of the flow controller csr register for a cpu */
117 .macro cpu_to_csr_reg rd, rcpu
118         cmp     \rcpu, #0
119         subne   \rd, \rcpu, #1
120         movne   \rd, \rd, lsl #3
121         addne   \rd, \rd, #0x18
122         moveq   \rd, #8
123 .endm
124
125 /* returns the ID of the current processor */
126 .macro cpu_id, rd
127         mrc     p15, 0, \rd, c0, c0, 5
128         and     \rd, \rd, #0xF
129 .endm
130
131 /* loads a 32-bit value into a register without a data access */
132 .macro mov32, reg, val
133         movw    \reg, #:lower16:\val
134         movt    \reg, #:upper16:\val
135 .endm
136
137 /* Macro to exit SMP coherency. */
138 .macro exit_smp, tmp1, tmp2
139         mrc     p15, 0, \tmp1, c1, c0, 1        @ ACTLR
140         bic     \tmp1, \tmp1, #(1<<6) | (1<<0)  @ clear ACTLR.SMP | ACTLR.FW
141         mcr     p15, 0, \tmp1, c1, c0, 1        @ ACTLR
142         isb
143         cpu_id  \tmp1
144         mov     \tmp1, \tmp1, lsl #2
145         mov     \tmp2, #0xf
146         mov     \tmp2, \tmp2, lsl \tmp1
147         mov32   \tmp1, TEGRA_ARM_PERIF_VIRT + 0xC
148         str     \tmp2, [\tmp1]                  @ invalidate SCU tags for CPU
149         dsb
150 .endm
151
152 #define DEBUG_CONTEXT_STACK     0
153
154 /* pops a debug check token from the stack */
155 .macro  pop_stack_token tmp1, tmp2
156 #if DEBUG_CONTEXT_STACK
157         mov32   \tmp1, 0xBAB1F00D
158         ldmfd   sp!, {\tmp2}
159         cmp     \tmp1, \tmp2
160         movne   pc, #0
161 #endif
162 .endm
163
164 /* pushes a debug check token onto the stack */
165 .macro  push_stack_token tmp1
166 #if DEBUG_CONTEXT_STACK
167         mov32   \tmp1, 0xBAB1F00D
168         stmfd   sp!, {\tmp1}
169 #endif
170 .endm
171
172 #else   /* !defined(__ASSEMBLY__) */
173
174 #include <linux/io.h>
175
176 #ifdef CONFIG_HOTPLUG_CPU
177 void tegra20_hotplug_init(void);
178 void tegra30_hotplug_init(void);
179 #else
180 static inline void tegra20_hotplug_init(void) {}
181 static inline void tegra30_hotplug_init(void) {}
182 #endif
183
184 #define FLOW_CTRL_HALT_CPU(cpu) (IO_ADDRESS(TEGRA_FLOW_CTRL_BASE) +     \
185         ((cpu) ? (FLOW_CTRL_HALT_CPU1_EVENTS + 8 * ((cpu) - 1)) :       \
186          FLOW_CTRL_HALT_CPU0_EVENTS))
187
188 #define FLOW_CTRL_CPU_CSR(cpu)  (IO_ADDRESS(TEGRA_FLOW_CTRL_BASE) +     \
189         ((cpu) ? (FLOW_CTRL_CPU1_CSR + 8 * ((cpu) - 1)) :       \
190          FLOW_CTRL_CPU0_CSR))
191
192 static inline void flowctrl_writel(unsigned long val, void __iomem *addr)
193 {
194         writel(val, addr);
195 #ifdef CONFIG_ARCH_TEGRA_2x_SOC
196         wmb();
197 #endif
198         (void)__raw_readl(addr);
199 }
200
201 void tegra_pen_lock(void);
202 void tegra_pen_unlock(void);
203 void tegra_cpu_wfi(void);
204 int tegra_sleep_cpu_finish(unsigned long v2p);
205 void tegra_resume(void);
206 void tegra_cpu_resume(void);
207
208 #ifdef CONFIG_ARCH_TEGRA_2x_SOC
209 extern void tegra2_iram_start;
210 extern void tegra2_iram_end;
211 int  tegra2_cpu_is_resettable_soon(void);
212 void tegra2_cpu_reset(int cpu);
213 void tegra2_cpu_set_resettable_soon(void);
214 void tegra2_cpu_clear_resettable(void);
215 int tegra2_sleep_core_finish(unsigned long int);
216 void tegra2_sleep_wfi(unsigned long v2p);
217 int tegra2_finish_sleep_cpu_secondary(unsigned long int);
218 #else
219 extern void tegra3_iram_start;
220 extern void tegra3_iram_end;
221 int tegra3_sleep_core_finish(unsigned long int);
222 int tegra3_sleep_cpu_secondary_finish(unsigned long int);
223 #endif
224
225 static inline void *tegra_iram_start(void)
226 {
227 #ifdef CONFIG_ARCH_TEGRA_2x_SOC
228         return &tegra2_iram_start;
229 #else
230         return &tegra3_iram_start;
231 #endif
232 }
233
234 static inline void *tegra_iram_end(void)
235 {
236 #ifdef CONFIG_ARCH_TEGRA_2x_SOC
237         return &tegra2_iram_end;
238 #else
239         return &tegra3_iram_end;
240 #endif
241 }
242 #endif
243 #endif