]> pilppa.com Git - linux-2.6-omap-h63xx.git/commitdiff
x86: add alloc_coherent dma_ops callback to GART driver
authorJoerg Roedel <joerg.roedel@amd.com>
Tue, 19 Aug 2008 14:32:39 +0000 (16:32 +0200)
committerIngo Molnar <mingo@elte.hu>
Fri, 22 Aug 2008 06:33:55 +0000 (08:33 +0200)
[ v2 - x86: make gart_alloc_coherent return zeroed memory

  FUJITA Tomonori pointed it out that the dma_alloc_coherent function
  should return memory set to zero. This patch adds this to the GART
  implementation too. ]

Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
arch/x86/kernel/pci-gart_64.c

index 49285f8fd4d54005d5efb9a9fad6bc498420e6d6..076e64b2d4f3e007751582986ac9411a9acdcda7 100644 (file)
@@ -499,6 +499,26 @@ error:
        return 0;
 }
 
+/* allocate and map a coherent mapping */
+static void *
+gart_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_addr,
+                   gfp_t flag)
+{
+       void *vaddr;
+
+       vaddr = (void *)__get_free_pages(flag | __GFP_ZERO, get_order(size));
+       if (!vaddr)
+               return NULL;
+
+       *dma_addr = gart_map_single(dev, __pa(vaddr), size, DMA_BIDIRECTIONAL);
+       if (*dma_addr != bad_dma_address)
+               return vaddr;
+
+       free_pages((unsigned long)vaddr, get_order(size));
+
+       return NULL;
+}
+
 static int no_agp;
 
 static __init unsigned long check_iommu_size(unsigned long aper, u64 aper_size)
@@ -701,6 +721,7 @@ static struct dma_mapping_ops gart_dma_ops = {
        .sync_sg_for_device             = NULL,
        .map_sg                         = gart_map_sg,
        .unmap_sg                       = gart_unmap_sg,
+       .alloc_coherent                 = gart_alloc_coherent,
 };
 
 void gart_iommu_shutdown(void)