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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * Copyright (C) 2000   Ani Joshi <ajoshi@unixbox.com>
  3.  *
  4.  *
  5.  * Dynamic DMA mapping support.
  6.  *
  7.  * swiped from i386, and cloned for MIPS by Geert.
  8.  *
  9.  */
  10. #include <linux/types.h>
  11. #include <linux/mm.h>
  12. #include <linux/string.h>
  13. #include <linux/pci.h>
  14. #include <asm/io.h>
  15. void *pci_alloc_consistent(struct pci_dev *hwdev, size_t size,
  16.    dma_addr_t *dma_handle)
  17. {
  18. void *ret;
  19. int gfp = GFP_ATOMIC;
  20. if (hwdev == NULL || hwdev->dma_mask != 0xffffffff)
  21. gfp |= GFP_DMA;
  22. ret = (void *)__get_free_pages(gfp, get_order(size));
  23. if (ret != NULL) {
  24. memset(ret, 0, size);
  25. *dma_handle = virt_to_bus(ret);
  26.                 // REVISIT  this needs reviewal as mentioned in bug report
  27.                 // currently we bump kseg0 allocates to kseg1 uncacheable space
  28.                 if ((((unsigned int) ret) & 0xe0000000) == 0x80000000) {
  29.            //flush the cache to eliminate coherency problems
  30.            // and assure dirty lines won't later get written over any dma, etc.
  31.                    flush_cache_all();
  32.    ret = (void*)((unsigned int)ret | 0x20000000); 
  33.                 }
  34.                 
  35. }
  36. return ret;
  37. }
  38. void pci_free_consistent(struct pci_dev *hwdev, size_t size,
  39.  void *vaddr, dma_addr_t dma_handle)
  40. {
  41. free_pages((unsigned long)vaddr, get_order(size));
  42. }