From 25f1f6f830282a667927dfefb5b91e72a5e69e6e Mon Sep 17 00:00:00 2001 From: Ian Moffett Date: Wed, 8 Oct 2025 01:10:01 -0400 Subject: kern/amd64: ioapic: Add ISA IRQ to GSI conversion Introduce a helper function to convert legacy ISA IRQ numbers to the GSI numbers assigned to an I/O APIC pin Signed-off-by: Ian Moffett --- src/sys/arch/amd64/mainbus/ioapic.c | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) (limited to 'src/sys/arch/amd64/mainbus') diff --git a/src/sys/arch/amd64/mainbus/ioapic.c b/src/sys/arch/amd64/mainbus/ioapic.c index cf65484..0d5da07 100644 --- a/src/sys/arch/amd64/mainbus/ioapic.c +++ b/src/sys/arch/amd64/mainbus/ioapic.c @@ -154,6 +154,23 @@ __irq_to_gsi(struct apic_header *hdr, size_t irq) return -1; } +/* + * Convert an IRQ to a GSI + */ +int +ioapic_get_gsi(uint8_t irq) +{ + int gsi; + + gsi = acpi_read_madt( + APIC_TYPE_INTERRUPT_OVERRIDE, + __irq_to_gsi, + irq + ); + + return (gsi < 0) ? irq : gsi; +} + /* * Mask or unmask a GSI */ @@ -168,19 +185,13 @@ ioapic_gsi_mask(uint8_t gsi, uint8_t mask) } /* - * Map a GSI to a system interrupt vector + * Map an IRQ to a system interrupt vector */ void ioapic_route_vec(uint8_t irq, uint8_t vector) { union ioapic_redentry redent; - int gsi; - - gsi = acpi_read_madt( - APIC_TYPE_INTERRUPT_OVERRIDE, - __irq_to_gsi, - irq - ); + int gsi = ioapic_get_gsi(irq); ioapic_read_redentry(&redent, gsi); redent.vector = vector; -- cgit v1.2.3