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>
18 #include <linux/export.h>
21 static unsigned long pci_sram_allocated
= 0xbc000000;
23 void *dma_alloc_coherent(struct device
*dev
, size_t size
,
24 dma_addr_t
*dma_handle
, int gfp
)
29 pr_debug("dma_alloc_coherent(%s,%zu,%x)\n",
30 dev
? dev_name(dev
) : "?", size
, gfp
);
32 if (0xbe000000 - pci_sram_allocated
>= size
) {
33 size
= (size
+ 255) & ~255;
34 addr
= pci_sram_allocated
;
35 pci_sram_allocated
+= size
;
40 /* ignore region specifiers */
41 gfp
&= ~(__GFP_DMA
| __GFP_HIGHMEM
);
43 if (dev
== NULL
|| dev
->coherent_dma_mask
< 0xffffffff)
46 addr
= __get_free_pages(gfp
, get_order(size
));
50 /* map the coherent memory through the uncached memory window */
51 ret
= (void *) (addr
| 0x20000000);
53 /* fill the memory with obvious rubbish */
54 memset((void *) addr
, 0xfb, size
);
56 /* write back and evict all cache lines covering this region */
57 mn10300_dcache_flush_inv_range2(virt_to_phys((void *) addr
), PAGE_SIZE
);
60 *dma_handle
= virt_to_bus((void *) addr
);
61 printk("dma_alloc_coherent() = %p [%x]\n", ret
, *dma_handle
);
64 EXPORT_SYMBOL(dma_alloc_coherent
);
66 void dma_free_coherent(struct device
*dev
, size_t size
, void *vaddr
,
67 dma_addr_t dma_handle
)
69 unsigned long addr
= (unsigned long) vaddr
& ~0x20000000;
71 if (addr
>= 0x9c000000)
74 free_pages(addr
, get_order(size
));
76 EXPORT_SYMBOL(dma_free_coherent
);