Download raw body.
diff: trigger acpiac_refresh when acpibat notification
On Fri, Nov 29, 2024 at 12:19:22AM +0900, YASUOKA Masahiko wrote:
> Let me ping this diff.
> The diff becomes more important when we have hw.perfpolicy for me.
>
> ok? comments?
Seems like a pragmatic approach, but please see comments inline.
> On Thu, 17 Aug 2023 16:12:07 +0900 (JST)
> YASUOKA Masahiko <yasuoka@openbsd.org> wrote:
> > Hi,
> >
> > Update the AC status when the battery notification is happened.
> > Because the AC status notification doesn't happen on some machines.
> > My vaio actually has this problem.
> >
> > Also Linux is doing the same thing
> >
> > https://github.com/torvalds/linux/blob/v6.4/drivers/acpi/ac.c#L165-L183
>
> Index: sys/dev/acpi/acpiac.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/acpi/acpiac.c,v
> diff -u -p -r1.36 acpiac.c
> --- sys/dev/acpi/acpiac.c 6 Apr 2022 18:59:27 -0000 1.36
> +++ sys/dev/acpi/acpiac.c 28 Nov 2024 15:17:44 -0000
> @@ -140,6 +140,8 @@ acpiac_getpsr(struct acpiac_softc *sc)
> return (0);
> }
>
> +static int acpiac_notify_triggered = 0;
> +
> int
> acpiac_notify(struct aml_node *node, int notify_type, void *arg)
> {
> @@ -148,6 +150,8 @@ acpiac_notify(struct aml_node *node, int
> dnprintf(10, "acpiac_notify: %.2x %s\n", notify_type,
> DEVNAME(sc));
>
> + acpiac_notify_triggered = 1;
> +
> switch (notify_type) {
> case 0x00:
> case 0x01:
Here's the full function body,
---
int
acpiac_notify(struct aml_node *node, int notify_type, void *arg)
{
struct acpiac_softc *sc = arg;
dnprintf(10, "acpiac_notify: %.2x %s\n", notify_type,
DEVNAME(sc));
switch (notify_type) {
case 0x00:
case 0x01:
case 0x81:
/*
* XXX some sony vaio's use the wrong notify type
* work around it by honoring it as a 0x80
*/
/* FALLTHROUGH */
case 0x80:
acpiac_refresh(sc);
acpi_record_event(sc->sc_acpi, APM_POWER_CHANGE);
dnprintf(10, "A/C status: %d\n", sc->sc_ac_stat);
break;
}
return (0);
}
---
Maybe your Vaio uses yet another notification type? Did you try a
kernel built with ACPI_DEBUG?
> @@ -164,4 +168,22 @@ acpiac_notify(struct aml_node *node, int
> break;
> }
> return (0);
> +}
> +
> +void
> +acpiac_battery_notify(void)
> +{
> + struct acpi_softc *sc = acpi_softc;
> + struct acpi_ac *ac;
> +
> + if (acpiac_notify_triggered)
> + return;
> + /*
> + * On some machines (vaio VJPK23 at least) AC status notifications
> + * are not triggered. Update the AC status when battery notifications.
s/when/on/ ?
> + */
> + SLIST_FOREACH(ac, &sc->sc_ac, aac_link) {
> + acpiac_refresh(ac->aac_softc);
> + acpi_record_event(sc, APM_POWER_CHANGE);
> + }
> }
> Index: sys/dev/acpi/acpibat.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/acpi/acpibat.c,v
> diff -u -p -r1.72 acpibat.c
> --- sys/dev/acpi/acpibat.c 5 Aug 2024 18:37:29 -0000 1.72
> +++ sys/dev/acpi/acpibat.c 28 Nov 2024 15:17:44 -0000
> @@ -540,5 +540,7 @@ acpibat_notify(struct aml_node *node, in
> acpibat_refresh(sc);
> acpi_record_event(sc->sc_acpi, APM_POWER_CHANGE);
>
> + acpiac_battery_notify();
I'd suggest moving the acpiac_battery_notify() call between
acpibat_refresh() and acpi_record_event(). Thay way you don't need to
send an extra APM_POWER_CHANGE event from the acpiac_battery_notify()
function.
> +
> return (0);
> }
> Index: sys/dev/acpi/acpidev.h
> ===================================================================
> RCS file: /cvs/src/sys/dev/acpi/acpidev.h,v
> diff -u -p -r1.45 acpidev.h
> --- sys/dev/acpi/acpidev.h 6 Aug 2024 17:38:56 -0000 1.45
> +++ sys/dev/acpi/acpidev.h 28 Nov 2024 15:17:44 -0000
> @@ -307,6 +307,8 @@ struct acpiac_softc {
> struct ksensordev sc_sensdev;
> };
>
> +void acpiac_battery_notify(void);
> +
> struct acpibat_softc {
> struct device sc_dev;
>
>
--
jca
diff: trigger acpiac_refresh when acpibat notification