dvma.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:1k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /* dvma support routines */
  2. #include <linux/kernel.h>
  3. #include <linux/mm.h>
  4. #include <linux/bootmem.h>
  5. #include <linux/list.h>
  6. #include <asm/page.h>
  7. #include <asm/pgtable.h>
  8. #include <asm/sun3mmu.h>
  9. #include <asm/dvma.h>
  10. static unsigned long ptelist[120];
  11. inline unsigned long dvma_page(unsigned long kaddr, unsigned long vaddr)
  12. {
  13. unsigned long pte;
  14. unsigned long j;
  15. pte_t ptep;
  16. j = *(volatile unsigned long *)kaddr;
  17. *(volatile unsigned long *)kaddr = j;
  18. ptep = __mk_pte(kaddr, PAGE_KERNEL);
  19. pte = pte_val(ptep);
  20. // printk("dvma_remap: addr %lx -> %lx pte %08lx len %xn", 
  21. //        kaddr, vaddr, pte, len);
  22. if(ptelist[(vaddr & 0xff000) >> PAGE_SHIFT] != pte) {
  23. sun3_put_pte(vaddr, pte);
  24. ptelist[(vaddr & 0xff000) >> PAGE_SHIFT] = pte;
  25. }
  26. return (vaddr + (kaddr & ~PAGE_MASK));
  27. }
  28. int dvma_map_iommu(unsigned long kaddr, unsigned long baddr, 
  29.       int len)
  30. {
  31. unsigned long end;
  32. unsigned long vaddr;
  33. vaddr = dvma_btov(baddr);
  34. end = vaddr + len;
  35. while(vaddr < end) {
  36. dvma_page(kaddr, vaddr);
  37. kaddr += PAGE_SIZE;
  38. vaddr += PAGE_SIZE;
  39. }
  40. return 0;
  41. }
  42. void sun3_dvma_init(void)
  43. {
  44. memset(ptelist, 0, sizeof(ptelist));
  45. }