Hi, On Tue, May 16, 2023 at 01:25:40PM -0500, Mario Limonciello wrote: > The logic used for power_supply_is_system_supplied() counts all power > supplies and: > * If no power supplies found assumes AC > * If non-battery power supplies found uses online to determine AC/DC. > - If any are onlined, assumes AC > - Othewise DC. > > This logic makes sense for desktop systems that don't export an ACPI > battery, but it fails once you include a dGPU that provides a UCSI > power supply on a desktop system without any other power supplies. > > The dGPU by default doesn't have anything plugged in so it's 'offline'. > This makes power_supply_is_system_supplied() return 0 with a count of > 1 meaning all drivers that use this get a wrong judgement. > > To fix this case adjust the logic to also examine the scope of the > power supply. If the power supply is deemed a device power supply, > then don't count it. > > Cc: Evan Quan <Evan.Quan@xxxxxxx> > Suggested-by: Lijo Lazar <Lijo.Lazar@xxxxxxx> > Signed-off-by: Mario Limonciello <mario.limonciello@xxxxxxx> > --- Good find; the current logic should also break with a desktop PC once a POWER_SUPPLY_SCOPE_DEVICE battery device is attached (e.g. a HID device), because it increases the counter. I suppose I can just apply this to my fixes branch since there is no compile time dependency to the second patch? -- Sebastian > drivers/power/supply/power_supply_core.c | 8 ++++++-- > 1 file changed, 6 insertions(+), 2 deletions(-) > > diff --git a/drivers/power/supply/power_supply_core.c b/drivers/power/supply/power_supply_core.c > index ab986dbace16..d57f420ba8c3 100644 > --- a/drivers/power/supply/power_supply_core.c > +++ b/drivers/power/supply/power_supply_core.c > @@ -348,6 +348,10 @@ static int __power_supply_is_system_supplied(struct device *dev, void *data) > struct power_supply *psy = dev_get_drvdata(dev); > unsigned int *count = data; > > + if (!psy->desc->get_property(psy, POWER_SUPPLY_PROP_SCOPE, &ret)) > + if (ret.intval == POWER_SUPPLY_SCOPE_DEVICE) > + return 0; > + > (*count)++; > if (psy->desc->type != POWER_SUPPLY_TYPE_BATTERY) > if (!psy->desc->get_property(psy, POWER_SUPPLY_PROP_ONLINE, > @@ -366,8 +370,8 @@ int power_supply_is_system_supplied(void) > __power_supply_is_system_supplied); > > /* > - * If no power class device was found at all, most probably we are > - * running on a desktop system, so assume we are on mains power. > + * If no system scope power class device was found at all, most probably we > + * are running on a desktop system, so assume we are on mains power. > */ > if (count == 0) > return 1; > -- > 2.34.1 >
Attachment:
signature.asc
Description: PGP signature