First version
[3rdparty/ote_partner/tlk.git] / platform / tegra / common / cpu_early_init.S
1 /*
2  * Copyright (c) 2012-2014, NVIDIA CORPORATION. All rights reserved
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining
5  * a copy of this software and associated documentation files
6  * (the "Software"), to deal in the Software without restriction,
7  * including without limitation the rights to use, copy, modify, merge,
8  * publish, distribute, sublicense, and/or sell copies of the Software,
9  * and to permit persons to whom the Software is furnished to do so,
10  * subject to the following conditions:
11  *
12  * The above copyright notice and this permission notice shall be
13  * included in all copies or substantial portions of the Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
18  * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
19  * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
20  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
21  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22  */
23 .text
24 .globl __cpu_early_init
25
26 __cpu_early_init:
27
28 #if ARM_CLUSTER0_INIT_L2
29         /* set up L2 for cluster0 */
30         mrc     p15, 0, r0, c0, c0, 5
31         ubfx    r0, r0, #8, #4                  @ get cluster id
32         cmp     r0, #0                          @ C0 = 0, C1 = 1
33         bne     not_on_cluster0
34
35         mrc     p15, 0x1, r0, c9, c0, 0x2       @ read L2CTLR
36         bic     r0, r0, #0x7                    @ clear data ram latency field
37         orr     r0, r0, #0x2                    @ pipeline depth of 3
38         mcr     p15, 0x1, r0, c9, c0, 0x2       @ write L2CTLR
39
40 not_on_cluster0:
41 #endif
42         cpsid   aif, 0x13               @ SVC mode, interrupts disabled
43         mrc     p15, 0, r0, c0, c0, 0   @ read main ID register
44         and     r1, r0, #0xff000000     @ ARM?
45         teq     r1, #0x41000000
46         bne     no_wars
47         and     r2, r0, #0x00f00000     @ variant
48         and     r3, r0, #0x0000000f     @ revision
49         orr     r3, r3, r2, lsr #20-4   @ combine variant and revision
50         ubfx    r0, r0, #4, #12         @ primary part number
51
52         /* Cortex-A9 Errata */
53         ldr     r1, =0x00000c09         @ Cortex-A9 primary part number
54         teq     r0, r1
55         bne     no_wars
56         cmp     r3, #0x10               @ power ctrl reg added r1p0
57         mrcge   p15, 0, r1, c15, c0, 0  @ read power control register
58         orrge   r1, r1, #1              @ enable dynamic clock gating
59         mcrge   p15, 0, r1, c15, c0, 0  @ write power control register
60
61         /* CONFIG_ARM_ERRATA_742230 */
62         cmp     r3, #0x22               @ only present up to r2p2
63         mrcle   p15, 0, r1, c15, c0, 1  @ read diagnostic register
64         orrle   r1, r1, #1 << 4         @ set bit #4
65         mcrle   p15, 0, r1, c15, c0, 1  @ write diagnostic register
66
67         /* CONFIG_ARM_ERRATA_743622 */
68         teq     r3, #0x20               @ present in r2p0
69         teqne   r3, #0x21               @ present in r2p1
70         teqne   r3, #0x22               @ present in r2p2
71         teqne   r3, #0x27               @ present in r2p7
72         teqne   r3, #0x29               @ present in r2p9
73         mrceq   p15, 0, r1, c15, c0, 1  @ read diagnostic register
74         orreq   r1, r1, #1 << 6         @ set bit #6
75         mcreq   p15, 0, r1, c15, c0, 1  @ write diagnostic register
76
77         /* CONFIG_ARM_ERRATA_751472 */
78         cmp     r3, #0x30               @ present prior to r3p0
79         mrclt   p15, 0, r1, c15, c0, 1  @ read diagnostic register
80         orrlt   r1, r1, #1 << 11        @ set bit #11
81         mcrlt   p15, 0, r1, c15, c0, 1  @ write diagnostic register
82
83         /* CONFIG_ARM_ERRATA_752520 */
84         cmp     r3, #0x29               @ present prior to r2p9
85         mrclt   p15, 0, r1, c15, c0, 1  @ read diagnostic register
86         orrlt   r1, r1, #1 << 20        @ set bit #20
87         mcrlt   p15, 0, r1, c15, c0, 1  @ write diagnostic register
88
89 no_wars:
90 #if !defined(WITH_MONITOR_BIN)
91         /* enable SCR.FW for CPU0 (with EL3 AARCH64, only writable in EL3) */
92         mrc     p15, 0, r0, c0, c0, 5
93         and     r0, r0, #0xF
94         cmp     r0, #0                  @ CPU0?
95         bne     ret
96         mov     r0, #(1 << 4)           @ SCR.FW
97         mcr     p15, 0, r0, c1, c1, 0
98         isb
99 #endif
100 ret:
101         bx      lr                      @ return