foc: Fix interrupt-mode handling on x86

Set level/edge high/low values correctly.

Fixes issue #830
This commit is contained in:
Sebastian Sumpf 2013-08-09 16:44:50 +02:00 committed by Norman Feske
parent 258c74db59
commit a125f7179e
1 changed files with 13 additions and 8 deletions

View File

@ -64,15 +64,20 @@ void Genode::Platform::setup_irq_mode(unsigned irq_number, unsigned trigger,
/* /*
* Translate ACPI interrupt mode (trigger/polarity) to Fiasco APIC * Translate ACPI interrupt mode (trigger/polarity) to Fiasco APIC
* values. Default is level low for IRQs > 15 * values. Default is level low
*/ */
mode = (trigger == Irq_session::TRIGGER_LEVEL) || if (trigger == Irq_session::TRIGGER_LEVEL || trigger == Irq_session::TRIGGER_UNCHANGED) {
(irq_number > 15 && trigger == Irq_session::TRIGGER_UNCHANGED) if (polarity == Irq_session::POLARITY_LOW || polarity == Irq_session::POLARITY_UNCHANGED)
? L4_IRQ_F_LEVEL : L4_IRQ_F_EDGE; mode = L4_IRQ_F_LEVEL_LOW;
else
mode |= (polarity == Irq_session::POLARITY_LOW) || mode = L4_IRQ_F_LEVEL_HIGH;
(irq_number > 15 && polarity == Irq_session::POLARITY_UNCHANGED) }
? L4_IRQ_F_NEG : L4_IRQ_F_POS; else {
if (polarity == Irq_session::POLARITY_LOW || polarity == Irq_session::POLARITY_UNCHANGED)
mode = L4_IRQ_F_NEG_EDGE;
else
mode = L4_IRQ_F_POS_EDGE;
}
} }
/* /*