1
2
3
4#include <linux/linkage.h>
5#include <linux/init.h>
6#include <linux/pgtable.h>
7#include <asm/ptrace.h>
8#include <asm/asm-offsets.h>
9#include <asm/page.h>
10#include <linux/sizes.h>
11#include <asm/thread_info.h>
12
13#ifdef CONFIG_CPU_BIG_ENDIAN
14#define OF_DT_MAGIC 0xd00dfeed
15#else
16#define OF_DT_MAGIC 0xedfe0dd0
17#endif
18
19 .globl swapper_pg_dir
20 .equ swapper_pg_dir, TEXTADDR - 0x4000
21
22
23
24
25 .section ".head.text", "ax"
26 .type _stext, %function
27ENTRY(_stext)
28 setgie.d ! Disable interrupt
29 isb
30
31
32
33 mfsr $r0, $mr8
34 li $r1,
35 and $r0, $r0, $r1
36 mtsr $r0, $mr8
37
38
39
40
41 andi $r0,$r2,
42 li $r10, 0
43 bne $r0, $r10, _nodtb
44 lwi $r0, [$r2]
45 li $r1, OF_DT_MAGIC
46 bne $r0, $r1, _nodtb
47 move $r10, $r2
48_nodtb:
49
50
51
52
53 sethi $r4, hi20(swapper_pg_dir)
54 li $p0, (PAGE_OFFSET - PHYS_OFFSET)
55 sub $r4, $r4, $p0
56 tlbop FlushAll ! invalidate TLB\n"
57 isb
58 mtsr $r4, $L1_PPTB ! load page table pointer\n"
59
60#ifdef CONFIG_CPU_DCACHE_DISABLE
61 #define MMU_CTL_NTCC MMU_CTL_CACHEABLE_NON
62#else
63 #ifdef CONFIG_CPU_DCACHE_WRITETHROUGH
64 #define MMU_CTL_NTCC MMU_CTL_CACHEABLE_WT
65 #else
66 #define MMU_CTL_NTCC MMU_CTL_CACHEABLE_WB
67 #endif
68#endif
69
70
71 mfsr $r3, $MMU_CTL
72
73 ori $r3, $r3, (MMU_CTL_NTCC << MMU_CTL_offNTC3)
74
75 ori $r3, $r3, (MMU_CTL_NTCC << MMU_CTL_offNTC2)
76
77 ori $r3, $r3, (MMU_CTL_NTCC << MMU_CTL_offNTC1)
78#else
79 ori $r3, $r3, (MMU_CTL_NTCC << MMU_CTL_offNTC0)
80#endif
81
82#ifdef CONFIG_ANDES_PAGE_SIZE_4KB
83 ori $r3, $r3,
84#else
85 ori $r3, $r3,
86#endif
87#ifdef CONFIG_HW_SUPPORT_UNALIGNMENT_ACCESS
88 li $r0,
89 or $r3, $r3, $r0
90#endif
91 mtsr $r3, $MMU_CTL
92 isb
93
94
95 mfsr $r0, $MMU_CFG
96 srli $r3, $r0, MMU_CFG_offfEPSZ
97 zeb $r3, $r3
98 bnez $r3, _extra_page_size_support
99#ifdef CONFIG_ANDES_PAGE_SIZE_4KB
100 li $r5,
101#else
102 li $r5,
103 li $r3,
104#endif
105 mtsr $r3, $TLB_MISC
106 b _image_size_check
107
108_extra_page_size_support: ! Use epzs pages size
109 clz $r6, $r3
110 subri $r2, $r6,
111 li $r3,
112 sll $r3, $r3, $r2
113
114 mul $r5, $r3, $r3
115 slli $r5, $r5,
116
117 addi $r3, $r2,
118 mtsr $r3, $TLB_MISC
119
120_image_size_check:
121
122 andi $r6, $r0, MMU_CFG_mskTBW
123 andi $r0, $r0, MMU_CFG_mskTBS
124 srli $r6, $r6, MMU_CFG_offTBW
125 srli $r0, $r0, MMU_CFG_offTBS
126 addi $r6, $r6,
127 addi $r0, $r0,
128 sll $r0, $r6, $r0 ! entries = k-way * n-set
129 mul $r6, $r0, $r5 ! max size = entries * page size
130
131 la $r3, (_end - PAGE_OFFSET)
132 bgt $r3, $r6, __error
133
134 li $r2,
135 li $r3, PAGE_OFFSET
136 add $r6, $r6, $r3
137
138_tlb:
139 mtsr $r3, $TLB_VPN
140 dsb
141 tlbop $r2, RWR
142 isb
143 add $r3, $r3, $r5
144 add $r2, $r2, $r5
145 bgt $r6, $r3, _tlb
146 mfsr $r3, $TLB_MISC ! setup access page size
147 li $r2,
148 and $r3, $r3, $r2
149#ifdef CONFIG_ANDES_PAGE_SIZE_8KB
150 ori $r3, $r3,
151#endif
152 mtsr $r3, $TLB_MISC
153
154 mfsr $r0, $MISC_CTL ! Enable BTB, RTP, shadow sp, and HW_PRE
155 ori $r0, $r0,
156 mtsr $r0, $MISC_CTL
157
158 mfsr $p1, $PSW
159 li $r15,
160 and $p1, $p1, $r15
161 ori $p1, $p1,
162 mtsr $p1, $IPSW ! when iret, it will automatically enable MMU
163 la $lp, __mmap_switched
164 mtsr $lp, $IPC
165 iret
166 nop
167
168 .type __switch_data, %object
169__switch_data:
170 .long __bss_start ! $r6
171 .long _end ! $r7
172 .long __atags_pointer ! $atag_pointer
173 .long init_task ! $r9, move to $r25
174 .long init_thread_union + THREAD_SIZE ! $sp
175
176
177
178
179
180
181 .align
182 .type __mmap_switched, %function
183__mmap_switched:
184 la $r3, __switch_data
185 lmw.bim $r6, [$r3], $r9,
186 move $r25, $r9
187 move $fp,
188 beq $r7, $r6, _RRT
1891: swi.bi $fp, [$r6],
190 bne $r7, $r6, 1b
191 swi $r10, [$r8]
192
193_RRT:
194 b start_kernel
195
196__error:
197 b __error
198