lkml.org 
[lkml]   [2008]   [Aug]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4/7] x86: add alloc_coherent dma_ops callback to NOMMU driver
    Date
    Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
    ---
    arch/x86/kernel/pci-nommu.c | 38 ++++++++++++++++++++++++++++++++++++++
    1 files changed, 38 insertions(+), 0 deletions(-)

    diff --git a/arch/x86/kernel/pci-nommu.c b/arch/x86/kernel/pci-nommu.c
    index 3f91f71..4d8cde3 100644
    --- a/arch/x86/kernel/pci-nommu.c
    +++ b/arch/x86/kernel/pci-nommu.c
    @@ -72,7 +72,45 @@ static int nommu_map_sg(struct device *hwdev, struct scatterlist *sg,
    return nents;
    }

    +static void *
    +nommu_alloc_coherent(struct device *hwdev, size_t size,
    + dma_addr_t *dma_addr, gfp_t gfp)
    +{
    + unsigned long dma_mask;
    + int node;
    + struct page *page;
    +
    + if (hwdev->dma_mask == NULL)
    + return NULL;
    +
    + gfp &= ~(__GFP_DMA | __GFP_HIGHMEM | __GFP_DMA32);
    + gfp |= __GFP_ZERO;
    +
    + dma_mask = hwdev->coherent_dma_mask;
    + if (!dma_mask)
    + dma_mask = *(hwdev->dma_mask);
    +
    + if (dma_mask <= DMA_24BIT_MASK)
    + gfp |= GFP_DMA;
    + else if (dma_mask <= DMA_32BIT_MASK)
    + gfp |= GFP_DMA32;
    +
    + node = dev_to_node(hwdev);
    + page = alloc_pages_node(node, gfp, get_order(size));
    + if (!page)
    + return NULL;
    +
    + *dma_addr = page_to_phys(page);
    + if (check_addr("alloc_coherent", hwdev, *dma_addr, size))
    + return page_address(page);
    +
    + free_pages((unsigned long)page_address(page), get_order(size));
    +
    + return NULL;
    +}
    +
    struct dma_mapping_ops nommu_dma_ops = {
    + .alloc_coherent = nommu_alloc_coherent,
    .map_single = nommu_map_single,
    .map_sg = nommu_map_sg,
    .is_phys = 1,
    --
    1.5.3.7



    \
     
     \ /
      Last update: 2008-08-12 17:29    [W:0.022 / U:30.984 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site