dma.c 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. /*
  2. * Dynamic DMA mapping support.
  3. *
  4. * On cris there is no hardware dynamic DMA address translation,
  5. * so consistent alloc/free are merely page allocation/freeing.
  6. * The rest of the dynamic DMA mapping interface is implemented
  7. * in asm/pci.h.
  8. *
  9. * Borrowed from i386.
  10. */
  11. #include <linux/types.h>
  12. #include <linux/mm.h>
  13. #include <linux/string.h>
  14. #include <linux/pci.h>
  15. #include <asm/io.h>
  16. void *dma_alloc_coherent(struct device *dev, size_t size,
  17. dma_addr_t *dma_handle, gfp_t gfp)
  18. {
  19. void *ret;
  20. int order = get_order(size);
  21. /* ignore region specifiers */
  22. gfp &= ~(__GFP_DMA | __GFP_HIGHMEM);
  23. if (dma_alloc_from_coherent(dev, size, dma_handle, &ret))
  24. return ret;
  25. if (dev == NULL || (dev->coherent_dma_mask < 0xffffffff))
  26. gfp |= GFP_DMA;
  27. ret = (void *)__get_free_pages(gfp, order);
  28. if (ret != NULL) {
  29. memset(ret, 0, size);
  30. *dma_handle = virt_to_phys(ret);
  31. }
  32. return ret;
  33. }
  34. void dma_free_coherent(struct device *dev, size_t size,
  35. void *vaddr, dma_addr_t dma_handle)
  36. {
  37. int order = get_order(size);
  38. if (!dma_release_from_coherent(dev, order, vaddr))
  39. free_pages((unsigned long)vaddr, order);
  40. }