ed28e211d02ea82d8e40d3fdb65e27e5b1023cf4
[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 TEGRA_PL310_VIRT (TEGRA_ARM_PL310_BASE - IO_CPU_PHYS + IO_CPU_VIRT)
57 #define TEGRA_ARM_PERIF_VIRT (TEGRA_ARM_PERIF_BASE - IO_CPU_PHYS \
58                                         + IO_CPU_VIRT)
59 #define TEGRA_FLOW_CTRL_VIRT (TEGRA_FLOW_CTRL_BASE - IO_PPSB_PHYS \
60                                         + IO_PPSB_VIRT)
61 #define TEGRA_CLK_RESET_VIRT (TEGRA_CLK_RESET_BASE - IO_PPSB_PHYS \
62                                         + IO_PPSB_VIRT)
63
64 #ifdef __ASSEMBLY__
65 /* waits until the microsecond counter (base) ticks, for exact timing loops */
66 .macro  wait_for_us, rd, base, tmp
67         ldr    \rd, [\base]
68 1001:   ldr    \tmp, [\base]
69         cmp    \rd, \tmp
70         beq    1001b
71         mov    \tmp, \rd
72 .endm
73
74 /* waits until the microsecond counter (base) is > rn */
75 .macro  wait_until, rn, base, tmp
76         add     \rn, \rn, #1
77 1002:   ldr     \tmp, [\base]
78         sub     \tmp, \tmp, \rn
79         ands    \tmp, \tmp, #0x80000000
80         dmb
81         bne     1002b
82 .endm
83
84 /* returns the offset of the flow controller halt register for a cpu */
85 .macro cpu_to_halt_reg rd, rcpu
86         cmp     \rcpu, #0
87         subne   \rd, \rcpu, #1
88         movne   \rd, \rd, lsl #3
89         addne   \rd, \rd, #0x14
90         moveq   \rd, #0
91 .endm
92
93 /* returns the offset of the flow controller csr register for a cpu */
94 .macro cpu_to_csr_reg rd, rcpu
95         cmp     \rcpu, #0
96         subne   \rd, \rcpu, #1
97         movne   \rd, \rd, lsl #3
98         addne   \rd, \rd, #0x18
99         moveq   \rd, #8
100 .endm
101
102 /* returns the ID of the current processor */
103 .macro cpu_id, rd
104         mrc     p15, 0, \rd, c0, c0, 5
105         and     \rd, \rd, #0xF
106 .endm
107
108 /* loads a 32-bit value into a register without a data access */
109 .macro mov32, reg, val
110         movw    \reg, #:lower16:\val
111         movt    \reg, #:upper16:\val
112 .endm
113
114 /* Macro to exit SMP coherency. */
115 .macro exit_smp, tmp1, tmp2
116         mrc     p15, 0, \tmp1, c1, c0, 1        @ ACTLR
117         bic     \tmp1, \tmp1, #(1<<6) | (1<<0)  @ clear ACTLR.SMP | ACTLR.FW
118         mcr     p15, 0, \tmp1, c1, c0, 1        @ ACTLR
119         isb
120         cpu_id  \tmp1
121         mov     \tmp1, \tmp1, lsl #2
122         mov     \tmp2, #0xf
123         mov     \tmp2, \tmp2, lsl \tmp1
124         mov32   \tmp1, TEGRA_ARM_PERIF_VIRT + 0xC
125         str     \tmp2, [\tmp1]                  @ invalidate SCU tags for CPU
126         dsb
127 .endm
128
129 #define DEBUG_CONTEXT_STACK     0
130
131 /* pops a debug check token from the stack */
132 .macro  pop_stack_token tmp1, tmp2
133 #if DEBUG_CONTEXT_STACK
134         mov32   \tmp1, 0xBAB1F00D
135         ldmfd   sp!, {\tmp2}
136         cmp     \tmp1, \tmp2
137         movne   pc, #0
138 #endif
139 .endm
140
141 /* pushes a debug check token onto the stack */
142 .macro  push_stack_token tmp1
143 #if DEBUG_CONTEXT_STACK
144         mov32   \tmp1, 0xBAB1F00D
145         stmfd   sp!, {\tmp1}
146 #endif
147 .endm
148
149 #else   /* !defined(__ASSEMBLY__) */
150
151 #ifdef CONFIG_HOTPLUG_CPU
152 void tegra20_hotplug_init(void);
153 void tegra30_hotplug_init(void);
154 #else
155 static inline void tegra20_hotplug_init(void) {}
156 static inline void tegra30_hotplug_init(void) {}
157 #endif
158
159 void tegra_pen_lock(void);
160 void tegra_pen_unlock(void);
161 void tegra_cpu_wfi(void);
162 int tegra_sleep_cpu_finish(unsigned long v2p);
163 void tegra_resume(void);
164 void tegra_cpu_resume(void);
165
166 #ifdef CONFIG_ARCH_TEGRA_2x_SOC
167 extern void tegra2_iram_start;
168 extern void tegra2_iram_end;
169 int  tegra2_cpu_is_resettable_soon(void);
170 void tegra2_cpu_reset(int cpu);
171 void tegra2_cpu_set_resettable_soon(void);
172 void tegra2_cpu_clear_resettable(void);
173 int tegra2_sleep_core_finish(unsigned long int);
174 void tegra2_sleep_wfi(unsigned long v2p);
175 int tegra2_finish_sleep_cpu_secondary(unsigned long int);
176 #else
177 extern void tegra3_iram_start;
178 extern void tegra3_iram_end;
179 int tegra3_sleep_core_finish(unsigned long int);
180 int tegra3_sleep_cpu_secondary_finish(unsigned long int);
181 #endif
182
183 static inline void *tegra_iram_start(void)
184 {
185 #ifdef CONFIG_ARCH_TEGRA_2x_SOC
186         return &tegra2_iram_start;
187 #else
188         return &tegra3_iram_start;
189 #endif
190 }
191
192 static inline void *tegra_iram_end(void)
193 {
194 #ifdef CONFIG_ARCH_TEGRA_2x_SOC
195         return &tegra2_iram_end;
196 #else
197         return &tegra3_iram_end;
198 #endif
199 }
200 #endif
201 #endif