Commit 8d4f6b93 authored by Jon Mason's avatar Jon Mason Committed by Linus Torvalds

[PATCH] x86_64: Calgary IOMMU - introduce iommu_detected

swiotlb relies on the gart specific iommu_aperture variable to know if
we discovered a hardware IOMMU before swiotlb initialization.  Introduce
iommu_detected to do the same thing, but in a HW IOMMU neutral manner,
in preparation for adding the Calgary HW IOMMU.
Signed-Off-By: default avatarMuli Ben-Yehuda <muli@il.ibm.com>
Signed-Off-By: default avatarJon Mason <jdmason@us.ibm.com>
Signed-off-by: default avatarAndi Kleen <ak@suse.de>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 2bbc419f
...@@ -209,6 +209,7 @@ void __init iommu_hole_init(void) ...@@ -209,6 +209,7 @@ void __init iommu_hole_init(void)
if (!early_is_k8_nb(read_pci_config(0, num, 3, 0x00))) if (!early_is_k8_nb(read_pci_config(0, num, 3, 0x00)))
continue; continue;
iommu_detected = 1;
iommu_aperture = 1; iommu_aperture = 1;
aper_order = (read_pci_config(0, num, 3, 0x90) >> 1) & 7; aper_order = (read_pci_config(0, num, 3, 0x90) >> 1) & 7;
......
...@@ -33,6 +33,9 @@ int panic_on_overflow __read_mostly = 0; ...@@ -33,6 +33,9 @@ int panic_on_overflow __read_mostly = 0;
int force_iommu __read_mostly= 0; int force_iommu __read_mostly= 0;
#endif #endif
/* Set this to 1 if there is a HW IOMMU in the system */
int iommu_detected __read_mostly = 0;
/* Dummy device used for NULL arguments (normally ISA). Better would /* Dummy device used for NULL arguments (normally ISA). Better would
be probably a smaller DMA mask, but this is bug-to-bug compatible be probably a smaller DMA mask, but this is bug-to-bug compatible
to i386. */ to i386. */
......
...@@ -597,6 +597,10 @@ static int __init pci_iommu_init(void) ...@@ -597,6 +597,10 @@ static int __init pci_iommu_init(void)
if (swiotlb) if (swiotlb)
return -ENODEV; return -ENODEV;
/* Did we detect a different HW IOMMU? */
if (iommu_detected && !iommu_aperture)
return -1;
if (no_iommu || if (no_iommu ||
(!force_iommu && end_pfn <= MAX_DMA32_PFN) || (!force_iommu && end_pfn <= MAX_DMA32_PFN) ||
!iommu_aperture || !iommu_aperture ||
......
...@@ -31,7 +31,7 @@ struct dma_mapping_ops swiotlb_dma_ops = { ...@@ -31,7 +31,7 @@ struct dma_mapping_ops swiotlb_dma_ops = {
void pci_swiotlb_init(void) void pci_swiotlb_init(void)
{ {
/* don't initialize swiotlb if iommu=off (no_iommu=1) */ /* don't initialize swiotlb if iommu=off (no_iommu=1) */
if (!iommu_aperture && !no_iommu && if (!iommu_detected && !no_iommu &&
(end_pfn > MAX_DMA32_PFN || force_iommu)) (end_pfn > MAX_DMA32_PFN || force_iommu))
swiotlb = 1; swiotlb = 1;
if (swiotlb) { if (swiotlb) {
......
...@@ -116,6 +116,7 @@ extern int skip_ioapic_setup; ...@@ -116,6 +116,7 @@ extern int skip_ioapic_setup;
extern int acpi_ht; extern int acpi_ht;
extern int acpi_disabled; extern int acpi_disabled;
extern int iommu_detected;
#ifdef CONFIG_IOMMU #ifdef CONFIG_IOMMU
extern int fallback_aper_order; extern int fallback_aper_order;
extern int fallback_aper_force; extern int fallback_aper_force;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment