diff options
author | Kyösti Mälkki <kyosti.malkki@gmail.com> | 2021-06-03 18:36:05 +0300 |
---|---|---|
committer | Kyösti Mälkki <kyosti.malkki@gmail.com> | 2021-06-07 21:01:56 +0000 |
commit | 8cc25d229fb21e0c1285239881134bf0610ec079 (patch) | |
tree | 501fed48b98643ba617ff44aeb71879d9d4e6f13 /src/arch | |
parent | 93c1eef6c15756871959cca11fab85d6b8ca8e5d (diff) |
drivers/generic/ioapic: Use arch/x86/ioapic
Change-Id: Ibfaf6693288005463e45831fe100a5052e97cf2f
Signed-off-by: Kyösti Mälkki <kyosti.malkki@gmail.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/55185
Reviewed-by: Angel Pons <th3fanbus@gmail.com>
Reviewed-by: Arthur Heymans <arthur@aheymans.xyz>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Diffstat (limited to 'src/arch')
-rw-r--r-- | src/arch/x86/include/arch/ioapic.h | 5 | ||||
-rw-r--r-- | src/arch/x86/ioapic.c | 21 |
2 files changed, 18 insertions, 8 deletions
diff --git a/src/arch/x86/include/arch/ioapic.h b/src/arch/x86/include/arch/ioapic.h index 33f15240d6..bdbcfbf415 100644 --- a/src/arch/x86/include/arch/ioapic.h +++ b/src/arch/x86/include/arch/ioapic.h @@ -9,7 +9,7 @@ #ifndef __ACPI__ -#include <stdint.h> +#include <types.h> #define ALL (0xff << 24) #define NONE (0) @@ -31,6 +31,9 @@ void io_apic_write(void *ioapic_base, u32 reg, u32 value); void set_ioapic_id(void *ioapic_base, u8 ioapic_id); void setup_ioapic(void *ioapic_base, u8 ioapic_id); void clear_ioapic(void *ioapic_base); + +void setup_ioapic_helper(void *ioapic_base, u8 ioapic_id, bool irq_on_fsb, + bool enable_virtual_wire); #endif #endif diff --git a/src/arch/x86/ioapic.c b/src/arch/x86/ioapic.c index 3b814ad834..c148534351 100644 --- a/src/arch/x86/ioapic.c +++ b/src/arch/x86/ioapic.c @@ -109,11 +109,14 @@ void set_ioapic_id(void *ioapic_base, u8 ioapic_id) } -static void load_vectors(void *ioapic_base) +void setup_ioapic_helper(void *ioapic_base, u8 ioapic_id, bool irq_on_fsb, + bool enable_virtual_wire) { - int first = 1, last; + int first = 0, last; - if (CONFIG(IOAPIC_INTERRUPTS_ON_FSB)) { + set_ioapic_id(ioapic_base, ioapic_id); + + if (irq_on_fsb) { /* * For the Pentium 4 and above APICs deliver their interrupts * on the front side bus, enable that. @@ -121,20 +124,24 @@ static void load_vectors(void *ioapic_base) printk(BIOS_DEBUG, "IOAPIC: Enabling interrupts on FSB\n"); io_apic_write(ioapic_base, 0x03, io_apic_read(ioapic_base, 0x03) | (1 << 0)); - } else if (CONFIG(IOAPIC_INTERRUPTS_ON_APIC_SERIAL_BUS)) { + } else { printk(BIOS_DEBUG, "IOAPIC: Enabling interrupts on APIC serial bus\n"); io_apic_write(ioapic_base, 0x03, 0); } - route_i8259_irq0(ioapic_base); + if (enable_virtual_wire) { + route_i8259_irq0(ioapic_base); + first = 1; + } last = ioapic_interrupt_count(ioapic_base) - 1; clear_vectors(ioapic_base, first, last); } + void setup_ioapic(void *ioapic_base, u8 ioapic_id) { - set_ioapic_id(ioapic_base, ioapic_id); - load_vectors(ioapic_base); + setup_ioapic_helper(ioapic_base, ioapic_id, + CONFIG(IOAPIC_INTERRUPTS_ON_FSB), true); } |