blob: 3b054d2bede01c48ea583eef794a605254899daf [file] [log] [blame]
b.liue9582032025-04-17 19:18:16 +08001/*
2 * arch/xtensa/include/asm/initialize_mmu.h
3 *
4 * Initializes MMU:
5 *
6 * For the new V3 MMU we remap the TLB from virtual == physical
7 * to the standard Linux mapping used in earlier MMU's.
8 *
9 * The the MMU we also support a new configuration register that
10 * specifies how the S32C1I instruction operates with the cache
11 * controller.
12 *
13 * This file is subject to the terms and conditions of the GNU General
14 * Public License. See the file "COPYING" in the main directory of
15 * this archive for more details.
16 *
17 * Copyright (C) 2008 - 2012 Tensilica, Inc.
18 *
19 * Marc Gauthier <marc@tensilica.com>
20 * Pete Delaney <piet@tensilica.com>
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 * We Have Atomic Operation Control (ATOMCTL) Register; Initialize it.
45 * For details see Documentation/xtensa/atomctl.rst
46 */
47#if XCHAL_DCACHE_IS_COHERENT
48 movi a3, 0x25 /* For SMP/MX -- internal for writeback,
49 * RCW otherwise
50 */
51#else
52 movi a3, 0x29 /* non-MX -- Most cores use Std Memory
53 * Controlers which usually can't use RCW
54 */
55#endif
56 wsr a3, atomctl
57#endif /* XCHAL_HAVE_S32C1I &&
58 * (XCHAL_HW_MIN_VERSION >= XTENSA_HWVERSION_RC_2009_0)
59 */
60
61#if defined(CONFIG_MMU) && XCHAL_HAVE_PTP_MMU && XCHAL_HAVE_SPANNING_WAY
62/*
63 * Have MMU v3
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
751: 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 /* Step 1: invalidate mapping at 0x40000000..0x5FFFFFFF. */
84
85 movi a2, TEMP_MAPPING_VADDR | XCHAL_SPANNING_WAY
86 idtlb a2
87 iitlb a2
88 isync
89
90 /* Step 2: map 0x40000000..0x47FFFFFF to paddr containing this code
91 * and jump to the new mapping.
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 /* Step 3: unmap everything other than current area.
109 * Start at 0x60000000, wrap around, and end with 0x20000000
110 */
1112: movi a4, 0x20000000
112 add a5, a2, a4
1133: idtlb a5
114 iitlb a5
115 add a5, a5, a4
116 bne a5, a2, 3b
117
118 /* Step 4: Setup MMU with the requested static mappings. */
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 /* Jump to self, using final mappings. */
160 movi a4, 1f
161 jx a4
162
1631:
164 /* Step 5: remove temporary mapping. */
165 idtlb a7
166 iitlb a7
167 isync
168
169 movi a0, 0
170 wsr a0, ptevaddr
171 rsync
172
173#endif /* defined(CONFIG_MMU) && XCHAL_HAVE_PTP_MMU &&
174 XCHAL_HAVE_SPANNING_WAY */
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
2011:
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
2072:
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
2201:
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 /*__ASSEMBLY__*/
243
244#endif /* _XTENSA_INITIALIZE_MMU_H */