Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/dev/acpi Update acpiapm_get_powstat() to adjust for the ...



details:   https://anonhg.NetBSD.org/src/rev/b771435e1234
branches:  trunk
changeset: 753430:b771435e1234
user:      pgoyette <pgoyette%NetBSD.org@localhost>
date:      Sun Mar 28 13:11:23 2010 +0000

description:
Update acpiapm_get_powstat() to adjust for the recent changes to
acpi_bat(4).  (The warn_cap and low_cap sensors were removed, and the
values are now stored as the alarm limits of the charge sensor.)

diffstat:

 sys/dev/acpi/acpi_apm.c |  173 ++++++++++++++++++++++++++---------------------
 1 files changed, 97 insertions(+), 76 deletions(-)

diffs (242 lines):

diff -r 4e3056f4cd6d -r b771435e1234 sys/dev/acpi/acpi_apm.c
--- a/sys/dev/acpi/acpi_apm.c   Sun Mar 28 11:32:29 2010 +0000
+++ b/sys/dev/acpi/acpi_apm.c   Sun Mar 28 13:11:23 2010 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: acpi_apm.c,v 1.16 2010/03/24 01:45:37 pgoyette Exp $   */
+/*     $NetBSD: acpi_apm.c,v 1.17 2010/03/28 13:11:23 pgoyette Exp $   */
 
 /*-
  * Copyright (c) 2006 The NetBSD Foundation, Inc.
@@ -35,12 +35,16 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: acpi_apm.c,v 1.16 2010/03/24 01:45:37 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: acpi_apm.c,v 1.17 2010/03/28 13:11:23 pgoyette Exp $");
 
 #include <sys/param.h>
 #include <sys/device.h>
 #include <sys/sysctl.h>
 #include <sys/systm.h>
+#include <sys/queue.h>
+#include <sys/envsys.h>
+
+#include <dev/sysmon/sysmonvar.h>
 
 #include <dev/acpi/acpivar.h>
 #include <dev/apm/apmvar.h>
@@ -49,6 +53,8 @@
 static void    acpiapm_enable(void *, int);
 static int     acpiapm_set_powstate(void *, u_int, u_int);
 static int     acpiapm_get_powstat(void *, u_int, struct apm_power_info *);
+static bool    apm_per_sensor(const struct sysmon_envsys *,
+                              const envsys_data_t *, void *);
 static int     acpiapm_get_event(void *, u_int *, u_int *);
 static void    acpiapm_cpu_busy(void *);
 static void    acpiapm_cpu_idle(void *);
@@ -253,6 +259,69 @@
        return 0;
 }
 
+struct apm_sensor_info {
+       struct apm_power_info *pinfo;
+       int present;
+       int lastcap, descap, cap, warncap, lowcap, discharge;
+       int lastcap_valid, cap_valid, discharge_valid;
+};
+
+static bool
+apm_per_sensor(const struct sysmon_envsys *sme, const envsys_data_t *edata,
+              void *arg)
+{
+       struct apm_sensor_info *info = (struct apm_sensor_info *)arg;
+       int data;
+
+       if (sme->sme_class != SME_CLASS_ACADAPTER &&
+           sme->sme_class != SME_CLASS_BATTERY)
+               return false;
+
+       if (edata->state == ENVSYS_SINVALID)
+               return true;
+
+       data = edata->value_cur;
+
+       DPRINTF(("%s (%s) %d\n", sme->sme_name, edata->desc, data));
+
+       if (strstr(edata->desc, "connected")) {
+               info->pinfo->ac_state = data ? APM_AC_ON : APM_AC_OFF;
+       }
+       else if (strstr(edata->desc, "present") && data != 0)
+               info->present++;
+       else if (strstr(edata->desc, "charging")) {
+               if (data)
+                       info->pinfo->battery_flags |= APM_BATT_FLAG_CHARGING;
+               else
+                       info->pinfo->battery_flags &= ~APM_BATT_FLAG_CHARGING;
+               }
+       else if (strstr(edata->desc, "last full cap")) {
+               info->lastcap += data / 1000;
+               info->lastcap_valid = 1;
+       }
+       else if (strstr(edata->desc, "design cap"))
+               info->descap = data / 1000;
+       else if (strstr(edata->desc, "charge") &&
+           strstr(edata->desc, "charge rate") == NULL &&
+           strstr(edata->desc, "charge state") == NULL) {
+
+               /* Update cumulative capacity */
+               info->cap += data / 1000;
+
+               /* get warning- & critical-capacity values */
+               info->warncap = edata->limits.sel_warnmin / 1000;
+               info->lowcap = edata->limits.sel_critmin / 1000;
+
+               info->cap_valid = 1;
+               info->pinfo->nbattery++;
+       }
+       else if (strstr(edata->desc, "discharge rate")) {
+               info->discharge += data / 1000;
+               info->discharge_valid = 1;
+       }
+       return true;
+}
+
 static int
 /*ARGSUSED*/
 acpiapm_get_powstat(void *opaque, u_int batteryid,
@@ -261,17 +330,20 @@
 #define APM_BATT_FLAG_WATERMARK_MASK (APM_BATT_FLAG_CRITICAL |               \
                                      APM_BATT_FLAG_LOW |                     \
                                      APM_BATT_FLAG_HIGH)
-       int i, curcap, lowcap, warncap, cap, descap, lastcap, discharge;
-       int cap_valid, lastcap_valid, discharge_valid, present;
-       envsys_tre_data_t etds;
-       envsys_basic_info_t ebis;
+       struct apm_sensor_info info;
 
        /* Denote most variables as unitialized. */
-       curcap = lowcap = warncap = descap = -1;
+       info.lowcap = info.warncap = info.descap = -1;
 
