forked from mirrors/linux
ACPI: processor: fix acpi_get_cpuid for UP processor
For UP processor, it is likely that no _MAT method or MADT table defined.
So currently acpi_get_cpuid(...) always return -1 for UP processor.
This is wrong. It should return valid value for CPU0.
In the other hand, BIOS may define multiple CPU handles even for UP
processor, for example
Scope (_PR)
{
Processor (CPU0, 0x00, 0x00000410, 0x06) {}
Processor (CPU1, 0x01, 0x00000410, 0x06) {}
Processor (CPU2, 0x02, 0x00000410, 0x06) {}
Processor (CPU3, 0x03, 0x00000410, 0x06) {}
}
We should only return valid value for CPU0's acpi handle.
And return invalid value for others.
http://marc.info/?t=132329819900003&r=1&w=2
Cc: stable@vger.kernel.org
Reported-and-tested-by: wallak@free.fr
Signed-off-by: Lin Ming <ming.m.lin@intel.com>
Signed-off-by: Len Brown <len.brown@intel.com>
This commit is contained in:
parent
805a6af8db
commit
d640113fe8
1 changed files with 24 additions and 2 deletions
|
|
@ -173,8 +173,30 @@ int acpi_get_cpuid(acpi_handle handle, int type, u32 acpi_id)
|
||||||
apic_id = map_mat_entry(handle, type, acpi_id);
|
apic_id = map_mat_entry(handle, type, acpi_id);
|
||||||
if (apic_id == -1)
|
if (apic_id == -1)
|
||||||
apic_id = map_madt_entry(type, acpi_id);
|
apic_id = map_madt_entry(type, acpi_id);
|
||||||
if (apic_id == -1)
|
if (apic_id == -1) {
|
||||||
|
/*
|
||||||
|
* On UP processor, there is no _MAT or MADT table.
|
||||||
|
* So above apic_id is always set to -1.
|
||||||
|
*
|
||||||
|
* BIOS may define multiple CPU handles even for UP processor.
|
||||||
|
* For example,
|
||||||
|
*
|
||||||
|
* Scope (_PR)
|
||||||
|
* {
|
||||||
|
* Processor (CPU0, 0x00, 0x00000410, 0x06) {}
|
||||||
|
* Processor (CPU1, 0x01, 0x00000410, 0x06) {}
|
||||||
|
* Processor (CPU2, 0x02, 0x00000410, 0x06) {}
|
||||||
|
* Processor (CPU3, 0x03, 0x00000410, 0x06) {}
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
* Ignores apic_id and always return 0 for CPU0's handle.
|
||||||
|
* Return -1 for other CPU's handle.
|
||||||
|
*/
|
||||||
|
if (acpi_id == 0)
|
||||||
|
return acpi_id;
|
||||||
|
else
|
||||||
return apic_id;
|
return apic_id;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
for_each_possible_cpu(i) {
|
for_each_possible_cpu(i) {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue