Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/dev/sysmon Permit creation of an event-monitor for alarm...
details: https://anonhg.NetBSD.org/src/rev/9c7f279579b9
branches: trunk
changeset: 753553:9c7f279579b9
user: pgoyette <pgoyette%NetBSD.org@localhost>
date: Thu Apr 01 12:16:14 2010 +0000
description:
Permit creation of an event-monitor for alarm limits even if the limits
are not currently set (and, in case of battery capacity sensors, if there
is no value_max). Ensure that such an event-monitor does not trigger the
delivery of any actual events.
Provide a mechanism for sensors to set their limits at time other than
system startup (for example, when a battery is inserted).
This allows us to boot a system with a battery missing, install the
battery some time later, and automatically monitor it without requiring
any user intervention to create the event-monitor. (The actual changes
for battery sensors to use this new capability will come later.)
diffstat:
sys/dev/sysmon/sysmon_envsys.c | 7 +-
sys/dev/sysmon/sysmon_envsys_events.c | 84 +++++++++++++++++++++++++++++-----
sys/dev/sysmon/sysmon_envsysvar.h | 3 +-
sys/dev/sysmon/sysmonvar.h | 4 +-
4 files changed, 79 insertions(+), 19 deletions(-)
diffs (198 lines):
diff -r 50eb85e65e8e -r 9c7f279579b9 sys/dev/sysmon/sysmon_envsys.c
--- a/sys/dev/sysmon/sysmon_envsys.c Thu Apr 01 12:09:39 2010 +0000
+++ b/sys/dev/sysmon/sysmon_envsys.c Thu Apr 01 12:16:14 2010 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: sysmon_envsys.c,v 1.103 2010/03/27 13:34:16 pgoyette Exp $ */
+/* $NetBSD: sysmon_envsys.c,v 1.104 2010/04/01 12:16:14 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.103 2010/03/27 13:34:16 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sysmon_envsys.c,v 1.104 2010/04/01 12:16:14 pgoyette Exp $");
#include <sys/param.h>
#include <sys/types.h>
@@ -84,7 +84,8 @@
kmutex_t sme_global_mtx;
-static prop_dictionary_t sme_propd;
+prop_dictionary_t sme_propd;
+
static uint32_t sysmon_envsys_next_sensor_index;
static struct sysmon_envsys *sysmon_envsys_find_40(u_int);
diff -r 50eb85e65e8e -r 9c7f279579b9 sys/dev/sysmon/sysmon_envsys_events.c
--- a/sys/dev/sysmon/sysmon_envsys_events.c Thu Apr 01 12:09:39 2010 +0000
+++ b/sys/dev/sysmon/sysmon_envsys_events.c Thu Apr 01 12:16:14 2010 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: sysmon_envsys_events.c,v 1.90 2010/03/24 19:15:00 njoly Exp $ */
+/* $NetBSD: sysmon_envsys_events.c,v 1.91 2010/04/01 12:16:14 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.90 2010/03/24 19:15:00 njoly Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sysmon_envsys_events.c,v 1.91 2010/04/01 12:16:14 pgoyette Exp $");
#include <sys/param.h>
#include <sys/types.h>
@@ -125,10 +125,10 @@
!(edata->flags & ENVSYS_FPERCENT) ||
(props & PROP_VAL_LIMITS) ||
(edata->upropset & PROP_VAL_LIMITS)))
- return ENOTSUP;
+ props = 0;
if ((props & PROP_VAL_LIMITS) && (edata->upropset & PROP_CAP_LIMITS))
- return ENOTSUP;
+ props = 0;
/*
* check if the event is already on the list and return
@@ -452,18 +452,10 @@
sed_t->sed_edata,
&lims, &props);
/*
- * If no values returned, don't create the event monitor at
- * this time. We'll get another chance later when the user
- * provides us with limits.
- */
- if (props == 0)
- sed_t->sed_edata->flags &= ~ENVSYS_FMONLIMITS;
-
- /*
* If driver doesn't provide a way to "absorb" user-specified
* limit values, we must monitor all limits ourselves
*/
- else if (sed_t->sed_sme->sme_set_limits == NULL)
+ if (sed_t->sed_sme->sme_set_limits == NULL)
props &= ~PROP_DRIVER_LIMITS;
/* Register the events that were specified */
@@ -542,6 +534,64 @@
}
/*
+ * sysmon_envsys_update_limits
+ *
+ * + If a driver needs to update the limits that it is providing,
+ * we need to update the dictionary data as well as the limits.
+ * This only makes sense if the driver is capable of providing
+ * its limits, and if there is a limits event-monitor.
+ */
+int
+sysmon_envsys_update_limits(struct sysmon_envsys *sme, envsys_data_t *edata)
+{
+ prop_dictionary_t sdict = NULL;
+ prop_array_t array = NULL;
+ sysmon_envsys_lim_t lims;
+ sme_event_t *see;
+ uint32_t props = 0;
+
+ if (sme->sme_get_limits == NULL ||
+ (edata->flags & ENVSYS_FMONLIMITS) == 0)
+ return EINVAL;
+
+ /* Find the dictionary for this sensor */
+ sysmon_envsys_acquire(sme, false);
+ array = prop_dictionary_get(sme_propd, sme->sme_name);
+ if (array == NULL ||
+ prop_object_type(array) != PROP_TYPE_ARRAY) {
+ DPRINTF(("%s: array device failed\n", __func__));
+ sysmon_envsys_release(sme, false);
+ return EINVAL;
+ }
+
+ sdict = prop_array_get(array, edata->sensor);
+ if (sdict == NULL) {
+ sysmon_envsys_release(sme, false);
+ return EINVAL;
+ }
+
+ /* Find the event definition to get its powertype */
+ LIST_FOREACH(see, &sme->sme_events_list, see_list) {
+ if (edata == see->see_edata &&
+ see->see_type == PENVSYS_EVENT_LIMITS)
+ break;
+ }
+ if (see == NULL) {
+ sysmon_envsys_release(sme, false);
+ return EINVAL;
+ }
+ /* Get new limit values */
+ (*sme->sme_get_limits)(sme, edata, &lims, &props);
+
+ /* Update event and dictionary */
+ sme_event_register(sdict, edata, sme, &lims, props,
+ PENVSYS_EVENT_LIMITS, see->see_pes.pes_type);
+
+ sysmon_envsys_release(sme, false);
+ return 0;
+}
+
+/*
* sme_events_check:
*
* + Passes the events to the workqueue thread and stops
@@ -615,11 +665,17 @@
* Else calculate our own status. Note that driver must
* relinquish responsibility for ALL limits if there is even
* one limit that it cannot handle!
+ *
+ * If this is a CAPACITY monitor, but the sensor's max_value
+ * is not set, treat it as though the monitor does not exist.
*/
if ((see->see_type == PENVSYS_EVENT_LIMITS ||
see->see_type == PENVSYS_EVENT_CAPACITY) &&
(edata->upropset & PROP_DRIVER_LIMITS) == 0) {
- if ((edata->upropset & (PROP_CRITMIN | PROP_BATTCAP)) &&
+ if ((see->see_type == PENVSYS_EVENT_CAPACITY) &&
+ (edata->value_max == 0))
+ edata->state = ENVSYS_SVALID;
+ else if ((edata->upropset & (PROP_CRITMIN | PROP_BATTCAP)) &&
(edata->value_cur < edata->limits.sel_critmin))
edata->state = ENVSYS_SCRITUNDER;
else if ((edata->upropset & (PROP_WARNMIN | PROP_BATTWARN)) &&
diff -r 50eb85e65e8e -r 9c7f279579b9 sys/dev/sysmon/sysmon_envsysvar.h
--- a/sys/dev/sysmon/sysmon_envsysvar.h Thu Apr 01 12:09:39 2010 +0000
+++ b/sys/dev/sysmon/sysmon_envsysvar.h Thu Apr 01 12:16:14 2010 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: sysmon_envsysvar.h,v 1.34 2010/03/19 02:19:13 pgoyette Exp $ */
+/* $NetBSD: sysmon_envsysvar.h,v 1.35 2010/04/01 12:16:14 pgoyette Exp $ */
/*-
* Copyright (c) 2007, 2008 Juan Romero Pardines.
@@ -100,6 +100,7 @@
* common stuff.
*/
extern kmutex_t sme_global_mtx; /* for the sme linked list and dict */
+extern prop_dictionary_t sme_propd; /* the global sensor dictionary */
/*
* linked list for the sysmon envsys devices.
diff -r 50eb85e65e8e -r 9c7f279579b9 sys/dev/sysmon/sysmonvar.h
--- a/sys/dev/sysmon/sysmonvar.h Thu Apr 01 12:09:39 2010 +0000
+++ b/sys/dev/sysmon/sysmonvar.h Thu Apr 01 12:16:14 2010 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: sysmonvar.h,v 1.37 2010/03/27 13:34:16 pgoyette Exp $ */
+/* $NetBSD: sysmonvar.h,v 1.38 2010/04/01 12:16:14 pgoyette Exp $ */
/*-
* Copyright (c) 2000 Zembu Labs, Inc.
@@ -212,6 +212,8 @@
const envsys_data_t *, void*),
void *, bool);
+int sysmon_envsys_update_limits(struct sysmon_envsys *, envsys_data_t *);
+
void sysmon_envsys_init(void);
/*****************************************************************************
Home |
Main Index |
Thread Index |
Old Index