(Missing) power states of an Atom N455-based netbook

Andriy Gapon avg at FreeBSD.org
Wed Jul 6 14:23:27 UTC 2011


on 06/07/2011 00:49 Vitaly Magerya said the following:
> Andriy Gapon <avg at freebsd.org> wrote:
>> Possible courses of action:
>>
>> 1. Do nothing and leave you with your workaround.
>>
>> 2. Provide intel_idle-like driver for FreeBSD.  I don't like this approach for
>> reasons I've stated before.
>>
>> 3. Try to make FreeBSD smarter with respect to dynamically changing C-states.  I
>> think it would be useful if we received a devd notifications about C-state
>> reconfiguration.  Then we could execute /etc/rc.d/power_profile to account for the
>> new configuration.
> 
> This would be the most useful option.

I agree! :)

> Here's what I tried (trivial diff, sending inline):
> 
> --- acpi_cpu.c.orig     2011-07-05 19:50:31.000000000 +0000
> +++ acpi_cpu.c  2011-07-05 21:44:56.000000000 +0000
> @@ -988,12 +988,13 @@
>  {
>      struct acpi_cpu_softc *sc = (struct acpi_cpu_softc *)context;
>      struct acpi_cpu_softc *isc;
> -    int i;
> +    int prev_cx_count, i;
> 
>      if (notify != ACPI_NOTIFY_CX_STATES)
>         return;
> 
>      /* Update the list of Cx states. */
> +    prev_cx_count = sc->cpu_cx_count;
>      acpi_cpu_cx_cst(sc);
>      acpi_cpu_cx_list(sc);
> 
> @@ -1008,6 +1009,8 @@
>      if (sc->cpu_cx_lowest < cpu_cx_lowest)
>         acpi_cpu_set_cx_lowest(sc, min(cpu_cx_lowest, sc->cpu_cx_count - 1));
>      ACPI_SERIAL_END(cpu);
> +    if (prev_cx_count != sc->cpu_cx_count)
> +       acpi_UserNotify("CPU_CX", h, sc->cpu_cx_count);
>  }
> 
>  static int
> --- devd.conf.orig      2011-07-05 20:19:30.000000000 +0000
> +++ devd.conf   2011-07-05 20:30:08.000000000 +0000
> @@ -209,6 +209,13 @@
>         action "/etc/rc.d/power_profile $notify";
>  };
> 
> +# Update power profile when available CPU Cx states are updated.
> +notify 10 {
> +       match "system"          "ACPI";
> +       match "subsystem"       "CPU_CX";
> +       action "/etc/rc.d/power_profile 0x0`sysctl -n hw.acpi.acline`";
> +};
> +
>  # Notify all users before beginning emergency shutdown when we get
>  # a _CRT or _HOT thermal event and we're going to power down the system
>  # very soon.
> 
> This generally works, except that power_profile is executed multiple
> times (the event is generated once per core, and when it is triggered
> by plugging the power cord, ACPI ACAD is reported at the same time
> thus resulting in one more power_profile execution).

At this time and for this purpose I would probably send the notification only if
global cx_lowest value changes as we do not do per-CPU power profiles.

Also, I think that cpu_cx_count is not the best parameter for notification.
For per-cpu events I would rather use CPU ID.  For global events, it may makes
sense to use /subsystem/ value of "CPU" and then discriminate various types of CPU
events via /notify/.  E.g. notify=0 could be used to indicate Cx changes.  Maybe
we will have more ACPI CPU events in the future.

Otherwise I really like this, thank you.

-- 
Andriy Gapon


More information about the freebsd-acpi mailing list