xref: /freebsd/sys/dev/acpica/acpiio.h (revision bc49842769bd3657a5a1e7de878c0ce8780a2f86)
1 /*-
2  * Copyright (c) 1999 Takanori Watanabe <takawata@jp.freebsd.org>
3  * Copyright (c) 1999 Mitsuru IWASAKI <iwasaki@FreeBSD.org>
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25  * SUCH DAMAGE.
26  */
27 
28 #ifndef _ACPIIO_H_
29 #define _ACPIIO_H_
30 
31 #ifndef _KERNEL
32 #include <stdbool.h>
33 #endif
34 
35 /*
36  * Core ACPI subsystem ioctls
37  */
38 #define ACPIIO_SETSLPSTATE	_IOW('P', 3, int) /* DEPRECATED */
39 
40 /* Request S1-5 sleep state. User is notified and then sleep proceeds. */
41 #define ACPIIO_REQSLPSTATE	_IOW('P', 4, int)
42 
43 /* Allow suspend to continue (0) or abort it (errno). */
44 #define ACPIIO_ACKSLPSTATE	_IOW('P', 5, int)
45 
46 struct acpi_battinfo {
47     int	 cap;				/* percent */
48     int	 min;				/* remaining time (in minutes) */
49     int	 state;				/* battery state */
50     int	 rate;				/* emptying rate */
51 };
52 
53 /*
54  * Battery Information object.  Note that this object is deprecated in
55  * ACPI 4.0
56  */
57 #define ACPI_CMBAT_MAXSTRLEN 32
58 struct acpi_bif {
59     uint32_t units;			/* Power Unit (mW or mA). */
60 #define ACPI_BIF_UNITS_MW	0	/* Capacity in mWh, rate in mW. */
61 #define ACPI_BIF_UNITS_MA	1	/* Capacity in mAh, rate in mA. */
62     uint32_t dcap;			/* Design Capacity */
63     uint32_t lfcap;			/* Last Full capacity */
64     uint32_t btech;			/* Battery Technology */
65     uint32_t dvol;			/* Design voltage (mV) */
66     uint32_t wcap;			/* WARN capacity */
67     uint32_t lcap;			/* Low capacity */
68     uint32_t gra1;			/* Granularity 1 (Warn to Low) */
69     uint32_t gra2;			/* Granularity 2 (Full to Warn) */
70     char model[ACPI_CMBAT_MAXSTRLEN];	/* model identifier */
71     char serial[ACPI_CMBAT_MAXSTRLEN];	/* Serial number */
72     char type[ACPI_CMBAT_MAXSTRLEN];	/* Type */
73     char oeminfo[ACPI_CMBAT_MAXSTRLEN];	/* OEM information */
74 };
75 
76 /*
77  * Members in acpi_bix are reordered so that the first part is compatible
78  * with acpi_bif.
79  */
80 struct acpi_bix {
81 /* _BIF-compatible */
82     uint32_t units;			/* Power Unit (mW or mA). */
83 #define ACPI_BIX_UNITS_MW	0	/* Capacity in mWh, rate in mW. */
84 #define ACPI_BIX_UNITS_MA	1	/* Capacity in mAh, rate in mA. */
85     uint32_t dcap;			/* Design Capacity */
86     uint32_t lfcap;			/* Last Full capacity */
87     uint32_t btech;			/* Battery Technology */
88     uint32_t dvol;			/* Design voltage (mV) */
89     uint32_t wcap;			/* WARN capacity */
90     uint32_t lcap;			/* Low capacity */
91     uint32_t gra1;			/* Granularity 1 (Warn to Low) */
92     uint32_t gra2;			/* Granularity 2 (Full to Warn) */
93     char model[ACPI_CMBAT_MAXSTRLEN];	/* model identifier */
94     char serial[ACPI_CMBAT_MAXSTRLEN];	/* Serial number */
95     char type[ACPI_CMBAT_MAXSTRLEN];	/* Type */
96     char oeminfo[ACPI_CMBAT_MAXSTRLEN];	/* OEM information */
97     /* ACPI 4.0 or later */
98     uint16_t rev;			/* Revision */
99 #define	ACPI_BIX_REV_0		0	/* ACPI 4.0 _BIX */
100 #define	ACPI_BIX_REV_1		1	/* ACPI 6.0 _BIX */
101 #define	ACPI_BIX_REV_BIF	0xffff	/* _BIF */
102 #define	ACPI_BIX_REV_MIN_CHECK(x, min)	\
103 	(((min) == ACPI_BIX_REV_BIF) ? ((x) == ACPI_BIX_REV_BIF) : \
104 	    (((x) == ACPI_BIX_REV_BIF) ? 0 : ((x) >= (min))))
105     uint32_t cycles;			/* Cycle Count */
106     uint32_t accuracy;			/* Measurement Accuracy */
107     uint32_t stmax;			/* Max Sampling Time */
108     uint32_t stmin;			/* Min Sampling Time */
109     uint32_t aimax;			/* Max Average Interval */
110     uint32_t aimin;			/* Min Average Interval */
111     /* ACPI 6.0 or later */
112     uint32_t scap;			/* Battery Swapping Capability */
113 #define	ACPI_BIX_SCAP_NO	0x00000000
114 #define	ACPI_BIX_SCAP_COLD	0x00000001
115 #define	ACPI_BIX_SCAP_HOT	0x00000010
116     uint8_t bix_reserved[58];		/* padding */
117 };
118 
119 #if 0
120 /* acpi_bix in the original order just for reference */
121 struct acpi_bix {
122     uint16_t rev;			/* Revision */
123     uint32_t units;			/* Power Unit (mW or mA). */
124     uint32_t dcap;			/* Design Capacity */
125     uint32_t lfcap;			/* Last Full capacity */
126     uint32_t btech;			/* Battery Technology */
127     uint32_t dvol;			/* Design voltage (mV) */
128     uint32_t wcap;			/* Design Capacity of Warning */
129     uint32_t lcap;			/* Design Capacity of Low */
130     uint32_t cycles;			/* Cycle Count */
131     uint32_t accuracy;			/* Measurement Accuracy */
132     uint32_t stmax;			/* Max Sampling Time */
133     uint32_t stmin;			/* Min Sampling Time */
134     uint32_t aimax;			/* Max Average Interval */
135     uint32_t aimin;			/* Min Average Interval */
136     uint32_t gra1;			/* Granularity 1 (Warn to Low) */
137     uint32_t gra2;			/* Granularity 2 (Full to Warn) */
138     char model[ACPI_CMBAT_MAXSTRLEN];	/* model identifier */
139     char serial[ACPI_CMBAT_MAXSTRLEN];	/* Serial number */
140     char type[ACPI_CMBAT_MAXSTRLEN];	/* Type */
141     char oeminfo[ACPI_CMBAT_MAXSTRLEN];	/* OEM information */
142     uint32_t scap;			/* Battery Swapping Capability */
143 };
144 #endif
145 
146 struct acpi_bst {
147     uint32_t state;			/* Battery State */
148     uint32_t rate;			/* Present Rate */
149     uint32_t cap;			/* Remaining Capacity */
150     uint32_t volt;			/* Present Voltage */
151 };
152 
153 /*
154  * Note that the following definitions represent status bits for internal
155  * driver state.  The first three of them (charging, discharging and critical)
156  * conveninetly conform to ACPI specification of status returned by _BST
157  * method.  Other definitions (not present, etc) are synthetic.
158  * Also note that according to the specification the charging and discharging
159  * status bits must not be set at the same time.
160  */
161 #define ACPI_BATT_STAT_DISCHARG		0x0001
162 #define ACPI_BATT_STAT_CHARGING		0x0002
163 #define ACPI_BATT_STAT_CRITICAL		0x0004
164 #define ACPI_BATT_STAT_INVALID					\
165     (ACPI_BATT_STAT_DISCHARG | ACPI_BATT_STAT_CHARGING)
166 #define ACPI_BATT_STAT_BST_MASK					\
167     (ACPI_BATT_STAT_INVALID | ACPI_BATT_STAT_CRITICAL)
168 #define ACPI_BATT_STAT_NOT_PRESENT	ACPI_BATT_STAT_BST_MASK
169 
170 /* For backward compatibility */
171 union acpi_battery_ioctl_arg_v1 {
172     int			 unit;	/* Device unit or ACPI_BATTERY_ALL_UNITS. */
173 
174     struct acpi_battinfo battinfo;
175 
176     struct acpi_bif	 bif;
177     struct acpi_bst	 bst;
178 };
179 union acpi_battery_ioctl_arg {
180     int			 unit;	/* Device unit or ACPI_BATTERY_ALL_UNITS. */
181 
182     struct acpi_battinfo battinfo;
183 
184     struct acpi_bix	 bix;
185     struct acpi_bif	 bif;
186     struct acpi_bst	 bst;
187 };
188 
189 #define ACPI_BATTERY_ALL_UNITS 	(-1)
190 #define ACPI_BATT_UNKNOWN 	0xffffffff /* _BST or _BI[FX] value unknown. */
191 
192 /* Common battery ioctls */
193 #define ACPIIO_BATT_GET_UNITS	  _IOR('B', 0x01, int)
194 #define ACPIIO_BATT_GET_BATTINFO _IOWR('B', 0x03, union acpi_battery_ioctl_arg)
195 #define ACPIIO_BATT_GET_BATTINFO_V1 _IOWR('B', 0x03, union acpi_battery_ioctl_arg_v1)
196 #define ACPIIO_BATT_GET_BIF	 _IOWR('B', 0x10, union acpi_battery_ioctl_arg_v1)
197 #define ACPIIO_BATT_GET_BIX	 _IOWR('B', 0x10, union acpi_battery_ioctl_arg)
198 #define ACPIIO_BATT_GET_BST	 _IOWR('B', 0x11, union acpi_battery_ioctl_arg)
199 #define ACPIIO_BATT_GET_BST_V1	 _IOWR('B', 0x11, union acpi_battery_ioctl_arg_v1)
200 
201 /* Control Method battery ioctls (deprecated) */
202 #define ACPIIO_CMBAT_GET_BIF	 ACPIIO_BATT_GET_BIF
203 #define ACPIIO_CMBAT_GET_BST	 ACPIIO_BATT_GET_BST
204 
205 /* Get AC adapter status. */
206 #define ACPIIO_ACAD_GET_STATUS	  _IOR('A', 1, int)
207 
208 /* Error injection commands. */
209 
210 /* Flags in ACPI_EINJ_ERROR_TYPE_WITH_ADDR.Flags */
211 #define	ACPI_EINJ_APICID_VALID		0x00000001
212 #define	ACPI_EINJ_MEMADDRESS_VALID	0x00000002
213 #define	ACPI_EINJ_PCIE_VALID		0x00000004
214 
215 struct acpi_einj_info {
216 	uint32_t	error_type;	/* Value from GET_ERROR_TYPE. */
217 
218 	uint32_t	vendor_length;
219 
220 	/* SET_ERROR_TYPE_WITH_ADDRESS supported. */
221 	bool		error_address;
222 };
223 
224 struct acpi_einj_vendor_info {
225 	void		*buf;
226 	uint32_t	len;
227 };
228 
229 struct acpi_einj_error {
230 	uint32_t	error_type;
231 
232 	uint32_t	address_flags;	/* ACPI_EINJ_*_VALID */
233 	uint32_t	apic_id;
234 	uint64_t	memory_address;
235 	uint64_t	memory_range;
236 	uint32_t	pcie_id;
237 };
238 
239 #define	ACPIIO_EINJ_GET_INFO	_IOR('E', 1, struct acpi_einj_info)
240 #define	ACPIIO_EINJ_GET_VENDOR	_IOW('E', 2, struct acpi_einj_vendor_info)
241 #define	ACPIIO_EINJ_SET_ERROR	_IOW('E', 3, struct acpi_einj_error)
242 
243 #ifdef _KERNEL
244 typedef int	(*acpi_ioctl_fn)(u_long cmd, caddr_t addr, void *arg);
245 extern int	acpi_register_ioctl(u_long cmd, acpi_ioctl_fn fn, void *arg);
246 extern void	acpi_deregister_ioctl(u_long cmd, acpi_ioctl_fn fn);
247 extern void	acpi_deregister_ioctls(acpi_ioctl_fn fn);
248 #endif
249 
250 #endif /* !_ACPIIO_H_ */
251