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 */
126struct 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 */
239struct 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
257typedef 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 */
281struct 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