diff options
-rw-r--r-- | drivers/acpi/processor_idle.c | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/drivers/acpi/processor_idle.c b/drivers/acpi/processor_idle.c index 5b6a9865300e..83fd1b6c10c4 100644 --- a/drivers/acpi/processor_idle.c +++ b/drivers/acpi/processor_idle.c | |||
@@ -280,6 +280,16 @@ static void acpi_processor_idle(void) | |||
280 | 280 | ||
281 | cx->usage++; | 281 | cx->usage++; |
282 | 282 | ||
283 | #ifdef CONFIG_HOTPLUG_CPU | ||
284 | /* | ||
285 | * Check for P_LVL2_UP flag before entering C2 and above on | ||
286 | * an SMP system. We do it here instead of doing it at _CST/P_LVL | ||
287 | * detection phase, to work cleanly with logical CPU hotplug. | ||
288 | */ | ||
289 | if ((cx->type != ACPI_STATE_C1) && (num_online_cpus() > 1) && | ||
290 | !pr->flags.has_cst && acpi_fadt.plvl2_up) | ||
291 | cx->type = ACPI_STATE_C1; | ||
292 | #endif | ||
283 | /* | 293 | /* |
284 | * Sleep: | 294 | * Sleep: |
285 | * ------ | 295 | * ------ |
@@ -534,6 +544,15 @@ static int acpi_processor_get_power_info_fadt(struct acpi_processor *pr) | |||
534 | pr->power.states[ACPI_STATE_C0].valid = 1; | 544 | pr->power.states[ACPI_STATE_C0].valid = 1; |
535 | pr->power.states[ACPI_STATE_C1].valid = 1; | 545 | pr->power.states[ACPI_STATE_C1].valid = 1; |
536 | 546 | ||
547 | #ifndef CONFIG_HOTPLUG_CPU | ||
548 | /* | ||
549 | * Check for P_LVL2_UP flag before entering C2 and above on | ||
550 | * an SMP system. | ||
551 | */ | ||
552 | if ((num_online_cpus() > 1) && acpi_fadt.plvl2_up) | ||
553 | return_VALUE(-ENODEV); | ||
554 | #endif | ||
555 | |||
537 | /* determine C2 and C3 address from pblk */ | 556 | /* determine C2 and C3 address from pblk */ |
538 | pr->power.states[ACPI_STATE_C2].address = pr->pblk + 4; | 557 | pr->power.states[ACPI_STATE_C2].address = pr->pblk + 4; |
539 | pr->power.states[ACPI_STATE_C3].address = pr->pblk + 5; | 558 | pr->power.states[ACPI_STATE_C3].address = pr->pblk + 5; |