Message ID | 1344432423-26495-1-git-send-email-seth.forshee@canonical.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Wed, Aug 8, 2012 at 6:27 AM, Seth Forshee <seth.forshee@canonical.com> wrote: > The ACPI tables in the Macbook Air 5,1 define a single IOAPIC with id 2, > but the only remapping unit described in the DMAR table matches id 0. > Interrupt remapping fails as a result, and the kernel panics with the > message "timer doesn't work through Interrupt-remapped IO-APIC." > > To fix this, check each IOAPIC for a corresponding IOMMU. If an IOMMU is > not found, do not allow IRQ remapping to be enabled. > > v2: Move check to parse_ioapics_under_ir(), raise log level to KERN_ERR, > and add FW_BUG to the log message > v3: Skip check if IOMMU doesn't support interrupt remapping and remove > existing check that the IOMMU count equals the IOAPIC count > Acked-by: Yinghai Lu <yinghai@kernel.org> -- To unsubscribe from this list: send the line "unsubscribe linux-acpi" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Wed, Aug 08, 2012 at 10:57:06AM -0700, Yinghai Lu wrote: > On Wed, Aug 8, 2012 at 6:27 AM, Seth Forshee <seth.forshee@canonical.com> wrote: > > The ACPI tables in the Macbook Air 5,1 define a single IOAPIC with id 2, > > but the only remapping unit described in the DMAR table matches id 0. > > Interrupt remapping fails as a result, and the kernel panics with the > > message "timer doesn't work through Interrupt-remapped IO-APIC." > > > > To fix this, check each IOAPIC for a corresponding IOMMU. If an IOMMU is > > not found, do not allow IRQ remapping to be enabled. > > > > v2: Move check to parse_ioapics_under_ir(), raise log level to KERN_ERR, > > and add FW_BUG to the log message > > v3: Skip check if IOMMU doesn't support interrupt remapping and remove > > existing check that the IOMMU count equals the IOAPIC count > > > > Acked-by: Yinghai Lu <yinghai@kernel.org> Thanks! I'm not sure whose tree this goes through, but it occurred to me that it might be good to get this fixed in the stable kernels as well. Whoever applies the patch might consider adding a Cc for stable, otherwise I can submit it after it hits Linus's tree. Thanks, Seth -- To unsubscribe from this list: send the line "unsubscribe linux-acpi" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Wed, Aug 08, 2012 at 08:27:03AM -0500, Seth Forshee wrote: > The ACPI tables in the Macbook Air 5,1 define a single IOAPIC with id 2, > but the only remapping unit described in the DMAR table matches id 0. > Interrupt remapping fails as a result, and the kernel panics with the > message "timer doesn't work through Interrupt-remapped IO-APIC." > > To fix this, check each IOAPIC for a corresponding IOMMU. If an IOMMU is > not found, do not allow IRQ remapping to be enabled. > > v2: Move check to parse_ioapics_under_ir(), raise log level to KERN_ERR, > and add FW_BUG to the log message > v3: Skip check if IOMMU doesn't support interrupt remapping and remove > existing check that the IOMMU count equals the IOAPIC count > > Acked-by: Suresh Siddha <suresh.b.siddha@intel.com> > Signed-off-by: Seth Forshee <seth.forshee@canonical.com> > --- > drivers/iommu/intel_irq_remapping.c | 18 +++++++++++++----- > 1 file changed, 13 insertions(+), 5 deletions(-) Applied to iommu/fixes, thanks. -- To unsubscribe from this list: send the line "unsubscribe linux-acpi" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/iommu/intel_irq_remapping.c b/drivers/iommu/intel_irq_remapping.c index e0b18f3..af8904d 100644 --- a/drivers/iommu/intel_irq_remapping.c +++ b/drivers/iommu/intel_irq_remapping.c @@ -736,6 +736,7 @@ int __init parse_ioapics_under_ir(void) { struct dmar_drhd_unit *drhd; int ir_supported = 0; + int ioapic_idx; for_each_drhd_unit(drhd) { struct intel_iommu *iommu = drhd->iommu; @@ -748,13 +749,20 @@ int __init parse_ioapics_under_ir(void) } } - if (ir_supported && ir_ioapic_num != nr_ioapics) { - printk(KERN_WARNING - "Not all IO-APIC's listed under remapping hardware\n"); - return -1; + if (!ir_supported) + return 0; + + for (ioapic_idx = 0; ioapic_idx < nr_ioapics; ioapic_idx++) { + int ioapic_id = mpc_ioapic_id(ioapic_idx); + if (!map_ioapic_to_ir(ioapic_id)) { + pr_err(FW_BUG "ioapic %d has no mapping iommu, " + "interrupt remapping will be disabled\n", + ioapic_id); + return -1; + } } - return ir_supported; + return 1; } int __init ir_dev_scope_init(void)