@@ -2537,34 +2537,26 @@ static __init bool bad_ioapic_register(unsigned int idx)
return false;
}
-void __init ioapic_init(void)
+static void __init ioapic_init_mappings(void)
{
- unsigned long ioapic_phys;
unsigned int i, idx = FIX_IO_APIC_BASE_0;
- union IO_APIC_reg_01 reg_01;
- if ( smp_found_config )
- nr_irqs_gsi = 0;
+ nr_irqs_gsi = 0;
+
for ( i = 0; i < nr_ioapics; i++ )
{
- if ( smp_found_config )
- {
- ioapic_phys = mp_ioapics[i].mpc_apicaddr;
- if ( !ioapic_phys )
- {
- printk(KERN_ERR "WARNING: bogus zero IO-APIC address "
- "found in MPTABLE, disabling IO/APIC support!\n");
- smp_found_config = false;
- skip_ioapic_setup = true;
- goto fake_ioapic_page;
- }
- }
- else
+ union IO_APIC_reg_01 reg_01;
+ paddr_t ioapic_phys = mp_ioapics[i].mpc_apicaddr;
+
+ if ( !ioapic_phys )
{
- fake_ioapic_page:
- ioapic_phys = __pa(alloc_xenheap_page());
- clear_page(__va(ioapic_phys));
+ printk(KERN_ERR
+ "WARNING: bogus zero IO-APIC address found in MPTABLE, disabling IO/APIC support!\n");
+ smp_found_config = false;
+ skip_ioapic_setup = true;
+ break;
}
+
set_fixmap_nocache(idx, ioapic_phys);
apic_printk(APIC_VERBOSE, "mapped IOAPIC to %08Lx (%08lx)\n",
__fix_to_virt(idx), ioapic_phys);
@@ -2576,19 +2568,22 @@ void __init ioapic_init(void)
continue;
}
- if ( smp_found_config )
- {
- /* The number of IO-APIC IRQ registers (== #pins): */
- reg_01.raw = io_apic_read(i, 1);
- nr_ioapic_entries[i] = reg_01.bits.entries + 1;
- nr_irqs_gsi += nr_ioapic_entries[i];
-
- if ( rangeset_add_singleton(mmio_ro_ranges,
- ioapic_phys >> PAGE_SHIFT) )
- printk(KERN_ERR "Failed to mark IO-APIC page %lx read-only\n",
- ioapic_phys);
- }
+ /* The number of IO-APIC IRQ registers (== #pins): */
+ reg_01.raw = io_apic_read(i, 1);
+ nr_ioapic_entries[i] = reg_01.bits.entries + 1;
+ nr_irqs_gsi += nr_ioapic_entries[i];
+
+ if ( rangeset_add_singleton(mmio_ro_ranges,
+ ioapic_phys >> PAGE_SHIFT) )
+ printk(KERN_ERR "Failed to mark IO-APIC page %lx read-only\n",
+ ioapic_phys);
}
+}
+
+void __init ioapic_init(void)
+{
+ if ( smp_found_config )
+ ioapic_init_mappings();
nr_irqs_gsi = max(nr_irqs_gsi, highest_gsi() + 1);