ARM: tegra11: Update cache flush/invalidate for power gating
[linux-3.10.git] / arch / arm / mach-tegra / sleep-t20.S
1 /*
2  * Copyright (c) 2010-2012, NVIDIA Corporation. All rights reserved.
3  * Copyright (c) 2011, Google, Inc.
4  *
5  * Author: Colin Cross <ccross@android.com>
6  *         Gary King <gking@nvidia.com>
7  *
8  * This program is free software; you can redistribute it and/or modify it
9  * under the terms and conditions of the GNU General Public License,
10  * version 2, as published by the Free Software Foundation.
11  *
12  * This program is distributed in the hope it will be useful, but WITHOUT
13  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
15  * more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
19  */
20
21 #include <linux/const.h>
22 #include <linux/init.h>
23 #include <linux/linkage.h>
24
25 #include <asm/assembler.h>
26 #include <asm/cache.h>
27 #include <asm/domain.h>
28 #include <asm/memory.h>
29 #include <asm/page.h>
30 #include <asm/ptrace.h>
31 #include <asm/asm-offsets.h>
32 #include <asm/glue-cache.h>
33 #include <asm/glue-proc.h>
34
35 #include "sleep.h"
36 #include "flowctrl.h"
37
38 #define EMC_CFG                         0xc
39 #define EMC_ADR_CFG                     0x10
40 #define EMC_REFRESH                     0x70
41 #define EMC_NOP                         0xdc
42 #define EMC_SELF_REF                    0xe0
43 #define EMC_REQ_CTRL                    0x2b0
44 #define EMC_EMC_STATUS                  0x2b4
45
46 #define CLK_RESET_CCLK_BURST            0x20
47 #define CLK_RESET_CCLK_DIVIDER          0x24
48 #define CLK_RESET_SCLK_BURST            0x28
49 #define CLK_RESET_SCLK_DIVIDER          0x2c
50
51 #define CLK_RESET_PLLC_BASE             0x80
52 #define CLK_RESET_PLLM_BASE             0x90
53 #define CLK_RESET_PLLP_BASE             0xa0
54 #define CLK_RESET_PLLP_OUTA             0xa4
55 #define CLK_RESET_PLLP_OUTB             0xa8
56 #define CLK_RESET_PLLP_MISC             0xac
57 #define CLK_RESET_PLLX_BASE             0xe0
58 #define CLK_RESET_PLLX_MISC             0xe4
59
60 #define CLK_RESET_RST_CPU_CMPLX_SET     0x340
61
62 #if defined(CONFIG_HOTPLUG_CPU) || defined(CONFIG_PM_SLEEP)
63 /*
64  * tegra20_hotplug_shutdown(void)
65  *
66  * puts the current cpu in reset
67  * should never return
68  */
69 ENTRY(tegra20_hotplug_shutdown)
70         mov     r6, lr
71         bl      tegra_cpu_exit_coherency
72
73         /* Put this CPU down */
74         cpu_id  r0
75         bl      tegra20_cpu_shutdown
76         mov     pc, r6                  @ should never get here
77 ENDPROC(tegra20_hotplug_shutdown)
78 #endif
79
80 #if defined(CONFIG_HOTPLUG_CPU) || defined(CONFIG_PM_SLEEP)
81 /*
82  * tegra20_cpu_shutdown(int cpu)
83  *
84  * r0 is cpu to reset
85  *
86  * puts the specified CPU in wait-for-event mode on the flow controller
87  * and puts the CPU in reset
88  * can be called on the current cpu or another cpu
89  * if called on the current cpu, does not return
90  * MUST NOT BE CALLED FOR CPU 0.
91  *
92  * corrupts r0-r3, r12
93  */
94 ENTRY(tegra20_cpu_shutdown)
95         cmp     r0, #0
96         moveq   pc, lr                  @ must not be called for CPU 0
97
98         mov32   r1, TEGRA_PMC_VIRT + PMC_SCRATCH41
99         mov     r12, #CPU_RESETTABLE
100         str     r12, [r1]
101
102         cpu_to_halt_reg r1, r0
103         mov32   r3, TEGRA_FLOW_CTRL_VIRT
104         mov     r2, #FLOW_CTRL_WAITEVENT | FLOW_CTRL_JTAG_RESUME
105         str     r2, [r3, r1]            @ put flow controller in wait event mode
106         ldr     r2, [r3, r1]
107         isb
108         dsb
109         movw    r1, 0x1011
110         mov     r1, r1, lsl r0
111         mov32   r3, TEGRA_CLK_RESET_VIRT
112         str     r1, [r3, #CLK_RESET_RST_CPU_CMPLX_SET]  @ put slave CPU in reset
113         isb
114         dsb
115         cpu_id  r3
116         cmp     r3, r0
117         beq     .
118         mov     pc, lr
119 ENDPROC(tegra20_cpu_shutdown)
120 #endif
121
122 #ifdef CONFIG_PM_SLEEP
123 /*
124  * tegra2_cpu_clear_resettable(void)
125  *
126  * Called to clear the "resettable soon" flag in PMC_SCRATCH41 when
127  * it is expected that the secondary CPU will be idle soon.
128  */
129 ENTRY(tegra2_cpu_clear_resettable)
130         mov32   r1, TEGRA_PMC_VIRT + PMC_SCRATCH41
131         mov     r12, #CPU_NOT_RESETTABLE
132         str     r12, [r1]
133         mov     pc, lr
134 ENDPROC(tegra2_cpu_clear_resettable)
135
136 /*
137  * tegra2_cpu_set_resettable_soon(void)
138  *
139  * Called to set the "resettable soon" flag in PMC_SCRATCH41 when
140  * it is expected that the secondary CPU will be idle soon.
141  */
142 ENTRY(tegra2_cpu_set_resettable_soon)
143         mov32   r1, TEGRA_PMC_VIRT + PMC_SCRATCH41
144         mov     r12, #CPU_RESETTABLE_SOON
145         str     r12, [r1]
146         mov     pc, lr
147 ENDPROC(tegra2_cpu_set_resettable_soon)
148
149 /*
150  * tegra2_cpu_is_resettable_soon(void)
151  *
152  * Returns true if the "resettable soon" flag in PMC_SCRATCH41 has been
153  * set because it is expected that the secondary CPU will be idle soon.
154  */
155 ENTRY(tegra2_cpu_is_resettable_soon)
156         mov32   r1, TEGRA_PMC_VIRT + PMC_SCRATCH41
157         ldr     r12, [r1]
158         cmp     r12, #CPU_RESETTABLE_SOON
159         moveq   r0, #1
160         movne   r0, #0
161         mov     pc, lr
162 ENDPROC(tegra2_cpu_is_resettable_soon)
163
164 /*
165  * tegra2_sleep_core(unsigned long v2p)
166  *
167  * enters suspend in LP0 or LP1 by turning off the mmu and jumping to
168  * tegra2_tear_down_core in IRAM
169  */
170 ENTRY(tegra2_sleep_core_finish)
171         bl      tegra_cpu_exit_coherency
172         mov32   r1, tegra2_tear_down_core
173         mov32   r2, tegra2_iram_start
174         sub     r1, r1, r2
175         mov32   r2, TEGRA_IRAM_CODE_AREA
176         add     r1, r1, r2
177         b       tegra_turn_off_mmu
178 ENDPROC(tegra2_sleep_core_finish)
179
180 /*
181  * tegra2_sleep_cpu_secondary_finish(unsigned long v2p)
182  *
183  * Enters WFI on secondary CPU by exiting coherency.
184  */
185 ENTRY(tegra2_finish_sleep_cpu_secondary)
186         mrc     p15, 0, r11, c1, c0, 1  @ save actlr before exiting coherency
187
188         dsb
189 #ifdef MULTI_CACHE
190 #ifdef CONFIG_HAVE_ARM_SCU
191         mov32   r10, cpu_cache
192         mov     lr, pc
193         ldr     pc, [r10, #CACHE_FLUSH_KERN_ALL]
194 #else
195         cpu_id  r2
196         cpu_to_csr_reg  r1,     r2
197         mov32   r10, TEGRA_FLOW_CTRL_VIRT
198         ldr     r10, [r10, r1]
199         tst     r10, #FLOW_CTRL_CSR_ENABLE_EXT_MASK
200         beq     flush_l1
201         mov32   r10, cpu_cache
202         mov     lr, pc
203         ldr     pc, [r10, #CACHE_FLUSH_KERN_ALL]
204         b       no_l2_sync
205 flush_l1:
206         bl      tegra_flush_l1_cache
207 #endif
208 #else
209         bl      __cpuc_flush_kern_all
210 #endif
211
212         bl      tegra_cpu_exit_coherency
213
214         mov32   r0, TEGRA_PMC_VIRT + PMC_SCRATCH41
215         mov     r3, #CPU_RESETTABLE
216         str     r3, [r0]
217
218         bl      tegra_cpu_wfi
219
220         /*
221          * cpu may be reset while in wfi, which will return through
222          * tegra_resume to tegra_cpu_resume_phys to tegra_cpu_resume
223          * or interrupt may wake wfi, which will return here
224          * cpu state is unchanged - MMU is on, cache is on, coherency
225          * is off, and the data cache is off
226          *
227          * r11 contains the original actlr
228          */
229         bl      tegra_pen_lock
230
231         mov32   r3, TEGRA_PMC_VIRT
232         add     r0, r3, #PMC_SCRATCH41
233         mov     r3, #CPU_NOT_RESETTABLE
234         str     r3, [r0]
235
236         bl      tegra_pen_unlock
237
238         mcr     p15, 0, r11, c1, c0, 1  @ reenable coherency
239
240         /* Invalidate the TLBs & BTAC */
241         mov     r1, #0
242         mcr     p15, 0, r1, c8, c3, 0   @ invalidate shared TLBs
243         mcr     p15, 0, r1, c7, c1, 6   @ invalidate shared BTAC
244         dsb
245         isb
246
247         @ the cpu was running with coherency disabled, caches may be out of date
248 #ifdef MULTI_CACHE
249 #ifdef CONFIG_HAVE_ARM_SCU
250         mov32   r10, cpu_cache
251         mov     lr, pc
252         ldr     pc, [r10, #CACHE_FLUSH_KERN_ALL]
253 #else
254         cpu_id  r2
255         cpu_to_csr_reg  r1,     r2
256         mov32   r10, TEGRA_FLOW_CTRL_VIRT
257         ldr     r10, [r10, r1]
258         tst     r10, #FLOW_CTRL_CSR_ENABLE_EXT_MASK
259         beq     flush_l1
260         mov32   r10, cpu_cache
261         mov     lr, pc
262         ldr     pc, [r10, #CACHE_FLUSH_KERN_ALL]
263         b       no_l2_sync
264 flush_l1:
265         bl      tegra_flush_l1_cache
266 #endif
267 #else
268         bl      __cpuc_flush_kern_all
269 #endif
270
271         ldmia   sp!, {r1 - r3}          @ pop phys pgd, virt SP, phys resume fn
272         mov     r0, #0                  @ return success
273         mov     sp, r2                  @ sp is stored in r2 by __cpu_suspend
274         ldmfd   sp!, {r4 - r11, pc}
275 ENDPROC(tegra2_finish_sleep_cpu_secondary)
276
277 /*
278  * tegra2_tear_down_cpu
279  *
280  * Switches the CPU cluster to PLL-P and enters sleep.
281  */
282 ENTRY(tegra2_tear_down_cpu)
283         bl      tegra_cpu_pllp
284         b       tegra2_enter_sleep
285 ENDPROC(tegra2_tear_down_cpu)
286
287 /* START OF ROUTINES COPIED TO IRAM */
288         .align L1_CACHE_SHIFT
289         .globl tegra2_iram_start
290 tegra2_iram_start:
291
292 /*
293  * tegra2_lp1_reset
294  *
295  * reset vector for LP1 restore; copied into IRAM during suspend.
296  * brings the system back up to a safe starting point (SDRAM out of
297  * self-refresh, PLLC, PLLM and PLLP reenabled, CPU running on PLLP,
298  * system clock running on the same PLL that it suspended at), and
299  * jumps to tegra_lp2_startup to restore PLLX and virtual addressing.
300  * physical address of tegra_lp2_startup expected to be stored in
301  * PMC_SCRATCH41
302  *
303  * NOTE: THIS *MUST* BE RELOCATED TO TEGRA_IRAM_CODE_AREA AND MUST BE FIRST.
304  */
305 ENTRY(tegra2_lp1_reset)
306         /*
307          * the CPU and system bus are running at 32KHz and executing from
308          * IRAM when this code is executed; immediately switch to CLKM and
309          * enable PLLP.
310          */
311         mov32   r0, TEGRA_CLK_RESET_BASE
312 #ifndef CONFIG_TRUSTED_FOUNDATIONS
313         /* secure code handles 32KHz to CLKM/OSC clock switch */
314         mov     r1, #(1 << 28)
315         str     r1, [r0, #CLK_RESET_SCLK_BURST]
316         str     r1, [r0, #CLK_RESET_CCLK_BURST]
317         mov     r1, #0
318         str     r1, [r0, #CLK_RESET_SCLK_DIVIDER]
319         str     r1, [r0, #CLK_RESET_CCLK_DIVIDER]
320 #endif
321         ldr     r1, [r0, #CLK_RESET_PLLM_BASE]
322         tst     r1, #(1 << 30)
323         orreq   r1, r1, #(1 << 30)
324         streq   r1, [r0, #CLK_RESET_PLLM_BASE]
325         ldr     r1, [r0, #CLK_RESET_PLLP_BASE]
326         tst     r1, #(1 << 30)
327         orreq   r1, r1, #(1 << 30)
328         streq   r1, [r0, #CLK_RESET_PLLP_BASE]
329         ldr     r1, [r0, #CLK_RESET_PLLC_BASE]
330         tst     r1, #(1 << 30)
331         orreq   r1, r1, #(1 << 30)
332         streq   r1, [r0, #CLK_RESET_PLLC_BASE]
333
334         adr     r2, tegra2_sdram_pad_address
335         adr     r4, tegra2_sdram_pad_save
336         mov     r5, #0
337
338 padload:
339         ldr     r0, [r2, r5]            @ r0 is emc register address
340
341         ldr     r1, [r4, r5]
342         str     r1, [r0]                @ set emc register to safe vals
343
344         add     r5, r5, #4
345         ldr     r0, tegra2_sdram_pad_size
346         cmp     r0, r5
347         bne     padload
348
349 padload_done:
350         mov32   r7, TEGRA_TMRUS_BASE
351         ldr     r1, [r7]
352         add     r1, r1, #0xff           @ 255uS delay for PLL stabilization
353
354 1:      ldr     r0, [r7]
355         cmp     r0, r1
356         dmb
357         bmi     1b
358
359         adr     r4, tegra2_sclk_save
360         ldr     r4, [r4]
361         mov32   r0, TEGRA_CLK_RESET_BASE
362         str     r4, [r0, #CLK_RESET_SCLK_BURST]
363         ldr     r4, =((1 << 28) | (4))  @ burst policy is PLLP
364         str     r4, [r0, #CLK_RESET_CCLK_BURST]
365
366         mov32   r0, TEGRA_EMC_BASE
367         ldr     r1, [r0, #EMC_CFG]
368         bic     r1, r1, #(1 << 31)      @ disable DRAM_CLK_STOP
369         str     r1, [r0, #EMC_CFG]
370
371         mov     r1, #0
372         str     r1, [r0, #EMC_SELF_REF] @ take DRAM out of self refresh
373         mov     r1, #1
374         str     r1, [r0, #EMC_NOP]
375         str     r1, [r0, #EMC_NOP]
376         str     r1, [r0, #EMC_REFRESH]
377
378         ldr     r1, [r0, #EMC_ADR_CFG]
379         tst     r1, #(0x3 << 24)
380         moveq   r1, #(0x1 << 8)         @ just 1 device
381         movne   r1, #(0x3 << 8)         @ 2 devices
382
383 exit_selfrefresh_loop:
384         ldr     r2, [r0, #EMC_EMC_STATUS]
385         ands    r2, r2, r1
386         bne     exit_selfrefresh_loop
387
388         mov     r1, #0
389         str     r1, [r0, #EMC_REQ_CTRL]
390
391         ldr     r0, =TEGRA_PMC_BASE
392         ldr     r0, [r0, #PMC_SCRATCH41]
393         mov     pc, r0
394 ENDPROC(tegra2_lp1_reset)
395
396 /*
397  * tegra2_tear_down_core
398  *
399  * copied into and executed from IRAM
400  * puts memory in self-refresh for LP0 and LP1
401  */
402 tegra2_tear_down_core:
403         bl      tegra2_sdram_self_refresh
404         bl      tegra2_cpu_clk32k
405         b       tegra2_enter_sleep
406
407 /*
408  * tegra2_cpu_clk32k
409  *
410  * In LP0 and LP1 all plls will be turned off.  Switch the CPU and system clock
411  * to the 32khz clock (clks)
412  */
413 tegra2_cpu_clk32k:
414         /* start by jumping to clkm to safely disable PLLs, then jump
415          * to clks */
416         mov     r0, #(1 << 28)
417         str     r0, [r5, #CLK_RESET_SCLK_BURST]
418         str     r0, [r5, #CLK_RESET_CCLK_BURST]
419         mov     r0, #0
420         str     r0, [r5, #CLK_RESET_CCLK_DIVIDER]
421         str     r0, [r5, #CLK_RESET_SCLK_DIVIDER]
422
423         /* 2 us delay between changing sclk and disabling PLLs */
424         mov32   r7, TEGRA_TMRUS_BASE
425         ldr     r1, [r7]
426         add     r1, r1, #3
427
428 1:      ldr     r0, [r7]
429         cmp     r0, r1
430         dmb
431         bmi     1b
432
433         /* switch to CLKS */
434         mov     r0, #0  /* burst policy = 32KHz */
435         str     r0, [r5, #CLK_RESET_SCLK_BURST]
436
437         /* disable PLLP, PLLM, PLLC in LP0 and LP1 states */
438         ldr     r0, [r5, #CLK_RESET_PLLM_BASE]
439         bic     r0, r0, #(1 << 30)
440         str     r0, [r5, #CLK_RESET_PLLM_BASE]
441         ldr     r0, [r5, #CLK_RESET_PLLP_BASE]
442         bic     r0, r0, #(1 << 30)
443         str     r0, [r5, #CLK_RESET_PLLP_BASE]
444         ldr     r0, [r5, #CLK_RESET_PLLC_BASE]
445         bic     r0, r0, #(1 << 30)
446         str     r0, [r5, #CLK_RESET_PLLC_BASE]
447         mov     pc, lr
448
449 /*
450  * tegra2_enter_sleep
451  *
452  * uses flow controller to enter sleep state
453  * executes from IRAM with SDRAM in selfrefresh when target state is LP0 and LP1
454  * executes from SDRAM with target state is LP2
455  */
456 tegra2_enter_sleep:
457         mov32   r7, TEGRA_TMRUS_BASE
458         ldr     r1, [r7]
459         mov32   r4, TEGRA_PMC_BASE
460         str     r1, [r4, #PMC_SCRATCH38]
461         dsb
462         mov32   r6, TEGRA_FLOW_CTRL_BASE
463
464         mov     r0, #FLOW_CTRL_WAIT_FOR_INTERRUPT
465         orr     r0, r0, #FLOW_CTRL_HALT_CPU_IRQ | FLOW_CTRL_HALT_CPU_FIQ
466         cpu_id  r1
467         cpu_to_halt_reg r1, r1
468         str     r0, [r6, r1]
469         dsb
470         ldr     r0, [r6, r1] /* memory barrier */
471
472 halted: dsb
473         wfe     /* CPU should be power gated here */
474         isb
475         b       halted
476
477 /*
478  * tegra2_sdram_self_refresh
479  *
480  * called with MMU off and caches disabled
481  * puts sdram in self refresh
482  * must execute from IRAM
483  */
484 tegra2_sdram_self_refresh:
485         mov32   r1, TEGRA_EMC_BASE
486         mov     r2, #3
487         str     r2, [r1, #EMC_REQ_CTRL]         @ stall incoming DRAM requests
488
489 emcidle:ldr     r2, [r1, #EMC_EMC_STATUS]
490         tst     r2, #4
491         beq     emcidle
492
493         mov     r2, #1
494         str     r2, [r1, #EMC_SELF_REF]
495
496         ldr     r2, [r1, #EMC_ADR_CFG]
497         tst     r2, #(0x3 << 24)
498         moveq   r2, #(0x1 << 8)                 @ just 1 device
499         movne   r2, #(0x3 << 8)                 @ 2 devices
500
501 emcself:ldr     r3, [r1, #EMC_EMC_STATUS]
502         and     r3, r3, r2
503         cmp     r3, r2
504         bne     emcself                         @ loop until DDR in self-refresh
505
506         adr     r2, tegra2_sdram_pad_address
507         adr     r3, tegra2_sdram_pad_safe
508         adr     r4, tegra2_sdram_pad_save
509         mov     r5, #0
510
511 padsave:
512         ldr     r0, [r2, r5]                    @ r0 is emc register address
513
514         ldr     r1, [r0]
515         str     r1, [r4, r5]                    @ save emc register
516
517         ldr     r1, [r3, r5]
518         str     r1, [r0]                        @ set emc register to safe vals
519
520         add     r5, r5, #4
521         ldr     r0, tegra2_sdram_pad_size
522         cmp     r0, r5
523         bne     padsave
524 padsave_done:
525
526         mov32   r5, TEGRA_CLK_RESET_BASE
527         ldr     r0, [r5, #CLK_RESET_SCLK_BURST]
528         adr     r2, tegra2_sclk_save
529         str     r0, [r2]
530         dsb
531         mov     pc, lr
532
533 tegra2_sdram_pad_address:
534         .word   TEGRA_APB_MISC_BASE + 0x8c8 /* XM2CFGCPADCTRL */
535         .word   TEGRA_APB_MISC_BASE + 0x8cc /* XM2CFGDPADCTRL */
536         .word   TEGRA_APB_MISC_BASE + 0x8d0 /* XM2CLKCFGPADCTRL */
537         .word   TEGRA_APB_MISC_BASE + 0x8d4 /* XM2COMPPADCTRL */
538         .word   TEGRA_APB_MISC_BASE + 0x8d8 /* XM2VTTGENPADCTRL */
539         .word   TEGRA_APB_MISC_BASE + 0x8e4 /* XM2CFGCPADCTRL2 */
540         .word   TEGRA_APB_MISC_BASE + 0x8e8 /* XM2CFGDPADCTRL2 */
541
542 tegra2_sdram_pad_size:
543         .word   tegra2_sdram_pad_size - tegra2_sdram_pad_address
544
545 tegra2_sdram_pad_safe:
546         .word   0x8
547         .word   0x8
548         .word   0x0
549         .word   0x8
550         .word   0x5500
551         .word   0x08080040
552         .word   0x0
553
554 tegra2_sclk_save:
555         .word   0x0
556
557 tegra2_sdram_pad_save:
558         .word   0
559         .word   0
560         .word   0
561         .word   0
562         .word   0
563         .word   0
564         .word   0
565
566         .ltorg
567 /* dummy symbol for end of IRAM */
568         .align L1_CACHE_SHIFT
569         .globl tegra2_iram_end
570 tegra2_iram_end:
571         b       .
572 #endif