foc: Extend irq mode heuristics

Explicitly set default mode for legacy interrupts to not rely on kernel
default settings. This patch fixes the constantly busy IRQ threads for
IRQ 1 and 12 as soon as the PS/2 driver was loaded until the point when
the first IRQ occurred.
This commit is contained in:
Norman Feske 2013-03-14 17:39:09 +01:00
parent 91b0578446
commit 171aa332b7
1 changed files with 20 additions and 15 deletions

View File

@ -51,24 +51,29 @@ void Genode::Platform::setup_irq_mode(unsigned irq_number, unsigned trigger,
{
using namespace Fiasco;
/* don't touch anything below IRQ 16 in the default case */
if (irq_number < 16 && trigger == Irq_session::TRIGGER_UNCHANGED &&
polarity == Irq_session::TRIGGER_UNCHANGED)
return;
/*
* Translate ACPI interrupt mode (trigger/polarity) to Fiasco APIC
* values. Default is level low for IRQs > 15
*/
l4_umword_t mode;
mode = (trigger == Irq_session::TRIGGER_LEVEL) ||
(irq_number > 15 && trigger == Irq_session::TRIGGER_UNCHANGED)
? L4_IRQ_F_LEVEL : L4_IRQ_F_EDGE;
mode |= (polarity == Irq_session::POLARITY_LOW) ||
(irq_number > 15 && polarity == Irq_session::POLARITY_UNCHANGED)
? L4_IRQ_F_NEG : L4_IRQ_F_POS;
/* set edge-high as default for legacy interrupts */
if (irq_number < 16
&& trigger == Irq_session::TRIGGER_UNCHANGED
&& polarity == Irq_session::TRIGGER_UNCHANGED) {
mode = L4_IRQ_F_POS_EDGE;
} else {
/*
* Translate ACPI interrupt mode (trigger/polarity) to Fiasco APIC
* values. Default is level low for IRQs > 15
*/
mode = (trigger == Irq_session::TRIGGER_LEVEL) ||
(irq_number > 15 && trigger == Irq_session::TRIGGER_UNCHANGED)
? L4_IRQ_F_LEVEL : L4_IRQ_F_EDGE;
mode |= (polarity == Irq_session::POLARITY_LOW) ||
(irq_number > 15 && polarity == Irq_session::POLARITY_UNCHANGED)
? L4_IRQ_F_NEG : L4_IRQ_F_POS;
}
/*
* Set mode