Blame view

kernel/linux-imx6_3.14.28/arch/m68k/sun3/dvma.c 1.26 KB
6b13f685e   김민수   BSP 최초 추가
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
  /*
   * 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
  ",
  //		       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));
  }