diff options
author | Len Brown <len.brown@intel.com> | 2005-11-30 21:55:14 -0500 |
---|---|---|
committer | Len Brown <len.brown@intel.com> | 2005-11-30 21:55:14 -0500 |
commit | 7dac562f6d89b3f70c3f12b0e17878b07af42298 (patch) | |
tree | be68146ab85763871c93549e42c065caea2cab36 | |
parent | 3141b6708dd9ad09b6667c23393cfdc25b127771 (diff) | |
parent | 4c0335526c95d90a1d958e0059f40a5745fc7c5d (diff) |
Pull 5165 into release branch
-rw-r--r-- | drivers/acpi/processor_idle.c | 29 |
1 files changed, 24 insertions, 5 deletions
diff --git a/drivers/acpi/processor_idle.c b/drivers/acpi/processor_idle.c index 70d8a6ec0920..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; |
@@ -690,7 +709,7 @@ static int acpi_processor_get_power_info_cst(struct acpi_processor *pr) | |||
690 | 709 | ||
691 | /* Validate number of power states discovered */ | 710 | /* Validate number of power states discovered */ |
692 | if (pr->power.count < 2) | 711 | if (pr->power.count < 2) |
693 | status = -ENODEV; | 712 | status = -EFAULT; |
694 | 713 | ||
695 | end: | 714 | end: |
696 | acpi_os_free(buffer.pointer); | 715 | acpi_os_free(buffer.pointer); |
@@ -841,11 +860,11 @@ static int acpi_processor_get_power_info(struct acpi_processor *pr) | |||
841 | * this function */ | 860 | * this function */ |
842 | 861 | ||
843 | result = acpi_processor_get_power_info_cst(pr); | 862 | result = acpi_processor_get_power_info_cst(pr); |
844 | if ((result) || (acpi_processor_power_verify(pr) < 2)) { | 863 | if (result == -ENODEV) |
845 | result = acpi_processor_get_power_info_fadt(pr); | 864 | result = acpi_processor_get_power_info_fadt(pr); |
846 | if ((result) || (acpi_processor_power_verify(pr) < 2)) | 865 | |
847 | result = acpi_processor_get_power_info_default_c1(pr); | 866 | if ((result) || (acpi_processor_power_verify(pr) < 2)) |
848 | } | 867 | result = acpi_processor_get_power_info_default_c1(pr); |
849 | 868 | ||
850 | /* | 869 | /* |
851 | * Set Default Policy | 870 | * Set Default Policy |