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