root/arch/m68k/kernel/dma.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. arch_dma_prep_coherent
  2. pgprot_dmacoherent
  3. arch_dma_alloc
  4. arch_dma_free
  5. arch_sync_dma_for_device

   1 /*
   2  * This file is subject to the terms and conditions of the GNU General Public
   3  * License.  See the file COPYING in the main directory of this archive
   4  * for more details.
   5  */
   6 
   7 #undef DEBUG
   8 
   9 #include <linux/dma-noncoherent.h>
  10 #include <linux/device.h>
  11 #include <linux/kernel.h>
  12 #include <linux/platform_device.h>
  13 #include <linux/scatterlist.h>
  14 #include <linux/slab.h>
  15 #include <linux/vmalloc.h>
  16 #include <linux/export.h>
  17 
  18 #include <asm/pgalloc.h>
  19 
  20 #if defined(CONFIG_MMU) && !defined(CONFIG_COLDFIRE)
  21 void arch_dma_prep_coherent(struct page *page, size_t size)
  22 {
  23         cache_push(page_to_phys(page), size);
  24 }
  25 
  26 pgprot_t pgprot_dmacoherent(pgprot_t prot)
  27 {
  28         if (CPU_IS_040_OR_060) {
  29                 pgprot_val(prot) &= ~_PAGE_CACHE040;
  30                 pgprot_val(prot) |= _PAGE_GLOBAL040 | _PAGE_NOCACHE_S;
  31         } else {
  32                 pgprot_val(prot) |= _PAGE_NOCACHE030;
  33         }
  34         return prot;
  35 }
  36 #else
  37 
  38 #include <asm/cacheflush.h>
  39 
  40 void *arch_dma_alloc(struct device *dev, size_t size, dma_addr_t *dma_handle,
  41                 gfp_t gfp, unsigned long attrs)
  42 {
  43         void *ret;
  44 
  45         if (dev == NULL || (*dev->dma_mask < 0xffffffff))
  46                 gfp |= GFP_DMA;
  47         ret = (void *)__get_free_pages(gfp, get_order(size));
  48 
  49         if (ret != NULL) {
  50                 memset(ret, 0, size);
  51                 *dma_handle = virt_to_phys(ret);
  52         }
  53         return ret;
  54 }
  55 
  56 void arch_dma_free(struct device *dev, size_t size, void *vaddr,
  57                 dma_addr_t dma_handle, unsigned long attrs)
  58 {
  59         free_pages((unsigned long)vaddr, get_order(size));
  60 }
  61 
  62 #endif /* CONFIG_MMU && !CONFIG_COLDFIRE */
  63 
  64 void arch_sync_dma_for_device(struct device *dev, phys_addr_t handle,
  65                 size_t size, enum dma_data_direction dir)
  66 {
  67         switch (dir) {
  68         case DMA_BIDIRECTIONAL:
  69         case DMA_TO_DEVICE:
  70                 cache_push(handle, size);
  71                 break;
  72         case DMA_FROM_DEVICE:
  73                 cache_clear(handle, size);
  74                 break;
  75         default:
  76                 pr_err_ratelimited("dma_sync_single_for_device: unsupported dir %u\n",
  77                                    dir);
  78                 break;
  79         }
  80 }

/* [<][>][^][v][top][bottom][index][help] */