public inbox for linux-acpi@vger.kernel.org
 help / color / mirror / Atom feed
From: Mario Limonciello <superm1@kernel.org>
To: Sebastian Reichel <sebastian.reichel@collabora.com>
Cc: "Rafael J . Wysocki" <rafael@kernel.org>,
	Len Brown <lenb@kernel.org>, Pavel Machek <pavel@ucw.cz>,
	"open list:ACPI" <linux-acpi@vger.kernel.org>,
	"open list:HIBERNATION (aka Software Suspend,
	aka swsusp)" <linux-pm@vger.kernel.org>,
	Mario Limonciello <mario.limonciello@amd.com>
Subject: Re: [PATCH 2/4] ACPI: battery: Save and report battery capacity over suspend
Date: Mon, 10 Feb 2025 15:24:42 -0600	[thread overview]
Message-ID: <c8527274-fd84-4745-b996-d1c66694aba4@kernel.org> (raw)
In-Reply-To: <bzltxadthnef5c4xaidfcjuq7tt2h23znn76povptoxbb2iax6@xvuzfqbtomzb>

On 2/10/2025 09:23, Sebastian Reichel wrote:
> Hi,
> 
> On Sat, Feb 08, 2025 at 10:22:08AM -0600, Mario Limonciello wrote:
>> From: Mario Limonciello <mario.limonciello@amd.com>
>>
>> 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 <mario.limonciello@amd.com>
>> ---
> 
> This code assumes, that there is only a single battery, but there
> can be more than one battery supplying the system. For example
> Thinkpads used to have an internal battery and a user swappable
> one.
> 
> Also it seems in almost all cases debugging this from userspace
> by dropping a script in /usr/lib/systemd/system-sleep is good
> enough, so I wonder if extending the kernel ABI makes sense at
> all.
> 

Thanks for looking.  I think it could be extended to add all the 
batteries up and collectively look at how much each went down.

But that's a good point it's pretty easy to do the same thing from 
userspace.

> Greetings,
> 
> -- Sebastian
> 
>>   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",
>> -- 
>> 2.43.0
>>
>>


  reply	other threads:[~2025-02-10 21:24 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-02-08 16:22 [PATCH 0/4] Improvements to ACPI battery handling over s2idle Mario Limonciello
2025-02-08 16:22 ` [PATCH 1/4] PM: Add sysfs file for energy consumed over sleep cycle Mario Limonciello
2025-02-08 16:22 ` [PATCH 2/4] ACPI: battery: Save and report battery capacity over suspend Mario Limonciello
2025-02-10 15:23   ` Sebastian Reichel
2025-02-10 21:24     ` Mario Limonciello [this message]
2025-02-08 16:22 ` [PATCH 3/4] ACPI: battery: Refactor wakeup reasons in acpi_battery_update() Mario Limonciello
2025-02-08 16:22 ` [PATCH 4/4] ACPI: battery: Wake system on AC plug or unplug in over s2idle Mario Limonciello
2025-02-08 17:59   ` Rafael J. Wysocki
2025-02-09 13:14     ` Mario Limonciello
2025-02-12 13:49       ` Armin Wolf
2025-02-12 13:57         ` Rafael J. Wysocki

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=c8527274-fd84-4745-b996-d1c66694aba4@kernel.org \
    --to=superm1@kernel.org \
    --cc=lenb@kernel.org \
    --cc=linux-acpi@vger.kernel.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=mario.limonciello@amd.com \
    --cc=pavel@ucw.cz \
    --cc=rafael@kernel.org \
    --cc=sebastian.reichel@collabora.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox