diff options
Diffstat (limited to 'arch/x86_64/kernel/pci-gart.c')
-rw-r--r-- | arch/x86_64/kernel/pci-gart.c | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/arch/x86_64/kernel/pci-gart.c b/arch/x86_64/kernel/pci-gart.c index c37fc7726ba6..2fe23a6c361b 100644 --- a/arch/x86_64/kernel/pci-gart.c +++ b/arch/x86_64/kernel/pci-gart.c | |||
@@ -457,9 +457,12 @@ int gart_map_sg(struct device *dev, struct scatterlist *sg, int nents, int dir) | |||
457 | error: | 457 | error: |
458 | flush_gart(NULL); | 458 | flush_gart(NULL); |
459 | gart_unmap_sg(dev, sg, nents, dir); | 459 | gart_unmap_sg(dev, sg, nents, dir); |
460 | /* When it was forced try again unforced */ | 460 | /* When it was forced or merged try again in a dumb way */ |
461 | if (force_iommu) | 461 | if (force_iommu || iommu_merge) { |
462 | return dma_map_sg_nonforce(dev, sg, nents, dir); | 462 | out = dma_map_sg_nonforce(dev, sg, nents, dir); |
463 | if (out > 0) | ||
464 | return out; | ||
465 | } | ||
463 | if (panic_on_overflow) | 466 | if (panic_on_overflow) |
464 | panic("dma_map_sg: overflow on %lu pages\n", pages); | 467 | panic("dma_map_sg: overflow on %lu pages\n", pages); |
465 | iommu_full(dev, pages << PAGE_SHIFT, dir); | 468 | iommu_full(dev, pages << PAGE_SHIFT, dir); |
@@ -642,9 +645,18 @@ static int __init pci_iommu_init(void) | |||
642 | (no_agp && init_k8_gatt(&info) < 0)) { | 645 | (no_agp && init_k8_gatt(&info) < 0)) { |
643 | no_iommu = 1; | 646 | no_iommu = 1; |
644 | no_iommu_init(); | 647 | no_iommu_init(); |
648 | printk(KERN_INFO "PCI-DMA: Disabling IOMMU.\n"); | ||
649 | if (end_pfn > MAX_DMA32_PFN) { | ||
650 | printk(KERN_ERR "WARNING more than 4GB of memory " | ||
651 | "but IOMMU not compiled in.\n" | ||
652 | KERN_ERR "WARNING 32bit PCI may malfunction.\n" | ||
653 | KERN_ERR "You might want to enable " | ||
654 | "CONFIG_GART_IOMMU\n"); | ||
655 | } | ||
645 | return -1; | 656 | return -1; |
646 | } | 657 | } |
647 | 658 | ||
659 | printk(KERN_INFO "PCI-DMA: using GART IOMMU.\n"); | ||
648 | aper_size = info.aper_size * 1024 * 1024; | 660 | aper_size = info.aper_size * 1024 * 1024; |
649 | iommu_size = check_iommu_size(info.aper_base, aper_size); | 661 | iommu_size = check_iommu_size(info.aper_base, aper_size); |
650 | iommu_pages = iommu_size >> PAGE_SHIFT; | 662 | iommu_pages = iommu_size >> PAGE_SHIFT; |
@@ -718,7 +730,6 @@ static int __init pci_iommu_init(void) | |||
718 | 730 | ||
719 | flush_gart(NULL); | 731 | flush_gart(NULL); |
720 | 732 | ||
721 | printk(KERN_INFO "PCI-DMA: using GART IOMMU.\n"); | ||
722 | dma_ops = &gart_dma_ops; | 733 | dma_ops = &gart_dma_ops; |
723 | 734 | ||
724 | return 0; | 735 | return 0; |