Re: [PATCH] IR: Fix kernel hang if interrupt remapping disable in BIOS
From: Cyrill Gorcunov
Date: Wed Sep 09 2009 - 04:43:13 EST
On 9/9/09, Youquan Song <youquan.song@xxxxxxxxx> wrote:
>
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 interrup
>
remapping
>
>
Signed-off-by: Youquan Song <youquan.song@xxxxxxxxx>
>
---
>
thanks, Youquan!
>
diff --git a/drivers/pci/dmar.c b/drivers/pci/dmar.c
>
index a8a4383..d943e95 100644
>
--- a/drivers/pci/dmar.c
>
+++ b/drivers/pci/dmar.c
>
@@ -1302,3 +1302,13 @@ int dmar_reenable_qi(struct intel_iommu *iommu)
>
>
return 0;
>
}
>
+
>
+/*
>
+ * Check interrupt remapping support in DMAR table description.
>
+ */
>
+int dmar_ir_support(void)
>
+{
>
+ struct acpi_table_dmar *dmar;
>
+ dmar = (struct acpi_table_dmar *)dmar_tbl;
>
+ return dmar->flags & 0x1;
>
+}
>
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;
>
>
diff --git a/include/linux/intel-iommu.h b/include/linux/intel-iommu.h
>
index 482dc91..4f0a72a 100644
>
--- a/include/linux/intel-iommu.h
>
+++ b/include/linux/intel-iommu.h
>
@@ -360,4 +360,6 @@ extern void qi_flush_dev_iotlb(struct intel_iommu
>
*iommu, u16 sid, u16 qdep,
>
>
extern int qi_submit_sync(struct qi_desc *desc, struct intel_iommu *iommu);
>
>
+extern int dmar_ir_support(void);
>
+
>
#endif
>
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at
http://vger.kernel.org/majordomo-info.html
Please read the FAQ at
http://www.tux.org/lkml/