mirror of
https://github.com/torvalds/linux
synced 2024-11-05 18:23:50 +00:00
ACPI and power management fixes for 3.14-rc7
- A recent ACPI resources handling fix overlooked the fact that it had to update the ACPI PNP subsystem's resources parsing too and caused confusing warning messages to be printed during system intialization on some systems (with arguably buggy ACPI tables). Fix from Zhang Rui. - Moving the early ACPI initialization before timekeeping_init() earlier in this cycle broke fast TSC calibration on at least one system, so it needs to be done later, but still before efi_enter_virtual_mode() to allow the EFI initialization to refer to ACPI. - A change related to code duplication reduction in the cpufreq core inadvertently caused cpufreq intialization to fail for some CPUs handled by intel_pstate by adding checks that may fail for that driver, but aren't even necessary when it is used. The issue is addressed by preventing those checks from run in the configurations in which they aren't needed. - If the Hardware Reduced ACPI flag is set in the ACPI tables, system suspend, hibernation and ACPI power off will only work when special sleep control and sleep status registeres are provided (their addresses in the ACPI tables are not zero). If those registers are not available, the features in question have no chances to work, so they shouldn't even be regarded as supported. That helps with power off in particular, because alternative power off methods may be used then and they may actually work. / -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iQIcBAABCAAGBQJTIyh1AAoJEILEb/54YlRxvw0P/RZIXtY5+c87JSRy+T1BBhN0 icpA7Qxu2unfckyR+anEIwrOFV7cvAMti7vJONWtSaFjp4sF8u2oEzs5T92DN74z 455sdieSZiTwDlvcbehSiaX6LFniK5OYLZ2RFGYh1D9uoxCSzfb9eugo7RNR+2iO UMTMQG2RmI2bmjLHLTzotMRxmjRd8RSMVAwvyNULgDAZlrmfKwojqKyJUB7NThAm kfAqVfzGs49+i0KF9hQrMeCEfNQF3Kj/HWMM78GHBNYu1uJVv+gXxMRUd8F9rGAO d4Xy14lfLpjPeH/DCO+hqA9eu74gM5nwjM3DbUnsFtt+FUmyBPemnTHCksUfHEeH wZlzuW0CndRqLijQa9tcFD6eeyh2tMztXCDu8r/UhpW1yGPkmW+SAU36SqqbmaGv knU+2jte4i/p4etNyPlfNb9mX9G59QQLISkRRfD8hnMm79TGaVT1tVGQ8RCqEG8p 73kVhISZ2WLjO9dLG5q/3uzFvZdJNWPfI/9l570mz2M5+X7VeCMA/tDx5ofDz/hQ 5JWvqIzYDSSOGxTtB1xR9TuwtQblAnsiVlqUoEwfqZ8O8u+RdvP5ymgUREPvLQFN jkCS1hdFleudZxqrn29MeEOJJg7DvFPyliMVvCxB2k1bg4HgJYWoZ0Hv0v0SKTd9 aCjbIOYxiLYV9clBSyLZ =d2+L -----END PGP SIGNATURE----- Merge tag 'pm+acpi-3.14-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm Pull ACPI and power management fixes from Rafael Wysocki: "Three of these are regression fixes, for two recent regressions and one introduced during the 3.13 cycle, and the fourth one is a working version of the fix that had to be reverted last time. Specifics: - A recent ACPI resources handling fix overlooked the fact that it had to update the ACPI PNP subsystem's resources parsing too and caused confusing warning messages to be printed during system intialization on some systems (with arguably buggy ACPI tables). Fix from Zhang Rui. - Moving the early ACPI initialization before timekeeping_init() earlier in this cycle broke fast TSC calibration on at least one system, so it needs to be done later, but still before efi_enter_virtual_mode() to allow the EFI initialization to refer to ACPI. - A change related to code duplication reduction in the cpufreq core inadvertently caused cpufreq intialization to fail for some CPUs handled by intel_pstate by adding checks that may fail for that driver, but aren't even necessary when it is used. The issue is addressed by preventing those checks from run in the configurations in which they aren't needed. - If the Hardware Reduced ACPI flag is set in the ACPI tables, system suspend, hibernation and ACPI power off will only work when special sleep control and sleep status registeres are provided (their addresses in the ACPI tables are not zero). If those registers are not available, the features in question have no chances to work, so they shouldn't even be regarded as supported. That helps with power off in particular, because alternative power off methods may be used then and they may actually work" * tag 'pm+acpi-3.14-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm: ACPI / sleep: Add extra checks for HW Reduced ACPI mode sleep states ACPI / init: Invoke early ACPI initialization later cpufreq: Skip current frequency initialization for ->setpolicy drivers PNP / ACPI: proper handling of ACPI IO/Memory resource parsing failures
This commit is contained in:
commit
cee152ff8a
4 changed files with 30 additions and 23 deletions
|
@ -71,6 +71,17 @@ static int acpi_sleep_prepare(u32 acpi_state)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static bool acpi_sleep_state_supported(u8 sleep_state)
|
||||
{
|
||||
acpi_status status;
|
||||
u8 type_a, type_b;
|
||||
|
||||
status = acpi_get_sleep_type_data(sleep_state, &type_a, &type_b);
|
||||
return ACPI_SUCCESS(status) && (!acpi_gbl_reduced_hardware
|
||||
|| (acpi_gbl_FADT.sleep_control.address
|
||||
&& acpi_gbl_FADT.sleep_status.address));
|
||||
}
|
||||
|
||||
#ifdef CONFIG_ACPI_SLEEP
|
||||
static u32 acpi_target_sleep_state = ACPI_STATE_S0;
|
||||
|
||||
|
@ -604,15 +615,9 @@ static void acpi_sleep_suspend_setup(void)
|
|||
{
|
||||
int i;
|
||||
|
||||
for (i = ACPI_STATE_S1; i < ACPI_STATE_S4; i++) {
|
||||
acpi_status status;
|
||||
u8 type_a, type_b;
|
||||
|
||||
status = acpi_get_sleep_type_data(i, &type_a, &type_b);
|
||||
if (ACPI_SUCCESS(status)) {
|
||||
for (i = ACPI_STATE_S1; i < ACPI_STATE_S4; i++)
|
||||
if (acpi_sleep_state_supported(i))
|
||||
sleep_states[i] = 1;
|
||||
}
|
||||
}
|
||||
|
||||
suspend_set_ops(old_suspend_ordering ?
|
||||
&acpi_suspend_ops_old : &acpi_suspend_ops);
|
||||
|
@ -740,11 +745,7 @@ static const struct platform_hibernation_ops acpi_hibernation_ops_old = {
|
|||
|
||||
static void acpi_sleep_hibernate_setup(void)
|
||||
{
|
||||
acpi_status status;
|
||||
u8 type_a, type_b;
|
||||
|
||||
status = acpi_get_sleep_type_data(ACPI_STATE_S4, &type_a, &type_b);
|
||||
if (ACPI_FAILURE(status))
|
||||
if (!acpi_sleep_state_supported(ACPI_STATE_S4))
|
||||
return;
|
||||
|
||||
hibernation_set_ops(old_suspend_ordering ?
|
||||
|
@ -793,8 +794,6 @@ static void acpi_power_off(void)
|
|||
|
||||
int __init acpi_sleep_init(void)
|
||||
{
|
||||
acpi_status status;
|
||||
u8 type_a, type_b;
|
||||
char supported[ACPI_S_STATE_COUNT * 3 + 1];
|
||||
char *pos = supported;
|
||||
int i;
|
||||
|
@ -806,8 +805,7 @@ int __init acpi_sleep_init(void)
|
|||
acpi_sleep_suspend_setup();
|
||||
acpi_sleep_hibernate_setup();
|
||||
|
||||
status = acpi_get_sleep_type_data(ACPI_STATE_S5, &type_a, &type_b);
|
||||
if (ACPI_SUCCESS(status)) {
|
||||
if (acpi_sleep_state_supported(ACPI_STATE_S5)) {
|
||||
sleep_states[ACPI_STATE_S5] = 1;
|
||||
pm_power_off_prepare = acpi_power_off_prepare;
|
||||
pm_power_off = acpi_power_off;
|
||||
|
|
|
@ -1129,7 +1129,7 @@ static int __cpufreq_add_dev(struct device *dev, struct subsys_interface *sif,
|
|||
per_cpu(cpufreq_cpu_data, j) = policy;
|
||||
write_unlock_irqrestore(&cpufreq_driver_lock, flags);
|
||||
|
||||
if (cpufreq_driver->get) {
|
||||
if (cpufreq_driver->get && !cpufreq_driver->setpolicy) {
|
||||
policy->cur = cpufreq_driver->get(policy->cpu);
|
||||
if (!policy->cur) {
|
||||
pr_err("%s: ->get() failed\n", __func__);
|
||||
|
@ -2143,7 +2143,7 @@ int cpufreq_update_policy(unsigned int cpu)
|
|||
* BIOS might change freq behind our back
|
||||
* -> ask driver for current freq and notify governors about a change
|
||||
*/
|
||||
if (cpufreq_driver->get) {
|
||||
if (cpufreq_driver->get && !cpufreq_driver->setpolicy) {
|
||||
new_policy.cur = cpufreq_driver->get(cpu);
|
||||
if (!policy->cur) {
|
||||
pr_debug("Driver did not initialize current freq");
|
||||
|
|
|
@ -183,9 +183,7 @@ static acpi_status pnpacpi_allocated_resource(struct acpi_resource *res,
|
|||
struct resource r = {0};
|
||||
int i, flags;
|
||||
|
||||
if (acpi_dev_resource_memory(res, &r)
|
||||
|| acpi_dev_resource_io(res, &r)
|
||||
|| acpi_dev_resource_address_space(res, &r)
|
||||
if (acpi_dev_resource_address_space(res, &r)
|
||||
|| acpi_dev_resource_ext_address_space(res, &r)) {
|
||||
pnp_add_resource(dev, &r);
|
||||
return AE_OK;
|
||||
|
@ -217,6 +215,17 @@ static acpi_status pnpacpi_allocated_resource(struct acpi_resource *res,
|
|||
}
|
||||
|
||||
switch (res->type) {
|
||||
case ACPI_RESOURCE_TYPE_MEMORY24:
|
||||
case ACPI_RESOURCE_TYPE_MEMORY32:
|
||||
case ACPI_RESOURCE_TYPE_FIXED_MEMORY32:
|
||||
if (acpi_dev_resource_memory(res, &r))
|
||||
pnp_add_resource(dev, &r);
|
||||
break;
|
||||
case ACPI_RESOURCE_TYPE_IO:
|
||||
case ACPI_RESOURCE_TYPE_FIXED_IO:
|
||||
if (acpi_dev_resource_io(res, &r))
|
||||
pnp_add_resource(dev, &r);
|
||||
break;
|
||||
case ACPI_RESOURCE_TYPE_DMA:
|
||||
dma = &res->data.dma;
|
||||
if (dma->channel_count > 0 && dma->channels[0] != (u8) -1)
|
||||
|
|
|
@ -561,7 +561,6 @@ asmlinkage void __init start_kernel(void)
|
|||
init_timers();
|
||||
hrtimers_init();
|
||||
softirq_init();
|
||||
acpi_early_init();
|
||||
timekeeping_init();
|
||||
time_init();
|
||||
sched_clock_postinit();
|
||||
|
@ -613,6 +612,7 @@ asmlinkage void __init start_kernel(void)
|
|||
calibrate_delay();
|
||||
pidmap_init();
|
||||
anon_vma_init();
|
||||
acpi_early_init();
|
||||
#ifdef CONFIG_X86
|
||||
if (efi_enabled(EFI_RUNTIME_SERVICES))
|
||||
efi_enter_virtual_mode();
|
||||
|
|
Loading…
Reference in a new issue