1 /* $OpenBSD: dsdt.h,v 1.78 2020/09/16 11:52:17 jsg Exp $ */ 2 /* 3 * Copyright (c) 2005 Marco Peereboom <marco@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_DSDT_H__ 19 #define __DEV_ACPI_DSDT_H__ 20 21 struct aml_scope { 22 struct acpi_softc *sc; 23 uint8_t *pos; 24 uint8_t *start; 25 uint8_t *end; 26 struct aml_node *node; 27 struct aml_scope *parent; 28 struct aml_value *locals; 29 struct aml_value *args; 30 struct aml_value *retv; 31 int type; 32 int depth; 33 }; 34 35 36 struct aml_opcode { 37 uint32_t opcode; 38 const char *mnem; 39 const char *args; 40 }; 41 42 const char *aml_eisaid(uint32_t); 43 const char *aml_mnem(int, uint8_t *); 44 int64_t aml_val2int(struct aml_value *); 45 struct aml_node *aml_searchname(struct aml_node *, const void *); 46 struct aml_node *aml_searchrel(struct aml_node *, const void *); 47 48 struct aml_value *aml_getstack(struct aml_scope *, int); 49 struct aml_value *aml_allocvalue(int, int64_t, const void *); 50 void aml_freevalue(struct aml_value *); 51 void aml_notify(struct aml_node *, int); 52 void aml_showvalue(struct aml_value *); 53 void aml_walkroot(void); 54 void aml_walktree(struct aml_node *); 55 56 void aml_find_node(struct aml_node *, const char *, 57 int (*)(struct aml_node *, void *), void *); 58 int acpi_parse_aml(struct acpi_softc *, u_int8_t *, 59 uint32_t); 60 void aml_register_notify(struct aml_node *, const char *, 61 int (*)(struct aml_node *, int, void *), void *, 62 int); 63 void aml_register_regionspace(struct aml_node *, int, void *, 64 int (*)(void *, int, uint64_t, int, uint64_t *)); 65 66 int aml_evalnode(struct acpi_softc *, struct aml_node *, 67 int, struct aml_value *, struct aml_value *); 68 int aml_node_setval(struct acpi_softc *, struct aml_node *, 69 int64_t); 70 int aml_evalname(struct acpi_softc *, struct aml_node *, 71 const char *, int, struct aml_value *, 72 struct aml_value *); 73 int aml_evalinteger(struct acpi_softc *, struct aml_node *, 74 const char *, int, struct aml_value *, int64_t *); 75 76 void aml_create_defaultobjects(void); 77 78 const char *aml_nodename(struct aml_node *); 79 80 #define SRT_IRQ2 0x22 81 #define SRT_IRQ3 0x23 82 #define SRT_DMA 0x2A 83 #define SRT_STARTDEP0 0x30 84 #define SRT_STARTDEP1 0x31 85 #define SRT_ENDDEP 0x38 86 #define SRT_IOPORT 0x47 87 #define SRT_FIXEDPORT 0x4B 88 #define SRT_ENDTAG 0x79 89 90 #define SR_IRQ 0x04 91 #define SR_DMA 0x05 92 #define SR_STARTDEP 0x06 93 #define SR_ENDDEP 0x07 94 #define SR_IOPORT 0x08 95 #define SR_FIXEDPORT 0x09 96 #define SR_ENDTAG 0x0F 97 /* byte zero of small resources combines the tag above a length [1..7] */ 98 #define SR_TAG(tag,len) ((tag << 3) + (len)) 99 100 #define LR_MEM24 0x81 101 #define LR_GENREGISTER 0x82 102 #define LR_MEM32 0x85 103 #define LR_MEM32FIXED 0x86 104 #define LR_DWORD 0x87 105 #define LR_WORD 0x88 106 #define LR_EXTIRQ 0x89 107 #define LR_QWORD 0x8A 108 #define LR_GPIO 0x8C 109 #define LR_SERBUS 0x8E 110 111 #define __amlflagbit(v,s,l) 112 union acpi_resource { 113 struct { 114 uint8_t typecode; 115 uint16_t length; 116 } __packed hdr; 117 118 /* Small resource structures 119 * format of typecode is: tttttlll, t = type, l = length 120 */ 121 struct { 122 uint8_t typecode; 123 uint16_t irq_mask; 124 uint8_t irq_flags; 125 #define SR_IRQ_SHR (1L << 4) 126 #define SR_IRQ_POLARITY (1L << 3) 127 #define SR_IRQ_MODE (1L << 0) 128 } __packed sr_irq; 129 struct { 130 uint8_t typecode; 131 uint8_t channel; 132 uint8_t flags; 133 #define SR_DMA_TYP_MASK 0x3 134 #define SR_DMA_TYP_SHIFT 5 135 #define SR_DMA_BM (1L << 2) 136 #define SR_DMA_SIZE_MASK 0x3 137 #define SR_DMA_SIZE_SHIFT 0 138 } __packed sr_dma; 139 struct { 140 uint8_t typecode; 141 uint8_t flags; 142 #define SR_IOPORT_DEC (1L << 0) 143 uint16_t _min; 144 uint16_t _max; 145 uint8_t _aln; 146 uint8_t _len; 147 } __packed sr_ioport; 148 struct { 149 uint8_t typecode; 150 uint16_t _bas; 151 uint8_t _len; 152 } __packed sr_fioport; 153 154 /* Large resource structures */ 155 struct { 156 uint8_t typecode; 157 uint16_t length; 158 uint8_t _info; 159 uint16_t _min; 160 uint16_t _max; 161 uint16_t _aln; 162 uint16_t _len; 163 } __packed lr_m24; 164 struct { 165 uint8_t typecode; 166 uint16_t length; 167 uint8_t _info; 168 uint32_t _min; 169 uint32_t _max; 170 uint32_t _aln; 171 uint32_t _len; 172 } __packed lr_m32; 173 struct { 174 uint8_t typecode; 175 uint16_t length; 176 uint8_t _info; 177 uint32_t _bas; 178 uint32_t _len; 179 } __packed lr_m32fixed; 180 struct { 181 uint8_t typecode; 182 uint16_t length; 183 uint8_t flags; 184 #define LR_EXTIRQ_SHR (1L << 3) 185 #define LR_EXTIRQ_POLARITY (1L << 2) 186 #define LR_EXTIRQ_MODE (1L << 1) 187 uint8_t irq_count; 188 uint32_t irq[1]; 189 } __packed lr_extirq; 190 struct { 191 uint8_t typecode; 192 uint16_t length; 193 uint8_t type; 194 #define LR_TYPE_MEMORY 0 195 #define LR_TYPE_IO 1 196 #define LR_TYPE_BUS 2 197 uint8_t flags; 198 uint8_t tflags; 199 #define LR_MEMORY_TTP (1L << 5) 200 #define LR_IO_TTP (1L << 4) 201 uint16_t _gra; 202 uint16_t _min; 203 uint16_t _max; 204 uint16_t _tra; 205 uint16_t _len; 206 uint8_t src_index; 207 char src[1]; 208 } __packed lr_word; 209 struct { 210 uint8_t typecode; 211 uint16_t length; 212 uint8_t type; 213 uint8_t flags; 214 uint8_t tflags; 215 uint32_t _gra; 216 uint32_t _min; 217 uint32_t _max; 218 uint32_t _tra; 219 uint32_t _len; 220 uint8_t src_index; 221 char src[1]; 222 } __packed lr_dword; 223 struct { 224 uint8_t typecode; 225 uint16_t length; 226 uint8_t type; 227 uint8_t flags; 228 uint8_t tflags; 229 uint64_t _gra; 230 uint64_t _min; 231 uint64_t _max; 232 uint64_t _tra; 233 uint64_t _len; 234 uint8_t src_index; 235 char src[1]; 236 } __packed lr_qword; 237 struct { 238 uint8_t typecode; 239 uint16_t length; 240 uint8_t revid; 241 uint8_t type; 242 #define LR_GPIO_INT 0x00 243 #define LR_GPIO_IO 0x01 244 uint16_t flags; 245 uint16_t tflags; 246 #define LR_GPIO_SHR (3L << 3) 247 #define LR_GPIO_POLARITY (3L << 1) 248 #define LR_GPIO_ACTHI (0L << 1) 249 #define LR_GPIO_ACTLO (1L << 1) 250 #define LR_GPIO_ACTBOTH (2L << 1) 251 #define LR_GPIO_MODE (1L << 0) 252 #define LR_GPIO_LEVEL (0L << 0) 253 #define LR_GPIO_EDGE (1L << 0) 254 uint8_t _ppi; 255 uint16_t _drs; 256 uint16_t _dbt; 257 uint16_t pin_off; 258 uint8_t residx; 259 uint16_t res_off; 260 uint16_t vd_off; 261 uint16_t vd_len; 262 } __packed lr_gpio; 263 struct { 264 uint8_t typecode; 265 uint16_t length; 266 uint8_t revid; 267 uint8_t residx; 268 uint8_t type; 269 #define LR_SERBUS_I2C 1 270 uint8_t flags; 271 uint16_t tflags; 272 uint8_t trevid; 273 uint16_t tlength; 274 uint8_t tdata[1]; 275 } __packed lr_serbus; 276 struct { 277 uint8_t typecode; 278 uint16_t length; 279 uint8_t revid; 280 uint8_t residx; 281 uint8_t type; 282 uint8_t flags; 283 uint16_t tflags; 284 uint8_t trevid; 285 uint16_t tlength; 286 uint32_t _spe; 287 uint16_t _adr; 288 uint8_t vdata[1]; 289 } __packed lr_i2cbus; 290 uint8_t pad[64]; 291 } __packed; 292 293 #define AML_CRSTYPE(x) ((x)->hdr.typecode & 0x80 ? \ 294 (x)->hdr.typecode : (x)->hdr.typecode >> 3) 295 #define AML_CRSLEN(x) ((x)->hdr.typecode & 0x80 ? \ 296 3+(x)->hdr.length : 1+((x)->hdr.typecode & 0x7)) 297 298 int aml_print_resource(union acpi_resource *, void *); 299 int aml_parse_resource(struct aml_value *, 300 int (*)(int, union acpi_resource *, void *), 301 void *); 302 303 #define ACPI_E_NOERROR 0x00 304 #define ACPI_E_BADVALUE 0x01 305 306 #define AML_MAX_ARG 7 307 #define AML_MAX_LOCAL 8 308 309 #define AML_WALK_PRE 0x00 310 #define AML_WALK_POST 0x01 311 312 void aml_walknodes(struct aml_node *, int, 313 int (*)(struct aml_node *, void *), void *); 314 315 void aml_postparse(void); 316 317 void aml_hashopcodes(void); 318 319 void aml_foreachpkg(struct aml_value *, int, 320 void (*fn)(struct aml_value *, void *), void *); 321 322 const char *aml_val_to_string(const struct aml_value *); 323 324 void aml_disasm(struct aml_scope *scope, int lvl, 325 void (*dbprintf)(void *, const char *, ...), 326 void *arg); 327 int aml_getpci(struct aml_node *, int64_t *); 328 int aml_evalhid(struct aml_node *, struct aml_value *); 329 330 int acpi_walkmem(int, const char *); 331 332 #define aml_get8(p) *(uint8_t *)(p) 333 #define aml_get16(p) *(uint16_t *)(p) 334 #define aml_get32(p) *(uint32_t *)(p) 335 #define aml_get64(p) *(uint64_t *)(p) 336 337 union amlpci_t { 338 uint64_t addr; 339 struct { 340 uint16_t reg; 341 uint16_t fun; 342 uint8_t dev; 343 uint8_t bus; 344 uint16_t seg; 345 }; 346 }; 347 int aml_rdpciaddr(struct aml_node *pcidev, 348 union amlpci_t *); 349 350 #ifndef SMALL_KERNEL 351 void acpi_getdevlist(struct acpi_devlist_head *, 352 struct aml_node *, struct aml_value *, int); 353 #endif 354 void aml_notify_dev(const char *, int); 355 356 void acpi_freedevlist(struct acpi_devlist_head *); 357 358 void acpi_glk_enter(void); 359 void acpi_glk_leave(void); 360 361 /* https://docs.microsoft.com/en-us/windows-hardware/drivers/acpi/winacpi-osi */ 362 363 enum acpi_osi { 364 OSI_UNKNOWN = -1, 365 OSI_WIN_2000, 366 OSI_WIN_XP, 367 OSI_WIN_2003, 368 OSI_WIN_2003_SP1, 369 OSI_WIN_XP_SP0, 370 OSI_WIN_XP_SP1, 371 OSI_WIN_XP_SP2, 372 OSI_WIN_XP_SP3, 373 OSI_WIN_XP_SP4, 374 OSI_WIN_VISTA, 375 OSI_WIN_2008, 376 OSI_WIN_VISTA_SP1, 377 OSI_WIN_VISTA_SP2, 378 OSI_WIN_7, 379 OSI_WIN_8, 380 OSI_WIN_8_1, 381 OSI_WIN_10, 382 OSI_WIN_10_1607, 383 OSI_WIN_10_1703, 384 OSI_WIN_10_1709, 385 OSI_WIN_10_1803, 386 OSI_WIN_10_1809, 387 OSI_WIN_10_1903, 388 OSI_WIN_10_2004, 389 }; 390 391 #define AML_VALID_OSI \ 392 "Windows 2000", \ 393 "Windows 2001", \ 394 "Windows 2001.1", \ 395 "Windows 2001.1 SP1", \ 396 "Windows 2001 SP0", \ 397 "Windows 2001 SP1", \ 398 "Windows 2001 SP2", \ 399 "Windows 2001 SP3", \ 400 "Windows 2001 SP4", \ 401 "Windows 2006", \ 402 "Windows 2006.1", \ 403 "Windows 2006 SP1", \ 404 "Windows 2006 SP2", \ 405 "Windows 2009", \ 406 "Windows 2012", \ 407 "Windows 2013", \ 408 "Windows 2015", \ 409 "Windows 2016", \ 410 "Windows 2017", \ 411 "Windows 2017.2", \ 412 "Windows 2018", \ 413 "Windows 2018.2", \ 414 "Windows 2019", \ 415 "Windows 2020" 416 417 extern enum acpi_osi acpi_max_osi; /* most recent Win version FW knows */ 418 419 #endif /* __DEV_ACPI_DSDT_H__ */ 420