···1717 select HAVE_KRETPROBES if (HAVE_KPROBES)1818 select HAVE_FTRACE if (!XIP_KERNEL)1919 select HAVE_DYNAMIC_FTRACE if (HAVE_FTRACE)2020+ select HAVE_GENERIC_DMA_COHERENT2021 help2122 The ARM series is a line of low-power-consumption RISC chip designs2223 licensed by ARM Ltd and targeted at embedded applications and
+8
arch/arm/mm/consistent.c
···274274void *275275dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *handle, gfp_t gfp)276276{277277+ void *memory;278278+279279+ if (dma_alloc_from_coherent(dev, size, handle, &memory))280280+ return memory;281281+277282 if (arch_is_coherent()) {278283 void *virt;279284···366361 u32 off;367362368363 WARN_ON(irqs_disabled());364364+365365+ if (dma_release_from_coherent(dev, get_order(size), cpu_addr))366366+ return;369367370368 if (arch_is_coherent()) {371369 kfree(cpu_addr);
···1515#include <linux/pci.h>1616#include <asm/io.h>17171818-struct dma_coherent_mem {1919- void *virt_base;2020- u32 device_base;2121- int size;2222- int flags;2323- unsigned long *bitmap;2424-};2525-2618void *dma_alloc_coherent(struct device *dev, size_t size,2719 dma_addr_t *dma_handle, gfp_t gfp)2820{2921 void *ret;3030- struct dma_coherent_mem *mem = dev ? dev->dma_mem : NULL;3122 int order = get_order(size);3223 /* ignore region specifiers */3324 gfp &= ~(__GFP_DMA | __GFP_HIGHMEM);34253535- if (mem) {3636- int page = bitmap_find_free_region(mem->bitmap, mem->size,3737- order);3838- if (page >= 0) {3939- *dma_handle = mem->device_base + (page << PAGE_SHIFT);4040- ret = mem->virt_base + (page << PAGE_SHIFT);4141- memset(ret, 0, size);4242- return ret;4343- }4444- if (mem->flags & DMA_MEMORY_EXCLUSIVE)4545- return NULL;4646- }2626+ if (dma_alloc_from_coherent(dev, size, dma_handle, &ret))2727+ return ret;47284829 if (dev == NULL || (dev->coherent_dma_mask < 0xffffffff))4930 gfp |= GFP_DMA;···4160void dma_free_coherent(struct device *dev, size_t size,4261 void *vaddr, dma_addr_t dma_handle)4362{4444- struct dma_coherent_mem *mem = dev ? dev->dma_mem : NULL;4563 int order = get_order(size);46644747- if (mem && vaddr >= mem->virt_base && vaddr < (mem->virt_base + (mem->size << PAGE_SHIFT))) {4848- int page = (vaddr - mem->virt_base) >> PAGE_SHIFT;4949-5050- bitmap_release_region(mem->bitmap, page, order);5151- } else6565+ if (!dma_release_from_coherent(dev, order, vaddr))5266 free_pages((unsigned long)vaddr, order);5367}54685555-int dma_declare_coherent_memory(struct device *dev, dma_addr_t bus_addr,5656- dma_addr_t device_addr, size_t size, int flags)5757-{5858- void __iomem *mem_base;5959- int pages = size >> PAGE_SHIFT;6060- int bitmap_size = BITS_TO_LONGS(pages) * sizeof(long);6161-6262- if ((flags & (DMA_MEMORY_MAP | DMA_MEMORY_IO)) == 0)6363- goto out;6464- if (!size)6565- goto out;6666- if (dev->dma_mem)6767- goto out;6868-6969- /* FIXME: this routine just ignores DMA_MEMORY_INCLUDES_CHILDREN */7070-7171- mem_base = ioremap(bus_addr, size);7272- if (!mem_base)7373- goto out;7474-7575- dev->dma_mem = kzalloc(sizeof(struct dma_coherent_mem), GFP_KERNEL);7676- if (!dev->dma_mem)7777- goto iounmap_out;7878- dev->dma_mem->bitmap = kzalloc(bitmap_size, GFP_KERNEL);7979- if (!dev->dma_mem->bitmap)8080- goto free1_out;8181-8282- dev->dma_mem->virt_base = mem_base;8383- dev->dma_mem->device_base = device_addr;8484- dev->dma_mem->size = pages;8585- dev->dma_mem->flags = flags;8686-8787- if (flags & DMA_MEMORY_MAP)8888- return DMA_MEMORY_MAP;8989-9090- return DMA_MEMORY_IO;9191-9292- free1_out:9393- kfree(dev->dma_mem);9494- iounmap_out:9595- iounmap(mem_base);9696- out:9797- return 0;9898-}9999-EXPORT_SYMBOL(dma_declare_coherent_memory);100100-101101-void dma_release_declared_memory(struct device *dev)102102-{103103- struct dma_coherent_mem *mem = dev->dma_mem;104104-105105- if(!mem)106106- return;107107- dev->dma_mem = NULL;108108- iounmap(mem->virt_base);109109- kfree(mem->bitmap);110110- kfree(mem);111111-}112112-EXPORT_SYMBOL(dma_release_declared_memory);113113-114114-void *dma_mark_declared_memory_occupied(struct device *dev,115115- dma_addr_t device_addr, size_t size)116116-{117117- struct dma_coherent_mem *mem = dev->dma_mem;118118- int pages = (size + (device_addr & ~PAGE_MASK) + PAGE_SIZE - 1) >> PAGE_SHIFT;119119- int pos, err;120120-121121- if (!mem)122122- return ERR_PTR(-EINVAL);123123-124124- pos = (device_addr - mem->device_base) >> PAGE_SHIFT;125125- err = bitmap_allocate_region(mem->bitmap, pos, get_order(pages));126126- if (err != 0)127127- return ERR_PTR(err);128128- return mem->virt_base + (pos << PAGE_SHIFT);129129-}130130-EXPORT_SYMBOL(dma_mark_declared_memory_occupied);
+1
arch/sh/Kconfig
···1111 select HAVE_CLK1212 select HAVE_IDE1313 select HAVE_OPROFILE1414+ select HAVE_GENERIC_DMA_COHERENT1415 help1516 The SuperH is a RISC processor targeted for use in embedded systems1617 and consumer electronics; it was also used in the Sega Dreamcast
+3-95
arch/sh/mm/consistent.c
···2828 dma_addr_t *dma_handle, gfp_t gfp)2929{3030 void *ret, *ret_nocache;3131- struct dma_coherent_mem *mem = dev ? dev->dma_mem : NULL;3231 int order = get_order(size);33323434- if (mem) {3535- int page = bitmap_find_free_region(mem->bitmap, mem->size,3636- order);3737- if (page >= 0) {3838- *dma_handle = mem->device_base + (page << PAGE_SHIFT);3939- ret = mem->virt_base + (page << PAGE_SHIFT);4040- memset(ret, 0, size);4141- return ret;4242- }4343- if (mem->flags & DMA_MEMORY_EXCLUSIVE)4444- return NULL;4545- }3333+ if (dma_alloc_from_coherent(dev, size, dma_handle, &ret))3434+ return ret;46354736 ret = (void *)__get_free_pages(gfp, order);4837 if (!ret)···6172 struct dma_coherent_mem *mem = dev ? dev->dma_mem : NULL;6273 int order = get_order(size);63746464- if (mem && vaddr >= mem->virt_base && vaddr < (mem->virt_base + (mem->size << PAGE_SHIFT))) {6565- int page = (vaddr - mem->virt_base) >> PAGE_SHIFT;6666-6767- bitmap_release_region(mem->bitmap, page, order);6868- } else {7575+ if (!dma_release_from_coherent(dev, order, vaddr)) {6976 WARN_ON(irqs_disabled()); /* for portability */7077 BUG_ON(mem && mem->flags & DMA_MEMORY_EXCLUSIVE);7178 free_pages((unsigned long)phys_to_virt(dma_handle), order);···6984 }7085}7186EXPORT_SYMBOL(dma_free_coherent);7272-7373-int dma_declare_coherent_memory(struct device *dev, dma_addr_t bus_addr,7474- dma_addr_t device_addr, size_t size, int flags)7575-{7676- void __iomem *mem_base = NULL;7777- int pages = size >> PAGE_SHIFT;7878- int bitmap_size = BITS_TO_LONGS(pages) * sizeof(long);7979-8080- if ((flags & (DMA_MEMORY_MAP | DMA_MEMORY_IO)) == 0)8181- goto out;8282- if (!size)8383- goto out;8484- if (dev->dma_mem)8585- goto out;8686-8787- /* FIXME: this routine just ignores DMA_MEMORY_INCLUDES_CHILDREN */8888-8989- mem_base = ioremap_nocache(bus_addr, size);9090- if (!mem_base)9191- goto out;9292-9393- dev->dma_mem = kmalloc(sizeof(struct dma_coherent_mem), GFP_KERNEL);9494- if (!dev->dma_mem)9595- goto out;9696- dev->dma_mem->bitmap = kzalloc(bitmap_size, GFP_KERNEL);9797- if (!dev->dma_mem->bitmap)9898- goto free1_out;9999-100100- dev->dma_mem->virt_base = mem_base;101101- dev->dma_mem->device_base = device_addr;102102- dev->dma_mem->size = pages;103103- dev->dma_mem->flags = flags;104104-105105- if (flags & DMA_MEMORY_MAP)106106- return DMA_MEMORY_MAP;107107-108108- return DMA_MEMORY_IO;109109-110110- free1_out:111111- kfree(dev->dma_mem);112112- out:113113- if (mem_base)114114- iounmap(mem_base);115115- return 0;116116-}117117-EXPORT_SYMBOL(dma_declare_coherent_memory);118118-119119-void dma_release_declared_memory(struct device *dev)120120-{121121- struct dma_coherent_mem *mem = dev->dma_mem;122122-123123- if (!mem)124124- return;125125- dev->dma_mem = NULL;126126- iounmap(mem->virt_base);127127- kfree(mem->bitmap);128128- kfree(mem);129129-}130130-EXPORT_SYMBOL(dma_release_declared_memory);131131-132132-void *dma_mark_declared_memory_occupied(struct device *dev,133133- dma_addr_t device_addr, size_t size)134134-{135135- struct dma_coherent_mem *mem = dev->dma_mem;136136- int pages = (size + (device_addr & ~PAGE_MASK) + PAGE_SIZE - 1) >> PAGE_SHIFT;137137- int pos, err;138138-139139- if (!mem)140140- return ERR_PTR(-EINVAL);141141-142142- pos = (device_addr - mem->device_base) >> PAGE_SHIFT;143143- err = bitmap_allocate_region(mem->bitmap, pos, get_order(pages));144144- if (err != 0)145145- return ERR_PTR(err);146146- return mem->virt_base + (pos << PAGE_SHIFT);147147-}148148-EXPORT_SYMBOL(dma_mark_declared_memory_occupied);1498715088void dma_cache_sync(struct device *dev, void *vaddr, size_t size,15189 enum dma_data_direction direction)
+1
arch/x86/Kconfig
···3030 select HAVE_FTRACE3131 select HAVE_KVM if ((X86_32 && !X86_VOYAGER && !X86_VISWS && !X86_NUMAQ) || X86_64)3232 select HAVE_ARCH_KGDB if !X86_VOYAGER3333+ select HAVE_GENERIC_DMA_COHERENT if X86_323334 select HAVE_EFFICIENT_UNALIGNED_ACCESS34353536config ARCH_DEFCONFIG
+2-120
arch/x86/kernel/pci-dma.c
···192192}193193early_param("iommu", iommu_setup);194194195195-#ifdef CONFIG_X86_32196196-int dma_declare_coherent_memory(struct device *dev, dma_addr_t bus_addr,197197- dma_addr_t device_addr, size_t size, int flags)198198-{199199- void __iomem *mem_base = NULL;200200- int pages = size >> PAGE_SHIFT;201201- int bitmap_size = BITS_TO_LONGS(pages) * sizeof(long);202202-203203- if ((flags & (DMA_MEMORY_MAP | DMA_MEMORY_IO)) == 0)204204- goto out;205205- if (!size)206206- goto out;207207- if (dev->dma_mem)208208- goto out;209209-210210- /* FIXME: this routine just ignores DMA_MEMORY_INCLUDES_CHILDREN */211211-212212- mem_base = ioremap(bus_addr, size);213213- if (!mem_base)214214- goto out;215215-216216- dev->dma_mem = kzalloc(sizeof(struct dma_coherent_mem), GFP_KERNEL);217217- if (!dev->dma_mem)218218- goto out;219219- dev->dma_mem->bitmap = kzalloc(bitmap_size, GFP_KERNEL);220220- if (!dev->dma_mem->bitmap)221221- goto free1_out;222222-223223- dev->dma_mem->virt_base = mem_base;224224- dev->dma_mem->device_base = device_addr;225225- dev->dma_mem->size = pages;226226- dev->dma_mem->flags = flags;227227-228228- if (flags & DMA_MEMORY_MAP)229229- return DMA_MEMORY_MAP;230230-231231- return DMA_MEMORY_IO;232232-233233- free1_out:234234- kfree(dev->dma_mem);235235- out:236236- if (mem_base)237237- iounmap(mem_base);238238- return 0;239239-}240240-EXPORT_SYMBOL(dma_declare_coherent_memory);241241-242242-void dma_release_declared_memory(struct device *dev)243243-{244244- struct dma_coherent_mem *mem = dev->dma_mem;245245-246246- if (!mem)247247- return;248248- dev->dma_mem = NULL;249249- iounmap(mem->virt_base);250250- kfree(mem->bitmap);251251- kfree(mem);252252-}253253-EXPORT_SYMBOL(dma_release_declared_memory);254254-255255-void *dma_mark_declared_memory_occupied(struct device *dev,256256- dma_addr_t device_addr, size_t size)257257-{258258- struct dma_coherent_mem *mem = dev->dma_mem;259259- int pos, err;260260- int pages = (size + (device_addr & ~PAGE_MASK) + PAGE_SIZE - 1);261261-262262- pages >>= PAGE_SHIFT;263263-264264- if (!mem)265265- return ERR_PTR(-EINVAL);266266-267267- pos = (device_addr - mem->device_base) >> PAGE_SHIFT;268268- err = bitmap_allocate_region(mem->bitmap, pos, get_order(pages));269269- if (err != 0)270270- return ERR_PTR(err);271271- return mem->virt_base + (pos << PAGE_SHIFT);272272-}273273-EXPORT_SYMBOL(dma_mark_declared_memory_occupied);274274-275275-static int dma_alloc_from_coherent_mem(struct device *dev, ssize_t size,276276- dma_addr_t *dma_handle, void **ret)277277-{278278- struct dma_coherent_mem *mem = dev ? dev->dma_mem : NULL;279279- int order = get_order(size);280280-281281- if (mem) {282282- int page = bitmap_find_free_region(mem->bitmap, mem->size,283283- order);284284- if (page >= 0) {285285- *dma_handle = mem->device_base + (page << PAGE_SHIFT);286286- *ret = mem->virt_base + (page << PAGE_SHIFT);287287- memset(*ret, 0, size);288288- }289289- if (mem->flags & DMA_MEMORY_EXCLUSIVE)290290- *ret = NULL;291291- }292292- return (mem != NULL);293293-}294294-295295-static int dma_release_coherent(struct device *dev, int order, void *vaddr)296296-{297297- struct dma_coherent_mem *mem = dev ? dev->dma_mem : NULL;298298-299299- if (mem && vaddr >= mem->virt_base && vaddr <300300- (mem->virt_base + (mem->size << PAGE_SHIFT))) {301301- int page = (vaddr - mem->virt_base) >> PAGE_SHIFT;302302-303303- bitmap_release_region(mem->bitmap, page, order);304304- return 1;305305- }306306- return 0;307307-}308308-#else309309-#define dma_alloc_from_coherent_mem(dev, size, handle, ret) (0)310310-#define dma_release_coherent(dev, order, vaddr) (0)311311-#endif /* CONFIG_X86_32 */312312-313195int dma_supported(struct device *dev, u64 mask)314196{315197 struct dma_mapping_ops *ops = get_dma_ops(dev);···261379 /* ignore region specifiers */262380 gfp &= ~(__GFP_DMA | __GFP_HIGHMEM | __GFP_DMA32);263381264264- if (dma_alloc_from_coherent_mem(dev, size, dma_handle, &memory))382382+ if (dma_alloc_from_coherent(dev, size, dma_handle, &memory))265383 return memory;266384267385 if (!dev) {···366484367485 int order = get_order(size);368486 WARN_ON(irqs_disabled()); /* for portability */369369- if (dma_release_coherent(dev, order, vaddr))487487+ if (dma_release_from_coherent(dev, order, vaddr))370488 return;371489 if (ops->unmap_single)372490 ops->unmap_single(dev, bus, size, 0);
+2
include/asm-arm/dma-mapping.h
···7788#include <linux/scatterlist.h>991010+#include <asm-generic/dma-coherent.h>1111+1012/*1113 * DMA-consistent mapping functions. These allocate/free a region of1214 * uncached, unwrite-buffered mapped memory space for use with DMA