Home | History | Annotate | Line # | Download | only in sysmon
sysmonvar.h revision 1.49.10.1
      1  1.49.10.1       snj /*	$NetBSD: sysmonvar.h,v 1.49.10.1 2017/09/23 17:22:48 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.47  riastrad #include <sys/rndsource.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.48   mlelstv 	uint32_t	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.24   xtraeme #define SME_INIT_REFRESH        0x00000008      /* call sme_refresh() after
    167       1.24   xtraeme 						   interrupts are enabled in
    168       1.24   xtraeme 						   the autoconf(9) process. */
    169       1.27  jmcneill #define SME_POLL_ONLY           0x00000010      /* only poll sme_refresh */
    170       1.21   xtraeme 
    171       1.21   xtraeme 	void *sme_cookie;		/* for ENVSYS back-end */
    172       1.19   xtraeme 
    173       1.21   xtraeme 	/*
    174       1.21   xtraeme 	 * Function callback to receive data from device.
    175       1.21   xtraeme 	 */
    176       1.21   xtraeme 	void (*sme_refresh)(struct sysmon_envsys *, envsys_data_t *);
    177        1.1   thorpej 
    178       1.28  pgoyette 	/*
    179       1.28  pgoyette 	 * Function callbacks to exchange limit/threshold values
    180       1.28  pgoyette 	 * with device
    181       1.28  pgoyette 	 */
    182       1.29  pgoyette 	void (*sme_set_limits)(struct sysmon_envsys *, envsys_data_t *,
    183       1.31  pgoyette 			       sysmon_envsys_lim_t *, uint32_t *);
    184       1.29  pgoyette 	void (*sme_get_limits)(struct sysmon_envsys *, envsys_data_t *,
    185       1.31  pgoyette 			       sysmon_envsys_lim_t *, uint32_t *);
    186       1.28  pgoyette 
    187       1.21   xtraeme 	struct workqueue *sme_wq;	/* the workqueue for the events */
    188       1.21   xtraeme 	struct callout sme_callout;	/* for the events */
    189  1.49.10.1       snj 	int sme_callout_state;		/* state of the event's callout */
    190  1.49.10.1       snj 
    191  1.49.10.1       snj #define	SME_CALLOUT_INVALID	0x0	/* callout is not initialized */
    192  1.49.10.1       snj #define	SME_CALLOUT_READY	0x1	/* callout is ready for use */
    193  1.49.10.1       snj #define	SME_CALLOUT_HALTED	0x2	/* callout can be destroyed */
    194  1.49.10.1       snj 
    195       1.21   xtraeme 	uint64_t sme_events_timeout;	/* the timeout used in the callout */
    196       1.15   xtraeme 
    197       1.21   xtraeme 	/*
    198       1.21   xtraeme 	 * linked list for the sysmon envsys devices.
    199       1.21   xtraeme 	 */
    200        1.1   thorpej 	LIST_ENTRY(sysmon_envsys) sme_list;
    201       1.19   xtraeme 
    202       1.16   xtraeme 	/*
    203       1.21   xtraeme 	 * linked list for the events that a device maintains.
    204       1.16   xtraeme 	 */
    205       1.21   xtraeme 	LIST_HEAD(, sme_event) sme_events_list;
    206        1.1   thorpej 
    207       1.21   xtraeme 	/*
    208       1.21   xtraeme 	 * tailq for the sensors that a device maintains.
    209       1.21   xtraeme 	 */
    210       1.21   xtraeme 	TAILQ_HEAD(, envsys_data) sme_sensors_list;
    211       1.25   xtraeme 
    212       1.25   xtraeme 	/*
    213       1.25   xtraeme 	 * Locking/synchronization.
    214       1.25   xtraeme 	 */
    215       1.46   hannken 	int sme_busy;			/* number of items on workqueue,
    216       1.46   hannken 					   sme_mtx or sme_work_mtx to read,
    217       1.46   hannken 					   both to write */
    218       1.25   xtraeme 	kmutex_t sme_mtx;
    219       1.46   hannken 	kmutex_t sme_work_mtx;
    220       1.25   xtraeme 	kcondvar_t sme_condvar;
    221        1.1   thorpej };
    222        1.9      yamt 
    223       1.11  christos int	sysmonopen_envsys(dev_t, int, int, struct lwp *);
    224       1.11  christos int	sysmonclose_envsys(dev_t, int, int, struct lwp *);
    225       1.13  christos int	sysmonioctl_envsys(dev_t, u_long, void *, int, struct lwp *);
    226        1.4   thorpej 
    227       1.21   xtraeme struct sysmon_envsys 	*sysmon_envsys_create(void);
    228       1.21   xtraeme void 			sysmon_envsys_destroy(struct sysmon_envsys *);
    229       1.21   xtraeme 
    230        1.4   thorpej int	sysmon_envsys_register(struct sysmon_envsys *);
    231        1.4   thorpej void	sysmon_envsys_unregister(struct sysmon_envsys *);
    232       1.15   xtraeme 
    233       1.21   xtraeme int	sysmon_envsys_sensor_attach(struct sysmon_envsys *, envsys_data_t *);
    234       1.21   xtraeme int	sysmon_envsys_sensor_detach(struct sysmon_envsys *, envsys_data_t *);
    235       1.21   xtraeme 
    236       1.30    martin uint32_t	sysmon_envsys_get_max_value(bool (*)(const envsys_data_t*), bool);
    237       1.30    martin 
    238       1.34  pgoyette void	sysmon_envsys_sensor_event(struct sysmon_envsys *, envsys_data_t *,
    239       1.34  pgoyette 				   int);
    240       1.34  pgoyette 
    241       1.42  pgoyette void	sysmon_envsys_refresh_sensor(struct sysmon_envsys *, envsys_data_t *);
    242       1.42  pgoyette 
    243       1.39  pgoyette typedef	bool (*sysmon_envsys_callback_t)(const struct sysmon_envsys *,
    244       1.39  pgoyette 					 const envsys_data_t *, void*);
    245       1.39  pgoyette 
    246       1.39  pgoyette void	sysmon_envsys_foreach_sensor(sysmon_envsys_callback_t, void *, bool);
    247       1.35  pgoyette 
    248       1.38  pgoyette int	sysmon_envsys_update_limits(struct sysmon_envsys *, envsys_data_t *);
    249       1.38  pgoyette 
    250       1.49  pgoyette int	sysmon_envsys_init(void);
    251       1.49  pgoyette int	sysmon_envsys_fini(void);
    252        1.4   thorpej 
    253        1.4   thorpej /*****************************************************************************
    254        1.4   thorpej  * Watchdog timer support
    255        1.4   thorpej  *****************************************************************************/
    256        1.4   thorpej 
    257        1.2   thorpej struct sysmon_wdog {
    258        1.2   thorpej 	const char *smw_name;		/* watchdog device name */
    259        1.2   thorpej 
    260        1.2   thorpej 	LIST_ENTRY(sysmon_wdog) smw_list;
    261        1.2   thorpej 
    262        1.2   thorpej 	void *smw_cookie;		/* for watchdog back-end */
    263        1.2   thorpej 	int (*smw_setmode)(struct sysmon_wdog *);
    264        1.2   thorpej 	int (*smw_tickle)(struct sysmon_wdog *);
    265        1.2   thorpej 	u_int smw_period;		/* timer period (in seconds) */
    266        1.2   thorpej 	int smw_mode;			/* timer mode */
    267        1.2   thorpej 	u_int smw_refcnt;		/* references */
    268        1.2   thorpej 	pid_t smw_tickler;		/* last process to tickle */
    269        1.2   thorpej };
    270        1.3   thorpej 
    271       1.11  christos int	sysmonopen_wdog(dev_t, int, int, struct lwp *);
    272       1.11  christos int	sysmonclose_wdog(dev_t, int, int, struct lwp *);
    273       1.13  christos int	sysmonioctl_wdog(dev_t, u_long, void *, int, struct lwp *);
    274        1.2   thorpej 
    275       1.40      matt int     sysmon_wdog_setmode(struct sysmon_wdog *, int, u_int);
    276       1.11  christos int     sysmon_wdog_register(struct sysmon_wdog *);
    277       1.23    dyoung int     sysmon_wdog_unregister(struct sysmon_wdog *);
    278        1.5   thorpej 
    279       1.49  pgoyette int	sysmon_wdog_init(void);
    280       1.49  pgoyette int	sysmon_wdog_fini(void);
    281       1.17   xtraeme 
    282        1.5   thorpej /*****************************************************************************
    283        1.5   thorpej  * Power management support
    284        1.5   thorpej  *****************************************************************************/
    285        1.5   thorpej 
    286        1.5   thorpej struct sysmon_pswitch {
    287        1.5   thorpej 	const char *smpsw_name;		/* power switch name */
    288        1.5   thorpej 	int smpsw_type;			/* power switch type */
    289        1.5   thorpej 
    290        1.5   thorpej 	LIST_ENTRY(sysmon_pswitch) smpsw_list;
    291        1.5   thorpej };
    292        1.5   thorpej 
    293       1.11  christos int	sysmonopen_power(dev_t, int, int, struct lwp *);
    294       1.11  christos int	sysmonclose_power(dev_t, int, int, struct lwp *);
    295        1.6   thorpej int	sysmonread_power(dev_t, struct uio *, int);
    296       1.11  christos int	sysmonpoll_power(dev_t, int, struct lwp *);
    297        1.6   thorpej int	sysmonkqfilter_power(dev_t, struct knote *);
    298       1.13  christos int	sysmonioctl_power(dev_t, u_long, void *, int, struct lwp *);
    299        1.5   thorpej 
    300        1.6   thorpej void	sysmon_power_settype(const char *);
    301        1.5   thorpej 
    302        1.5   thorpej int	sysmon_pswitch_register(struct sysmon_pswitch *);
    303        1.5   thorpej void	sysmon_pswitch_unregister(struct sysmon_pswitch *);
    304        1.5   thorpej 
    305        1.5   thorpej void	sysmon_pswitch_event(struct sysmon_pswitch *, int);
    306       1.15   xtraeme void	sysmon_penvsys_event(struct penvsys_state *, int);
    307       1.15   xtraeme 
    308       1.49  pgoyette int	sysmon_power_init(void);
    309       1.49  pgoyette int	sysmon_power_fini(void);
    310       1.49  pgoyette 
    311       1.49  pgoyette /*
    312       1.49  pgoyette  * Interface to sysmon common code used for autoloading
    313       1.49  pgoyette  */
    314       1.49  pgoyette struct sysmon_opvec {
    315       1.49  pgoyette 	int (*so_open)(dev_t, int, int, struct lwp*);
    316       1.49  pgoyette 	int (*so_close)(dev_t, int, int, struct lwp*);
    317       1.49  pgoyette 	int (*so_ioctl)(dev_t, u_long, void *, int, struct lwp*);
    318       1.49  pgoyette 	int (*so_read)(dev_t, struct uio*, int);
    319       1.49  pgoyette 	int (*so_poll)(dev_t, int, struct lwp*);
    320       1.49  pgoyette 	int (*so_filter)(dev_t, struct knote*);
    321       1.49  pgoyette };
    322       1.49  pgoyette 
    323       1.49  pgoyette int	sysmon_init(void);
    324       1.49  pgoyette int	sysmon_fini(void);
    325       1.49  pgoyette int	sysmon_attach_minor(int, struct sysmon_opvec*);
    326       1.15   xtraeme 
    327        1.1   thorpej #endif /* _DEV_SYSMON_SYSMONVAR_H_ */
    328