diff options
-rw-r--r-- | arch/x86_64/kernel/aperture.c | 1 | ||||
-rw-r--r-- | arch/x86_64/kernel/pci-dma.c | 3 | ||||
-rw-r--r-- | arch/x86_64/kernel/pci-gart.c | 4 | ||||
-rw-r--r-- | arch/x86_64/kernel/pci-swiotlb.c | 2 | ||||
-rw-r--r-- | include/asm-x86_64/proto.h | 1 |
5 files changed, 10 insertions, 1 deletions
diff --git a/arch/x86_64/kernel/aperture.c b/arch/x86_64/kernel/aperture.c index 9ea723bab16c..a195ef06ec55 100644 --- a/arch/x86_64/kernel/aperture.c +++ b/arch/x86_64/kernel/aperture.c | |||
@@ -209,6 +209,7 @@ void __init iommu_hole_init(void) | |||
209 | if (!early_is_k8_nb(read_pci_config(0, num, 3, 0x00))) | 209 | if (!early_is_k8_nb(read_pci_config(0, num, 3, 0x00))) |
210 | continue; | 210 | continue; |
211 | 211 | ||
212 | iommu_detected = 1; | ||
212 | iommu_aperture = 1; | 213 | iommu_aperture = 1; |
213 | 214 | ||
214 | aper_order = (read_pci_config(0, num, 3, 0x90) >> 1) & 7; | 215 | aper_order = (read_pci_config(0, num, 3, 0x90) >> 1) & 7; |
diff --git a/arch/x86_64/kernel/pci-dma.c b/arch/x86_64/kernel/pci-dma.c index 33926c367250..7edd1a40fab3 100644 --- a/arch/x86_64/kernel/pci-dma.c +++ b/arch/x86_64/kernel/pci-dma.c | |||
@@ -33,6 +33,9 @@ int panic_on_overflow __read_mostly = 0; | |||
33 | int force_iommu __read_mostly= 0; | 33 | int force_iommu __read_mostly= 0; |
34 | #endif | 34 | #endif |
35 | 35 | ||
36 | /* Set this to 1 if there is a HW IOMMU in the system */ | ||
37 | int iommu_detected __read_mostly = 0; | ||
38 | |||
36 | /* Dummy device used for NULL arguments (normally ISA). Better would | 39 | /* Dummy device used for NULL arguments (normally ISA). Better would |
37 | be probably a smaller DMA mask, but this is bug-to-bug compatible | 40 | be probably a smaller DMA mask, but this is bug-to-bug compatible |
38 | to i386. */ | 41 | to i386. */ |
diff --git a/arch/x86_64/kernel/pci-gart.c b/arch/x86_64/kernel/pci-gart.c index 82a346e6e2e4..4f67957d2b42 100644 --- a/arch/x86_64/kernel/pci-gart.c +++ b/arch/x86_64/kernel/pci-gart.c | |||
@@ -597,6 +597,10 @@ static int __init pci_iommu_init(void) | |||
597 | if (swiotlb) | 597 | if (swiotlb) |
598 | return -ENODEV; | 598 | return -ENODEV; |
599 | 599 | ||
600 | /* Did we detect a different HW IOMMU? */ | ||
601 | if (iommu_detected && !iommu_aperture) | ||
602 | return -1; | ||
603 | |||
600 | if (no_iommu || | 604 | if (no_iommu || |
601 | (!force_iommu && end_pfn <= MAX_DMA32_PFN) || | 605 | (!force_iommu && end_pfn <= MAX_DMA32_PFN) || |
602 | !iommu_aperture || | 606 | !iommu_aperture || |
diff --git a/arch/x86_64/kernel/pci-swiotlb.c b/arch/x86_64/kernel/pci-swiotlb.c index 990ed67896f2..ebdb77fe2057 100644 --- a/arch/x86_64/kernel/pci-swiotlb.c +++ b/arch/x86_64/kernel/pci-swiotlb.c | |||
@@ -31,7 +31,7 @@ struct dma_mapping_ops swiotlb_dma_ops = { | |||
31 | void pci_swiotlb_init(void) | 31 | void pci_swiotlb_init(void) |
32 | { | 32 | { |
33 | /* don't initialize swiotlb if iommu=off (no_iommu=1) */ | 33 | /* don't initialize swiotlb if iommu=off (no_iommu=1) */ |
34 | if (!iommu_aperture && !no_iommu && | 34 | if (!iommu_detected && !no_iommu && |
35 | (end_pfn > MAX_DMA32_PFN || force_iommu)) | 35 | (end_pfn > MAX_DMA32_PFN || force_iommu)) |
36 | swiotlb = 1; | 36 | swiotlb = 1; |
37 | if (swiotlb) { | 37 | if (swiotlb) { |
diff --git a/include/asm-x86_64/proto.h b/include/asm-x86_64/proto.h index 105476ff8039..9d3335b4e9b6 100644 --- a/include/asm-x86_64/proto.h +++ b/include/asm-x86_64/proto.h | |||
@@ -116,6 +116,7 @@ extern int skip_ioapic_setup; | |||
116 | extern int acpi_ht; | 116 | extern int acpi_ht; |
117 | extern int acpi_disabled; | 117 | extern int acpi_disabled; |
118 | 118 | ||
119 | extern int iommu_detected; | ||
119 | #ifdef CONFIG_IOMMU | 120 | #ifdef CONFIG_IOMMU |
120 | extern int fallback_aper_order; | 121 | extern int fallback_aper_order; |
121 | extern int fallback_aper_force; | 122 | extern int fallback_aper_force; |