acpivar.h revision 1.25 1 /* $NetBSD: acpivar.h,v 1.25 2005/12/12 15:04:50 cube Exp $ */
2
3 /*
4 * Copyright 2001 Wasabi Systems, Inc.
5 * All rights reserved.
6 *
7 * Written by Jason R. Thorpe for Wasabi Systems, Inc.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
11 * are met:
12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright
15 * notice, this list of conditions and the following disclaimer in the
16 * documentation and/or other materials provided with the distribution.
17 * 3. All advertising materials mentioning features or use of this software
18 * must display the following acknowledgement:
19 * This product includes software developed for the NetBSD Project by
20 * Wasabi Systems, Inc.
21 * 4. The name of Wasabi Systems, Inc. may not be used to endorse
22 * or promote products derived from this software without specific prior
23 * written permission.
24 *
25 * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND
26 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
27 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL WASABI SYSTEMS, INC
29 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
30 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
31 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
32 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
33 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
34 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
35 * POSSIBILITY OF SUCH DAMAGE.
36 */
37
38 /*
39 * This file defines the ACPI interface provided to the rest of the
40 * kernel, as well as the autoconfiguration structures for ACPI
41 * support.
42 */
43
44 #include <machine/bus.h>
45 #include <dev/pci/pcivar.h>
46 #include <dev/isa/isavar.h>
47
48 #include <dev/acpi/acpica.h>
49
50 #include <dev/sysmon/sysmonvar.h>
51
52 /*
53 * acpibus_attach_args:
54 *
55 * This structure is used to attach the ACPI "bus".
56 */
57 struct acpibus_attach_args {
58 bus_space_tag_t aa_iot; /* PCI I/O space tag */
59 bus_space_tag_t aa_memt; /* PCI MEM space tag */
60 pci_chipset_tag_t aa_pc; /* PCI chipset */
61 int aa_pciflags; /* PCI bus flags */
62 isa_chipset_tag_t aa_ic; /* ISA chipset */
63 };
64
65 /*
66 * Types of switches that ACPI understands.
67 */
68 #define ACPI_SWITCH_POWERBUTTON 0
69 #define ACPI_SWITCH_SLEEPBUTTON 1
70 #define ACPI_SWITCH_LID 2
71 #define ACPI_NSWITCHES 3
72
73 /*
74 * acpi_devnode:
75 *
76 * An ACPI device node.
77 */
78 struct acpi_devnode {
79 TAILQ_ENTRY(acpi_devnode) ad_list;
80 ACPI_HANDLE ad_handle; /* our ACPI handle */
81 u_int32_t ad_level; /* ACPI level */
82 u_int32_t ad_type; /* ACPI object type */
83 ACPI_DEVICE_INFO *ad_devinfo; /* our ACPI device info */
84 struct acpi_scope *ad_scope; /* backpointer to scope */
85 struct device *ad_device; /* pointer to configured device */
86 };
87
88 /*
89 * acpi_scope:
90 *
91 * Description of an ACPI scope.
92 */
93 struct acpi_scope {
94 TAILQ_ENTRY(acpi_scope) as_list;
95 const char *as_name; /* scope name */
96 /*
97 * Device nodes we manage.
98 */
99 TAILQ_HEAD(, acpi_devnode) as_devnodes;
100 };
101
102 /*
103 * acpi_softc:
104 *
105 * Software state of the ACPI subsystem.
106 */
107 struct acpi_softc {
108 struct device sc_dev; /* base device info */
109 bus_space_tag_t sc_iot; /* PCI I/O space tag */
110 bus_space_tag_t sc_memt; /* PCI MEM space tag */
111 pci_chipset_tag_t sc_pc; /* PCI chipset tag */
112 int sc_pciflags; /* PCI bus flags */
113 int sc_pci_bus; /* internal PCI fixup */
114 isa_chipset_tag_t sc_ic; /* ISA chipset tag */
115
116 void *sc_sdhook; /* shutdown hook */
117
118 /*
119 * Power switch handlers for fixed-feature buttons.
120 */
121 struct sysmon_pswitch sc_smpsw_power;
122 struct sysmon_pswitch sc_smpsw_sleep;
123
124 /*
125 * Sleep state to transition to when a given
126 * switch is activated.
127 */
128 int sc_switch_sleep[ACPI_NSWITCHES];
129
130 int sc_sleepstate; /* current sleep state */
131
132 int sc_quirks;
133
134 /*
135 * Scopes we manage.
136 */
137 TAILQ_HEAD(, acpi_scope) sc_scopes;
138 };
139
140 /*
141 * acpi_attach_args:
142 *
143 * Used to attach a device instance to the acpi "bus".
144 */
145 struct acpi_attach_args {
146 struct acpi_devnode *aa_node; /* ACPI device node */
147 bus_space_tag_t aa_iot; /* PCI I/O space tag */
148 bus_space_tag_t aa_memt; /* PCI MEM space tag */
149 pci_chipset_tag_t aa_pc; /* PCI chipset tag */
150 int aa_pciflags; /* PCI bus flags */
151 isa_chipset_tag_t aa_ic; /* ISA chipset */
152 };
153
154 /*
155 * ACPI resources:
156 *
157 * acpi_io I/O ports
158 * acpi_iorange I/O port range
159 * acpi_mem memory region
160 * acpi_memrange memory range
161 * acpi_irq Interrupt Request
162 * acpi_drq DMA request
163 */
164
165 struct acpi_io {
166 SIMPLEQ_ENTRY(acpi_io) ar_list;
167 int ar_index;
168 uint32_t ar_base;
169 uint32_t ar_length;
170 };
171
172 struct acpi_iorange {
173 SIMPLEQ_ENTRY(acpi_iorange) ar_list;
174 int ar_index;
175 uint32_t ar_low;
176 uint32_t ar_high;
177 uint32_t ar_length;
178 uint32_t ar_align;
179 };
180
181 struct acpi_mem {
182 SIMPLEQ_ENTRY(acpi_mem) ar_list;
183 int ar_index;
184 uint32_t ar_base;
185 uint32_t ar_length;
186 };
187
188 struct acpi_memrange {
189 SIMPLEQ_ENTRY(acpi_memrange) ar_list;
190 int ar_index;
191 uint32_t ar_low;
192 uint32_t ar_high;
193 uint32_t ar_length;
194 uint32_t ar_align;
195 };
196
197 struct acpi_irq {
198 SIMPLEQ_ENTRY(acpi_irq) ar_list;
199 int ar_index;
200 uint32_t ar_irq;
201 uint32_t ar_type;
202 };
203
204 struct acpi_drq {
205 SIMPLEQ_ENTRY(acpi_drq) ar_list;
206 int ar_index;
207 uint32_t ar_drq;
208 };
209
210 struct acpi_resources {
211 SIMPLEQ_HEAD(, acpi_io) ar_io;
212 int ar_nio;
213
214 SIMPLEQ_HEAD(, acpi_iorange) ar_iorange;
215 int ar_niorange;
216
217 SIMPLEQ_HEAD(, acpi_mem) ar_mem;
218 int ar_nmem;
219
220 SIMPLEQ_HEAD(, acpi_memrange) ar_memrange;
221 int ar_nmemrange;
222
223 SIMPLEQ_HEAD(, acpi_irq) ar_irq;
224 int ar_nirq;
225
226 SIMPLEQ_HEAD(, acpi_drq) ar_drq;
227 int ar_ndrq;
228 };
229
230 /*
231 * acpi_resource_parse_ops:
232 *
233 * The client of ACPI resources specifies these operations
234 * when the resources are parsed.
235 */
236 struct acpi_resource_parse_ops {
237 void (*init)(struct device *, void *, void **);
238 void (*fini)(struct device *, void *);
239
240 void (*ioport)(struct device *, void *, uint32_t, uint32_t);
241 void (*iorange)(struct device *, void *, uint32_t, uint32_t,
242 uint32_t, uint32_t);
243
244 void (*memory)(struct device *, void *, uint32_t, uint32_t);
245 void (*memrange)(struct device *, void *, uint32_t, uint32_t,
246 uint32_t, uint32_t);
247
248 void (*irq)(struct device *, void *, uint32_t, uint32_t);
249 void (*drq)(struct device *, void *, uint32_t);
250
251 void (*start_dep)(struct device *, void *, int);
252 void (*end_dep)(struct device *, void *);
253 };
254
255 extern struct acpi_softc *acpi_softc;
256 extern int acpi_active;
257
258 extern const struct acpi_resource_parse_ops acpi_resource_parse_ops_default;
259
260 int acpi_probe(void);
261 ACPI_STATUS acpi_OsGetRootPointer(UINT32, ACPI_POINTER *);
262 int acpi_match_hid(ACPI_DEVICE_INFO *, const char * const *);
263 void acpi_set_wake_gpe(ACPI_HANDLE);
264
265 ACPI_STATUS acpi_eval_integer(ACPI_HANDLE, const char *, ACPI_INTEGER *);
266 ACPI_STATUS acpi_eval_string(ACPI_HANDLE, const char *, char **);
267 ACPI_STATUS acpi_eval_struct(ACPI_HANDLE, const char *, ACPI_BUFFER *);
268
269 ACPI_STATUS acpi_foreach_package_object(ACPI_OBJECT *,
270 ACPI_STATUS (*)(ACPI_OBJECT *, void *), void *);
271 ACPI_STATUS acpi_get(ACPI_HANDLE, ACPI_BUFFER *,
272 ACPI_STATUS (*)(ACPI_HANDLE, ACPI_BUFFER *));
273 const char* acpi_name(ACPI_HANDLE);
274
275 ACPI_STATUS acpi_resource_parse(struct device *, ACPI_HANDLE, const char *,
276 void *, const struct acpi_resource_parse_ops *);
277 void acpi_resource_print(struct device *, struct acpi_resources *);
278 void acpi_resource_cleanup(struct acpi_resources *);
279
280 ACPI_STATUS acpi_pwr_switch_consumer(ACPI_HANDLE, int);
281
282 #if defined(_KERNEL_OPT)
283 #include "acpiec.h"
284
285 #if NACPIEC > 0
286 void acpiec_early_attach(struct device *);
287 #endif
288 #else
289 #define NACPIEC 0
290 #endif
291
292 struct acpi_io *acpi_res_io(struct acpi_resources *, int);
293 struct acpi_iorange *acpi_res_iorange(struct acpi_resources *, int);
294 struct acpi_mem *acpi_res_mem(struct acpi_resources *, int);
295 struct acpi_memrange *acpi_res_memrange(struct acpi_resources *, int);
296 struct acpi_irq *acpi_res_irq(struct acpi_resources *, int);
297 struct acpi_drq *acpi_res_drq(struct acpi_resources *, int);
298
299 /*
300 * power state transition
301 */
302 ACPI_STATUS acpi_enter_sleep_state(struct acpi_softc *, int);
303
304 /*
305 * quirk handling
306 */
307 struct acpi_quirk {
308 const char *aq_oemid; /* compared against the X/RSDT OemId */
309 int aq_oemrev; /* compared against the X/RSDT OemRev */
310 int aq_quirks; /* the actual quirks */
311 };
312
313 #define ACPI_QUIRK_BADPCI 0x00000001 /* bad PCI hierarchy */
314 #define ACPI_QUIRK_BADIRQ 0x00000002 /* bad IRQ information */
315
316 int acpi_find_quirks(void);
317