xref: /openbsd/sys/dev/acpi/amltypes.h (revision 15328e98)
1 /* $OpenBSD: amltypes.h,v 1.49 2022/09/12 17:42:31 kettenis Exp $ */
2 /*
3  * Copyright (c) 2005 Jordan Hargrave <jordan@openbsd.org>
4  *
5  * Permission to use, copy, modify, and distribute this software for any
6  * purpose with or without fee is hereby granted, provided that the above
7  * copyright notice and this permission notice appear in all copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16  */
17 
18 #ifndef __DEV_ACPI_AMLTYPES_H__
19 #define __DEV_ACPI_AMLTYPES_H__
20 
21 /* AML Opcodes */
22 #define AMLOP_ZERO		0x00
23 #define AMLOP_ONE		0x01
24 #define AMLOP_ALIAS		0x06
25 #define AMLOP_NAME		0x08
26 #define AMLOP_BYTEPREFIX	0x0A
27 #define AMLOP_WORDPREFIX	0x0B
28 #define AMLOP_DWORDPREFIX	0x0C
29 #define AMLOP_STRINGPREFIX	0x0D
30 #define AMLOP_QWORDPREFIX	0x0E
31 #define AMLOP_SCOPE		0x10
32 #define AMLOP_BUFFER		0x11
33 #define AMLOP_PACKAGE		0x12
34 #define AMLOP_VARPACKAGE	0x13
35 #define AMLOP_METHOD		0x14
36 #define AMLOP_DUALNAMEPREFIX	0x2E
37 #define AMLOP_MULTINAMEPREFIX	0x2F
38 #define AMLOP_EXTPREFIX		0x5B
39 #define AMLOP_MUTEX		0x5B01
40 #define AMLOP_EVENT		0x5B02
41 #define AMLOP_CONDREFOF		0x5B12
42 #define AMLOP_CREATEFIELD	0x5B13
43 #define AMLOP_LOADTABLE		0x5B1F
44 #define AMLOP_LOAD		0x5B20
45 #define AMLOP_STALL		0x5B21
46 #define AMLOP_SLEEP		0x5B22
47 #define AMLOP_ACQUIRE		0x5B23
48 #define AMLOP_SIGNAL		0x5B24
49 #define AMLOP_WAIT		0x5B25
50 #define AMLOP_RESET		0x5B26
51 #define AMLOP_RELEASE		0x5B27
52 #define AMLOP_FROMBCD		0x5B28
53 #define AMLOP_TOBCD		0x5B29
54 #define AMLOP_UNLOAD		0x5B2A
55 #define AMLOP_REVISION		0x5B30
56 #define AMLOP_DEBUG		0x5B31
57 #define AMLOP_FATAL		0x5B32
58 #define AMLOP_TIMER		0x5B33
59 #define AMLOP_OPREGION		0x5B80
60 #define AMLOP_FIELD		0x5B81
61 #define AMLOP_DEVICE		0x5B82
62 #define AMLOP_PROCESSOR		0x5B83
63 #define AMLOP_POWERRSRC		0x5B84
64 #define AMLOP_THERMALZONE	0x5B85
65 #define AMLOP_INDEXFIELD	0x5B86
66 #define AMLOP_BANKFIELD		0x5B87
67 #define AMLOP_DATAREGION	0x5B88
68 #define AMLOP_ROOTCHAR		0x5C
69 #define AMLOP_PARENTPREFIX	0x5E
70 #define AMLOP_NAMECHAR		0x5F
71 #define AMLOP_LOCAL0		0x60
72 #define AMLOP_LOCAL1		0x61
73 #define AMLOP_LOCAL2		0x62
74 #define AMLOP_LOCAL3		0x63
75 #define AMLOP_LOCAL4		0x64
76 #define AMLOP_LOCAL5		0x65
77 #define AMLOP_LOCAL6		0x66
78 #define AMLOP_LOCAL7		0x67
79 #define AMLOP_ARG0		0x68
80 #define AMLOP_ARG1		0x69
81 #define AMLOP_ARG2		0x6A
82 #define AMLOP_ARG3		0x6B
83 #define AMLOP_ARG4		0x6C
84 #define AMLOP_ARG5		0x6D
85 #define AMLOP_ARG6		0x6E
86 #define AMLOP_STORE		0x70
87 #define AMLOP_REFOF		0x71
88 #define AMLOP_ADD		0x72
89 #define AMLOP_CONCAT		0x73
90 #define AMLOP_SUBTRACT		0x74
91 #define AMLOP_INCREMENT		0x75
92 #define AMLOP_DECREMENT		0x76
93 #define AMLOP_MULTIPLY		0x77
94 #define AMLOP_DIVIDE		0x78
95 #define AMLOP_SHL		0x79
96 #define AMLOP_SHR		0x7A
97 #define AMLOP_AND		0x7B
98 #define AMLOP_NAND		0x7C
99 #define AMLOP_OR		0x7D
100 #define AMLOP_NOR		0x7E
101 #define AMLOP_XOR		0x7F
102 #define AMLOP_NOT		0x80
103 #define AMLOP_FINDSETLEFTBIT	0x81
104 #define AMLOP_FINDSETRIGHTBIT	0x82
105 #define AMLOP_DEREFOF		0x83
106 #define AMLOP_CONCATRES		0x84
107 #define AMLOP_MOD		0x85
108 #define AMLOP_NOTIFY		0x86
109 #define AMLOP_SIZEOF		0x87
110 #define AMLOP_INDEX		0x88
111 #define AMLOP_MATCH		0x89
112 #define AMLOP_CREATEDWORDFIELD	0x8A
113 #define AMLOP_CREATEWORDFIELD	0x8B
114 #define AMLOP_CREATEBYTEFIELD	0x8C
115 #define AMLOP_CREATEBITFIELD	0x8D
116 #define AMLOP_OBJECTTYPE	0x8E
117 #define AMLOP_CREATEQWORDFIELD	0x8F
118 #define AMLOP_LAND		0x90
119 #define AMLOP_LOR		0x91
120 #define AMLOP_LNOT		0x92
121 #define AMLOP_LNOTEQUAL		0x9293
122 #define AMLOP_LLESSEQUAL	0x9294
123 #define AMLOP_LGREATEREQUAL	0x9295
124 #define AMLOP_LEQUAL		0x93
125 #define AMLOP_LGREATER		0x94
126 #define AMLOP_LLESS		0x95
127 #define AMLOP_TOBUFFER		0x96
128 #define AMLOP_TODECSTRING	0x97
129 #define AMLOP_TOHEXSTRING	0x98
130 #define AMLOP_TOINTEGER		0x99
131 #define AMLOP_TOSTRING		0x9C
132 #define AMLOP_COPYOBJECT	0x9D
133 #define AMLOP_MID		0x9E
134 #define AMLOP_CONTINUE		0x9F
135 #define AMLOP_IF		0xA0
136 #define AMLOP_ELSE		0xA1
137 #define AMLOP_WHILE		0xA2
138 #define AMLOP_NOP		0xA3
139 #define AMLOP_RETURN		0xA4
140 #define AMLOP_BREAK		0xA5
141 #define AMLOP_BREAKPOINT	0xCC
142 #define AMLOP_ONES		0xFF
143 
144 #define AMLOP_FIELDUNIT		0xFE00
145 #define AML_ANYINT		0xFF00
146 
147 /*
148  * Comparison types for Match()
149  *
150  *  true,==,<=,<,>=,>
151  */
152 #define AML_MATCH_TR		0
153 #define AML_MATCH_EQ		1
154 #define AML_MATCH_LE		2
155 #define AML_MATCH_LT		3
156 #define AML_MATCH_GE		4
157 #define AML_MATCH_GT		5
158 
159 /* Defined types for ObjectType() */
160 enum aml_objecttype {
161 	AML_OBJTYPE_UNINITIALIZED = 0,
162 	AML_OBJTYPE_INTEGER,
163 	AML_OBJTYPE_STRING,
164 	AML_OBJTYPE_BUFFER,
165 	AML_OBJTYPE_PACKAGE,
166 	AML_OBJTYPE_FIELDUNIT,
167 	AML_OBJTYPE_DEVICE,
168 	AML_OBJTYPE_EVENT,
169 	AML_OBJTYPE_METHOD,
170 	AML_OBJTYPE_MUTEX,
171 	AML_OBJTYPE_OPREGION,
172 	AML_OBJTYPE_POWERRSRC,
173 	AML_OBJTYPE_PROCESSOR,
174 	AML_OBJTYPE_THERMZONE,
175 	AML_OBJTYPE_BUFFERFIELD,
176 	AML_OBJTYPE_DDBHANDLE,
177 	AML_OBJTYPE_DEBUGOBJ,
178 
179 	AML_OBJTYPE_NAMEREF = 0x100,
180 	AML_OBJTYPE_OBJREF,
181 	AML_OBJTYPE_SCOPE,
182 	AML_OBJTYPE_NOTARGET,
183 	AML_OBJTYPE_HEXSTRING,
184 	AML_OBJTYPE_DECSTRING,
185 };
186 
187 /* AML Opcode Arguments */
188 #define AML_ARG_INTEGER		'i'
189 #define AML_ARG_BYTE		'b'
190 #define AML_ARG_WORD		'w'
191 #define AML_ARG_DWORD		'd'
192 #define AML_ARG_QWORD		'q'
193 #define AML_ARG_IMPBYTE		'!'
194 #define AML_ARG_OBJLEN		'p'
195 #define AML_ARG_STRING		'a'
196 #define AML_ARG_BYTELIST	'B'
197 #define AML_ARG_REVISION	'R'
198 
199 #define AML_ARG_METHOD		'M'
200 #define AML_ARG_NAMESTRING	'N'
201 #define AML_ARG_NAMEREF		'n'
202 #define AML_ARG_FIELDLIST	'F'
203 #define AML_ARG_FLAG		'f'
204 
205 #define AML_ARG_DATAOBJLIST	'O'
206 #define AML_ARG_DATAOBJ		'o'
207 
208 #define AML_ARG_SIMPLENAME	's'
209 #define AML_ARG_SUPERNAME	'S'
210 
211 #define AML_ARG_TERMOBJLIST	'T'
212 #define AML_ARG_TERMOBJ		't'
213 
214 #define AML_ARG_IFELSE          'I'
215 #define AML_ARG_BUFFER          'B'
216 #define AML_ARG_SEARCHNAME      'n'
217 #define AML_ARG_CREATENAME      'N'
218 #define AML_ARG_STKARG          'A'
219 #define AML_ARG_STKLOCAL        'L'
220 #define AML_ARG_DEBUG           'D'
221 #define AML_ARG_CONST           'c'
222 #define AML_ARG_TARGET          'r'
223 
224 #define AML_METHOD_ARGCOUNT(v)	 (((v) >> 0) & 0x7)
225 #define AML_METHOD_SERIALIZED(v) (((v) >> 3) & 0x1)
226 #define AML_METHOD_SYNCLEVEL(v)	 (((v) >> 4) & 0xF)
227 
228 #define AML_FIELD_ACCESSMASK	0x0F
229 #define AML_FIELD_SETATTR(f,t,a) (((f) & 0xF0) | ((t) & 0xF) | ((a)<<8))
230 #define AML_FIELD_ACCESS(v)	(((v) >> 0) & 0xF)
231 # define AML_FIELD_ANYACC	0x0
232 # define AML_FIELD_BYTEACC	0x1
233 # define AML_FIELD_WORDACC	0x2
234 # define AML_FIELD_DWORDACC	0x3
235 # define AML_FIELD_QWORDACC	0x4
236 # define AML_FIELD_BUFFERACC	0x5
237 #define AML_FIELD_LOCK(v)	(((v) >> 4) & 0x1)
238 # define AML_FIELD_LOCK_OFF	0x0
239 # define AML_FIELD_LOCK_ON	0x1
240 #define AML_FIELD_UPDATE(v)	(((v) >> 5) & 0x3)
241 # define AML_FIELD_PRESERVE	0x0
242 # define AML_FIELD_WRITEASONES	0x1
243 # define AML_FIELD_WRITEASZEROES 0x2
244 #define AML_FIELD_ATTR(v)	((v) >> 8)
245 #define AML_FIELD_RESERVED	0x00
246 /* XXX fix this name */
247 #define AML_FIELD_ATTR__		0x01
248 
249 struct aml_scope;
250 struct aml_node;
251 
252 struct aml_waitq {
253 	struct aml_scope          *scope;
254 	SIMPLEQ_ENTRY(aml_waitq)   link;
255 };
256 SIMPLEQ_HEAD(aml_waitq_head, aml_waitq);
257 
258 /* AML Object Value */
259 struct aml_value {
260 	int	type;
261 	int	length;
262 	int	refcnt;
263 	int	stack;
264 	struct aml_node *node;
265 	union {
266 		int64_t		vinteger;
267 		char		*vstring;
268 		uint8_t		*vbuffer;
269 		struct aml_value **vpackage;
270 		struct {
271 			uint8_t		iospace;
272 			uint64_t	iobase;
273 			uint32_t	iolen;
274 			int		flag;
275 		} vopregion;
276 		struct {
277 			int		flags;
278 			uint8_t		*start;
279 			uint8_t		*end;
280 			struct aml_value *(*fneval)(struct aml_scope *, struct aml_value *);
281 			uint8_t	        *base;
282 		} vmethod;
283 		struct {
284 			uint16_t	 type;
285 			uint16_t	 flags;
286 			uint32_t	 bitpos;
287 			uint32_t	 bitlen;
288 			struct aml_value *ref1;
289 			struct aml_value *ref2;
290 			int		 ref3;
291 		} vfield;
292 		struct {
293 			uint8_t		proc_id;
294 			uint32_t	proc_addr;
295 			uint8_t		proc_len;
296 		} vprocessor;
297 		struct {
298 			int		type;
299 			int		index;
300 			struct aml_value *ref;
301 		} vobjref;
302 		struct {
303 			uint8_t		pwr_level;
304 			uint16_t	pwr_order;
305 		} vpowerrsrc;
306 		struct acpi_mutex	*vmutex;
307 		struct {
308 			uint8_t	         *name;
309 			struct aml_node  *node;
310 		} vnameref;
311 		struct {
312 			int               synclvl;
313 			int               savelvl;
314 			int               count;
315 			char              ownername[5];
316 			struct aml_scope *owner;
317 			struct aml_waitq_head    waiters;
318 		} Vmutex;
319 		struct {
320 			int               state;
321 			struct aml_waitq_head    waiters;
322 		} Vevent;
323 	} _;
324 };
325 
326 #define v_nameref		_.vbuffer
327 #define v_objref		_.vobjref
328 #define v_integer		_.vinteger
329 #define v_string		_.vstring
330 #define v_buffer		_.vbuffer
331 #define v_package		_.vpackage
332 #define v_field			_.vfield
333 #define v_opregion		_.vopregion
334 #define v_method		_.vmethod
335 #define v_processor		_.vprocessor
336 #define v_powerrsrc		_.vpowerrsrc
337 #define v_mutex			_.vmutex
338 #define v_mtx                   _.Vmutex
339 #define v_evt                   _.Vevent
340 
341 #define xaml_intval(v)		((v)->v_integer)
342 #define aml_strlen(v)		((v)->length)
343 #define aml_strval(v)		((v)->v_string ? (v)->v_string : "bad string")
344 #define aml_buflen(v)		((v)->length)
345 #define aml_bufval(v)		((v)->v_buffer)
346 #define aml_pkglen(v)		((v)->length)
347 #define aml_pkgval(v,i)		(&(v)->v_package[(i)])
348 
349 struct acpi_pci {
350 	TAILQ_ENTRY(acpi_pci)		next;
351 
352 	struct aml_node			*node;
353 	struct device			*device;
354 
355 	int				sub;
356 	int				seg;
357 	int				bus;
358 	int				dev;
359 	int				fun;
360 
361 	int				_s3d;
362 	int				_s3w;
363 	int				_s4d;
364 	int				_s4w;
365 };
366 
367 struct acpi_gpio {
368 	void	*cookie;
369 	int	(*read_pin)(void *, int);
370 	void	(*write_pin)(void *, int, int);
371 	void	(*intr_establish)(void *, int, int, int (*)(void *), void *);
372 	void	(*intr_enable)(void *, int);
373 	void	(*intr_disable)(void *, int);
374 };
375 
376 struct i2c_controller;
377 
378 struct aml_node {
379 	struct aml_node *parent;
380 
381 	SIMPLEQ_HEAD(,aml_node)	son;
382 	SIMPLEQ_ENTRY(aml_node)	sib;
383 
384 	int		attached;
385 
386 	char		name[5];
387 	uint16_t	opcode;
388 	uint8_t		*start;
389 	uint8_t		*end;
390 
391 	struct aml_value *value;
392 	struct acpi_pci *pci;
393 	struct acpi_gpio *gpio;
394 	struct i2c_controller *i2c;
395 };
396 
397 #define aml_bitmask(n)		(1L << ((n) & 0x7))
398 #define aml_bitpos(n)		((n)&0x7)
399 #define aml_bytepos(n)		((n)>>3)
400 #define aml_bytelen(n)		(((n)+7)>>3)
401 #define aml_bytealigned(x)	!((x)&0x7)
402 
403 #define AML_NO_TIMEOUT		0xffff
404 
405 #endif /* __DEV_ACPI_AMLTYPES_H__ */
406