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