The attached patch makes the kernel ignore the fact that P_LVL3_LAT is set to 2000 in the relevant ACPI table, and enforces the C3 power state anyway. I have not observed any ill effects with this patch on my P4m-equipped Inspiron 8200, and would like to see this patch applied upstream. It saves ~2.5 watts on an idle system, so should be well worth it. The patch was written by Arjan van de Ven based on my initial tests, and the patch has been tested by myself. It applies to 2.6.22-rc5 and likely also -rc6. Dag Bakke Tested-by: Dag Bakke <dag@xxxxxxxxx> --- linux/drivers/acpi/processor_idle.c.org 2007-06-10 14:18:27.000000000 -0700 +++ linux/drivers/acpi/processor_idle.c 2007-06-10 14:27:45.000000000 -0700 @@ -67,6 +67,8 @@ ACPI_MODULE_NAME("processor_idle"); #define C2_OVERHEAD 1 /* 1us */ #define C3_OVERHEAD 1 /* 1us */ +static int forced_c3; + void acpi_max_cstate_changed(void) { /* Driver will reset devices' max cstate limit */ @@ -115,6 +117,20 @@ static int set_max_cstate(struct dmi_sys return 0; } +/* + * Some (Dell) machines have a too large C3 latency set, but it still works completely. + * Dell provides a driver for other operating systems to hack around this bug, so we know + * it's safe. + */ +static int dmi_force_c3(struct dmi_system_id *id) +{ + forced_c3 = 1; + + printk(KERN_NOTICE PREFIX "%s detected - Force enabling C3.", id->ident); + + return 0; +} + /* Actually this shouldn't be __cpuinitdata, would be better to fix the callers to only run once -AK */ static struct dmi_system_id __cpuinitdata processor_power_dmi_table[] = { @@ -173,6 +189,9 @@ static struct dmi_system_id __cpuinitdat DMI_MATCH(DMI_BIOS_VENDOR,"Phoenix Technologies LTD"), DMI_MATCH(DMI_BIOS_VERSION,"SHE845M0.86C.0013.D.0302131307")}, (void *)2}, + { dmi_force_c3, "Dell Inspiron 8200", { + DMI_MATCH(DMI_SYS_VENDOR,"Dell Computer Corporation"), + DMI_MATCH(DMI_PRODUCT_NAME,"Inspiron 8200") }, NULL}, {}, }; @@ -474,11 +493,12 @@ static void acpi_processor_power_verify_ * C3 latency must be less than or equal to 1000 * microseconds. */ - else if (cx->latency > ACPI_PROCESSOR_MAX_C3_LATENCY) { + if (cx->latency > ACPI_PROCESSOR_MAX_C3_LATENCY && !forced_c3) { ACPI_DEBUG_PRINT((ACPI_DB_INFO, "latency too large [%d]\n", cx->latency)); return; - } + } else if (forced_c3) + cx->latency = ACPI_PROCESSOR_MAX_C3_LATENCY; /* * PIIX4 Erratum #18: We don't support C3 when Type-F (fast) - To unsubscribe from this list: send the line "unsubscribe linux-acpi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html