Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 6 Jul 2011 22:20:22 +0300
From:      Vitaly Magerya <vmagerya@gmail.com>
To:        Andriy Gapon <avg@freebsd.org>
Cc:        freebsd-acpi@freebsd.org
Subject:   Re: (Missing) power states of an Atom N455-based netbook
Message-ID:  <CAL409KxL8S%2BzMOmSXghAQHLJRCS19ft%2BLiCKMPPm1dgEyMV%2BSQ@mail.gmail.com>
In-Reply-To: <4E146FDB.2020602@FreeBSD.org>
References:  <BANLkTim%2B1UwquMJ32WP8wZBGkYxPv78MLA@mail.gmail.com> <4E05EB91.9090509@FreeBSD.org> <BANLkTi=dyNx=TjyEqYMhSkRtddjVA4nAtw@mail.gmail.com> <4E0862A0.7060405@FreeBSD.org> <BANLkTikmVUtLyANBSqYb%2BL-xkwQ4Zo51Eg@mail.gmail.com> <4E09BADF.7050702@FreeBSD.org> <BANLkTin_%2BZH%2Bo7rdR9ijHMtrXcSdH9ZSdQ@mail.gmail.com> <4E0A41C8.3000904@FreeBSD.org> <BANLkTikwgy%2BKuA5E5zXQKGT-eyV35YAVag@mail.gmail.com> <4E0CE158.6030804@FreeBSD.org> <BANLkTinRY-h%2BkpXtwWJ_L86qVRdoynFSdg@mail.gmail.com> <4E0DB58F.4070906@FreeBSD.org> <CAL409Kw=rUnm9D56KvYiFWiU-bp59KqKnPcUXL38rZsW_Qh8AQ@mail.gmail.com> <4E130154.9080809@FreeBSD.org> <CAL409KyX0jDd9U=7GExvyPR1cDxPwsMHm2b%2B1Tvmijhpg0iWDQ@mail.gmail.com> <4E146FDB.2020602@FreeBSD.org>

next in thread | previous in thread | raw e-mail | index | archive | help
Andriy Gapon <avg@freebsd.org> wrote:
>>> 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! :)

Actually, I have a simpler fix. We could allow setting hw.acpi.cx_lowest
to any value, including states that are not currently present. Then,
on updates to available Cx states, our ACPI code will automatically
set dev.cpu.N.cx_lowest to the closest valid value without the need
for a separate power_profile invocation.

Here's the diff:

--- acpi_cpu.c.orig     2011-07-05 19:50:31.000000000 +0000
+++ acpi_cpu.c  2011-07-06 17:23:16.000000000 +0000
@@ -1194,7 +1194,7 @@
     if (strlen(state) < 2 || toupper(state[0]) != 'C')
        return (EINVAL);
     val = (int) strtol(state + 1, NULL, 10) - 1;
-    if (val < 0 || val > cpu_cx_count - 1)
+    if (val < 0)
        return (EINVAL);
     cpu_cx_lowest = val;

You can even simplify power_profile with this change:

--- power_profile.orig  2011-07-06 18:39:27.000000000 +0000
+++ power_profile       2011-07-06 18:40:20.000000000 +0000
@@ -81,8 +81,7 @@
 # Set the various sysctls based on the profile's values.
 node="hw.acpi.cpu.cx_lowest"
 highest_value="C1"
-lowest_value="`(sysctl -n dev.cpu.0.cx_supported | \
-       awk '{ print "C" split($0, a) }' -) 2> /dev/null`"
+lowest_value="C99"
 eval value=\$${profile}_cx_lowest
 sysctl_set

>> Here's what I tried (trivial diff, sending inline):
>>
>> [...]
>>
>> 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.

Yes, this makes sense.

> 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.

Seems reasonable too, but this won't be necessary for my case if
the above change will be implemented.



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAL409KxL8S%2BzMOmSXghAQHLJRCS19ft%2BLiCKMPPm1dgEyMV%2BSQ>