Merge branch 'linus' into percpu-cpumask-x86-for-linus-2
[safe/jmp/linux-2.6] / arch / x86 / kernel / pci-dma.c
index 0a1408a..b254285 100644 (file)
@@ -6,6 +6,7 @@
 #include <asm/proto.h>
 #include <asm/dma.h>
 #include <asm/iommu.h>
+#include <asm/gart.h>
 #include <asm/calgary.h>
 #include <asm/amd_iommu.h>
 
@@ -30,11 +31,6 @@ int no_iommu __read_mostly;
 /* Set this to 1 if there is a HW IOMMU in the system */
 int iommu_detected __read_mostly = 0;
 
-/* This tells the BIO block layer to assume merging. Default to off
-   because we cannot guarantee merging later. */
-int iommu_bio_merge __read_mostly = 0;
-EXPORT_SYMBOL(iommu_bio_merge);
-
 dma_addr_t bad_dma_address __read_mostly = 0;
 EXPORT_SYMBOL(bad_dma_address);
 
@@ -42,7 +38,7 @@ EXPORT_SYMBOL(bad_dma_address);
    be probably a smaller DMA mask, but this is bug-to-bug compatible
    to older i386. */
 struct device x86_dma_fallback_dev = {
-       .bus_id = "fallback device",
+       .init_name = "fallback device",
        .coherent_dma_mask = DMA_32BIT_MASK,
        .dma_mask = &x86_dma_fallback_dev.coherent_dma_mask,
 };
@@ -83,7 +79,7 @@ void __init dma32_reserve_bootmem(void)
         * using 512M as goal
         */
        align = 64ULL<<20;
-       size = round_up(dma32_bootmem_size, align);
+       size = roundup(dma32_bootmem_size, align);
        dma32_bootmem_ptr = __alloc_bootmem_nopanic(size, align,
                                 512ULL<<20);
        if (dma32_bootmem_ptr)
@@ -105,11 +101,15 @@ static void __init dma32_free_bootmem(void)
        dma32_bootmem_ptr = NULL;
        dma32_bootmem_size = 0;
 }
+#endif
 
 void __init pci_iommu_alloc(void)
 {
+#ifdef CONFIG_X86_64
        /* free the range so iommu could get some range less than 4G */
        dma32_free_bootmem();
+#endif
+
        /*
         * The order of these functions is important for
         * fall-back/fail-over reasons
@@ -125,14 +125,36 @@ void __init pci_iommu_alloc(void)
        pci_swiotlb_init();
 }
 
-unsigned long iommu_num_pages(unsigned long addr, unsigned long len)
+void *dma_generic_alloc_coherent(struct device *dev, size_t size,
+                                dma_addr_t *dma_addr, gfp_t flag)
 {
-       unsigned long size = roundup((addr & ~PAGE_MASK) + len, PAGE_SIZE);
+       unsigned long dma_mask;
+       struct page *page;
+       dma_addr_t addr;
+
+       dma_mask = dma_alloc_coherent_mask(dev, flag);
+
+       flag |= __GFP_ZERO;
+again:
+       page = alloc_pages_node(dev_to_node(dev), flag, get_order(size));
+       if (!page)
+               return NULL;
 
-       return size >> PAGE_SHIFT;
+       addr = page_to_phys(page);
+       if (!is_buffer_dma_capable(dma_mask, addr, size)) {
+               __free_pages(page, get_order(size));
+
+               if (dma_mask < DMA_32BIT_MASK && !(flag & GFP_DMA)) {
+                       flag = (flag & ~GFP_DMA32) | GFP_DMA;
+                       goto again;
+               }
+
+               return NULL;
+       }
+
+       *dma_addr = addr;
+       return page_address(page);
 }
-EXPORT_SYMBOL(iommu_num_pages);
-#endif
 
 /*
  * See <Documentation/x86_64/boot-options.txt> for the iommu kernel parameter
@@ -157,7 +179,6 @@ static __init int iommu_setup(char *p)
                }
 
                if (!strncmp(p, "biomerge", 8)) {
-                       iommu_bio_merge = 4096;
                        iommu_merge = 1;
                        force_iommu = 1;
                }
@@ -269,8 +290,8 @@ fs_initcall(pci_iommu_init);
 static __devinit void via_no_dac(struct pci_dev *dev)
 {
        if ((dev->class >> 8) == PCI_CLASS_BRIDGE_PCI && forbid_dac == 0) {
-               printk(KERN_INFO "PCI: VIA PCI bridge detected."
-                                "Disabling DAC.\n");
+               printk(KERN_INFO
+                       "PCI: VIA PCI bridge detected. Disabling DAC.\n");
                forbid_dac = 1;
        }
 }