11da177e4SLinus Torvalds /* 21da177e4SLinus Torvalds * linux/arch/m68k/sun3/dvma.c 31da177e4SLinus Torvalds * 41da177e4SLinus Torvalds * Written by Sam Creasey 51da177e4SLinus Torvalds * 61da177e4SLinus Torvalds * Sun3 IOMMU routines used for dvma accesses. 71da177e4SLinus Torvalds * 81da177e4SLinus Torvalds */ 91da177e4SLinus Torvalds 101da177e4SLinus Torvalds #include <linux/kernel.h> 111da177e4SLinus Torvalds #include <linux/mm.h> 121da177e4SLinus Torvalds #include <linux/bootmem.h> 131da177e4SLinus Torvalds #include <linux/list.h> 141da177e4SLinus Torvalds #include <asm/page.h> 151da177e4SLinus Torvalds #include <asm/pgtable.h> 161da177e4SLinus Torvalds #include <asm/sun3mmu.h> 171da177e4SLinus Torvalds #include <asm/dvma.h> 181da177e4SLinus Torvalds 191da177e4SLinus Torvalds 201da177e4SLinus Torvalds static unsigned long ptelist[120]; 211da177e4SLinus Torvalds 221da177e4SLinus Torvalds inline unsigned long dvma_page(unsigned long kaddr, unsigned long vaddr) 231da177e4SLinus Torvalds { 241da177e4SLinus Torvalds unsigned long pte; 251da177e4SLinus Torvalds unsigned long j; 261da177e4SLinus Torvalds pte_t ptep; 271da177e4SLinus Torvalds 281da177e4SLinus Torvalds j = *(volatile unsigned long *)kaddr; 291da177e4SLinus Torvalds *(volatile unsigned long *)kaddr = j; 301da177e4SLinus Torvalds 311da177e4SLinus Torvalds ptep = pfn_pte(virt_to_pfn(kaddr), PAGE_KERNEL); 321da177e4SLinus Torvalds pte = pte_val(ptep); 331da177e4SLinus Torvalds // printk("dvma_remap: addr %lx -> %lx pte %08lx len %x\n", 341da177e4SLinus Torvalds // kaddr, vaddr, pte, len); 351da177e4SLinus Torvalds if(ptelist[(vaddr & 0xff000) >> PAGE_SHIFT] != pte) { 361da177e4SLinus Torvalds sun3_put_pte(vaddr, pte); 371da177e4SLinus Torvalds ptelist[(vaddr & 0xff000) >> PAGE_SHIFT] = pte; 381da177e4SLinus Torvalds } 391da177e4SLinus Torvalds 401da177e4SLinus Torvalds return (vaddr + (kaddr & ~PAGE_MASK)); 411da177e4SLinus Torvalds 421da177e4SLinus Torvalds } 431da177e4SLinus Torvalds 441da177e4SLinus Torvalds int dvma_map_iommu(unsigned long kaddr, unsigned long baddr, 451da177e4SLinus Torvalds int len) 461da177e4SLinus Torvalds { 471da177e4SLinus Torvalds 481da177e4SLinus Torvalds unsigned long end; 491da177e4SLinus Torvalds unsigned long vaddr; 501da177e4SLinus Torvalds 511da177e4SLinus Torvalds vaddr = dvma_btov(baddr); 521da177e4SLinus Torvalds 531da177e4SLinus Torvalds end = vaddr + len; 541da177e4SLinus Torvalds 551da177e4SLinus Torvalds while(vaddr < end) { 561da177e4SLinus Torvalds dvma_page(kaddr, vaddr); 571da177e4SLinus Torvalds kaddr += PAGE_SIZE; 581da177e4SLinus Torvalds vaddr += PAGE_SIZE; 591da177e4SLinus Torvalds } 601da177e4SLinus Torvalds 611da177e4SLinus Torvalds return 0; 621da177e4SLinus Torvalds 631da177e4SLinus Torvalds } 641da177e4SLinus Torvalds 651da177e4SLinus Torvalds void sun3_dvma_init(void) 661da177e4SLinus Torvalds { 671da177e4SLinus Torvalds 681da177e4SLinus Torvalds memset(ptelist, 0, sizeof(ptelist)); 691da177e4SLinus Torvalds 701da177e4SLinus Torvalds 711da177e4SLinus Torvalds } 72