1 /* $NetBSD: sysmonvar.h,v 1.22 2007/11/20 17:24:32 xtraeme Exp $ */ 2 3 /*- 4 * Copyright (c) 2000 Zembu Labs, Inc. 5 * All rights reserved. 6 * 7 * Author: Jason R. Thorpe <thorpej@zembu.com> 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions 11 * are met: 12 * 1. Redistributions of source code must retain the above copyright 13 * notice, this list of conditions and the following disclaimer. 14 * 2. Redistributions in binary form must reproduce the above copyright 15 * notice, this list of conditions and the following disclaimer in the 16 * documentation and/or other materials provided with the distribution. 17 * 3. All advertising materials mentioning features or use of this software 18 * must display the following acknowledgement: 19 * This product includes software developed by Zembu Labs, Inc. 20 * 4. Neither the name of Zembu Labs nor the names of its employees may 21 * be used to endorse or promote products derived from this software 22 * without specific prior written permission. 23 * 24 * THIS SOFTWARE IS PROVIDED BY ZEMBU LABS, INC. ``AS IS'' AND ANY EXPRESS 25 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WAR- 26 * RANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DIS- 27 * CLAIMED. IN NO EVENT SHALL ZEMBU LABS BE LIABLE FOR ANY DIRECT, INDIRECT, 28 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 29 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 30 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 31 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 32 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 33 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 34 */ 35 36 #ifndef _DEV_SYSMON_SYSMONVAR_H_ 37 #define _DEV_SYSMON_SYSMONVAR_H_ 38 39 #include <sys/envsys.h> 40 #include <sys/wdog.h> 41 #include <sys/power.h> 42 #include <sys/queue.h> 43 #include <sys/callout.h> 44 #include <sys/workqueue.h> 45 46 struct lwp; 47 struct proc; 48 struct knote; 49 struct uio; 50 51 #define SYSMON_MINOR_ENVSYS 0 52 #define SYSMON_MINOR_WDOG 1 53 #define SYSMON_MINOR_POWER 2 54 55 /***************************************************************************** 56 * Environmental sensor support 57 *****************************************************************************/ 58 59 struct sme_event; 60 struct sme_sensor_names; 61 62 struct sysmon_envsys { 63 const char *sme_name; /* envsys device name */ 64 u_int sme_nsensors; /* sensors count, from driver */ 65 u_int sme_fsensor; /* sensor index base, from sysmon */ 66 #define SME_SENSOR_IDX(sme, idx) ((idx) - (sme)->sme_fsensor) 67 int sme_class; /* class of device */ 68 #define SME_CLASS_BATTERY 1 /* device is a battery */ 69 #define SME_CLASS_ACADAPTER 2 /* device is an AC adapter */ 70 int sme_flags; /* additional flags */ 71 #define SME_FLAG_BUSY 0x00000001 /* device busy */ 72 #define SME_DISABLE_REFRESH 0x00000002 /* disable sme_refresh */ 73 #define SME_CALLOUT_INITIALIZED 0x00000004 /* callout was initialized */ 74 75 void *sme_cookie; /* for ENVSYS back-end */ 76 77 /* 78 * Function callback to receive data from device. 79 */ 80 void (*sme_refresh)(struct sysmon_envsys *, envsys_data_t *); 81 82 struct workqueue *sme_wq; /* the workqueue for the events */ 83 struct callout sme_callout; /* for the events */ 84 uint64_t sme_events_timeout; /* the timeout used in the callout */ 85 86 /* 87 * linked list for the sysmon envsys devices. 88 */ 89 LIST_ENTRY(sysmon_envsys) sme_list; 90 91 /* 92 * linked list for the events that a device maintains. 93 */ 94 LIST_HEAD(, sme_event) sme_events_list; 95 96 /* 97 * tailq for the sensors that a device maintains. 98 */ 99 TAILQ_HEAD(, envsys_data) sme_sensors_list; 100 }; 101 102 int sysmonopen_envsys(dev_t, int, int, struct lwp *); 103 int sysmonclose_envsys(dev_t, int, int, struct lwp *); 104 int sysmonioctl_envsys(dev_t, u_long, void *, int, struct lwp *); 105 106 struct sysmon_envsys *sysmon_envsys_create(void); 107 void sysmon_envsys_destroy(struct sysmon_envsys *); 108 109 int sysmon_envsys_register(struct sysmon_envsys *); 110 void sysmon_envsys_unregister(struct sysmon_envsys *); 111 112 int sysmon_envsys_sensor_attach(struct sysmon_envsys *, envsys_data_t *); 113 int sysmon_envsys_sensor_detach(struct sysmon_envsys *, envsys_data_t *); 114 115 void sysmon_envsys_init(void); 116 117 /***************************************************************************** 118 * Watchdog timer support 119 *****************************************************************************/ 120 121 struct sysmon_wdog { 122 const char *smw_name; /* watchdog device name */ 123 124 LIST_ENTRY(sysmon_wdog) smw_list; 125 126 void *smw_cookie; /* for watchdog back-end */ 127 int (*smw_setmode)(struct sysmon_wdog *); 128 int (*smw_tickle)(struct sysmon_wdog *); 129 u_int smw_period; /* timer period (in seconds) */ 130 int smw_mode; /* timer mode */ 131 u_int smw_refcnt; /* references */ 132 pid_t smw_tickler; /* last process to tickle */ 133 }; 134 135 int sysmonopen_wdog(dev_t, int, int, struct lwp *); 136 int sysmonclose_wdog(dev_t, int, int, struct lwp *); 137 int sysmonioctl_wdog(dev_t, u_long, void *, int, struct lwp *); 138 139 int sysmon_wdog_register(struct sysmon_wdog *); 140 void sysmon_wdog_unregister(struct sysmon_wdog *); 141 142 void sysmon_wdog_init(void); 143 144 /***************************************************************************** 145 * Power management support 146 *****************************************************************************/ 147 148 struct sysmon_pswitch { 149 const char *smpsw_name; /* power switch name */ 150 int smpsw_type; /* power switch type */ 151 152 LIST_ENTRY(sysmon_pswitch) smpsw_list; 153 }; 154 155 int sysmonopen_power(dev_t, int, int, struct lwp *); 156 int sysmonclose_power(dev_t, int, int, struct lwp *); 157 int sysmonread_power(dev_t, struct uio *, int); 158 int sysmonpoll_power(dev_t, int, struct lwp *); 159 int sysmonkqfilter_power(dev_t, struct knote *); 160 int sysmonioctl_power(dev_t, u_long, void *, int, struct lwp *); 161 162 void sysmon_power_settype(const char *); 163 164 int sysmon_pswitch_register(struct sysmon_pswitch *); 165 void sysmon_pswitch_unregister(struct sysmon_pswitch *); 166 167 void sysmon_pswitch_event(struct sysmon_pswitch *, int); 168 void sysmon_penvsys_event(struct penvsys_state *, int); 169 170 void sysmon_power_init(void); 171 172 #endif /* _DEV_SYSMON_SYSMONVAR_H_ */ 173