From patchwork Sat Feb 8 16:22:07 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mario Limonciello X-Patchwork-Id: 863709 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 56C911F17EF; Sat, 8 Feb 2025 16:22:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739031742; cv=none; b=id7hX+yRfR9boZyiAidUB0u43Pkj7aJsqv5z9T5/xhq7r/2n1JjNsSiwKN3PJaWTOsLzd3GMEqpQostv+QqMws9irroDHyl05dZFwgh5gF2DIK8GcLxX7dBlIzM+AqV7D4b9G8JeR5xXBhRfQCiZ4al3QCcoSwgDl8SBx9NWX4c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739031742; c=relaxed/simple; bh=J5y6IgrSOVtBq4uouiKtoAz+C0U/0HD51b5eO4I/M+Y=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Xx/57oSiPWP1C7jIOPS98Gq9X4boM0jjTfpf88DSP2hMiuNl6kXi8BHXZ0PC4RL7s9i27/ckOK3B7HfXj38N7OaYvmgxD7tOMkBckEtaFgtFW/vJT4/4rp7mHWdyUbMQz/agk1WGHdrZA+ZRK3omgeKh6zweKA0CHH1nOXqiTp0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=i3aH5GOC; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="i3aH5GOC" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 88DD9C4CEE6; Sat, 8 Feb 2025 16:22:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1739031742; bh=J5y6IgrSOVtBq4uouiKtoAz+C0U/0HD51b5eO4I/M+Y=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=i3aH5GOCsVxb5Smu8sPdbA95ePMG/TwiD0PJGeI6y2/wgXHg8ISTxRmQXHxHoFBQ3 n9E9pn+k1Ds8pVDTac2ShdjWckocSCdNwGIWss43omF0AWsTczRZh7WxpohJZIz2aU pSz/Sa9M3HFaYIHM9eRKrb3YAJdLQ+i3NjxzdS/UN6sJEmsdp1qB6ZoWmWYma0kNH/ 5AwonkbCvZzQ7A96SCp3phv22HZLMEQ1KwjnISHZe83dmmew/vx++ziIhzvrFiYvlj J/JHOnteKQbfUrnyifUOh/Xa5NoCx+fr8hichmhDiKnOIuPmMCBFmOLxLqfYxaNygp Xs0fa0oI3yBDg== From: Mario Limonciello To: "Rafael J . Wysocki" Cc: Len Brown , Pavel Machek , linux-acpi@vger.kernel.org (open list:ACPI), linux-pm@vger.kernel.org (open list:HIBERNATION (aka Software Suspend, aka swsusp)), Mario Limonciello Subject: [PATCH 1/4] PM: Add sysfs file for energy consumed over sleep cycle Date: Sat, 8 Feb 2025 10:22:07 -0600 Message-ID: <20250208162210.3929473-2-superm1@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250208162210.3929473-1-superm1@kernel.org> References: <20250208162210.3929473-1-superm1@kernel.org> Precedence: bulk X-Mailing-List: linux-pm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Mario Limonciello During a sleep cycle the system will consume power to keep the platform in s2idle or s3. On systems running on a battery this can be measured by comparing battery before and after the sleep cycle. Add a symbol for the battery to report current energy level and a sysfs file to show this information to a user. Signed-off-by: Mario Limonciello --- Documentation/ABI/testing/sysfs-power | 8 ++++++++ include/linux/suspend.h | 2 ++ kernel/power/main.c | 10 ++++++++++ 3 files changed, 20 insertions(+) diff --git a/Documentation/ABI/testing/sysfs-power b/Documentation/ABI/testing/sysfs-power index a3942b1036e25..e263355f99fc1 100644 --- a/Documentation/ABI/testing/sysfs-power +++ b/Documentation/ABI/testing/sysfs-power @@ -442,6 +442,14 @@ Description: 'total_hw_sleep' and 'last_hw_sleep' may not be accurate. This number is measured in microseconds. +What: /sys/power/suspend_stats/last_sleep_energy +Date: March 2025 +Contact: Mario Limonciello +Description: + The /sys/power/suspend_stats/last_sleep_energy file + contains the amount of energy that the battery consumed + during the last sleep cycle. This number is measured in mAh. + What: /sys/power/sync_on_suspend Date: October 2019 Contact: Jonas Meurer diff --git a/include/linux/suspend.h b/include/linux/suspend.h index da6ebca3ff774..9627e2394c8a9 100644 --- a/include/linux/suspend.h +++ b/include/linux/suspend.h @@ -441,6 +441,7 @@ extern int unregister_pm_notifier(struct notifier_block *nb); extern void ksys_sync_helper(void); extern void pm_report_hw_sleep_time(u64 t); extern void pm_report_max_hw_sleep(u64 t); +extern void pm_report_sleep_energy(u64 t); #define pm_notifier(fn, pri) { \ static struct notifier_block fn##_nb = \ @@ -484,6 +485,7 @@ static inline int unregister_pm_notifier(struct notifier_block *nb) static inline void pm_report_hw_sleep_time(u64 t) {}; static inline void pm_report_max_hw_sleep(u64 t) {}; +static inline void pm_report_sleep_energy(u64 t) {}; static inline void ksys_sync_helper(void) {} diff --git a/kernel/power/main.c b/kernel/power/main.c index 6254814d48171..9305c86e0b91a 100644 --- a/kernel/power/main.c +++ b/kernel/power/main.c @@ -321,6 +321,7 @@ struct suspend_stats { u64 last_hw_sleep; u64 total_hw_sleep; u64 max_hw_sleep; + u64 last_sleep_energy; enum suspend_stat_step failed_steps[REC_FAILED_NUM]; }; @@ -368,6 +369,12 @@ void pm_report_hw_sleep_time(u64 t) } EXPORT_SYMBOL_GPL(pm_report_hw_sleep_time); +void pm_report_sleep_energy(u64 t) +{ + suspend_stats.last_sleep_energy = t; +} +EXPORT_SYMBOL_GPL(pm_report_sleep_energy); + void pm_report_max_hw_sleep(u64 t) { suspend_stats.max_hw_sleep = t; @@ -399,6 +406,7 @@ suspend_attr(fail, "%u\n"); suspend_attr(last_hw_sleep, "%llu\n"); suspend_attr(total_hw_sleep, "%llu\n"); suspend_attr(max_hw_sleep, "%llu\n"); +suspend_attr(last_sleep_energy, "%llu\n"); #define suspend_step_attr(_name, step) \ static ssize_t _name##_show(struct kobject *kobj, \ @@ -477,6 +485,7 @@ static struct attribute *suspend_attrs[] = { &last_hw_sleep.attr, &total_hw_sleep.attr, &max_hw_sleep.attr, + &last_sleep_energy.attr, NULL, }; @@ -484,6 +493,7 @@ static umode_t suspend_attr_is_visible(struct kobject *kobj, struct attribute *a { if (attr != &last_hw_sleep.attr && attr != &total_hw_sleep.attr && + attr != &last_sleep_energy.attr && attr != &max_hw_sleep.attr) return 0444; From patchwork Sat Feb 8 16:22:08 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mario Limonciello X-Patchwork-Id: 863525 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 47FA01F17EF; Sat, 8 Feb 2025 16:22:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739031743; cv=none; b=l9rBlwGrfPKzKzaqs9Zdwc/Y4NXiFodfWeG9hV9ZTECybLvN7nWTvFr6mack34WjyYhSwnSPT2njqA8HcoWaxtgNF9ZEtZCXltveIriiloPPJu4YrXXRLzgF66e5D2ub/nrIlL5g7lVxjp3ttc/VJHsDsmD34IbiteJORfg35Wk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739031743; c=relaxed/simple; bh=HMyexdvrSbhPi8L8f9PM8AX6KBSHh5CStz+s+JDgAIY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=NGQXudLoczqGseIO/pmjN7S6INHLlfcJzpny6lNd7Lxk4P37oNtlteVzFPUH4QYyNAgnInmeU/OcdJgLEZbL6jmXbSGUziHDdtY1CzwsV0gPn0e/ECzEUEzeVrW/87lnfV0ZQIvYItPl6AYqs3aDgvN13Ju8mPXH6RKcjYIoKKA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=IHrP2rH6; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="IHrP2rH6" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 790C7C4CEE2; Sat, 8 Feb 2025 16:22:22 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1739031743; bh=HMyexdvrSbhPi8L8f9PM8AX6KBSHh5CStz+s+JDgAIY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=IHrP2rH6harAFsyYxcW4tN+JUIeDd54zlCMp9kmtjMXQD6XUuQS46u5aeEbuR5CD1 Wk/YuV5IWXOjosmiXxLy/ZO26lB7nrHmUfQ14EB5MspNSAFxYdKnefSCWWdqgEGWPa Q1AmPZnZJIx1yPbhPYRPR743Jlj1lwRdgI4cwMOVn+/sVjRoWHP6JEhxBMlexYdLBy 0Is5Za1RG9wVKtTb8+UTfx7IIAXcK04+zyAWeBCabJYS2ZPhkQKVvzMhsbf4BVyxMJ Tz1lEsEJqNFX5GK8llBfc2MRX5pWGyhrqHi3TKzL+cnyEf2NODjXnZD2DyY8lYbQAK xPW47qW3uFnJg== From: Mario Limonciello To: "Rafael J . Wysocki" Cc: Len Brown , Pavel Machek , linux-acpi@vger.kernel.org (open list:ACPI), linux-pm@vger.kernel.org (open list:HIBERNATION (aka Software Suspend, aka swsusp)), Mario Limonciello Subject: [PATCH 2/4] ACPI: battery: Save and report battery capacity over suspend Date: Sat, 8 Feb 2025 10:22:08 -0600 Message-ID: <20250208162210.3929473-3-superm1@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250208162210.3929473-1-superm1@kernel.org> References: <20250208162210.3929473-1-superm1@kernel.org> Precedence: bulk X-Mailing-List: linux-pm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Mario Limonciello To find out if a device is malfunctioning over suspend it's often interesting to know how much battery was lost. At the start of the suspend cycle cache the amount of battery. During resume, read the battery level again and if the battery has decreased report the difference to the suspend stats using pm_report_sleep_energy() Signed-off-by: Mario Limonciello --- drivers/acpi/battery.c | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/drivers/acpi/battery.c b/drivers/acpi/battery.c index 6760330a8af55..f21bfd02a26d1 100644 --- a/drivers/acpi/battery.c +++ b/drivers/acpi/battery.c @@ -124,6 +124,7 @@ struct acpi_battery { char oem_info[MAX_STRING_LENGTH]; int state; int power_unit; + int capacity_suspend; unsigned long flags; }; @@ -1011,9 +1012,6 @@ static int acpi_battery_update(struct acpi_battery *battery, bool resume) return 0; } - if (resume) - return 0; - if (!battery->update_time) { result = acpi_battery_get_info(battery); if (result) @@ -1032,6 +1030,14 @@ static int acpi_battery_update(struct acpi_battery *battery, bool resume) return result; } + if (resume) { + if (battery->capacity_suspend > battery->capacity_now) + pm_report_sleep_energy(battery->capacity_suspend - battery->capacity_now); + else + pm_report_sleep_energy(0); + return 0; + } + /* * Wakeup the system if battery is critical low * or lower than the alarm level @@ -1285,6 +1291,22 @@ static void acpi_battery_remove(struct acpi_device *device) } /* this is needed to learn about changes made in suspended state */ +static int acpi_battery_suspend(struct device *dev) +{ + struct acpi_battery *battery; + + if (!dev) + return -EINVAL; + + battery = acpi_driver_data(to_acpi_device(dev)); + if (!battery) + return -EINVAL; + + battery->capacity_suspend = battery->capacity_now; + + return 0; +} + static int acpi_battery_resume(struct device *dev) { struct acpi_battery *battery; @@ -1301,7 +1323,7 @@ static int acpi_battery_resume(struct device *dev) return 0; } -static DEFINE_SIMPLE_DEV_PM_OPS(acpi_battery_pm, NULL, acpi_battery_resume); +static DEFINE_SIMPLE_DEV_PM_OPS(acpi_battery_pm, acpi_battery_suspend, acpi_battery_resume); static struct acpi_driver acpi_battery_driver = { .name = "battery", From patchwork Sat Feb 8 16:22:09 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mario Limonciello X-Patchwork-Id: 863708 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9A9C51F30A7; Sat, 8 Feb 2025 16:22:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739031744; cv=none; b=TRm00KOFv5L10D+W2l7zuM7dQ84PnXEmUuM4uiwWr8Hy82fANDkjaRRx0ivzJNjOegS7S/F2o7OBOWSBGwdYhksidTuDTWtDKjb2Tl3h7T/My1UZJPdxpwPryyJjOIH+MiybznFACPFlLLabGYcKKwI9cov/ETt6E26ymjbOYec= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739031744; c=relaxed/simple; bh=2muv5zYZh0Q7pJ4CtFm/oFMjCjpUR5zI+SSHfjKgps8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=YxAEAP/lJbrFpp5IWclsOB2p8f8V/ht03DloOqHTUfrtDohSCinEPlhay3JYKT/+tzqfiEY9vOZzs3/TCGZkXdGpuvR8nKgpAEWAM+T3sNTzTpE/XLk70XOOprDls1crUVb1HbZqI1i0Xqs5Fcv5q5WvjAHwW5j+XS7BfS0vcHk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=mtOJOJxW; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="mtOJOJxW" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 6404DC4CEDF; Sat, 8 Feb 2025 16:22:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1739031744; bh=2muv5zYZh0Q7pJ4CtFm/oFMjCjpUR5zI+SSHfjKgps8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=mtOJOJxWWiYxmz5hPJMGzmHOJTBEfymdb/XRRJCz405p9xuQrtStRa2wEd8pyqiGt lNAqkQxhTFUOqhky6LhDIbDaFUf5+NdkC0i73QkThglGqTVawnURchxIT4BKgyzrc5 dsCLzy023SGFETefQeL6u5xjRNL8LOhYb/VH3Ypq4ASKL3PTOT66GRdxC3hfLm4duk o3MOvCxi9JzvUDIYnKrIFiVChhooOdrpZbbNkEOwkmVvzJ22epO8gY9R7qjSzXL7rj Da6SSWcPqcC0MFXeeAEIHNg7gSQ+RtJbsVDy2eqht7rsJxhIsz6r09uC8Erv68BcqE IbshK2Rm4pZsw== From: Mario Limonciello To: "Rafael J . Wysocki" Cc: Len Brown , Pavel Machek , linux-acpi@vger.kernel.org (open list:ACPI), linux-pm@vger.kernel.org (open list:HIBERNATION (aka Software Suspend, aka swsusp)), Mario Limonciello Subject: [PATCH 3/4] ACPI: battery: Refactor wakeup reasons in acpi_battery_update() Date: Sat, 8 Feb 2025 10:22:09 -0600 Message-ID: <20250208162210.3929473-4-superm1@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250208162210.3929473-1-superm1@kernel.org> References: <20250208162210.3929473-1-superm1@kernel.org> Precedence: bulk X-Mailing-List: linux-pm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Mario Limonciello Another reason to wake is to be introduced, so refactor the code to make it easier to follow. Also introduce PM debug messages so that it's more obvious when these wake events have occurred. Signed-off-by: Mario Limonciello --- drivers/acpi/battery.c | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/drivers/acpi/battery.c b/drivers/acpi/battery.c index f21bfd02a26d1..72c8a509695e6 100644 --- a/drivers/acpi/battery.c +++ b/drivers/acpi/battery.c @@ -999,6 +999,22 @@ static void acpi_battery_quirks(struct acpi_battery *battery) } } +static inline bool acpi_battery_should_wake(struct acpi_battery *battery) +{ + if (battery->state & ACPI_BATTERY_STATE_CRITICAL) { + pm_pr_dbg("Waking due critical battery level"); + return true; + } + + if (test_bit(ACPI_BATTERY_ALARM_PRESENT, &battery->flags) && + battery->capacity_now <= battery->alarm) { + pm_pr_dbg("Waking due to battery alarm"); + return true; + } + + return false; +} + static int acpi_battery_update(struct acpi_battery *battery, bool resume) { int result = acpi_battery_get_status(battery); @@ -1038,13 +1054,7 @@ static int acpi_battery_update(struct acpi_battery *battery, bool resume) return 0; } - /* - * Wakeup the system if battery is critical low - * or lower than the alarm level - */ - if ((battery->state & ACPI_BATTERY_STATE_CRITICAL) || - (test_bit(ACPI_BATTERY_ALARM_PRESENT, &battery->flags) && - (battery->capacity_now <= battery->alarm))) + if (acpi_battery_should_wake(battery)) acpi_pm_wakeup_event(&battery->device->dev); return result; From patchwork Sat Feb 8 16:22:10 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mario Limonciello X-Patchwork-Id: 863524 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0B2831F30B0; Sat, 8 Feb 2025 16:22:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739031745; cv=none; b=MDUteSHjgq50XcSG27f/lG3Y0nFOfKehbPZwKys6rkbXB2aiJgJDU71cphTbsY3Z3AQiF3RG2qBBnQzPwBf4dOam4USWCEgbMQ5ZLAQ5MyEG/wEaqnY90r0vcu1M+u+f3T9F6ZGywPRkyHKy60fCejnArUXMSNx0NEJKz3MFANQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739031745; c=relaxed/simple; bh=Dnni8GKPdcukcrtd2Tff75EhjCO+JRljRFGY6qeFkb8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Y5tqzq/ripYJXvv5R/11sUNaJpGDSP0wJqXdudJlrXR3c1XxX8fM6ctX9nKMK8pRSU8s3mO+PMmBc8upok7ntljZNazeoaeSp7A+vvgeE5dSHPWhOeQqB2UD/LNBrFscWylP5HshGfU9sURamBIp+OU+jZi9b4VnE4+ai/E+I1o= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=kcUBmrrc; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="kcUBmrrc" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 48299C4CED6; Sat, 8 Feb 2025 16:22:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1739031744; bh=Dnni8GKPdcukcrtd2Tff75EhjCO+JRljRFGY6qeFkb8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=kcUBmrrcLD7nU+nXCUnvY49YC3G3awge9rTbeWD3y9gaBPwfh8iW9Zr4rJJWpZVqp aDXKuweAopfXqBG0ENoqkz+++/73dAVgTh5LKN3dlrY6tNbEu/dfPb+S41DaCuTCsp dClmOBlMkiVPjcdctGSY6k2lEaYLpkRTVKRf/kEnoPsF3UN0oGhYiG/jYkb2DrWsC5 AUAY4hqejrzoOWP2eSKMWVW59pHywwhHyb1J2rvJpEfKPlQqTsOxr3knR9wakRMhdl 5pDfspJXyHYwFPuhKwXtbFc+CLMm3ldjU/E9AxOpN9tEJCZNXBzVbGVb6gg1Xu0I2j 5tHmpY/iSYxbw== From: Mario Limonciello To: "Rafael J . Wysocki" Cc: Len Brown , Pavel Machek , linux-acpi@vger.kernel.org (open list:ACPI), linux-pm@vger.kernel.org (open list:HIBERNATION (aka Software Suspend, aka swsusp)), Mario Limonciello Subject: [PATCH 4/4] ACPI: battery: Wake system on AC plug or unplug in over s2idle Date: Sat, 8 Feb 2025 10:22:10 -0600 Message-ID: <20250208162210.3929473-5-superm1@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250208162210.3929473-1-superm1@kernel.org> References: <20250208162210.3929473-1-superm1@kernel.org> Precedence: bulk X-Mailing-List: linux-pm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Mario Limonciello On Windows the OS will wake up when plugged or unplugged from AC adapter. Depending upon whether the system was plugged in or unplugged will determine whether the "display turns on". If there is no user activity for some time then it goes back to sleep. In Linux plugging or unplugging an adapter will wake the SoC from HW sleep but then the Linux kernel puts it right back into HW sleep immediately unless there is another interrupt active (such as a PME or GPIO). To get closer to the Windows behavior, record the state of the battery when going into suspend and compare it when updating battery status during the s2idle loop. If it's changed, wake the system. This can be restored to previous behavior by disabling the ACPI battery device `power/wakeup` sysfs file. Link: https://learn.microsoft.com/en-us/windows-hardware/design/device-experiences/modern-standby-wake-sources#environmental-context-changes-1 Signed-off-by: Mario Limonciello --- drivers/acpi/battery.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/drivers/acpi/battery.c b/drivers/acpi/battery.c index 72c8a509695e6..91f79927cc720 100644 --- a/drivers/acpi/battery.c +++ b/drivers/acpi/battery.c @@ -125,6 +125,7 @@ struct acpi_battery { int state; int power_unit; int capacity_suspend; + int suspend_state; unsigned long flags; }; @@ -1012,6 +1013,12 @@ static inline bool acpi_battery_should_wake(struct acpi_battery *battery) return true; } + if (battery->state != battery->suspend_state) { + pm_pr_dbg("Waking due to battery state changed from 0x%x to 0x%x", + battery->suspend_state, battery->state); + return true; + } + return false; } @@ -1313,6 +1320,7 @@ static int acpi_battery_suspend(struct device *dev) return -EINVAL; battery->capacity_suspend = battery->capacity_now; + battery->suspend_state = battery->state; return 0; }