Commit 6729cf7967f6c11f6de6a0b43ec277905a00c146
Committed by
David S. Miller
1 parent
1ec8cf6233
Exists in
smarc-l5.0.0_1.0.0-ga
and in
5 other branches
sparc32: introduce run-time patching of srmmu access functions
LEON uses a different ASI than SUN for MMUREGS Signed-off-by: Sam Ravnborg <sam@ravnborg.org> Cc: Daniel Hellstrom <daniel@gaisler.com> Cc: Konrad Eisele <konrad@gaisler.com>
Showing 3 changed files with 90 additions and 61 deletions Side-by-side Diff
arch/sparc/include/asm/pgtsrmmu.h
... | ... | @@ -149,67 +149,13 @@ |
149 | 149 | #define __nocache_fix(VADDR) __va(__nocache_pa(VADDR)) |
150 | 150 | |
151 | 151 | /* Accessing the MMU control register. */ |
152 | -static inline unsigned int srmmu_get_mmureg(void) | |
153 | -{ | |
154 | - unsigned int retval; | |
155 | - __asm__ __volatile__("lda [%%g0] %1, %0\n\t" : | |
156 | - "=r" (retval) : | |
157 | - "i" (ASI_M_MMUREGS)); | |
158 | - return retval; | |
159 | -} | |
160 | - | |
161 | -static inline void srmmu_set_mmureg(unsigned long regval) | |
162 | -{ | |
163 | - __asm__ __volatile__("sta %0, [%%g0] %1\n\t" : : | |
164 | - "r" (regval), "i" (ASI_M_MMUREGS) : "memory"); | |
165 | - | |
166 | -} | |
167 | - | |
168 | -static inline void srmmu_set_ctable_ptr(unsigned long paddr) | |
169 | -{ | |
170 | - paddr = ((paddr >> 4) & SRMMU_CTX_PMASK); | |
171 | - __asm__ __volatile__("sta %0, [%1] %2\n\t" : : | |
172 | - "r" (paddr), "r" (SRMMU_CTXTBL_PTR), | |
173 | - "i" (ASI_M_MMUREGS) : | |
174 | - "memory"); | |
175 | -} | |
176 | - | |
177 | -static inline void srmmu_set_context(int context) | |
178 | -{ | |
179 | - __asm__ __volatile__("sta %0, [%1] %2\n\t" : : | |
180 | - "r" (context), "r" (SRMMU_CTX_REG), | |
181 | - "i" (ASI_M_MMUREGS) : "memory"); | |
182 | -} | |
183 | - | |
184 | -static inline int srmmu_get_context(void) | |
185 | -{ | |
186 | - register int retval; | |
187 | - __asm__ __volatile__("lda [%1] %2, %0\n\t" : | |
188 | - "=r" (retval) : | |
189 | - "r" (SRMMU_CTX_REG), | |
190 | - "i" (ASI_M_MMUREGS)); | |
191 | - return retval; | |
192 | -} | |
193 | - | |
194 | -static inline unsigned int srmmu_get_fstatus(void) | |
195 | -{ | |
196 | - unsigned int retval; | |
197 | - | |
198 | - __asm__ __volatile__("lda [%1] %2, %0\n\t" : | |
199 | - "=r" (retval) : | |
200 | - "r" (SRMMU_FAULT_STATUS), "i" (ASI_M_MMUREGS)); | |
201 | - return retval; | |
202 | -} | |
203 | - | |
204 | -static inline unsigned int srmmu_get_faddr(void) | |
205 | -{ | |
206 | - unsigned int retval; | |
207 | - | |
208 | - __asm__ __volatile__("lda [%1] %2, %0\n\t" : | |
209 | - "=r" (retval) : | |
210 | - "r" (SRMMU_FAULT_ADDR), "i" (ASI_M_MMUREGS)); | |
211 | - return retval; | |
212 | -} | |
152 | +unsigned int srmmu_get_mmureg(void); | |
153 | +void srmmu_set_mmureg(unsigned long regval); | |
154 | +void srmmu_set_ctable_ptr(unsigned long paddr); | |
155 | +void srmmu_set_context(int context); | |
156 | +int srmmu_get_context(void); | |
157 | +unsigned int srmmu_get_fstatus(void); | |
158 | +unsigned int srmmu_get_faddr(void); | |
213 | 159 | |
214 | 160 | /* This is guaranteed on all SRMMU's. */ |
215 | 161 | static inline void srmmu_flush_whole_tlb(void) |
arch/sparc/mm/Makefile
... | ... | @@ -8,6 +8,7 @@ |
8 | 8 | obj-y += fault_$(BITS).o |
9 | 9 | obj-y += init_$(BITS).o |
10 | 10 | obj-$(CONFIG_SPARC32) += extable.o srmmu.o iommu.o io-unit.o |
11 | +obj-$(CONFIG_SPARC32) += srmmu_access.o | |
11 | 12 | obj-$(CONFIG_SPARC32) += hypersparc.o viking.o tsunami.o swift.o |
12 | 13 | obj-$(CONFIG_SPARC32) += leon_mm.o |
13 | 14 |
arch/sparc/mm/srmmu_access.S
1 | +/* Assembler variants of srmmu access functions. | |
2 | + * Implemented in assembler to allow run-time patching. | |
3 | + * LEON uses a different ASI for MMUREGS than SUN. | |
4 | + * | |
5 | + * The leon_1insn_patch infrastructure is used | |
6 | + * for the run-time patching. | |
7 | + */ | |
8 | + | |
9 | +#include <linux/linkage.h> | |
10 | + | |
11 | +#include <asm/asmmacro.h> | |
12 | +#include <asm/pgtsrmmu.h> | |
13 | +#include <asm/asi.h> | |
14 | + | |
15 | +/* unsigned int srmmu_get_mmureg(void) */ | |
16 | +ENTRY(srmmu_get_mmureg) | |
17 | +LEON_PI(lda [%g0] ASI_LEON_MMUREGS, %o0) | |
18 | +SUN_PI_(lda [%g0] ASI_M_MMUREGS, %o0) | |
19 | + retl | |
20 | + nop | |
21 | +ENDPROC(srmmu_get_mmureg) | |
22 | + | |
23 | +/* void srmmu_set_mmureg(unsigned long regval) */ | |
24 | +ENTRY(srmmu_set_mmureg) | |
25 | +LEON_PI(sta %o0, [%g0] ASI_LEON_MMUREGS) | |
26 | +SUN_PI_(sta %o0, [%g0] ASI_M_MMUREGS) | |
27 | + retl | |
28 | + nop | |
29 | +ENDPROC(srmmu_set_mmureg) | |
30 | + | |
31 | +/* void srmmu_set_ctable_ptr(unsigned long paddr) */ | |
32 | +ENTRY(srmmu_set_ctable_ptr) | |
33 | + /* paddr = ((paddr >> 4) & SRMMU_CTX_PMASK); */ | |
34 | + srl %o0, 4, %g1 | |
35 | + and %g1, SRMMU_CTX_PMASK, %g1 | |
36 | + | |
37 | + mov SRMMU_CTXTBL_PTR, %g2 | |
38 | +LEON_PI(sta %g1, [%g2] ASI_LEON_MMUREGS) | |
39 | +SUN_PI_(sta %g1, [%g2] ASI_M_MMUREGS) | |
40 | + retl | |
41 | + nop | |
42 | +ENDPROC(srmmu_set_ctable_ptr) | |
43 | + | |
44 | + | |
45 | +/* void srmmu_set_context(int context) */ | |
46 | +ENTRY(srmmu_set_context) | |
47 | + mov SRMMU_CTX_REG, %g1 | |
48 | +LEON_PI(sta %o0, [%g1] ASI_LEON_MMUREGS) | |
49 | +SUN_PI_(sta %o0, [%g1] ASI_M_MMUREGS) | |
50 | + retl | |
51 | + nop | |
52 | +ENDPROC(srmmu_set_context) | |
53 | + | |
54 | + | |
55 | +/* int srmmu_get_context(void) */ | |
56 | +ENTRY(srmmu_get_context) | |
57 | + mov SRMMU_CTX_REG, %o0 | |
58 | +LEON_PI(lda [%o0] ASI_LEON_MMUREGS, %o0) | |
59 | +SUN_PI_(lda [%o0] ASI_M_MMUREGS, %o0) | |
60 | + retl | |
61 | + nop | |
62 | +ENDPROC(srmmu_get_context) | |
63 | + | |
64 | + | |
65 | +/* unsigned int srmmu_get_fstatus(void) */ | |
66 | +ENTRY(srmmu_get_fstatus) | |
67 | + mov SRMMU_FAULT_STATUS, %o0 | |
68 | +LEON_PI(lda [%o0] ASI_LEON_MMUREGS, %o0) | |
69 | +SUN_PI_(lda [%o0] ASI_M_MMUREGS, %o0) | |
70 | + retl | |
71 | + nop | |
72 | +ENDPROC(srmmu_get_fstatus) | |
73 | + | |
74 | + | |
75 | +/* unsigned int srmmu_get_faddr(void) */ | |
76 | +ENTRY(srmmu_get_faddr) | |
77 | + mov SRMMU_FAULT_ADDR, %o0 | |
78 | +LEON_PI(lda [%o0] ASI_LEON_MMUREGS, %o0) | |
79 | +SUN_PI_(lda [%o0] ASI_M_MMUREGS, %o0) | |
80 | + retl | |
81 | + nop | |
82 | +ENDPROC(srmmu_get_faddr) |