#if NIOAPIC > 0
+
/*
- * Can only match on ACPI global interrupt numbers if the ACPI
- * interrupt info was extracted, which is in the ACPI case.
+ * Apply any MADT override setting.
*/
- if (mpacpi_sci_override != NULL) {
- pic = mpacpi_sci_override->ioapic;
- pin = mpacpi_sci_override->ioapic_pin;
- if (mpacpi_sci_override->redir & IOAPIC_REDLO_LEVEL)
- trigger = IST_LEVEL;
- else
- trigger = IST_EDGE;
- if (pic->pic_type == PIC_IOAPIC)
- irq = -1;
- else
- irq = (int)InterruptNumber;
- goto sci_override;
+
+ ovr.irq = InterruptNumber;
+ ovr.pin = -1;
+ if (acpi_madt_map() == AE_OK) {
+ acpi_madt_walk(acpi_md_findoverride, &ovr);
+ acpi_madt_unmap();
+ } else {
+ aprint_debug("acpi_madt_map() failed, can't check for MADT override\n");
+ }
+
+ if (ovr.pin != -1) {
+ bool sci = InterruptNumber == AcpiGbl_FADT.SciInterrupt;
+ int polarity = ovr.flags & ACPI_MADT_POLARITY_MASK;
+ int trigger = ovr.flags & ACPI_MADT_TRIGGER_MASK;
+
+ InterruptNumber = ovr.pin;
+ if (polarity == ACPI_MADT_POLARITY_ACTIVE_HIGH ||
+ (!sci && polarity == ACPI_MADT_POLARITY_CONFORMS)) {
+ mpflags &= ~MPS_INTPO_ACTLO;
+ redir &= ~IOAPIC_REDLO_ACTLO;
+ }
+ if (trigger == ACPI_MADT_TRIGGER_EDGE ||
+ (!sci && trigger == ACPI_MADT_TRIGGER_CONFORMS)) {
+ type = IST_EDGE;
+ mpflags &= ~(MPS_INTTR_LEVEL << 2);
+ redir &= ~IOAPIC_REDLO_LEVEL;
+ }
}
-#endif
/*
- * There was no ACPI interrupt source override,
- *
- * If the interrupt is handled via IOAPIC, mark it
- * as level-triggered, active low in the table.
+ * If the interrupt is handled via IOAPIC, update the map.
+ * If the map isn't set up yet, install a temporary one.
*/