Skip to content

Commit c24b3b3

Browse files
committed
acpi: properly configure/mask SCI interrupt
We select an unused interrupt vector. Configure/mask the SCI interrupt in IOAPIC. We send the apic end of interrupt signal. Signed-off-by: Sandro Rüegge <rueegges@ethz.ch>
1 parent c6000d0 commit c24b3b3

File tree

2 files changed

+12
-3
lines changed

2 files changed

+12
-3
lines changed

drivers/acpi/acpica/osl.c

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
#ifdef KTF_ACPICA
2626
#include <acpi_ktf.h>
2727
#include <cpu.h>
28+
#include <ioapic.h>
2829
#include <ktf.h>
2930
#include <mm/slab.h>
3031
#include <pagetable.h>
@@ -574,6 +575,8 @@ void acpi_interrupt_handler(void) {
574575
acpi_irq_handled = true;
575576
else if (ret == ACPI_INTERRUPT_NOT_HANDLED)
576577
acpi_irq_handled = false;
578+
579+
apic_EOI();
577580
}
578581

579582
ACPI_STATUS AcpiOsInstallInterruptHandler(UINT32 InterruptLevel, ACPI_OSD_HANDLER Handler,
@@ -591,10 +594,13 @@ ACPI_STATUS AcpiOsInstallInterruptHandler(UINT32 InterruptLevel, ACPI_OSD_HANDLE
591594
acpi_irq_handler = Handler;
592595
acpi_irq_context = Context;
593596

594-
set_intr_gate(&percpu->idt[acpi_irq_num], __KERN_CS, _ul(asm_interrupt_handler_acpi),
595-
GATE_DPL0, GATE_PRESENT, 1);
597+
set_intr_gate(&percpu->idt[ACPI_SCI_IRQ], __KERN_CS,
598+
_ul(asm_interrupt_handler_acpi), GATE_DPL0, GATE_PRESENT, 1);
596599
barrier();
597600

601+
configure_irq(acpi_irq_num, ACPI_SCI_IRQ, IOAPIC_DEST_MODE_PHYSICAL, cpu->id,
602+
IOAPIC_POLARITY_AL, IOAPIC_TRIGGER_MODE_LEVEL);
603+
598604
acpi_irq_installed = true;
599605
return AE_OK;
600606
}
@@ -613,6 +619,9 @@ ACPI_STATUS AcpiOsRemoveInterruptHandler(UINT32 InterruptLevel,
613619
if (Handler != _ptr(get_intr_handler(&percpu->idt[acpi_irq_num])))
614620
return AE_BAD_PARAMETER;
615621

622+
mask_irq(acpi_irq_num);
623+
624+
barrier();
616625
set_intr_gate(&percpu->idt[acpi_irq_num], __KERN_CS, _ul(NULL), GATE_DPL0,
617626
GATE_NOT_PRESENT, 0);
618627
barrier();

include/acpi_ktf.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -275,7 +275,7 @@ extern int init_acpi(void);
275275

276276
#include "acpi.h"
277277

278-
#define ACPI_SCI_IRQ 0x9
278+
#define ACPI_SCI_IRQ (APIC_TIMER_IRQ_VECTOR + 0x01)
279279

280280
typedef void (*acpi_subtable_parser_t)(ACPI_SUBTABLE_HEADER *entry, void *arg);
281281

0 commit comments

Comments
 (0)