Home | History | Annotate | Line # | Download | only in sysmon
sysmonvar.h revision 1.44.12.2
      1  1.44.12.2       snj /*	$NetBSD: sysmonvar.h,v 1.44.12.2 2015/04/06 18:45:30 snj Exp $	*/
      2        1.1   thorpej 
      3        1.1   thorpej /*-
      4        1.1   thorpej  * Copyright (c) 2000 Zembu Labs, Inc.
      5        1.1   thorpej  * All rights reserved.
      6        1.1   thorpej  *
      7        1.1   thorpej  * Author: Jason R. Thorpe <thorpej (at) zembu.com>
      8        1.1   thorpej  *
      9        1.1   thorpej  * Redistribution and use in source and binary forms, with or without
     10        1.1   thorpej  * modification, are permitted provided that the following conditions
     11        1.1   thorpej  * are met:
     12        1.1   thorpej  * 1. Redistributions of source code must retain the above copyright
     13        1.1   thorpej  *    notice, this list of conditions and the following disclaimer.
     14        1.1   thorpej  * 2. Redistributions in binary form must reproduce the above copyright
     15        1.1   thorpej  *    notice, this list of conditions and the following disclaimer in the
     16        1.1   thorpej  *    documentation and/or other materials provided with the distribution.
     17        1.1   thorpej  * 3. All advertising materials mentioning features or use of this software
     18        1.1   thorpej  *    must display the following acknowledgement:
     19        1.1   thorpej  *	This product includes software developed by Zembu Labs, Inc.
     20        1.1   thorpej  * 4. Neither the name of Zembu Labs nor the names of its employees may
     21        1.1   thorpej  *    be used to endorse or promote products derived from this software
     22        1.1   thorpej  *    without specific prior written permission.
     23        1.1   thorpej  *
     24        1.1   thorpej  * THIS SOFTWARE IS PROVIDED BY ZEMBU LABS, INC. ``AS IS'' AND ANY EXPRESS
     25        1.1   thorpej  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WAR-
     26        1.1   thorpej  * RANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DIS-
     27        1.1   thorpej  * CLAIMED.  IN NO EVENT SHALL ZEMBU LABS BE LIABLE FOR ANY DIRECT, INDIRECT,
     28        1.1   thorpej  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     29        1.1   thorpej  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     30        1.1   thorpej  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     31        1.1   thorpej  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     32        1.1   thorpej  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     33        1.1   thorpej  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     34        1.1   thorpej  */
     35        1.1   thorpej 
     36        1.1   thorpej #ifndef _DEV_SYSMON_SYSMONVAR_H_
     37        1.1   thorpej #define	_DEV_SYSMON_SYSMONVAR_H_
     38        1.1   thorpej 
     39       1.26   hannken #include <sys/param.h>
     40        1.1   thorpej #include <sys/envsys.h>
     41        1.2   thorpej #include <sys/wdog.h>
     42        1.6   thorpej #include <sys/power.h>
     43        1.1   thorpej #include <sys/queue.h>
     44       1.26   hannken #include <sys/callout.h>
     45       1.25   xtraeme #include <sys/mutex.h>
     46       1.25   xtraeme #include <sys/condvar.h>
     47       1.42  pgoyette #include <sys/rnd.h>
     48        1.1   thorpej 
     49       1.11  christos struct lwp;
     50        1.4   thorpej struct proc;
     51        1.6   thorpej struct knote;
     52        1.6   thorpej struct uio;
     53       1.25   xtraeme struct workqueue;
     54        1.4   thorpej 
     55        1.3   thorpej #define	SYSMON_MINOR_ENVSYS	0
     56        1.3   thorpej #define	SYSMON_MINOR_WDOG	1
     57        1.6   thorpej #define	SYSMON_MINOR_POWER	2
     58        1.3   thorpej 
     59        1.4   thorpej /*****************************************************************************
     60        1.4   thorpej  * Environmental sensor support
     61        1.4   thorpej  *****************************************************************************/
     62        1.4   thorpej 
     63       1.32  pgoyette /*
     64       1.32  pgoyette  * Thresholds/limits that are being monitored
     65       1.32  pgoyette  */
     66       1.44  pgoyette 
     67       1.44  pgoyette enum envsys_lims {
     68       1.44  pgoyette 	ENVSYS_LIM_CRITMAX,
     69       1.44  pgoyette 	ENVSYS_LIM_WARNMAX,
     70       1.44  pgoyette 	ENVSYS_LIM_WARNMIN,
     71       1.44  pgoyette 	ENVSYS_LIM_CRITMIN,
     72       1.44  pgoyette 	ENVSYS_LIM_LASTLIM
     73       1.44  pgoyette };
     74       1.44  pgoyette 
     75       1.32  pgoyette struct sysmon_envsys_lim {
     76       1.44  pgoyette 	int32_t critmax;
     77       1.44  pgoyette 	int32_t warnmax;
     78       1.44  pgoyette 	int32_t warnmin;
     79       1.44  pgoyette 	int32_t critmin;
     80       1.32  pgoyette };
     81       1.32  pgoyette 
     82       1.44  pgoyette typedef union {
     83       1.44  pgoyette 	int32_t sel_limit_list[ENVSYS_LIM_LASTLIM];
     84       1.44  pgoyette 	struct sysmon_envsys_lim sel_limits;
     85       1.44  pgoyette } sysmon_envsys_lim_t;
     86       1.44  pgoyette 
     87       1.44  pgoyette #define	sel_critmax sel_limits.critmax
     88       1.44  pgoyette #define	sel_warnmax sel_limits.warnmax
     89       1.44  pgoyette #define	sel_warnmin sel_limits.warnmin
     90       1.44  pgoyette #define	sel_critmin sel_limits.critmin
     91       1.32  pgoyette 
     92       1.32  pgoyette /* struct used by a sensor */
     93       1.32  pgoyette struct envsys_data {
     94       1.32  pgoyette 	TAILQ_ENTRY(envsys_data)	sensors_head;
     95       1.32  pgoyette 	uint32_t	sensor;		/* sensor number */
     96       1.32  pgoyette 	uint32_t	units;		/* type of sensor */
     97       1.32  pgoyette 	uint32_t	state;		/* sensor state */
     98       1.32  pgoyette 	uint32_t	flags;		/* sensor flags */
     99       1.32  pgoyette 	uint32_t	rpms;		/* for fans, nominal RPMs */
    100       1.32  pgoyette 	int32_t		rfact;		/* for volts, factor x 10^4 */
    101       1.32  pgoyette 	int32_t		value_cur;	/* current value */
    102       1.43  pgoyette 	int32_t		value_prev;	/* previous value */
    103       1.32  pgoyette 	int32_t		value_max;	/* max value */
    104       1.32  pgoyette 	int32_t		value_min;	/* min value */
    105       1.41  pgoyette 	int32_t		private;	/* private data for drivers */
    106       1.32  pgoyette 	sysmon_envsys_lim_t limits;	/* thresholds for monitoring */
    107       1.32  pgoyette 	int		upropset;	/* userland property set? */
    108       1.42  pgoyette 	krndsource_t	rnd_src;	/* source element for rnd(4) */
    109       1.32  pgoyette 	char		desc[ENVSYS_DESCLEN];	/* sensor description */
    110       1.32  pgoyette };
    111       1.32  pgoyette 
    112       1.32  pgoyette typedef struct envsys_data envsys_data_t;
    113       1.32  pgoyette 
    114       1.32  pgoyette /* sensor flags */
    115       1.32  pgoyette #define ENVSYS_FPERCENT 	0x00000001	/* sensor wants a percentage */
    116       1.32  pgoyette #define ENVSYS_FVALID_MAX	0x00000002	/* max value is ok */
    117       1.32  pgoyette #define ENVSYS_FVALID_MIN	0x00000004	/* min value is ok */
    118       1.41  pgoyette #define ENVSYS_F_OBSOLETE	0x00000008
    119       1.32  pgoyette #define ENVSYS_FCHANGERFACT	0x00000010	/* sensor can change rfact */
    120       1.32  pgoyette 
    121       1.32  pgoyette /* monitoring flags */
    122       1.32  pgoyette #define ENVSYS_FMONCRITICAL	0x00000020	/* monitor a critical state */
    123       1.32  pgoyette #define ENVSYS_FMONLIMITS	0x00000040	/* monitor limits/thresholds */
    124       1.32  pgoyette #define ENVSYS_FMONSTCHANGED	0x00000400	/* monitor a battery/drive state */
    125       1.33  pgoyette #define ENVSYS_FMONANY	\
    126       1.33  pgoyette 	(ENVSYS_FMONCRITICAL | ENVSYS_FMONLIMITS | ENVSYS_FMONSTCHANGED)
    127       1.32  pgoyette #define ENVSYS_FMONNOTSUPP	0x00000800	/* monitoring not supported */
    128       1.32  pgoyette #define ENVSYS_FNEED_REFRESH	0x00001000	/* sensor needs refreshing */
    129       1.42  pgoyette #define ENVSYS_FHAS_ENTROPY	0x00002000	/* sensor provides entropy
    130       1.42  pgoyette 						   for rnd(4) */
    131       1.32  pgoyette 
    132       1.32  pgoyette /*
    133       1.32  pgoyette  * Properties that can be set in upropset (and in the event_limit's
    134       1.32  pgoyette  * flags field)
    135       1.32  pgoyette  */
    136       1.32  pgoyette #define	PROP_CRITMAX		0x0001
    137       1.32  pgoyette #define	PROP_CRITMIN		0x0002
    138       1.32  pgoyette #define	PROP_WARNMAX		0x0004
    139       1.32  pgoyette #define	PROP_WARNMIN		0x0008
    140       1.32  pgoyette #define	PROP_BATTCAP		0x0010
    141       1.32  pgoyette #define	PROP_BATTWARN		0x0020
    142       1.32  pgoyette #define	PROP_BATTHIGH		0x0040
    143       1.32  pgoyette #define	PROP_BATTMAX		0x0080
    144       1.32  pgoyette #define	PROP_DESC		0x0100
    145       1.32  pgoyette #define	PROP_RFACT		0x0200
    146       1.32  pgoyette 
    147       1.32  pgoyette #define	PROP_DRIVER_LIMITS	0x8000
    148       1.32  pgoyette #define	PROP_CAP_LIMITS		(PROP_BATTCAP  | PROP_BATTWARN | \
    149       1.32  pgoyette 				 PROP_BATTHIGH | PROP_BATTMAX)
    150       1.32  pgoyette #define	PROP_VAL_LIMITS		(PROP_CRITMAX  | PROP_CRITMIN | \
    151       1.32  pgoyette 				 PROP_WARNMAX  | PROP_WARNMIN)
    152       1.32  pgoyette #define	PROP_LIMITS		(PROP_CAP_LIMITS | PROP_VAL_LIMITS)
    153       1.21   xtraeme struct sme_event;
    154       1.16   xtraeme 
    155        1.1   thorpej struct sysmon_envsys {
    156       1.21   xtraeme 	const char *sme_name;		/* envsys device name */
    157       1.21   xtraeme 	u_int sme_nsensors;		/* sensors count, from driver */
    158       1.21   xtraeme 	u_int sme_fsensor;		/* sensor index base, from sysmon */
    159       1.21   xtraeme #define SME_SENSOR_IDX(sme, idx) 	((idx) - (sme)->sme_fsensor)
    160       1.21   xtraeme 	int sme_class;			/* class of device */
    161       1.19   xtraeme #define SME_CLASS_BATTERY	1		/* device is a battery */
    162       1.19   xtraeme #define SME_CLASS_ACADAPTER	2		/* device is an AC adapter */
    163       1.21   xtraeme 	int sme_flags;			/* additional flags */
    164       1.21   xtraeme #define SME_FLAG_BUSY 		0x00000001 	/* device busy */
    165       1.21   xtraeme #define SME_DISABLE_REFRESH	0x00000002	/* disable sme_refresh */
    166       1.21   xtraeme #define SME_CALLOUT_INITIALIZED	0x00000004	/* callout was initialized */
    167       1.24   xtraeme #define SME_INIT_REFRESH        0x00000008      /* call sme_refresh() after
    168       1.24   xtraeme 						   interrupts are enabled in
    169       1.24   xtraeme 						   the autoconf(9) process. */
    170       1.27  jmcneill #define SME_POLL_ONLY           0x00000010      /* only poll sme_refresh */
    171       1.21   xtraeme 
    172       1.21   xtraeme 	void *sme_cookie;		/* for ENVSYS back-end */
    173       1.19   xtraeme 
    174       1.21   xtraeme 	/*
    175       1.21   xtraeme 	 * Function callback to receive data from device.
    176       1.21   xtraeme 	 */
    177       1.21   xtraeme 	void (*sme_refresh)(struct sysmon_envsys *, envsys_data_t *);
    178        1.1   thorpej 
    179       1.28  pgoyette 	/*
    180       1.28  pgoyette 	 * Function callbacks to exchange limit/threshold values
    181       1.28  pgoyette 	 * with device
    182       1.28  pgoyette 	 */
    183       1.29  pgoyette 	void (*sme_set_limits)(struct sysmon_envsys *, envsys_data_t *,
    184       1.31  pgoyette 			       sysmon_envsys_lim_t *, uint32_t *);
    185       1.29  pgoyette 	void (*sme_get_limits)(struct sysmon_envsys *, envsys_data_t *,
    186       1.31  pgoyette 			       sysmon_envsys_lim_t *, uint32_t *);
    187       1.28  pgoyette 
    188       1.21   xtraeme 	struct workqueue *sme_wq;	/* the workqueue for the events */
    189       1.21   xtraeme 	struct callout sme_callout;	/* for the events */
    190       1.21   xtraeme 	uint64_t sme_events_timeout;	/* the timeout used in the callout */
    191       1.15   xtraeme 
    192       1.21   xtraeme 	/*
    193       1.21   xtraeme 	 * linked list for the sysmon envsys devices.
    194       1.21   xtraeme 	 */
    195        1.1   thorpej 	LIST_ENTRY(sysmon_envsys) sme_list;
    196       1.19   xtraeme 
    197       1.16   xtraeme 	/*
    198       1.21   xtraeme 	 * linked list for the events that a device maintains.
    199       1.16   xtraeme 	 */
    200       1.21   xtraeme 	LIST_HEAD(, sme_event) sme_events_list;
    201        1.1   thorpej 
    202       1.21   xtraeme 	/*
    203       1.21   xtraeme 	 * tailq for the sensors that a device maintains.
    204       1.21   xtraeme 	 */
    205       1.21   xtraeme 	TAILQ_HEAD(, envsys_data) sme_sensors_list;
    206       1.25   xtraeme 
    207       1.25   xtraeme 	/*
    208       1.25   xtraeme 	 * Locking/synchronization.
    209       1.25   xtraeme 	 */
    210  1.44.12.2       snj 	int sme_busy;			/* number of items on workqueue,
    211  1.44.12.2       snj 					   sme_mtx or sme_work_mtx to read,
    212  1.44.12.2       snj 					   both to write */
    213       1.25   xtraeme 	kmutex_t sme_mtx;
    214  1.44.12.2       snj 	kmutex_t sme_work_mtx;
    215       1.25   xtraeme 	kcondvar_t sme_condvar;
    216        1.1   thorpej };
    217        1.9      yamt 
    218       1.11  christos int	sysmonopen_envsys(dev_t, int, int, struct lwp *);
    219       1.11  christos int	sysmonclose_envsys(dev_t, int, int, struct lwp *);
    220       1.13  christos int	sysmonioctl_envsys(dev_t, u_long, void *, int, struct lwp *);
    221        1.4   thorpej 
    222       1.21   xtraeme struct sysmon_envsys 	*sysmon_envsys_create(void);
    223       1.21   xtraeme void 			sysmon_envsys_destroy(struct sysmon_envsys *);
    224       1.21   xtraeme 
    225        1.4   thorpej int	sysmon_envsys_register(struct sysmon_envsys *);
    226        1.4   thorpej void	sysmon_envsys_unregister(struct sysmon_envsys *);
    227       1.15   xtraeme 
    228       1.21   xtraeme int	sysmon_envsys_sensor_attach(struct sysmon_envsys *, envsys_data_t *);
    229       1.21   xtraeme int	sysmon_envsys_sensor_detach(struct sysmon_envsys *, envsys_data_t *);
    230       1.21   xtraeme 
    231       1.30    martin uint32_t	sysmon_envsys_get_max_value(bool (*)(const envsys_data_t*), bool);
    232       1.30    martin 
    233       1.34  pgoyette void	sysmon_envsys_sensor_event(struct sysmon_envsys *, envsys_data_t *,
    234       1.34  pgoyette 				   int);
    235       1.34  pgoyette 
    236       1.42  pgoyette void	sysmon_envsys_refresh_sensor(struct sysmon_envsys *, envsys_data_t *);
    237       1.42  pgoyette 
    238       1.39  pgoyette typedef	bool (*sysmon_envsys_callback_t)(const struct sysmon_envsys *,
    239       1.39  pgoyette 					 const envsys_data_t *, void*);
    240       1.39  pgoyette 
    241       1.39  pgoyette void	sysmon_envsys_foreach_sensor(sysmon_envsys_callback_t, void *, bool);
    242       1.35  pgoyette 
    243       1.38  pgoyette int	sysmon_envsys_update_limits(struct sysmon_envsys *, envsys_data_t *);
    244       1.38  pgoyette 
    245       1.15   xtraeme void	sysmon_envsys_init(void);
    246        1.4   thorpej 
    247        1.4   thorpej /*****************************************************************************
    248        1.4   thorpej  * Watchdog timer support
    249        1.4   thorpej  *****************************************************************************/
    250        1.4   thorpej 
    251        1.2   thorpej struct sysmon_wdog {
    252        1.2   thorpej 	const char *smw_name;		/* watchdog device name */
    253        1.2   thorpej 
    254        1.2   thorpej 	LIST_ENTRY(sysmon_wdog) smw_list;
    255        1.2   thorpej 
    256        1.2   thorpej 	void *smw_cookie;		/* for watchdog back-end */
    257        1.2   thorpej 	int (*smw_setmode)(struct sysmon_wdog *);
    258        1.2   thorpej 	int (*smw_tickle)(struct sysmon_wdog *);
    259        1.2   thorpej 	u_int smw_period;		/* timer period (in seconds) */
    260        1.2   thorpej 	int smw_mode;			/* timer mode */
    261        1.2   thorpej 	u_int smw_refcnt;		/* references */
    262        1.2   thorpej 	pid_t smw_tickler;		/* last process to tickle */
    263        1.2   thorpej };
    264        1.3   thorpej 
    265       1.11  christos int	sysmonopen_wdog(dev_t, int, int, struct lwp *);
    266       1.11  christos int	sysmonclose_wdog(dev_t, int, int, struct lwp *);
    267       1.13  christos int	sysmonioctl_wdog(dev_t, u_long, void *, int, struct lwp *);
    268        1.2   thorpej 
    269       1.40      matt int     sysmon_wdog_setmode(struct sysmon_wdog *, int, u_int);
    270       1.11  christos int     sysmon_wdog_register(struct sysmon_wdog *);
    271       1.23    dyoung int     sysmon_wdog_unregister(struct sysmon_wdog *);
    272        1.5   thorpej 
    273       1.17   xtraeme void	sysmon_wdog_init(void);
    274       1.17   xtraeme 
    275        1.5   thorpej /*****************************************************************************
    276        1.5   thorpej  * Power management support
    277        1.5   thorpej  *****************************************************************************/
    278        1.5   thorpej 
    279        1.5   thorpej struct sysmon_pswitch {
    280        1.5   thorpej 	const char *smpsw_name;		/* power switch name */
    281        1.5   thorpej 	int smpsw_type;			/* power switch type */
    282        1.5   thorpej 
    283        1.5   thorpej 	LIST_ENTRY(sysmon_pswitch) smpsw_list;
    284        1.5   thorpej };
    285        1.5   thorpej 
    286       1.11  christos int	sysmonopen_power(dev_t, int, int, struct lwp *);
    287       1.11  christos int	sysmonclose_power(dev_t, int, int, struct lwp *);
    288        1.6   thorpej int	sysmonread_power(dev_t, struct uio *, int);
    289       1.11  christos int	sysmonpoll_power(dev_t, int, struct lwp *);
    290        1.6   thorpej int	sysmonkqfilter_power(dev_t, struct knote *);
    291       1.13  christos int	sysmonioctl_power(dev_t, u_long, void *, int, struct lwp *);
    292        1.5   thorpej 
    293        1.6   thorpej void	sysmon_power_settype(const char *);
    294        1.5   thorpej 
    295        1.5   thorpej int	sysmon_pswitch_register(struct sysmon_pswitch *);
    296        1.5   thorpej void	sysmon_pswitch_unregister(struct sysmon_pswitch *);
    297        1.5   thorpej 
    298        1.5   thorpej void	sysmon_pswitch_event(struct sysmon_pswitch *, int);
    299       1.15   xtraeme void	sysmon_penvsys_event(struct penvsys_state *, int);
    300       1.15   xtraeme 
    301       1.15   xtraeme void	sysmon_power_init(void);
    302       1.15   xtraeme 
    303        1.1   thorpej #endif /* _DEV_SYSMON_SYSMONVAR_H_ */
    304