lkml.org 
[lkml]   [2012]   [Jan]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[104/129] ACPI: processor: fix acpi_get_cpuid for UP processor
    3.2-stable review patch.  If anyone has any objections, please let me know.

    ------------------
    Content-Length: 2114
    Lines: 69

    From: Lin Ming <ming.m.lin@intel.com>

    commit d640113fe80e45ebd4a5b420b220d3f6bf37f682 upstream.

    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

    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>
    Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

    ---
    drivers/acpi/processor_core.c | 26 ++++++++++++++++++++++++--
    1 file changed, 24 insertions(+), 2 deletions(-)

    --- a/drivers/acpi/processor_core.c
    +++ b/drivers/acpi/processor_core.c
    @@ -173,8 +173,30 @@ int acpi_get_cpuid(acpi_handle handle, i
    apic_id = map_mat_entry(handle, type, acpi_id);
    if (apic_id == -1)
    apic_id = map_madt_entry(type, acpi_id);
    - if (apic_id == -1)
    - return apic_id;
    + 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;
    + }

    #ifdef CONFIG_SMP
    for_each_possible_cpu(i) {



    \
     
     \ /
      Last update: 2012-01-24 03:53    [W:0.021 / U:75.100 seconds]
    ©2003-2017 Jasper Spaans. hosted at Digital OceanAdvertise on this site