diff options
author | David Woodhouse <David.Woodhouse@intel.com> | 2009-07-04 05:59:46 -0400 |
---|---|---|
committer | David Woodhouse <David.Woodhouse@intel.com> | 2009-07-04 05:59:46 -0400 |
commit | 62edf5dc4a524e4cb525e6020b955a1ad593d9ba (patch) | |
tree | e811a942b7661fc9e97f1611ee75e7f125d51365 | |
parent | 40e4aa34324bff3938a900014254f88943d05e15 (diff) |
intel-iommu: Restore DMAR_BROKEN_GFX_WA option for broken graphics drivers
We need to give people a little more time to fix the broken drivers.
Re-introduce this, but tied in properly with the 'iommu=pt' support this
time. Change the config option name and make it default to 'no' too.
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
-rw-r--r-- | arch/x86/Kconfig | 12 | ||||
-rw-r--r-- | drivers/pci/intel-iommu.c | 29 |
2 files changed, 31 insertions, 10 deletions
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index c07f72205909..738bdc6b0f8b 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig | |||
@@ -1913,6 +1913,18 @@ config DMAR_DEFAULT_ON | |||
1913 | recommended you say N here while the DMAR code remains | 1913 | recommended you say N here while the DMAR code remains |
1914 | experimental. | 1914 | experimental. |
1915 | 1915 | ||
1916 | config DMAR_BROKEN_GFX_WA | ||
1917 | def_bool n | ||
1918 | prompt "Workaround broken graphics drivers (going away soon)" | ||
1919 | depends on DMAR | ||
1920 | ---help--- | ||
1921 | Current Graphics drivers tend to use physical address | ||
1922 | for DMA and avoid using DMA APIs. Setting this config | ||
1923 | option permits the IOMMU driver to set a unity map for | ||
1924 | all the OS-visible memory. Hence the driver can continue | ||
1925 | to use physical addresses for DMA, at least until this | ||
1926 | option is removed in the 2.6.32 kernel. | ||
1927 | |||
1916 | config DMAR_FLOPPY_WA | 1928 | config DMAR_FLOPPY_WA |
1917 | def_bool y | 1929 | def_bool y |
1918 | depends on DMAR | 1930 | depends on DMAR |
diff --git a/drivers/pci/intel-iommu.c b/drivers/pci/intel-iommu.c index ae5ccdf8b19f..5ee8305257ea 100644 --- a/drivers/pci/intel-iommu.c +++ b/drivers/pci/intel-iommu.c | |||
@@ -2127,16 +2127,18 @@ static int iommu_prepare_static_identity_mapping(void) | |||
2127 | return -EFAULT; | 2127 | return -EFAULT; |
2128 | 2128 | ||
2129 | for_each_pci_dev(pdev) { | 2129 | for_each_pci_dev(pdev) { |
2130 | printk(KERN_INFO "IOMMU: identity mapping for device %s\n", | 2130 | if (iommu_identity_mapping == 1 || IS_GFX_DEVICE(pdev)) { |
2131 | pci_name(pdev)); | 2131 | printk(KERN_INFO "IOMMU: identity mapping for device %s\n", |
2132 | pci_name(pdev)); | ||
2132 | 2133 | ||
2133 | ret = domain_context_mapping(si_domain, pdev, | 2134 | ret = domain_context_mapping(si_domain, pdev, |
2134 | CONTEXT_TT_MULTI_LEVEL); | 2135 | CONTEXT_TT_MULTI_LEVEL); |
2135 | if (ret) | 2136 | if (ret) |
2136 | return ret; | 2137 | return ret; |
2137 | ret = domain_add_dev_info(si_domain, pdev); | 2138 | ret = domain_add_dev_info(si_domain, pdev); |
2138 | if (ret) | 2139 | if (ret) |
2139 | return ret; | 2140 | return ret; |
2141 | } | ||
2140 | } | 2142 | } |
2141 | 2143 | ||
2142 | return 0; | 2144 | return 0; |
@@ -2291,6 +2293,10 @@ int __init init_dmars(void) | |||
2291 | * identity mapping if iommu_identity_mapping is set. | 2293 | * identity mapping if iommu_identity_mapping is set. |
2292 | */ | 2294 | */ |
2293 | if (!iommu_pass_through) { | 2295 | if (!iommu_pass_through) { |
2296 | #ifdef CONFIG_DMAR_BROKEN_GFX_WA | ||
2297 | if (!iommu_identity_mapping) | ||
2298 | iommu_identity_mapping = 2; | ||
2299 | #endif | ||
2294 | if (iommu_identity_mapping) | 2300 | if (iommu_identity_mapping) |
2295 | iommu_prepare_static_identity_mapping(); | 2301 | iommu_prepare_static_identity_mapping(); |
2296 | /* | 2302 | /* |
@@ -2444,7 +2450,10 @@ static int iommu_dummy(struct pci_dev *pdev) | |||
2444 | 2450 | ||
2445 | static int iommu_should_identity_map(struct pci_dev *pdev) | 2451 | static int iommu_should_identity_map(struct pci_dev *pdev) |
2446 | { | 2452 | { |
2447 | return pdev->dma_mask > DMA_BIT_MASK(32); | 2453 | if (iommu_identity_mapping == 2) |
2454 | return IS_GFX_DEVICE(pdev); | ||
2455 | else | ||
2456 | return pdev->dma_mask > DMA_BIT_MASK(32); | ||
2448 | } | 2457 | } |
2449 | 2458 | ||
2450 | /* Check if the pdev needs to go through non-identity map and unmap process.*/ | 2459 | /* Check if the pdev needs to go through non-identity map and unmap process.*/ |