1 /* $NetBSD: power.h,v 1.20 2015/01/06 15:39:54 bouyer Exp $ */ 2 3 /* 4 * Copyright (c) 2003 Wasabi Systems, Inc. 5 * All rights reserved. 6 * 7 * Written by Jason R. Thorpe for Wasabi Systems, Inc. 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 for the NetBSD Project by 20 * Wasabi Systems, Inc. 21 * 4. The name of Wasabi Systems, Inc. may not be used to endorse 22 * or promote products derived from this software without specific prior 23 * written permission. 24 * 25 * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND 26 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 27 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 28 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL WASABI SYSTEMS, INC 29 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 30 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 31 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 32 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 33 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 34 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 35 * POSSIBILITY OF SUCH DAMAGE. 36 */ 37 38 /* 39 * Definitions for power management. 40 */ 41 42 #ifndef _SYS_POWER_H_ 43 #define _SYS_POWER_H_ 44 45 #include <sys/ioccom.h> 46 47 #ifndef _KERNEL 48 #include <stdint.h> 49 #endif 50 51 /* 52 * Power Switches: 53 * 54 * Power switches are devices on the system that are used by the system 55 * operator to cause certain types of power management events to happen. 56 * This may be the closing of a laptop lid, the pressing of a power button, 57 * or some other type of user-initiated hardware event. 58 * 59 * We define the following types of power switches: 60 * 61 * Power button This is the "on/off" button on a system, 62 * or another button which provides a similar 63 * function. If there is no power management 64 * daemon present, an event on this button will 65 * cause a semi-graceful shutdown of the system 66 * to occur. This kind of button doesn't keep 67 * state; we only know (care) if an event occurs. 68 * 69 * Reset button This is the "reset" button on a system, or 70 * another button which provides a similar 71 * function. If there is no power management 72 * daemon present, an event on this button will 73 * cause a semi-graceful reboot of the system 74 * to occur. This kind of button doesn't keep 75 * state; we only know (care) if an event occurs. 76 * 77 * Sleep button This is a button which is dedicated to a 78 * "sleep" function. This kind of button doesn't 79 * keep state; we only know (care) if an event 80 * occurs. 81 * 82 * Lid switch This is e.g. the lid of a laptop. This kind 83 * of switch has state. We know if it is open 84 * or closed. 85 * 86 * Radio switch This is e.g. the switch of the transmitter 87 * of a wifi interface. We know if it is 88 * on or off. 89 * 90 */ 91 92 #define PSWITCH_TYPE_POWER 0 /* power button */ 93 #define PSWITCH_TYPE_SLEEP 1 /* sleep button */ 94 #define PSWITCH_TYPE_LID 2 /* lid switch */ 95 #define PSWITCH_TYPE_RESET 3 /* reset button */ 96 #define PSWITCH_TYPE_ACADAPTER 4 /* AC adapter presence */ 97 #define PSWITCH_TYPE_HOTKEY 5 /* hotkey button */ 98 #define PSWITCH_HK_DISPLAY_CYCLE "display-cycle" 99 #define PSWITCH_HK_LOCK_SCREEN "lock-screen" 100 #define PSWITCH_HK_BATTERY_INFO "battery-info" 101 #define PSWITCH_HK_EJECT_BUTTON "eject-button" 102 #define PSWITCH_HK_ZOOM_BUTTON "zoom-button" 103 #define PSWITCH_HK_VENDOR_BUTTON "vendor-button" 104 #ifndef THINKPAD_NORMAL_HOTKEYS 105 #define PSWITCH_HK_FNF1_BUTTON "fnf1-button" 106 #define PSWITCH_HK_WIRELESS_BUTTON "wireless-button" 107 #define PSWITCH_HK_WWAN_BUTTON "wWAN-button" 108 #define PSWITCH_HK_POINTER_BUTTON "pointer-button" 109 #define PSWITCH_HK_FNF10_BUTTON "fnf10-button" 110 #define PSWITCH_HK_FNF11_BUTTON "fnf11-button" 111 #define PSWITCH_HK_BRIGHTNESS_UP "brightness-up" 112 #define PSWITCH_HK_BRIGHTNESS_DOWN "brightness-down" 113 #define PSWITCH_HK_THINKLIGHT "thinklight" 114 #define PSWITCH_HK_VOLUME_UP "volume-up" 115 #define PSWITCH_HK_VOLUME_DOWN "volume-down" 116 #define PSWITCH_HK_VOLUME_MUTE "volume-mute" 117 #endif /* THINKPAD_NORMAL_HOTKEYS */ 118 #define PSWITCH_TYPE_RADIO 6 /* radio switch */ 119 120 #define PSWITCH_EVENT_PRESSED 0 /* button pressed, lid closed, AC off */ 121 #define PSWITCH_EVENT_RELEASED 1 /* button released, lid open, AC on */ 122 123 /* 124 * This structure describes the state of a power switch. 125 */ 126 struct pswitch_state { 127 char psws_name[16]; /* power switch name */ 128 int32_t psws_type; /* type of switch (qualifier) */ 129 int32_t psws_state; /* state of the switch/event */ 130 }; 131 132 /* 133 * envsys(4) events: 134 * 135 * envsys events are sent by the sysmon envsys framework when 136 * a warning or critical condition happens in a sensor. 137 * 138 * We define the folowing types of envsys events: 139 * 140 * sensor temperature To handle temperature sensors. 141 * 142 * sensor voltage To handle voltage sensors (AC/DC). 143 * 144 * sensor power To handle power sensors (W/Ampere). 145 * 146 * sensor resistance To handle resistance sensors (Ohms). 147 * 148 * sensor battery To handle battery sensors (Ah/Wh). 149 * 150 * sensor fan To handle fan sensors. 151 * 152 * sensor drive To handle drive sensors. 153 * 154 * sensor indicator To handle indicator/integer sensors. 155 */ 156 157 #define PENVSYS_TYPE_TEMP 10 158 #define PENVSYS_TYPE_VOLTAGE 11 159 #define PENVSYS_TYPE_POWER 12 160 #define PENVSYS_TYPE_RESISTANCE 13 161 #define PENVSYS_TYPE_BATTERY 14 162 #define PENVSYS_TYPE_FAN 15 163 #define PENVSYS_TYPE_DRIVE 16 164 #define PENVSYS_TYPE_INDICATOR 17 165 166 /* 167 * The following events apply for temperatures, power, resistance, 168 * voltages, battery and fan sensors: 169 * 170 * PENVSYS_EVENT_CRITICAL A critical limit. 171 * 172 * PENVSYS_EVENT_CRITOVER A critical over limit. 173 * 174 * PENVSYS_EVENT_CRITUNDER A critical under limit. 175 * 176 * PENVSYS_EVENT_WARNOVER A warning under limit. 177 * 178 * PENVSYS_EVENT_WARNUNDER A warning over limit. 179 * 180 * The folowing event applies to all sensors, when the state is 181 * valid or the warning or critical limit is not valid anymore: 182 * 183 * PENVSYS_EVENT_NORMAL Normal state in the sensor. 184 */ 185 186 #define PENVSYS_EVENT_NORMAL 90 187 #define PENVSYS_EVENT_CRITICAL 100 188 #define PENVSYS_EVENT_CRITOVER 110 189 #define PENVSYS_EVENT_CRITUNDER 120 190 #define PENVSYS_EVENT_WARNOVER 130 191 #define PENVSYS_EVENT_WARNUNDER 140 192 193 /* 194 * The following events apply for battery sensors: 195 * 196 * PENVSYS_EVENT_BATT_CRIT User critical capacity. 197 * 198 * PENVSYS_EVENT_BATT_WARN User warning capacity. 199 * 200 * PENVSYS_EVENT_BATT_HIGH User high capacity. 201 * 202 * PENVSYS_EVENT_BATT_MAX User maximum capacity. 203 * 204 * PENVSYS_EVENT_LOW_POWER AC Adapter is OFF and all batteries 205 * are discharged. 206 */ 207 208 #define PENVSYS_EVENT_BATT_CRIT 170 209 #define PENVSYS_EVENT_BATT_WARN 175 210 #define PENVSYS_EVENT_BATT_HIGH 177 211 #define PENVSYS_EVENT_BATT_MAX 178 212 #define PENVSYS_EVENT_LOW_POWER 180 213 214 /* 215 * The following event apply for battery state and drive sensors: 216 * 217 * PENVSYS_EVENT_STATE_CHANGED State has changed. 218 * 219 */ 220 #define PENVSYS_EVENT_STATE_CHANGED 190 221 222 /* 223 * The following events are used internally to associate multiple 224 * external states with a single event monitor 225 */ 226 #define PENVSYS_EVENT_LIMITS 200 227 #define PENVSYS_EVENT_CAPACITY 210 228 229 /* 230 * The following pseudo-event is used to force refreshing of a 231 * sensor that provides rnd(4) entropy, even if the sensor is not 232 * otherwise being monitored. 233 */ 234 #define PENVSYS_EVENT_NULL 220 235 236 /* 237 * This structure defines the properties of an envsys event. 238 */ 239 struct penvsys_state { 240 char pes_dvname[16]; /* device name */ 241 char pes_sensname[32]; /* sensor name */ 242 char pes_statedesc[64]; /* sensor state description */ 243 int32_t pes_type; /* envsys power type */ 244 }; 245 246 /* 247 * Power management event messages: 248 * 249 * We ensure that a message is always exactly 32 bytes long, so that 250 * userland doesn't need to issue multiple reads to get a single event. 251 */ 252 #define POWER_EVENT_MSG_SIZE 32 253 254 #define POWER_EVENT_SWITCH_STATE_CHANGE 0 255 #define POWER_EVENT_ENVSYS_STATE_CHANGE 1 256 257 typedef struct power_event { 258 int32_t pev_type; /* power event type */ 259 union { 260 int32_t _pev_d_space[(POWER_EVENT_MSG_SIZE / 261 sizeof(int32_t)) - 1]; 262 263 /* 264 * This field is used for: 265 * 266 * POWER_EVENT_SWITCH_STATE_CHANGE 267 */ 268 struct pswitch_state _pev_d_switch; 269 } _pev_data; 270 } power_event_t; 271 272 #define pev_switch _pev_data._pev_d_switch 273 274 #define POWER_EVENT_RECVDICT _IOWR('P', 1, struct plistref) 275 276 /* 277 * POWER_IOC_GET_TYPE: 278 * 279 * Get the power management back-end type. 280 */ 281 struct power_type { 282 char power_type[32]; 283 }; 284 #define POWER_IOC_GET_TYPE _IOR('P', 0, struct power_type) 285 #define POWER_IOC_GET_TYPE_WITH_LOSSAGE _IOR('P', 0, sizeof(struct power_type)) 286 287 #endif /* _SYS_POWER_H_ */ 288