]> Pileus Git - ~andy/linux/blobdiff - drivers/acpi/acpi_processor.c
Merge branches 'acpi-processor', 'acpi-hotplug', 'acpi-init', 'acpi-pm' and 'acpica'
[~andy/linux] / drivers / acpi / acpi_processor.c
index d58a2aba09308a31fd6f80355bba51fb6df6724f..c29c2c3ec0ad8ffc2c6427393593dbf147899d1b 100644 (file)
@@ -212,7 +212,7 @@ static int acpi_processor_get_info(struct acpi_device *device)
        union acpi_object object = { 0 };
        struct acpi_buffer buffer = { sizeof(union acpi_object), &object };
        struct acpi_processor *pr = acpi_driver_data(device);
-       int cpu_index, device_declaration = 0;
+       int apic_id, cpu_index, device_declaration = 0;
        acpi_status status = AE_OK;
        static int cpu0_initialized;
        unsigned long long value;
@@ -258,18 +258,21 @@ static int acpi_processor_get_info(struct acpi_device *device)
                device_declaration = 1;
                pr->acpi_id = value;
        }
-       pr->apic_id = acpi_get_apicid(pr->handle, device_declaration,
-                                       pr->acpi_id);
-       cpu_index = acpi_map_cpuid(pr->apic_id, pr->acpi_id);
 
-       /* Handle UP system running SMP kernel, with no LAPIC in MADT */
-       if (!cpu0_initialized && (cpu_index == -1) &&
-           (num_online_cpus() == 1)) {
-               cpu_index = 0;
+       apic_id = acpi_get_apicid(pr->handle, device_declaration, pr->acpi_id);
+       if (apic_id < 0) {
+               acpi_handle_debug(pr->handle, "failed to get CPU APIC ID.\n");
+               return -ENODEV;
        }
+       pr->apic_id = apic_id;
 
-       cpu0_initialized = 1;
-
+       cpu_index = acpi_map_cpuid(pr->apic_id, pr->acpi_id);
+       if (!cpu0_initialized) {
+               cpu0_initialized = 1;
+               /* Handle UP system running SMP kernel, with no LAPIC in MADT */
+               if ((cpu_index == -1) && (num_online_cpus() == 1))
+                       cpu_index = 0;
+       }
        pr->id = cpu_index;
 
        /*
@@ -282,6 +285,7 @@ static int acpi_processor_get_info(struct acpi_device *device)
                if (ret)
                        return ret;
        }
+
        /*
         * On some boxes several processors use the same processor bus id.
         * But they are located in different scope. For example: