summaryrefslogtreecommitdiff
path: root/src/arch
diff options
context:
space:
mode:
authorKyösti Mälkki <kyosti.malkki@gmail.com>2021-06-08 11:28:25 +0300
committerKyösti Mälkki <kyosti.malkki@gmail.com>2022-11-10 19:08:57 +0000
commit0ea8f89e4095f82de0562142968e81d9588b2b7b (patch)
treedd6f87b82db80d43b4236d87d09095ab804ee3dc /src/arch
parentc7da027e75a9623157b6375d86162ab862846628 (diff)
arch/x86: Add register_new_ioapic()
Using this I/O APIC IDs will be assigned incrementally in the order of calling. I/O APIC ID #0 is reserved for the I/O APIC delivering GSI #0. Change-Id: I6493dc3b4fa542e81f80bb0355eac6dad30b93ec Signed-off-by: Kyösti Mälkki <kyosti.malkki@gmail.com> Reviewed-on: https://review.coreboot.org/c/coreboot/+/55313 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Arthur Heymans <arthur@aheymans.xyz>
Diffstat (limited to 'src/arch')
-rw-r--r--src/arch/x86/include/arch/ioapic.h2
-rw-r--r--src/arch/x86/ioapic.c13
2 files changed, 15 insertions, 0 deletions
diff --git a/src/arch/x86/include/arch/ioapic.h b/src/arch/x86/include/arch/ioapic.h
index 9e524e250f..288f54cefc 100644
--- a/src/arch/x86/include/arch/ioapic.h
+++ b/src/arch/x86/include/arch/ioapic.h
@@ -37,6 +37,8 @@ void ioapic_set_max_vectors(void *ioapic_base, int mre_count);
void ioapic_lock_max_vectors(void *ioapic_base);
void setup_ioapic(void *ioapic_base, u8 ioapic_id);
+void register_new_ioapic(void *ioapic_base);
+void register_new_ioapic_gsi0(void *ioapic_base);
void ioapic_set_boot_config(void *ioapic_base, bool irq_on_fsb);
#endif
diff --git a/src/arch/x86/ioapic.c b/src/arch/x86/ioapic.c
index d65637c662..1440bb4331 100644
--- a/src/arch/x86/ioapic.c
+++ b/src/arch/x86/ioapic.c
@@ -163,3 +163,16 @@ void setup_ioapic(void *ioapic_base, u8 ioapic_id)
clear_vectors(ioapic_base, 0, ioapic_get_max_vectors(ioapic_base) - 1);
route_i8259_irq0(ioapic_base);
}
+
+void register_new_ioapic_gsi0(void *ioapic_base)
+{
+ setup_ioapic(ioapic_base, 0);
+}
+
+void register_new_ioapic(void *ioapic_base)
+{
+ static u8 ioapic_id;
+ ioapic_id++;
+ set_ioapic_id(ioapic_base, ioapic_id);
+ clear_vectors(ioapic_base, 0, ioapic_get_max_vectors(ioapic_base) - 1);
+}