acpi_resource.c revision 1.5 1 /* $NetBSD: acpi_resource.c,v 1.5 2002/12/28 08:44:43 matt 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 * Copyright (c) 2000 Michael Smith
40 * Copyright (c) 2000 BSDi
41 * All rights reserved.
42 *
43 * Redistribution and use in source and binary forms, with or without
44 * modification, are permitted provided that the following conditions
45 * are met:
46 * 1. Redistributions of source code must retain the above copyright
47 * notice, this list of conditions and the following disclaimer.
48 * 2. Redistributions in binary form must reproduce the above copyright
49 * notice, this list of conditions and the following disclaimer in the
50 * documentation and/or other materials provided with the distribution.
51 *
52 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
53 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
54 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
55 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
56 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
57 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
58 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
59 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
60 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
61 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
62 * SUCH DAMAGE.
63 */
64
65 /*
66 * ACPI resource parsing.
67 */
68
69 #include <sys/cdefs.h>
70 __KERNEL_RCSID(0, "$NetBSD: acpi_resource.c,v 1.5 2002/12/28 08:44:43 matt Exp $");
71
72 #include <sys/param.h>
73 #include <sys/systm.h>
74 #include <sys/device.h>
75 #include <sys/malloc.h>
76
77 #include <dev/acpi/acpica.h>
78 #include <dev/acpi/acpireg.h>
79 #include <dev/acpi/acpivar.h>
80
81 #define _COMPONENT ACPI_RESOURCE_COMPONENT
82 ACPI_MODULE_NAME("RESOURCE")
83
84 /*
85 * acpi_resource_parse:
86 *
87 * Parse a device node's resources and fill them in for the
88 * client.
89 *
90 * Note that it might be nice to also locate ACPI-specific resource
91 * items, such as GPE bits.
92 */
93 ACPI_STATUS
94 acpi_resource_parse(struct device *dev, struct acpi_devnode *ad,
95 void *arg, const struct acpi_resource_parse_ops *ops)
96 {
97 ACPI_BUFFER buf;
98 ACPI_RESOURCE *res;
99 char *cur, *last;
100 ACPI_STATUS status;
101 void *context;
102 int i;
103
104 ACPI_FUNCTION_TRACE(__FUNCTION__);
105
106 /*
107 * XXX Note, this means we only get devices that are currently
108 * decoding their address space. This might not be what we
109 * want, in the long term.
110 */
111
112 status = acpi_get(ad->ad_handle, &buf, AcpiGetCurrentResources);
113 if (status != AE_OK) {
114 printf("%s: ACPI: unable to get Current Resources: %d\n",
115 dev->dv_xname, status);
116 return_ACPI_STATUS(status);
117 }
118
119 ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "got %d bytes of _CRS\n",
120 buf.Length));
121
122 (*ops->init)(dev, arg, &context);
123
124 cur = buf.Pointer;
125 last = cur + buf.Length;
126 while (cur < last) {
127 res = (ACPI_RESOURCE *) cur;
128 cur += res->Length;
129
130 switch (res->Id) {
131 case ACPI_RSTYPE_END_TAG:
132 ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "EndTag\n"));
133 cur = last;
134 break;
135
136 case ACPI_RSTYPE_FIXED_IO:
137 ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES,
138 "FixedIo 0x%x/%d\n",
139 res->Data.FixedIo.BaseAddress,
140 res->Data.FixedIo.RangeLength));
141 (*ops->ioport)(dev, context,
142 res->Data.FixedIo.BaseAddress,
143 res->Data.FixedIo.RangeLength);
144 break;
145
146 case ACPI_RSTYPE_IO:
147 if (res->Data.Io.MinBaseAddress ==
148 res->Data.Io.MaxBaseAddress) {
149 ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES,
150 "Io 0x%x/%d\n",
151 res->Data.Io.MinBaseAddress,
152 res->Data.Io.RangeLength));
153 (*ops->ioport)(dev, context,
154 res->Data.Io.MinBaseAddress,
155 res->Data.Io.RangeLength);
156 } else {
157 ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES,
158 "Io 0x%x-0x%x/%d\n",
159 res->Data.Io.MinBaseAddress,
160 res->Data.Io.MaxBaseAddress,
161 res->Data.Io.RangeLength));
162 (*ops->iorange)(dev, context,
163 res->Data.Io.MinBaseAddress,
164 res->Data.Io.MaxBaseAddress,
165 res->Data.Io.RangeLength,
166 res->Data.Io.Alignment);
167 }
168 break;
169
170 case ACPI_RSTYPE_FIXED_MEM32:
171 ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES,
172 "FixedMemory32 0x%x/%d\n",
173 res->Data.FixedMemory32.RangeBaseAddress,
174 res->Data.FixedMemory32.RangeLength));
175 (*ops->memory)(dev, context,
176 res->Data.FixedMemory32.RangeBaseAddress,
177 res->Data.FixedMemory32.RangeLength);
178 break;
179
180 case ACPI_RSTYPE_MEM32:
181 if (res->Data.Memory32.MinBaseAddress ==
182 res->Data.Memory32.MaxBaseAddress) {
183 ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES,
184 "Memory32 0x%x/%d\n",
185 res->Data.Memory32.MinBaseAddress,
186 res->Data.Memory32.RangeLength));
187 (*ops->memory)(dev, context,
188 res->Data.Memory32.MinBaseAddress,
189 res->Data.Memory32.RangeLength);
190 } else {
191 ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES,
192 "Memory32 0x%x-0x%x/%d\n",
193 res->Data.Memory32.MinBaseAddress,
194 res->Data.Memory32.MaxBaseAddress,
195 res->Data.Memory32.RangeLength));
196 (*ops->memrange)(dev, context,
197 res->Data.Memory32.MinBaseAddress,
198 res->Data.Memory32.MaxBaseAddress,
199 res->Data.Memory32.RangeLength,
200 res->Data.Memory32.Alignment);
201 }
202 break;
203
204 case ACPI_RSTYPE_MEM24:
205 if (res->Data.Memory24.MinBaseAddress ==
206 res->Data.Memory24.MaxBaseAddress) {
207 ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES,
208 "Memory24 0x%x/%d\n",
209 res->Data.Memory24.MinBaseAddress,
210 res->Data.Memory24.RangeLength));
211 (*ops->memory)(dev, context,
212 res->Data.Memory24.MinBaseAddress,
213 res->Data.Memory24.RangeLength);
214 } else {
215 ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES,
216 "Memory24 0x%x-0x%x/%d\n",
217 res->Data.Memory24.MinBaseAddress,
218 res->Data.Memory24.MaxBaseAddress,
219 res->Data.Memory24.RangeLength));
220 (*ops->memrange)(dev, context,
221 res->Data.Memory24.MinBaseAddress,
222 res->Data.Memory24.MaxBaseAddress,
223 res->Data.Memory24.RangeLength,
224 res->Data.Memory24.Alignment);
225 }
226 break;
227
228 case ACPI_RSTYPE_IRQ:
229 for (i = 0; i < res->Data.Irq.NumberOfInterrupts; i++) {
230 ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES,
231 "IRQ %d\n", res->Data.Irq.Interrupts[i]));
232 (*ops->irq)(dev, context,
233 res->Data.Irq.Interrupts[i],
234 res->Data.Irq.EdgeLevel);
235 }
236 break;
237
238 case ACPI_RSTYPE_DMA:
239 for (i = 0; i < res->Data.Dma.NumberOfChannels; i++) {
240 ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES,
241 "DRQ %d\n", res->Data.Dma.Channels[i]));
242 (*ops->drq)(dev, context,
243 res->Data.Dma.Channels[i]);
244 }
245 break;
246
247 case ACPI_RSTYPE_START_DPF:
248 ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES,
249 "Start dependant functions: %d\n",
250 res->Data.StartDpf.CompatibilityPriority));
251 (*ops->start_dep)(dev, context,
252 res->Data.StartDpf.CompatibilityPriority);
253 break;
254
255 case ACPI_RSTYPE_END_DPF:
256 ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES,
257 "End dependant functions\n"));
258 (*ops->end_dep)(dev, context);
259
260 case ACPI_RSTYPE_ADDRESS32:
261 ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES,
262 "Address32 unimplemented\n"));
263 break;
264
265 case ACPI_RSTYPE_ADDRESS16:
266 ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES,
267 "Address16 unimplemented\n"));
268 break;
269
270 case ACPI_RSTYPE_EXT_IRQ:
271 ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES,
272 "ExtendedIrq unimplemented\n"));
273 break;
274
275 case ACPI_RSTYPE_VENDOR:
276 ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES,
277 "VendorSpecific unimplemented\n"));
278 break;
279
280 default:
281 ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES,
282 "Unknown resource type: %d\n", res->Id));
283 break;
284 }
285 }
286
287 AcpiOsFree(buf.Pointer);
288 (*ops->fini)(dev, context);
289
290 return_ACPI_STATUS(AE_OK);
291 }
292
293 /*
294 * acpi_resource_print:
295 *
296 * Print the resources assigned to a device.
297 */
298 void
299 acpi_resource_print(struct device *dev, struct acpi_resources *res)
300 {
301 const char *sep;
302
303 if (SIMPLEQ_EMPTY(&res->ar_io) &&
304 SIMPLEQ_EMPTY(&res->ar_iorange) &&
305 SIMPLEQ_EMPTY(&res->ar_mem) &&
306 SIMPLEQ_EMPTY(&res->ar_memrange) &&
307 SIMPLEQ_EMPTY(&res->ar_irq) &&
308 SIMPLEQ_EMPTY(&res->ar_drq))
309 return;
310
311 printf("%s:", dev->dv_xname);
312
313 if (SIMPLEQ_EMPTY(&res->ar_io) == 0) {
314 struct acpi_io *ar;
315
316 sep = "";
317 printf(" io ");
318 SIMPLEQ_FOREACH(ar, &res->ar_io, ar_list) {
319 printf("%s0x%x", sep, ar->ar_base);
320 if (ar->ar_length > 1)
321 printf("-0x%x", ar->ar_base +
322 ar->ar_length - 1);
323 sep = ",";
324 }
325 }
326
327 /* XXX iorange */
328
329 if (SIMPLEQ_EMPTY(&res->ar_mem) == 0) {
330 struct acpi_mem *ar;
331
332 sep = "";
333 printf(" mem ");
334 SIMPLEQ_FOREACH(ar, &res->ar_mem, ar_list) {
335 printf("%s0x%x", sep, ar->ar_base);
336 if (ar->ar_length > 1)
337 printf("-0x%x", ar->ar_base +
338 ar->ar_length - 1);
339 sep = ",";
340 }
341 }
342
343 /* XXX memrange */
344
345 if (SIMPLEQ_EMPTY(&res->ar_irq) == 0) {
346 struct acpi_irq *ar;
347
348 sep = "";
349 printf(" irq ");
350 SIMPLEQ_FOREACH(ar, &res->ar_irq, ar_list) {
351 printf("%s%d", sep, ar->ar_irq);
352 sep = ",";
353 }
354 }
355
356 if (SIMPLEQ_EMPTY(&res->ar_drq) == 0) {
357 struct acpi_drq *ar;
358
359 sep = "";
360 printf(" drq ");
361 SIMPLEQ_FOREACH(ar, &res->ar_drq, ar_list) {
362 printf("%s%d", sep, ar->ar_drq);
363 sep = ",";
364 }
365 }
366
367 printf("\n");
368 }
369
370 struct acpi_io *
371 acpi_res_io(struct acpi_resources *res, int idx)
372 {
373 struct acpi_io *ar;
374
375 SIMPLEQ_FOREACH(ar, &res->ar_io, ar_list) {
376 if (ar->ar_index == idx)
377 return (ar);
378 }
379 return (NULL);
380 }
381
382 struct acpi_iorange *
383 acpi_res_iorange(struct acpi_resources *res, int idx)
384 {
385 struct acpi_iorange *ar;
386
387 SIMPLEQ_FOREACH(ar, &res->ar_iorange, ar_list) {
388 if (ar->ar_index == idx)
389 return (ar);
390 }
391 return (NULL);
392 }
393
394 struct acpi_mem *
395 acpi_res_mem(struct acpi_resources *res, int idx)
396 {
397 struct acpi_mem *ar;
398
399 SIMPLEQ_FOREACH(ar, &res->ar_mem, ar_list) {
400 if (ar->ar_index == idx)
401 return (ar);
402 }
403 return (NULL);
404 }
405
406 struct acpi_memrange *
407 acpi_res_memrange(struct acpi_resources *res, int idx)
408 {
409 struct acpi_memrange *ar;
410
411 SIMPLEQ_FOREACH(ar, &res->ar_memrange, ar_list) {
412 if (ar->ar_index == idx)
413 return (ar);
414 }
415 return (NULL);
416 }
417
418 struct acpi_irq *
419 acpi_res_irq(struct acpi_resources *res, int idx)
420 {
421 struct acpi_irq *ar;
422
423 SIMPLEQ_FOREACH(ar, &res->ar_irq, ar_list) {
424 if (ar->ar_index == idx)
425 return (ar);
426 }
427 return (NULL);
428 }
429
430 struct acpi_drq *
431 acpi_res_drq(struct acpi_resources *res, int idx)
432 {
433 struct acpi_drq *ar;
434
435 SIMPLEQ_FOREACH(ar, &res->ar_drq, ar_list) {
436 if (ar->ar_index == idx)
437 return (ar);
438 }
439 return (NULL);
440 }
441
442 /*****************************************************************************
443 * Default ACPI resource parse operations.
444 *****************************************************************************/
445
446 static void acpi_res_parse_init(struct device *, void *, void **);
447 static void acpi_res_parse_fini(struct device *, void *);
448
449 static void acpi_res_parse_ioport(struct device *, void *, uint32_t,
450 uint32_t);
451 static void acpi_res_parse_iorange(struct device *, void *, uint32_t,
452 uint32_t, uint32_t, uint32_t);
453
454 static void acpi_res_parse_memory(struct device *, void *, uint32_t,
455 uint32_t);
456 static void acpi_res_parse_memrange(struct device *, void *, uint32_t,
457 uint32_t, uint32_t, uint32_t);
458
459 static void acpi_res_parse_irq(struct device *, void *, uint32_t, uint32_t);
460 static void acpi_res_parse_drq(struct device *, void *, uint32_t);
461
462 static void acpi_res_parse_start_dep(struct device *, void *, int);
463 static void acpi_res_parse_end_dep(struct device *, void *);
464
465 const struct acpi_resource_parse_ops acpi_resource_parse_ops_default = {
466 acpi_res_parse_init,
467 acpi_res_parse_fini,
468
469 acpi_res_parse_ioport,
470 acpi_res_parse_iorange,
471
472 acpi_res_parse_memory,
473 acpi_res_parse_memrange,
474
475 acpi_res_parse_irq,
476 acpi_res_parse_drq,
477
478 acpi_res_parse_start_dep,
479 acpi_res_parse_end_dep,
480 };
481
482 static void
483 acpi_res_parse_init(struct device *dev, void *arg, void **contextp)
484 {
485 struct acpi_resources *res = arg;
486
487 SIMPLEQ_INIT(&res->ar_io);
488 res->ar_nio = 0;
489
490 SIMPLEQ_INIT(&res->ar_iorange);
491 res->ar_niorange = 0;
492
493 SIMPLEQ_INIT(&res->ar_mem);
494 res->ar_nmem = 0;
495
496 SIMPLEQ_INIT(&res->ar_memrange);
497 res->ar_nmemrange = 0;
498
499 SIMPLEQ_INIT(&res->ar_irq);
500 res->ar_nirq = 0;
501
502 SIMPLEQ_INIT(&res->ar_drq);
503 res->ar_ndrq = 0;
504
505 *contextp = res;
506 }
507
508 static void
509 acpi_res_parse_fini(struct device *dev, void *context)
510 {
511 struct acpi_resources *res = context;
512
513 /* Print the resources we're using. */
514 acpi_resource_print(dev, res);
515 }
516
517 static void
518 acpi_res_parse_ioport(struct device *dev, void *context, uint32_t base,
519 uint32_t length)
520 {
521 struct acpi_resources *res = context;
522 struct acpi_io *ar;
523
524 ar = AcpiOsAllocate(sizeof(*ar));
525 if (ar == NULL) {
526 printf("%s: ACPI: unable to allocate I/O resource %d\n",
527 dev->dv_xname, res->ar_nio);
528 res->ar_nio++;
529 return;
530 }
531
532 ar->ar_index = res->ar_nio++;
533 ar->ar_base = base;
534 ar->ar_length = length;
535
536 SIMPLEQ_INSERT_TAIL(&res->ar_io, ar, ar_list);
537 }
538
539 static void
540 acpi_res_parse_iorange(struct device *dev, void *context, uint32_t low,
541 uint32_t high, uint32_t length, uint32_t align)
542 {
543 struct acpi_resources *res = context;
544 struct acpi_iorange *ar;
545
546 ar = AcpiOsAllocate(sizeof(*ar));
547 if (ar == NULL) {
548 printf("%s: ACPI: unable to allocate I/O range resource %d\n",
549 dev->dv_xname, res->ar_niorange);
550 res->ar_niorange++;
551 return;
552 }
553
554 ar->ar_index = res->ar_niorange++;
555 ar->ar_low = low;
556 ar->ar_high = high;
557 ar->ar_length = length;
558 ar->ar_align = align;
559
560 SIMPLEQ_INSERT_TAIL(&res->ar_iorange, ar, ar_list);
561 }
562
563 static void
564 acpi_res_parse_memory(struct device *dev, void *context, uint32_t base,
565 uint32_t length)
566 {
567 struct acpi_resources *res = context;
568 struct acpi_mem *ar;
569
570 ar = AcpiOsAllocate(sizeof(*ar));
571 if (ar == NULL) {
572 printf("%s: ACPI: unable to allocate Memory resource %d\n",
573 dev->dv_xname, res->ar_nmem);
574 res->ar_nmem++;
575 return;
576 }
577
578 ar->ar_index = res->ar_nmem++;
579 ar->ar_base = base;
580 ar->ar_length = length;
581
582 SIMPLEQ_INSERT_TAIL(&res->ar_mem, ar, ar_list);
583 }
584
585 static void
586 acpi_res_parse_memrange(struct device *dev, void *context, uint32_t low,
587 uint32_t high, uint32_t length, uint32_t align)
588 {
589 struct acpi_resources *res = context;
590 struct acpi_memrange *ar;
591
592 ar = AcpiOsAllocate(sizeof(*ar));
593 if (ar == NULL) {
594 printf("%s: ACPI: unable to allocate Memory range resource "
595 "%d\n", dev->dv_xname, res->ar_nmemrange);
596 res->ar_nmemrange++;
597 return;
598 }
599
600 ar->ar_index = res->ar_nmemrange++;
601 ar->ar_low = low;
602 ar->ar_high = high;
603 ar->ar_length = length;
604 ar->ar_align = align;
605
606 SIMPLEQ_INSERT_TAIL(&res->ar_memrange, ar, ar_list);
607 }
608
609 static void
610 acpi_res_parse_irq(struct device *dev, void *context, uint32_t irq, uint32_t type)
611 {
612 struct acpi_resources *res = context;
613 struct acpi_irq *ar;
614
615 ar = AcpiOsAllocate(sizeof(*ar));
616 if (ar == NULL) {
617 printf("%s: ACPI: unable to allocate IRQ resource %d\n",
618 dev->dv_xname, res->ar_nirq);
619 res->ar_nirq++;
620 return;
621 }
622
623 ar->ar_index = res->ar_nirq++;
624 ar->ar_irq = irq;
625 ar->ar_type = type;
626
627 SIMPLEQ_INSERT_TAIL(&res->ar_irq, ar, ar_list);
628 }
629
630 static void
631 acpi_res_parse_drq(struct device *dev, void *context, uint32_t drq)
632 {
633 struct acpi_resources *res = context;
634 struct acpi_drq *ar;
635
636 ar = AcpiOsAllocate(sizeof(*ar));
637 if (ar == NULL) {
638 printf("%s: ACPI: unable to allocate DRQ resource %d\n",
639 dev->dv_xname, res->ar_ndrq);
640 res->ar_ndrq++;
641 return;
642 }
643
644 ar->ar_index = res->ar_ndrq++;
645 ar->ar_drq = drq;
646
647 SIMPLEQ_INSERT_TAIL(&res->ar_drq, ar, ar_list);
648 }
649
650 static void
651 acpi_res_parse_start_dep(struct device *dev, void *context, int preference)
652 {
653
654 printf("%s: ACPI: dependant functions not supported\n",
655 dev->dv_xname);
656 }
657
658 static void
659 acpi_res_parse_end_dep(struct device *dev, void *context)
660 {
661
662 /* Nothing to do. */
663 }
664