First version
[3rdparty/ote_partner/tlk.git] / platform / tegra / include / platform / boot_secondary.h
1 /*
2  * Copyright (c) 2013, 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 #ifndef __BOOT_SECONDARY_H
24 #define __BOOT_SECONDARY_H
25
26 #include <platform/memmap.h>
27 #include <platform/tzrammap.h>
28
29 #if ARM_WITH_LPAE
30 #include <arch/arm/mmu_ldesc_macros.h>
31 #else
32 #include <arch/arm/mmu_sdesc_macros.h>
33 #endif
34
35 /* copied from Travis' upstream include/asm.h */
36 #define FUNCTION(x) .global x; .type x,STT_FUNC; x:
37 #define DATA(x) .global x; .type x,STT_OBJECT; x:
38
39 #define LOCAL_FUNCTION(x) .type x,STT_FUNC; x:
40 #define LOCAL_DATA(x) .type x,STT_OBJECT; x:
41
42 /* returns the ID of the current processor */
43 .macro cpu_id, rd
44         mrc     p15, 0, \rd, c0, c0, 5
45         and     \rd, \rd, #0xF
46 .endm
47
48 /* void cpu_save_context(void) */
49 FUNCTION(cpu_save_context)
50         /* save MMU registers */
51         adr     r0, _cpu_context
52         mmu_desc_save_context r0, r1, r2
53
54         /* save CPU registers */
55         mrc     p15, 0, r1, c12, c0, 0          @ VBAR
56         str     r1, [r0, #0]
57         mrc     p15, 0, r1, c13, c0, 3          @ TLS
58         str     r1, [r0, #4]
59         mrc     p15, 0, r1, c1, c0, 0           @ SCTLR
60         str     r1, [r0, #8]
61         dsb
62         bx      lr
63
64 /* referenced within boot_secondary.S */
65 .macro cpu_restore_context, base, enable, tmp, tmp2
66         /* restore MMU registers */
67         mmu_desc_restore_context \base, \tmp, \tmp2
68
69         /* restore CPU registers */
70         ldr     \tmp, [\base, #0]
71         mcr     p15, 0, \tmp, c12, c0, 0        @ VBAR
72         ldr     \tmp, [\base, #4]
73         mcr     p15, 0, \tmp, c13, c0, 3        @ TLS
74         ldr     \tmp, [\base, #8]               @ saved SCTLR
75
76         /* should MMU be enabled? */
77         cmp     \enable, #0
78         biceq   \tmp, #0x1                      @ nope, clear the enable
79         mcr     p15, 0, \tmp, c1, c0, 0         @ SCTLR
80         isb
81 .endm
82
83 /* void cpu_copy_context(void *dstaddr) */
84 FUNCTION(cpu_copy_context)
85         adr     r1, _cpu_context
86         ldr     r2, =_cpu_context_end
87         cmp     r1, r2
88         beq     2f
89 1:
90         /* copy data */
91         ldr     r3, [r1], #4
92         str     r3, [r0], #4
93         cmp     r1, r2
94         blt     1b
95 2:
96         bx      lr
97
98 #define CPU_CONTEXT_INTS        3
99
100 LOCAL_DATA(_cpu_context)
101         .rept (CPU_CONTEXT_INTS + MMU_DESC_CONTEXT_INTS)
102         .int   0
103         .endr
104 LOCAL_DATA(_cpu_context_end)
105
106 #endif /*__BOOT_SECONDARY_H */