1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 #ifndef _DEV_ACPI_ACPIVAR_H_
19 #define _DEV_ACPI_ACPIVAR_H_
20
21 #include <sys/timeout.h>
22 #include <sys/rwlock.h>
23
24
25 #ifdef ACPI_DEBUG
26 extern int acpi_debug;
27 #define dprintf(x...) do { if (acpi_debug) printf(x); } while (0)
28 #define dnprintf(n,x...) do { if (acpi_debug > (n)) printf(x); } while (0)
29 #else
30 #define dprintf(x...)
31 #define dnprintf(n,x...)
32 #endif
33
34 extern int acpi_hasprocfvs;
35
36 struct klist;
37 struct acpiec_softc;
38
39 struct acpi_attach_args {
40 char *aaa_name;
41 bus_space_tag_t aaa_iot;
42 bus_space_tag_t aaa_memt;
43 void *aaa_table;
44 paddr_t aaa_pbase;
45 struct aml_node *aaa_node;
46 const char *aaa_dev;
47 };
48
49 struct acpi_mem_map {
50 vaddr_t baseva;
51 u_int8_t *va;
52 size_t vsize;
53 paddr_t pa;
54 };
55
56 struct acpi_q {
57 SIMPLEQ_ENTRY(acpi_q) q_next;
58 void *q_table;
59 u_int8_t q_data[0];
60 };
61
62 typedef SIMPLEQ_HEAD(, acpi_q) acpi_qhead_t;
63
64 #define ACPIREG_PM1A_STS 0x00
65 #define ACPIREG_PM1A_EN 0x01
66 #define ACPIREG_PM1A_CNT 0x02
67 #define ACPIREG_PM1B_STS 0x03
68 #define ACPIREG_PM1B_EN 0x04
69 #define ACPIREG_PM1B_CNT 0x05
70 #define ACPIREG_PM2_CNT 0x06
71 #define ACPIREG_PM_TMR 0x07
72 #define ACPIREG_GPE0_STS 0x08
73 #define ACPIREG_GPE0_EN 0x09
74 #define ACPIREG_GPE1_STS 0x0A
75 #define ACPIREG_GPE1_EN 0x0B
76 #define ACPIREG_SMICMD 0x0C
77 #define ACPIREG_MAXREG 0x0D
78
79
80 #define ACPIREG_PM1_STS 0x0E
81 #define ACPIREG_PM1_EN 0x0F
82 #define ACPIREG_PM1_CNT 0x10
83 #define ACPIREG_GPE_STS 0x11
84 #define ACPIREG_GPE_EN 0x12
85
86 struct acpi_parsestate
87 {
88 u_int8_t *start;
89 u_int8_t *end;
90 u_int8_t *pos;
91 };
92
93 struct acpi_reg_map {
94 bus_space_handle_t ioh;
95 int addr;
96 int size;
97 const char *name;
98 };
99
100 struct acpi_thread {
101 struct acpi_softc *sc;
102 volatile int running;
103 };
104
105 struct acpi_mutex {
106 struct rwlock amt_lock;
107 #define ACPI_MTX_MAXNAME 5
108 char amt_name[ACPI_MTX_MAXNAME + 3];
109 int amt_ref_count;
110 int amt_timeout;
111 int amt_synclevel;
112 };
113
114 struct gpe_block {
115 int (*handler)(struct acpi_softc *, int, void *);
116 void *arg;
117 int active;
118 };
119
120 struct acpi_ac {
121 struct acpiac_softc *aac_softc;
122 SLIST_ENTRY(acpi_ac) aac_link;
123 };
124
125 SLIST_HEAD(acpi_ac_head, acpi_ac);
126
127 struct acpi_bat {
128 struct acpibat_softc *aba_softc;
129 SLIST_ENTRY(acpi_bat) aba_link;
130 };
131
132 SLIST_HEAD(acpi_bat_head, acpi_bat);
133
134 struct acpi_softc {
135 struct device sc_dev;
136
137 bus_space_tag_t sc_iot;
138 bus_space_tag_t sc_memt;
139 #if 0
140 bus_space_tag_t sc_pcit;
141 bus_space_tag_t sc_smbust;
142 #endif
143
144
145
146
147 struct acpi_fadt *sc_fadt;
148 acpi_qhead_t sc_tables;
149
150
151
152
153 struct acpi_facs *sc_facs;
154
155 struct klist *sc_note;
156 struct acpi_reg_map sc_pmregs[ACPIREG_MAXREG];
157 bus_space_handle_t sc_ioh_pm1a_evt;
158
159 void *sc_interrupt;
160 #ifdef __HAVE_GENERIC_SOFT_INTERRUPTS
161 void *sc_softih;
162 #else
163 struct timeout sc_timeout;
164 #endif
165
166 int sc_powerbtn;
167 int sc_sleepbtn;
168
169 struct {
170 int slp_typa;
171 int slp_typb;
172 } sc_sleeptype[6];
173 int sc_maxgpe;
174 int sc_lastgpe;
175
176 struct gpe_block *gpe_table;
177
178 int sc_wakeup;
179 u_int32_t sc_gpe_sts;
180 u_int32_t sc_gpe_en;
181 struct acpi_thread *sc_thread;
182
183 struct aml_node *sc_tts;
184 struct aml_node *sc_pts;
185 struct aml_node *sc_bfs;
186 struct aml_node *sc_gts;
187 struct aml_node *sc_wak;
188 int sc_state;
189 struct acpiec_softc *sc_ec;
190
191 struct acpi_ac_head sc_ac;
192 struct acpi_bat_head sc_bat;
193
194 struct timeout sc_dev_timeout;
195 int sc_poll;
196 };
197
198 #define GPE_NONE 0x00
199 #define GPE_LEVEL 0x01
200 #define GPE_EDGE 0x02
201
202 struct acpi_table {
203 int offset;
204 size_t size;
205 void *table;
206 };
207
208 #define ACPI_IOC_GETFACS _IOR('A', 0, struct acpi_facs)
209 #define ACPI_IOC_GETTABLE _IOWR('A', 1, struct acpi_table)
210 #define ACPI_IOC_SETSLEEPSTATE _IOW('A', 2, int)
211
212 #define ACPI_EV_PWRBTN 0x0001
213 #define ACPI_EV_SLPBTN 0x0002
214
215 #define ACPI_EVENT_MASK 0x0003
216
217 #define ACPI_EVENT_COMPOSE(t,i) (((i) & 0x7fff) << 16 | ((t) & ACPI_EVENT_MASK))
218 #define ACPI_EVENT_TYPE(e) ((e) & ACPI_EVENT_MASK)
219 #define ACPI_EVENT_INDEX(e) ((e) >> 16)
220
221 #if defined(_KERNEL)
222 struct acpi_gas;
223 int acpi_map_address(struct acpi_softc *, struct acpi_gas *, bus_addr_t, bus_size_t,
224 bus_space_handle_t *, bus_space_tag_t *);
225
226 int acpi_map(paddr_t, size_t, struct acpi_mem_map *);
227 void acpi_unmap(struct acpi_mem_map *);
228 int acpi_probe(struct device *, struct cfdata *, struct acpi_attach_args *);
229 u_int acpi_checksum(const void *, size_t);
230 void acpi_attach_machdep(struct acpi_softc *);
231 int acpi_interrupt(void *);
232 void acpi_enter_sleep_state(struct acpi_softc *, int);
233 void acpi_powerdown(void);
234 void acpi_resume(struct acpi_softc *);
235
236 #define ACPI_IOREAD 0
237 #define ACPI_IOWRITE 1
238
239 void acpi_delay(struct acpi_softc *, int64_t);
240 int acpi_gasio(struct acpi_softc *, int, int, uint64_t, int, int, void *);
241
242 int acpi_set_gpehandler(struct acpi_softc *, int, int (*)(struct acpi_softc *, int, void *), void *, const char *);
243 void acpi_enable_gpe(struct acpi_softc *, u_int32_t);
244
245 int acpiec_intr(struct acpiec_softc *);
246 void acpiec_read(struct acpiec_softc *, u_int8_t, int, u_int8_t *);
247 void acpiec_write(struct acpiec_softc *, u_int8_t, int, u_int8_t *);
248 void acpiec_handle_events(struct acpiec_softc *);
249
250 int acpi_read_pmreg(struct acpi_softc *, int, int);
251 void acpi_write_pmreg(struct acpi_softc *, int, int, int);
252
253 void acpi_poll(void *);
254
255 #endif
256
257 #endif