@@ -290,7 +290,7 @@ static void lpi_device_get_constraints(void)
ACPI_FREE(out_obj);
}
-static void lpi_check_constraints(void)
+static void lpi_check_constraints(bool *met)
{
int i;
@@ -312,11 +312,13 @@ static void lpi_check_constraints(void)
continue;
}
- if (adev->power.state < lpi_constraints_table[i].min_dstate)
+ if (adev->power.state < lpi_constraints_table[i].min_dstate) {
acpi_handle_info(handle,
"LPI: Constraint not met; min power state:%s current power state:%s\n",
acpi_power_state_string(lpi_constraints_table[i].min_dstate),
acpi_power_state_string(adev->power.state));
+ *met = false;
+ }
}
}
@@ -448,13 +450,14 @@ static struct acpi_scan_handler lps0_handler = {
int acpi_s2idle_prepare_late(void)
{
struct lps0_callback_handler *handler;
+ bool constraints_met = true;
int rc = 0;
if (!lps0_device_handle || sleep_no_lps0)
return 0;
if (pm_debug_messages_on)
- lpi_check_constraints();
+ lpi_check_constraints(&constraints_met);
/* Screen off */
if (lps0_dsm_func_mask > 0)
@@ -483,7 +486,7 @@ int acpi_s2idle_prepare_late(void)
mutex_lock(&lps0_callback_handler_mutex);
list_for_each_entry(handler, &lps0_callback_handler_head, list_node) {
- rc = handler->prepare_late_callback(handler->context);
+ rc = handler->prepare_late_callback(handler->context, constraints_met);
if (rc)
goto out;
}
@@ -1026,7 +1026,7 @@ acpi_status acpi_os_prepare_extended_sleep(u8 sleep_state,
#ifdef CONFIG_X86
struct lps0_callback_handler {
struct list_head list_node;
- int (*prepare_late_callback)(void *context);
+ int (*prepare_late_callback)(void *context, bool constraints);
void (*restore_early_callback)(void *context);
void *context;
};
If constraints checking has been enabled by the LPS0 code, it may also be useful for drivers using the callback to make a decision what to do. For example this may in the future allow a failing constraints check preventing another driver from notifying firmware that all required devices have entered the deepest state. Signed-off-by: Mario Limonciello <mario.limonciello@amd.com> --- Changes from v1->v2: * rebase on top of changes in first patch drivers/acpi/x86/s2idle.c | 11 +++++++---- include/linux/acpi.h | 2 +- 2 files changed, 8 insertions(+), 5 deletions(-)