diff options
| -rw-r--r-- | drivers/acpi/processor_core.c | 26 |
1 files changed, 24 insertions, 2 deletions
diff --git a/drivers/acpi/processor_core.c b/drivers/acpi/processor_core.c index 3a0428e8435c..c850de4c9a14 100644 --- a/drivers/acpi/processor_core.c +++ b/drivers/acpi/processor_core.c | |||
| @@ -173,8 +173,30 @@ int acpi_get_cpuid(acpi_handle handle, int type, u32 acpi_id) | |||
| 173 | apic_id = map_mat_entry(handle, type, acpi_id); | 173 | apic_id = map_mat_entry(handle, type, acpi_id); |
| 174 | if (apic_id == -1) | 174 | if (apic_id == -1) |
| 175 | apic_id = map_madt_entry(type, acpi_id); | 175 | apic_id = map_madt_entry(type, acpi_id); |
| 176 | if (apic_id == -1) | 176 | if (apic_id == -1) { |
| 177 | return apic_id; | 177 | /* |
| 178 | * On UP processor, there is no _MAT or MADT table. | ||
| 179 | * So above apic_id is always set to -1. | ||
| 180 | * | ||
| 181 | * BIOS may define multiple CPU handles even for UP processor. | ||
| 182 | * For example, | ||
| 183 | * | ||
| 184 | * Scope (_PR) | ||
| 185 | * { | ||
| 186 | * Processor (CPU0, 0x00, 0x00000410, 0x06) {} | ||
| 187 | * Processor (CPU1, 0x01, 0x00000410, 0x06) {} | ||
| 188 | * Processor (CPU2, 0x02, 0x00000410, 0x06) {} | ||
| 189 | * Processor (CPU3, 0x03, 0x00000410, 0x06) {} | ||
| 190 | * } | ||
| 191 | * | ||
| 192 | * Ignores apic_id and always return 0 for CPU0's handle. | ||
| 193 | * Return -1 for other CPU's handle. | ||
| 194 | */ | ||
| 195 | if (acpi_id == 0) | ||
| 196 | return acpi_id; | ||
| 197 | else | ||
| 198 | return apic_id; | ||
| 199 | } | ||
| 178 | 200 | ||
| 179 | #ifdef CONFIG_SMP | 201 | #ifdef CONFIG_SMP |
| 180 | for_each_possible_cpu(i) { | 202 | for_each_possible_cpu(i) { |
