x86, ioapic: Early enable ioapic for timer irq
authorJacob Pan <jacob.jun.pan@intel.com>
Wed, 23 Sep 2009 14:20:23 +0000 (07:20 -0700)
committerH. Peter Anvin <hpa@zytor.com>
Wed, 24 Feb 2010 07:13:19 +0000 (23:13 -0800)
Moorestown platform needs apic ready early for the system timer irq
which is delievered via ioapic.  Should not impact other platforms.

In the longer term, once ioapic setup is moved before late time init,
we will not need this patch to do early apic enabling.

Signed-off-by: Jacob Pan <jacob.jun.pan@intel.com>
LKML-Reference: <43F901BD926A4E43B106BF17856F07559FB80D07@orsmsx508.amr.corp.intel.com>
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
arch/x86/include/asm/io_apic.h
arch/x86/kernel/apic/io_apic.c

index 31dfb42d8649952146114de8543a568c73187857..99a416ed16b7fa5257b40ea701f9e76968d43c7b 100644 (file)
@@ -187,6 +187,7 @@ extern struct mp_ioapic_gsi  mp_gsi_routing[];
 int mp_find_ioapic(int gsi);
 int mp_find_ioapic_pin(int ioapic, int gsi);
 void __init mp_register_ioapic(int id, u32 address, u32 gsi_base);
+extern void __init pre_init_apic_IRQ0(void);
 
 #else  /* !CONFIG_X86_IO_APIC */
 
index b34854358ee68a3e8a7d9f787d43fc1b832145e6..8c848b5877a07227443e91813ac70e5000b92628 100644 (file)
@@ -4289,3 +4289,24 @@ void __init mp_register_ioapic(int id, u32 address, u32 gsi_base)
 
        nr_ioapics++;
 }
+
+/* Enable IOAPIC early just for system timer */
+void __init pre_init_apic_IRQ0(void)
+{
+       struct irq_cfg *cfg;
+       struct irq_desc *desc;
+
+       printk(KERN_INFO "Early APIC setup for system timer0\n");
+#ifndef CONFIG_SMP
+       phys_cpu_present_map = physid_mask_of_physid(boot_cpu_physical_apicid);
+#endif
+       desc = irq_to_desc_alloc_node(0, 0);
+
+       setup_local_APIC();
+
+       cfg = irq_cfg(0);
+       add_pin_to_irq_node(cfg, 0, 0, 0);
+       set_irq_chip_and_handler_name(0, &ioapic_chip, handle_edge_irq, "edge");
+
+       setup_IO_APIC_irq(0, 0, 0, desc, 0, 0);
+}