[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH RFC] x86/acpi: don't ignore I/O APICs just because there's no local APIC



Parse the ACPI MADT for I/O APIC information, even if the cpu has no
(apparent) local APIC (ie, the CPU's APIC feature flag is clear).

In principle, the local APIC and the I/O APIC are distinct (but related)
components, which can be independently present.

In practice this can happen in a Xen system, where the hypervisor has
full control over the local APICs, and delivers interrupts initiated by
the I/O APICs via Xen's event channel mechanism.

(This eliminates the need for any explicit if (xen...) tests in
acpi/boot.c)

Signed-off-by: Jeremy Fitzhardinge<jeremy.fitzhardinge@xxxxxxxxxx>

diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c
index 2410469..19d13e5 100644
--- a/arch/x86/kernel/acpi/boot.c
+++ b/arch/x86/kernel/acpi/boot.c
@@ -193,9 +193,6 @@ static int __init acpi_parse_madt(struct acpi_table_header 
*table)
 {
        struct acpi_table_madt *madt = NULL;

-       if (!cpu_has_apic)
-               return -EINVAL;
-
        madt = (struct acpi_table_madt *)table;
        if (!madt) {
                printk(KERN_WARNING PREFIX "Unable to map MADT\n");
@@ -1252,9 +1249,6 @@ static int __init acpi_parse_madt_ioapic_entries(void)
        if (acpi_disabled || acpi_noirq)
                return -ENODEV;

-       if (!cpu_has_apic)
-               return -ENODEV;
-
        /*
         * if "noapic" boot option, don't look for IO-APICs
         */
@@ -1357,6 +1351,16 @@ static void __init acpi_process_madt(void)
 #ifdef CONFIG_X86_BIGSMP
                        generic_bigsmp_probe();
 #endif
+               }
+               if (error == -EINVAL) {
+                       /*
+                        * The ACPI tables themselves were malformed.
+                        * Dell Precision Workstation 410, 610 come here.
+                        */
+                       printk(KERN_ERR PREFIX
+                              "Invalid BIOS MADT, disabling ACPI\n");
+                       disable_acpi();
+               } else {
                        /*
                         * Parse MADT IO-APIC entries
                         */
@@ -1370,14 +1374,6 @@ static void __init acpi_process_madt(void)
                                        apic->setup_apic_routing();
                        }
                }
-               if (error == -EINVAL) {
-                       /*
-                        * Dell Precision Workstation 410, 610 come here.
-                        */
-                       printk(KERN_ERR PREFIX
-                              "Invalid BIOS MADT, disabling ACPI\n");
-                       disable_acpi();
-               }
        } else {
                /*
                 * ACPI found no MADT, and so ACPI wants UP PIC mode.
diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c
index c6acce2..d5e3f03 100644
--- a/arch/x86/kernel/apic/io_apic.c
+++ b/arch/x86/kernel/apic/io_apic.c
@@ -1807,6 +1807,10 @@ __apicdebuginit(void) print_all_local_APICs(void)
 {
        int cpu;

+       /* don't print out if apic is not there */
+       if (!cpu_has_apic)
+               return;
+
        preempt_disable();
        for_each_online_cpu(cpu)
                smp_call_function_single(cpu, print_local_APIC, NULL, 1);
@@ -1849,8 +1853,7 @@ __apicdebuginit(int) print_all_ICs(void)
 {
        print_PIC();

-       /* don't print out if apic is not there */
-       if (!cpu_has_apic || disable_apic)
+       if (disable_apic)
                return 0;

        print_all_local_APICs();



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.