| /* | |
| * linux/arch/m68k/sun3/dvma.c | |
| * | |
| * Written by Sam Creasey | |
| * | |
| * Sun3 IOMMU routines used for dvma accesses. | |
| * | |
| */ | |
| #include <linux/init.h> | |
| #include <linux/kernel.h> | |
| #include <linux/mm.h> | |
| #include <linux/bootmem.h> | |
| #include <linux/list.h> | |
| #include <asm/page.h> | |
| #include <asm/pgtable.h> | |
| #include <asm/sun3mmu.h> | |
| #include <asm/dvma.h> | |
| static unsigned long ptelist[120]; | |
| static unsigned long dvma_page(unsigned long kaddr, unsigned long vaddr) | |
| { | |
| unsigned long pte; | |
| unsigned long j; | |
| pte_t ptep; | |
| j = *(volatile unsigned long *)kaddr; | |
| *(volatile unsigned long *)kaddr = j; | |
| ptep = pfn_pte(virt_to_pfn(kaddr), PAGE_KERNEL); | |
| pte = pte_val(ptep); | |
| // printk("dvma_remap: addr %lx -> %lx pte %08lx len %x\n", | |
| // kaddr, vaddr, pte, len); | |
| if(ptelist[(vaddr & 0xff000) >> PAGE_SHIFT] != pte) { | |
| sun3_put_pte(vaddr, pte); | |
| ptelist[(vaddr & 0xff000) >> PAGE_SHIFT] = pte; | |
| } | |
| return (vaddr + (kaddr & ~PAGE_MASK)); | |
| } | |
| int dvma_map_iommu(unsigned long kaddr, unsigned long baddr, | |
| int len) | |
| { | |
| unsigned long end; | |
| unsigned long vaddr; | |
| vaddr = dvma_btov(baddr); | |
| end = vaddr + len; | |
| while(vaddr < end) { | |
| dvma_page(kaddr, vaddr); | |
| kaddr += PAGE_SIZE; | |
| vaddr += PAGE_SIZE; | |
| } | |
| return 0; | |
| } | |
| void __init sun3_dvma_init(void) | |
| { | |
| memset(ptelist, 0, sizeof(ptelist)); | |
| } |