arm: tegra: Move driver files to drivers/platform
[linux-3.10.git] / arch / arm / mach-tegra / headsmp.S
1 /*
2  * arch/arm/mach-tegra/headsmp.S
3  *
4  * CPU initialization routines for Tegra SoCs
5  *
6  * Copyright (c) 2009-2014, NVIDIA CORPORATION.  All rights reserved.
7  * Copyright (c) 2011 Google, Inc.
8  * Author: Colin Cross <ccross@android.com>
9  *         Gary King <gking@nvidia.com>
10  *
11  * This program is free software; you can redistribute it and/or modify
12  * it under the terms of the GNU General Public License as published by
13  * the Free Software Foundation; either version 2 of the License.
14  *
15  * This program is distributed in the hope that it will be useful, but WITHOUT
16  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
17  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
18  * more details.
19  */
20
21 #include <linux/linkage.h>
22 #include <linux/init.h>
23
24 #include <asm/assembler.h>
25 #include <asm/cache.h>
26 #include <asm/page.h>
27 #include <asm/hardware/cache-l2x0.h>
28 #include <asm/memory.h>
29
30 #include <linux/platform/tegra/flowctrl.h>
31 #include "iomap.h"
32 #include "sleep.h"
33 #include <linux/platform/tegra/reset.h>
34
35 #define APB_MISC_GP_HIDREV      0x804
36 #define PMC_SCRATCH41   0x140
37
38 #define DEBUG_CPU_RESET_HANDLER 0       /* Non-zero enables debug code */
39
40 #define RESET_DATA_PHYS (TEGRA_RESET_HANDLER_BASE \
41         + __tegra_cpu_reset_handler_data - __tegra_cpu_reset_handler_start)
42
43 #ifdef CONFIG_SMP
44 /*
45  *      tegra_secondary_startup
46  *
47  *       Initial secondary processor boot vector; jumps to kernel's
48  *       secondary_startup routine. Used for initial boot and hotplug
49  *       of secondary CPUs.
50  */
51         __CPUINIT
52 ENTRY(tegra_secondary_startup)
53         ldr     r0, =tegra_with_secure_firmware
54         sub     r0, #(PAGE_OFFSET - TEGRA_DRAM_BASE)
55         ldr     r12, [r0]
56
57         bl      __invalidate_cpu_state
58
59         cmp     r12, #1                 @ secure firmware present?
60         beq     secondary_startup
61
62         /* enable user space perf counter access */
63         /* only accessible in secure state       */
64         mrc     p15, 0, r0, c9, c12, 0
65         lsr     r0, #11
66         and     r0, r0, #0x1f
67         mov     r1, #1
68         lsl     r1, r1, r0
69         sub     r1, r1, #1
70         movt    r1, #0x8000
71         mcr     p15, 0, r1, c9, c14, 2
72         mov     r0, #1
73         mcr     p15, 0, r0, c9, c14, 0
74
75         b       secondary_startup
76 ENDPROC(tegra_secondary_startup)
77 #endif
78
79         .section ".text.head", "ax"
80 #ifdef CONFIG_PM_SLEEP
81 /*
82  *      tegra_resume
83  *
84  *        CPU boot vector when restarting the a CPU following
85  *        an LP2 transition. Also branched to by LP0 and LP1 resume after
86  *        re-enabling sdram.
87  */
88 ENTRY(tegra_resume)
89         ldr     r0, =tegra_with_secure_firmware
90         sub     r0, #(PAGE_OFFSET - TEGRA_DRAM_BASE)
91         ldr     r12, [r0]
92         cmp     r12, #1
93         bne     cpu_not_secure
94
95         mov32   r1, TEGRA_TMRUS_BASE
96         ldr     r0, [r1]
97         adr     r1, tegra_resume_entry_time
98         str     r0, [r1]
99
100 cpu_not_secure:
101         bl      __invalidate_cpu_state
102
103         cpu_id  r0
104         mov32   r2, TEGRA_FLOW_CTRL_BASE
105         mov     r3, #0
106         cpu_to_csr_reg r1, r0
107         str     r3, [r2, r1]
108         cpu_to_halt_reg r1, r0
109         str     r3, [r2, r1]
110         ldr     r3, [r2, r1]
111
112 #ifndef CONFIG_TEGRA_VIRTUAL_CPUID
113         cmp     r0, #0                          @ CPU0?
114         bne     cpu_resume                      @ no
115 #endif
116
117
118 #if defined(CONFIG_HAVE_ARM_SCU)
119         /* enable SCU */
120         mov32   r0, TEGRA_ARM_PERIF_BASE
121         ldr     r1, [r0]
122         orr     r1, r1, #1
123 #ifdef CONFIG_ARCH_TEGRA_14x_SOC
124         orr     r1, r1, #8
125 #endif
126         str     r1, [r0]
127 #endif /* CONFIG_HAVE_ARM_SCU */
128
129 #ifdef CONFIG_CACHE_L2X0
130 #if !defined(CONFIG_ARCH_TEGRA_14x_SOC)
131         cmp     r12, #1                 @ secure firmware present?
132         beq     cpu_resume
133
134         adr     r0, tegra_resume_l2_init
135         ldr     r1, [r0]
136         tst     r1, #1
137         beq     no_l2_init
138         /* Enable L2 */
139         bic     r1, #1
140         str     r1, [r0]
141         mov32   r3, TEGRA_ARM_PL310_BASE
142 #if defined(CONFIG_ARCH_TEGRA_2x_SOC)
143         mov32   r0, 0x331                       /* tag latency */
144         mov32   r1, 0x441                       /* data latency */
145 #elif defined(CONFIG_ARCH_TEGRA_3x_SOC) || defined(CONFIG_ARCH_TEGRA_14x_SOC)
146 #ifdef CONFIG_TEGRA_SILICON_PLATFORM
147         mov32   r0, TEGRA_FLOW_CTRL_BASE + 0x2c /* FLOW_CTRL_CLUSTER_CONTROL */
148         mov32   r2, RESET_DATA_PHYS
149         ldr     r1, [r0]
150         tst     r1, #1                          /* 0 == G, 1 == LP */
151         ldrne   r0, [r2, #RESET_DATA(C1_L2_TAG_LATENCY)]
152         ldrne   r1, [r2, #RESET_DATA(C1_L2_DATA_LATENCY)]
153         ldreq   r0, [r2, #RESET_DATA(C0_L2_TAG_LATENCY)]
154         ldreq   r1, [r2, #RESET_DATA(C0_L2_DATA_LATENCY)]
155 #else /* !CONFIG_TEGRA_SILICON_PLATFORM */
156         mov32   r0, #0x770                      /* tag latency */
157         mov32   r1, #0x770                      /* data latency */
158 #endif /* ?CONFIG_TEGRA_SILICON_PLATFORM */
159 #endif /* CONFIG_ARCH_TEGRA_3x_SOC || CONFIG_ARCH_TEGRA_14x_SOC */
160         str     r0, [r3, #L2X0_TAG_LATENCY_CTRL]
161         str     r1, [r3, #L2X0_DATA_LATENCY_CTRL]
162 #ifdef CONFIG_ARCH_TEGRA_14x_SOC
163         mov32   r0, 0x40000007  /* Enable double line fill */
164 #else
165         mov     r0, #7
166 #endif
167         str     r0, [r3, #L2X0_PREFETCH_CTRL]
168         mov     r0, #3
169         str     r0, [r3, #L2X0_POWER_CTRL]
170         /* figure out aux ctrl */
171         ldr     r2, [r3, #L2X0_CACHE_TYPE]
172         and     r2, r2, #0x700
173         lsl     r2, r2, #(17-8)
174         mov32   r4, 0x7C400001
175         orr     r2, r2, r4
176         ldr     r4, [r3, #L2X0_AUX_CTRL]
177         mov32   r5, 0x8200c3fe
178         and     r4, r4, r5
179         orr     r2, r2, r4
180         str     r2, [r3, #L2X0_AUX_CTRL]
181         mov     r2, #1
182         str     r2, [r3, #L2X0_CTRL]
183 #endif /* CONFIG_ARCH_TEGRA_14x_SOC */
184 #endif /* CONFIG_CACHE_L2X0 */
185 no_l2_init:
186         b       cpu_resume
187 ENDPROC(tegra_resume)
188
189         .globl tegra_resume_timestamps_start
190 #ifndef CONFIG_ARCH_TEGRA_11x_SOC
191         .globl tegra_resume_smc_entry_time
192         .globl tegra_resume_smc_exit_time
193 #endif /* !CONFIG_ARCH_TEGRA_11x_SOC */
194         .globl tegra_resume_entry_time
195         .globl tegra_resume_timestamps_end
196 tegra_resume_timestamps_start:
197 #ifndef CONFIG_ARCH_TEGRA_11x_SOC
198 tegra_resume_smc_entry_time:
199         .long   0
200 tegra_resume_smc_exit_time:
201         .long   0
202 #endif /* !CONFIG_ARCH_TEGRA_11x_SOC */
203 tegra_resume_entry_time:
204         .long   0
205 tegra_resume_timestamps_end:
206
207 #ifdef CONFIG_CACHE_L2X0
208         .globl tegra_resume_l2_init
209 tegra_resume_l2_init:
210         .long 0
211 #endif /* CONFIG_CACHE_L2X0 */
212 #endif /* CONFIG_PM_SLEEP */
213
214 /*
215  *      __invalidate_cpu_state
216  *
217  *        Invalidates volatile CPU state (SCU tags, caches, branch address
218  *        arrays, exclusive monitor, etc.) so that they can be safely
219  *        enabled. Instruction caching and branch prediction are enabled.
220  *
221  *        Cortex-A15 has an integrated SCU in L2 memory system, we only
222  *        need to set the correct L2 cache data RAM latency and enable
223  *        i-cache/branch prediction.
224  */
225 __invalidate_cpu_state:
226         clrex
227         mov     r0, #0
228         mcr     p15, 0, r0, c1, c0, 1   @ disable SMP, prefetch, broadcast
229         isb
230         mrc     p15, 0, r0, c0, c0, 0   @ main ID register
231         ubfx    r1, r0, #4, #28
232         ldr     r0, =0x00f0000
233         bic     r1, r1, r0
234         ldr     r0, =0x410fc09
235         teq     r1, r0
236         beq     cortex_a9
237
238         cmp     r12, #1                 @ secure firmware present?
239         beq     __enable_i_cache_branch_pred
240
241         mrc     p15, 0x1, r0, c15, c0, 3        @ L2 prefetch control reg
242         tst     r0, #0x1000
243         orreq   r0, r0, #0x1000                 @ disable throttling
244         mcreq   p15, 0x1, r0, c15, c0, 3
245
246         mrc     p15, 0, r0, c0, c0, 0           @ main ID register
247         ubfx    r1, r0, #20, #4
248         cmp     r1, #0x3                        @ Compare to rev 3
249         mrcge   p15, 0x1, r0, c15, c0, 4        @ ACTLR2
250         orrge   r0, #(1<<31)                    @ Enable regional clock gates
251         mcrge   p15, 0x1, r0, c15, c0, 4        @ Rev 3 or higher
252
253         /*      This is only needed for cluster 0 with integrated L2 cache */
254         mrc     p15, 0, r0, c0, c0, 5
255         ubfx    r0, r0, #8, #4
256         tst     r0, #1
257         bne     __enable_i_cache_branch_pred
258         mrc     p15, 0x1, r0, c9, c0, 2
259         and     r1, r0, #7
260         cmp     r1, #2
261         beq     __enable_i_cache_branch_pred
262         bic     r0, r0, #7
263         orr     r0, r0, #2
264         mcr     p15, 0x1, r0, c9, c0, 2
265         mrc     p15, 0x1, r0, c15, c0, 0        @ L2 ACTLR
266         orr     r0, r0, #0x80                   @ hazard detection timeout
267         mcr     p15, 0x1, r0, c15, c0, 0
268
269 __enable_i_cache_branch_pred:
270         mrc     p15, 0, r0, c1, c0, 0
271         orr     r0, r0, #0x1800
272         mcr     p15, 0, r0, c1, c0, 0   @ enable branch prediction, i-cache
273         mov     pc, lr
274         /* no fall through, just return to the caller */
275
276 cortex_a9:
277         /* Following is for Cortex-A9 */
278         mcr     p15, 0, r0, c7, c5, 0   @ invalidate BTAC, i-cache
279         mcr     p15, 0, r0, c7, c5, 6   @ invalidate branch pred array
280         mcr     p15, 0, r0, c8, c5, 0   @ invalidate instruction TLB
281         mcr     p15, 0, r0, c8, c6, 0   @ invalidate data TLB
282         mcr     p15, 0, r0, c8, c7, 0   @ invalidate unified TLB
283         dsb
284         isb
285
286 #if defined(CONFIG_HAVE_ARM_SCU)
287         cpu_id  r0
288         cmp     r0, #0
289         mov32   r1, (TEGRA_ARM_PERIF_BASE + 0xC)
290         movne   r0, r0, lsl #2
291         movne   r2, #0xf
292         movne   r2, r2, lsl r0
293         strne   r2, [r1]                @ invalidate SCU tags for CPU
294 #endif
295
296         dsb
297         mov     r0, #0x1800
298         mcr     p15, 0, r0, c1, c0, 0   @ enable branch prediction, i-cache
299         isb
300
301 #if !defined(CONFIG_TRUSTED_LITTLE_KERNEL)
302         /*
303          * Invalidates L1 d-cache during initial cpu boot (corrupt r0-r6).
304          *
305          * Skip this for CONFIG_TRUSTED_LITTLE_KERNEL builds as it has
306          * already been done by the Secure OS.
307          */
308         mov     r0, #0
309         mcr     p15, 2, r0, c0, c0, 0
310         mrc     p15, 1, r0, c0, c0, 0
311
312         movw    r1, #0x7fff
313         and     r2, r1, r0, lsr #13
314
315         movw    r1, #0x3ff
316
317         and     r3, r1, r0, lsr #3      @ NumWays - 1
318         add     r2, r2, #1      @ NumSets
319
320         and     r0, r0, #0x7
321         add     r0, r0, #4      @ SetShift
322
323         clz     r1, r3          @ WayShift
324         add     r4, r3, #1      @ NumWays
325 1:      sub     r2, r2, #1      @ NumSets--
326         mov     r3, r4          @ Temp = NumWays
327 2:      subs    r3, r3, #1      @ Temp--
328         mov     r5, r3, lsl r1
329         mov     r6, r2, lsl r0
330         orr     r5, r5, r6      @ Reg = (Temp<<WayShift)|(NumSets<<SetShift)
331         mcr     p15, 0, r5, c7, c6, 2
332         bgt     2b
333         cmp     r2, #0
334         bgt     1b
335         dsb
336         isb
337 #endif
338         mov     pc, lr
339
340 /*
341  * __tegra_cpu_reset_handler_halt_failed:
342  *
343  * Alternate entry point for reset handler for cases where the
344  * WFI halt failed to take effect.
345  *
346  */
347         .align L1_CACHE_SHIFT
348 ENTRY(__tegra_cpu_reset_handler_start)
349
350 /*
351  * __tegra_cpu_reset_handler:
352  *
353  * Common handler for all CPU reset events.
354  *
355  * Register usage within the reset handler:
356  *
357  *      R7  = CPU present (to the OS) mask
358  *      R8  = CPU in LP1 state mask
359  *      R9  = CPU in LP2 state mask
360  *      R10 = CPU number
361  *      R11 = CPU mask
362  *      R12 = pointer to reset handler data
363  *
364  * NOTE: This code is copied to IRAM. All code and data accesses
365  *       must be position-independent.
366  */
367
368         .align L1_CACHE_SHIFT
369 ENTRY(__tegra_cpu_reset_handler)
370
371 /* DO NOT put any code before the !defined(CONFIG_ARM_SAVE_DEBUG_CONTEXT)
372    block below. It must be the first thing in this subroutine. */
373
374 #if !defined(CONFIG_ARM_SAVE_DEBUG_CONTEXT) || DEBUG_CPU_RESET_HANDLER
375         /* If Debug Architecture v7.1 or later, unlock the OS lock. */
376         mrc     p15, 0, r0, c0, c1, 2           @ ID_DFR0
377         and     r0, r0, #0xF                    @ coprocessor debug model
378         cmp     r0, #5                          @ debug arch >= v7.1?
379         movge   r0, #0                          @ yes, unlock debug
380         mcrge   p14, 0, r0, c1, c0, 4           @ DBGOSLAR
381 #endif
382 #if DEBUG_CPU_RESET_HANDLER
383         b       .
384 #endif
385
386         adr     r12, __tegra_cpu_reset_handler_data
387         ldr     r7, [r12, #RESET_DATA(SECURE_FW_PRESENT)]
388         cmp     r7, #1                  @ if !secure
389         beq     cpu_is_secure
390
391         cpsid   aif, 0x13                       @ SVC mode, interrupts disabled
392         mrc     p15, 0, r0, c0, c0, 0           @ read main ID register
393         and     r5, r0, #0x00f00000             @ variant
394         and     r6, r0, #0x0000000f             @ revision
395         orr     r6, r6, r5, lsr #20-4           @ combine variant and revision
396 #ifdef CONFIG_ARM_ERRATA_743622
397         teq     r6, #0x20                       @ present in r2p0
398         teqne   r6, #0x21                       @ present in r2p1
399         teqne   r6, #0x22                       @ present in r2p2
400         teqne   r6, #0x27                       @ present in r2p7
401         teqne   r6, #0x29                       @ present in r2p9
402         mrceq   p15, 0, r10, c15, c0, 1         @ read diagnostic register
403         orreq   r10, r10, #1 << 6               @ set bit #6
404         mcreq   p15, 0, r10, c15, c0, 1         @ write diagnostic register
405 #endif
406
407 cpu_is_secure:
408         mrc     p15, 0, r10, c0, c0, 5          @ MPIDR
409         and     r10, r10, #0x3                  @ R10 = CPU number
410         mov     r11, #1
411         mov     r11, r11, lsl r10               @ R11 = CPU mask
412         adr     r12, __tegra_cpu_reset_handler_data
413
414 #ifdef CONFIG_SMP
415         /* Does the OS know about this CPU? */
416         ldr     r7, [r12, #RESET_DATA(MASK_PRESENT)]
417         tst     r7, r11                         @ if !present
418         bleq    __die                           @ CPU not present (to OS)
419 #endif
420
421 #ifdef CONFIG_ARCH_TEGRA_2x_SOC
422         /* If CPU1, don't let CPU0 reset CPU1 now that CPU1 is coming up. */
423         mov32   r6, TEGRA_PMC_BASE
424         mov     r0, #0
425         cmp     r10, #0
426         strne   r0, [r6, #PMC_SCRATCH41]
427 #endif
428
429 #ifdef CONFIG_PM_SLEEP
430         /* Waking up from LP1? */
431         ldr     r8, [r12, #RESET_DATA(MASK_LP1)]
432         tst     r8, r11                         @ if in_lp1
433         beq     __is_not_lp1
434         cmp     r10, #0
435         bne     __die                           @ only CPU0 can be here
436         ldr     lr, [r12, #RESET_DATA(STARTUP_LP1)]
437         cmp     lr, #0
438         bleq    __die                           @ no LP1 startup handler
439         bx      lr
440 __is_not_lp1:
441 #endif
442
443         /* Waking up from LP2? */
444         ldr     r9, [r12, #RESET_DATA(MASK_LP2)]
445         tst     r9, r11                         @ if in_lp2
446         beq     __is_not_lp2
447         ldr     lr, [r12, #RESET_DATA(STARTUP_LP2)]
448         cmp     lr, #0
449         bleq    __die                           @ no LP2 startup handler
450         bx      lr
451
452 __is_not_lp2:
453
454 #ifdef CONFIG_SMP
455 #ifndef CONFIG_TEGRA_VIRTUAL_CPUID
456         /* Can only be secondary boot (initial or hotplug) but CPU 0
457            cannot be here. */
458         cmp     r10, #0
459         bleq    __die                           @ CPU0 cannot be here
460 #endif
461         ldr     lr, [r12, #RESET_DATA(STARTUP_SECONDARY)]
462         cmp     lr, #0
463         bleq    __die                           @ no secondary startup handler
464         bx      lr
465 #endif
466
467 /*
468  * We don't know why the CPU reset. Just kill it.
469  * The LR register will contain the address we died at + 4.
470  */
471
472 __die:
473         sub     lr, lr, #4
474         mov32   r7, TEGRA_PMC_BASE
475         str     lr, [r7, #PMC_SCRATCH41]
476
477         mov32   r7, TEGRA_CLK_RESET_BASE
478
479         /* Are we on Tegra20? */
480         mov32   r6, TEGRA_APB_MISC_BASE
481         ldr     r0, [r6, #APB_MISC_GP_HIDREV]
482         and     r0, r0, #0xff00
483         cmp     r0, #(0x20 << 8)
484         bne     1f
485
486 #ifdef CONFIG_ARCH_TEGRA_2x_SOC
487         mov32   r0, 0x1111
488         mov     r1, r0, lsl r10
489         str     r1, [r7, #0x340]                @ CLK_RST_CPU_CMPLX_SET
490 #endif
491 1:
492 #ifdef CONFIG_ARCH_TEGRA_3x_SOC
493         mov32   r6, TEGRA_FLOW_CTRL_BASE
494
495         cmp     r10, #0
496         moveq   r1, #FLOW_CTRL_HALT_CPU0_EVENTS
497         moveq   r2, #FLOW_CTRL_CPU0_CSR
498         movne   r1, r10, lsl #3
499         addne   r2, r1, #(FLOW_CTRL_CPU1_CSR-8)
500         addne   r1, r1, #(FLOW_CTRL_HALT_CPU1_EVENTS-8)
501
502         /* Clear CPU "event" and "interrupt" flags and power gate
503            it when halting but not before it is in the "WFI" state. */
504         ldr     r0, [r6, +r2]
505         orr     r0, r0, #FLOW_CTRL_CSR_INTR_FLAG | FLOW_CTRL_CSR_EVENT_FLAG
506         orr     r0, r0, #FLOW_CTRL_CSR_ENABLE
507         str     r0, [r6, +r2]
508
509         /* Unconditionally halt this CPU */
510         mov     r0, #FLOW_CTRL_WAITEVENT
511         str     r0, [r6, +r1]
512         ldr     r0, [r6, +r1]                   @ memory barrier
513
514         dsb
515         isb
516         wfi                                     @ CPU should be power gated here
517
518         /* If the CPU didn't power gate above just kill it's clock. */
519
520         mov     r0, r11, lsl #8
521         str     r0, [r7, #348]                  @ CLK_CPU_CMPLX_SET
522 #endif
523
524         /* If the CPU still isn't dead, just spin here. */
525         b       .
526 ENDPROC(__tegra_cpu_reset_handler)
527
528         .align L1_CACHE_SHIFT
529         .type   __tegra_cpu_reset_handler_data, %object
530         .globl  __tegra_cpu_reset_handler_data
531 __tegra_cpu_reset_handler_data:
532         .rept   TEGRA_RESET_DATA_SIZE
533         .long   0
534         .endr
535         .size   __tegra_cpu_reset_handler_data, \
536         . - __tegra_cpu_reset_handler_data
537         .align L1_CACHE_SHIFT
538 ENTRY(__tegra_cpu_reset_handler_end)
539
540         .globl  __tegra_cpu_reset_handler_data_offset
541         .equ    __tegra_cpu_reset_handler_data_offset, \
542         __tegra_cpu_reset_handler_data - __tegra_cpu_reset_handler_start