-       /* Prepare to aggregate these two variables over all batteries. */
-       cap = lastcap = discharge = 0;
-       cap_valid = lastcap_valid = discharge_valid = present = 0;
+       /*
+        * Prepare to aggregate capacity, charge, and discharge over all
+        * batteries.
+        */
+       info.cap = info.lastcap = info.discharge = 0;
+       info.cap_valid = info.lastcap_valid = info.discharge_valid = 0;
+       info.present = 0;
+
+       info.pinfo = pinfo;
 
        (void)memset(pinfo, 0, sizeof(*pinfo));
        pinfo->ac_state = APM_AC_UNKNOWN;
@@ -283,82 +355,31 @@
        pinfo->battery_state = APM_BATT_UNKNOWN; /* ignored */
        pinfo->battery_life = APM_BATT_LIFE_UNKNOWN;
 
-       sysmonopen_envsys(0, 0, 0, &lwp0);
-
-       for (i = 0;; i++) {
-               const char *desc;
-               int data;
-               int flags;
-
-               ebis.sensor = i;
-               if (sysmonioctl_envsys(0, ENVSYS_GTREINFO, (void *)&ebis, 0,
-                   NULL) || (ebis.validflags & ENVSYS_FVALID) == 0)
-                       break;
-               etds.sensor = i;
-               if (sysmonioctl_envsys(0, ENVSYS_GTREDATA, (void *)&etds, 0,
-                   NULL))
-                       continue;
-               desc = ebis.desc;
-               flags = etds.validflags;
-               data = etds.cur.data_s;
+       sysmon_envsys_foreach_sensor(apm_per_sensor, (void *)&info, true);
 
-               DPRINTF(("%d %s %d %d\n", i, desc, data, flags));
-               if ((flags & ENVSYS_FCURVALID) == 0)
-                       continue;
-               if (strstr(desc, " connected")) {
-                       pinfo->ac_state = data ? APM_AC_ON : APM_AC_OFF;
-               } else if (strstr(desc, " present") && data != 0)
-                       present++;
-               else if (strstr(desc, " charging") && data)
-                       pinfo->battery_flags |= APM_BATT_FLAG_CHARGING;
-               else if (strstr(desc, " charging") && !data)
-                       pinfo->battery_flags &= ~APM_BATT_FLAG_CHARGING;
-               else if (strstr(desc, " warn cap"))
-                       warncap = data / 1000;
-               else if (strstr(desc, " low cap"))
-                       lowcap = data / 1000;
-               else if (strstr(desc, " last full cap")) {
-                       lastcap += data / 1000;
-                       lastcap_valid = 1;
-               }
-               else if (strstr(desc, " design cap"))
-                       descap = data / 1000;
-               else if (strstr(desc, " charge") &&
-                   strstr(desc, " charge rate") == NULL &&
-                   strstr(desc, " charge state") == NULL) {
-                       cap += data / 1000;
-                       cap_valid = 1;
-                       pinfo->nbattery++;
-               }
-               else if (strstr(desc, " discharge rate")) {
-                       discharge += data / 1000;
-                       discharge_valid = 1;
-               }
-       }
-       sysmonclose_envsys(0, 0, 0, &lwp0);
-
-       if (present == 0)
+       if (info.present == 0)
                pinfo->battery_flags |= APM_BATT_FLAG_NO_SYSTEM_BATTERY;
 
-       if (cap_valid > 0)  {
-               if (warncap != -1 && cap < warncap)
+       if (info.cap_valid > 0)  {
+               if (info.warncap != -1 && info.cap < info.warncap)
                        pinfo->battery_flags |= APM_BATT_FLAG_CRITICAL;
-               else if (lowcap != -1) {
-                       if (cap < lowcap)
+               else if (info.lowcap != -1) {
+                       if (info.cap < info.lowcap)
                                pinfo->battery_flags |= APM_BATT_FLAG_LOW;
                        else
                                pinfo->battery_flags |= APM_BATT_FLAG_HIGH;
                }
-               if (lastcap_valid > 0 && lastcap != 0)
-                       pinfo->battery_life = 100 * cap / lastcap;
-               else if (descap != -1 && descap != 0)
-                       pinfo->battery_life = 100 * cap / descap;
+               if (info.lastcap_valid > 0 && info.lastcap != 0)
+                       pinfo->battery_life = 100 * info.cap / info.lastcap;
+               else if (info.descap != -1 && info.descap != 0)
+                       pinfo->battery_life = 100 * info.cap / info.descap;
        }
 
        if ((pinfo->battery_flags & APM_BATT_FLAG_CHARGING) == 0) {
                /* discharging */
-               if (discharge != -1 && cap != -1 && discharge != 0)
-                       pinfo->minutes_left = 60 * cap / discharge;
+               if (info.discharge != -1 && info.discharge != 0 &&
+                   info.cap != -1)
+                       pinfo->minutes_left = 60 * info.cap / info.discharge;
        }
        if ((pinfo->battery_flags & APM_BATT_FLAG_WATERMARK_MASK) == 0 &&
            (pinfo->battery_flags & APM_BATT_FLAG_NO_SYSTEM_BATTERY) == 0) {
@@ -368,8 +389,8 @@
                        pinfo->battery_flags |= APM_BATT_FLAG_LOW;
        }
 
-       DPRINTF(("%d %d %d %d %d %d\n", cap, warncap, lowcap, lastcap, descap,
-           discharge));
+       DPRINTF(("%d %d %d %d %d %d\n", info.cap, info.warncap, info.lowcap,
+           info.lastcap, info.descap, info.discharge));
        DPRINTF(("pinfo %d %d %d\n", pinfo->battery_flags,
            pinfo->battery_life, pinfo->battery_life));
        return 0;



Home | Main Index | Thread Index | Old Index