armadaxp_start.S revision 1.1 1 1.1 rkujawa /*******************************************************************************
2 1.1 rkujawa Copyright (C) Marvell International Ltd. and its affiliates
3 1.1 rkujawa
4 1.1 rkujawa Developed by Semihalf
5 1.1 rkujawa
6 1.1 rkujawa ********************************************************************************
7 1.1 rkujawa Marvell BSD License
8 1.1 rkujawa
9 1.1 rkujawa If you received this File from Marvell, you may opt to use, redistribute and/or
10 1.1 rkujawa modify this File under the following licensing terms.
11 1.1 rkujawa Redistribution and use in source and binary forms, with or without modification,
12 1.1 rkujawa are permitted provided that the following conditions are met:
13 1.1 rkujawa
14 1.1 rkujawa * Redistributions of source code must retain the above copyright notice,
15 1.1 rkujawa this list of conditions and the following disclaimer.
16 1.1 rkujawa
17 1.1 rkujawa * Redistributions in binary form must reproduce the above copyright
18 1.1 rkujawa notice, this list of conditions and the following disclaimer in the
19 1.1 rkujawa documentation and/or other materials provided with the distribution.
20 1.1 rkujawa
21 1.1 rkujawa * Neither the name of Marvell nor the names of its contributors may be
22 1.1 rkujawa used to endorse or promote products derived from this software without
23 1.1 rkujawa specific prior written permission.
24 1.1 rkujawa
25 1.1 rkujawa THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
26 1.1 rkujawa ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
27 1.1 rkujawa WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
28 1.1 rkujawa DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
29 1.1 rkujawa ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
30 1.1 rkujawa (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
31 1.1 rkujawa LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
32 1.1 rkujawa ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
33 1.1 rkujawa (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
34 1.1 rkujawa SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35 1.1 rkujawa
36 1.1 rkujawa *******************************************************************************/
37 1.1 rkujawa
38 1.1 rkujawa #include "opt_cputypes.h"
39 1.1 rkujawa
40 1.1 rkujawa #include <machine/asm.h>
41 1.1 rkujawa #include <arm/armreg.h>
42 1.1 rkujawa #include <arm/arm32/pmap.h>
43 1.1 rkujawa
44 1.1 rkujawa RCSID("$NetBSD: armadaxp_start.S,v 1.1 2013/05/29 19:55:56 rkujawa Exp $")
45 1.1 rkujawa
46 1.1 rkujawa #define CPWAIT_BRANCH \
47 1.1 rkujawa sub pc, pc, #4
48 1.1 rkujawa
49 1.1 rkujawa #define CPWAIT(tmp) \
50 1.1 rkujawa mrc p15, 0, tmp, c2, c0, 0 /* arbitrary read of CP15 */ ;\
51 1.1 rkujawa mov tmp, tmp /* wait for it to complete */ ;\
52 1.1 rkujawa CPWAIT_BRANCH /* branch to next insn */
53 1.1 rkujawa
54 1.1 rkujawa /*
55 1.1 rkujawa * We don't want to hard-code some basic things like RAM start etc.
56 1.1 rkujawa * Hence, it is important to set the following options to resanoable values
57 1.1 rkujawa * in std.armadaxp configuration file.
58 1.1 rkujawa */
59 1.1 rkujawa #if !defined(STARTUP_PAGETABLE_ADDR)
60 1.1 rkujawa #error STARTUP_PAGETABLE_ADDR not defined. Please define it in std.armadaxp
61 1.1 rkujawa #elif !defined(MEMSTART)
62 1.1 rkujawa #error MEMSTART not defined. Please define it in std.armadaxp
63 1.1 rkujawa #endif
64 1.1 rkujawa
65 1.1 rkujawa .text
66 1.1 rkujawa
67 1.1 rkujawa .global _C_LABEL(armadaxp_start)
68 1.1 rkujawa _C_LABEL(armadaxp_start):
69 1.1 rkujawa /* Move into supervisor mode and disable IRQs/FIQs. */
70 1.1 rkujawa mrs r0, cpsr
71 1.1 rkujawa bic r0, r0, #PSR_MODE
72 1.1 rkujawa orr r0, r0, #(I32_bit | F32_bit)
73 1.1 rkujawa msr cpsr_c, r0
74 1.1 rkujawa
75 1.1 rkujawa adr r7, Lunmapped
76 1.1 rkujawa bic r7, r7, #0xf0000000
77 1.1 rkujawa orr r7, r7, #MEMSTART
78 1.1 rkujawa disable_mmu:
79 1.1 rkujawa /* Disable MMU for a while */
80 1.1 rkujawa mrc p15, 0, r2, c1, c0, 0
81 1.1 rkujawa bic r2, r2, #(CPU_CONTROL_MMU_ENABLE | CPU_CONTROL_DC_ENABLE |\
82 1.1 rkujawa CPU_CONTROL_WBUF_ENABLE)
83 1.1 rkujawa bic r2, r2, #(CPU_CONTROL_IC_ENABLE)
84 1.1 rkujawa bic r2, r2, #(CPU_CONTROL_BPRD_ENABLE)
85 1.1 rkujawa mcr p15, 0, r2, c1, c0, 0
86 1.1 rkujawa
87 1.1 rkujawa nop
88 1.1 rkujawa nop
89 1.1 rkujawa nop
90 1.1 rkujawa mov pc, r7
91 1.1 rkujawa Lunmapped:
92 1.1 rkujawa /* build page table from scratch */
93 1.1 rkujawa ldr r0, Lstartup_pagetable
94 1.1 rkujawa adr r4, mmu_init_table
95 1.1 rkujawa b 3f
96 1.1 rkujawa
97 1.1 rkujawa 2:
98 1.1 rkujawa str r3, [r0, r2]
99 1.1 rkujawa add r2, r2, #4
100 1.1 rkujawa add r3, r3, #(L1_S_SIZE)
101 1.1 rkujawa adds r1, r1, #-1
102 1.1 rkujawa bhi 2b
103 1.1 rkujawa 3:
104 1.1 rkujawa ldmia r4!, {r1,r2,r3} /* # of sections, VA, PA|attr */
105 1.1 rkujawa cmp r1, #0
106 1.1 rkujawa adrne r5, 2b
107 1.1 rkujawa bicne r5, r5, #0xf0000000
108 1.1 rkujawa orrne r5, r5, #MEMSTART
109 1.1 rkujawa movne pc, r5
110 1.1 rkujawa
111 1.1 rkujawa mcr p15, 0, r0, c2, c0, 0 /* Set TTB */
112 1.1 rkujawa mcr p15, 0, r0, c8, c7, 0 /* Flush TLB */
113 1.1 rkujawa
114 1.1 rkujawa mov r0, #0
115 1.1 rkujawa mcr p15, 0, r0, c13, c0, 1 /* Set ASID to 0 */
116 1.1 rkujawa
117 1.1 rkujawa /* Set the Domain Access register. Very important! */
118 1.1 rkujawa mov r0, #((DOMAIN_CLIENT << (PMAP_DOMAIN_KERNEL*2)) | DOMAIN_CLIENT)
119 1.1 rkujawa mcr p15, 0, r0, c3, c0, 0
120 1.1 rkujawa
121 1.1 rkujawa /* Enable MMU */
122 1.1 rkujawa mrc p15, 0, r0, c1, c0, 0
123 1.1 rkujawa orr r0, r0, #CPU_CONTROL_XP_ENABLE
124 1.1 rkujawa orr r0, r0, #(CPU_CONTROL_MMU_ENABLE | CPU_CONTROL_DC_ENABLE)
125 1.1 rkujawa mcr p15, 0, r0, c1, c0, 0
126 1.1 rkujawa nop
127 1.1 rkujawa nop
128 1.1 rkujawa nop
129 1.1 rkujawa CPWAIT(r0)
130 1.1 rkujawa
131 1.1 rkujawa /* Jump to kernel code in TRUE VA */
132 1.1 rkujawa adr r0, Lstart
133 1.1 rkujawa ldr pc, [r0]
134 1.1 rkujawa Lstart:
135 1.1 rkujawa .word start
136 1.1 rkujawa
137 1.1 rkujawa /* NOTREACHED */
138 1.1 rkujawa Lstartup_pagetable:
139 1.1 rkujawa .word STARTUP_PAGETABLE_ADDR
140 1.1 rkujawa
141 1.1 rkujawa #define MMU_INIT(va,pa,n_sec,attr) \
142 1.1 rkujawa .word n_sec ; \
143 1.1 rkujawa .word 4*((va)>>L1_S_SHIFT) ; \
144 1.1 rkujawa .word (pa)|(attr) ;
145 1.1 rkujawa
146 1.1 rkujawa mmu_init_table:
147 1.1 rkujawa /* fill all table VA==PA */
148 1.1 rkujawa /* map SDRAM VA==PA, WT cacheable */
149 1.1 rkujawa MMU_INIT(0, 0, 64, L1_TYPE_S|L1_S_C|L1_S_AP(AP_KRW))
150 1.1 rkujawa /* map VA 0xc0000000..0xc3ffffff to PA */
151 1.1 rkujawa MMU_INIT(0xc0000000, 0, 64, L1_TYPE_S|L1_S_C|L1_S_AP(AP_KRW))
152 1.1 rkujawa /*
153 1.1 rkujawa * In case of early start debugging it might be useful to map
154 1.1 rkujawa * SoC registers (for UART access).
155 1.1 rkujawa */
156 1.1 rkujawa MMU_INIT(0xd0000000, 0xd0000000, 1, L1_TYPE_S|L1_S_PROTO|L1_S_AP(AP_KRW))
157 1.1 rkujawa /* end of table */
158 1.1 rkujawa MMU_INIT(0, 0, 0, 0)
159