aboutsummaryrefslogtreecommitdiffstats
path: root/xen/arch/x86/io_apic.c
diff options
context:
space:
mode:
Diffstat (limited to 'xen/arch/x86/io_apic.c')
-rw-r--r--xen/arch/x86/io_apic.c63
1 files changed, 21 insertions, 42 deletions
diff --git a/xen/arch/x86/io_apic.c b/xen/arch/x86/io_apic.c
index c767d175bb..f99907439e 100644
--- a/xen/arch/x86/io_apic.c
+++ b/xen/arch/x86/io_apic.c
@@ -1779,6 +1779,20 @@ static inline void check_timer(void)
*/
#define PIC_IRQS (1 << PIC_CASCADE_IR)
+static struct IO_APIC_route_entry *ioapic_pm_state;
+
+void ioapic_pm_state_alloc(void)
+{
+ int i, nr_entry = 0;
+
+ for (i = 0; i < nr_ioapics; i++)
+ nr_entry += nr_ioapic_registers[i];
+
+ ioapic_pm_state = _xmalloc(sizeof(struct IO_APIC_route_entry)*nr_entry,
+ sizeof(struct IO_APIC_route_entry));
+ BUG_ON(ioapic_pm_state == NULL);
+}
+
void __init setup_IO_APIC(void)
{
enable_IO_APIC();
@@ -1801,40 +1815,16 @@ void __init setup_IO_APIC(void)
init_IO_APIC_traps();
check_timer();
print_IO_APIC();
+ ioapic_pm_state_alloc();
register_keyhandler('z', print_IO_APIC_keyhandler, "print ioapic info");
}
-struct IO_APIC_route_entry *ioapic_pm_state=NULL;
-
-void ioapic_pm_state_alloc(void)
+void ioapic_suspend(void)
{
- int i, nr_entry = 0;
-
- if (ioapic_pm_state != NULL)
- return;
-
- for (i = 0; i < nr_ioapics; i++)
- nr_entry += nr_ioapic_registers[i];
-
- ioapic_pm_state = _xmalloc(sizeof(struct IO_APIC_route_entry)*nr_entry,
- sizeof(struct IO_APIC_route_entry));
-}
-
-int ioapic_suspend(void)
-{
- struct IO_APIC_route_entry *entry;
+ struct IO_APIC_route_entry *entry = ioapic_pm_state;
unsigned long flags;
- int apic,i;
-
- ioapic_pm_state_alloc();
-
- if (ioapic_pm_state == NULL) {
- printk("Cannot suspend ioapic due to lack of memory\n");
- return 1;
- }
-
- entry = ioapic_pm_state;
+ int apic, i;
spin_lock_irqsave(&ioapic_lock, flags);
for (apic = 0; apic < nr_ioapics; apic++) {
@@ -1844,23 +1834,14 @@ int ioapic_suspend(void)
}
}
spin_unlock_irqrestore(&ioapic_lock, flags);
-
- return 0;
}
-int ioapic_resume(void)
+void ioapic_resume(void)
{
- struct IO_APIC_route_entry *entry;
+ struct IO_APIC_route_entry *entry = ioapic_pm_state;
unsigned long flags;
union IO_APIC_reg_00 reg_00;
- int i,apic;
-
- if (ioapic_pm_state == NULL){
- printk("Cannot resume ioapic due to lack of memory\n");
- return 1;
- }
-
- entry = ioapic_pm_state;
+ int i, apic;
spin_lock_irqsave(&ioapic_lock, flags);
for (apic = 0; apic < nr_ioapics; apic++){
@@ -1875,8 +1856,6 @@ int ioapic_resume(void)
}
}
spin_unlock_irqrestore(&ioapic_lock, flags);
-
- return 0;
}
/* --------------------------------------------------------------------------