The HPET hardlockup detector requires that the HPET timer delivers the
interrupt as NMI. When interrupt remapping is disabled, this can be
done by programming the HPET MSI registers directly. With interrupt
remapping, it is necessary to populate an entry in the interrupt
remapping table.

In x86 there is not an IRQF_NMI flag that can be used to indicate the
delivery mode when requesting an interrupt (via request_irq()). Thus,
there is no way for the interrupt remapping driver to know and set
the delivery mode.

Hence, when allocating an interrupt, check if such interrupt belongs to
the HPET hardlockup detector and fixup the delivery mode accordingly.

Cc: Andi Kleen <[email protected]>
Cc: Borislav Petkov <[email protected]>
Cc: David Woodhouse <[email protected]> (supporter:INTEL IOMMU (VT-d))
Cc: "Ravi V. Shankar" <[email protected]>
Cc: Ingo Molnar <[email protected]>
Cc: Jacob Pan <[email protected]>
Cc: Lu Baolu <[email protected]> (supporter:INTEL IOMMU (VT-d))
Cc: Stephane Eranian <[email protected]>
Cc: Thomas Gleixner <[email protected]>
Cc: [email protected] (open list:INTEL IOMMU (VT-d))
Cc: [email protected]
Reviewed-by: Ashok Raj <[email protected]>
Signed-off-by: Ricardo Neri <[email protected]>
---
Changes since v4:
 * Introduced this patch.

Changes since v3:
 * N/A

Changes since v2:
 * N/A

Changes since v1:
 * N/A
---
 drivers/iommu/intel/irq_remapping.c | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/drivers/iommu/intel/irq_remapping.c 
b/drivers/iommu/intel/irq_remapping.c
index daa5df53db59..b07c68ecac01 100644
--- a/drivers/iommu/intel/irq_remapping.c
+++ b/drivers/iommu/intel/irq_remapping.c
@@ -18,6 +18,7 @@
 #include <asm/apic.h>
 #include <asm/smp.h>
 #include <asm/cpu.h>
+#include <asm/hpet.h>
 #include <asm/irq_remapping.h>
 #include <asm/pci-direct.h>
 
@@ -1376,6 +1377,14 @@ static int intel_irq_remapping_alloc(struct irq_domain 
*domain,
                irq_data->hwirq = (index << 16) + i;
                irq_data->chip_data = ird;
                irq_data->chip = &intel_ir_chip;
+
+               /*
+                * If we find the HPET hardlockup detector irq, fixup the
+                * delivery mode.
+                */
+               if (is_hpet_irq_hardlockup_detector(info))
+                       irq_cfg->delivery_mode = APIC_DELIVERY_MODE_NMI;
+
                intel_irq_remapping_prepare_irte(ird, irq_cfg, info, index, i);
                irq_set_status_flags(virq + i, IRQ_MOVE_PCNTXT);
        }
-- 
2.17.1

_______________________________________________
iommu mailing list
[email protected]
https://lists.linuxfoundation.org/mailman/listinfo/iommu

Reply via email to