|
@@ -41,6 +41,7 @@
|
|
|
#include <linux/pm_qos_params.h>
|
|
|
#include <linux/clockchips.h>
|
|
|
#include <linux/cpuidle.h>
|
|
|
+#include <linux/cpuidle.h>
|
|
|
|
|
|
/*
|
|
|
* Include the apic definitions for x86 to have the APIC timer related defines
|
|
@@ -57,6 +58,7 @@
|
|
|
|
|
|
#include <acpi/acpi_bus.h>
|
|
|
#include <acpi/processor.h>
|
|
|
+#include <asm/processor.h>
|
|
|
|
|
|
#define ACPI_PROCESSOR_COMPONENT 0x01000000
|
|
|
#define ACPI_PROCESSOR_CLASS "processor"
|
|
@@ -955,6 +957,17 @@ static int acpi_processor_get_power_info_cst(struct acpi_processor *pr)
|
|
|
} else {
|
|
|
continue;
|
|
|
}
|
|
|
+ if (cx.type == ACPI_STATE_C1 && idle_halt) {
|
|
|
+ /*
|
|
|
+ * In most cases the C1 space_id obtained from
|
|
|
+ * _CST object is FIXED_HARDWARE access mode.
|
|
|
+ * But when the option of idle=halt is added,
|
|
|
+ * the entry_method type should be changed from
|
|
|
+ * CSTATE_FFH to CSTATE_HALT.
|
|
|
+ */
|
|
|
+ cx.entry_method = ACPI_CSTATE_HALT;
|
|
|
+ snprintf(cx.desc, ACPI_CX_DESC_LEN, "ACPI HLT");
|
|
|
+ }
|
|
|
} else {
|
|
|
snprintf(cx.desc, ACPI_CX_DESC_LEN, "ACPI IOPORT 0x%x",
|
|
|
cx.address);
|
|
@@ -1780,6 +1793,15 @@ int __cpuinit acpi_processor_power_init(struct acpi_processor *pr,
|
|
|
return 0;
|
|
|
|
|
|
if (!first_run) {
|
|
|
+ if (idle_halt) {
|
|
|
+ /*
|
|
|
+ * When the boot option of "idle=halt" is added, halt
|
|
|
+ * is used for CPU IDLE.
|
|
|
+ * In such case C2/C3 is meaningless. So the max_cstate
|
|
|
+ * is set to one.
|
|
|
+ */
|
|
|
+ max_cstate = 1;
|
|
|
+ }
|
|
|
dmi_check_system(processor_power_dmi_table);
|
|
|
max_cstate = acpi_processor_cstate_check(max_cstate);
|
|
|
if (max_cstate < ACPI_C_STATES_MAX)
|