aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/acpi
diff options
context:
space:
mode:
authorLen Brown <len.brown@intel.com>2010-01-19 22:41:14 -0500
committerLen Brown <len.brown@intel.com>2010-01-20 00:54:01 -0500
commit5d76b6f6c17572e662f5c99c2023adae92100855 (patch)
treef381621b23c8e689fa4258f9da3dd107cb93776c /drivers/acpi
parent24bc7347da73a9ed3383056c3d0f28c0e361621e (diff)
ACPI: enable C2 and Turbo-mode on Nehalem notebooks on A/C
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>
Diffstat (limited to 'drivers/acpi')
-rw-r--r--drivers/acpi/processor_idle.c21
1 files changed, 11 insertions, 10 deletions
diff --git a/drivers/acpi/processor_idle.c b/drivers/acpi/processor_idle.c
index d1676b1754d9..8f6da9acc8e4 100644
--- a/drivers/acpi/processor_idle.c
+++ b/drivers/acpi/processor_idle.c
@@ -305,6 +305,17 @@ static int acpi_processor_get_power_info_fadt(struct acpi_processor *pr)
305 pr->power.states[ACPI_STATE_C2].latency = acpi_gbl_FADT.C2latency; 305 pr->power.states[ACPI_STATE_C2].latency = acpi_gbl_FADT.C2latency;
306 pr->power.states[ACPI_STATE_C3].latency = acpi_gbl_FADT.C3latency; 306 pr->power.states[ACPI_STATE_C3].latency = acpi_gbl_FADT.C3latency;
307 307
308 /*
309 * FADT specified C2 latency must be less than or equal to
310 * 100 microseconds.
311 */
312 if (acpi_gbl_FADT.C2latency > ACPI_PROCESSOR_MAX_C2_LATENCY) {
313 ACPI_DEBUG_PRINT((ACPI_DB_INFO,
314 "C2 latency too large [%d]\n", acpi_gbl_FADT.C2latency));
315 /* invalidate C2 */
316 pr->power.states[ACPI_STATE_C2].address = 0;
317 }
318
308 ACPI_DEBUG_PRINT((ACPI_DB_INFO, 319 ACPI_DEBUG_PRINT((ACPI_DB_INFO,
309 "lvl2[0x%08x] lvl3[0x%08x]\n", 320 "lvl2[0x%08x] lvl3[0x%08x]\n",
310 pr->power.states[ACPI_STATE_C2].address, 321 pr->power.states[ACPI_STATE_C2].address,
@@ -501,16 +512,6 @@ static void acpi_processor_power_verify_c2(struct acpi_processor_cx *cx)
501 return; 512 return;
502 513
503 /* 514 /*
504 * C2 latency must be less than or equal to 100
505 * microseconds.
506 */
507 else if (cx->latency > ACPI_PROCESSOR_MAX_C2_LATENCY) {
508 ACPI_DEBUG_PRINT((ACPI_DB_INFO,
509 "latency too large [%d]\n", cx->latency));
510 return;
511 }
512
513 /*
514 * Otherwise we've met all of our C2 requirements. 515 * Otherwise we've met all of our C2 requirements.
515 * Normalize the C2 latency to expidite policy 516 * Normalize the C2 latency to expidite policy
516 */ 517 */