rsxface.c revision 1.4 1 /*******************************************************************************
2 *
3 * Module Name: rsxface - Public interfaces to the resource manager
4 *
5 ******************************************************************************/
6
7 /*
8 * Copyright (C) 2000 - 2013, Intel Corp.
9 * All rights reserved.
10 *
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
13 * are met:
14 * 1. Redistributions of source code must retain the above copyright
15 * notice, this list of conditions, and the following disclaimer,
16 * without modification.
17 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18 * substantially similar to the "NO WARRANTY" disclaimer below
19 * ("Disclaimer") and any redistribution must be conditioned upon
20 * including a substantially similar Disclaimer requirement for further
21 * binary redistribution.
22 * 3. Neither the names of the above-listed copyright holders nor the names
23 * of any contributors may be used to endorse or promote products derived
24 * from this software without specific prior written permission.
25 *
26 * Alternatively, this software may be distributed under the terms of the
27 * GNU General Public License ("GPL") version 2 as published by the Free
28 * Software Foundation.
29 *
30 * NO WARRANTY
31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41 * POSSIBILITY OF SUCH DAMAGES.
42 */
43
44
45 #define __RSXFACE_C__
46 #define EXPORT_ACPI_INTERFACES
47
48 #include "acpi.h"
49 #include "accommon.h"
50 #include "acresrc.h"
51 #include "acnamesp.h"
52
53 #define _COMPONENT ACPI_RESOURCES
54 ACPI_MODULE_NAME ("rsxface")
55
56 /* Local macros for 16,32-bit to 64-bit conversion */
57
58 #define ACPI_COPY_FIELD(Out, In, Field) ((Out)->Field = (In)->Field)
59 #define ACPI_COPY_ADDRESS(Out, In) \
60 ACPI_COPY_FIELD(Out, In, ResourceType); \
61 ACPI_COPY_FIELD(Out, In, ProducerConsumer); \
62 ACPI_COPY_FIELD(Out, In, Decode); \
63 ACPI_COPY_FIELD(Out, In, MinAddressFixed); \
64 ACPI_COPY_FIELD(Out, In, MaxAddressFixed); \
65 ACPI_COPY_FIELD(Out, In, Info); \
66 ACPI_COPY_FIELD(Out, In, Granularity); \
67 ACPI_COPY_FIELD(Out, In, Minimum); \
68 ACPI_COPY_FIELD(Out, In, Maximum); \
69 ACPI_COPY_FIELD(Out, In, TranslationOffset); \
70 ACPI_COPY_FIELD(Out, In, AddressLength); \
71 ACPI_COPY_FIELD(Out, In, ResourceSource);
72
73
74 /* Local prototypes */
75
76 static ACPI_STATUS
77 AcpiRsMatchVendorResource (
78 ACPI_RESOURCE *Resource,
79 void *Context);
80
81 static ACPI_STATUS
82 AcpiRsValidateParameters (
83 ACPI_HANDLE DeviceHandle,
84 ACPI_BUFFER *Buffer,
85 ACPI_NAMESPACE_NODE **ReturnNode);
86
87
88 /*******************************************************************************
89 *
90 * FUNCTION: AcpiRsValidateParameters
91 *
92 * PARAMETERS: DeviceHandle - Handle to a device
93 * Buffer - Pointer to a data buffer
94 * ReturnNode - Pointer to where the device node is returned
95 *
96 * RETURN: Status
97 *
98 * DESCRIPTION: Common parameter validation for resource interfaces
99 *
100 ******************************************************************************/
101
102 static ACPI_STATUS
103 AcpiRsValidateParameters (
104 ACPI_HANDLE DeviceHandle,
105 ACPI_BUFFER *Buffer,
106 ACPI_NAMESPACE_NODE **ReturnNode)
107 {
108 ACPI_STATUS Status;
109 ACPI_NAMESPACE_NODE *Node;
110
111
112 ACPI_FUNCTION_TRACE (RsValidateParameters);
113
114
115 /*
116 * Must have a valid handle to an ACPI device
117 */
118 if (!DeviceHandle)
119 {
120 return_ACPI_STATUS (AE_BAD_PARAMETER);
121 }
122
123 Node = AcpiNsValidateHandle (DeviceHandle);
124 if (!Node)
125 {
126 return_ACPI_STATUS (AE_BAD_PARAMETER);
127 }
128
129 if (Node->Type != ACPI_TYPE_DEVICE)
130 {
131 return_ACPI_STATUS (AE_TYPE);
132 }
133
134 /*
135 * Validate the user buffer object
136 *
137 * if there is a non-zero buffer length we also need a valid pointer in
138 * the buffer. If it's a zero buffer length, we'll be returning the
139 * needed buffer size (later), so keep going.
140 */
141 Status = AcpiUtValidateBuffer (Buffer);
142 if (ACPI_FAILURE (Status))
143 {
144 return_ACPI_STATUS (Status);
145 }
146
147 *ReturnNode = Node;
148 return_ACPI_STATUS (AE_OK);
149 }
150
151
152 /*******************************************************************************
153 *
154 * FUNCTION: AcpiGetIrqRoutingTable
155 *
156 * PARAMETERS: DeviceHandle - Handle to the Bus device we are querying
157 * RetBuffer - Pointer to a buffer to receive the
158 * current resources for the device
159 *
160 * RETURN: Status
161 *
162 * DESCRIPTION: This function is called to get the IRQ routing table for a
163 * specific bus. The caller must first acquire a handle for the
164 * desired bus. The routine table is placed in the buffer pointed
165 * to by the RetBuffer variable parameter.
166 *
167 * If the function fails an appropriate status will be returned
168 * and the value of RetBuffer is undefined.
169 *
170 * This function attempts to execute the _PRT method contained in
171 * the object indicated by the passed DeviceHandle.
172 *
173 ******************************************************************************/
174
175 ACPI_STATUS
176 AcpiGetIrqRoutingTable (
177 ACPI_HANDLE DeviceHandle,
178 ACPI_BUFFER *RetBuffer)
179 {
180 ACPI_STATUS Status;
181 ACPI_NAMESPACE_NODE *Node;
182
183
184 ACPI_FUNCTION_TRACE (AcpiGetIrqRoutingTable);
185
186
187 /* Validate parameters then dispatch to internal routine */
188
189 Status = AcpiRsValidateParameters (DeviceHandle, RetBuffer, &Node);
190 if (ACPI_FAILURE (Status))
191 {
192 return_ACPI_STATUS (Status);
193 }
194
195 Status = AcpiRsGetPrtMethodData (Node, RetBuffer);
196 return_ACPI_STATUS (Status);
197 }
198
199 ACPI_EXPORT_SYMBOL (AcpiGetIrqRoutingTable)
200
201
202 /*******************************************************************************
203 *
204 * FUNCTION: AcpiGetCurrentResources
205 *
206 * PARAMETERS: DeviceHandle - Handle to the device object for the
207 * device we are querying
208 * RetBuffer - Pointer to a buffer to receive the
209 * current resources for the device
210 *
211 * RETURN: Status
212 *
213 * DESCRIPTION: This function is called to get the current resources for a
214 * specific device. The caller must first acquire a handle for
215 * the desired device. The resource data is placed in the buffer
216 * pointed to by the RetBuffer variable parameter.
217 *
218 * If the function fails an appropriate status will be returned
219 * and the value of RetBuffer is undefined.
220 *
221 * This function attempts to execute the _CRS method contained in
222 * the object indicated by the passed DeviceHandle.
223 *
224 ******************************************************************************/
225
226 ACPI_STATUS
227 AcpiGetCurrentResources (
228 ACPI_HANDLE DeviceHandle,
229 ACPI_BUFFER *RetBuffer)
230 {
231 ACPI_STATUS Status;
232 ACPI_NAMESPACE_NODE *Node;
233
234
235 ACPI_FUNCTION_TRACE (AcpiGetCurrentResources);
236
237
238 /* Validate parameters then dispatch to internal routine */
239
240 Status = AcpiRsValidateParameters (DeviceHandle, RetBuffer, &Node);
241 if (ACPI_FAILURE (Status))
242 {
243 return_ACPI_STATUS (Status);
244 }
245
246 Status = AcpiRsGetCrsMethodData (Node, RetBuffer);
247 return_ACPI_STATUS (Status);
248 }
249
250 ACPI_EXPORT_SYMBOL (AcpiGetCurrentResources)
251
252
253 /*******************************************************************************
254 *
255 * FUNCTION: AcpiGetPossibleResources
256 *
257 * PARAMETERS: DeviceHandle - Handle to the device object for the
258 * device we are querying
259 * RetBuffer - Pointer to a buffer to receive the
260 * resources for the device
261 *
262 * RETURN: Status
263 *
264 * DESCRIPTION: This function is called to get a list of the possible resources
265 * for a specific device. The caller must first acquire a handle
266 * for the desired device. The resource data is placed in the
267 * buffer pointed to by the RetBuffer variable.
268 *
269 * If the function fails an appropriate status will be returned
270 * and the value of RetBuffer is undefined.
271 *
272 ******************************************************************************/
273
274 ACPI_STATUS
275 AcpiGetPossibleResources (
276 ACPI_HANDLE DeviceHandle,
277 ACPI_BUFFER *RetBuffer)
278 {
279 ACPI_STATUS Status;
280 ACPI_NAMESPACE_NODE *Node;
281
282
283 ACPI_FUNCTION_TRACE (AcpiGetPossibleResources);
284
285
286 /* Validate parameters then dispatch to internal routine */
287
288 Status = AcpiRsValidateParameters (DeviceHandle, RetBuffer, &Node);
289 if (ACPI_FAILURE (Status))
290 {
291 return_ACPI_STATUS (Status);
292 }
293
294 Status = AcpiRsGetPrsMethodData (Node, RetBuffer);
295 return_ACPI_STATUS (Status);
296 }
297
298 ACPI_EXPORT_SYMBOL (AcpiGetPossibleResources)
299
300
301 /*******************************************************************************
302 *
303 * FUNCTION: AcpiSetCurrentResources
304 *
305 * PARAMETERS: DeviceHandle - Handle to the device object for the
306 * device we are setting resources
307 * InBuffer - Pointer to a buffer containing the
308 * resources to be set for the device
309 *
310 * RETURN: Status
311 *
312 * DESCRIPTION: This function is called to set the current resources for a
313 * specific device. The caller must first acquire a handle for
314 * the desired device. The resource data is passed to the routine
315 * the buffer pointed to by the InBuffer variable.
316 *
317 ******************************************************************************/
318
319 ACPI_STATUS
320 AcpiSetCurrentResources (
321 ACPI_HANDLE DeviceHandle,
322 ACPI_BUFFER *InBuffer)
323 {
324 ACPI_STATUS Status;
325 ACPI_NAMESPACE_NODE *Node;
326
327
328 ACPI_FUNCTION_TRACE (AcpiSetCurrentResources);
329
330
331 /* Validate the buffer, don't allow zero length */
332
333 if ((!InBuffer) ||
334 (!InBuffer->Pointer) ||
335 (!InBuffer->Length))
336 {
337 return_ACPI_STATUS (AE_BAD_PARAMETER);
338 }
339
340 /* Validate parameters then dispatch to internal routine */
341
342 Status = AcpiRsValidateParameters (DeviceHandle, InBuffer, &Node);
343 if (ACPI_FAILURE (Status))
344 {
345 return_ACPI_STATUS (Status);
346 }
347
348 Status = AcpiRsSetSrsMethodData (Node, InBuffer);
349 return_ACPI_STATUS (Status);
350 }
351
352 ACPI_EXPORT_SYMBOL (AcpiSetCurrentResources)
353
354
355 /*******************************************************************************
356 *
357 * FUNCTION: AcpiGetEventResources
358 *
359 * PARAMETERS: DeviceHandle - Handle to the device object for the
360 * device we are getting resources
361 * InBuffer - Pointer to a buffer containing the
362 * resources to be set for the device
363 *
364 * RETURN: Status
365 *
366 * DESCRIPTION: This function is called to get the event resources for a
367 * specific device. The caller must first acquire a handle for
368 * the desired device. The resource data is passed to the routine
369 * the buffer pointed to by the InBuffer variable. Uses the
370 * _AEI method.
371 *
372 ******************************************************************************/
373
374 ACPI_STATUS
375 AcpiGetEventResources (
376 ACPI_HANDLE DeviceHandle,
377 ACPI_BUFFER *RetBuffer)
378 {
379 ACPI_STATUS Status;
380 ACPI_NAMESPACE_NODE *Node;
381
382
383 ACPI_FUNCTION_TRACE (AcpiGetEventResources);
384
385
386 /* Validate parameters then dispatch to internal routine */
387
388 Status = AcpiRsValidateParameters (DeviceHandle, RetBuffer, &Node);
389 if (ACPI_FAILURE (Status))
390 {
391 return_ACPI_STATUS (Status);
392 }
393
394 Status = AcpiRsGetAeiMethodData (Node, RetBuffer);
395 return_ACPI_STATUS (Status);
396 }
397
398 ACPI_EXPORT_SYMBOL (AcpiGetEventResources)
399
400
401 /******************************************************************************
402 *
403 * FUNCTION: AcpiResourceToAddress64
404 *
405 * PARAMETERS: Resource - Pointer to a resource
406 * Out - Pointer to the users's return buffer
407 * (a struct acpi_resource_address64)
408 *
409 * RETURN: Status
410 *
411 * DESCRIPTION: If the resource is an address16, address32, or address64,
412 * copy it to the address64 return buffer. This saves the
413 * caller from having to duplicate code for different-sized
414 * addresses.
415 *
416 ******************************************************************************/
417
418 ACPI_STATUS
419 AcpiResourceToAddress64 (
420 ACPI_RESOURCE *Resource,
421 ACPI_RESOURCE_ADDRESS64 *Out)
422 {
423 ACPI_RESOURCE_ADDRESS16 *Address16;
424 ACPI_RESOURCE_ADDRESS32 *Address32;
425
426
427 if (!Resource || !Out)
428 {
429 return (AE_BAD_PARAMETER);
430 }
431
432 /* Convert 16 or 32 address descriptor to 64 */
433
434 switch (Resource->Type)
435 {
436 case ACPI_RESOURCE_TYPE_ADDRESS16:
437
438 Address16 = ACPI_CAST_PTR (ACPI_RESOURCE_ADDRESS16, &Resource->Data);
439 ACPI_COPY_ADDRESS (Out, Address16);
440 break;
441
442 case ACPI_RESOURCE_TYPE_ADDRESS32:
443
444 Address32 = ACPI_CAST_PTR (ACPI_RESOURCE_ADDRESS32, &Resource->Data);
445 ACPI_COPY_ADDRESS (Out, Address32);
446 break;
447
448 case ACPI_RESOURCE_TYPE_ADDRESS64:
449
450 /* Simple copy for 64 bit source */
451
452 ACPI_MEMCPY (Out, &Resource->Data, sizeof (ACPI_RESOURCE_ADDRESS64));
453 break;
454
455 default:
456
457 return (AE_BAD_PARAMETER);
458 }
459
460 return (AE_OK);
461 }
462
463 ACPI_EXPORT_SYMBOL (AcpiResourceToAddress64)
464
465
466 /*******************************************************************************
467 *
468 * FUNCTION: AcpiGetVendorResource
469 *
470 * PARAMETERS: DeviceHandle - Handle for the parent device object
471 * Name - Method name for the parent resource
472 * (METHOD_NAME__CRS or METHOD_NAME__PRS)
473 * Uuid - Pointer to the UUID to be matched.
474 * includes both subtype and 16-byte UUID
475 * RetBuffer - Where the vendor resource is returned
476 *
477 * RETURN: Status
478 *
479 * DESCRIPTION: Walk a resource template for the specified device to find a
480 * vendor-defined resource that matches the supplied UUID and
481 * UUID subtype. Returns a ACPI_RESOURCE of type Vendor.
482 *
483 ******************************************************************************/
484
485 ACPI_STATUS
486 AcpiGetVendorResource (
487 ACPI_HANDLE DeviceHandle,
488 char *Name,
489 ACPI_VENDOR_UUID *Uuid,
490 ACPI_BUFFER *RetBuffer)
491 {
492 ACPI_VENDOR_WALK_INFO Info;
493 ACPI_STATUS Status;
494
495
496 /* Other parameters are validated by AcpiWalkResources */
497
498 if (!Uuid || !RetBuffer)
499 {
500 return (AE_BAD_PARAMETER);
501 }
502
503 Info.Uuid = Uuid;
504 Info.Buffer = RetBuffer;
505 Info.Status = AE_NOT_EXIST;
506
507 /* Walk the _CRS or _PRS resource list for this device */
508
509 Status = AcpiWalkResources (DeviceHandle, Name, AcpiRsMatchVendorResource,
510 &Info);
511 if (ACPI_FAILURE (Status))
512 {
513 return (Status);
514 }
515
516 return (Info.Status);
517 }
518
519 ACPI_EXPORT_SYMBOL (AcpiGetVendorResource)
520
521
522 /*******************************************************************************
523 *
524 * FUNCTION: AcpiRsMatchVendorResource
525 *
526 * PARAMETERS: ACPI_WALK_RESOURCE_CALLBACK
527 *
528 * RETURN: Status
529 *
530 * DESCRIPTION: Match a vendor resource via the ACPI 3.0 UUID
531 *
532 ******************************************************************************/
533
534 static ACPI_STATUS
535 AcpiRsMatchVendorResource (
536 ACPI_RESOURCE *Resource,
537 void *Context)
538 {
539 ACPI_VENDOR_WALK_INFO *Info = Context;
540 ACPI_RESOURCE_VENDOR_TYPED *Vendor;
541 ACPI_BUFFER *Buffer;
542 ACPI_STATUS Status;
543
544
545 /* Ignore all descriptors except Vendor */
546
547 if (Resource->Type != ACPI_RESOURCE_TYPE_VENDOR)
548 {
549 return (AE_OK);
550 }
551
552 Vendor = &Resource->Data.VendorTyped;
553
554 /*
555 * For a valid match, these conditions must hold:
556 *
557 * 1) Length of descriptor data must be at least as long as a UUID struct
558 * 2) The UUID subtypes must match
559 * 3) The UUID data must match
560 */
561 if ((Vendor->ByteLength < (ACPI_UUID_LENGTH + 1)) ||
562 (Vendor->UuidSubtype != Info->Uuid->Subtype) ||
563 (ACPI_MEMCMP (Vendor->Uuid, Info->Uuid->Data, ACPI_UUID_LENGTH)))
564 {
565 return (AE_OK);
566 }
567
568 /* Validate/Allocate/Clear caller buffer */
569
570 Buffer = Info->Buffer;
571 Status = AcpiUtInitializeBuffer (Buffer, Resource->Length);
572 if (ACPI_FAILURE (Status))
573 {
574 return (Status);
575 }
576
577 /* Found the correct resource, copy and return it */
578
579 ACPI_MEMCPY (Buffer->Pointer, Resource, Resource->Length);
580 Buffer->Length = Resource->Length;
581
582 /* Found the desired descriptor, terminate resource walk */
583
584 Info->Status = AE_OK;
585 return (AE_CTRL_TERMINATE);
586 }
587
588
589 /*******************************************************************************
590 *
591 * FUNCTION: AcpiWalkResourceBuffer
592 *
593 * PARAMETERS: Buffer - Formatted buffer returned by one of the
594 * various Get*Resource functions
595 * UserFunction - Called for each resource
596 * Context - Passed to UserFunction
597 *
598 * RETURN: Status
599 *
600 * DESCRIPTION: Walks the input resource template. The UserFunction is called
601 * once for each resource in the list.
602 *
603 ******************************************************************************/
604
605 ACPI_STATUS
606 AcpiWalkResourceBuffer (
607 ACPI_BUFFER *Buffer,
608 ACPI_WALK_RESOURCE_CALLBACK UserFunction,
609 void *Context)
610 {
611 ACPI_STATUS Status = AE_OK;
612 ACPI_RESOURCE *Resource;
613 ACPI_RESOURCE *ResourceEnd;
614
615 ACPI_FUNCTION_TRACE (AcpiWalkResourceBuffer);
616
617
618 /* Parameter validation */
619
620 if (!Buffer || !Buffer->Pointer || !UserFunction)
621 {
622 return_ACPI_STATUS (AE_BAD_PARAMETER);
623 }
624
625 /* Buffer contains the resource list and length */
626
627 Resource = ACPI_CAST_PTR (ACPI_RESOURCE, Buffer->Pointer);
628 ResourceEnd = ACPI_ADD_PTR (ACPI_RESOURCE, Buffer->Pointer, Buffer->Length);
629
630 /* Walk the resource list until the EndTag is found (or buffer end) */
631
632 while (Resource < ResourceEnd)
633 {
634 /* Sanity check the resource type */
635
636 if (Resource->Type > ACPI_RESOURCE_TYPE_MAX)
637 {
638 Status = AE_AML_INVALID_RESOURCE_TYPE;
639 break;
640 }
641
642 /* Sanity check the length. It must not be zero, or we loop forever */
643
644 if (!Resource->Length)
645 {
646 return_ACPI_STATUS (AE_AML_BAD_RESOURCE_LENGTH);
647 }
648
649 /* Invoke the user function, abort on any error returned */
650
651 Status = UserFunction (Resource, Context);
652 if (ACPI_FAILURE (Status))
653 {
654 if (Status == AE_CTRL_TERMINATE)
655 {
656 /* This is an OK termination by the user function */
657
658 Status = AE_OK;
659 }
660 break;
661 }
662
663 /* EndTag indicates end-of-list */
664
665 if (Resource->Type == ACPI_RESOURCE_TYPE_END_TAG)
666 {
667 break;
668 }
669
670 /* Get the next resource descriptor */
671
672 Resource = ACPI_NEXT_RESOURCE (Resource);
673 }
674
675 return_ACPI_STATUS (Status);
676 }
677
678 ACPI_EXPORT_SYMBOL (AcpiWalkResourceBuffer)
679
680
681 /*******************************************************************************
682 *
683 * FUNCTION: AcpiWalkResources
684 *
685 * PARAMETERS: DeviceHandle - Handle to the device object for the
686 * device we are querying
687 * Name - Method name of the resources we want.
688 * (METHOD_NAME__CRS, METHOD_NAME__PRS, or
689 * METHOD_NAME__AEI)
690 * UserFunction - Called for each resource
691 * Context - Passed to UserFunction
692 *
693 * RETURN: Status
694 *
695 * DESCRIPTION: Retrieves the current or possible resource list for the
696 * specified device. The UserFunction is called once for
697 * each resource in the list.
698 *
699 ******************************************************************************/
700
701 ACPI_STATUS
702 AcpiWalkResources (
703 ACPI_HANDLE DeviceHandle,
704 const char *Name,
705 ACPI_WALK_RESOURCE_CALLBACK UserFunction,
706 void *Context)
707 {
708 ACPI_STATUS Status;
709 ACPI_BUFFER Buffer;
710
711
712 ACPI_FUNCTION_TRACE (AcpiWalkResources);
713
714
715 /* Parameter validation */
716
717 if (!DeviceHandle || !UserFunction || !Name ||
718 (!ACPI_COMPARE_NAME (Name, METHOD_NAME__CRS) &&
719 !ACPI_COMPARE_NAME (Name, METHOD_NAME__PRS) &&
720 !ACPI_COMPARE_NAME (Name, METHOD_NAME__AEI)))
721 {
722 return_ACPI_STATUS (AE_BAD_PARAMETER);
723 }
724
725 /* Get the _CRS/_PRS/_AEI resource list */
726
727 Buffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
728 Status = AcpiRsGetMethodData (DeviceHandle, __UNCONST(Name), &Buffer);
729 if (ACPI_FAILURE (Status))
730 {
731 return_ACPI_STATUS (Status);
732 }
733
734 /* Walk the resource list and cleanup */
735
736 Status = AcpiWalkResourceBuffer (&Buffer, UserFunction, Context);
737 ACPI_FREE (Buffer.Pointer);
738 return_ACPI_STATUS (Status);
739 }
740
741 ACPI_EXPORT_SYMBOL (AcpiWalkResources)
742