1 /* MN10300 Dynamic DMA mapping support
3 * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved.
4 * Written by David Howells (dhowells@redhat.com)
5 * Derived from: arch/i386/kernel/pci-dma.c
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public Licence
9 * as published by the Free Software Foundation; either version
10 * 2 of the Licence, or (at your option) any later version.
13 #include <linux/types.h>
15 #include <linux/string.h>
16 #include <linux/pci.h>
19 void *dma_alloc_coherent(struct device
*dev
, size_t size
,
20 dma_addr_t
*dma_handle
, int gfp
)
25 /* ignore region specifiers */
26 gfp
&= ~(__GFP_DMA
| __GFP_HIGHMEM
);
28 if (dev
== NULL
|| dev
->coherent_dma_mask
< 0xffffffff)
31 addr
= __get_free_pages(gfp
, get_order(size
));
35 /* map the coherent memory through the uncached memory window */
36 ret
= (void *) (addr
| 0x20000000);
38 /* fill the memory with obvious rubbish */
39 memset((void *) addr
, 0xfb, size
);
41 /* write back and evict all cache lines covering this region */
42 mn10300_dcache_flush_inv_range2(virt_to_phys((void *) addr
), PAGE_SIZE
);
44 *dma_handle
= virt_to_bus((void *) addr
);
47 EXPORT_SYMBOL(dma_alloc_coherent
);
49 void dma_free_coherent(struct device
*dev
, size_t size
, void *vaddr
,
50 dma_addr_t dma_handle
)
52 unsigned long addr
= (unsigned long) vaddr
& ~0x20000000;
54 free_pages(addr
, get_order(size
));
56 EXPORT_SYMBOL(dma_free_coherent
);