aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86
diff options
context:
space:
mode:
authorJoerg Roedel <joerg.roedel@amd.com>2008-08-19 10:32:39 -0400
committerIngo Molnar <mingo@elte.hu>2008-08-22 02:33:55 -0400
commit94581094e774402a11887719bac10505236c2d51 (patch)
treef055baffe63a836ae20a4f7783e92e5982bf3292 /arch/x86
parent1fca25427482387689fa27594c992a961d98768f (diff)
x86: add alloc_coherent dma_ops callback to GART driver
[ 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>
Diffstat (limited to 'arch/x86')
-rw-r--r--arch/x86/kernel/pci-gart_64.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/arch/x86/kernel/pci-gart_64.c b/arch/x86/kernel/pci-gart_64.c
index 49285f8fd4d5..076e64b2d4f3 100644
--- a/arch/x86/kernel/pci-gart_64.c
+++ b/arch/x86/kernel/pci-gart_64.c
@@ -499,6 +499,26 @@ error:
499 return 0; 499 return 0;
500} 500}
501 501
502/* allocate and map a coherent mapping */
503static void *
504gart_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_addr,
505 gfp_t flag)
506{
507 void *vaddr;
508
509 vaddr = (void *)__get_free_pages(flag | __GFP_ZERO, get_order(size));
510 if (!vaddr)
511 return NULL;
512
513 *dma_addr = gart_map_single(dev, __pa(vaddr), size, DMA_BIDIRECTIONAL);
514 if (*dma_addr != bad_dma_address)
515 return vaddr;
516
517 free_pages((unsigned long)vaddr, get_order(size));
518
519 return NULL;
520}
521
502static int no_agp; 522static int no_agp;
503 523
504static __init unsigned long check_iommu_size(unsigned long aper, u64 aper_size) 524static __init unsigned long check_iommu_size(unsigned long aper, u64 aper_size)
@@ -701,6 +721,7 @@ static struct dma_mapping_ops gart_dma_ops = {
701 .sync_sg_for_device = NULL, 721 .sync_sg_for_device = NULL,
702 .map_sg = gart_map_sg, 722 .map_sg = gart_map_sg,
703 .unmap_sg = gart_unmap_sg, 723 .unmap_sg = gart_unmap_sg,
724 .alloc_coherent = gart_alloc_coherent,
704}; 725};
705 726
706void gart_iommu_shutdown(void) 727void gart_iommu_shutdown(void)