summaryrefslogtreecommitdiff
path: root/src/sys/arch/amd64/mainbus
diff options
context:
space:
mode:
Diffstat (limited to 'src/sys/arch/amd64/mainbus')
-rw-r--r--src/sys/arch/amd64/mainbus/ioapic.c27
1 files changed, 19 insertions, 8 deletions
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
@@ -155,6 +155,23 @@ __irq_to_gsi(struct apic_header *hdr, size_t irq)
}
/*
+ * 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
*/
void
@@ -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;