summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKyösti Mälkki <kyosti.malkki@gmail.com>2012-01-31 17:24:12 +0200
committerStefan Reinauer <stefan.reinauer@coreboot.org>2013-02-27 00:27:45 +0100
commitdb4f875a412e6c41f48a86a79b72465f6cd81635 (patch)
treedaffc44d8ba4aabaed2a72b27912ed61c614c5db /src
parente614353194c712a40aa8444a530b2062876eabe3 (diff)
IOAPIC: Divide setup_ioapic() in two parts.
Currently some southbridge codes implement the set_ioapic_id() part locally and do not implement the load_vectors() part at all. This change allows clean-up of those southbridges without introducing changed behaviour. Change-Id: Ic5e860b9b669ecd1e9ddac4bbb92d80bdb9c2fca Signed-off-by: Kyösti Mälkki <kyosti.malkki@gmail.com> Reviewed-on: http://review.coreboot.org/300 Tested-by: build bot (Jenkins) Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
Diffstat (limited to 'src')
-rw-r--r--src/arch/x86/include/arch/ioapic.h1
-rw-r--r--src/arch/x86/lib/ioapic.c19
2 files changed, 15 insertions, 5 deletions
diff --git a/src/arch/x86/include/arch/ioapic.h b/src/arch/x86/include/arch/ioapic.h
index 01fd753bfc..b989e527b8 100644
--- a/src/arch/x86/include/arch/ioapic.h
+++ b/src/arch/x86/include/arch/ioapic.h
@@ -39,6 +39,7 @@
#define SMI (2 << 8)
#define INT (1 << 8)
+void set_ioapic_id(u32 ioapic_base, u8 ioapic_id);
void setup_ioapic(u32 ioapic_base, u8 ioapic_id);
void clear_ioapic(u32 ioapic_base);
#endif
diff --git a/src/arch/x86/lib/ioapic.c b/src/arch/x86/lib/ioapic.c
index fc5e3072d2..6243f55f7b 100644
--- a/src/arch/x86/lib/ioapic.c
+++ b/src/arch/x86/lib/ioapic.c
@@ -74,11 +74,9 @@ void clear_ioapic(u32 ioapic_base)
}
}
-void setup_ioapic(u32 ioapic_base, u8 ioapic_id)
+void set_ioapic_id(u32 ioapic_base, u8 ioapic_id)
{
u32 bsp_lapicid = lapicid();
- u32 low, high;
- u32 i, ioapic_interrupts;
printk(BIOS_DEBUG, "IOAPIC: Initializing IOAPIC at 0x%08x\n",
ioapic_base);
@@ -92,6 +90,13 @@ void setup_ioapic(u32 ioapic_base, u8 ioapic_id)
(io_apic_read(ioapic_base, 0x00) & 0xf0ffffff) |
(ioapic_id << 24));
}
+}
+
+static void load_vectors(u32 ioapic_base)
+{
+ u32 bsp_lapicid = lapicid();
+ u32 low, high;
+ u32 i, ioapic_interrupts;
ioapic_interrupts = ioapic_interrupt_count(ioapic_base);
@@ -123,10 +128,8 @@ void setup_ioapic(u32 ioapic_base, u8 ioapic_id)
printk(BIOS_SPEW, "IOAPIC: reg 0x%08x value 0x%08x 0x%08x\n",
0, high, low);
-
low = DISABLED;
high = NONE;
-
for (i = 1; i < ioapic_interrupts; i++) {
io_apic_write(ioapic_base, i * 2 + 0x10, low);
io_apic_write(ioapic_base, i * 2 + 0x11, high);
@@ -135,3 +138,9 @@ void setup_ioapic(u32 ioapic_base, u8 ioapic_id)
i, high, low);
}
}
+
+void setup_ioapic(u32 ioapic_base, u8 ioapic_id)
+{
+ set_ioapic_id(ioapic_base, ioapic_id);
+ load_vectors(ioapic_base);
+}