lkml.org 
[lkml]   [2010]   [Jan]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[97/98] ACPI: enable C2 and Turbo-mode on Nehalem notebooks on A/C
    2.6.32-stable review patch.  If anyone has any objections, please let us know.

    ------------------


    From: Len Brown <len.brown@intel.com>

    upstream in 2.6.33-rc: 5d76b6f6c17572e662f5c99c2023adae92100855

    Refreshed here for 2.6.32.y, applies w/ offset back to 2.6.29.y.

    Linux has always ignored ACPI BIOS C2 with exit latency > 100 usec,
    and the ACPI spec is clear that is correct FADT-supplied C2.

    However, the ACPI spec explicitly states that _CST-supplied C-states
    have no latency limits.

    So move the 100usec C2 test out of the code shared
    by FADT and _CST code-paths, and into the FADT-specific path.

    This bug has not been visible until Nehalem, which advertises
    a CPU-C2 worst case exit latency on servers of 205usec.
    That (incorrect) figure is being used by BIOS writers
    on mobile Nehalem systems for the AC configuration.
    Thus, Linux ignores C2 leaving just C1, which is
    saves less power, and also impacts performance
    by preventing the use of turbo mode.

    http://bugzilla.kernel.org/show_bug.cgi?id=15064

    Tested-by: Alex Chiang <achiang@hp.com>
    Signed-off-by: Len Brown <len.brown@intel.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

    ---
    drivers/acpi/processor_idle.c | 21 +++++++++++----------
    1 file changed, 11 insertions(+), 10 deletions(-)

    --- a/drivers/acpi/processor_idle.c
    +++ b/drivers/acpi/processor_idle.c
    @@ -299,6 +299,17 @@ static int acpi_processor_get_power_info
    pr->power.states[ACPI_STATE_C2].latency = acpi_gbl_FADT.C2latency;
    pr->power.states[ACPI_STATE_C3].latency = acpi_gbl_FADT.C3latency;

    + /*
    + * FADT specified C2 latency must be less than or equal to
    + * 100 microseconds.
    + */
    + if (acpi_gbl_FADT.C2latency > ACPI_PROCESSOR_MAX_C2_LATENCY) {
    + ACPI_DEBUG_PRINT((ACPI_DB_INFO,
    + "C2 latency too large [%d]\n", acpi_gbl_FADT.C2latency));
    + /* invalidate C2 */
    + pr->power.states[ACPI_STATE_C2].address = 0;
    + }
    +
    ACPI_DEBUG_PRINT((ACPI_DB_INFO,
    "lvl2[0x%08x] lvl3[0x%08x]\n",
    pr->power.states[ACPI_STATE_C2].address,
    @@ -495,16 +506,6 @@ static void acpi_processor_power_verify_
    return;

    /*
    - * C2 latency must be less than or equal to 100
    - * microseconds.
    - */
    - else if (cx->latency > ACPI_PROCESSOR_MAX_C2_LATENCY) {
    - ACPI_DEBUG_PRINT((ACPI_DB_INFO,
    - "latency too large [%d]\n", cx->latency));
    - return;
    - }
    -
    - /*
    * Otherwise we've met all of our C2 requirements.
    * Normalize the C2 latency to expidite policy
    */



    \
     
     \ /
      Last update: 2010-01-27 00:49    [W:0.023 / U:1.924 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site