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