aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pci/intr_remapping.c
diff options
context:
space:
mode:
authorYouquan Song <youquan.song@intel.com>2009-09-09 12:05:39 -0400
committerDavid Woodhouse <David.Woodhouse@intel.com>2009-09-11 16:40:10 +0100
commit074835f0143b83845af5044af2739c52c9f53808 (patch)
treef573860163fda805b97656f7bc400f148179e1a9 /drivers/pci/intr_remapping.c
parente936d0773df172ec8600777fdd72bbc1f75f22ad (diff)
downloadkernel_samsung_smdk4412-074835f0143b83845af5044af2739c52c9f53808.zip
kernel_samsung_smdk4412-074835f0143b83845af5044af2739c52c9f53808.tar.gz
kernel_samsung_smdk4412-074835f0143b83845af5044af2739c52c9f53808.tar.bz2
intel-iommu: Fix kernel hang if interrupt remapping disabled in BIOS
BIOS clear DMAR table INTR_REMAP flag to disable interrupt remapping. Current kernel only check interrupt remapping(IR) flag in DRHD's extended capability register to decide interrupt remapping support or not. But IR flag will not change when BIOS disable/enable interrupt remapping. When user disable interrupt remapping in BIOS or BIOS often defaultly disable interrupt remapping feature when BIOS is not mature.Though BIOS disable interrupt remapping but intr_remapping_supported function will always report to OS support interrupt remapping if VT-d2 chipset populated. On this cases, kernel will continue enable interrupt remapping and result kernel panic. This bug exist on almost all platforms with interrupt remapping support. This patch add DMAR table INTR_REMAP flag check before enable interrupt remapping. Signed-off-by: Youquan Song <youquan.song@intel.com> Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
Diffstat (limited to 'drivers/pci/intr_remapping.c')
-rw-r--r--drivers/pci/intr_remapping.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/drivers/pci/intr_remapping.c b/drivers/pci/intr_remapping.c
index ebfa47b..ac06514 100644
--- a/drivers/pci/intr_remapping.c
+++ b/drivers/pci/intr_remapping.c
@@ -611,6 +611,9 @@ int __init intr_remapping_supported(void)
if (disable_intremap)
return 0;
+ if (!dmar_ir_support())
+ return 0;
+
for_each_drhd_unit(drhd) {
struct intel_iommu *iommu = drhd->iommu;