Module Name: src Committed By: pgoyette Date: Mon Jun 8 00:55:35 UTC 2009
Modified Files: src/sys/dev/sysmon: sysmon_envsys.c sysmon_envsys_events.c sysmon_envsysvar.h sysmon_power.c src/sys/sys: envsys.h power.h Log Message: General clean-up and some restructuring of event handling. This is a precursor to letting sensor drivers actually exchange limits/thresholds with user-land. To generate a diff of this commit: cvs rdiff -u -r1.86 -r1.87 src/sys/dev/sysmon/sysmon_envsys.c cvs rdiff -u -r1.64 -r1.65 src/sys/dev/sysmon/sysmon_envsys_events.c cvs rdiff -u -r1.28 -r1.29 src/sys/dev/sysmon/sysmon_envsysvar.h cvs rdiff -u -r1.40 -r1.41 src/sys/dev/sysmon/sysmon_power.c cvs rdiff -u -r1.24 -r1.25 src/sys/sys/envsys.h cvs rdiff -u -r1.12 -r1.13 src/sys/sys/power.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/sysmon/sysmon_envsys.c diff -u src/sys/dev/sysmon/sysmon_envsys.c:1.86 src/sys/dev/sysmon/sysmon_envsys.c:1.87 --- src/sys/dev/sysmon/sysmon_envsys.c:1.86 Wed Jun 3 11:43:15 2009 +++ src/sys/dev/sysmon/sysmon_envsys.c Mon Jun 8 00:55:35 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: sysmon_envsys.c,v 1.86 2009/06/03 11:43:15 pgoyette Exp $ */ +/* $NetBSD: sysmon_envsys.c,v 1.87 2009/06/08 00:55:35 pgoyette Exp $ */ /*- * Copyright (c) 2007, 2008 Juan Romero Pardines. @@ -64,7 +64,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: sysmon_envsys.c,v 1.86 2009/06/03 11:43:15 pgoyette Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sysmon_envsys.c,v 1.87 2009/06/08 00:55:35 pgoyette Exp $"); #include <sys/param.h> #include <sys/types.h> @@ -84,20 +84,6 @@ kmutex_t sme_global_mtx; -/* - * Types of properties that can be set via userland. - */ -enum { - USERPROP_DESC = 0x0001, - USERPROP_BATTCAP = 0x0002, - USERPROP_CRITMAX = 0x0004, - USERPROP_CRITMIN = 0x0008, - USERPROP_RFACT = 0x0010, - USERPROP_WARNMAX = 0x0020, - USERPROP_WARNMIN = 0x0040, - USERPROP_BATTWARN = 0x0080 -}; - static prop_dictionary_t sme_propd; static uint32_t sysmon_envsys_next_sensor_index; static struct sysmon_envsys *sysmon_envsys_find_40(u_int); @@ -574,6 +560,10 @@ sysmon_envsys_release(sme, true); mutex_exit(&sme->sme_mtx); + DPRINTF(("%s: (%s) attached #%d (%s), units=%d (%s)\n", + __func__, sme->sme_name, edata->sensor, edata->desc, + sdt_units[i].type, sdt_units[i].desc)); + return 0; } @@ -1057,53 +1047,49 @@ KASSERT(sdict != NULL); ptype = 0; - if (edata->upropset & USERPROP_BATTCAP) { + if (edata->upropset & PROP_BATTCAP) { prop_dictionary_remove(sdict, "critical-capacity"); - ptype = PENVSYS_EVENT_BATT_USER_LIMITS; + ptype = PENVSYS_EVENT_CAPACITY; } - if (edata->upropset & USERPROP_BATTWARN) { + if (edata->upropset & PROP_BATTWARN) { prop_dictionary_remove(sdict, "warning-capacity"); - ptype = PENVSYS_EVENT_BATT_USER_LIMITS; + ptype = PENVSYS_EVENT_CAPACITY; } if (ptype != 0) sme_event_unregister(sme, edata->desc, ptype); ptype = 0; - if (edata->upropset & USERPROP_WARNMAX) { - prop_dictionary_remove(sdict, - "warning-max"); - ptype = PENVSYS_EVENT_USER_LIMITS; + if (edata->upropset & PROP_WARNMAX) { + prop_dictionary_remove(sdict, "warning-max"); + ptype = PENVSYS_EVENT_LIMITS; } - if (edata->upropset & USERPROP_WARNMIN) { - prop_dictionary_remove(sdict, - "warning-min"); - ptype = PENVSYS_EVENT_USER_LIMITS; + if (edata->upropset & PROP_WARNMIN) { + prop_dictionary_remove(sdict, "warning-min"); + ptype = PENVSYS_EVENT_LIMITS; } - if (edata->upropset & USERPROP_CRITMAX) { - prop_dictionary_remove(sdict, - "critical-max"); - ptype = PENVSYS_EVENT_USER_LIMITS; + if (edata->upropset & PROP_CRITMAX) { + prop_dictionary_remove(sdict, "critical-max"); + ptype = PENVSYS_EVENT_LIMITS; } - if (edata->upropset & USERPROP_CRITMIN) { - prop_dictionary_remove(sdict, - "critical-min"); - ptype = PENVSYS_EVENT_USER_LIMITS; + if (edata->upropset & PROP_CRITMIN) { + prop_dictionary_remove(sdict, "critical-min"); + ptype = PENVSYS_EVENT_LIMITS; } if (ptype != 0) sme_event_unregister(sme, edata->desc, ptype); - if (edata->upropset & USERPROP_RFACT) { + if (edata->upropset & PROP_RFACT) { (void)sme_sensor_upint32(sdict, "rfact", 0); edata->rfact = 0; } - if (edata->upropset & USERPROP_DESC) + if (edata->upropset & PROP_DESC) (void)sme_sensor_upstring(sdict, "description", edata->desc); @@ -1512,9 +1498,9 @@ if (sdt[j].type == edata->state) break; - DPRINTFOBJ(("%s: state=%s type=%d flags=%d " - "units=%d sensor=%d\n", __func__, sdt[j].desc, - sdt[j].type, edata->flags, edata->units, edata->sensor)); + DPRINTFOBJ(("%s: sensor #%d type=%d (%s) flags=%d\n", + __func__, edata->sensor, sdt[j].type, sdt[j].desc, + edata->flags)); error = sme_sensor_upstring(dict, "state", sdt[j].desc); if (error) @@ -1528,6 +1514,9 @@ if (sdt[j].type == edata->units) break; + DPRINTFOBJ(("%s: sensor #%d units=%d (%s)\n", + __func__, edata->sensor, sdt[j].type, sdt[j].desc)); + error = sme_sensor_upstring(dict, "type", sdt[j].desc); if (error) break; @@ -1664,7 +1653,8 @@ prop_dictionary_t dict, tdict = NULL; prop_object_t obj, obj1, obj2, tobj = NULL; uint64_t refresh_timo = 0; - int32_t critval; + int32_t critmax = 0, warnmax = 0, warnmin = 0, critmin = 0; + int props = 0; int i, error = 0; const char *blah; bool targetfound = false; @@ -1766,7 +1756,7 @@ DPRINTF(("%s: sensor%d changed desc to: %s\n", __func__, edata->sensor, blah)); - edata->upropset |= USERPROP_DESC; + edata->upropset |= PROP_DESC; mutex_exit(&sme->sme_mtx); } @@ -1779,7 +1769,7 @@ if (edata->flags & ENVSYS_FCHANGERFACT) { mutex_enter(&sme->sme_mtx); edata->rfact = prop_number_integer_value(obj2); - edata->upropset |= USERPROP_RFACT; + edata->upropset |= PROP_RFACT; mutex_exit(&sme->sme_mtx); DPRINTF(("%s: sensor%d changed rfact to %d\n", __func__, edata->sensor, edata->rfact)); @@ -1796,10 +1786,6 @@ /* * did the user want to set a critical capacity event? - * - * NOTE: if sme_event_register returns EEXIST that means - * the object is already there, but this is not a real - * error, because the object might be updated. */ obj2 = prop_dictionary_get(udict, "critical-capacity"); if (obj2 && prop_object_type(obj2) == PROP_TYPE_NUMBER) { @@ -1810,30 +1796,12 @@ goto out; } - critval = prop_number_integer_value(obj2); - error = sme_event_register(dict, - edata, - sme, - "critical-capacity", - critval, - PENVSYS_EVENT_BATT_USERCAP, - sdt[i].crittype); - if (error == EEXIST) - error = 0; - if (error) - goto out; - - mutex_enter(&sme->sme_mtx); - edata->upropset |= USERPROP_BATTCAP; - mutex_exit(&sme->sme_mtx); + critmin = prop_number_integer_value(obj2); + props |= PROP_BATTCAP; } /* * did the user want to set a warning capacity event? - * - * NOTE: if sme_event_register returns EEXIST that means - * the object is already there, but this is not a real - * error, because the object might be updated. */ obj2 = prop_dictionary_get(udict, "warning-capacity"); if (obj2 && prop_object_type(obj2) == PROP_TYPE_NUMBER) { @@ -1844,22 +1812,8 @@ goto out; } - critval = prop_number_integer_value(obj2); - error = sme_event_register(dict, - edata, - sme, - "warning-capacity", - critval, - PENVSYS_EVENT_BATT_USERWARN, - sdt[i].crittype); - if (error == EEXIST) - error = 0; - if (error) - goto out; - - mutex_enter(&sme->sme_mtx); - edata->upropset |= USERPROP_BATTWARN; - mutex_exit(&sme->sme_mtx); + warnmin = prop_number_integer_value(obj2); + props |= PROP_BATTWARN; } /* @@ -1869,27 +1823,14 @@ if (obj2 && prop_object_type(obj2) == PROP_TYPE_NUMBER) { targetfound = true; if (edata->units == ENVSYS_INDICATOR || - edata->flags & ENVSYS_FMONNOTSUPP) { + edata->flags & + (ENVSYS_FPERCENT | ENVSYS_FMONNOTSUPP)) { error = ENOTSUP; goto out; } - critval = prop_number_integer_value(obj2); - error = sme_event_register(dict, - edata, - sme, - "critical-max", - critval, - PENVSYS_EVENT_USER_CRITMAX, - sdt[i].crittype); - if (error == EEXIST) - error = 0; - if (error) - goto out; - - mutex_enter(&sme->sme_mtx); - edata->upropset |= USERPROP_CRITMAX; - mutex_exit(&sme->sme_mtx); + critmax = prop_number_integer_value(obj2); + props |= PROP_CRITMAX; } /* @@ -1899,27 +1840,14 @@ if (obj2 && prop_object_type(obj2) == PROP_TYPE_NUMBER) { targetfound = true; if (edata->units == ENVSYS_INDICATOR || - edata->flags & ENVSYS_FMONNOTSUPP) { + edata->flags & + (ENVSYS_FPERCENT | ENVSYS_FMONNOTSUPP)) { error = ENOTSUP; goto out; } - critval = prop_number_integer_value(obj2); - error = sme_event_register(dict, - edata, - sme, - "warning-max", - critval, - PENVSYS_EVENT_USER_WARNMAX, - sdt[i].crittype); - if (error == EEXIST) - error = 0; - if (error) - goto out; - - mutex_enter(&sme->sme_mtx); - edata->upropset |= USERPROP_WARNMAX; - mutex_exit(&sme->sme_mtx); + warnmax = prop_number_integer_value(obj2); + props |= PROP_WARNMAX; } /* @@ -1929,27 +1857,14 @@ if (obj2 && prop_object_type(obj2) == PROP_TYPE_NUMBER) { targetfound = true; if (edata->units == ENVSYS_INDICATOR || - edata->flags & ENVSYS_FMONNOTSUPP) { + edata->flags & + (ENVSYS_FPERCENT | ENVSYS_FMONNOTSUPP)) { error = ENOTSUP; goto out; } - critval = prop_number_integer_value(obj2); - error = sme_event_register(dict, - edata, - sme, - "critical-min", - critval, - PENVSYS_EVENT_USER_CRITMIN, - sdt[i].crittype); - if (error == EEXIST) - error = 0; - if (error) - goto out; - - mutex_enter(&sme->sme_mtx); - edata->upropset |= USERPROP_CRITMIN; - mutex_exit(&sme->sme_mtx); + critmin = prop_number_integer_value(obj2); + props |= PROP_CRITMIN; } /* @@ -1959,18 +1874,25 @@ if (obj2 && prop_object_type(obj2) == PROP_TYPE_NUMBER) { targetfound = true; if (edata->units == ENVSYS_INDICATOR || - edata->flags & ENVSYS_FMONNOTSUPP) { + edata->flags & + (ENVSYS_FPERCENT | ENVSYS_FMONNOTSUPP)) { error = ENOTSUP; goto out; } - critval = prop_number_integer_value(obj2); + warnmin = prop_number_integer_value(obj2); + props |= PROP_WARNMIN; + } + + if (props) { error = sme_event_register(dict, edata, sme, - "warning-min", - critval, - PENVSYS_EVENT_USER_WARNMIN, + critmax, warnmax, warnmin, + critmin, props, + (edata->flags & ENVSYS_FPERCENT)? + PENVSYS_EVENT_CAPACITY: + PENVSYS_EVENT_LIMITS, sdt[i].crittype); if (error == EEXIST) error = 0; @@ -1978,7 +1900,7 @@ goto out; mutex_enter(&sme->sme_mtx); - edata->upropset |= USERPROP_WARNMIN; + edata->upropset |= props; mutex_exit(&sme->sme_mtx); } Index: src/sys/dev/sysmon/sysmon_envsys_events.c diff -u src/sys/dev/sysmon/sysmon_envsys_events.c:1.64 src/sys/dev/sysmon/sysmon_envsys_events.c:1.65 --- src/sys/dev/sysmon/sysmon_envsys_events.c:1.64 Mon Jun 1 20:08:45 2009 +++ src/sys/dev/sysmon/sysmon_envsys_events.c Mon Jun 8 00:55:35 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: sysmon_envsys_events.c,v 1.64 2009/06/01 20:08:45 pgoyette Exp $ */ +/* $NetBSD: sysmon_envsys_events.c,v 1.65 2009/06/08 00:55:35 pgoyette Exp $ */ /*- * Copyright (c) 2007, 2008 Juan Romero Pardines. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: sysmon_envsys_events.c,v 1.64 2009/06/01 20:08:45 pgoyette Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sysmon_envsys_events.c,v 1.65 2009/06/08 00:55:35 pgoyette Exp $"); #include <sys/param.h> #include <sys/types.h> @@ -54,12 +54,15 @@ }; static const struct sme_sensor_event sme_sensor_event[] = { - { ENVSYS_SVALID, PENVSYS_EVENT_NORMAL }, - { ENVSYS_SCRITOVER, PENVSYS_EVENT_CRITOVER }, - { ENVSYS_SCRITUNDER, PENVSYS_EVENT_CRITUNDER }, - { ENVSYS_SWARNOVER, PENVSYS_EVENT_WARNOVER }, - { ENVSYS_SWARNUNDER, PENVSYS_EVENT_WARNUNDER }, - { -1, -1 } + { ENVSYS_SVALID, PENVSYS_EVENT_NORMAL }, + { ENVSYS_SCRITOVER, PENVSYS_EVENT_CRITOVER }, + { ENVSYS_SCRITUNDER, PENVSYS_EVENT_CRITUNDER }, + { ENVSYS_SWARNOVER, PENVSYS_EVENT_WARNOVER }, + { ENVSYS_SWARNUNDER, PENVSYS_EVENT_WARNUNDER }, + { ENVSYS_BATTERY_CAPACITY_NORMAL, PENVSYS_EVENT_NORMAL }, + { ENVSYS_BATTERY_CAPACITY_WARNING, PENVSYS_EVENT_BATT_WARN }, + { ENVSYS_BATTERY_CAPACITY_CRITICAL, PENVSYS_EVENT_BATT_CRIT }, + { -1, -1 } }; static bool sysmon_low_power; @@ -79,41 +82,16 @@ */ int sme_event_register(prop_dictionary_t sdict, envsys_data_t *edata, - struct sysmon_envsys *sme, const char *objkey, - int32_t critval, int crittype, int powertype) + struct sysmon_envsys *sme, int32_t critmax, + int32_t warnmax, int32_t warnmin, int32_t critmin, + int lim_flags, int crittype, int powertype) { sme_event_t *see = NULL, *osee = NULL; prop_object_t obj; - bool critvalup = false; int error = 0; - int real_crittype; - int32_t o_critval; + const char *objkey; KASSERT(sdict != NULL || edata != NULL || sme != NULL); - /* - * Allocate a new sysmon_envsys event. - */ - see = kmem_zalloc(sizeof(*see), KM_SLEEP); - if (see == NULL) - return ENOMEM; - - /* - * Map user-types to kernel types - */ - switch (crittype) { - case PENVSYS_EVENT_USER_CRITMAX: - case PENVSYS_EVENT_USER_CRITMIN: - case PENVSYS_EVENT_USER_WARNMAX: - case PENVSYS_EVENT_USER_WARNMIN: - real_crittype = PENVSYS_EVENT_USER_LIMITS; - break; - case PENVSYS_EVENT_BATT_USERCAP: - case PENVSYS_EVENT_BATT_USERWARN: - real_crittype = PENVSYS_EVENT_BATT_USER_LIMITS; - break; - default: - real_crittype = crittype; - } /* * check if the event is already on the list and return @@ -121,185 +99,225 @@ */ mutex_enter(&sme->sme_mtx); LIST_FOREACH(osee, &sme->sme_events_list, see_list) { - if (strcmp(edata->desc, osee->see_pes.pes_sensname) == 0) - if (real_crittype == osee->see_type) { - switch (crittype) { - case PENVSYS_EVENT_USER_CRITMAX: - case PENVSYS_EVENT_BATT_USERCAP: - o_critval = osee->see_critmax; - break; - case PENVSYS_EVENT_USER_WARNMAX: - case PENVSYS_EVENT_BATT_USERWARN: - o_critval = osee->see_warnmax; - break; - case PENVSYS_EVENT_USER_WARNMIN: - o_critval = osee->see_warnmin; - break; - case PENVSYS_EVENT_USER_CRITMIN: - default: - o_critval = osee->see_critmin; - break; - } - if (o_critval == critval) { - DPRINTF(("%s: dev=%s sensor=%s type=%d " - "(already exists)\n", __func__, - osee->see_pes.pes_dvname, - osee->see_pes.pes_sensname, - osee->see_type)); - error = EEXIST; - goto out; - } - critvalup = true; - break; - } - } + if (strcmp(edata->desc, osee->see_pes.pes_sensname) != 0) + continue; + if (crittype != osee->see_type) + continue; - /* - * Critical condition operation requested by userland. - */ - if (objkey && critval && critvalup) { - obj = prop_dictionary_get(sdict, objkey); - if (obj && prop_object_type(obj) == PROP_TYPE_NUMBER) { - /* - * object is already in dictionary and value - * provided is not the same than we have - * currently, update the critical value. - */ - switch (crittype) { - case PENVSYS_EVENT_USER_CRITMAX: - case PENVSYS_EVENT_BATT_USERCAP: - osee->see_critmax = critval; - break; - case PENVSYS_EVENT_USER_WARNMAX: - case PENVSYS_EVENT_BATT_USERWARN: - osee->see_warnmax = critval; - break; - case PENVSYS_EVENT_USER_WARNMIN: - osee->see_warnmin = critval; - break; - case PENVSYS_EVENT_USER_CRITMIN: - default: - osee->see_critmin = critval; - break; + DPRINTF(("%s: dev %s sensor %s lim_flags 0x%04x event exists\n", + __func__, sme->sme_name, edata->desc, lim_flags)); + + see = osee; + if (lim_flags & PROP_CRITMAX) { + if (critmax == see->see_critmax) { + DPRINTF(("%s: type=%d (critmax exists)\n", + __func__, crittype)); + error = EEXIST; + lim_flags &= ~PROP_CRITMAX; } - DPRINTF(("%s: (%s) event [sensor=%s type=%d] " - "(critval updated)\n", __func__, sme->sme_name, - edata->desc, osee->see_type)); - error = sme_sensor_upint32(sdict, objkey, critval); - goto out; } + if (lim_flags & PROP_WARNMAX) { + if (warnmax == see->see_warnmax) { + DPRINTF(("%s: type=%d (warnmax exists)\n", + __func__, crittype)); + error = EEXIST; + lim_flags &= ~PROP_WARNMAX; + } + } + if (lim_flags & (PROP_WARNMIN | PROP_BATTWARN)) { + if (warnmin == see->see_warnmin) { + DPRINTF(("%s: type=%d (warnmin exists)\n", + __func__, crittype)); + error = EEXIST; + lim_flags &= ~(PROP_WARNMIN | PROP_BATTWARN); + } + } + if (lim_flags & (PROP_CRITMIN | PROP_BATTCAP)) { + if (critmin == see->see_critmin) { + DPRINTF(("%s: type=%d (critmin exists)\n", + __func__, crittype)); + error = EEXIST; + lim_flags &= ~(PROP_CRITMIN | PROP_BATTCAP); + } + } + break; } + if (see == NULL) { + /* + * New event requested - allocate a sysmon_envsys event. + */ + see = kmem_zalloc(sizeof(*see), KM_SLEEP); + if (see == NULL) + return ENOMEM; + + DPRINTF(("%s: dev %s sensor %s lim_flags 0x%04x new event\n", + __func__, sme->sme_name, edata->desc, lim_flags)); + + see->see_type = crittype; + see->see_sme = sme; + see->see_edata = edata; + + /* Initialize sensor type and previously-sent state */ + + see->see_pes.pes_type = powertype; - /* - * New limit defined for existing event - */ - if (osee != NULL) { - osee->see_edata = edata; switch (crittype) { - case PENVSYS_EVENT_USER_CRITMAX: - case PENVSYS_EVENT_BATT_USERCAP: - osee->see_critmax = critval; - break; - case PENVSYS_EVENT_USER_WARNMAX: - case PENVSYS_EVENT_BATT_USERWARN: - osee->see_warnmax = critval; + case PENVSYS_EVENT_LIMITS: + see->see_evsent = ENVSYS_SVALID; + break; + case PENVSYS_EVENT_CAPACITY: + see->see_evsent = ENVSYS_BATTERY_CAPACITY_NORMAL; break; - case PENVSYS_EVENT_USER_WARNMIN: - osee->see_warnmin = critval; + case PENVSYS_EVENT_STATE_CHANGED: + if (edata->units == ENVSYS_BATTERY_CAPACITY) + see->see_evsent = ENVSYS_BATTERY_CAPACITY_NORMAL; + else if (edata->units == ENVSYS_DRIVE) + see->see_evsent = ENVSYS_DRIVE_EMPTY; + else + panic("%s: bad units for " + "PENVSYS_EVENT_STATE_CHANGED", __func__); break; - case PENVSYS_EVENT_USER_CRITMIN: + case PENVSYS_EVENT_CRITICAL: default: - osee->see_critmin = critval; + see->see_evsent = 0; break; } - if (objkey && critval) { - error = sme_sensor_upint32(sdict, objkey, critval); - if (error) - goto out; - } - DPRINTF(("%s: (%s) new limit added to existing event, type %d " - "critmin=%" PRIu32 " warnmin=%" PRIu32 " warnmax=%" - PRIu32 " critmax=%d\n", __func__, osee->see_sme->sme_name, - osee->see_type, osee->see_critmin, osee->see_warnmin, - osee->see_warnmax, osee->see_critmax)); - goto out; + + (void)strlcpy(see->see_pes.pes_dvname, sme->sme_name, + sizeof(see->see_pes.pes_dvname)); + (void)strlcpy(see->see_pes.pes_sensname, edata->desc, + sizeof(see->see_pes.pes_sensname)); } + /* - * New event requested. + * Limit operation requested. */ - see->see_edata = edata; - switch (crittype) { - case PENVSYS_EVENT_USER_CRITMAX: - case PENVSYS_EVENT_BATT_USERCAP: - see->see_critmax = critval; - break; - case PENVSYS_EVENT_USER_WARNMAX: - case PENVSYS_EVENT_BATT_USERWARN: - see->see_warnmax = critval; - break; - case PENVSYS_EVENT_USER_WARNMIN: - see->see_warnmin = critval; - break; - case PENVSYS_EVENT_USER_CRITMIN: - default: - see->see_critmin = critval; - break; + if (lim_flags & PROP_CRITMAX) { + objkey = "critical-max"; + obj = prop_dictionary_get(sdict, objkey); + if (obj && prop_object_type(obj) != PROP_TYPE_NUMBER) { + DPRINTF(("%s: (%s) %s object not TYPE_NUMBER\n", + __func__, sme->sme_name, objkey)); + error = ENOTSUP; + } else { + see->see_critmax = critmax; + error = sme_sensor_upint32(sdict, objkey, critmax); + DPRINTF(("%s: (%s) event [sensor=%s type=%d] " + "(%s updated)\n", __func__, sme->sme_name, + edata->desc, crittype, objkey)); + } } - see->see_type = real_crittype; - see->see_sme = sme; + if (error && error != EEXIST) + goto out; - /* Initialize sensor type and previously-sent state */ + if (lim_flags & PROP_WARNMAX) { + objkey = "warning-max"; + obj = prop_dictionary_get(sdict, objkey); + if (obj && prop_object_type(obj) != PROP_TYPE_NUMBER) { + DPRINTF(("%s: (%s) %s object not TYPE_NUMBER\n", + __func__, sme->sme_name, objkey)); + error = ENOTSUP; + } else { + see->see_warnmax = warnmax; + error = sme_sensor_upint32(sdict, objkey, warnmax); + DPRINTF(("%s: (%s) event [sensor=%s type=%d] " + "(%s updated)\n", __func__, sme->sme_name, + edata->desc, crittype, objkey)); + } + } + if (error && error != EEXIST) + goto out; - see->see_pes.pes_type = powertype; - switch (real_crittype) { - case PENVSYS_EVENT_HW_LIMITS: - case PENVSYS_EVENT_USER_LIMITS: - case PENVSYS_EVENT_BATT_USER_LIMITS: - see->see_evsent = ENVSYS_SVALID; - break; - case PENVSYS_EVENT_STATE_CHANGED: - if (edata->units == ENVSYS_BATTERY_CAPACITY) - see->see_evsent = ENVSYS_BATTERY_CAPACITY_NORMAL; - else if (edata->units == ENVSYS_DRIVE) - see->see_evsent = ENVSYS_DRIVE_EMPTY; -#ifdef DIAGNOSTIC - else - panic("%s: bad units for " - "PENVSYS_EVENT_STATE_CHANGED", __func__); -#endif - break; - case PENVSYS_EVENT_CRITICAL: - default: - see->see_evsent = 0; - break; + if (lim_flags & PROP_WARNMIN) { + objkey = "warning-min"; + obj = prop_dictionary_get(sdict, objkey); + if (obj && prop_object_type(obj) != PROP_TYPE_NUMBER) { + DPRINTF(("%s: (%s) %s object not TYPE_NUMBER\n", + __func__, sme->sme_name, objkey)); + error = ENOTSUP; + } else { + see->see_warnmin = warnmin; + error = sme_sensor_upint32(sdict, objkey, warnmin); + DPRINTF(("%s: (%s) event [sensor=%s type=%d] " + "(%s updated)\n", __func__, sme->sme_name, + edata->desc, crittype, objkey)); + } } + if (error && error != EEXIST) + goto out; - (void)strlcpy(see->see_pes.pes_dvname, sme->sme_name, - sizeof(see->see_pes.pes_dvname)); - (void)strlcpy(see->see_pes.pes_sensname, edata->desc, - sizeof(see->see_pes.pes_sensname)); - - LIST_INSERT_HEAD(&sme->sme_events_list, see, see_list); - if (objkey && critval) { - error = sme_sensor_upint32(sdict, objkey, critval); - if (error) - goto out; + if (lim_flags & PROP_CRITMIN) { + objkey = "critical-min"; + obj = prop_dictionary_get(sdict, objkey); + if (obj && prop_object_type(obj) != PROP_TYPE_NUMBER) { + DPRINTF(("%s: (%s) %s object not TYPE_NUMBER\n", + __func__, sme->sme_name, objkey)); + error = ENOTSUP; + } else { + see->see_critmin = critmin; + error = sme_sensor_upint32(sdict, objkey, critmin); + DPRINTF(("%s: (%s) event [sensor=%s type=%d] " + "(%s updated)\n", __func__, sme->sme_name, + edata->desc, crittype, objkey)); + } + } + if (error && error != EEXIST) + goto out; + + if (lim_flags & PROP_BATTWARN) { + objkey = "warning-capacity"; + obj = prop_dictionary_get(sdict, objkey); + if (obj && prop_object_type(obj) != PROP_TYPE_NUMBER) { + DPRINTF(("%s: (%s) %s object not TYPE_NUMBER\n", + __func__, sme->sme_name, objkey)); + error = ENOTSUP; + } else { + see->see_warnmin = warnmin; + error = sme_sensor_upint32(sdict, objkey, warnmin); + DPRINTF(("%s: (%s) event [sensor=%s type=%d] " + "(%s updated)\n", __func__, sme->sme_name, + edata->desc, crittype, objkey)); + } } + if (error && error != EEXIST) + goto out; + + if (lim_flags & PROP_BATTCAP) { + objkey = "critical-capacity"; + obj = prop_dictionary_get(sdict, objkey); + if (obj && prop_object_type(obj) != PROP_TYPE_NUMBER) { + DPRINTF(("%s: (%s) %s object not TYPE_NUMBER\n", + __func__, sme->sme_name, objkey)); + error = ENOTSUP; + } else { + see->see_critmin = critmin; + error = sme_sensor_upint32(sdict, objkey, critmin); + DPRINTF(("%s: (%s) event [sensor=%s type=%d] " + "(%s updated)\n", __func__, sme->sme_name, + edata->desc, crittype, objkey)); + } + } + if (error && error != EEXIST) + goto out; + DPRINTF(("%s: (%s) event registered (sensor=%s snum=%d type=%d " "critmin=%" PRIu32 " warnmin=%" PRIu32 " warnmax=%" PRIu32 - " crixmax=%" PRIu32 ")\n", __func__, + " critmax=%" PRIu32 " props 0x%04x)\n", __func__, see->see_sme->sme_name, see->see_pes.pes_sensname, see->see_edata->sensor, see->see_type, see->see_critmin, - see->see_warnmin, see->see_warnmax, see->see_critmax)); + see->see_warnmin, see->see_warnmax, see->see_critmax, + see->see_edata->upropset)); /* * Initialize the events framework if it wasn't initialized before. */ if ((sme->sme_flags & SME_CALLOUT_INITIALIZED) == 0) error = sme_events_init(sme); out: + if ((error == 0 || error == EEXIST) && osee == NULL) + LIST_INSERT_HEAD(&sme->sme_events_list, see, see_list); + mutex_exit(&sme->sme_mtx); - if (error || critvalup) - kmem_free(see, sizeof(*see)); + return error; } @@ -422,8 +440,7 @@ error = sme_event_register(sed_t->sed_sdict, \ sed_t->sed_edata, \ sed_t->sed_sme, \ - NULL, \ - 0, \ + 0, 0, 0, 0, 0, \ (b), \ sed_t->sed_powertype); \ if (error && error != EEXIST) \ @@ -445,7 +462,7 @@ "critical"); SEE_REGEVENT(ENVSYS_FMONLIMITS, - PENVSYS_EVENT_HW_LIMITS, + PENVSYS_EVENT_LIMITS, "hw-range-limits"); SEE_REGEVENT(ENVSYS_FMONSTCHANGED, @@ -565,15 +582,14 @@ if ((see->see_flags & SEE_EVENT_WORKING) == 0) see->see_flags |= SEE_EVENT_WORKING; /* - * sme_events_check marks the first event for the device to - * make us refresh it here. Don't refresh if the driver uses - * its own method for refreshing. + * sme_events_check marks the sensors to make us refresh them here. + * Don't refresh if the driver uses its own method for refreshing. */ if ((sme->sme_flags & SME_DISABLE_REFRESH) == 0) { - if ((see->see_edata->flags & ENVSYS_FNEED_REFRESH) != 0) { + if ((edata->flags & ENVSYS_FNEED_REFRESH) != 0) { /* refresh sensor in device */ (*sme->sme_refresh)(sme, edata); - see->see_edata->flags &= ~ENVSYS_FNEED_REFRESH; + edata->flags &= ~ENVSYS_FNEED_REFRESH; } } @@ -592,8 +608,8 @@ * State based on user limits will override any hardware * detected state. */ - case PENVSYS_EVENT_USER_LIMITS: - case PENVSYS_EVENT_BATT_USER_LIMITS: + case PENVSYS_EVENT_LIMITS: + case PENVSYS_EVENT_CAPACITY: #define __EXCEEDED_LIMIT(lim, rel) ((lim) && edata->value_cur rel (lim)) if __EXCEEDED_LIMIT(see->see_critmin, <) edata->state = ENVSYS_SCRITUNDER; @@ -605,10 +621,7 @@ edata->state = ENVSYS_SCRITOVER; /* FALLTHROUGH */ #undef __EXCEED_LIMIT - /* - * For hardware and user range limits, send event if state has changed - */ - case PENVSYS_EVENT_HW_LIMITS: + if (edata->state == see->see_evsent) break; @@ -671,7 +684,7 @@ state = ENVSYS_BATTERY_CAPACITY_NORMAL; break; default: - panic("%s: invalid units for ENVSYS_FMONSTCHANGED", + panic("%s: bad units for PENVSYS_EVENT_STATE_CHANGED", __func__); } @@ -688,25 +701,19 @@ (void)strlcpy(see->see_pes.pes_statedesc, sdt[i].desc, sizeof(see->see_pes.pes_statedesc)); - /* - * state is ok again... send a normal event. - */ - if (see->see_evsent && edata->value_cur == state) { + if (edata->value_cur == state) + /* + * state returned to normal condition + */ sysmon_penvsys_event(&see->see_pes, PENVSYS_EVENT_NORMAL); - see->see_evsent = false; - } - - /* - * state has been changed... send event. - */ - if (see->see_evsent || edata->value_cur != state) { - /* - * save current drive state. + else + /* + * state changed to abnormal condition */ - see->see_evsent = edata->value_cur; sysmon_penvsys_event(&see->see_pes, see->see_type); - } + + see->see_evsent = edata->value_cur; /* * There's no need to continue if it's a drive sensor. Index: src/sys/dev/sysmon/sysmon_envsysvar.h diff -u src/sys/dev/sysmon/sysmon_envsysvar.h:1.28 src/sys/dev/sysmon/sysmon_envsysvar.h:1.29 --- src/sys/dev/sysmon/sysmon_envsysvar.h:1.28 Fri Aug 22 11:27:50 2008 +++ src/sys/dev/sysmon/sysmon_envsysvar.h Mon Jun 8 00:55:35 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: sysmon_envsysvar.h,v 1.28 2008/08/22 11:27:50 pgoyette Exp $ */ +/* $NetBSD: sysmon_envsysvar.h,v 1.29 2009/06/08 00:55:35 pgoyette Exp $ */ /*- * Copyright (c) 2007, 2008 Juan Romero Pardines. @@ -65,15 +65,6 @@ #define SME_EVENTS_DEFTIMEOUT 30 /* - * struct used by a sensor description in a sysmon envsys device. - */ -struct sme_sensor_names { - SLIST_ENTRY(sme_sensor_names) sme_names; - int assigned; - char desc[ENVSYS_DESCLEN]; -}; - -/* * struct used by a sysmon envsys event. */ typedef struct sme_event { @@ -137,8 +128,8 @@ * functions to handle sysmon envsys events. */ int sme_event_register(prop_dictionary_t, envsys_data_t *, - struct sysmon_envsys *, const char *, - int32_t, int, int); + struct sysmon_envsys *, int32_t, int32_t, + int32_t, int32_t, int, int, int); int sme_event_unregister(struct sysmon_envsys *, const char *, int); void sme_event_unregister_all(struct sysmon_envsys *); void sme_event_drvadd(void *); Index: src/sys/dev/sysmon/sysmon_power.c diff -u src/sys/dev/sysmon/sysmon_power.c:1.40 src/sys/dev/sysmon/sysmon_power.c:1.41 --- src/sys/dev/sysmon/sysmon_power.c:1.40 Fri Sep 5 21:58:32 2008 +++ src/sys/dev/sysmon/sysmon_power.c Mon Jun 8 00:55:35 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: sysmon_power.c,v 1.40 2008/09/05 21:58:32 gmcgarry Exp $ */ +/* $NetBSD: sysmon_power.c,v 1.41 2009/06/08 00:55:35 pgoyette Exp $ */ /*- * Copyright (c) 2007 Juan Romero Pardines. @@ -69,7 +69,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: sysmon_power.c,v 1.40 2008/09/05 21:58:32 gmcgarry Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sysmon_power.c,v 1.41 2009/06/08 00:55:35 pgoyette Exp $"); #include "opt_compat_netbsd.h" #include <sys/param.h> @@ -133,12 +133,8 @@ { PENVSYS_EVENT_CRITUNDER, "critical-under" }, { PENVSYS_EVENT_WARNOVER, "warning-over" }, { PENVSYS_EVENT_WARNUNDER, "warning-under" }, - { PENVSYS_EVENT_USER_CRITMAX, "critical-over" }, - { PENVSYS_EVENT_USER_CRITMIN, "critical-under" }, - { PENVSYS_EVENT_USER_WARNMAX, "warning-over" }, - { PENVSYS_EVENT_USER_WARNMIN, "warning-under" }, - { PENVSYS_EVENT_BATT_USERCAP, "user-capacity" }, - { PENVSYS_EVENT_BATT_USERWARN, "user-cap-warning" }, + { PENVSYS_EVENT_BATT_CRIT, "critical-capacity" }, + { PENVSYS_EVENT_BATT_WARN, "warning-capacity" }, { PENVSYS_EVENT_STATE_CHANGED, "state-changed" }, { PENVSYS_EVENT_LOW_POWER, "low-power" }, { -1, NULL } @@ -320,12 +316,8 @@ case PENVSYS_EVENT_CRITOVER: case PENVSYS_EVENT_WARNUNDER: case PENVSYS_EVENT_WARNOVER: - case PENVSYS_EVENT_USER_CRITMAX: - case PENVSYS_EVENT_USER_CRITMIN: - case PENVSYS_EVENT_USER_WARNMAX: - case PENVSYS_EVENT_USER_WARNMIN: - case PENVSYS_EVENT_BATT_USERCAP: - case PENVSYS_EVENT_BATT_USERWARN: + case PENVSYS_EVENT_BATT_CRIT: + case PENVSYS_EVENT_BATT_WARN: case PENVSYS_EVENT_STATE_CHANGED: case PENVSYS_EVENT_LOW_POWER: { @@ -807,11 +799,11 @@ pes->pes_dvname, pes->pes_sensname, pes->pes_statedesc); break; - case PENVSYS_EVENT_BATT_USERCAP: + case PENVSYS_EVENT_BATT_CRIT: mystr = "critical capacity"; PENVSYS_SHOWSTATE(mystr); break; - case PENVSYS_EVENT_BATT_USERWARN: + case PENVSYS_EVENT_BATT_WARN: mystr = "warning capacity"; PENVSYS_SHOWSTATE(mystr); break; @@ -833,22 +825,18 @@ PENVSYS_SHOWSTATE(mystr); break; case PENVSYS_EVENT_CRITOVER: - case PENVSYS_EVENT_USER_CRITMAX: mystr = "critical over"; PENVSYS_SHOWSTATE(mystr); break; case PENVSYS_EVENT_CRITUNDER: - case PENVSYS_EVENT_USER_CRITMIN: mystr = "critical under"; PENVSYS_SHOWSTATE(mystr); break; case PENVSYS_EVENT_WARNOVER: - case PENVSYS_EVENT_USER_WARNMAX: mystr = "warning over"; PENVSYS_SHOWSTATE(mystr); break; case PENVSYS_EVENT_WARNUNDER: - case PENVSYS_EVENT_USER_WARNMIN: mystr = "warning under"; PENVSYS_SHOWSTATE(mystr); break; Index: src/sys/sys/envsys.h diff -u src/sys/sys/envsys.h:1.24 src/sys/sys/envsys.h:1.25 --- src/sys/sys/envsys.h:1.24 Mon Jun 1 20:08:44 2009 +++ src/sys/sys/envsys.h Mon Jun 8 00:55:35 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: envsys.h,v 1.24 2009/06/01 20:08:44 pgoyette Exp $ */ +/* $NetBSD: envsys.h,v 1.25 2009/06/08 00:55:35 pgoyette Exp $ */ /*- * Copyright (c) 1999, 2007 The NetBSD Foundation, Inc. @@ -137,11 +137,26 @@ #define ENVSYS_FMONNOTSUPP 0x00000800 /* monitoring not supported */ #define ENVSYS_FNEED_REFRESH 0x00001000 /* sensor needs refreshing */ +/* + * IOCTLs + */ #define ENVSYS_GETDICTIONARY _IOWR('E', 0, struct plistref) #define ENVSYS_SETDICTIONARY _IOWR('E', 1, struct plistref) #define ENVSYS_REMOVEPROPS _IOWR('E', 2, struct plistref) /* + * Properties that can be set in upropset + */ +#define PROP_CRITMAX 0x0001 +#define PROP_CRITMIN 0x0002 +#define PROP_WARNMAX 0x0004 +#define PROP_WARNMIN 0x0008 +#define PROP_BATTCAP 0x0010 +#define PROP_BATTWARN 0x0020 +#define PROP_DESC 0x0040 +#define PROP_RFACT 0x0080 + +/* * Compatibility with old interface. Only ENVSYS_GTREDATA * and ENVSYS_GTREINFO ioctls are supported. */ Index: src/sys/sys/power.h diff -u src/sys/sys/power.h:1.12 src/sys/sys/power.h:1.13 --- src/sys/sys/power.h:1.12 Fri Aug 22 11:27:50 2008 +++ src/sys/sys/power.h Mon Jun 8 00:55:35 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: power.h,v 1.12 2008/08/22 11:27:50 pgoyette Exp $ */ +/* $NetBSD: power.h,v 1.13 2009/06/08 00:55:35 pgoyette Exp $ */ /* * Copyright (c) 2003 Wasabi Systems, Inc. @@ -154,17 +154,7 @@ * * PENVSYS_EVENT_WARNUNDER A warning over limit. * - * The following events apply to the same except for batteries: - * - * PENVSYS_EVENT_USER_CRITMAX User critical max limit. - * - * PENVSYS_EVENT_USER_CRITMIN User critical min limit. - * - * PENVSYS_EVENT_USER_WARNMAX User warning max limit. - * - * PENVSYS_EVENT_USER_WARNMIN User warning min limit. - * - * The folowing event apply to all sensors, when the state is + * The folowing event applies to all sensors, when the state is * valid or the warning or critical limit is not valid anymore: * * PENVSYS_EVENT_NORMAL Normal state in the sensor. @@ -176,25 +166,21 @@ #define PENVSYS_EVENT_CRITUNDER 120 #define PENVSYS_EVENT_WARNOVER 130 #define PENVSYS_EVENT_WARNUNDER 140 -#define PENVSYS_EVENT_USER_CRITMAX 150 -#define PENVSYS_EVENT_USER_WARNMAX 155 -#define PENVSYS_EVENT_USER_CRITMIN 160 -#define PENVSYS_EVENT_USER_WARNMIN 165 /* * The following events apply for battery sensors: * - * PENVSYS_EVENT_BATT_USERCAP User critical capacity. + * PENVSYS_EVENT_BATT_CRIT User critical capacity. * - * PENVSYS_EVENT_BATT_USERWARN User warning capacity. + * PENVSYS_EVENT_BATT_WARN User warning capacity. * * PENVSYS_EVENT_LOW_POWER AC Adapter is OFF and all batteries * are discharged. */ -#define PENVSYS_EVENT_BATT_USERCAP 170 -#define PENVSYS_EVENT_BATT_USERWARN 175 -#define PENVSYS_EVENT_LOW_POWER 180 +#define PENVSYS_EVENT_BATT_CRIT 170 +#define PENVSYS_EVENT_BATT_WARN 175 +#define PENVSYS_EVENT_LOW_POWER 180 /* * The following event apply for battery state and drive sensors: @@ -208,9 +194,8 @@ * The following events are used internally to associate multiple * external states with a single event monitor */ -#define PENVSYS_EVENT_HW_LIMITS 200 -#define PENVSYS_EVENT_USER_LIMITS 210 -#define PENVSYS_EVENT_BATT_USER_LIMITS 220 +#define PENVSYS_EVENT_LIMITS 200 +#define PENVSYS_EVENT_CAPACITY 210 /* * This structure defines the properties of an envsys event.