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>
17 #include <linux/gfp.h>
20 static unsigned long pci_sram_allocated
= 0xbc000000;
22 void *dma_alloc_coherent(struct device
*dev
, size_t size
,
23 dma_addr_t
*dma_handle
, int gfp
)
28 pr_debug("dma_alloc_coherent(%s,%zu,%x)\n",
29 dev
? dev_name(dev
) : "?", size
, gfp
);
31 if (0xbe000000 - pci_sram_allocated
>= size
) {
32 size
= (size
+ 255) & ~255;
33 addr
= pci_sram_allocated
;
34 pci_sram_allocated
+= size
;
39 /* ignore region specifiers */
40 gfp
&= ~(__GFP_DMA
| __GFP_HIGHMEM
);
42 if (dev
== NULL
|| dev
->coherent_dma_mask
< 0xffffffff)
45 addr
= __get_free_pages(gfp
, get_order(size
));
49 /* map the coherent memory through the uncached memory window */
50 ret
= (void *) (addr
| 0x20000000);
52 /* fill the memory with obvious rubbish */
53 memset((void *) addr
, 0xfb, size
);
55 /* write back and evict all cache lines covering this region */
56 mn10300_dcache_flush_inv_range2(virt_to_phys((void *) addr
), PAGE_SIZE
);
59 *dma_handle
= virt_to_bus((void *) addr
);
60 printk("dma_alloc_coherent() = %p [%x]\n", ret
, *dma_handle
);
63 EXPORT_SYMBOL(dma_alloc_coherent
);
65 void dma_free_coherent(struct device
*dev
, size_t size
, void *vaddr
,
66 dma_addr_t dma_handle
)
68 unsigned long addr
= (unsigned long) vaddr
& ~0x20000000;
70 if (addr
>= 0x9c000000)
73 free_pages(addr
, get_order(size
));
75 EXPORT_SYMBOL(dma_free_coherent
);