1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * linux/arch/m68k/sun3/dvma.c 4 * 5 * Written by Sam Creasey 6 * 7 * Sun3 IOMMU routines used for dvma accesses. 8 * 9 */ 10 11 #include <linux/init.h> 12 #include <linux/kernel.h> 13 #include <linux/mm.h> 14 #include <linux/bootmem.h> 15 #include <linux/list.h> 16 #include <asm/page.h> 17 #include <asm/pgtable.h> 18 #include <asm/sun3mmu.h> 19 #include <asm/dvma.h> 20 21 22 static unsigned long ptelist[120]; 23 24 static unsigned long dvma_page(unsigned long kaddr, unsigned long vaddr) 25 { 26 unsigned long pte; 27 unsigned long j; 28 pte_t ptep; 29 30 j = *(volatile unsigned long *)kaddr; 31 *(volatile unsigned long *)kaddr = j; 32 33 ptep = pfn_pte(virt_to_pfn(kaddr), PAGE_KERNEL); 34 pte = pte_val(ptep); 35 // pr_info("dvma_remap: addr %lx -> %lx pte %08lx\n", kaddr, vaddr, pte); 36 if(ptelist[(vaddr & 0xff000) >> PAGE_SHIFT] != pte) { 37 sun3_put_pte(vaddr, pte); 38 ptelist[(vaddr & 0xff000) >> PAGE_SHIFT] = pte; 39 } 40 41 return (vaddr + (kaddr & ~PAGE_MASK)); 42 43 } 44 45 int dvma_map_iommu(unsigned long kaddr, unsigned long baddr, 46 int len) 47 { 48 49 unsigned long end; 50 unsigned long vaddr; 51 52 vaddr = dvma_btov(baddr); 53 54 end = vaddr + len; 55 56 while(vaddr < end) { 57 dvma_page(kaddr, vaddr); 58 kaddr += PAGE_SIZE; 59 vaddr += PAGE_SIZE; 60 } 61 62 return 0; 63 64 } 65 66 void __init sun3_dvma_init(void) 67 { 68 memset(ptelist, 0, sizeof(ptelist)); 69 } 70