summaryrefslogtreecommitdiff
path: root/include/acpi.h
blob: 1c68ef47b1da6814a6af04fc494aa8abee7a9775 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#ifndef _ACPI_H_
#define _ACPI_H_

#include <stdint.h>
#include <stddef.h>

struct rsdp {
 char signature[8];
 uint8_t checksum;
 char oemid[6];
 uint8_t revision;
 uint32_t rsdt_address;
} __attribute__((packed));

struct xsdp {
 char signature[8];
 uint8_t checksum;
 char oemid[6];
 uint8_t revision;
 uint32_t rsdt_address; // deprecated since version 2.0

 uint32_t length;
 uint64_t xsdt_address;
 uint8_t extended_checksum;
 uint8_t reserved[3];
} __attribute__((packed));

struct acpi_sdt_header {
	char signature[4];
	uint32_t len;
	uint8_t rev;
	uint8_t checksum;
	char oemid[6];
	char oem_tableid[8];
	uint32_t oem_revision;
	uint32_t creatorid;
	uint32_t creator_rev;
} __attribute__((packed));

struct rsdt {
	struct acpi_sdt_header header;
	uint32_t sdt_pointers[];
} __attribute__((packed));

struct xsdt {
	struct acpi_sdt_header header;
	uint64_t sdt_pointers[];
} __attribute__((packed));

struct generic_address {
	uint8_t address_space;
	uint8_t bid_width;
	uint8_t bit_offset;
	uint8_t access_size;
	uint64_t address;
} __attribute__((packed));

struct fadt {
	struct acpi_sdt_header header;
	uint32_t firmware_ctrl;
	uint32_t dsdt;

	uint8_t reserved;

	uint8_t prevered_power_management_profile;
	uint16_t sci_interrupt;
	uint32_t smi_command_port;
	uint8_t acpi_enable;
	uint8_t acpi_disable;
	uint8_t s4_bios_req;
	uint8_t pstate_control;

	uint32_t pm1a_event_block;
	uint32_t pm1b_event_block;

	uint32_t pm1a_control_block;
	uint32_t pm1b_control_block;

	uint32_t pm2_control_block;

	uint32_t pm_timer_block;

	uint32_t gpe0_block;
	uint32_t gpe1_block;

	uint8_t pm1_event_length;
	uint8_t pm1_control_length;
	uint8_t pm2_control_length;
	uint8_t pm_timer_length;

	uint8_t gpe0_length;
	uint8_t gpe1_length;
	uint8_t gpe1_base;

	uint8_t cstate_control;
	
	uint16_t worst_c2_latency;
	uint16_t worst_c3_latency;

	uint16_t flush_size;
	uint16_t flush_stride;

	uint8_t duty_offset;
	uint8_t duty_width;

	uint8_t day_alarm;
	uint8_t month_alarm;
	uint8_t century;

	uint16_t boot_arch_flags;

	uint8_t reserved_2;
	uint32_t flags;

	struct generic_address reset_reg;

	uint8_t reset_valued;
	uint8_t reserved_3[3];

	uint64_t x_firmware_control;
	uint64_t x_dsdt;

	struct generic_address x_pm1a_event_block;
	struct generic_address x_pm1b_event_block;
	struct generic_address x_pm1a_control_block;
	struct generic_address x_pm1b_control_block;
	struct generic_address x_pm2_control_block;
	struct generic_address x_pm_timer_block;
	struct generic_address x_gpe0_block;
	struct generic_address x_gpe1_block;
} __attribute__((packed));

struct xsdp *find_rsdp();
struct fadt *find_facp(struct xsdt *root_sdt);
void print_rsdp(const struct rsdp *rsdp);

static inline struct xsdt *get_rsdt(struct xsdp *rsdp) {
	if (rsdp == NULL || rsdp->revision == 0)
		return NULL;
	return (struct xsdt *) rsdp->xsdt_address;
}

#endif