diff options
author | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2010-01-25 14:52:48 +0000 |
---|---|---|
committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2010-01-25 14:52:48 +0000 |
commit | f1487fcbe47cd2bc0c71e8598bf9eb6a82dec544 (patch) | |
tree | 4c7abed6047538c13dd024a8ecffd15f31b4609a /arch/mn10300/mm/dma-alloc.c | |
parent | 84549d239ab9bb2e3a85c6efcf0e6478a38b4260 (diff) | |
parent | 40aa7030e5213a43e9e0554fd7f95534ea310bf3 (diff) | |
download | kernel-crypto-f1487fcbe47cd2bc0c71e8598bf9eb6a82dec544.tar.gz kernel-crypto-f1487fcbe47cd2bc0c71e8598bf9eb6a82dec544.tar.xz kernel-crypto-f1487fcbe47cd2bc0c71e8598bf9eb6a82dec544.zip |
Merge branch 'for-2.6.33' into for-2.6.34
Diffstat (limited to 'arch/mn10300/mm/dma-alloc.c')
-rw-r--r-- | arch/mn10300/mm/dma-alloc.c | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/arch/mn10300/mm/dma-alloc.c b/arch/mn10300/mm/dma-alloc.c index f3649d8f50e..ee82d624b3c 100644 --- a/arch/mn10300/mm/dma-alloc.c +++ b/arch/mn10300/mm/dma-alloc.c @@ -16,12 +16,24 @@ #include <linux/pci.h> #include <asm/io.h> +static unsigned long pci_sram_allocated = 0xbc000000; + void *dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle, int gfp) { unsigned long addr; void *ret; + printk("dma_alloc_coherent(%s,%zu,,%x)\n", dev_name(dev), size, gfp); + + if (0xbe000000 - pci_sram_allocated >= size) { + size = (size + 255) & ~255; + addr = pci_sram_allocated; + pci_sram_allocated += size; + ret = (void *) addr; + goto done; + } + /* ignore region specifiers */ gfp &= ~(__GFP_DMA | __GFP_HIGHMEM); @@ -41,7 +53,9 @@ void *dma_alloc_coherent(struct device *dev, size_t size, /* write back and evict all cache lines covering this region */ mn10300_dcache_flush_inv_range2(virt_to_phys((void *) addr), PAGE_SIZE); +done: *dma_handle = virt_to_bus((void *) addr); + printk("dma_alloc_coherent() = %p [%x]\n", ret, *dma_handle); return ret; } EXPORT_SYMBOL(dma_alloc_coherent); @@ -51,6 +65,9 @@ void dma_free_coherent(struct device *dev, size_t size, void *vaddr, { unsigned long addr = (unsigned long) vaddr & ~0x20000000; + if (addr >= 0x9c000000) + return; + free_pages(addr, get_order(size)); } EXPORT_SYMBOL(dma_free_coherent); |