~ubuntu-branches/ubuntu/precise/linux-lowlatency/precise

« back to all changes in this revision

Viewing changes to arch/cris/arch-v32/drivers/pci/dma.c

  • Committer: Package Import Robot
  • Author(s): Alessio Igor Bogani
  • Date: 2011-10-26 11:13:05 UTC
  • Revision ID: package-import@ubuntu.com-20111026111305-tz023xykf0i6eosh
Tags: upstream-3.2.0
ImportĀ upstreamĀ versionĀ 3.2.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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
 
 
12
#include <linux/types.h>
 
13
#include <linux/mm.h>
 
14
#include <linux/string.h>
 
15
#include <linux/pci.h>
 
16
#include <linux/gfp.h>
 
17
#include <asm/io.h>
 
18
 
 
19
void *dma_alloc_coherent(struct device *dev, size_t size,
 
20
                           dma_addr_t *dma_handle, gfp_t gfp)
 
21
{
 
22
        void *ret;
 
23
        int order = get_order(size);
 
24
        /* ignore region specifiers */
 
25
        gfp &= ~(__GFP_DMA | __GFP_HIGHMEM);
 
26
 
 
27
        if (dma_alloc_from_coherent(dev, size, dma_handle, &ret))
 
28
                return ret;
 
29
 
 
30
        if (dev == NULL || (dev->coherent_dma_mask < 0xffffffff))
 
31
                gfp |= GFP_DMA;
 
32
 
 
33
        ret = (void *)__get_free_pages(gfp, order);
 
34
 
 
35
        if (ret != NULL) {
 
36
                memset(ret, 0, size);
 
37
                *dma_handle = virt_to_phys(ret);
 
38
        }
 
39
        return ret;
 
40
}
 
41
 
 
42
void dma_free_coherent(struct device *dev, size_t size,
 
43
                         void *vaddr, dma_addr_t dma_handle)
 
44
{
 
45
        int order = get_order(size);
 
46
 
 
47
        if (!dma_release_from_coherent(dev, order, vaddr))
 
48
                free_pages((unsigned long)vaddr, order);
 
49
}
 
50