srmmu.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:64k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /* $Id: srmmu.c,v 1.233 2001/11/13 00:49:27 davem Exp $
  2.  * srmmu.c:  SRMMU specific routines for memory management.
  3.  *
  4.  * Copyright (C) 1995 David S. Miller  (davem@caip.rutgers.edu)
  5.  * Copyright (C) 1995 Pete Zaitcev
  6.  * Copyright (C) 1996 Eddie C. Dost    (ecd@skynet.be)
  7.  * Copyright (C) 1997,1998 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
  8.  * Copyright (C) 1999,2000 Anton Blanchard (anton@samba.org)
  9.  */
  10. #include <linux/config.h>
  11. #include <linux/kernel.h>
  12. #include <linux/mm.h>
  13. #include <linux/slab.h>
  14. #include <linux/vmalloc.h>
  15. #include <linux/pagemap.h>
  16. #include <linux/init.h>
  17. #include <linux/blk.h>
  18. #include <linux/spinlock.h>
  19. #include <linux/bootmem.h>
  20. #include <linux/fs.h>
  21. #include <linux/seq_file.h>
  22. #include <asm/page.h>
  23. #include <asm/pgalloc.h>
  24. #include <asm/pgtable.h>
  25. #include <asm/io.h>
  26. #include <asm/kdebug.h>
  27. #include <asm/vaddrs.h>
  28. #include <asm/traps.h>
  29. #include <asm/smp.h>
  30. #include <asm/mbus.h>
  31. #include <asm/cache.h>
  32. #include <asm/oplib.h>
  33. #include <asm/sbus.h>
  34. #include <asm/asi.h>
  35. #include <asm/msi.h>
  36. #include <asm/a.out.h>
  37. #include <asm/mmu_context.h>
  38. #include <asm/io-unit.h>
  39. /* Now the cpu specific definitions. */
  40. #include <asm/viking.h>
  41. #include <asm/mxcc.h>
  42. #include <asm/ross.h>
  43. #include <asm/tsunami.h>
  44. #include <asm/swift.h>
  45. #include <asm/turbosparc.h>
  46. #include <asm/btfixup.h>
  47. enum mbus_module srmmu_modtype;
  48. unsigned int hwbug_bitmask;
  49. int vac_cache_size;
  50. int vac_line_size;
  51. extern struct resource sparc_iomap;
  52. extern unsigned long last_valid_pfn;
  53. extern unsigned long page_kernel;
  54. pgd_t *srmmu_swapper_pg_dir;
  55. #ifdef CONFIG_SMP
  56. #define FLUSH_BEGIN(mm)
  57. #define FLUSH_END
  58. #else
  59. #define FLUSH_BEGIN(mm) if((mm)->context != NO_CONTEXT) {
  60. #define FLUSH_END }
  61. #endif
  62. BTFIXUPDEF_CALL(void, flush_page_for_dma, unsigned long)
  63. #define flush_page_for_dma(page) BTFIXUP_CALL(flush_page_for_dma)(page)
  64. int flush_page_for_dma_global = 1;
  65. #ifdef CONFIG_SMP
  66. BTFIXUPDEF_CALL(void, local_flush_page_for_dma, unsigned long)
  67. #define local_flush_page_for_dma(page) BTFIXUP_CALL(local_flush_page_for_dma)(page)
  68. #endif
  69. char *srmmu_name;
  70. ctxd_t *srmmu_ctx_table_phys;
  71. ctxd_t *srmmu_context_table;
  72. int viking_mxcc_present;
  73. spinlock_t srmmu_context_spinlock = SPIN_LOCK_UNLOCKED;
  74. int is_hypersparc;
  75. /*
  76.  * In general all page table modifications should use the V8 atomic
  77.  * swap instruction.  This insures the mmu and the cpu are in sync
  78.  * with respect to ref/mod bits in the page tables.
  79.  */
  80. static inline unsigned long srmmu_swap(unsigned long *addr, unsigned long value)
  81. {
  82. __asm__ __volatile__("swap [%2], %0" : "=&r" (value) : "0" (value), "r" (addr));
  83. return value;
  84. }
  85. static inline void srmmu_set_pte(pte_t *ptep, pte_t pteval)
  86. {
  87. srmmu_swap((unsigned long *)ptep, pte_val(pteval));
  88. }
  89. /* The very generic SRMMU page table operations. */
  90. static inline int srmmu_device_memory(unsigned long x)
  91. {
  92. return ((x & 0xF0000000) != 0);
  93. }
  94. int srmmu_cache_pagetables;
  95. /* these will be initialized in srmmu_nocache_calcsize() */
  96. int srmmu_nocache_npages;
  97. unsigned long srmmu_nocache_size;
  98. unsigned long srmmu_nocache_end;
  99. unsigned long pkmap_base;
  100. unsigned long pkmap_base_end;
  101. unsigned long srmmu_nocache_bitmap_size;
  102. extern unsigned long fix_kmap_begin;
  103. extern unsigned long fix_kmap_end;
  104. #define SRMMU_NOCACHE_BITMAP_SHIFT (PAGE_SHIFT - 4)
  105. void *srmmu_nocache_pool;
  106. void *srmmu_nocache_bitmap;
  107. int srmmu_nocache_low;
  108. int srmmu_nocache_used;
  109. spinlock_t srmmu_nocache_spinlock;
  110. /* This makes sense. Honest it does - Anton */
  111. #define __nocache_pa(VADDR) (((unsigned long)VADDR) - SRMMU_NOCACHE_VADDR + __pa((unsigned long)srmmu_nocache_pool))
  112. #define __nocache_va(PADDR) (__va((unsigned long)PADDR) - (unsigned long)srmmu_nocache_pool + SRMMU_NOCACHE_VADDR)
  113. #define __nocache_fix(VADDR) __va(__nocache_pa(VADDR))
  114. static inline unsigned long srmmu_pgd_page(pgd_t pgd)
  115. { return srmmu_device_memory(pgd_val(pgd))?~0:(unsigned long)__nocache_va((pgd_val(pgd) & SRMMU_PTD_PMASK) << 4); }
  116. static inline unsigned long srmmu_pmd_page(pmd_t pmd)
  117. { return srmmu_device_memory(pmd_val(pmd))?~0:(unsigned long)__nocache_va((pmd_val(pmd) & SRMMU_PTD_PMASK) << 4); }
  118. static inline struct page *srmmu_pte_page(pte_t pte)
  119. { return (mem_map + (unsigned long)(srmmu_device_memory(pte_val(pte))?~0:(((pte_val(pte) & SRMMU_PTE_PMASK) << 4) >> PAGE_SHIFT))); }
  120. static inline int srmmu_pte_none(pte_t pte)
  121. { return !(pte_val(pte) & 0xFFFFFFF); }
  122. static inline int srmmu_pte_present(pte_t pte)
  123. { return ((pte_val(pte) & SRMMU_ET_MASK) == SRMMU_ET_PTE); }
  124. static inline void srmmu_pte_clear(pte_t *ptep)
  125. { srmmu_set_pte(ptep, __pte(0)); }
  126. static inline int srmmu_pmd_none(pmd_t pmd)
  127. { return !(pmd_val(pmd) & 0xFFFFFFF); }
  128. static inline int srmmu_pmd_bad(pmd_t pmd)
  129. { return (pmd_val(pmd) & SRMMU_ET_MASK) != SRMMU_ET_PTD; }
  130. static inline int srmmu_pmd_present(pmd_t pmd)
  131. { return ((pmd_val(pmd) & SRMMU_ET_MASK) == SRMMU_ET_PTD); }
  132. static inline void srmmu_pmd_clear(pmd_t *pmdp)
  133. { srmmu_set_pte((pte_t *)pmdp, __pte(0)); }
  134. static inline int srmmu_pgd_none(pgd_t pgd)          
  135. { return !(pgd_val(pgd) & 0xFFFFFFF); }
  136. static inline int srmmu_pgd_bad(pgd_t pgd)
  137. { return (pgd_val(pgd) & SRMMU_ET_MASK) != SRMMU_ET_PTD; }
  138. static inline int srmmu_pgd_present(pgd_t pgd)
  139. { return ((pgd_val(pgd) & SRMMU_ET_MASK) == SRMMU_ET_PTD); }
  140. static inline void srmmu_pgd_clear(pgd_t * pgdp)
  141. { srmmu_set_pte((pte_t *)pgdp, __pte(0)); }
  142. static inline int srmmu_pte_write(pte_t pte)
  143. { return pte_val(pte) & SRMMU_WRITE; }
  144. static inline int srmmu_pte_dirty(pte_t pte)
  145. { return pte_val(pte) & SRMMU_DIRTY; }
  146. static inline int srmmu_pte_young(pte_t pte)
  147. { return pte_val(pte) & SRMMU_REF; }
  148. static inline pte_t srmmu_pte_wrprotect(pte_t pte)
  149. { return __pte(pte_val(pte) & ~SRMMU_WRITE);}
  150. static inline pte_t srmmu_pte_mkclean(pte_t pte)
  151. { return __pte(pte_val(pte) & ~SRMMU_DIRTY);}
  152. static inline pte_t srmmu_pte_mkold(pte_t pte)
  153. { return __pte(pte_val(pte) & ~SRMMU_REF);}
  154. static inline pte_t srmmu_pte_mkwrite(pte_t pte)
  155. { return __pte(pte_val(pte) | SRMMU_WRITE);}
  156. static inline pte_t srmmu_pte_mkdirty(pte_t pte)
  157. { return __pte(pte_val(pte) | SRMMU_DIRTY);}
  158. static inline pte_t srmmu_pte_mkyoung(pte_t pte)
  159. { return __pte(pte_val(pte) | SRMMU_REF);}
  160. /*
  161.  * Conversion functions: convert a page and protection to a page entry,
  162.  * and a page entry and page directory to the page they refer to.
  163.  */
  164. static pte_t srmmu_mk_pte(struct page *page, pgprot_t pgprot)
  165. { return __pte((((page - mem_map) << PAGE_SHIFT) >> 4) | pgprot_val(pgprot)); }
  166. static pte_t srmmu_mk_pte_phys(unsigned long page, pgprot_t pgprot)
  167. { return __pte(((page) >> 4) | pgprot_val(pgprot)); }
  168. static pte_t srmmu_mk_pte_io(unsigned long page, pgprot_t pgprot, int space)
  169. { return __pte(((page) >> 4) | (space << 28) | pgprot_val(pgprot)); }
  170. /* XXX should we hyper_flush_whole_icache here - Anton */
  171. static inline void srmmu_ctxd_set(ctxd_t *ctxp, pgd_t *pgdp)
  172. { srmmu_set_pte((pte_t *)ctxp, (SRMMU_ET_PTD | (__nocache_pa((unsigned long) pgdp) >> 4))); }
  173. static inline void srmmu_pgd_set(pgd_t * pgdp, pmd_t * pmdp)
  174. { srmmu_set_pte((pte_t *)pgdp, (SRMMU_ET_PTD | (__nocache_pa((unsigned long) pmdp) >> 4))); }
  175. static inline void srmmu_pmd_set(pmd_t * pmdp, pte_t * ptep)
  176. { srmmu_set_pte((pte_t *)pmdp, (SRMMU_ET_PTD | (__nocache_pa((unsigned long) ptep) >> 4))); }
  177. static inline pte_t srmmu_pte_modify(pte_t pte, pgprot_t newprot)
  178. { return __pte((pte_val(pte) & SRMMU_CHG_MASK) | pgprot_val(newprot)); }
  179. /* to find an entry in a top-level page table... */
  180. extern inline pgd_t *srmmu_pgd_offset(struct mm_struct * mm, unsigned long address)
  181. { return mm->pgd + (address >> SRMMU_PGDIR_SHIFT); }
  182. /* Find an entry in the second-level page table.. */
  183. static inline pmd_t *srmmu_pmd_offset(pgd_t * dir, unsigned long address)
  184. { return (pmd_t *) srmmu_pgd_page(*dir) + ((address >> SRMMU_PMD_SHIFT) & (SRMMU_PTRS_PER_PMD - 1)); }
  185. /* Find an entry in the third-level page table.. */ 
  186. static inline pte_t *srmmu_pte_offset(pmd_t * dir, unsigned long address)
  187. { return (pte_t *) srmmu_pmd_page(*dir) + ((address >> PAGE_SHIFT) & (SRMMU_PTRS_PER_PTE - 1)); }
  188. unsigned long __srmmu_get_nocache(int size, int align)
  189. {
  190. int offset = srmmu_nocache_low;
  191. int i;
  192. unsigned long va_tmp, phys_tmp;
  193. int lowest_failed = 0;
  194. size = size >> SRMMU_NOCACHE_BITMAP_SHIFT;
  195. spin_lock(&srmmu_nocache_spinlock);
  196. repeat:
  197. offset = find_next_zero_bit(srmmu_nocache_bitmap, srmmu_nocache_bitmap_size, offset);
  198. /* we align on physical address */
  199. if (align) {
  200. va_tmp = (SRMMU_NOCACHE_VADDR + (offset << SRMMU_NOCACHE_BITMAP_SHIFT));
  201. phys_tmp = (__nocache_pa(va_tmp) + align - 1) & ~(align - 1);
  202. va_tmp = (unsigned long)__nocache_va(phys_tmp);
  203. offset = (va_tmp - SRMMU_NOCACHE_VADDR) >> SRMMU_NOCACHE_BITMAP_SHIFT;
  204. }
  205. if ((srmmu_nocache_bitmap_size - offset) < size) {
  206. printk("Run out of nocached RAM!n");
  207. spin_unlock(&srmmu_nocache_spinlock);
  208. return 0;
  209. }
  210. i = 0;
  211. while(i < size) {
  212. if (test_bit(offset + i, srmmu_nocache_bitmap)) {
  213. lowest_failed = 1;
  214. offset = offset + i + 1;
  215. goto repeat;
  216. }
  217. i++;
  218. }
  219. i = 0;
  220. while(i < size) {
  221. set_bit(offset + i, srmmu_nocache_bitmap);
  222. i++;
  223. srmmu_nocache_used++;
  224. }
  225. if (!lowest_failed && ((align >> SRMMU_NOCACHE_BITMAP_SHIFT) <= 1) && (offset > srmmu_nocache_low))
  226. srmmu_nocache_low = offset;
  227. spin_unlock(&srmmu_nocache_spinlock);
  228. return (SRMMU_NOCACHE_VADDR + (offset << SRMMU_NOCACHE_BITMAP_SHIFT));
  229. }
  230. unsigned inline long srmmu_get_nocache(int size, int align)
  231. {
  232. unsigned long tmp;
  233. tmp = __srmmu_get_nocache(size, align);
  234. if (tmp)
  235. memset((void *)tmp, 0, size);
  236. return tmp;
  237. }
  238. void srmmu_free_nocache(unsigned long vaddr, int size)
  239. {
  240. int offset = (vaddr - SRMMU_NOCACHE_VADDR) >> SRMMU_NOCACHE_BITMAP_SHIFT;
  241. size = size >> SRMMU_NOCACHE_BITMAP_SHIFT;
  242. spin_lock(&srmmu_nocache_spinlock);
  243. while(size--) {
  244. clear_bit(offset + size, srmmu_nocache_bitmap);
  245. srmmu_nocache_used--;
  246. }
  247. if (offset < srmmu_nocache_low)
  248. srmmu_nocache_low = offset;
  249. spin_unlock(&srmmu_nocache_spinlock);
  250. }
  251. void srmmu_early_allocate_ptable_skeleton(unsigned long start, unsigned long end);
  252. extern unsigned long probe_memory(void); /* in fault.c */
  253. /* Reserve nocache dynamically proportionally to the amount of
  254.  * system RAM. -- Tomas Szepe <szepe@pinerecords.com>, June 2002
  255.  */
  256. void srmmu_nocache_calcsize(void)
  257. {
  258. unsigned long sysmemavail = probe_memory() / 1024;
  259. srmmu_nocache_npages =
  260. sysmemavail / SRMMU_NOCACHE_ALCRATIO / 1024 * 256;
  261. if (sysmemavail % (SRMMU_NOCACHE_ALCRATIO * 1024))
  262. srmmu_nocache_npages += 256;
  263. /* anything above 1280 blows up */
  264. if (srmmu_nocache_npages > 1280) srmmu_nocache_npages = 1280;
  265. srmmu_nocache_size = srmmu_nocache_npages * PAGE_SIZE;
  266. srmmu_nocache_bitmap_size = srmmu_nocache_npages * 16;
  267. srmmu_nocache_end = SRMMU_NOCACHE_VADDR + srmmu_nocache_size;
  268. fix_kmap_begin = srmmu_nocache_end;
  269. fix_kmap_end = fix_kmap_begin + (KM_TYPE_NR * NR_CPUS - 1) * PAGE_SIZE;
  270. pkmap_base = SRMMU_NOCACHE_VADDR + srmmu_nocache_size + 0x40000;
  271. pkmap_base_end = pkmap_base + LAST_PKMAP * PAGE_SIZE;
  272. /* printk("system memory available = %luknnocache ram size = %lukn",
  273. sysmemavail, srmmu_nocache_size / 1024); */
  274. }
  275. void srmmu_nocache_init(void)
  276. {
  277. pgd_t *pgd;
  278. pmd_t *pmd;
  279. pte_t *pte;
  280. unsigned long paddr, vaddr;
  281. unsigned long pteval;
  282. srmmu_nocache_pool = __alloc_bootmem(srmmu_nocache_size, PAGE_SIZE, 0UL);
  283. memset(srmmu_nocache_pool, 0, srmmu_nocache_size);
  284. srmmu_nocache_bitmap = __alloc_bootmem(srmmu_nocache_bitmap_size, SMP_CACHE_BYTES, 0UL);
  285. memset(srmmu_nocache_bitmap, 0, srmmu_nocache_bitmap_size);
  286. srmmu_swapper_pg_dir = (pgd_t *)__srmmu_get_nocache(SRMMU_PGD_TABLE_SIZE, SRMMU_PGD_TABLE_SIZE);
  287. memset(__nocache_fix(srmmu_swapper_pg_dir), 0, SRMMU_PGD_TABLE_SIZE);
  288. init_mm.pgd = srmmu_swapper_pg_dir;
  289. srmmu_early_allocate_ptable_skeleton(SRMMU_NOCACHE_VADDR, srmmu_nocache_end);
  290. spin_lock_init(&srmmu_nocache_spinlock);
  291. paddr = __pa((unsigned long)srmmu_nocache_pool);
  292. vaddr = SRMMU_NOCACHE_VADDR;
  293. while (vaddr < srmmu_nocache_end) {
  294. pgd = pgd_offset_k(vaddr);
  295. pmd = srmmu_pmd_offset(__nocache_fix(pgd), vaddr);
  296. pte = srmmu_pte_offset(__nocache_fix(pmd), vaddr);
  297. pteval = ((paddr >> 4) | SRMMU_ET_PTE | SRMMU_PRIV);
  298. if (srmmu_cache_pagetables)
  299. pteval |= SRMMU_CACHE;
  300. srmmu_set_pte(__nocache_fix(pte), pteval);
  301. vaddr += PAGE_SIZE;
  302. paddr += PAGE_SIZE;
  303. }
  304. flush_cache_all();
  305. flush_tlb_all();
  306. }
  307. static inline pgd_t *srmmu_get_pgd_fast(void)
  308. {
  309. pgd_t *pgd = NULL;
  310. pgd = (pgd_t *)__srmmu_get_nocache(SRMMU_PGD_TABLE_SIZE, SRMMU_PGD_TABLE_SIZE);
  311. if (pgd) {
  312. pgd_t *init = pgd_offset_k(0);
  313. memset(pgd, 0, USER_PTRS_PER_PGD * sizeof(pgd_t));
  314. memcpy(pgd + USER_PTRS_PER_PGD, init + USER_PTRS_PER_PGD,
  315. (PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t));
  316. }
  317. return pgd;
  318. }
  319. static void srmmu_free_pgd_fast(pgd_t *pgd)
  320. {
  321. srmmu_free_nocache((unsigned long)pgd, SRMMU_PGD_TABLE_SIZE);
  322. }
  323. static pte_t *srmmu_pte_alloc_one_fast(struct mm_struct *mm, unsigned long address)
  324. {
  325. return (pte_t *)srmmu_get_nocache(SRMMU_PTE_TABLE_SIZE, SRMMU_PTE_TABLE_SIZE);
  326. }
  327. static pte_t *srmmu_pte_alloc_one(struct mm_struct *mm, unsigned long address)
  328. {
  329. return NULL;
  330. }
  331. static void srmmu_free_pte_fast(pte_t *pte)
  332. {
  333. srmmu_free_nocache((unsigned long)pte, SRMMU_PTE_TABLE_SIZE);
  334. }
  335. static pmd_t *srmmu_pmd_alloc_one_fast(struct mm_struct *mm, unsigned long address)
  336. {
  337. return (pmd_t *)srmmu_get_nocache(SRMMU_PMD_TABLE_SIZE, SRMMU_PMD_TABLE_SIZE);
  338. }
  339. static void srmmu_free_pmd_fast(pmd_t * pmd)
  340. {
  341. srmmu_free_nocache((unsigned long)pmd, SRMMU_PMD_TABLE_SIZE);
  342. }
  343. static inline void alloc_context(struct mm_struct *old_mm, struct mm_struct *mm)
  344. {
  345. struct ctx_list *ctxp;
  346. ctxp = ctx_free.next;
  347. if(ctxp != &ctx_free) {
  348. remove_from_ctx_list(ctxp);
  349. add_to_used_ctxlist(ctxp);
  350. mm->context = ctxp->ctx_number;
  351. ctxp->ctx_mm = mm;
  352. return;
  353. }
  354. ctxp = ctx_used.next;
  355. if(ctxp->ctx_mm == old_mm)
  356. ctxp = ctxp->next;
  357. if(ctxp == &ctx_used)
  358. panic("out of mmu contexts");
  359. flush_cache_mm(ctxp->ctx_mm);
  360. flush_tlb_mm(ctxp->ctx_mm);
  361. remove_from_ctx_list(ctxp);
  362. add_to_used_ctxlist(ctxp);
  363. ctxp->ctx_mm->context = NO_CONTEXT;
  364. ctxp->ctx_mm = mm;
  365. mm->context = ctxp->ctx_number;
  366. }
  367. static inline void free_context(int context)
  368. {
  369. struct ctx_list *ctx_old;
  370. ctx_old = ctx_list_pool + context;
  371. remove_from_ctx_list(ctx_old);
  372. add_to_free_ctxlist(ctx_old);
  373. }
  374. static void srmmu_switch_mm(struct mm_struct *old_mm, struct mm_struct *mm,
  375.     struct task_struct *tsk, int cpu)
  376. {
  377. if(mm->context == NO_CONTEXT) {
  378. spin_lock(&srmmu_context_spinlock);
  379. alloc_context(old_mm, mm);
  380. spin_unlock(&srmmu_context_spinlock);
  381. srmmu_ctxd_set(&srmmu_context_table[mm->context], mm->pgd);
  382. }
  383. if (is_hypersparc)
  384. hyper_flush_whole_icache();
  385. srmmu_set_context(mm->context);
  386. }
  387. /* Low level IO area allocation on the SRMMU. */
  388. void srmmu_mapioaddr(unsigned long physaddr, unsigned long virt_addr, int bus_type, int rdonly)
  389. {
  390. pgd_t *pgdp;
  391. pmd_t *pmdp;
  392. pte_t *ptep;
  393. unsigned long tmp;
  394. physaddr &= PAGE_MASK;
  395. pgdp = pgd_offset_k(virt_addr);
  396. pmdp = srmmu_pmd_offset(pgdp, virt_addr);
  397. ptep = srmmu_pte_offset(pmdp, virt_addr);
  398. tmp = (physaddr >> 4) | SRMMU_ET_PTE;
  399. /*
  400.  * I need to test whether this is consistent over all
  401.  * sun4m's.  The bus_type represents the upper 4 bits of
  402.  * 36-bit physical address on the I/O space lines...
  403.  */
  404. tmp |= (bus_type << 28);
  405. if(rdonly)
  406. tmp |= SRMMU_PRIV_RDONLY;
  407. else
  408. tmp |= SRMMU_PRIV;
  409. __flush_page_to_ram(virt_addr);
  410. srmmu_set_pte(ptep, __pte(tmp));
  411. flush_tlb_all();
  412. }
  413. void srmmu_unmapioaddr(unsigned long virt_addr)
  414. {
  415. pgd_t *pgdp;
  416. pmd_t *pmdp;
  417. pte_t *ptep;
  418. pgdp = pgd_offset_k(virt_addr);
  419. pmdp = srmmu_pmd_offset(pgdp, virt_addr);
  420. ptep = srmmu_pte_offset(pmdp, virt_addr);
  421. /* No need to flush uncacheable page. */
  422. srmmu_pte_clear(ptep);
  423. flush_tlb_all();
  424. }
  425. /*
  426.  * On the SRMMU we do not have the problems with limited tlb entries
  427.  * for mapping kernel pages, so we just take things from the free page
  428.  * pool.  As a side effect we are putting a little too much pressure
  429.  * on the gfp() subsystem.  This setup also makes the logic of the
  430.  * iommu mapping code a lot easier as we can transparently handle
  431.  * mappings on the kernel stack without any special code as we did
  432.  * need on the sun4c.
  433.  */
  434. struct task_struct *srmmu_alloc_task_struct(void)
  435. {
  436. return (struct task_struct *) __get_free_pages(GFP_KERNEL, 1);
  437. }
  438. static void srmmu_free_task_struct(struct task_struct *tsk)
  439. {
  440. free_pages((unsigned long)tsk, 1);
  441. }
  442. static void srmmu_get_task_struct(struct task_struct *tsk)
  443. {
  444. atomic_inc(&virt_to_page(tsk)->count);
  445. }
  446. /* tsunami.S */
  447. extern void tsunami_flush_cache_all(void);
  448. extern void tsunami_flush_cache_mm(struct mm_struct *mm);
  449. extern void tsunami_flush_cache_range(struct mm_struct *mm, unsigned long start, unsigned long end);
  450. extern void tsunami_flush_cache_page(struct vm_area_struct *vma, unsigned long page);
  451. extern void tsunami_flush_page_to_ram(unsigned long page);
  452. extern void tsunami_flush_page_for_dma(unsigned long page);
  453. extern void tsunami_flush_sig_insns(struct mm_struct *mm, unsigned long insn_addr);
  454. extern void tsunami_flush_tlb_all(void);
  455. extern void tsunami_flush_tlb_mm(struct mm_struct *mm);
  456. extern void tsunami_flush_tlb_range(struct mm_struct *mm, unsigned long start, unsigned long end);
  457. extern void tsunami_flush_tlb_page(struct vm_area_struct *vma, unsigned long page);
  458. extern void tsunami_setup_blockops(void);
  459. /*
  460.  * Workaround, until we find what's going on with Swift. When low on memory,
  461.  * it sometimes loops in fault/handle_mm_fault incl. flush_tlb_page to find
  462.  * out it is already in page tables/ fault again on the same instruction.
  463.  * I really don't understand it, have checked it and contexts
  464.  * are right, flush_tlb_all is done as well, and it faults again...
  465.  * Strange. -jj
  466.  *
  467.  * The following code is a deadwood that may be necessary when
  468.  * we start to make precise page flushes again. --zaitcev
  469.  */
  470. static void swift_update_mmu_cache(struct vm_area_struct * vma, unsigned long address, pte_t pte)
  471. {
  472. #if 0
  473. static unsigned long last;
  474. unsigned int val;
  475. /* unsigned int n; */
  476. if (address == last) {
  477. val = srmmu_hwprobe(address);
  478. if (val != 0 && pte_val(pte) != val) {
  479. printk("swift_update_mmu_cache: "
  480.     "addr %lx put %08x probed %08x from %pn",
  481.     address, pte_val(pte), val,
  482.     __builtin_return_address(0));
  483. srmmu_flush_whole_tlb();
  484. }
  485. }
  486. last = address;
  487. #endif
  488. }
  489. /* swift.S */
  490. extern void swift_flush_cache_all(void);
  491. extern void swift_flush_cache_mm(struct mm_struct *mm);
  492. extern void swift_flush_cache_range(struct mm_struct *mm,
  493.     unsigned long start, unsigned long end);
  494. extern void swift_flush_cache_page(struct vm_area_struct *vma, unsigned long page);
  495. extern void swift_flush_page_to_ram(unsigned long page);
  496. extern void swift_flush_page_for_dma(unsigned long page);
  497. extern void swift_flush_sig_insns(struct mm_struct *mm, unsigned long insn_addr);
  498. extern void swift_flush_tlb_all(void);
  499. extern void swift_flush_tlb_mm(struct mm_struct *mm);
  500. extern void swift_flush_tlb_range(struct mm_struct *mm,
  501.   unsigned long start, unsigned long end);
  502. extern void swift_flush_tlb_page(struct vm_area_struct *vma, unsigned long page);
  503. #if 0  /* P3: deadwood to debug precise flushes on Swift. */
  504. void swift_flush_tlb_page(struct vm_area_struct *vma, unsigned long page)
  505. {
  506. int cctx, ctx1;
  507. page &= PAGE_MASK;
  508. if ((ctx1 = vma->vm_mm->context) != -1) {
  509. cctx = srmmu_get_context();
  510. /* Is context # ever different from current context? P3 */
  511. if (cctx != ctx1) {
  512. printk("flush ctx %02x curr %02xn", ctx1, cctx);
  513. srmmu_set_context(ctx1);
  514. swift_flush_page(page);
  515. __asm__ __volatile__("sta %%g0, [%0] %1nt" : :
  516. "r" (page), "i" (ASI_M_FLUSH_PROBE));
  517. srmmu_set_context(cctx);
  518. } else {
  519.  /* Rm. prot. bits from virt. c. */
  520. /* swift_flush_cache_all(); */
  521. /* swift_flush_cache_page(vma, page); */
  522. swift_flush_page(page);
  523. __asm__ __volatile__("sta %%g0, [%0] %1nt" : :
  524. "r" (page), "i" (ASI_M_FLUSH_PROBE));
  525. /* same as above: srmmu_flush_tlb_page() */
  526. }
  527. }
  528. }
  529. #endif
  530. /*
  531.  * The following are all MBUS based SRMMU modules, and therefore could
  532.  * be found in a multiprocessor configuration.  On the whole, these
  533.  * chips seems to be much more touchy about DVMA and page tables
  534.  * with respect to cache coherency.
  535.  */
  536. /* Cypress flushes. */
  537. static void cypress_flush_cache_all(void)
  538. {
  539. volatile unsigned long cypress_sucks;
  540. unsigned long faddr, tagval;
  541. flush_user_windows();
  542. for(faddr = 0; faddr < 0x10000; faddr += 0x20) {
  543. __asm__ __volatile__("lda [%1 + %2] %3, %0nt" :
  544.      "=r" (tagval) :
  545.      "r" (faddr), "r" (0x40000),
  546.      "i" (ASI_M_DATAC_TAG));
  547. /* If modified and valid, kick it. */
  548. if((tagval & 0x60) == 0x60)
  549. cypress_sucks = *(unsigned long *)(0xf0020000 + faddr);
  550. }
  551. }
  552. static void cypress_flush_cache_mm(struct mm_struct *mm)
  553. {
  554. register unsigned long a, b, c, d, e, f, g;
  555. unsigned long flags, faddr;
  556. int octx;
  557. FLUSH_BEGIN(mm)
  558. flush_user_windows();
  559. __save_and_cli(flags);
  560. octx = srmmu_get_context();
  561. srmmu_set_context(mm->context);
  562. a = 0x20; b = 0x40; c = 0x60;
  563. d = 0x80; e = 0xa0; f = 0xc0; g = 0xe0;
  564. faddr = (0x10000 - 0x100);
  565. goto inside;
  566. do {
  567. faddr -= 0x100;
  568. inside:
  569. __asm__ __volatile__("sta %%g0, [%0] %1nt"
  570.      "sta %%g0, [%0 + %2] %1nt"
  571.      "sta %%g0, [%0 + %3] %1nt"
  572.      "sta %%g0, [%0 + %4] %1nt"
  573.      "sta %%g0, [%0 + %5] %1nt"
  574.      "sta %%g0, [%0 + %6] %1nt"
  575.      "sta %%g0, [%0 + %7] %1nt"
  576.      "sta %%g0, [%0 + %8] %1nt" : :
  577.      "r" (faddr), "i" (ASI_M_FLUSH_CTX),
  578.      "r" (a), "r" (b), "r" (c), "r" (d),
  579.      "r" (e), "r" (f), "r" (g));
  580. } while(faddr);
  581. srmmu_set_context(octx);
  582. __restore_flags(flags);
  583. FLUSH_END
  584. }
  585. static void cypress_flush_cache_range(struct mm_struct *mm, unsigned long start, unsigned long end)
  586. {
  587. register unsigned long a, b, c, d, e, f, g;
  588. unsigned long flags, faddr;
  589. int octx;
  590. FLUSH_BEGIN(mm)
  591. flush_user_windows();
  592. __save_and_cli(flags);
  593. octx = srmmu_get_context();
  594. srmmu_set_context(mm->context);
  595. a = 0x20; b = 0x40; c = 0x60;
  596. d = 0x80; e = 0xa0; f = 0xc0; g = 0xe0;
  597. start &= SRMMU_PMD_MASK;
  598. while(start < end) {
  599. faddr = (start + (0x10000 - 0x100));
  600. goto inside;
  601. do {
  602. faddr -= 0x100;
  603. inside:
  604. __asm__ __volatile__("sta %%g0, [%0] %1nt"
  605.      "sta %%g0, [%0 + %2] %1nt"
  606.      "sta %%g0, [%0 + %3] %1nt"
  607.      "sta %%g0, [%0 + %4] %1nt"
  608.      "sta %%g0, [%0 + %5] %1nt"
  609.      "sta %%g0, [%0 + %6] %1nt"
  610.      "sta %%g0, [%0 + %7] %1nt"
  611.      "sta %%g0, [%0 + %8] %1nt" : :
  612.      "r" (faddr),
  613.      "i" (ASI_M_FLUSH_SEG),
  614.      "r" (a), "r" (b), "r" (c), "r" (d),
  615.      "r" (e), "r" (f), "r" (g));
  616. } while (faddr != start);
  617. start += SRMMU_PMD_SIZE;
  618. }
  619. srmmu_set_context(octx);
  620. __restore_flags(flags);
  621. FLUSH_END
  622. }
  623. static void cypress_flush_cache_page(struct vm_area_struct *vma, unsigned long page)
  624. {
  625. register unsigned long a, b, c, d, e, f, g;
  626. struct mm_struct *mm = vma->vm_mm;
  627. unsigned long flags, line;
  628. int octx;
  629. FLUSH_BEGIN(mm)
  630. flush_user_windows();
  631. __save_and_cli(flags);
  632. octx = srmmu_get_context();
  633. srmmu_set_context(mm->context);
  634. a = 0x20; b = 0x40; c = 0x60;
  635. d = 0x80; e = 0xa0; f = 0xc0; g = 0xe0;
  636. page &= PAGE_MASK;
  637. line = (page + PAGE_SIZE) - 0x100;
  638. goto inside;
  639. do {
  640. line -= 0x100;
  641. inside:
  642. __asm__ __volatile__("sta %%g0, [%0] %1nt"
  643.      "sta %%g0, [%0 + %2] %1nt"
  644.      "sta %%g0, [%0 + %3] %1nt"
  645.      "sta %%g0, [%0 + %4] %1nt"
  646.      "sta %%g0, [%0 + %5] %1nt"
  647.      "sta %%g0, [%0 + %6] %1nt"
  648.      "sta %%g0, [%0 + %7] %1nt"
  649.      "sta %%g0, [%0 + %8] %1nt" : :
  650.      "r" (line),
  651.      "i" (ASI_M_FLUSH_PAGE),
  652.      "r" (a), "r" (b), "r" (c), "r" (d),
  653.      "r" (e), "r" (f), "r" (g));
  654. } while(line != page);
  655. srmmu_set_context(octx);
  656. __restore_flags(flags);
  657. FLUSH_END
  658. }
  659. /* Cypress is copy-back, at least that is how we configure it. */
  660. static void cypress_flush_page_to_ram(unsigned long page)
  661. {
  662. register unsigned long a, b, c, d, e, f, g;
  663. unsigned long line;
  664. a = 0x20; b = 0x40; c = 0x60; d = 0x80; e = 0xa0; f = 0xc0; g = 0xe0;
  665. page &= PAGE_MASK;
  666. line = (page + PAGE_SIZE) - 0x100;
  667. goto inside;
  668. do {
  669. line -= 0x100;
  670. inside:
  671. __asm__ __volatile__("sta %%g0, [%0] %1nt"
  672.      "sta %%g0, [%0 + %2] %1nt"
  673.      "sta %%g0, [%0 + %3] %1nt"
  674.      "sta %%g0, [%0 + %4] %1nt"
  675.      "sta %%g0, [%0 + %5] %1nt"
  676.      "sta %%g0, [%0 + %6] %1nt"
  677.      "sta %%g0, [%0 + %7] %1nt"
  678.      "sta %%g0, [%0 + %8] %1nt" : :
  679.      "r" (line),
  680.      "i" (ASI_M_FLUSH_PAGE),
  681.      "r" (a), "r" (b), "r" (c), "r" (d),
  682.      "r" (e), "r" (f), "r" (g));
  683. } while(line != page);
  684. }
  685. /* Cypress is also IO cache coherent. */
  686. static void cypress_flush_page_for_dma(unsigned long page)
  687. {
  688. }
  689. /* Cypress has unified L2 VIPT, from which both instructions and data
  690.  * are stored.  It does not have an onboard icache of any sort, therefore
  691.  * no flush is necessary.
  692.  */
  693. static void cypress_flush_sig_insns(struct mm_struct *mm, unsigned long insn_addr)
  694. {
  695. }
  696. static void cypress_flush_tlb_all(void)
  697. {
  698. srmmu_flush_whole_tlb();
  699. }
  700. static void cypress_flush_tlb_mm(struct mm_struct *mm)
  701. {
  702. FLUSH_BEGIN(mm)
  703. __asm__ __volatile__(
  704. "lda [%0] %3, %%g5nt"
  705. "sta %2, [%0] %3nt"
  706. "sta %%g0, [%1] %4nt"
  707. "sta %%g5, [%0] %3n"
  708. : /* no outputs */
  709. : "r" (SRMMU_CTX_REG), "r" (0x300), "r" (mm->context),
  710.   "i" (ASI_M_MMUREGS), "i" (ASI_M_FLUSH_PROBE)
  711. : "g5");
  712. FLUSH_END
  713. }
  714. static void cypress_flush_tlb_range(struct mm_struct *mm, unsigned long start, unsigned long end)
  715. {
  716. unsigned long size;
  717. FLUSH_BEGIN(mm)
  718. start &= SRMMU_PGDIR_MASK;
  719. size = SRMMU_PGDIR_ALIGN(end) - start;
  720. __asm__ __volatile__(
  721. "lda [%0] %5, %%g5nt"
  722. "sta %1, [%0] %5n"
  723. "1:nt"
  724. "subcc %3, %4, %3nt"
  725. "bne 1bnt"
  726. " sta %%g0, [%2 + %3] %6nt"
  727. "sta %%g5, [%0] %5n"
  728. : /* no outputs */
  729. : "r" (SRMMU_CTX_REG), "r" (mm->context), "r" (start | 0x200),
  730.   "r" (size), "r" (SRMMU_PGDIR_SIZE), "i" (ASI_M_MMUREGS),
  731.   "i" (ASI_M_FLUSH_PROBE)
  732. : "g5", "cc");
  733. FLUSH_END
  734. }
  735. static void cypress_flush_tlb_page(struct vm_area_struct *vma, unsigned long page)
  736. {
  737. struct mm_struct *mm = vma->vm_mm;
  738. FLUSH_BEGIN(mm)
  739. __asm__ __volatile__(
  740. "lda [%0] %3, %%g5nt"
  741. "sta %1, [%0] %3nt"
  742. "sta %%g0, [%2] %4nt"
  743. "sta %%g5, [%0] %3n"
  744. : /* no outputs */
  745. : "r" (SRMMU_CTX_REG), "r" (mm->context), "r" (page & PAGE_MASK),
  746.   "i" (ASI_M_MMUREGS), "i" (ASI_M_FLUSH_PROBE)
  747. : "g5");
  748. FLUSH_END
  749. }
  750. /* viking.S */
  751. extern void viking_flush_cache_all(void);
  752. extern void viking_flush_cache_mm(struct mm_struct *mm);
  753. extern void viking_flush_cache_range(struct mm_struct *mm, unsigned long start,
  754.      unsigned long end);
  755. extern void viking_flush_cache_page(struct vm_area_struct *vma,
  756.     unsigned long page);
  757. extern void viking_flush_page_to_ram(unsigned long page);
  758. extern void viking_flush_page_for_dma(unsigned long page);
  759. extern void viking_flush_sig_insns(struct mm_struct *mm, unsigned long addr);
  760. extern void viking_flush_page(unsigned long page);
  761. extern void viking_mxcc_flush_page(unsigned long page);
  762. extern void viking_flush_tlb_all(void);
  763. extern void viking_flush_tlb_mm(struct mm_struct *mm);
  764. extern void viking_flush_tlb_range(struct mm_struct *mm, unsigned long start,
  765.    unsigned long end);
  766. extern void viking_flush_tlb_page(struct vm_area_struct *vma,
  767.   unsigned long page);
  768. extern void sun4dsmp_flush_tlb_all(void);
  769. extern void sun4dsmp_flush_tlb_mm(struct mm_struct *mm);
  770. extern void sun4dsmp_flush_tlb_range(struct mm_struct *mm, unsigned long start,
  771.    unsigned long end);
  772. extern void sun4dsmp_flush_tlb_page(struct vm_area_struct *vma,
  773.   unsigned long page);
  774. /* hypersparc.S */
  775. extern void hypersparc_flush_cache_all(void);
  776. extern void hypersparc_flush_cache_mm(struct mm_struct *mm);
  777. extern void hypersparc_flush_cache_range(struct mm_struct *mm, unsigned long start, unsigned long end);
  778. extern void hypersparc_flush_cache_page(struct vm_area_struct *vma, unsigned long page);
  779. extern void hypersparc_flush_page_to_ram(unsigned long page);
  780. extern void hypersparc_flush_page_for_dma(unsigned long page);
  781. extern void hypersparc_flush_sig_insns(struct mm_struct *mm, unsigned long insn_addr);
  782. extern void hypersparc_flush_tlb_all(void);
  783. extern void hypersparc_flush_tlb_mm(struct mm_struct *mm);
  784. extern void hypersparc_flush_tlb_range(struct mm_struct *mm, unsigned long start, unsigned long end);
  785. extern void hypersparc_flush_tlb_page(struct vm_area_struct *vma, unsigned long page);
  786. extern void hypersparc_setup_blockops(void);
  787. /*
  788.  * NOTE: All of this startup code assumes the low 16mb (approx.) of
  789.  *       kernel mappings are done with one single contiguous chunk of
  790.  *       ram.  On small ram machines (classics mainly) we only get
  791.  *       around 8mb mapped for us.
  792.  */
  793. void __init early_pgtable_allocfail(char *type)
  794. {
  795. prom_printf("inherit_prom_mappings: Cannot alloc kernel %s.n", type);
  796. prom_halt();
  797. }
  798. void __init srmmu_early_allocate_ptable_skeleton(unsigned long start, unsigned long end)
  799. {
  800. pgd_t *pgdp;
  801. pmd_t *pmdp;
  802. pte_t *ptep;
  803. while(start < end) {
  804. pgdp = pgd_offset_k(start);
  805. if(srmmu_pgd_none(*(pgd_t *)__nocache_fix(pgdp))) {
  806. pmdp = (pmd_t *)__srmmu_get_nocache(SRMMU_PMD_TABLE_SIZE, SRMMU_PMD_TABLE_SIZE);
  807. if (pmdp == NULL)
  808. early_pgtable_allocfail("pmd");
  809. memset(__nocache_fix(pmdp), 0, SRMMU_PMD_TABLE_SIZE);
  810. srmmu_pgd_set(__nocache_fix(pgdp), pmdp);
  811. }
  812. pmdp = srmmu_pmd_offset(__nocache_fix(pgdp), start);
  813. if(srmmu_pmd_none(*(pmd_t *)__nocache_fix(pmdp))) {
  814. ptep = (pte_t *)__srmmu_get_nocache(SRMMU_PTE_TABLE_SIZE, SRMMU_PTE_TABLE_SIZE);
  815. if (ptep == NULL)
  816. early_pgtable_allocfail("pte");
  817. memset(__nocache_fix(ptep), 0, SRMMU_PTE_TABLE_SIZE);
  818. srmmu_pmd_set(__nocache_fix(pmdp), ptep);
  819. }
  820. start = (start + SRMMU_PMD_SIZE) & SRMMU_PMD_MASK;
  821. }
  822. }
  823. void __init srmmu_allocate_ptable_skeleton(unsigned long start, unsigned long end)
  824. {
  825. pgd_t *pgdp;
  826. pmd_t *pmdp;
  827. pte_t *ptep;
  828. while(start < end) {
  829. pgdp = pgd_offset_k(start);
  830. if(srmmu_pgd_none(*pgdp)) {
  831. pmdp = (pmd_t *)__srmmu_get_nocache(SRMMU_PMD_TABLE_SIZE, SRMMU_PMD_TABLE_SIZE);
  832. if (pmdp == NULL)
  833. early_pgtable_allocfail("pmd");
  834. memset(pmdp, 0, SRMMU_PMD_TABLE_SIZE);
  835. srmmu_pgd_set(pgdp, pmdp);
  836. }
  837. pmdp = srmmu_pmd_offset(pgdp, start);
  838. if(srmmu_pmd_none(*pmdp)) {
  839. ptep = (pte_t *)__srmmu_get_nocache(SRMMU_PTE_TABLE_SIZE, SRMMU_PTE_TABLE_SIZE);
  840. if (ptep == NULL)
  841. early_pgtable_allocfail("pte");
  842. memset(ptep, 0, SRMMU_PTE_TABLE_SIZE);
  843. srmmu_pmd_set(pmdp, ptep);
  844. }
  845. start = (start + SRMMU_PMD_SIZE) & SRMMU_PMD_MASK;
  846. }
  847. }
  848. /*
  849.  * This is much cleaner than poking around physical address space
  850.  * looking at the prom's page table directly which is what most
  851.  * other OS's do.  Yuck... this is much better.
  852.  */
  853. void __init srmmu_inherit_prom_mappings(unsigned long start,unsigned long end)
  854. {
  855. pgd_t *pgdp;
  856. pmd_t *pmdp;
  857. pte_t *ptep;
  858. int what = 0; /* 0 = normal-pte, 1 = pmd-level pte, 2 = pgd-level pte */
  859. unsigned long prompte;
  860. while(start <= end) {
  861. if (start == 0)
  862. break; /* probably wrap around */
  863. if(start == 0xfef00000)
  864. start = KADB_DEBUGGER_BEGVM;
  865. if(!(prompte = srmmu_hwprobe(start))) {
  866. start += PAGE_SIZE;
  867. continue;
  868. }
  869.     
  870. /* A red snapper, see what it really is. */
  871. what = 0;
  872.     
  873. if(!(start & ~(SRMMU_PMD_MASK))) {
  874. if(srmmu_hwprobe((start-PAGE_SIZE) + SRMMU_PMD_SIZE) == prompte)
  875. what = 1;
  876. }
  877.     
  878. if(!(start & ~(SRMMU_PGDIR_MASK))) {
  879. if(srmmu_hwprobe((start-PAGE_SIZE) + SRMMU_PGDIR_SIZE) ==
  880.    prompte)
  881. what = 2;
  882. }
  883.     
  884. pgdp = pgd_offset_k(start);
  885. if(what == 2) {
  886. *(pgd_t *)__nocache_fix(pgdp) = __pgd(prompte);
  887. start += SRMMU_PGDIR_SIZE;
  888. continue;
  889. }
  890. if(srmmu_pgd_none(*(pgd_t *)__nocache_fix(pgdp))) {
  891. pmdp = (pmd_t *)__srmmu_get_nocache(SRMMU_PMD_TABLE_SIZE, SRMMU_PMD_TABLE_SIZE);
  892. if (pmdp == NULL)
  893. early_pgtable_allocfail("pmd");
  894. memset(__nocache_fix(pmdp), 0, SRMMU_PMD_TABLE_SIZE);
  895. srmmu_pgd_set(__nocache_fix(pgdp), pmdp);
  896. }
  897. pmdp = srmmu_pmd_offset(__nocache_fix(pgdp), start);
  898. if(what == 1) {
  899. *(pmd_t *)__nocache_fix(pmdp) = __pmd(prompte);
  900. start += SRMMU_PMD_SIZE;
  901. continue;
  902. }
  903. if(srmmu_pmd_none(*(pmd_t *)__nocache_fix(pmdp))) {
  904. ptep = (pte_t *)__srmmu_get_nocache(SRMMU_PTE_TABLE_SIZE, SRMMU_PTE_TABLE_SIZE);
  905. if (ptep == NULL)
  906. early_pgtable_allocfail("pte");
  907. memset(__nocache_fix(ptep), 0, SRMMU_PTE_TABLE_SIZE);
  908. srmmu_pmd_set(__nocache_fix(pmdp), ptep);
  909. }
  910. ptep = srmmu_pte_offset(__nocache_fix(pmdp), start);
  911. *(pte_t *)__nocache_fix(ptep) = __pte(prompte);
  912. start += PAGE_SIZE;
  913. }
  914. }
  915. #define KERNEL_PTE(page_shifted) ((page_shifted)|SRMMU_CACHE|SRMMU_PRIV|SRMMU_VALID)
  916. /* Create a third-level SRMMU 16MB page mapping. */
  917. static void __init do_large_mapping(unsigned long vaddr, unsigned long phys_base)
  918. {
  919. pgd_t *pgdp = pgd_offset_k(vaddr);
  920. unsigned long big_pte;
  921. big_pte = KERNEL_PTE(phys_base >> 4);
  922. *(pgd_t *)__nocache_fix(pgdp) = __pgd(big_pte);
  923. }
  924. /* Map sp_bank entry SP_ENTRY, starting at virtual address VBASE. */
  925. static unsigned long __init map_spbank(unsigned long vbase, int sp_entry)
  926. {
  927. unsigned long pstart = (sp_banks[sp_entry].base_addr & SRMMU_PGDIR_MASK);
  928. unsigned long vstart = (vbase & SRMMU_PGDIR_MASK);
  929. unsigned long vend = SRMMU_PGDIR_ALIGN(vbase + sp_banks[sp_entry].num_bytes);
  930. /* Map "low" memory only */
  931. const unsigned long min_vaddr = PAGE_OFFSET;
  932. const unsigned long max_vaddr = PAGE_OFFSET + SRMMU_MAXMEM;
  933. if (vstart < min_vaddr || vstart >= max_vaddr)
  934. return vstart;
  935. if (vend > max_vaddr || vend < min_vaddr)
  936. vend = max_vaddr;
  937. while(vstart < vend) {
  938. do_large_mapping(vstart, pstart);
  939. vstart += SRMMU_PGDIR_SIZE; pstart += SRMMU_PGDIR_SIZE;
  940. }
  941. return vstart;
  942. }
  943. static inline void memprobe_error(char *msg)
  944. {
  945. prom_printf(msg);
  946. prom_printf("Halting now...n");
  947. prom_halt();
  948. }
  949. static inline void map_kernel(void)
  950. {
  951. int i;
  952. if (phys_base > 0) {
  953. do_large_mapping(PAGE_OFFSET, phys_base);
  954. }
  955. for (i = 0; sp_banks[i].num_bytes != 0; i++) {
  956. map_spbank((unsigned long)__va(sp_banks[i].base_addr), i);
  957. }
  958. BTFIXUPSET_SIMM13(user_ptrs_per_pgd, PAGE_OFFSET / SRMMU_PGDIR_SIZE);
  959. }
  960. /* Paging initialization on the Sparc Reference MMU. */
  961. extern void sparc_context_init(int);
  962. extern int linux_num_cpus;
  963. extern unsigned long totalhigh_pages;
  964. void (*poke_srmmu)(void) __initdata = NULL;
  965. extern unsigned long bootmem_init(unsigned long *pages_avail);
  966. extern void sun_serial_setup(void);
  967. void __init srmmu_paging_init(void)
  968. {
  969. int i, cpunode;
  970. char node_str[128];
  971. pgd_t *pgd;
  972. pmd_t *pmd;
  973. pte_t *pte;
  974. unsigned long pages_avail;
  975. sparc_iomap.start = SUN4M_IOBASE_VADDR; /* 16MB of IOSPACE on all sun4m's. */
  976. if (sparc_cpu_model == sun4d)
  977. num_contexts = 65536; /* We know it is Viking */
  978. else {
  979. /* Find the number of contexts on the srmmu. */
  980. cpunode = prom_getchild(prom_root_node);
  981. num_contexts = 0;
  982. while(cpunode != 0) {
  983. prom_getstring(cpunode, "device_type", node_str, sizeof(node_str));
  984. if(!strcmp(node_str, "cpu")) {
  985. num_contexts = prom_getintdefault(cpunode, "mmu-nctx", 0x8);
  986. break;
  987. }
  988. cpunode = prom_getsibling(cpunode);
  989. }
  990. }
  991. if(!num_contexts) {
  992. prom_printf("Something wrong, can't find cpu node in paging_init.n");
  993. prom_halt();
  994. }
  995. pages_avail = 0;
  996. last_valid_pfn = bootmem_init(&pages_avail);
  997. srmmu_nocache_calcsize();
  998. srmmu_nocache_init();
  999.         srmmu_inherit_prom_mappings(0xfe400000,(LINUX_OPPROM_ENDVM-PAGE_SIZE));
  1000. map_kernel();
  1001. /* ctx table has to be physically aligned to its size */
  1002. srmmu_context_table = (ctxd_t *)__srmmu_get_nocache(num_contexts*sizeof(ctxd_t), num_contexts*sizeof(ctxd_t));
  1003. srmmu_ctx_table_phys = (ctxd_t *)__nocache_pa((unsigned long)srmmu_context_table);
  1004. for(i = 0; i < num_contexts; i++)
  1005. srmmu_ctxd_set((ctxd_t *)__nocache_fix(&srmmu_context_table[i]), srmmu_swapper_pg_dir);
  1006. flush_cache_all();
  1007. srmmu_set_ctable_ptr((unsigned long)srmmu_ctx_table_phys);
  1008. flush_tlb_all();
  1009. poke_srmmu();
  1010. #if CONFIG_SUN_IO
  1011. srmmu_allocate_ptable_skeleton(sparc_iomap.start, IOBASE_END);
  1012. srmmu_allocate_ptable_skeleton(DVMA_VADDR, DVMA_END);
  1013. #endif
  1014. srmmu_allocate_ptable_skeleton(fix_kmap_begin, fix_kmap_end);
  1015. srmmu_allocate_ptable_skeleton(pkmap_base, pkmap_base_end);
  1016. pgd = pgd_offset_k(pkmap_base);
  1017. pmd = pmd_offset(pgd, pkmap_base);
  1018. pte = pte_offset(pmd, pkmap_base);
  1019. pkmap_page_table = pte;
  1020. flush_cache_all();
  1021. flush_tlb_all();
  1022. /*
  1023.  * This does not logically belong here, but we need to
  1024.  * call it at the moment we are able to use the bootmem
  1025.  * allocator.
  1026.  */
  1027. sun_serial_setup();
  1028. sparc_context_init(num_contexts);
  1029. kmap_init();
  1030. {
  1031. unsigned long zones_size[MAX_NR_ZONES];
  1032. unsigned long zholes_size[MAX_NR_ZONES];
  1033. unsigned long npages;
  1034. int znum;
  1035. for (znum = 0; znum < MAX_NR_ZONES; znum++)
  1036. zones_size[znum] = zholes_size[znum] = 0;
  1037. npages = max_low_pfn - (phys_base >> PAGE_SHIFT);
  1038. zones_size[ZONE_DMA] = npages;
  1039. zholes_size[ZONE_DMA] = npages - pages_avail;
  1040. npages = highend_pfn - max_low_pfn;
  1041. zones_size[ZONE_HIGHMEM] = npages;
  1042. zholes_size[ZONE_HIGHMEM] = npages - calc_highpages();
  1043. free_area_init_node(0, NULL, NULL, zones_size,
  1044.     phys_base, zholes_size);
  1045. }
  1046. }
  1047. static void srmmu_mmu_info(struct seq_file *m)
  1048. {
  1049. seq_printf(m, 
  1050.    "MMU typet: %sn"
  1051.    "contextst: %dn"
  1052.    "nocache totalt: %ldn"
  1053.    "nocache usedt: %dn",
  1054.    srmmu_name,
  1055.    num_contexts,
  1056.    srmmu_nocache_size,
  1057.    (srmmu_nocache_used << SRMMU_NOCACHE_BITMAP_SHIFT));
  1058. }
  1059. static void srmmu_update_mmu_cache(struct vm_area_struct * vma, unsigned long address, pte_t pte)
  1060. {
  1061. }
  1062. static void srmmu_destroy_context(struct mm_struct *mm)
  1063. {
  1064. if(mm->context != NO_CONTEXT) {
  1065. flush_cache_mm(mm);
  1066. srmmu_ctxd_set(&srmmu_context_table[mm->context], srmmu_swapper_pg_dir);
  1067. flush_tlb_mm(mm);
  1068. spin_lock(&srmmu_context_spinlock);
  1069. free_context(mm->context);
  1070. spin_unlock(&srmmu_context_spinlock);
  1071. mm->context = NO_CONTEXT;
  1072. }
  1073. }
  1074. /* Init various srmmu chip types. */
  1075. static void __init srmmu_is_bad(void)
  1076. {
  1077. prom_printf("Could not determine SRMMU chip type.n");
  1078. prom_halt();
  1079. }
  1080. static void __init init_vac_layout(void)
  1081. {
  1082. int nd, cache_lines;
  1083. char node_str[128];
  1084. #ifdef CONFIG_SMP
  1085. int cpu = 0;
  1086. unsigned long max_size = 0;
  1087. unsigned long min_line_size = 0x10000000;
  1088. #endif
  1089. nd = prom_getchild(prom_root_node);
  1090. while((nd = prom_getsibling(nd)) != 0) {
  1091. prom_getstring(nd, "device_type", node_str, sizeof(node_str));
  1092. if(!strcmp(node_str, "cpu")) {
  1093. vac_line_size = prom_getint(nd, "cache-line-size");
  1094. if (vac_line_size == -1) {
  1095. prom_printf("can't determine cache-line-size, "
  1096.     "halting.n");
  1097. prom_halt();
  1098. }
  1099. cache_lines = prom_getint(nd, "cache-nlines");
  1100. if (cache_lines == -1) {
  1101. prom_printf("can't determine cache-nlines, halting.n");
  1102. prom_halt();
  1103. }
  1104. vac_cache_size = cache_lines * vac_line_size;
  1105. #ifdef CONFIG_SMP
  1106. if(vac_cache_size > max_size)
  1107. max_size = vac_cache_size;
  1108. if(vac_line_size < min_line_size)
  1109. min_line_size = vac_line_size;
  1110. cpu++;
  1111. if(cpu == smp_num_cpus)
  1112. break;
  1113. #else
  1114. break;
  1115. #endif
  1116. }
  1117. }
  1118. if(nd == 0) {
  1119. prom_printf("No CPU nodes found, halting.n");
  1120. prom_halt();
  1121. }
  1122. #ifdef CONFIG_SMP
  1123. vac_cache_size = max_size;
  1124. vac_line_size = min_line_size;
  1125. #endif
  1126. printk("SRMMU: Using VAC size of %d bytes, line size %d bytes.n",
  1127.        (int)vac_cache_size, (int)vac_line_size);
  1128. }
  1129. static void __init poke_hypersparc(void)
  1130. {
  1131. volatile unsigned long clear;
  1132. unsigned long mreg = srmmu_get_mmureg();
  1133. hyper_flush_unconditional_combined();
  1134. mreg &= ~(HYPERSPARC_CWENABLE);
  1135. mreg |= (HYPERSPARC_CENABLE | HYPERSPARC_WBENABLE);
  1136. mreg |= (HYPERSPARC_CMODE);
  1137. srmmu_set_mmureg(mreg);
  1138. #if 0 /* XXX I think this is bad news... -DaveM */
  1139. hyper_clear_all_tags();
  1140. #endif
  1141. put_ross_icr(HYPERSPARC_ICCR_FTD | HYPERSPARC_ICCR_ICE);
  1142. hyper_flush_whole_icache();
  1143. clear = srmmu_get_faddr();
  1144. clear = srmmu_get_fstatus();
  1145. }
  1146. static void __init init_hypersparc(void)
  1147. {
  1148. srmmu_name = "ROSS HyperSparc";
  1149. init_vac_layout();
  1150. is_hypersparc = 1;
  1151. BTFIXUPSET_CALL(pte_clear, srmmu_pte_clear, BTFIXUPCALL_NORM);
  1152. BTFIXUPSET_CALL(pmd_clear, srmmu_pmd_clear, BTFIXUPCALL_NORM);
  1153. BTFIXUPSET_CALL(pgd_clear, srmmu_pgd_clear, BTFIXUPCALL_NORM);
  1154. BTFIXUPSET_CALL(flush_cache_all, hypersparc_flush_cache_all, BTFIXUPCALL_NORM);
  1155. BTFIXUPSET_CALL(flush_cache_mm, hypersparc_flush_cache_mm, BTFIXUPCALL_NORM);
  1156. BTFIXUPSET_CALL(flush_cache_range, hypersparc_flush_cache_range, BTFIXUPCALL_NORM);
  1157. BTFIXUPSET_CALL(flush_cache_page, hypersparc_flush_cache_page, BTFIXUPCALL_NORM);
  1158. BTFIXUPSET_CALL(flush_tlb_all, hypersparc_flush_tlb_all, BTFIXUPCALL_NORM);
  1159. BTFIXUPSET_CALL(flush_tlb_mm, hypersparc_flush_tlb_mm, BTFIXUPCALL_NORM);
  1160. BTFIXUPSET_CALL(flush_tlb_range, hypersparc_flush_tlb_range, BTFIXUPCALL_NORM);
  1161. BTFIXUPSET_CALL(flush_tlb_page, hypersparc_flush_tlb_page, BTFIXUPCALL_NORM);
  1162. BTFIXUPSET_CALL(__flush_page_to_ram, hypersparc_flush_page_to_ram, BTFIXUPCALL_NORM);
  1163. BTFIXUPSET_CALL(flush_sig_insns, hypersparc_flush_sig_insns, BTFIXUPCALL_NORM);
  1164. BTFIXUPSET_CALL(flush_page_for_dma, hypersparc_flush_page_for_dma, BTFIXUPCALL_NOP);
  1165. poke_srmmu = poke_hypersparc;
  1166. hypersparc_setup_blockops();
  1167. }
  1168. static void __init poke_cypress(void)
  1169. {
  1170. unsigned long mreg = srmmu_get_mmureg();
  1171. unsigned long faddr, tagval;
  1172. volatile unsigned long cypress_sucks;
  1173. volatile unsigned long clear;
  1174. clear = srmmu_get_faddr();
  1175. clear = srmmu_get_fstatus();
  1176. if (!(mreg & CYPRESS_CENABLE)) {
  1177. for(faddr = 0x0; faddr < 0x10000; faddr += 20) {
  1178. __asm__ __volatile__("sta %%g0, [%0 + %1] %2nt"
  1179.      "sta %%g0, [%0] %2nt" : :
  1180.      "r" (faddr), "r" (0x40000),
  1181.      "i" (ASI_M_DATAC_TAG));
  1182. }
  1183. } else {
  1184. for(faddr = 0; faddr < 0x10000; faddr += 0x20) {
  1185. __asm__ __volatile__("lda [%1 + %2] %3, %0nt" :
  1186.      "=r" (tagval) :
  1187.      "r" (faddr), "r" (0x40000),
  1188.      "i" (ASI_M_DATAC_TAG));
  1189. /* If modified and valid, kick it. */
  1190. if((tagval & 0x60) == 0x60)
  1191. cypress_sucks = *(unsigned long *)
  1192. (0xf0020000 + faddr);
  1193. }
  1194. }
  1195. /* And one more, for our good neighbor, Mr. Broken Cypress. */
  1196. clear = srmmu_get_faddr();
  1197. clear = srmmu_get_fstatus();
  1198. mreg |= (CYPRESS_CENABLE | CYPRESS_CMODE);
  1199. srmmu_set_mmureg(mreg);
  1200. }
  1201. static void __init init_cypress_common(void)
  1202. {
  1203. init_vac_layout();
  1204. BTFIXUPSET_CALL(pte_clear, srmmu_pte_clear, BTFIXUPCALL_NORM);
  1205. BTFIXUPSET_CALL(pmd_clear, srmmu_pmd_clear, BTFIXUPCALL_NORM);
  1206. BTFIXUPSET_CALL(pgd_clear, srmmu_pgd_clear, BTFIXUPCALL_NORM);
  1207. BTFIXUPSET_CALL(flush_cache_all, cypress_flush_cache_all, BTFIXUPCALL_NORM);
  1208. BTFIXUPSET_CALL(flush_cache_mm, cypress_flush_cache_mm, BTFIXUPCALL_NORM);
  1209. BTFIXUPSET_CALL(flush_cache_range, cypress_flush_cache_range, BTFIXUPCALL_NORM);
  1210. BTFIXUPSET_CALL(flush_cache_page, cypress_flush_cache_page, BTFIXUPCALL_NORM);
  1211. BTFIXUPSET_CALL(flush_tlb_all, cypress_flush_tlb_all, BTFIXUPCALL_NORM);
  1212. BTFIXUPSET_CALL(flush_tlb_mm, cypress_flush_tlb_mm, BTFIXUPCALL_NORM);
  1213. BTFIXUPSET_CALL(flush_tlb_page, cypress_flush_tlb_page, BTFIXUPCALL_NORM);
  1214. BTFIXUPSET_CALL(flush_tlb_range, cypress_flush_tlb_range, BTFIXUPCALL_NORM);
  1215. BTFIXUPSET_CALL(__flush_page_to_ram, cypress_flush_page_to_ram, BTFIXUPCALL_NORM);
  1216. BTFIXUPSET_CALL(flush_sig_insns, cypress_flush_sig_insns, BTFIXUPCALL_NOP);
  1217. BTFIXUPSET_CALL(flush_page_for_dma, cypress_flush_page_for_dma, BTFIXUPCALL_NOP);
  1218. poke_srmmu = poke_cypress;
  1219. }
  1220. static void __init init_cypress_604(void)
  1221. {
  1222. srmmu_name = "ROSS Cypress-604(UP)";
  1223. srmmu_modtype = Cypress;
  1224. init_cypress_common();
  1225. }
  1226. static void __init init_cypress_605(unsigned long mrev)
  1227. {
  1228. srmmu_name = "ROSS Cypress-605(MP)";
  1229. if(mrev == 0xe) {
  1230. srmmu_modtype = Cypress_vE;
  1231. hwbug_bitmask |= HWBUG_COPYBACK_BROKEN;
  1232. } else {
  1233. if(mrev == 0xd) {
  1234. srmmu_modtype = Cypress_vD;
  1235. hwbug_bitmask |= HWBUG_ASIFLUSH_BROKEN;
  1236. } else {
  1237. srmmu_modtype = Cypress;
  1238. }
  1239. }
  1240. init_cypress_common();
  1241. }
  1242. static void __init poke_swift(void)
  1243. {
  1244. unsigned long mreg;
  1245. /* Clear any crap from the cache or else... */
  1246. swift_flush_cache_all();
  1247. /* Enable I & D caches */
  1248. mreg = srmmu_get_mmureg();
  1249. mreg |= (SWIFT_IE | SWIFT_DE);
  1250. /*
  1251.  * The Swift branch folding logic is completely broken.  At
  1252.  * trap time, if things are just right, if can mistakenly
  1253.  * think that a trap is coming from kernel mode when in fact
  1254.  * it is coming from user mode (it mis-executes the branch in
  1255.  * the trap code).  So you see things like crashme completely
  1256.  * hosing your machine which is completely unacceptable.  Turn
  1257.  * this shit off... nice job Fujitsu.
  1258.  */
  1259. mreg &= ~(SWIFT_BF);
  1260. srmmu_set_mmureg(mreg);
  1261. }
  1262. #define SWIFT_MASKID_ADDR  0x10003018
  1263. static void __init init_swift(void)
  1264. {
  1265. unsigned long swift_rev;
  1266. __asm__ __volatile__("lda [%1] %2, %0nt"
  1267.      "srl %0, 0x18, %0nt" :
  1268.      "=r" (swift_rev) :
  1269.      "r" (SWIFT_MASKID_ADDR), "i" (ASI_M_BYPASS));
  1270. srmmu_name = "Fujitsu Swift";
  1271. switch(swift_rev) {
  1272. case 0x11:
  1273. case 0x20:
  1274. case 0x23:
  1275. case 0x30:
  1276. srmmu_modtype = Swift_lots_o_bugs;
  1277. hwbug_bitmask |= (HWBUG_KERN_ACCBROKEN | HWBUG_KERN_CBITBROKEN);
  1278. /*
  1279.  * Gee george, I wonder why Sun is so hush hush about
  1280.  * this hardware bug... really braindamage stuff going
  1281.  * on here.  However I think we can find a way to avoid
  1282.  * all of the workaround overhead under Linux.  Basically,
  1283.  * any page fault can cause kernel pages to become user
  1284.  * accessible (the mmu gets confused and clears some of
  1285.  * the ACC bits in kernel ptes).  Aha, sounds pretty
  1286.  * horrible eh?  But wait, after extensive testing it appears
  1287.  * that if you use pgd_t level large kernel pte's (like the
  1288.  * 4MB pages on the Pentium) the bug does not get tripped
  1289.  * at all.  This avoids almost all of the major overhead.
  1290.  * Welcome to a world where your vendor tells you to,
  1291.  * "apply this kernel patch" instead of "sorry for the
  1292.  * broken hardware, send it back and we'll give you
  1293.  * properly functioning parts"
  1294.  */
  1295. break;
  1296. case 0x25:
  1297. case 0x31:
  1298. srmmu_modtype = Swift_bad_c;
  1299. hwbug_bitmask |= HWBUG_KERN_CBITBROKEN;
  1300. /*
  1301.  * You see Sun allude to this hardware bug but never
  1302.  * admit things directly, they'll say things like,
  1303.  * "the Swift chip cache problems" or similar.
  1304.  */
  1305. break;
  1306. default:
  1307. srmmu_modtype = Swift_ok;
  1308. break;
  1309. };
  1310. BTFIXUPSET_CALL(flush_cache_all, swift_flush_cache_all, BTFIXUPCALL_NORM);
  1311. BTFIXUPSET_CALL(flush_cache_mm, swift_flush_cache_mm, BTFIXUPCALL_NORM);
  1312. BTFIXUPSET_CALL(flush_cache_page, swift_flush_cache_page, BTFIXUPCALL_NORM);
  1313. BTFIXUPSET_CALL(flush_cache_range, swift_flush_cache_range, BTFIXUPCALL_NORM);
  1314. BTFIXUPSET_CALL(flush_tlb_all, swift_flush_tlb_all, BTFIXUPCALL_NORM);
  1315. BTFIXUPSET_CALL(flush_tlb_mm, swift_flush_tlb_mm, BTFIXUPCALL_NORM);
  1316. BTFIXUPSET_CALL(flush_tlb_page, swift_flush_tlb_page, BTFIXUPCALL_NORM);
  1317. BTFIXUPSET_CALL(flush_tlb_range, swift_flush_tlb_range, BTFIXUPCALL_NORM);
  1318. BTFIXUPSET_CALL(__flush_page_to_ram, swift_flush_page_to_ram, BTFIXUPCALL_NORM);
  1319. BTFIXUPSET_CALL(flush_sig_insns, swift_flush_sig_insns, BTFIXUPCALL_NORM);
  1320. BTFIXUPSET_CALL(flush_page_for_dma, swift_flush_page_for_dma, BTFIXUPCALL_NORM);
  1321. BTFIXUPSET_CALL(update_mmu_cache, swift_update_mmu_cache, BTFIXUPCALL_NORM);
  1322. flush_page_for_dma_global = 0;
  1323. /*
  1324.  * Are you now convinced that the Swift is one of the
  1325.  * biggest VLSI abortions of all time?  Bravo Fujitsu!
  1326.  * Fujitsu, the !#?!%$'d up processor people.  I bet if
  1327.  * you examined the microcode of the Swift you'd find
  1328.  * XXX's all over the place.
  1329.  */
  1330. poke_srmmu = poke_swift;
  1331. }
  1332. static void turbosparc_flush_cache_all(void)
  1333. {
  1334. flush_user_windows();
  1335. turbosparc_idflash_clear();
  1336. }
  1337. static void turbosparc_flush_cache_mm(struct mm_struct *mm)
  1338. {
  1339. FLUSH_BEGIN(mm)
  1340. flush_user_windows();
  1341. turbosparc_idflash_clear();
  1342. FLUSH_END
  1343. }
  1344. static void turbosparc_flush_cache_range(struct mm_struct *mm, unsigned long start, unsigned long end)
  1345. {
  1346. FLUSH_BEGIN(mm)
  1347. flush_user_windows();
  1348. turbosparc_idflash_clear();
  1349. FLUSH_END
  1350. }
  1351. static void turbosparc_flush_cache_page(struct vm_area_struct *vma, unsigned long page)
  1352. {
  1353. FLUSH_BEGIN(vma->vm_mm)
  1354. flush_user_windows();
  1355. if (vma->vm_flags & VM_EXEC)
  1356. turbosparc_flush_icache();
  1357. turbosparc_flush_dcache();
  1358. FLUSH_END
  1359. }
  1360. /* TurboSparc is copy-back, if we turn it on, but this does not work. */
  1361. static void turbosparc_flush_page_to_ram(unsigned long page)
  1362. {
  1363. #ifdef TURBOSPARC_WRITEBACK
  1364. volatile unsigned long clear;
  1365. if (srmmu_hwprobe(page))
  1366. turbosparc_flush_page_cache(page);
  1367. clear = srmmu_get_fstatus();
  1368. #endif
  1369. }
  1370. static void turbosparc_flush_sig_insns(struct mm_struct *mm, unsigned long insn_addr)
  1371. {
  1372. }
  1373. static void turbosparc_flush_page_for_dma(unsigned long page)
  1374. {
  1375. turbosparc_flush_dcache();
  1376. }
  1377. static void turbosparc_flush_tlb_all(void)
  1378. {
  1379. srmmu_flush_whole_tlb();
  1380. }
  1381. static void turbosparc_flush_tlb_mm(struct mm_struct *mm)
  1382. {
  1383. FLUSH_BEGIN(mm)
  1384. srmmu_flush_whole_tlb();
  1385. FLUSH_END
  1386. }
  1387. static void turbosparc_flush_tlb_range(struct mm_struct *mm, unsigned long start, unsigned long end)
  1388. {
  1389. FLUSH_BEGIN(mm)
  1390. srmmu_flush_whole_tlb();
  1391. FLUSH_END
  1392. }
  1393. static void turbosparc_flush_tlb_page(struct vm_area_struct *vma, unsigned long page)
  1394. {
  1395. FLUSH_BEGIN(vma->vm_mm)
  1396. srmmu_flush_whole_tlb();
  1397. FLUSH_END
  1398. }
  1399. static void __init poke_turbosparc(void)
  1400. {
  1401. unsigned long mreg = srmmu_get_mmureg();
  1402. unsigned long ccreg;
  1403. /* Clear any crap from the cache or else... */
  1404. turbosparc_flush_cache_all();
  1405. mreg &= ~(TURBOSPARC_ICENABLE | TURBOSPARC_DCENABLE); /* Temporarily disable I & D caches */
  1406. mreg &= ~(TURBOSPARC_PCENABLE); /* Don't check parity */
  1407. srmmu_set_mmureg(mreg);
  1408. ccreg = turbosparc_get_ccreg();
  1409. #ifdef TURBOSPARC_WRITEBACK
  1410. ccreg |= (TURBOSPARC_SNENABLE); /* Do DVMA snooping in Dcache */
  1411. ccreg &= ~(TURBOSPARC_uS2 | TURBOSPARC_WTENABLE);
  1412. /* Write-back D-cache, emulate VLSI
  1413.  * abortion number three, not number one */
  1414. #else
  1415. /* For now let's play safe, optimize later */
  1416. ccreg |= (TURBOSPARC_SNENABLE | TURBOSPARC_WTENABLE);
  1417. /* Do DVMA snooping in Dcache, Write-thru D-cache */
  1418. ccreg &= ~(TURBOSPARC_uS2);
  1419. /* Emulate VLSI abortion number three, not number one */
  1420. #endif
  1421. switch (ccreg & 7) {
  1422. case 0: /* No SE cache */
  1423. case 7: /* Test mode */
  1424. break;
  1425. default:
  1426. ccreg |= (TURBOSPARC_SCENABLE);
  1427. }
  1428. turbosparc_set_ccreg (ccreg);
  1429. mreg |= (TURBOSPARC_ICENABLE | TURBOSPARC_DCENABLE); /* I & D caches on */
  1430. mreg |= (TURBOSPARC_ICSNOOP); /* Icache snooping on */
  1431. srmmu_set_mmureg(mreg);
  1432. }
  1433. static void __init init_turbosparc(void)
  1434. {
  1435. srmmu_name = "Fujitsu TurboSparc";
  1436. srmmu_modtype = TurboSparc;
  1437. BTFIXUPSET_CALL(flush_cache_all, turbosparc_flush_cache_all, BTFIXUPCALL_NORM);
  1438. BTFIXUPSET_CALL(flush_cache_mm, turbosparc_flush_cache_mm, BTFIXUPCALL_NORM);
  1439. BTFIXUPSET_CALL(flush_cache_page, turbosparc_flush_cache_page, BTFIXUPCALL_NORM);
  1440. BTFIXUPSET_CALL(flush_cache_range, turbosparc_flush_cache_range, BTFIXUPCALL_NORM);
  1441. BTFIXUPSET_CALL(flush_tlb_all, turbosparc_flush_tlb_all, BTFIXUPCALL_NORM);
  1442. BTFIXUPSET_CALL(flush_tlb_mm, turbosparc_flush_tlb_mm, BTFIXUPCALL_NORM);
  1443. BTFIXUPSET_CALL(flush_tlb_page, turbosparc_flush_tlb_page, BTFIXUPCALL_NORM);
  1444. BTFIXUPSET_CALL(flush_tlb_range, turbosparc_flush_tlb_range, BTFIXUPCALL_NORM);
  1445. BTFIXUPSET_CALL(__flush_page_to_ram, turbosparc_flush_page_to_ram, BTFIXUPCALL_NORM);
  1446. BTFIXUPSET_CALL(flush_sig_insns, turbosparc_flush_sig_insns, BTFIXUPCALL_NOP);
  1447. BTFIXUPSET_CALL(flush_page_for_dma, turbosparc_flush_page_for_dma, BTFIXUPCALL_NORM);
  1448. poke_srmmu = poke_turbosparc;
  1449. }
  1450. static void __init poke_tsunami(void)
  1451. {
  1452. unsigned long mreg = srmmu_get_mmureg();
  1453. tsunami_flush_icache();
  1454. tsunami_flush_dcache();
  1455. mreg &= ~TSUNAMI_ITD;
  1456. mreg |= (TSUNAMI_IENAB | TSUNAMI_DENAB);
  1457. srmmu_set_mmureg(mreg);
  1458. }
  1459. static void __init init_tsunami(void)
  1460. {
  1461. /*
  1462.  * Tsunami's pretty sane, Sun and TI actually got it
  1463.  * somewhat right this time.  Fujitsu should have
  1464.  * taken some lessons from them.
  1465.  */
  1466. srmmu_name = "TI Tsunami";
  1467. srmmu_modtype = Tsunami;
  1468. BTFIXUPSET_CALL(flush_cache_all, tsunami_flush_cache_all, BTFIXUPCALL_NORM);
  1469. BTFIXUPSET_CALL(flush_cache_mm, tsunami_flush_cache_mm, BTFIXUPCALL_NORM);
  1470. BTFIXUPSET_CALL(flush_cache_page, tsunami_flush_cache_page, BTFIXUPCALL_NORM);
  1471. BTFIXUPSET_CALL(flush_cache_range, tsunami_flush_cache_range, BTFIXUPCALL_NORM);
  1472. BTFIXUPSET_CALL(flush_tlb_all, tsunami_flush_tlb_all, BTFIXUPCALL_NORM);
  1473. BTFIXUPSET_CALL(flush_tlb_mm, tsunami_flush_tlb_mm, BTFIXUPCALL_NORM);
  1474. BTFIXUPSET_CALL(flush_tlb_page, tsunami_flush_tlb_page, BTFIXUPCALL_NORM);
  1475. BTFIXUPSET_CALL(flush_tlb_range, tsunami_flush_tlb_range, BTFIXUPCALL_NORM);
  1476. BTFIXUPSET_CALL(__flush_page_to_ram, tsunami_flush_page_to_ram, BTFIXUPCALL_NOP);
  1477. BTFIXUPSET_CALL(flush_sig_insns, tsunami_flush_sig_insns, BTFIXUPCALL_NORM);
  1478. BTFIXUPSET_CALL(flush_page_for_dma, tsunami_flush_page_for_dma, BTFIXUPCALL_NORM);
  1479. poke_srmmu = poke_tsunami;
  1480. tsunami_setup_blockops();
  1481. }
  1482. static void __init poke_viking(void)
  1483. {
  1484. unsigned long mreg = srmmu_get_mmureg();
  1485. static int smp_catch;
  1486. if(viking_mxcc_present) {
  1487. unsigned long mxcc_control = mxcc_get_creg();
  1488. mxcc_control |= (MXCC_CTL_ECE | MXCC_CTL_PRE | MXCC_CTL_MCE);
  1489. mxcc_control &= ~(MXCC_CTL_RRC);
  1490. mxcc_set_creg(mxcc_control);
  1491. /*
  1492.  * We don't need memory parity checks.
  1493.  * XXX This is a mess, have to dig out later. ecd.
  1494. viking_mxcc_turn_off_parity(&mreg, &mxcc_control);
  1495.  */
  1496. /* We do cache ptables on MXCC. */
  1497. mreg |= VIKING_TCENABLE;
  1498. } else {
  1499. unsigned long bpreg;
  1500. mreg &= ~(VIKING_TCENABLE);
  1501. if(smp_catch++) {
  1502. /* Must disable mixed-cmd mode here for other cpu's. */
  1503. bpreg = viking_get_bpreg();
  1504. bpreg &= ~(VIKING_ACTION_MIX);
  1505. viking_set_bpreg(bpreg);
  1506. /* Just in case PROM does something funny. */
  1507. msi_set_sync();
  1508. }
  1509. }
  1510. mreg |= VIKING_SPENABLE;
  1511. mreg |= (VIKING_ICENABLE | VIKING_DCENABLE);
  1512. mreg |= VIKING_SBENABLE;
  1513. mreg &= ~(VIKING_ACENABLE);
  1514. srmmu_set_mmureg(mreg);
  1515. #ifdef CONFIG_SMP
  1516. /* Avoid unnecessary cross calls. */
  1517. BTFIXUPCOPY_CALL(flush_cache_all, local_flush_cache_all);
  1518. BTFIXUPCOPY_CALL(flush_cache_mm, local_flush_cache_mm);
  1519. BTFIXUPCOPY_CALL(flush_cache_range, local_flush_cache_range);
  1520. BTFIXUPCOPY_CALL(flush_cache_page, local_flush_cache_page);
  1521. BTFIXUPCOPY_CALL(__flush_page_to_ram, local_flush_page_to_ram);
  1522. BTFIXUPCOPY_CALL(flush_sig_insns, local_flush_sig_insns);
  1523. BTFIXUPCOPY_CALL(flush_page_for_dma, local_flush_page_for_dma);
  1524. btfixup();
  1525. #endif
  1526. }
  1527. static void __init init_viking(void)
  1528. {
  1529. unsigned long mreg = srmmu_get_mmureg();
  1530. /* Ahhh, the viking.  SRMMU VLSI abortion number two... */
  1531. if(mreg & VIKING_MMODE) {
  1532. srmmu_name = "TI Viking";
  1533. viking_mxcc_present = 0;
  1534. msi_set_sync();
  1535. BTFIXUPSET_CALL(pte_clear, srmmu_pte_clear, BTFIXUPCALL_NORM);
  1536. BTFIXUPSET_CALL(pmd_clear, srmmu_pmd_clear, BTFIXUPCALL_NORM);
  1537. BTFIXUPSET_CALL(pgd_clear, srmmu_pgd_clear, BTFIXUPCALL_NORM);
  1538. /*
  1539.  * We need this to make sure old viking takes no hits
  1540.  * on it's cache for dma snoops to workaround the
  1541.  * "load from non-cacheable memory" interrupt bug.
  1542.  * This is only necessary because of the new way in
  1543.  * which we use the IOMMU.
  1544.  */
  1545. BTFIXUPSET_CALL(flush_page_for_dma, viking_flush_page, BTFIXUPCALL_NORM);
  1546. flush_page_for_dma_global = 0;
  1547. } else {
  1548. srmmu_name = "TI Viking/MXCC";
  1549. viking_mxcc_present = 1;
  1550. srmmu_cache_pagetables = 1;
  1551. /* MXCC vikings lack the DMA snooping bug. */
  1552. BTFIXUPSET_CALL(flush_page_for_dma, viking_flush_page_for_dma, BTFIXUPCALL_NOP);
  1553. }
  1554. BTFIXUPSET_CALL(flush_cache_all, viking_flush_cache_all, BTFIXUPCALL_NORM);
  1555. BTFIXUPSET_CALL(flush_cache_mm, viking_flush_cache_mm, BTFIXUPCALL_NORM);
  1556. BTFIXUPSET_CALL(flush_cache_page, viking_flush_cache_page, BTFIXUPCALL_NORM);
  1557. BTFIXUPSET_CALL(flush_cache_range, viking_flush_cache_range, BTFIXUPCALL_NORM);
  1558. #ifdef CONFIG_SMP
  1559. if (sparc_cpu_model == sun4d) {
  1560. BTFIXUPSET_CALL(flush_tlb_all, sun4dsmp_flush_tlb_all, BTFIXUPCALL_NORM);
  1561. BTFIXUPSET_CALL(flush_tlb_mm, sun4dsmp_flush_tlb_mm, BTFIXUPCALL_NORM);
  1562. BTFIXUPSET_CALL(flush_tlb_page, sun4dsmp_flush_tlb_page, BTFIXUPCALL_NORM);
  1563. BTFIXUPSET_CALL(flush_tlb_range, sun4dsmp_flush_tlb_range, BTFIXUPCALL_NORM);
  1564. } else
  1565. #endif
  1566. {
  1567. BTFIXUPSET_CALL(flush_tlb_all, viking_flush_tlb_all, BTFIXUPCALL_NORM);
  1568. BTFIXUPSET_CALL(flush_tlb_mm, viking_flush_tlb_mm, BTFIXUPCALL_NORM);
  1569. BTFIXUPSET_CALL(flush_tlb_page, viking_flush_tlb_page, BTFIXUPCALL_NORM);
  1570. BTFIXUPSET_CALL(flush_tlb_range, viking_flush_tlb_range, BTFIXUPCALL_NORM);
  1571. }
  1572. BTFIXUPSET_CALL(__flush_page_to_ram, viking_flush_page_to_ram, BTFIXUPCALL_NOP);
  1573. BTFIXUPSET_CALL(flush_sig_insns, viking_flush_sig_insns, BTFIXUPCALL_NOP);
  1574. poke_srmmu = poke_viking;
  1575. }
  1576. /* Probe for the srmmu chip version. */
  1577. static void __init get_srmmu_type(void)
  1578. {
  1579. unsigned long mreg, psr;
  1580. unsigned long mod_typ, mod_rev, psr_typ, psr_vers;
  1581. srmmu_modtype = SRMMU_INVAL_MOD;
  1582. hwbug_bitmask = 0;
  1583. mreg = srmmu_get_mmureg(); psr = get_psr();
  1584. mod_typ = (mreg & 0xf0000000) >> 28;
  1585. mod_rev = (mreg & 0x0f000000) >> 24;
  1586. psr_typ = (psr >> 28) & 0xf;
  1587. psr_vers = (psr >> 24) & 0xf;
  1588. /* First, check for HyperSparc or Cypress. */
  1589. if(mod_typ == 1) {
  1590. switch(mod_rev) {
  1591. case 7:
  1592. /* UP or MP Hypersparc */
  1593. init_hypersparc();
  1594. break;
  1595. case 0:
  1596. case 2:
  1597. /* Uniprocessor Cypress */
  1598. init_cypress_604();
  1599. break;
  1600. case 10:
  1601. case 11:
  1602. case 12:
  1603. /* _REALLY OLD_ Cypress MP chips... */
  1604. case 13:
  1605. case 14:
  1606. case 15:
  1607. /* MP Cypress mmu/cache-controller */
  1608. init_cypress_605(mod_rev);
  1609. break;
  1610. default:
  1611. /* Some other Cypress revision, assume a 605. */
  1612. init_cypress_605(mod_rev);
  1613. break;
  1614. };
  1615. return;
  1616. }
  1617. /*
  1618.  * Now Fujitsu TurboSparc. It might happen that it is
  1619.  * in Swift emulation mode, so we will check later...
  1620.  */
  1621. if (psr_typ == 0 && psr_vers == 5) {
  1622. init_turbosparc();
  1623. return;
  1624. }
  1625. /* Next check for Fujitsu Swift. */
  1626. if(psr_typ == 0 && psr_vers == 4) {
  1627. int cpunode;
  1628. char node_str[128];
  1629. /* Look if it is not a TurboSparc emulating Swift... */
  1630. cpunode = prom_getchild(prom_root_node);
  1631. while((cpunode = prom_getsibling(cpunode)) != 0) {
  1632. prom_getstring(cpunode, "device_type", node_str, sizeof(node_str));
  1633. if(!strcmp(node_str, "cpu")) {
  1634. if (!prom_getintdefault(cpunode, "psr-implementation", 1) &&
  1635.     prom_getintdefault(cpunode, "psr-version", 1) == 5) {
  1636. init_turbosparc();
  1637. return;
  1638. }
  1639. break;
  1640. }
  1641. }
  1642. init_swift();
  1643. return;
  1644. }
  1645. /* Now the Viking family of srmmu. */
  1646. if(psr_typ == 4 &&
  1647.    ((psr_vers == 0) ||
  1648.     ((psr_vers == 1) && (mod_typ == 0) && (mod_rev == 0)))) {
  1649. init_viking();
  1650. return;
  1651. }
  1652. /* Finally the Tsunami. */
  1653. if(psr_typ == 4 && psr_vers == 1 && (mod_typ || mod_rev)) {
  1654. init_tsunami();
  1655. return;
  1656. }
  1657. /* Oh well */
  1658. srmmu_is_bad();
  1659. }
  1660. /* dont laugh, static pagetables */
  1661. static int srmmu_check_pgt_cache(int low, int high)
  1662. {
  1663. return 0;
  1664. }
  1665. extern unsigned long spwin_mmu_patchme, fwin_mmu_patchme,
  1666. tsetup_mmu_patchme, rtrap_mmu_patchme;
  1667. extern unsigned long spwin_srmmu_stackchk, srmmu_fwin_stackchk,
  1668. tsetup_srmmu_stackchk, srmmu_rett_stackchk;
  1669. extern unsigned long srmmu_fault;
  1670. #define PATCH_BRANCH(insn, dest) do { 
  1671. iaddr = &(insn); 
  1672. daddr = &(dest); 
  1673. *iaddr = SPARC_BRANCH((unsigned long) daddr, (unsigned long) iaddr); 
  1674. } while(0);
  1675. static void __init patch_window_trap_handlers(void)
  1676. {
  1677. unsigned long *iaddr, *daddr;
  1678. PATCH_BRANCH(spwin_mmu_patchme, spwin_srmmu_stackchk);
  1679. PATCH_BRANCH(fwin_mmu_patchme, srmmu_fwin_stackchk);
  1680. PATCH_BRANCH(tsetup_mmu_patchme, tsetup_srmmu_stackchk);
  1681. PATCH_BRANCH(rtrap_mmu_patchme, srmmu_rett_stackchk);
  1682. PATCH_BRANCH(sparc_ttable[SP_TRAP_TFLT].inst_three, srmmu_fault);
  1683. PATCH_BRANCH(sparc_ttable[SP_TRAP_DFLT].inst_three, srmmu_fault);
  1684. PATCH_BRANCH(sparc_ttable[SP_TRAP_DACC].inst_three, srmmu_fault);
  1685. }
  1686. #ifdef CONFIG_SMP
  1687. /* Local cross-calls. */
  1688. static void smp_flush_page_for_dma(unsigned long page)
  1689. {
  1690. xc1((smpfunc_t) BTFIXUP_CALL(local_flush_page_for_dma), page);
  1691. local_flush_page_for_dma(page);
  1692. }
  1693. #endif
  1694. /* Load up routines and constants for sun4m and sun4d mmu */
  1695. void __init ld_mmu_srmmu(void)
  1696. {
  1697. extern void ld_mmu_iommu(void);
  1698. extern void ld_mmu_iounit(void);
  1699. extern void ___xchg32_sun4md(void);
  1700. /* First the constants */
  1701. BTFIXUPSET_SIMM13(pmd_shift, SRMMU_PMD_SHIFT);
  1702. BTFIXUPSET_SETHI(pmd_size, SRMMU_PMD_SIZE);
  1703. BTFIXUPSET_SETHI(pmd_mask, SRMMU_PMD_MASK);
  1704. BTFIXUPSET_SIMM13(pgdir_shift, SRMMU_PGDIR_SHIFT);
  1705. BTFIXUPSET_SETHI(pgdir_size, SRMMU_PGDIR_SIZE);
  1706. BTFIXUPSET_SETHI(pgdir_mask, SRMMU_PGDIR_MASK);
  1707. BTFIXUPSET_SIMM13(ptrs_per_pte, SRMMU_PTRS_PER_PTE);
  1708. BTFIXUPSET_SIMM13(ptrs_per_pmd, SRMMU_PTRS_PER_PMD);
  1709. BTFIXUPSET_SIMM13(ptrs_per_pgd, SRMMU_PTRS_PER_PGD);
  1710. BTFIXUPSET_INT(page_none, pgprot_val(SRMMU_PAGE_NONE));
  1711. BTFIXUPSET_INT(page_shared, pgprot_val(SRMMU_PAGE_SHARED));
  1712. BTFIXUPSET_INT(page_copy, pgprot_val(SRMMU_PAGE_COPY));
  1713. BTFIXUPSET_INT(page_readonly, pgprot_val(SRMMU_PAGE_RDONLY));
  1714. BTFIXUPSET_INT(page_kernel, pgprot_val(SRMMU_PAGE_KERNEL));
  1715. page_kernel = pgprot_val(SRMMU_PAGE_KERNEL);
  1716. pg_iobits = SRMMU_VALID | SRMMU_WRITE | SRMMU_REF;
  1717. /* Functions */
  1718. #ifndef CONFIG_SMP
  1719. BTFIXUPSET_CALL(___xchg32, ___xchg32_sun4md, BTFIXUPCALL_SWAPG1G2);
  1720. #endif
  1721. BTFIXUPSET_CALL(do_check_pgt_cache, srmmu_check_pgt_cache, BTFIXUPCALL_NORM);
  1722. BTFIXUPSET_CALL(set_pte, srmmu_set_pte, BTFIXUPCALL_SWAPO0O1);
  1723. BTFIXUPSET_CALL(switch_mm, srmmu_switch_mm, BTFIXUPCALL_NORM);
  1724. BTFIXUPSET_CALL(pte_page, srmmu_pte_page, BTFIXUPCALL_NORM);
  1725. BTFIXUPSET_CALL(pmd_page, srmmu_pmd_page, BTFIXUPCALL_NORM);
  1726. BTFIXUPSET_CALL(pgd_page, srmmu_pgd_page, BTFIXUPCALL_NORM);
  1727. BTFIXUPSET_SETHI(none_mask, 0xF0000000); /* XXX P3: is it used? */
  1728. BTFIXUPSET_CALL(pte_present, srmmu_pte_present, BTFIXUPCALL_NORM);
  1729. BTFIXUPSET_CALL(pte_clear, srmmu_pte_clear, BTFIXUPCALL_SWAPO0G0);
  1730. BTFIXUPSET_CALL(pmd_bad, srmmu_pmd_bad, BTFIXUPCALL_NORM);
  1731. BTFIXUPSET_CALL(pmd_present, srmmu_pmd_present, BTFIXUPCALL_NORM);
  1732. BTFIXUPSET_CALL(pmd_clear, srmmu_pmd_clear, BTFIXUPCALL_SWAPO0G0);
  1733. BTFIXUPSET_CALL(pgd_none, srmmu_pgd_none, BTFIXUPCALL_NORM);
  1734. BTFIXUPSET_CALL(pgd_bad, srmmu_pgd_bad, BTFIXUPCALL_NORM);
  1735. BTFIXUPSET_CALL(pgd_present, srmmu_pgd_present, BTFIXUPCALL_NORM);
  1736. BTFIXUPSET_CALL(pgd_clear, srmmu_pgd_clear, BTFIXUPCALL_SWAPO0G0);
  1737. BTFIXUPSET_CALL(mk_pte, srmmu_mk_pte, BTFIXUPCALL_NORM);
  1738. BTFIXUPSET_CALL(mk_pte_phys, srmmu_mk_pte_phys, BTFIXUPCALL_NORM);
  1739. BTFIXUPSET_CALL(mk_pte_io, srmmu_mk_pte_io, BTFIXUPCALL_NORM);
  1740. BTFIXUPSET_CALL(pgd_set, srmmu_pgd_set, BTFIXUPCALL_NORM);
  1741. BTFIXUPSET_CALL(pmd_set, srmmu_pmd_set, BTFIXUPCALL_NORM);
  1742. BTFIXUPSET_INT(pte_modify_mask, SRMMU_CHG_MASK);
  1743. BTFIXUPSET_CALL(pmd_offset, srmmu_pmd_offset, BTFIXUPCALL_NORM);
  1744. BTFIXUPSET_CALL(pte_offset, srmmu_pte_offset, BTFIXUPCALL_NORM);
  1745. BTFIXUPSET_CALL(free_pte_fast, srmmu_free_pte_fast, BTFIXUPCALL_NORM);
  1746. BTFIXUPSET_CALL(pte_alloc_one_fast, srmmu_pte_alloc_one_fast, BTFIXUPCALL_NORM);
  1747. BTFIXUPSET_CALL(pte_alloc_one, srmmu_pte_alloc_one, BTFIXUPCALL_NORM);
  1748. BTFIXUPSET_CALL(free_pmd_fast, srmmu_free_pmd_fast, BTFIXUPCALL_NORM);
  1749. BTFIXUPSET_CALL(pmd_alloc_one_fast, srmmu_pmd_alloc_one_fast, BTFIXUPCALL_NORM);
  1750. BTFIXUPSET_CALL(free_pgd_fast, srmmu_free_pgd_fast, BTFIXUPCALL_NORM);
  1751. BTFIXUPSET_CALL(get_pgd_fast, srmmu_get_pgd_fast, BTFIXUPCALL_NORM);
  1752. BTFIXUPSET_HALF(pte_writei, SRMMU_WRITE);
  1753. BTFIXUPSET_HALF(pte_dirtyi, SRMMU_DIRTY);
  1754. BTFIXUPSET_HALF(pte_youngi, SRMMU_REF);
  1755. BTFIXUPSET_HALF(pte_wrprotecti, SRMMU_WRITE);
  1756. BTFIXUPSET_HALF(pte_mkcleani, SRMMU_DIRTY);
  1757. BTFIXUPSET_HALF(pte_mkoldi, SRMMU_REF);
  1758. BTFIXUPSET_CALL(pte_mkwrite, srmmu_pte_mkwrite, BTFIXUPCALL_ORINT(SRMMU_WRITE));
  1759. BTFIXUPSET_CALL(pte_mkdirty, srmmu_pte_mkdirty, BTFIXUPCALL_ORINT(SRMMU_DIRTY));
  1760. BTFIXUPSET_CALL(pte_mkyoung, srmmu_pte_mkyoung, BTFIXUPCALL_ORINT(SRMMU_REF));
  1761. BTFIXUPSET_CALL(update_mmu_cache, srmmu_update_mmu_cache, BTFIXUPCALL_NOP);
  1762. BTFIXUPSET_CALL(destroy_context, srmmu_destroy_context, BTFIXUPCALL_NORM);
  1763. BTFIXUPSET_CALL(mmu_info, srmmu_mmu_info, BTFIXUPCALL_NORM);
  1764. /* Task struct and kernel stack allocating/freeing. */
  1765. BTFIXUPSET_CALL(alloc_task_struct, srmmu_alloc_task_struct, BTFIXUPCALL_NORM);
  1766. BTFIXUPSET_CALL(free_task_struct, srmmu_free_task_struct, BTFIXUPCALL_NORM);
  1767. BTFIXUPSET_CALL(get_task_struct, srmmu_get_task_struct, BTFIXUPCALL_NORM);
  1768. get_srmmu_type();
  1769. patch_window_trap_handlers();
  1770. #ifdef CONFIG_SMP
  1771. /* El switcheroo... */
  1772. BTFIXUPCOPY_CALL(local_flush_cache_all, flush_cache_all);
  1773. BTFIXUPCOPY_CALL(local_flush_cache_mm, flush_cache_mm);
  1774. BTFIXUPCOPY_CALL(local_flush_cache_range, flush_cache_range);
  1775. BTFIXUPCOPY_CALL(local_flush_cache_page, flush_cache_page);
  1776. BTFIXUPCOPY_CALL(local_flush_tlb_all, flush_tlb_all);
  1777. BTFIXUPCOPY_CALL(local_flush_tlb_mm, flush_tlb_mm);
  1778. BTFIXUPCOPY_CALL(local_flush_tlb_range, flush_tlb_range);
  1779. BTFIXUPCOPY_CALL(local_flush_tlb_page, flush_tlb_page);
  1780. BTFIXUPCOPY_CALL(local_flush_page_to_ram, __flush_page_to_ram);
  1781. BTFIXUPCOPY_CALL(local_flush_sig_insns, flush_sig_insns);
  1782. BTFIXUPCOPY_CALL(local_flush_page_for_dma, flush_page_for_dma);
  1783. BTFIXUPSET_CALL(flush_cache_all, smp_flush_cache_all, BTFIXUPCALL_NORM);
  1784. BTFIXUPSET_CALL(flush_cache_mm, smp_flush_cache_mm, BTFIXUPCALL_NORM);
  1785. BTFIXUPSET_CALL(flush_cache_range, smp_flush_cache_range, BTFIXUPCALL_NORM);
  1786. BTFIXUPSET_CALL(flush_cache_page, smp_flush_cache_page, BTFIXUPCALL_NORM);
  1787. if (sparc_cpu_model != sun4d) {
  1788. BTFIXUPSET_CALL(flush_tlb_all, smp_flush_tlb_all, BTFIXUPCALL_NORM);
  1789. BTFIXUPSET_CALL(flush_tlb_mm, smp_flush_tlb_mm, BTFIXUPCALL_NORM);
  1790. BTFIXUPSET_CALL(flush_tlb_range, smp_flush_tlb_range, BTFIXUPCALL_NORM);
  1791. BTFIXUPSET_CALL(flush_tlb_page, smp_flush_tlb_page, BTFIXUPCALL_NORM);
  1792. }
  1793. BTFIXUPSET_CALL(__flush_page_to_ram, smp_flush_page_to_ram, BTFIXUPCALL_NORM);
  1794. BTFIXUPSET_CALL(flush_sig_insns, smp_flush_sig_insns, BTFIXUPCALL_NORM);
  1795. BTFIXUPSET_CALL(flush_page_for_dma, smp_flush_page_for_dma, BTFIXUPCALL_NORM);
  1796. #endif
  1797. if (sparc_cpu_model == sun4d)
  1798. ld_mmu_iounit();
  1799. else
  1800. ld_mmu_iommu();
  1801. #ifdef CONFIG_SMP
  1802. if (sparc_cpu_model == sun4d)
  1803. sun4d_init_smp();
  1804. else
  1805. sun4m_init_smp();
  1806. #endif
  1807. }