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