Skip to contentSkip to conversation

ACPI / PM: Do not power manage devices in unknown initial states

PATCH RESEND In review Rafael J. Wysocki 2 participants 5 messages Jan 31, 2013 – Mar 9, 2013 ACPI

lore
Share & tools
lore
#0 lore raw

PATCH RESEND 1/1 ACPI / PM: Do not power manage devices in unknown initial states

From: Rafael J. Wysocki <[email protected]>

In general, for ACPI device power management to work, the initial power states of devices must be known (otherwise, we wouldn't be able to keep track of power resources, for example). Hence, if it is impossible to determine the initial ACPI power states of some devices, they can't be regarded as power-manageable using ACPI.

For this reason, modify acpi_bus_get_power_flags() to clear the power_manageable flag if acpi_bus_init_power() fails and add some extra fallback code to acpi_bus_init_power() to cover broken BIOSes that provide _PS0/_PS3 without _PSC for some devices.

Verified to work on my HP nx6325 that has this problem.

---
 drivers/acpi/device_pm.c |    6 ++++++
 drivers/acpi/scan.c      |    5 ++++-
 2 files changed, 10 insertions(+), 1 deletion(-)
drivers/acpi/device_pm.c +6 -0
Index: linux-pm/drivers/acpi/device_pm.c
===================================================================
@@ -330,6 +330,12 @@ int acpi_bus_init_power(struct acpi_devi
 		result = acpi_dev_pm_explicit_set(device, state);
 		if (result)
 			return result;
+	} else if (state == ACPI_STATE_UNKNOWN) {
+		/* No power resources and missing _PSC? Try to force D0. */
+		state = ACPI_STATE_D0;
+		result = acpi_dev_pm_explicit_set(device, state);
+		if (result)
+			return result;
 	}
 	device->power.state = state;
 	return 0;
drivers/acpi/scan.c +4 -1
Index: linux-pm/drivers/acpi/scan.c
===================================================================
@@ -1175,7 +1175,10 @@ static void acpi_bus_get_power_flags(str
 			device->power.flags.power_resources)
 		device->power.states[ACPI_STATE_D3_COLD].flags.os_accessible = 1;
 
-	acpi_bus_init_power(device);
+	if (acpi_bus_init_power(device)) {
+		acpi_free_power_resources_lists(device);
+		device->flags.power_manageable = 0;
+	}
 }
 
 static void acpi_bus_get_flags(struct acpi_device *device)
Tested-by on v1 1/1
#1 lore raw
Quoted 6 lines · On Thursday 31 January 2013 23:32:40 Rafael J. Wysocki wrote:

In general, for ACPI device power management to work, the initial power states of devices must be known (otherwise, we wouldn't be able to keep track of power resources, for example). Hence, if it is impossible to determine the initial ACPI power states of some devices, they can't be regarded as power-manageable using ACPI.

Quoted 8 lines

For this reason, modify acpi_bus_get_power_flags() to clear the power_manageable flag if acpi_bus_init_power() fails and add some extra fallback code to acpi_bus_init_power() to cover broken BIOSes that provide _PS0/_PS3 without _PSC for some devices.

Verified to work on my HP nx6325 that has this problem.

I applied it on top of branch linux-next of repo linux-pm.

Fixes the issue I had with bbswitch in Linux 3.8. Can a backport patch be made available for 3.8?

Regards,
Peter

#2 lore raw
Quoted 14 lines · Peter Wu
Quoted 13 lines · On Thursday 31 January 2013 23:32:40 Rafael J. Wysocki wrote:

In general, for ACPI device power management to work, the initial power states of devices must be known (otherwise, we wouldn't be able to keep track of power resources, for example). Hence, if it is impossible to determine the initial ACPI power states of some devices, they can't be regarded as power-manageable using ACPI.

For this reason, modify acpi_bus_get_power_flags() to clear the power_manageable flag if acpi_bus_init_power() fails and add some extra fallback code to acpi_bus_init_power() to cover broken BIOSes that provide _PS0/_PS3 without _PSC for some devices.

Verified to work on my HP nx6325 that has this problem.

Quoted 8 lines
Quoted 1 line

I applied it on top of branch linux-next of repo linux-pm.

Fixes the issue I had with bbswitch in Linux 3.8. Can a backport patch be made available for 3.8?

Yes, after this commit enters the mainline. Please ping me some time around 3.9-rc1.

Thanks,
Rafael

Signature · 2 lines
I speak only for myself.
Rafael J. Wysocki, Intel Open Source Technology Center.
#3 lore raw
Quoted 33 lines · On Friday 01 February 2013 22:44:55 Rafael J. Wysocki wrote:
Quoted 32 lines · Peter Wu
Quoted 15 lines · On Thursday 31 January 2013 23:32:40 Rafael J. Wysocki wrote:

In general, for ACPI device power management to work, the initial power states of devices must be known (otherwise, we wouldn't be able to keep track of power resources, for example). Hence, if it is impossible to determine the initial ACPI power states of some devices, they can't be regarded as power-manageable using ACPI.

For this reason, modify acpi_bus_get_power_flags() to clear the power_manageable flag if acpi_bus_init_power() fails and add some extra fallback code to acpi_bus_init_power() to cover broken BIOSes that provide _PS0/_PS3 without _PSC for some devices.

Quoted 5 lines

Verified to work on my HP nx6325 that has this problem.

I applied it on top of branch linux-next of repo linux-pm.

Quoted 5 lines
Quoted 2 lines

Fixes the issue I had with bbswitch in Linux 3.8. Can a backport patch be made available for 3.8?

Yes, after this commit enters the mainline. Please ping me some time around 3.9-rc1.

Now that this patch has entered 3.9-rc1, can this be backported to the 3.8 series?

commit b3785492268f9f3cdaa9722facb84b266dcf8bf6

Author: Rafael J. Wysocki <[email protected]>
Date:   Fri Feb 1 23:43:02 2013 +0100

Regards,
Peter

#4 lore raw
In reply to Rafael J. Wysocki
Quoted 33 lines · On Friday 01 February 2013 22:44:55 Rafael J. Wysocki wrote:
Quoted 32 lines · Peter Wu
Quoted 15 lines · On Thursday 31 January 2013 23:32:40 Rafael J. Wysocki wrote:

In general, for ACPI device power management to work, the initial power states of devices must be known (otherwise, we wouldn't be able to keep track of power resources, for example). Hence, if it is impossible to determine the initial ACPI power states of some devices, they can't be regarded as power-manageable using ACPI.

For this reason, modify acpi_bus_get_power_flags() to clear the power_manageable flag if acpi_bus_init_power() fails and add some extra fallback code to acpi_bus_init_power() to cover broken BIOSes that provide _PS0/_PS3 without _PSC for some devices.

Quoted 5 lines

Verified to work on my HP nx6325 that has this problem.

I applied it on top of branch linux-next of repo linux-pm.

Quoted 5 lines
Quoted 2 lines

Fixes the issue I had with bbswitch in Linux 3.8. Can a backport patch be made available for 3.8?

Yes, after this commit enters the mainline. Please ping me some time around 3.9-rc1.

This patch does not apply on 3.8.2, any suggestions?

Regards,
Peter