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:
parent
91b0578446
commit
171aa332b7
|
@ -51,24 +51,29 @@ void Genode::Platform::setup_irq_mode(unsigned irq_number, unsigned trigger,
|
||||||
{
|
{
|
||||||
using namespace Fiasco;
|
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;
|
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) ||
|
/* set edge-high as default for legacy interrupts */
|
||||||
(irq_number > 15 && polarity == Irq_session::POLARITY_UNCHANGED)
|
if (irq_number < 16
|
||||||
? L4_IRQ_F_NEG : L4_IRQ_F_POS;
|
&& 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
|
* Set mode
|
||||||
|
|
Loading…
Reference in New Issue