1 1.53 riastrad /* $NetBSD: sysmonvar.h,v 1.53 2021/12/31 14:44:50 riastradh 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.51 riastrad /* 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.52 riastrad struct callout sme_callout; /* for the events 189 1.52 riastrad * sme_work_mtx to schedule or halt */ 190 1.52 riastrad int sme_callout_state; /* state of the event's callout 191 1.52 riastrad * sme_work_mtx to read or write */ 192 1.50 pgoyette 193 1.50 pgoyette #define SME_CALLOUT_INVALID 0x0 /* callout is not initialized */ 194 1.50 pgoyette #define SME_CALLOUT_READY 0x1 /* callout is ready for use */ 195 1.50 pgoyette #define SME_CALLOUT_HALTED 0x2 /* callout can be destroyed */ 196 1.50 pgoyette 197 1.52 riastrad uint64_t sme_events_timeout; /* the timeout used in the callout 198 1.52 riastrad * sme_work_mtx to read or write */ 199 1.15 xtraeme 200 1.51 riastrad /* 201 1.21 xtraeme * linked list for the sysmon envsys devices. 202 1.21 xtraeme */ 203 1.1 thorpej LIST_ENTRY(sysmon_envsys) sme_list; 204 1.19 xtraeme 205 1.51 riastrad /* 206 1.21 xtraeme * linked list for the events that a device maintains. 207 1.52 riastrad * - sme_work_mtx OR sme_mtx to read 208 1.52 riastrad * - sme_work_mtx AND sme_mtx to write 209 1.16 xtraeme */ 210 1.21 xtraeme LIST_HEAD(, sme_event) sme_events_list; 211 1.1 thorpej 212 1.21 xtraeme /* 213 1.21 xtraeme * tailq for the sensors that a device maintains. 214 1.52 riastrad * - sme_mtx to read or write 215 1.21 xtraeme */ 216 1.21 xtraeme TAILQ_HEAD(, envsys_data) sme_sensors_list; 217 1.25 xtraeme 218 1.25 xtraeme /* 219 1.25 xtraeme * Locking/synchronization. 220 1.53 riastrad * 221 1.53 riastrad * Lock order: sme_global_mtx -> sme_mtx -> sme_work_mtx 222 1.25 xtraeme */ 223 1.46 hannken int sme_busy; /* number of items on workqueue, 224 1.52 riastrad * sme_work_mtx to read or write */ 225 1.25 xtraeme kmutex_t sme_mtx; 226 1.46 hannken kmutex_t sme_work_mtx; 227 1.25 xtraeme kcondvar_t sme_condvar; 228 1.1 thorpej }; 229 1.9 yamt 230 1.11 christos int sysmonopen_envsys(dev_t, int, int, struct lwp *); 231 1.11 christos int sysmonclose_envsys(dev_t, int, int, struct lwp *); 232 1.13 christos int sysmonioctl_envsys(dev_t, u_long, void *, int, struct lwp *); 233 1.4 thorpej 234 1.21 xtraeme struct sysmon_envsys *sysmon_envsys_create(void); 235 1.21 xtraeme void sysmon_envsys_destroy(struct sysmon_envsys *); 236 1.21 xtraeme 237 1.4 thorpej int sysmon_envsys_register(struct sysmon_envsys *); 238 1.4 thorpej void sysmon_envsys_unregister(struct sysmon_envsys *); 239 1.15 xtraeme 240 1.21 xtraeme int sysmon_envsys_sensor_attach(struct sysmon_envsys *, envsys_data_t *); 241 1.21 xtraeme int sysmon_envsys_sensor_detach(struct sysmon_envsys *, envsys_data_t *); 242 1.21 xtraeme 243 1.30 martin uint32_t sysmon_envsys_get_max_value(bool (*)(const envsys_data_t*), bool); 244 1.30 martin 245 1.34 pgoyette void sysmon_envsys_sensor_event(struct sysmon_envsys *, envsys_data_t *, 246 1.34 pgoyette int); 247 1.34 pgoyette 248 1.42 pgoyette void sysmon_envsys_refresh_sensor(struct sysmon_envsys *, envsys_data_t *); 249 1.42 pgoyette 250 1.39 pgoyette typedef bool (*sysmon_envsys_callback_t)(const struct sysmon_envsys *, 251 1.39 pgoyette const envsys_data_t *, void*); 252 1.39 pgoyette 253 1.39 pgoyette void sysmon_envsys_foreach_sensor(sysmon_envsys_callback_t, void *, bool); 254 1.35 pgoyette 255 1.38 pgoyette int sysmon_envsys_update_limits(struct sysmon_envsys *, envsys_data_t *); 256 1.38 pgoyette 257 1.49 pgoyette int sysmon_envsys_init(void); 258 1.49 pgoyette int sysmon_envsys_fini(void); 259 1.4 thorpej 260 1.4 thorpej /***************************************************************************** 261 1.4 thorpej * Watchdog timer support 262 1.4 thorpej *****************************************************************************/ 263 1.4 thorpej 264 1.2 thorpej struct sysmon_wdog { 265 1.2 thorpej const char *smw_name; /* watchdog device name */ 266 1.2 thorpej 267 1.2 thorpej LIST_ENTRY(sysmon_wdog) smw_list; 268 1.2 thorpej 269 1.2 thorpej void *smw_cookie; /* for watchdog back-end */ 270 1.2 thorpej int (*smw_setmode)(struct sysmon_wdog *); 271 1.2 thorpej int (*smw_tickle)(struct sysmon_wdog *); 272 1.2 thorpej u_int smw_period; /* timer period (in seconds) */ 273 1.2 thorpej int smw_mode; /* timer mode */ 274 1.2 thorpej u_int smw_refcnt; /* references */ 275 1.2 thorpej pid_t smw_tickler; /* last process to tickle */ 276 1.2 thorpej }; 277 1.3 thorpej 278 1.11 christos int sysmonopen_wdog(dev_t, int, int, struct lwp *); 279 1.11 christos int sysmonclose_wdog(dev_t, int, int, struct lwp *); 280 1.13 christos int sysmonioctl_wdog(dev_t, u_long, void *, int, struct lwp *); 281 1.2 thorpej 282 1.40 matt int sysmon_wdog_setmode(struct sysmon_wdog *, int, u_int); 283 1.11 christos int sysmon_wdog_register(struct sysmon_wdog *); 284 1.23 dyoung int sysmon_wdog_unregister(struct sysmon_wdog *); 285 1.5 thorpej 286 1.49 pgoyette int sysmon_wdog_init(void); 287 1.49 pgoyette int sysmon_wdog_fini(void); 288 1.17 xtraeme 289 1.5 thorpej /***************************************************************************** 290 1.5 thorpej * Power management support 291 1.5 thorpej *****************************************************************************/ 292 1.5 thorpej 293 1.5 thorpej struct sysmon_pswitch { 294 1.5 thorpej const char *smpsw_name; /* power switch name */ 295 1.5 thorpej int smpsw_type; /* power switch type */ 296 1.5 thorpej 297 1.5 thorpej LIST_ENTRY(sysmon_pswitch) smpsw_list; 298 1.5 thorpej }; 299 1.5 thorpej 300 1.11 christos int sysmonopen_power(dev_t, int, int, struct lwp *); 301 1.11 christos int sysmonclose_power(dev_t, int, int, struct lwp *); 302 1.6 thorpej int sysmonread_power(dev_t, struct uio *, int); 303 1.11 christos int sysmonpoll_power(dev_t, int, struct lwp *); 304 1.6 thorpej int sysmonkqfilter_power(dev_t, struct knote *); 305 1.13 christos int sysmonioctl_power(dev_t, u_long, void *, int, struct lwp *); 306 1.5 thorpej 307 1.6 thorpej void sysmon_power_settype(const char *); 308 1.5 thorpej 309 1.5 thorpej int sysmon_pswitch_register(struct sysmon_pswitch *); 310 1.5 thorpej void sysmon_pswitch_unregister(struct sysmon_pswitch *); 311 1.5 thorpej 312 1.5 thorpej void sysmon_pswitch_event(struct sysmon_pswitch *, int); 313 1.15 xtraeme void sysmon_penvsys_event(struct penvsys_state *, int); 314 1.15 xtraeme 315 1.49 pgoyette int sysmon_power_init(void); 316 1.49 pgoyette int sysmon_power_fini(void); 317 1.49 pgoyette 318 1.49 pgoyette /* 319 1.49 pgoyette * Interface to sysmon common code used for autoloading 320 1.49 pgoyette */ 321 1.49 pgoyette struct sysmon_opvec { 322 1.49 pgoyette int (*so_open)(dev_t, int, int, struct lwp*); 323 1.49 pgoyette int (*so_close)(dev_t, int, int, struct lwp*); 324 1.49 pgoyette int (*so_ioctl)(dev_t, u_long, void *, int, struct lwp*); 325 1.49 pgoyette int (*so_read)(dev_t, struct uio*, int); 326 1.49 pgoyette int (*so_poll)(dev_t, int, struct lwp*); 327 1.49 pgoyette int (*so_filter)(dev_t, struct knote*); 328 1.49 pgoyette }; 329 1.49 pgoyette 330 1.49 pgoyette int sysmon_init(void); 331 1.49 pgoyette int sysmon_fini(void); 332 1.49 pgoyette int sysmon_attach_minor(int, struct sysmon_opvec*); 333 1.15 xtraeme 334 1.1 thorpej #endif /* _DEV_SYSMON_SYSMONVAR_H_ */ 335