lkml.org 
[lkml]   [2008]   [Apr]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 15/28] x86: move dma_coherent functions to pci-dma.c
    Date
    They are placed in an ifdef, since they are i386 specific
    the structure definition goes to dma-mapping.h.

    Signed-off-by: Glauber Costa <gcosta@redhat.com>
    ---
    arch/x86/kernel/pci-dma.c | 81 +++++++++++++++++++++++++++++++++++++++
    arch/x86/kernel/pci-dma_32.c | 85 -----------------------------------------
    include/asm-x86/dma-mapping.h | 8 ++++
    3 files changed, 89 insertions(+), 85 deletions(-)

    diff --git a/arch/x86/kernel/pci-dma.c b/arch/x86/kernel/pci-dma.c
    index e04f42c..d06d8df 100644
    --- a/arch/x86/kernel/pci-dma.c
    +++ b/arch/x86/kernel/pci-dma.c
    @@ -47,6 +47,87 @@ int dma_set_mask(struct device *dev, u64 mask)
    }
    EXPORT_SYMBOL(dma_set_mask);

    +#ifdef CONFIG_X86_32
    +int dma_declare_coherent_memory(struct device *dev, dma_addr_t bus_addr,
    + dma_addr_t device_addr, size_t size, int flags)
    +{
    + void __iomem *mem_base = NULL;
    + int pages = size >> PAGE_SHIFT;
    + int bitmap_size = BITS_TO_LONGS(pages) * sizeof(long);
    +
    + if ((flags & (DMA_MEMORY_MAP | DMA_MEMORY_IO)) == 0)
    + goto out;
    + if (!size)
    + goto out;
    + if (dev->dma_mem)
    + goto out;
    +
    + /* FIXME: this routine just ignores DMA_MEMORY_INCLUDES_CHILDREN */
    +
    + mem_base = ioremap(bus_addr, size);
    + if (!mem_base)
    + goto out;
    +
    + dev->dma_mem = kzalloc(sizeof(struct dma_coherent_mem), GFP_KERNEL);
    + if (!dev->dma_mem)
    + goto out;
    + dev->dma_mem->bitmap = kzalloc(bitmap_size, GFP_KERNEL);
    + if (!dev->dma_mem->bitmap)
    + goto free1_out;
    +
    + dev->dma_mem->virt_base = mem_base;
    + dev->dma_mem->device_base = device_addr;
    + dev->dma_mem->size = pages;
    + dev->dma_mem->flags = flags;
    +
    + if (flags & DMA_MEMORY_MAP)
    + return DMA_MEMORY_MAP;
    +
    + return DMA_MEMORY_IO;
    +
    + free1_out:
    + kfree(dev->dma_mem);
    + out:
    + if (mem_base)
    + iounmap(mem_base);
    + return 0;
    +}
    +EXPORT_SYMBOL(dma_declare_coherent_memory);
    +
    +void dma_release_declared_memory(struct device *dev)
    +{
    + struct dma_coherent_mem *mem = dev->dma_mem;
    +
    + if (!mem)
    + return;
    + dev->dma_mem = NULL;
    + iounmap(mem->virt_base);
    + kfree(mem->bitmap);
    + kfree(mem);
    +}
    +EXPORT_SYMBOL(dma_release_declared_memory);
    +
    +void *dma_mark_declared_memory_occupied(struct device *dev,
    + dma_addr_t device_addr, size_t size)
    +{
    + struct dma_coherent_mem *mem = dev->dma_mem;
    + int pos, err;
    + int pages = (size + (device_addr & ~PAGE_MASK) + PAGE_SIZE - 1);
    +
    + pages >>= PAGE_SHIFT;
    +
    + if (!mem)
    + return ERR_PTR(-EINVAL);
    +
    + pos = (device_addr - mem->device_base) >> PAGE_SHIFT;
    + err = bitmap_allocate_region(mem->bitmap, pos, get_order(pages));
    + if (err != 0)
    + return ERR_PTR(err);
    + return mem->virt_base + (pos << PAGE_SHIFT);
    +}
    +EXPORT_SYMBOL(dma_mark_declared_memory_occupied);
    +#endif /* CONFIG_X86_32 */
    +
    int dma_supported(struct device *dev, u64 mask)
    {
    #ifdef CONFIG_PCI
    diff --git a/arch/x86/kernel/pci-dma_32.c b/arch/x86/kernel/pci-dma_32.c
    index eea52df..818d95e 100644
    --- a/arch/x86/kernel/pci-dma_32.c
    +++ b/arch/x86/kernel/pci-dma_32.c
    @@ -18,14 +18,6 @@
    dma_addr_t bad_dma_address __read_mostly = 0x0;
    EXPORT_SYMBOL(bad_dma_address);

    -struct dma_coherent_mem {
    - void *virt_base;
    - u32 device_base;
    - int size;
    - int flags;
    - unsigned long *bitmap;
    -};
    -
    void *dma_alloc_coherent(struct device *dev, size_t size,
    dma_addr_t *dma_handle, gfp_t gfp)
    {
    @@ -76,80 +68,3 @@ void dma_free_coherent(struct device *dev, size_t size,
    free_pages((unsigned long)vaddr, order);
    }
    EXPORT_SYMBOL(dma_free_coherent);
    -
    -int dma_declare_coherent_memory(struct device *dev, dma_addr_t bus_addr,
    - dma_addr_t device_addr, size_t size, int flags)
    -{
    - void __iomem *mem_base = NULL;
    - int pages = size >> PAGE_SHIFT;
    - int bitmap_size = BITS_TO_LONGS(pages) * sizeof(long);
    -
    - if ((flags & (DMA_MEMORY_MAP | DMA_MEMORY_IO)) == 0)
    - goto out;
    - if (!size)
    - goto out;
    - if (dev->dma_mem)
    - goto out;
    -
    - /* FIXME: this routine just ignores DMA_MEMORY_INCLUDES_CHILDREN */
    -
    - mem_base = ioremap(bus_addr, size);
    - if (!mem_base)
    - goto out;
    -
    - dev->dma_mem = kzalloc(sizeof(struct dma_coherent_mem), GFP_KERNEL);
    - if (!dev->dma_mem)
    - goto out;
    - dev->dma_mem->bitmap = kzalloc(bitmap_size, GFP_KERNEL);
    - if (!dev->dma_mem->bitmap)
    - goto free1_out;
    -
    - dev->dma_mem->virt_base = mem_base;
    - dev->dma_mem->device_base = device_addr;
    - dev->dma_mem->size = pages;
    - dev->dma_mem->flags = flags;
    -
    - if (flags & DMA_MEMORY_MAP)
    - return DMA_MEMORY_MAP;
    -
    - return DMA_MEMORY_IO;
    -
    - free1_out:
    - kfree(dev->dma_mem);
    - out:
    - if (mem_base)
    - iounmap(mem_base);
    - return 0;
    -}
    -EXPORT_SYMBOL(dma_declare_coherent_memory);
    -
    -void dma_release_declared_memory(struct device *dev)
    -{
    - struct dma_coherent_mem *mem = dev->dma_mem;
    -
    - if(!mem)
    - return;
    - dev->dma_mem = NULL;
    - iounmap(mem->virt_base);
    - kfree(mem->bitmap);
    - kfree(mem);
    -}
    -EXPORT_SYMBOL(dma_release_declared_memory);
    -
    -void *dma_mark_declared_memory_occupied(struct device *dev,
    - dma_addr_t device_addr, size_t size)
    -{
    - struct dma_coherent_mem *mem = dev->dma_mem;
    - int pages = (size + (device_addr & ~PAGE_MASK) + PAGE_SIZE - 1) >> PAGE_SHIFT;
    - int pos, err;
    -
    - if (!mem)
    - return ERR_PTR(-EINVAL);
    -
    - pos = (device_addr - mem->device_base) >> PAGE_SHIFT;
    - err = bitmap_allocate_region(mem->bitmap, pos, get_order(pages));
    - if (err != 0)
    - return ERR_PTR(err);
    - return mem->virt_base + (pos << PAGE_SHIFT);
    -}
    -EXPORT_SYMBOL(dma_mark_declared_memory_occupied);
    diff --git a/include/asm-x86/dma-mapping.h b/include/asm-x86/dma-mapping.h
    index 7580736..a1a4dc7 100644
    --- a/include/asm-x86/dma-mapping.h
    +++ b/include/asm-x86/dma-mapping.h
    @@ -215,6 +215,14 @@ static inline int dma_get_cache_alignment(void)

    #ifdef CONFIG_X86_32
    # define ARCH_HAS_DMA_DECLARE_COHERENT_MEMORY
    +struct dma_coherent_mem {
    + void *virt_base;
    + u32 device_base;
    + int size;
    + int flags;
    + unsigned long *bitmap;
    +};
    +
    extern int
    dma_declare_coherent_memory(struct device *dev, dma_addr_t bus_addr,
    dma_addr_t device_addr, size_t size, int flags);
    --
    1.5.0.6


    \
     
     \ /
      Last update: 2008-04-08 18:43    [W:2.119 / U:0.072 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site