···17 select HAVE_KRETPROBES if (HAVE_KPROBES)18 select HAVE_FTRACE if (!XIP_KERNEL)19 select HAVE_DYNAMIC_FTRACE if (HAVE_FTRACE)020 help21 The ARM series is a line of low-power-consumption RISC chip designs22 licensed by ARM Ltd and targeted at embedded applications and
···17 select HAVE_KRETPROBES if (HAVE_KPROBES)18 select HAVE_FTRACE if (!XIP_KERNEL)19 select HAVE_DYNAMIC_FTRACE if (HAVE_FTRACE)20+ select HAVE_GENERIC_DMA_COHERENT21 help22 The ARM series is a line of low-power-consumption RISC chip designs23 licensed by ARM Ltd and targeted at embedded applications and
···15#include <linux/pci.h>16#include <asm/io.h>1718-struct dma_coherent_mem {19- void *virt_base;20- u32 device_base;21- int size;22- int flags;23- unsigned long *bitmap;24-};25-26void *dma_alloc_coherent(struct device *dev, size_t size,27 dma_addr_t *dma_handle, gfp_t gfp)28{29 void *ret;30- struct dma_coherent_mem *mem = dev ? dev->dma_mem : NULL;31 int order = get_order(size);32 /* ignore region specifiers */33 gfp &= ~(__GFP_DMA | __GFP_HIGHMEM);3435- if (mem) {36- int page = bitmap_find_free_region(mem->bitmap, mem->size,37- order);38- if (page >= 0) {39- *dma_handle = mem->device_base + (page << PAGE_SHIFT);40- ret = mem->virt_base + (page << PAGE_SHIFT);41- memset(ret, 0, size);42- return ret;43- }44- if (mem->flags & DMA_MEMORY_EXCLUSIVE)45- return NULL;46- }4748 if (dev == NULL || (dev->coherent_dma_mask < 0xffffffff))49 gfp |= GFP_DMA;···41void dma_free_coherent(struct device *dev, size_t size,42 void *vaddr, dma_addr_t dma_handle)43{44- struct dma_coherent_mem *mem = dev ? dev->dma_mem : NULL;45 int order = get_order(size);4647- if (mem && vaddr >= mem->virt_base && vaddr < (mem->virt_base + (mem->size << PAGE_SHIFT))) {48- int page = (vaddr - mem->virt_base) >> PAGE_SHIFT;49-50- bitmap_release_region(mem->bitmap, page, order);51- } else52 free_pages((unsigned long)vaddr, order);53}5455-int dma_declare_coherent_memory(struct device *dev, dma_addr_t bus_addr,56- dma_addr_t device_addr, size_t size, int flags)57-{58- void __iomem *mem_base;59- int pages = size >> PAGE_SHIFT;60- int bitmap_size = BITS_TO_LONGS(pages) * sizeof(long);61-62- if ((flags & (DMA_MEMORY_MAP | DMA_MEMORY_IO)) == 0)63- goto out;64- if (!size)65- goto out;66- if (dev->dma_mem)67- goto out;68-69- /* FIXME: this routine just ignores DMA_MEMORY_INCLUDES_CHILDREN */70-71- mem_base = ioremap(bus_addr, size);72- if (!mem_base)73- goto out;74-75- dev->dma_mem = kzalloc(sizeof(struct dma_coherent_mem), GFP_KERNEL);76- if (!dev->dma_mem)77- goto iounmap_out;78- dev->dma_mem->bitmap = kzalloc(bitmap_size, GFP_KERNEL);79- if (!dev->dma_mem->bitmap)80- goto free1_out;81-82- dev->dma_mem->virt_base = mem_base;83- dev->dma_mem->device_base = device_addr;84- dev->dma_mem->size = pages;85- dev->dma_mem->flags = flags;86-87- if (flags & DMA_MEMORY_MAP)88- return DMA_MEMORY_MAP;89-90- return DMA_MEMORY_IO;91-92- free1_out:93- kfree(dev->dma_mem);94- iounmap_out:95- iounmap(mem_base);96- out:97- return 0;98-}99-EXPORT_SYMBOL(dma_declare_coherent_memory);100-101-void dma_release_declared_memory(struct device *dev)102-{103- struct dma_coherent_mem *mem = dev->dma_mem;104-105- if(!mem)106- return;107- dev->dma_mem = NULL;108- iounmap(mem->virt_base);109- kfree(mem->bitmap);110- kfree(mem);111-}112-EXPORT_SYMBOL(dma_release_declared_memory);113-114-void *dma_mark_declared_memory_occupied(struct device *dev,115- dma_addr_t device_addr, size_t size)116-{117- struct dma_coherent_mem *mem = dev->dma_mem;118- int pages = (size + (device_addr & ~PAGE_MASK) + PAGE_SIZE - 1) >> PAGE_SHIFT;119- int pos, err;120-121- if (!mem)122- return ERR_PTR(-EINVAL);123-124- pos = (device_addr - mem->device_base) >> PAGE_SHIFT;125- err = bitmap_allocate_region(mem->bitmap, pos, get_order(pages));126- if (err != 0)127- return ERR_PTR(err);128- return mem->virt_base + (pos << PAGE_SHIFT);129-}130-EXPORT_SYMBOL(dma_mark_declared_memory_occupied);
···15#include <linux/pci.h>16#include <asm/io.h>170000000018void *dma_alloc_coherent(struct device *dev, size_t size,19 dma_addr_t *dma_handle, gfp_t gfp)20{21 void *ret;022 int order = get_order(size);23 /* ignore region specifiers */24 gfp &= ~(__GFP_DMA | __GFP_HIGHMEM);2526+ if (dma_alloc_from_coherent(dev, size, dma_handle, &ret))27+ return ret;00000000002829 if (dev == NULL || (dev->coherent_dma_mask < 0xffffffff))30 gfp |= GFP_DMA;···60void dma_free_coherent(struct device *dev, size_t size,61 void *vaddr, dma_addr_t dma_handle)62{063 int order = get_order(size);6465+ if (!dma_release_from_coherent(dev, order, vaddr))000066 free_pages((unsigned long)vaddr, order);67}680000000000000000000000000000000000000000000000000000000000000000000000000000
+1
arch/sh/Kconfig
···11 select HAVE_CLK12 select HAVE_IDE13 select HAVE_OPROFILE014 help15 The SuperH is a RISC processor targeted for use in embedded systems16 and consumer electronics; it was also used in the Sega Dreamcast
···11 select HAVE_CLK12 select HAVE_IDE13 select HAVE_OPROFILE14+ select HAVE_GENERIC_DMA_COHERENT15 help16 The SuperH is a RISC processor targeted for use in embedded systems17 and consumer electronics; it was also used in the Sega Dreamcast
+3-95
arch/sh/mm/consistent.c
···28 dma_addr_t *dma_handle, gfp_t gfp)29{30 void *ret, *ret_nocache;31- struct dma_coherent_mem *mem = dev ? dev->dma_mem : NULL;32 int order = get_order(size);3334- if (mem) {35- int page = bitmap_find_free_region(mem->bitmap, mem->size,36- order);37- if (page >= 0) {38- *dma_handle = mem->device_base + (page << PAGE_SHIFT);39- ret = mem->virt_base + (page << PAGE_SHIFT);40- memset(ret, 0, size);41- return ret;42- }43- if (mem->flags & DMA_MEMORY_EXCLUSIVE)44- return NULL;45- }4647 ret = (void *)__get_free_pages(gfp, order);48 if (!ret)···61 struct dma_coherent_mem *mem = dev ? dev->dma_mem : NULL;62 int order = get_order(size);6364- if (mem && vaddr >= mem->virt_base && vaddr < (mem->virt_base + (mem->size << PAGE_SHIFT))) {65- int page = (vaddr - mem->virt_base) >> PAGE_SHIFT;66-67- bitmap_release_region(mem->bitmap, page, order);68- } else {69 WARN_ON(irqs_disabled()); /* for portability */70 BUG_ON(mem && mem->flags & DMA_MEMORY_EXCLUSIVE);71 free_pages((unsigned long)phys_to_virt(dma_handle), order);···69 }70}71EXPORT_SYMBOL(dma_free_coherent);72-73-int dma_declare_coherent_memory(struct device *dev, dma_addr_t bus_addr,74- dma_addr_t device_addr, size_t size, int flags)75-{76- void __iomem *mem_base = NULL;77- int pages = size >> PAGE_SHIFT;78- int bitmap_size = BITS_TO_LONGS(pages) * sizeof(long);79-80- if ((flags & (DMA_MEMORY_MAP | DMA_MEMORY_IO)) == 0)81- goto out;82- if (!size)83- goto out;84- if (dev->dma_mem)85- goto out;86-87- /* FIXME: this routine just ignores DMA_MEMORY_INCLUDES_CHILDREN */88-89- mem_base = ioremap_nocache(bus_addr, size);90- if (!mem_base)91- goto out;92-93- dev->dma_mem = kmalloc(sizeof(struct dma_coherent_mem), GFP_KERNEL);94- if (!dev->dma_mem)95- goto out;96- dev->dma_mem->bitmap = kzalloc(bitmap_size, GFP_KERNEL);97- if (!dev->dma_mem->bitmap)98- goto free1_out;99-100- dev->dma_mem->virt_base = mem_base;101- dev->dma_mem->device_base = device_addr;102- dev->dma_mem->size = pages;103- dev->dma_mem->flags = flags;104-105- if (flags & DMA_MEMORY_MAP)106- return DMA_MEMORY_MAP;107-108- return DMA_MEMORY_IO;109-110- free1_out:111- kfree(dev->dma_mem);112- out:113- if (mem_base)114- iounmap(mem_base);115- return 0;116-}117-EXPORT_SYMBOL(dma_declare_coherent_memory);118-119-void dma_release_declared_memory(struct device *dev)120-{121- struct dma_coherent_mem *mem = dev->dma_mem;122-123- if (!mem)124- return;125- dev->dma_mem = NULL;126- iounmap(mem->virt_base);127- kfree(mem->bitmap);128- kfree(mem);129-}130-EXPORT_SYMBOL(dma_release_declared_memory);131-132-void *dma_mark_declared_memory_occupied(struct device *dev,133- dma_addr_t device_addr, size_t size)134-{135- struct dma_coherent_mem *mem = dev->dma_mem;136- int pages = (size + (device_addr & ~PAGE_MASK) + PAGE_SIZE - 1) >> PAGE_SHIFT;137- int pos, err;138-139- if (!mem)140- return ERR_PTR(-EINVAL);141-142- pos = (device_addr - mem->device_base) >> PAGE_SHIFT;143- err = bitmap_allocate_region(mem->bitmap, pos, get_order(pages));144- if (err != 0)145- return ERR_PTR(err);146- return mem->virt_base + (pos << PAGE_SHIFT);147-}148-EXPORT_SYMBOL(dma_mark_declared_memory_occupied);149150void dma_cache_sync(struct device *dev, void *vaddr, size_t size,151 enum dma_data_direction direction)
···28 dma_addr_t *dma_handle, gfp_t gfp)29{30 void *ret, *ret_nocache;031 int order = get_order(size);3233+ if (dma_alloc_from_coherent(dev, size, dma_handle, &ret))34+ return ret;00000000003536 ret = (void *)__get_free_pages(gfp, order);37 if (!ret)···72 struct dma_coherent_mem *mem = dev ? dev->dma_mem : NULL;73 int order = get_order(size);7475+ if (!dma_release_from_coherent(dev, order, vaddr)) {000076 WARN_ON(irqs_disabled()); /* for portability */77 BUG_ON(mem && mem->flags & DMA_MEMORY_EXCLUSIVE);78 free_pages((unsigned long)phys_to_virt(dma_handle), order);···84 }85}86EXPORT_SYMBOL(dma_free_coherent);000000000000000000000000000000000000000000000000000000000000000000000000000008788void dma_cache_sync(struct device *dev, void *vaddr, size_t size,89 enum dma_data_direction direction)
···30 select HAVE_FTRACE31 select HAVE_KVM if ((X86_32 && !X86_VOYAGER && !X86_VISWS && !X86_NUMAQ) || X86_64)32 select HAVE_ARCH_KGDB if !X86_VOYAGER33+ select HAVE_GENERIC_DMA_COHERENT if X86_3234 select HAVE_EFFICIENT_UNALIGNED_ACCESS3536config ARCH_DEFCONFIG
+2-120
arch/x86/kernel/pci-dma.c
···192}193early_param("iommu", iommu_setup);194195-#ifdef CONFIG_X86_32196-int dma_declare_coherent_memory(struct device *dev, dma_addr_t bus_addr,197- dma_addr_t device_addr, size_t size, int flags)198-{199- void __iomem *mem_base = NULL;200- int pages = size >> PAGE_SHIFT;201- int bitmap_size = BITS_TO_LONGS(pages) * sizeof(long);202-203- if ((flags & (DMA_MEMORY_MAP | DMA_MEMORY_IO)) == 0)204- goto out;205- if (!size)206- goto out;207- if (dev->dma_mem)208- goto out;209-210- /* FIXME: this routine just ignores DMA_MEMORY_INCLUDES_CHILDREN */211-212- mem_base = ioremap(bus_addr, size);213- if (!mem_base)214- goto out;215-216- dev->dma_mem = kzalloc(sizeof(struct dma_coherent_mem), GFP_KERNEL);217- if (!dev->dma_mem)218- goto out;219- dev->dma_mem->bitmap = kzalloc(bitmap_size, GFP_KERNEL);220- if (!dev->dma_mem->bitmap)221- goto free1_out;222-223- dev->dma_mem->virt_base = mem_base;224- dev->dma_mem->device_base = device_addr;225- dev->dma_mem->size = pages;226- dev->dma_mem->flags = flags;227-228- if (flags & DMA_MEMORY_MAP)229- return DMA_MEMORY_MAP;230-231- return DMA_MEMORY_IO;232-233- free1_out:234- kfree(dev->dma_mem);235- out:236- if (mem_base)237- iounmap(mem_base);238- return 0;239-}240-EXPORT_SYMBOL(dma_declare_coherent_memory);241-242-void dma_release_declared_memory(struct device *dev)243-{244- struct dma_coherent_mem *mem = dev->dma_mem;245-246- if (!mem)247- return;248- dev->dma_mem = NULL;249- iounmap(mem->virt_base);250- kfree(mem->bitmap);251- kfree(mem);252-}253-EXPORT_SYMBOL(dma_release_declared_memory);254-255-void *dma_mark_declared_memory_occupied(struct device *dev,256- dma_addr_t device_addr, size_t size)257-{258- struct dma_coherent_mem *mem = dev->dma_mem;259- int pos, err;260- int pages = (size + (device_addr & ~PAGE_MASK) + PAGE_SIZE - 1);261-262- pages >>= PAGE_SHIFT;263-264- if (!mem)265- return ERR_PTR(-EINVAL);266-267- pos = (device_addr - mem->device_base) >> PAGE_SHIFT;268- err = bitmap_allocate_region(mem->bitmap, pos, get_order(pages));269- if (err != 0)270- return ERR_PTR(err);271- return mem->virt_base + (pos << PAGE_SHIFT);272-}273-EXPORT_SYMBOL(dma_mark_declared_memory_occupied);274-275-static int dma_alloc_from_coherent_mem(struct device *dev, ssize_t size,276- dma_addr_t *dma_handle, void **ret)277-{278- struct dma_coherent_mem *mem = dev ? dev->dma_mem : NULL;279- int order = get_order(size);280-281- if (mem) {282- int page = bitmap_find_free_region(mem->bitmap, mem->size,283- order);284- if (page >= 0) {285- *dma_handle = mem->device_base + (page << PAGE_SHIFT);286- *ret = mem->virt_base + (page << PAGE_SHIFT);287- memset(*ret, 0, size);288- }289- if (mem->flags & DMA_MEMORY_EXCLUSIVE)290- *ret = NULL;291- }292- return (mem != NULL);293-}294-295-static int dma_release_coherent(struct device *dev, int order, void *vaddr)296-{297- struct dma_coherent_mem *mem = dev ? dev->dma_mem : NULL;298-299- if (mem && vaddr >= mem->virt_base && vaddr <300- (mem->virt_base + (mem->size << PAGE_SHIFT))) {301- int page = (vaddr - mem->virt_base) >> PAGE_SHIFT;302-303- bitmap_release_region(mem->bitmap, page, order);304- return 1;305- }306- return 0;307-}308-#else309-#define dma_alloc_from_coherent_mem(dev, size, handle, ret) (0)310-#define dma_release_coherent(dev, order, vaddr) (0)311-#endif /* CONFIG_X86_32 */312-313int dma_supported(struct device *dev, u64 mask)314{315 struct dma_mapping_ops *ops = get_dma_ops(dev);···261 /* ignore region specifiers */262 gfp &= ~(__GFP_DMA | __GFP_HIGHMEM | __GFP_DMA32);263264- if (dma_alloc_from_coherent_mem(dev, size, dma_handle, &memory))265 return memory;266267 if (!dev) {···366367 int order = get_order(size);368 WARN_ON(irqs_disabled()); /* for portability */369- if (dma_release_coherent(dev, order, vaddr))370 return;371 if (ops->unmap_single)372 ops->unmap_single(dev, bus, size, 0);
···192}193early_param("iommu", iommu_setup);1940000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000195int dma_supported(struct device *dev, u64 mask)196{197 struct dma_mapping_ops *ops = get_dma_ops(dev);···379 /* ignore region specifiers */380 gfp &= ~(__GFP_DMA | __GFP_HIGHMEM | __GFP_DMA32);381382+ if (dma_alloc_from_coherent(dev, size, dma_handle, &memory))383 return memory;384385 if (!dev) {···484485 int order = get_order(size);486 WARN_ON(irqs_disabled()); /* for portability */487+ if (dma_release_from_coherent(dev, order, vaddr))488 return;489 if (ops->unmap_single)490 ops->unmap_single(dev, bus, size, 0);
+2
include/asm-arm/dma-mapping.h
···78#include <linux/scatterlist.h>90010/*11 * DMA-consistent mapping functions. These allocate/free a region of12 * uncached, unwrite-buffered mapped memory space for use with DMA
···78#include <linux/scatterlist.h>910+#include <asm-generic/dma-coherent.h>11+12/*13 * DMA-consistent mapping functions. These allocate/free a region of14 * uncached, unwrite-buffered mapped memory space for use with DMA