xref: /openbmc/linux/arch/xtensa/include/asm/initialize_mmu.h (revision 05cf4fe738242183f1237f1b3a28b4479348c0a1)
1 /*
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 #ifndef XCHAL_SPANNING_WAY
37 #define XCHAL_SPANNING_WAY 0
38 #endif
39 
40 #ifdef __ASSEMBLY__
41 
42 #define XTENSA_HWVERSION_RC_2009_0 230000
43 
44 	.macro	initialize_mmu
45 
46 #if XCHAL_HAVE_S32C1I && (XCHAL_HW_MIN_VERSION >= XTENSA_HWVERSION_RC_2009_0)
47 /*
48  * We Have Atomic Operation Control (ATOMCTL) Register; Initialize it.
49  * For details see Documentation/xtensa/atomctl.txt
50  */
51 #if XCHAL_DCACHE_IS_COHERENT
52 	movi	a3, 0x25	/* For SMP/MX -- internal for writeback,
53 				 * RCW otherwise
54 				 */
55 #else
56 	movi	a3, 0x29	/* non-MX -- Most cores use Std Memory
57 				 * Controlers which usually can't use RCW
58 				 */
59 #endif
60 	wsr	a3, atomctl
61 #endif  /* XCHAL_HAVE_S32C1I &&
62 	 * (XCHAL_HW_MIN_VERSION >= XTENSA_HWVERSION_RC_2009_0)
63 	 */
64 
65 #if defined(CONFIG_MMU) && XCHAL_HAVE_PTP_MMU && XCHAL_HAVE_SPANNING_WAY
66 /*
67  * Have MMU v3
68  */
69 
70 #if !XCHAL_HAVE_VECBASE
71 # error "MMU v3 requires reloc vectors"
72 #endif
73 
74 	movi	a1, 0
75 	_call0	1f
76 	_j	2f
77 
78 	.align	4
79 1:	movi	a2, 0x10000000
80 
81 #if CONFIG_KERNEL_LOAD_ADDRESS < 0x40000000ul
82 #define TEMP_MAPPING_VADDR 0x40000000
83 #else
84 #define TEMP_MAPPING_VADDR 0x00000000
85 #endif
86 
87 	/* Step 1: invalidate mapping at 0x40000000..0x5FFFFFFF. */
88 
89 	movi	a2, TEMP_MAPPING_VADDR | XCHAL_SPANNING_WAY
90 	idtlb	a2
91 	iitlb	a2
92 	isync
93 
94 	/* Step 2: map 0x40000000..0x47FFFFFF to paddr containing this code
95 	 * and jump to the new mapping.
96 	 */
97 
98 	srli	a3, a0, 27
99 	slli	a3, a3, 27
100 	addi	a3, a3, CA_BYPASS
101 	addi	a7, a2, 5 - XCHAL_SPANNING_WAY
102 	wdtlb	a3, a7
103 	witlb	a3, a7
104 	isync
105 
106 	slli	a4, a0, 5
107 	srli	a4, a4, 5
108 	addi	a5, a2, -XCHAL_SPANNING_WAY
109 	add	a4, a4, a5
110 	jx	a4
111 
112 	/* Step 3: unmap everything other than current area.
113 	 *	   Start at 0x60000000, wrap around, and end with 0x20000000
114 	 */
115 2:	movi	a4, 0x20000000
116 	add	a5, a2, a4
117 3:	idtlb	a5
118 	iitlb	a5
119 	add	a5, a5, a4
120 	bne	a5, a2, 3b
121 
122 	/* Step 4: Setup MMU with the requested static mappings. */
123 
124 	movi	a6, 0x01000000
125 	wsr	a6, ITLBCFG
126 	wsr	a6, DTLBCFG
127 	isync
128 
129 	movi	a5, XCHAL_KSEG_CACHED_VADDR + XCHAL_KSEG_TLB_WAY
130 	movi	a4, XCHAL_KSEG_PADDR + CA_WRITEBACK
131 	wdtlb	a4, a5
132 	witlb	a4, a5
133 
134 	movi	a5, XCHAL_KSEG_BYPASS_VADDR + XCHAL_KSEG_TLB_WAY
135 	movi	a4, XCHAL_KSEG_PADDR + CA_BYPASS
136 	wdtlb	a4, a5
137 	witlb	a4, a5
138 
139 #ifdef CONFIG_XTENSA_KSEG_512M
140 	movi	a5, XCHAL_KSEG_CACHED_VADDR + 0x10000000 + XCHAL_KSEG_TLB_WAY
141 	movi	a4, XCHAL_KSEG_PADDR + 0x10000000 + CA_WRITEBACK
142 	wdtlb	a4, a5
143 	witlb	a4, a5
144 
145 	movi	a5, XCHAL_KSEG_BYPASS_VADDR + 0x10000000 + XCHAL_KSEG_TLB_WAY
146 	movi	a4, XCHAL_KSEG_PADDR + 0x10000000 + CA_BYPASS
147 	wdtlb	a4, a5
148 	witlb	a4, a5
149 #endif
150 
151 	movi	a5, XCHAL_KIO_CACHED_VADDR + XCHAL_KIO_TLB_WAY
152 	movi	a4, XCHAL_KIO_DEFAULT_PADDR + CA_WRITEBACK
153 	wdtlb	a4, a5
154 	witlb	a4, a5
155 
156 	movi	a5, XCHAL_KIO_BYPASS_VADDR + XCHAL_KIO_TLB_WAY
157 	movi	a4, XCHAL_KIO_DEFAULT_PADDR + CA_BYPASS
158 	wdtlb	a4, a5
159 	witlb	a4, a5
160 
161 	isync
162 
163 	/* Jump to self, using final mappings. */
164 	movi	a4, 1f
165 	jx	a4
166 
167 1:
168 	/* Step 5: remove temporary mapping. */
169 	idtlb	a7
170 	iitlb	a7
171 	isync
172 
173 	movi	a0, 0
174 	wsr	a0, ptevaddr
175 	rsync
176 
177 #endif /* defined(CONFIG_MMU) && XCHAL_HAVE_PTP_MMU &&
178 	  XCHAL_HAVE_SPANNING_WAY */
179 
180 	.endm
181 
182 	.macro	initialize_cacheattr
183 
184 #if !defined(CONFIG_MMU) && XCHAL_HAVE_TLBS
185 #if CONFIG_MEMMAP_CACHEATTR == 0x22222222 && XCHAL_HAVE_PTP_MMU
186 #error Default MEMMAP_CACHEATTR of 0x22222222 does not work with full MMU.
187 #endif
188 
189 	movi	a5, XCHAL_SPANNING_WAY
190 	movi	a6, ~_PAGE_ATTRIB_MASK
191 	movi	a4, CONFIG_MEMMAP_CACHEATTR
192 	movi	a8, 0x20000000
193 1:
194 	rdtlb1	a3, a5
195 	xor	a3, a3, a4
196 	and	a3, a3, a6
197 	xor	a3, a3, a4
198 	wdtlb	a3, a5
199 	ritlb1	a3, a5
200 	xor	a3, a3, a4
201 	and	a3, a3, a6
202 	xor	a3, a3, a4
203 	witlb	a3, a5
204 
205 	add	a5, a5, a8
206 	srli	a4, a4, 4
207 	bgeu	a5, a8, 1b
208 
209 	isync
210 #endif
211 
212 	.endm
213 
214 #endif /*__ASSEMBLY__*/
215 
216 #endif /* _XTENSA_INITIALIZE_MMU_H */
217