#ifndef __DEV_ACPI_DSDT_H__
#define __DEV_ACPI_DSDT_H__
struct aml_scope {
struct acpi_softc *sc;
uint8_t *pos;
uint8_t *start;
uint8_t *end;
struct aml_node *node;
struct aml_scope *parent;
struct aml_value *locals;
struct aml_value *args;
struct aml_value *retv;
int type;
int depth;
};
struct aml_opcode {
uint32_t opcode;
const char *mnem;
const char *args;
};
const char *aml_eisaid(uint32_t);
const char *aml_mnem(int, uint8_t *);
int64_t aml_val2int(struct aml_value *);
struct aml_node *aml_searchname(struct aml_node *, const void *);
struct aml_node *aml_searchrel(struct aml_node *, const void *);
const char *aml_getname(const char *);
struct aml_value *aml_getstack(struct aml_scope *, int);
struct aml_value *aml_allocvalue(int, int64_t, const void *);
void aml_freevalue(struct aml_value *);
void aml_notify(struct aml_node *, int);
void aml_showvalue(struct aml_value *);
void aml_find_node(struct aml_node *, const char *,
int (*)(struct aml_node *, void *), void *);
int acpi_parse_aml(struct acpi_softc *, const char *,
u_int8_t *, uint32_t);
void aml_register_notify(struct aml_node *, const char *,
int (*)(struct aml_node *, int, void *), void *,
int);
void aml_register_regionspace(struct aml_node *, int, void *,
int (*)(void *, int, uint64_t, int, uint64_t *));
int aml_evalnode(struct acpi_softc *, struct aml_node *,
int, struct aml_value *, struct aml_value *);
int aml_node_setval(struct acpi_softc *, struct aml_node *,
int64_t);
int aml_evalname(struct acpi_softc *, struct aml_node *,
const char *, int, struct aml_value *,
struct aml_value *);
int aml_evalinteger(struct acpi_softc *, struct aml_node *,
const char *, int, struct aml_value *, int64_t *);
void aml_create_defaultobjects(void);
const char *aml_nodename(struct aml_node *);
#define SRT_IRQ2 0x22
#define SRT_IRQ3 0x23
#define SRT_DMA 0x2A
#define SRT_STARTDEP0 0x30
#define SRT_STARTDEP1 0x31
#define SRT_ENDDEP 0x38
#define SRT_IOPORT 0x47
#define SRT_FIXEDPORT 0x4B
#define SRT_ENDTAG 0x79
#define SR_IRQ 0x04
#define SR_DMA 0x05
#define SR_STARTDEP 0x06
#define SR_ENDDEP 0x07
#define SR_IOPORT 0x08
#define SR_FIXEDPORT 0x09
#define SR_ENDTAG 0x0F
#define SR_TAG(tag,len) ((tag << 3) + (len))
#define LR_MEM24 0x81
#define LR_GENREGISTER 0x82
#define LR_MEM32 0x85
#define LR_MEM32FIXED 0x86
#define LR_DWORD 0x87
#define LR_WORD 0x88
#define LR_EXTIRQ 0x89
#define LR_QWORD 0x8A
#define LR_GPIO 0x8C
#define LR_SERBUS 0x8E
#define __amlflagbit(v,s,l)
union acpi_resource {
struct {
uint8_t typecode;
uint16_t length;
} __packed hdr;
struct {
uint8_t typecode;
uint16_t irq_mask;
uint8_t irq_flags;
#define SR_IRQ_SHR (1L << 4)
#define SR_IRQ_POLARITY (1L << 3)
#define SR_IRQ_MODE (1L << 0)
} __packed sr_irq;
struct {
uint8_t typecode;
uint8_t channel;
uint8_t flags;
#define SR_DMA_TYP_MASK 0x3
#define SR_DMA_TYP_SHIFT 5
#define SR_DMA_BM (1L << 2)
#define SR_DMA_SIZE_MASK 0x3
#define SR_DMA_SIZE_SHIFT 0
} __packed sr_dma;
struct {
uint8_t typecode;
uint8_t flags;
#define SR_IOPORT_DEC (1L << 0)
uint16_t _min;
uint16_t _max;
uint8_t _aln;
uint8_t _len;
} __packed sr_ioport;
struct {
uint8_t typecode;
uint16_t _bas;
uint8_t _len;
} __packed sr_fioport;
struct {
uint8_t typecode;
uint16_t length;
uint8_t _info;
uint16_t _min;
uint16_t _max;
uint16_t _aln;
uint16_t _len;
} __packed lr_m24;
struct {
uint8_t typecode;
uint16_t length;
uint8_t _info;
uint32_t _min;
uint32_t _max;
uint32_t _aln;
uint32_t _len;
} __packed lr_m32;
struct {
uint8_t typecode;
uint16_t length;
uint8_t _info;
uint32_t _bas;
uint32_t _len;
} __packed lr_m32fixed;
struct {
uint8_t typecode;
uint16_t length;
uint8_t flags;
#define LR_EXTIRQ_SHR (1L << 3)
#define LR_EXTIRQ_POLARITY (1L << 2)
#define LR_EXTIRQ_MODE (1L << 1)
uint8_t irq_count;
uint32_t irq[1];
} __packed lr_extirq;
struct {
uint8_t typecode;
uint16_t length;
uint8_t type;
#define LR_TYPE_MEMORY 0
#define LR_TYPE_IO 1
#define LR_TYPE_BUS 2
uint8_t flags;
uint8_t tflags;
#define LR_MEMORY_TTP (1L << 5)
#define LR_IO_TTP (1L << 4)
uint16_t _gra;
uint16_t _min;
uint16_t _max;
uint16_t _tra;
uint16_t _len;
uint8_t src_index;
char src[1];
} __packed lr_word;
struct {
uint8_t typecode;
uint16_t length;
uint8_t type;
uint8_t flags;
uint8_t tflags;
uint32_t _gra;
uint32_t _min;
uint32_t _max;
uint32_t _tra;
uint32_t _len;
uint8_t src_index;
char src[1];
} __packed lr_dword;
struct {
uint8_t typecode;
uint16_t length;
uint8_t type;
uint8_t flags;
uint8_t tflags;
uint64_t _gra;
uint64_t _min;
uint64_t _max;
uint64_t _tra;
uint64_t _len;
uint8_t src_index;
char src[1];
} __packed lr_qword;
struct {
uint8_t typecode;
uint16_t length;
uint8_t revid;
uint8_t type;
#define LR_GPIO_INT 0x00
#define LR_GPIO_IO 0x01
uint16_t flags;
uint16_t tflags;
#define LR_GPIO_SHR (3L << 3)
#define LR_GPIO_POLARITY (3L << 1)
#define LR_GPIO_ACTHI (0L << 1)
#define LR_GPIO_ACTLO (1L << 1)
#define LR_GPIO_ACTBOTH (2L << 1)
#define LR_GPIO_MODE (1L << 0)
#define LR_GPIO_LEVEL (0L << 0)
#define LR_GPIO_EDGE (1L << 0)
uint8_t _ppi;
uint16_t _drs;
uint16_t _dbt;
uint16_t pin_off;
uint8_t residx;
uint16_t res_off;
uint16_t vd_off;
uint16_t vd_len;
} __packed lr_gpio;
struct {
uint8_t typecode;
uint16_t length;
uint8_t revid;
uint8_t residx;
uint8_t type;
#define LR_SERBUS_I2C 1
uint8_t flags;
uint16_t tflags;
uint8_t trevid;
uint16_t tlength;
uint8_t tdata[1];
} __packed lr_serbus;
struct {
uint8_t typecode;
uint16_t length;
uint8_t revid;
uint8_t residx;
uint8_t type;
uint8_t flags;
uint16_t tflags;
uint8_t trevid;
uint16_t tlength;
uint32_t _spe;
uint16_t _adr;
uint8_t vdata[1];
} __packed lr_i2cbus;
uint8_t pad[64];
} __packed;
#define AML_CRSTYPE(x) ((x)->hdr.typecode & 0x80 ? \
(x)->hdr.typecode : (x)->hdr.typecode >> 3)
#define AML_CRSLEN(x) ((x)->hdr.typecode & 0x80 ? \
3+(x)->hdr.length : 1+((x)->hdr.typecode & 0x7))
int aml_print_resource(union acpi_resource *, void *);
int aml_parse_resource(struct aml_value *,
int (*)(int, union acpi_resource *, void *),
void *);
#define ACPI_E_NOERROR 0x00
#define ACPI_E_BADVALUE 0x01
#define AML_MAX_ARG 7
#define AML_MAX_LOCAL 8
#define AML_WALK_PRE 0x00
#define AML_WALK_POST 0x01
void aml_walknodes(struct aml_node *, int,
int (*)(struct aml_node *, void *), void *);
void aml_postparse(void);
void aml_hashopcodes(void);
void aml_foreachpkg(struct aml_value *, int,
void (*fn)(struct aml_value *, void *), void *);
const char *aml_val_to_string(const struct aml_value *);
void aml_disasm(struct aml_scope *scope, int lvl,
void (*dbprintf)(void *, const char *, ...),
void *arg);
int aml_evalhid(struct aml_node *, struct aml_value *);
int acpi_walkmem(int, const char *);
#define aml_get8(p) *(uint8_t *)(p)
#define aml_get16(p) *(uint16_t *)(p)
#define aml_get32(p) *(uint32_t *)(p)
#define aml_get64(p) *(uint64_t *)(p)
union amlpci_t {
uint64_t addr;
struct {
uint16_t reg;
uint16_t fun;
uint8_t dev;
uint8_t bus;
uint16_t seg;
};
};
int aml_rdpciaddr(struct aml_node *pcidev,
union amlpci_t *);
#ifndef SMALL_KERNEL
void acpi_getdevlist(struct acpi_devlist_head *,
struct aml_node *, struct aml_value *, int);
#endif
void aml_notify_dev(const char *, int);
void acpi_freedevlist(struct acpi_devlist_head *);
void acpi_glk_enter(void);
void acpi_glk_leave(void);
enum acpi_osi {
OSI_UNKNOWN = -1,
OSI_WIN_2000,
OSI_WIN_XP,
OSI_WIN_2003,
OSI_WIN_2003_SP1,
OSI_WIN_XP_SP0,
OSI_WIN_XP_SP1,
OSI_WIN_XP_SP2,
OSI_WIN_XP_SP3,
OSI_WIN_XP_SP4,
OSI_WIN_VISTA,
OSI_WIN_2008,
OSI_WIN_VISTA_SP1,
OSI_WIN_VISTA_SP2,
OSI_WIN_7,
OSI_WIN_8,
OSI_WIN_8_1,
OSI_WIN_10,
OSI_WIN_10_1607,
OSI_WIN_10_1703,
OSI_WIN_10_1709,
OSI_WIN_10_1803,
OSI_WIN_10_1809,
OSI_WIN_10_1903,
OSI_WIN_10_2004,
OSI_WIN_11,
OSI_WIN_11_22H2
};
#define AML_VALID_OSI \
"Windows 2000", \
"Windows 2001", \
"Windows 2001.1", \
"Windows 2001.1 SP1", \
"Windows 2001 SP0", \
"Windows 2001 SP1", \
"Windows 2001 SP2", \
"Windows 2001 SP3", \
"Windows 2001 SP4", \
"Windows 2006", \
"Windows 2006.1", \
"Windows 2006 SP1", \
"Windows 2006 SP2", \
"Windows 2009", \
"Windows 2012", \
"Windows 2013", \
"Windows 2015", \
"Windows 2016", \
"Windows 2017", \
"Windows 2017.2", \
"Windows 2018", \
"Windows 2018.2", \
"Windows 2019", \
"Windows 2020", \
"Windows 2021", \
"Windows 2022"
extern enum acpi_osi acpi_max_osi;
#endif