1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 #ifndef _XTENSA_INITIALIZE_MMU_H
24 #define _XTENSA_INITIALIZE_MMU_H
25
26 #include <asm/pgtable.h>
27 #include <asm/vectors.h>
28
29 #if XCHAL_HAVE_PTP_MMU
30 #define CA_BYPASS (_PAGE_CA_BYPASS | _PAGE_HW_WRITE | _PAGE_HW_EXEC)
31 #define CA_WRITEBACK (_PAGE_CA_WB | _PAGE_HW_WRITE | _PAGE_HW_EXEC)
32 #else
33 #define CA_WRITEBACK (0x4)
34 #endif
35
36 #ifdef __ASSEMBLY__
37
38 #define XTENSA_HWVERSION_RC_2009_0 230000
39
40 .macro initialize_mmu
41
42 #if XCHAL_HAVE_S32C1I && (XCHAL_HW_MIN_VERSION >= XTENSA_HWVERSION_RC_2009_0)
43
44
45
46
47 #if XCHAL_DCACHE_IS_COHERENT
48 movi a3, 0x25
49
50
51 #else
52 movi a3, 0x29
53
54
55 #endif
56 wsr a3, atomctl
57 #endif
58
59
60
61 #if defined(CONFIG_MMU) && XCHAL_HAVE_PTP_MMU && XCHAL_HAVE_SPANNING_WAY
62
63
64
65
66 #if !XCHAL_HAVE_VECBASE
67 # error "MMU v3 requires reloc vectors"
68 #endif
69
70 movi a1, 0
71 _call0 1f
72 _j 2f
73
74 .align 4
75 1: movi a2, 0x10000000
76
77 #if CONFIG_KERNEL_LOAD_ADDRESS < 0x40000000ul
78 #define TEMP_MAPPING_VADDR 0x40000000
79 #else
80 #define TEMP_MAPPING_VADDR 0x00000000
81 #endif
82
83
84
85 movi a2, TEMP_MAPPING_VADDR | XCHAL_SPANNING_WAY
86 idtlb a2
87 iitlb a2
88 isync
89
90
91
92
93
94 srli a3, a0, 27
95 slli a3, a3, 27
96 addi a3, a3, CA_BYPASS
97 addi a7, a2, 5 - XCHAL_SPANNING_WAY
98 wdtlb a3, a7
99 witlb a3, a7
100 isync
101
102 slli a4, a0, 5
103 srli a4, a4, 5
104 addi a5, a2, -XCHAL_SPANNING_WAY
105 add a4, a4, a5
106 jx a4
107
108
109
110
111 2: movi a4, 0x20000000
112 add a5, a2, a4
113 3: idtlb a5
114 iitlb a5
115 add a5, a5, a4
116 bne a5, a2, 3b
117
118
119
120 movi a6, 0x01000000
121 wsr a6, ITLBCFG
122 wsr a6, DTLBCFG
123 isync
124
125 movi a5, XCHAL_KSEG_CACHED_VADDR + XCHAL_KSEG_TLB_WAY
126 movi a4, XCHAL_KSEG_PADDR + CA_WRITEBACK
127 wdtlb a4, a5
128 witlb a4, a5
129
130 movi a5, XCHAL_KSEG_BYPASS_VADDR + XCHAL_KSEG_TLB_WAY
131 movi a4, XCHAL_KSEG_PADDR + CA_BYPASS
132 wdtlb a4, a5
133 witlb a4, a5
134
135 #ifdef CONFIG_XTENSA_KSEG_512M
136 movi a5, XCHAL_KSEG_CACHED_VADDR + 0x10000000 + XCHAL_KSEG_TLB_WAY
137 movi a4, XCHAL_KSEG_PADDR + 0x10000000 + CA_WRITEBACK
138 wdtlb a4, a5
139 witlb a4, a5
140
141 movi a5, XCHAL_KSEG_BYPASS_VADDR + 0x10000000 + XCHAL_KSEG_TLB_WAY
142 movi a4, XCHAL_KSEG_PADDR + 0x10000000 + CA_BYPASS
143 wdtlb a4, a5
144 witlb a4, a5
145 #endif
146
147 movi a5, XCHAL_KIO_CACHED_VADDR + XCHAL_KIO_TLB_WAY
148 movi a4, XCHAL_KIO_DEFAULT_PADDR + CA_WRITEBACK
149 wdtlb a4, a5
150 witlb a4, a5
151
152 movi a5, XCHAL_KIO_BYPASS_VADDR + XCHAL_KIO_TLB_WAY
153 movi a4, XCHAL_KIO_DEFAULT_PADDR + CA_BYPASS
154 wdtlb a4, a5
155 witlb a4, a5
156
157 isync
158
159
160 movi a4, 1f
161 jx a4
162
163 1:
164
165 idtlb a7
166 iitlb a7
167 isync
168
169 movi a0, 0
170 wsr a0, ptevaddr
171 rsync
172
173 #endif
174
175
176 .endm
177
178 .macro initialize_cacheattr
179
180 #if !defined(CONFIG_MMU) && (XCHAL_HAVE_TLBS || XCHAL_HAVE_MPU)
181 #if CONFIG_MEMMAP_CACHEATTR == 0x22222222 && XCHAL_HAVE_PTP_MMU
182 #error Default MEMMAP_CACHEATTR of 0x22222222 does not work with full MMU.
183 #endif
184
185 #if XCHAL_HAVE_MPU
186 .data
187 .align 4
188 .Lattribute_table:
189 .long 0x000000, 0x1fff00, 0x1ddf00, 0x1eef00
190 .long 0x006600, 0x000000, 0x000000, 0x000000
191 .long 0x000000, 0x000000, 0x000000, 0x000000
192 .long 0x000000, 0x000000, 0x000000, 0x000000
193 .previous
194
195 movi a3, .Lattribute_table
196 movi a4, CONFIG_MEMMAP_CACHEATTR
197 movi a5, 1
198 movi a6, XCHAL_MPU_ENTRIES
199 movi a10, 0x20000000
200 movi a11, -1
201 1:
202 sub a5, a5, a10
203 extui a8, a4, 28, 4
204 beq a8, a11, 2f
205 addi a6, a6, -1
206 mov a11, a8
207 2:
208 addx4 a9, a8, a3
209 l32i a9, a9, 0
210 or a9, a9, a6
211 wptlb a9, a5
212 slli a4, a4, 4
213 bgeu a5, a10, 1b
214
215 #else
216 movi a5, XCHAL_SPANNING_WAY
217 movi a6, ~_PAGE_ATTRIB_MASK
218 movi a4, CONFIG_MEMMAP_CACHEATTR
219 movi a8, 0x20000000
220 1:
221 rdtlb1 a3, a5
222 xor a3, a3, a4
223 and a3, a3, a6
224 xor a3, a3, a4
225 wdtlb a3, a5
226 ritlb1 a3, a5
227 xor a3, a3, a4
228 and a3, a3, a6
229 xor a3, a3, a4
230 witlb a3, a5
231
232 add a5, a5, a8
233 srli a4, a4, 4
234 bgeu a5, a8, 1b
235
236 isync
237 #endif
238 #endif
239
240 .endm
241
242 #endif
243
244 #endif