1*0f9e9ec2Sjsg /* $OpenBSD: dsdt.h,v 1.82 2024/05/13 01:15:50 jsg Exp $ */ 213174b7eSmarco /* 313174b7eSmarco * Copyright (c) 2005 Marco Peereboom <marco@openbsd.org> 413174b7eSmarco * 513174b7eSmarco * Permission to use, copy, modify, and distribute this software for any 613174b7eSmarco * purpose with or without fee is hereby granted, provided that the above 713174b7eSmarco * copyright notice and this permission notice appear in all copies. 813174b7eSmarco * 913174b7eSmarco * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 1013174b7eSmarco * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 1113174b7eSmarco * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 1213174b7eSmarco * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 1313174b7eSmarco * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 1413174b7eSmarco * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 1513174b7eSmarco * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 1613174b7eSmarco */ 1713174b7eSmarco 1813174b7eSmarco #ifndef __DEV_ACPI_DSDT_H__ 1913174b7eSmarco #define __DEV_ACPI_DSDT_H__ 2013174b7eSmarco 218c9695e2Sderaadt struct aml_scope { 2230a01ff4Sjordan struct acpi_softc *sc; 2330a01ff4Sjordan uint8_t *pos; 249173bfc9Sjordan uint8_t *start; 2530a01ff4Sjordan uint8_t *end; 2630a01ff4Sjordan struct aml_node *node; 2730a01ff4Sjordan struct aml_scope *parent; 2830a01ff4Sjordan struct aml_value *locals; 2930a01ff4Sjordan struct aml_value *args; 3041b774f7Sjordan struct aml_value *retv; 3141b774f7Sjordan int type; 329173bfc9Sjordan int depth; 3330a01ff4Sjordan }; 3430a01ff4Sjordan 358c5ac228Sjordan 368c9695e2Sderaadt struct aml_opcode { 37d2eaebe9Skettenis uint32_t opcode; 38cda98319Smarco const char *mnem; 39cda98319Smarco const char *args; 40cda98319Smarco }; 41cda98319Smarco 42d2eaebe9Skettenis const char *aml_eisaid(uint32_t); 43048d6e7cSjordan const char *aml_mnem(int, uint8_t *); 446ab98c39Sjordan int64_t aml_val2int(struct aml_value *); 456ab98c39Sjordan struct aml_node *aml_searchname(struct aml_node *, const void *); 463b455a03Smarco struct aml_node *aml_searchrel(struct aml_node *, const void *); 47abe2aaccSpatrick const char *aml_getname(const char *); 486ab98c39Sjordan 49ce151df9Sjordan struct aml_value *aml_getstack(struct aml_scope *, int); 506ab98c39Sjordan struct aml_value *aml_allocvalue(int, int64_t, const void *); 516ab98c39Sjordan void aml_freevalue(struct aml_value *); 52be66194eSjordan void aml_notify(struct aml_node *, int); 530e505e73Spirofti void aml_showvalue(struct aml_value *); 54cbabac85Smarco 5538a28d41Skettenis void aml_find_node(struct aml_node *, const char *, 567979ca52Sweingart int (*)(struct aml_node *, void *), void *); 574fd5269dSkettenis int acpi_parse_aml(struct acpi_softc *, const char *, 584fd5269dSkettenis u_int8_t *, uint32_t); 59cbabac85Smarco void aml_register_notify(struct aml_node *, const char *, 6025ae5cf1Smarco int (*)(struct aml_node *, int, void *), void *, 6125ae5cf1Smarco int); 624c89a905Skettenis void aml_register_regionspace(struct aml_node *, int, void *, 634c89a905Skettenis int (*)(void *, int, uint64_t, int, uint64_t *)); 64cda98319Smarco 65145fcb70Sjordan int aml_evalnode(struct acpi_softc *, struct aml_node *, 668c9695e2Sderaadt int, struct aml_value *, struct aml_value *); 67b88433beSderaadt int aml_node_setval(struct acpi_softc *, struct aml_node *, 68b88433beSderaadt int64_t); 69145fcb70Sjordan int aml_evalname(struct acpi_softc *, struct aml_node *, 706ab98c39Sjordan const char *, int, struct aml_value *, 716ab98c39Sjordan struct aml_value *); 721c450453Sjordan int aml_evalinteger(struct acpi_softc *, struct aml_node *, 731c450453Sjordan const char *, int, struct aml_value *, int64_t *); 746ab98c39Sjordan 756ab98c39Sjordan void aml_create_defaultobjects(void); 766ab98c39Sjordan 7750850125Sjordan const char *aml_nodename(struct aml_node *); 7850850125Sjordan 794c97265cSjordan #define SRT_IRQ2 0x22 804c97265cSjordan #define SRT_IRQ3 0x23 814c97265cSjordan #define SRT_DMA 0x2A 824c97265cSjordan #define SRT_STARTDEP0 0x30 834c97265cSjordan #define SRT_STARTDEP1 0x31 844c97265cSjordan #define SRT_ENDDEP 0x38 854c97265cSjordan #define SRT_IOPORT 0x47 864c97265cSjordan #define SRT_FIXEDPORT 0x4B 871774e241Sguenther #define SRT_ENDTAG 0x79 884c97265cSjordan 8950850125Sjordan #define SR_IRQ 0x04 9050850125Sjordan #define SR_DMA 0x05 9150850125Sjordan #define SR_STARTDEP 0x06 9250850125Sjordan #define SR_ENDDEP 0x07 9350850125Sjordan #define SR_IOPORT 0x08 9450850125Sjordan #define SR_FIXEDPORT 0x09 9550850125Sjordan #define SR_ENDTAG 0x0F 9624c8c90cSguenther /* byte zero of small resources combines the tag above a length [1..7] */ 9724c8c90cSguenther #define SR_TAG(tag,len) ((tag << 3) + (len)) 9850850125Sjordan 9961694a6dSkettenis #define LR_MEM24 0x81 10050850125Sjordan #define LR_GENREGISTER 0x82 10161694a6dSkettenis #define LR_MEM32 0x85 10261694a6dSkettenis #define LR_MEM32FIXED 0x86 10350850125Sjordan #define LR_DWORD 0x87 10450850125Sjordan #define LR_WORD 0x88 10550850125Sjordan #define LR_EXTIRQ 0x89 10650850125Sjordan #define LR_QWORD 0x8A 1074e611cb5Skettenis #define LR_GPIO 0x8C 10893923c0fSkettenis #define LR_SERBUS 0x8E 10950850125Sjordan 11038dc4a85Sjordan #define __amlflagbit(v,s,l) 1118c9695e2Sderaadt union acpi_resource { 11250850125Sjordan struct { 11350850125Sjordan uint8_t typecode; 11450850125Sjordan uint16_t length; 11550850125Sjordan } __packed hdr; 11650850125Sjordan 11750850125Sjordan /* Small resource structures 11850850125Sjordan * format of typecode is: tttttlll, t = type, l = length 11950850125Sjordan */ 12050850125Sjordan struct { 12150850125Sjordan uint8_t typecode; 12250850125Sjordan uint16_t irq_mask; 12338dc4a85Sjordan uint8_t irq_flags; 1244c97265cSjordan #define SR_IRQ_SHR (1L << 4) 1254c97265cSjordan #define SR_IRQ_POLARITY (1L << 3) 1264c97265cSjordan #define SR_IRQ_MODE (1L << 0) 12750850125Sjordan } __packed sr_irq; 12850850125Sjordan struct { 12950850125Sjordan uint8_t typecode; 13038dc4a85Sjordan uint8_t channel; 13138dc4a85Sjordan uint8_t flags; 1324c97265cSjordan #define SR_DMA_TYP_MASK 0x3 1334c97265cSjordan #define SR_DMA_TYP_SHIFT 5 1344c97265cSjordan #define SR_DMA_BM (1L << 2) 1354c97265cSjordan #define SR_DMA_SIZE_MASK 0x3 1364c97265cSjordan #define SR_DMA_SIZE_SHIFT 0 13750850125Sjordan } __packed sr_dma; 13850850125Sjordan struct { 13950850125Sjordan uint8_t typecode; 14038dc4a85Sjordan uint8_t flags; 1414c97265cSjordan #define SR_IOPORT_DEC (1L << 0) 14238dc4a85Sjordan uint16_t _min; 14338dc4a85Sjordan uint16_t _max; 14438dc4a85Sjordan uint8_t _aln; 14538dc4a85Sjordan uint8_t _len; 14650850125Sjordan } __packed sr_ioport; 14750850125Sjordan struct { 14850850125Sjordan uint8_t typecode; 14938dc4a85Sjordan uint16_t _bas; 15038dc4a85Sjordan uint8_t _len; 15150850125Sjordan } __packed sr_fioport; 15250850125Sjordan 15350850125Sjordan /* Large resource structures */ 15450850125Sjordan struct { 15550850125Sjordan uint8_t typecode; 15650850125Sjordan uint16_t length; 15738dc4a85Sjordan uint8_t _info; 15838dc4a85Sjordan uint16_t _min; 15938dc4a85Sjordan uint16_t _max; 16038dc4a85Sjordan uint16_t _aln; 16138dc4a85Sjordan uint16_t _len; 16250850125Sjordan } __packed lr_m24; 16350850125Sjordan struct { 16450850125Sjordan uint8_t typecode; 16550850125Sjordan uint16_t length; 16638dc4a85Sjordan uint8_t _info; 16738dc4a85Sjordan uint32_t _min; 16838dc4a85Sjordan uint32_t _max; 16938dc4a85Sjordan uint32_t _aln; 17038dc4a85Sjordan uint32_t _len; 17150850125Sjordan } __packed lr_m32; 17250850125Sjordan struct { 17350850125Sjordan uint8_t typecode; 17450850125Sjordan uint16_t length; 17561694a6dSkettenis uint8_t _info; 17661694a6dSkettenis uint32_t _bas; 17761694a6dSkettenis uint32_t _len; 17861694a6dSkettenis } __packed lr_m32fixed; 17961694a6dSkettenis struct { 18061694a6dSkettenis uint8_t typecode; 18161694a6dSkettenis uint16_t length; 18250850125Sjordan uint8_t flags; 1838d56ca36Skettenis #define LR_EXTIRQ_SHR (1L << 3) 1848d56ca36Skettenis #define LR_EXTIRQ_POLARITY (1L << 2) 1858d56ca36Skettenis #define LR_EXTIRQ_MODE (1L << 1) 18650850125Sjordan uint8_t irq_count; 18750850125Sjordan uint32_t irq[1]; 18850850125Sjordan } __packed lr_extirq; 18938dc4a85Sjordan struct { 19038dc4a85Sjordan uint8_t typecode; 19138dc4a85Sjordan uint16_t length; 19238dc4a85Sjordan uint8_t type; 19381657d7aSkettenis #define LR_TYPE_MEMORY 0 19481657d7aSkettenis #define LR_TYPE_IO 1 19581657d7aSkettenis #define LR_TYPE_BUS 2 19638dc4a85Sjordan uint8_t flags; 19738dc4a85Sjordan uint8_t tflags; 19881657d7aSkettenis #define LR_MEMORY_TTP (1L << 5) 19981657d7aSkettenis #define LR_IO_TTP (1L << 4) 20038dc4a85Sjordan uint16_t _gra; 20138dc4a85Sjordan uint16_t _min; 20238dc4a85Sjordan uint16_t _max; 20338dc4a85Sjordan uint16_t _tra; 20438dc4a85Sjordan uint16_t _len; 20538dc4a85Sjordan uint8_t src_index; 20638dc4a85Sjordan char src[1]; 20738dc4a85Sjordan } __packed lr_word; 20838dc4a85Sjordan struct { 20938dc4a85Sjordan uint8_t typecode; 21038dc4a85Sjordan uint16_t length; 21138dc4a85Sjordan uint8_t type; 21238dc4a85Sjordan uint8_t flags; 21338dc4a85Sjordan uint8_t tflags; 21438dc4a85Sjordan uint32_t _gra; 21538dc4a85Sjordan uint32_t _min; 21638dc4a85Sjordan uint32_t _max; 21738dc4a85Sjordan uint32_t _tra; 21838dc4a85Sjordan uint32_t _len; 21938dc4a85Sjordan uint8_t src_index; 22038dc4a85Sjordan char src[1]; 22138dc4a85Sjordan } __packed lr_dword; 22238dc4a85Sjordan struct { 22338dc4a85Sjordan uint8_t typecode; 22438dc4a85Sjordan uint16_t length; 22538dc4a85Sjordan uint8_t type; 22638dc4a85Sjordan uint8_t flags; 22738dc4a85Sjordan uint8_t tflags; 22838dc4a85Sjordan uint64_t _gra; 22938dc4a85Sjordan uint64_t _min; 23038dc4a85Sjordan uint64_t _max; 23138dc4a85Sjordan uint64_t _tra; 23238dc4a85Sjordan uint64_t _len; 23338dc4a85Sjordan uint8_t src_index; 23438dc4a85Sjordan char src[1]; 23538dc4a85Sjordan } __packed lr_qword; 23693923c0fSkettenis struct { 23793923c0fSkettenis uint8_t typecode; 23893923c0fSkettenis uint16_t length; 23993923c0fSkettenis uint8_t revid; 2404e611cb5Skettenis uint8_t type; 2414e611cb5Skettenis #define LR_GPIO_INT 0x00 2424e611cb5Skettenis #define LR_GPIO_IO 0x01 2434e611cb5Skettenis uint16_t flags; 2444e611cb5Skettenis uint16_t tflags; 245e0beea88Skettenis #define LR_GPIO_SHR (3L << 3) 246e0beea88Skettenis #define LR_GPIO_POLARITY (3L << 1) 247e0beea88Skettenis #define LR_GPIO_ACTHI (0L << 1) 248e0beea88Skettenis #define LR_GPIO_ACTLO (1L << 1) 249e0beea88Skettenis #define LR_GPIO_ACTBOTH (2L << 1) 250e0beea88Skettenis #define LR_GPIO_MODE (1L << 0) 251b7462092Skettenis #define LR_GPIO_LEVEL (0L << 0) 252b7462092Skettenis #define LR_GPIO_EDGE (1L << 0) 2534e611cb5Skettenis uint8_t _ppi; 2544e611cb5Skettenis uint16_t _drs; 2554e611cb5Skettenis uint16_t _dbt; 2564e611cb5Skettenis uint16_t pin_off; 2574e611cb5Skettenis uint8_t residx; 2584e611cb5Skettenis uint16_t res_off; 2594e611cb5Skettenis uint16_t vd_off; 2604e611cb5Skettenis uint16_t vd_len; 2614e611cb5Skettenis } __packed lr_gpio; 2624e611cb5Skettenis struct { 2634e611cb5Skettenis uint8_t typecode; 2644e611cb5Skettenis uint16_t length; 2654e611cb5Skettenis uint8_t revid; 26693923c0fSkettenis uint8_t residx; 26793923c0fSkettenis uint8_t type; 26893923c0fSkettenis #define LR_SERBUS_I2C 1 26993923c0fSkettenis uint8_t flags; 27093923c0fSkettenis uint16_t tflags; 27193923c0fSkettenis uint8_t trevid; 27293923c0fSkettenis uint16_t tlength; 27393923c0fSkettenis uint8_t tdata[1]; 27493923c0fSkettenis } __packed lr_serbus; 27593923c0fSkettenis struct { 27693923c0fSkettenis uint8_t typecode; 27793923c0fSkettenis uint16_t length; 27893923c0fSkettenis uint8_t revid; 27993923c0fSkettenis uint8_t residx; 28093923c0fSkettenis uint8_t type; 28193923c0fSkettenis uint8_t flags; 28293923c0fSkettenis uint16_t tflags; 28393923c0fSkettenis uint8_t trevid; 28493923c0fSkettenis uint16_t tlength; 28593923c0fSkettenis uint32_t _spe; 28693923c0fSkettenis uint16_t _adr; 28793923c0fSkettenis uint8_t vdata[1]; 28893923c0fSkettenis } __packed lr_i2cbus; 28938dc4a85Sjordan uint8_t pad[64]; 29050850125Sjordan } __packed; 29150850125Sjordan 29250850125Sjordan #define AML_CRSTYPE(x) ((x)->hdr.typecode & 0x80 ? \ 2938c9695e2Sderaadt (x)->hdr.typecode : (x)->hdr.typecode >> 3) 29450850125Sjordan #define AML_CRSLEN(x) ((x)->hdr.typecode & 0x80 ? \ 29538dc4a85Sjordan 3+(x)->hdr.length : 1+((x)->hdr.typecode & 0x7)) 29650850125Sjordan 29750850125Sjordan int aml_print_resource(union acpi_resource *, void *); 298311c37bcSjordan int aml_parse_resource(struct aml_value *, 299dd9a9f1cSpirofti int (*)(int, union acpi_resource *, void *), 300dd9a9f1cSpirofti void *); 30150850125Sjordan 3026ab98c39Sjordan #define ACPI_E_NOERROR 0x00 3036ab98c39Sjordan #define ACPI_E_BADVALUE 0x01 3046ab98c39Sjordan 3056c53ca5eSjordan #define AML_MAX_ARG 7 3066c53ca5eSjordan #define AML_MAX_LOCAL 8 3076c53ca5eSjordan 30850850125Sjordan #define AML_WALK_PRE 0x00 30950850125Sjordan #define AML_WALK_POST 0x01 3108c9695e2Sderaadt 3118c9695e2Sderaadt void aml_walknodes(struct aml_node *, int, 3128c9695e2Sderaadt int (*)(struct aml_node *, void *), void *); 31350850125Sjordan 31450850125Sjordan void aml_postparse(void); 31550850125Sjordan 316ae59a8a2Sjordan void aml_hashopcodes(void); 317ae59a8a2Sjordan 318226a7f6dSjordan void aml_foreachpkg(struct aml_value *, int, 319226a7f6dSjordan void (*fn)(struct aml_value *, void *), void *); 320226a7f6dSjordan 321e5a592d2Scanacar const char *aml_val_to_string(const struct aml_value *); 322e5a592d2Scanacar 32341b774f7Sjordan void aml_disasm(struct aml_scope *scope, int lvl, 32441b774f7Sjordan void (*dbprintf)(void *, const char *, ...), 32541b774f7Sjordan void *arg); 32607a763f3Sjordan int aml_evalhid(struct aml_node *, struct aml_value *); 32741b774f7Sjordan 3289d9e17ebSkettenis int acpi_walkmem(int, const char *); 3299d9e17ebSkettenis 33041b774f7Sjordan #define aml_get8(p) *(uint8_t *)(p) 33141b774f7Sjordan #define aml_get16(p) *(uint16_t *)(p) 33241b774f7Sjordan #define aml_get32(p) *(uint32_t *)(p) 33341b774f7Sjordan #define aml_get64(p) *(uint64_t *)(p) 33441b774f7Sjordan 3353c1b5b89Sderaadt union amlpci_t { 33607a763f3Sjordan uint64_t addr; 33707a763f3Sjordan struct { 33807a763f3Sjordan uint16_t reg; 33907a763f3Sjordan uint16_t fun; 340d6a1c66eSkettenis uint8_t dev; 341d6a1c66eSkettenis uint8_t bus; 342d6a1c66eSkettenis uint16_t seg; 34307a763f3Sjordan }; 34407a763f3Sjordan }; 3453c1b5b89Sderaadt int aml_rdpciaddr(struct aml_node *pcidev, 3463c1b5b89Sderaadt union amlpci_t *); 34707a763f3Sjordan 3487189b734Sderaadt #ifndef SMALL_KERNEL 3493c1b5b89Sderaadt void acpi_getdevlist(struct acpi_devlist_head *, 3503c1b5b89Sderaadt struct aml_node *, struct aml_value *, int); 3517189b734Sderaadt #endif 352b9a4bb8fSderaadt void aml_notify_dev(const char *, int); 3537189b734Sderaadt 354487d8ee6Sjordan void acpi_freedevlist(struct acpi_devlist_head *); 355487d8ee6Sjordan 356b242f430Spirofti void acpi_glk_enter(void); 357b242f430Spirofti void acpi_glk_leave(void); 358b242f430Spirofti 359dd1b5e45Sjsg /* https://docs.microsoft.com/en-us/windows-hardware/drivers/acpi/winacpi-osi */ 360dd1b5e45Sjsg 361dd1b5e45Sjsg enum acpi_osi { 362dd1b5e45Sjsg OSI_UNKNOWN = -1, 363dd1b5e45Sjsg OSI_WIN_2000, 364dd1b5e45Sjsg OSI_WIN_XP, 365dd1b5e45Sjsg OSI_WIN_2003, 366dd1b5e45Sjsg OSI_WIN_2003_SP1, 367dd1b5e45Sjsg OSI_WIN_XP_SP0, 368dd1b5e45Sjsg OSI_WIN_XP_SP1, 369dd1b5e45Sjsg OSI_WIN_XP_SP2, 370dd1b5e45Sjsg OSI_WIN_XP_SP3, 371dd1b5e45Sjsg OSI_WIN_XP_SP4, 372dd1b5e45Sjsg OSI_WIN_VISTA, 373dd1b5e45Sjsg OSI_WIN_2008, 374dd1b5e45Sjsg OSI_WIN_VISTA_SP1, 375dd1b5e45Sjsg OSI_WIN_VISTA_SP2, 376dd1b5e45Sjsg OSI_WIN_7, 377dd1b5e45Sjsg OSI_WIN_8, 378dd1b5e45Sjsg OSI_WIN_8_1, 379dd1b5e45Sjsg OSI_WIN_10, 380dd1b5e45Sjsg OSI_WIN_10_1607, 381dd1b5e45Sjsg OSI_WIN_10_1703, 382dd1b5e45Sjsg OSI_WIN_10_1709, 383dd1b5e45Sjsg OSI_WIN_10_1803, 384dd1b5e45Sjsg OSI_WIN_10_1809, 385dd1b5e45Sjsg OSI_WIN_10_1903, 386dd1b5e45Sjsg OSI_WIN_10_2004, 38762b2531cSjsg OSI_WIN_11, 38862b2531cSjsg OSI_WIN_11_22H2 389dd1b5e45Sjsg }; 390dd1b5e45Sjsg 391dd1b5e45Sjsg #define AML_VALID_OSI \ 392dd1b5e45Sjsg "Windows 2000", \ 393dd1b5e45Sjsg "Windows 2001", \ 394dd1b5e45Sjsg "Windows 2001.1", \ 395dd1b5e45Sjsg "Windows 2001.1 SP1", \ 396dd1b5e45Sjsg "Windows 2001 SP0", \ 397dd1b5e45Sjsg "Windows 2001 SP1", \ 398dd1b5e45Sjsg "Windows 2001 SP2", \ 399dd1b5e45Sjsg "Windows 2001 SP3", \ 400dd1b5e45Sjsg "Windows 2001 SP4", \ 401dd1b5e45Sjsg "Windows 2006", \ 402dd1b5e45Sjsg "Windows 2006.1", \ 403dd1b5e45Sjsg "Windows 2006 SP1", \ 404dd1b5e45Sjsg "Windows 2006 SP2", \ 405dd1b5e45Sjsg "Windows 2009", \ 406dd1b5e45Sjsg "Windows 2012", \ 407dd1b5e45Sjsg "Windows 2013", \ 408dd1b5e45Sjsg "Windows 2015", \ 409dd1b5e45Sjsg "Windows 2016", \ 410dd1b5e45Sjsg "Windows 2017", \ 411dd1b5e45Sjsg "Windows 2017.2", \ 412dd1b5e45Sjsg "Windows 2018", \ 413dd1b5e45Sjsg "Windows 2018.2", \ 414dd1b5e45Sjsg "Windows 2019", \ 41562b2531cSjsg "Windows 2020", \ 41662b2531cSjsg "Windows 2021", \ 41762b2531cSjsg "Windows 2022" 418dd1b5e45Sjsg 419dd1b5e45Sjsg extern enum acpi_osi acpi_max_osi; /* most recent Win version FW knows */ 420dd1b5e45Sjsg 42113174b7eSmarco #endif /* __DEV_ACPI_DSDT_H__ */ 422