Commit 6729cf7967f6c11f6de6a0b43ec277905a00c146

Authored by Sam Ravnborg
Committed by David S. Miller
1 parent 1ec8cf6233

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)