xref: /titanic_51/usr/src/uts/intel/io/acpica/resources/rsxface.c (revision 53a7b6b6763f5865522a76e5e887390a8f4777d7)
1 /*******************************************************************************
2  *
3  * Module Name: rsxface - Public interfaces to the resource manager
4  *              $Revision: 1.49 $
5  *
6  ******************************************************************************/
7 
8 /******************************************************************************
9  *
10  * 1. Copyright Notice
11  *
12  * Some or all of this work - Copyright (c) 1999 - 2008, Intel Corp.
13  * All rights reserved.
14  *
15  * 2. License
16  *
17  * 2.1. This is your license from Intel Corp. under its intellectual property
18  * rights.  You may have additional license terms from the party that provided
19  * you this software, covering your right to use that party's intellectual
20  * property rights.
21  *
22  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
23  * copy of the source code appearing in this file ("Covered Code") an
24  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
25  * base code distributed originally by Intel ("Original Intel Code") to copy,
26  * make derivatives, distribute, use and display any portion of the Covered
27  * Code in any form, with the right to sublicense such rights; and
28  *
29  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
30  * license (with the right to sublicense), under only those claims of Intel
31  * patents that are infringed by the Original Intel Code, to make, use, sell,
32  * offer to sell, and import the Covered Code and derivative works thereof
33  * solely to the minimum extent necessary to exercise the above copyright
34  * license, and in no event shall the patent license extend to any additions
35  * to or modifications of the Original Intel Code.  No other license or right
36  * is granted directly or by implication, estoppel or otherwise;
37  *
38  * The above copyright and patent license is granted only if the following
39  * conditions are met:
40  *
41  * 3. Conditions
42  *
43  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
44  * Redistribution of source code of any substantial portion of the Covered
45  * Code or modification with rights to further distribute source must include
46  * the above Copyright Notice, the above License, this list of Conditions,
47  * and the following Disclaimer and Export Compliance provision.  In addition,
48  * Licensee must cause all Covered Code to which Licensee contributes to
49  * contain a file documenting the changes Licensee made to create that Covered
50  * Code and the date of any change.  Licensee must include in that file the
51  * documentation of any changes made by any predecessor Licensee.  Licensee
52  * must include a prominent statement that the modification is derived,
53  * directly or indirectly, from Original Intel Code.
54  *
55  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
56  * Redistribution of source code of any substantial portion of the Covered
57  * Code or modification without rights to further distribute source must
58  * include the following Disclaimer and Export Compliance provision in the
59  * documentation and/or other materials provided with distribution.  In
60  * addition, Licensee may not authorize further sublicense of source of any
61  * portion of the Covered Code, and must include terms to the effect that the
62  * license from Licensee to its licensee is limited to the intellectual
63  * property embodied in the software Licensee provides to its licensee, and
64  * not to intellectual property embodied in modifications its licensee may
65  * make.
66  *
67  * 3.3. Redistribution of Executable. Redistribution in executable form of any
68  * substantial portion of the Covered Code or modification must reproduce the
69  * above Copyright Notice, and the following Disclaimer and Export Compliance
70  * provision in the documentation and/or other materials provided with the
71  * distribution.
72  *
73  * 3.4. Intel retains all right, title, and interest in and to the Original
74  * Intel Code.
75  *
76  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
77  * Intel shall be used in advertising or otherwise to promote the sale, use or
78  * other dealings in products derived from or relating to the Covered Code
79  * without prior written authorization from Intel.
80  *
81  * 4. Disclaimer and Export Compliance
82  *
83  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
84  * HERE.  ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
85  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT,  ASSISTANCE,
86  * INSTALLATION, TRAINING OR OTHER SERVICES.  INTEL WILL NOT PROVIDE ANY
87  * UPDATES, ENHANCEMENTS OR EXTENSIONS.  INTEL SPECIFICALLY DISCLAIMS ANY
88  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
89  * PARTICULAR PURPOSE.
90  *
91  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
92  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
93  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
94  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
95  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
96  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES.  THESE LIMITATIONS
97  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
98  * LIMITED REMEDY.
99  *
100  * 4.3. Licensee shall not export, either directly or indirectly, any of this
101  * software or system incorporating such software without first obtaining any
102  * required license or other approval from the U. S. Department of Commerce or
103  * any other agency or department of the United States Government.  In the
104  * event Licensee exports any such software from the United States or
105  * re-exports any such software from a foreign destination, Licensee shall
106  * ensure that the distribution and export/re-export of the software is in
107  * compliance with all laws, regulations, orders, or other restrictions of the
108  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
109  * any of its subsidiaries will export/re-export any technical data, process,
110  * software, or service, directly or indirectly, to any country for which the
111  * United States government or any agency thereof requires an export license,
112  * other governmental approval, or letter of assurance, without first obtaining
113  * such license, approval or letter.
114  *
115  *****************************************************************************/
116 
117 
118 #define __RSXFACE_C__
119 
120 #include "acpi.h"
121 #include "acresrc.h"
122 #include "acnamesp.h"
123 
124 #define _COMPONENT          ACPI_RESOURCES
125         ACPI_MODULE_NAME    ("rsxface")
126 
127 /* Local macros for 16,32-bit to 64-bit conversion */
128 
129 #define ACPI_COPY_FIELD(Out, In, Field)  ((Out)->Field = (In)->Field)
130 #define ACPI_COPY_ADDRESS(Out, In)                      \
131     ACPI_COPY_FIELD(Out, In, ResourceType);              \
132     ACPI_COPY_FIELD(Out, In, ProducerConsumer);          \
133     ACPI_COPY_FIELD(Out, In, Decode);                    \
134     ACPI_COPY_FIELD(Out, In, MinAddressFixed);           \
135     ACPI_COPY_FIELD(Out, In, MaxAddressFixed);           \
136     ACPI_COPY_FIELD(Out, In, Info);                      \
137     ACPI_COPY_FIELD(Out, In, Granularity);               \
138     ACPI_COPY_FIELD(Out, In, Minimum);                   \
139     ACPI_COPY_FIELD(Out, In, Maximum);                   \
140     ACPI_COPY_FIELD(Out, In, TranslationOffset);         \
141     ACPI_COPY_FIELD(Out, In, AddressLength);             \
142     ACPI_COPY_FIELD(Out, In, ResourceSource);
143 
144 
145 /* Local prototypes */
146 
147 static ACPI_STATUS
148 AcpiRsMatchVendorResource (
149     ACPI_RESOURCE           *Resource,
150     void                    *Context);
151 
152 static ACPI_STATUS
153 AcpiRsValidateParameters (
154     ACPI_HANDLE             DeviceHandle,
155     ACPI_BUFFER             *Buffer,
156     ACPI_NAMESPACE_NODE     **ReturnNode);
157 
158 
159 /*******************************************************************************
160  *
161  * FUNCTION:    AcpiRsValidateParameters
162  *
163  * PARAMETERS:  DeviceHandle    - Handle to a device
164  *              Buffer          - Pointer to a data buffer
165  *              ReturnNode      - Pointer to where the device node is returned
166  *
167  * RETURN:      Status
168  *
169  * DESCRIPTION: Common parameter validation for resource interfaces
170  *
171  ******************************************************************************/
172 
173 static ACPI_STATUS
174 AcpiRsValidateParameters (
175     ACPI_HANDLE             DeviceHandle,
176     ACPI_BUFFER             *Buffer,
177     ACPI_NAMESPACE_NODE     **ReturnNode)
178 {
179     ACPI_STATUS             Status;
180     ACPI_NAMESPACE_NODE     *Node;
181 
182 
183     ACPI_FUNCTION_TRACE (RsValidateParameters);
184 
185 
186     /*
187      * Must have a valid handle to an ACPI device
188      */
189     if (!DeviceHandle)
190     {
191         return_ACPI_STATUS (AE_BAD_PARAMETER);
192     }
193 
194     Node = AcpiNsMapHandleToNode (DeviceHandle);
195     if (!Node)
196     {
197         return_ACPI_STATUS (AE_BAD_PARAMETER);
198     }
199 
200     if (Node->Type != ACPI_TYPE_DEVICE)
201     {
202         return_ACPI_STATUS (AE_TYPE);
203     }
204 
205     /*
206      * Validate the user buffer object
207      *
208      * if there is a non-zero buffer length we also need a valid pointer in
209      * the buffer. If it's a zero buffer length, we'll be returning the
210      * needed buffer size (later), so keep going.
211      */
212     Status = AcpiUtValidateBuffer (Buffer);
213     if (ACPI_FAILURE (Status))
214     {
215         return_ACPI_STATUS (Status);
216     }
217 
218     *ReturnNode = Node;
219     return_ACPI_STATUS (AE_OK);
220 }
221 
222 
223 /*******************************************************************************
224  *
225  * FUNCTION:    AcpiGetIrqRoutingTable
226  *
227  * PARAMETERS:  DeviceHandle    - Handle to the Bus device we are querying
228  *              RetBuffer       - Pointer to a buffer to receive the
229  *                                current resources for the device
230  *
231  * RETURN:      Status
232  *
233  * DESCRIPTION: This function is called to get the IRQ routing table for a
234  *              specific bus. The caller must first acquire a handle for the
235  *              desired bus. The routine table is placed in the buffer pointed
236  *              to by the RetBuffer variable parameter.
237  *
238  *              If the function fails an appropriate status will be returned
239  *              and the value of RetBuffer is undefined.
240  *
241  *              This function attempts to execute the _PRT method contained in
242  *              the object indicated by the passed DeviceHandle.
243  *
244  ******************************************************************************/
245 
246 ACPI_STATUS
247 AcpiGetIrqRoutingTable  (
248     ACPI_HANDLE             DeviceHandle,
249     ACPI_BUFFER             *RetBuffer)
250 {
251     ACPI_STATUS             Status;
252     ACPI_NAMESPACE_NODE     *Node;
253 
254 
255     ACPI_FUNCTION_TRACE (AcpiGetIrqRoutingTable);
256 
257 
258     /* Validate parameters then dispatch to internal routine */
259 
260     Status = AcpiRsValidateParameters (DeviceHandle, RetBuffer, &Node);
261     if (ACPI_FAILURE (Status))
262     {
263         return_ACPI_STATUS (Status);
264     }
265 
266     Status = AcpiRsGetPrtMethodData (Node, RetBuffer);
267     return_ACPI_STATUS (Status);
268 }
269 
270 ACPI_EXPORT_SYMBOL (AcpiGetIrqRoutingTable)
271 
272 
273 /*******************************************************************************
274  *
275  * FUNCTION:    AcpiGetCurrentResources
276  *
277  * PARAMETERS:  DeviceHandle    - Handle to the device object for the
278  *                                device we are querying
279  *              RetBuffer       - Pointer to a buffer to receive the
280  *                                current resources for the device
281  *
282  * RETURN:      Status
283  *
284  * DESCRIPTION: This function is called to get the current resources for a
285  *              specific device. The caller must first acquire a handle for
286  *              the desired device. The resource data is placed in the buffer
287  *              pointed to by the RetBuffer variable parameter.
288  *
289  *              If the function fails an appropriate status will be returned
290  *              and the value of RetBuffer is undefined.
291  *
292  *              This function attempts to execute the _CRS method contained in
293  *              the object indicated by the passed DeviceHandle.
294  *
295  ******************************************************************************/
296 
297 ACPI_STATUS
298 AcpiGetCurrentResources (
299     ACPI_HANDLE             DeviceHandle,
300     ACPI_BUFFER             *RetBuffer)
301 {
302     ACPI_STATUS             Status;
303     ACPI_NAMESPACE_NODE     *Node;
304 
305 
306     ACPI_FUNCTION_TRACE (AcpiGetCurrentResources);
307 
308 
309     /* Validate parameters then dispatch to internal routine */
310 
311     Status = AcpiRsValidateParameters (DeviceHandle, RetBuffer, &Node);
312     if (ACPI_FAILURE (Status))
313     {
314         return_ACPI_STATUS (Status);
315     }
316 
317     Status = AcpiRsGetCrsMethodData (Node, RetBuffer);
318     return_ACPI_STATUS (Status);
319 }
320 
321 ACPI_EXPORT_SYMBOL (AcpiGetCurrentResources)
322 
323 
324 /*******************************************************************************
325  *
326  * FUNCTION:    AcpiGetPossibleResources
327  *
328  * PARAMETERS:  DeviceHandle    - Handle to the device object for the
329  *                                device we are querying
330  *              RetBuffer       - Pointer to a buffer to receive the
331  *                                resources for the device
332  *
333  * RETURN:      Status
334  *
335  * DESCRIPTION: This function is called to get a list of the possible resources
336  *              for a specific device. The caller must first acquire a handle
337  *              for the desired device. The resource data is placed in the
338  *              buffer pointed to by the RetBuffer variable.
339  *
340  *              If the function fails an appropriate status will be returned
341  *              and the value of RetBuffer is undefined.
342  *
343  ******************************************************************************/
344 
345 ACPI_STATUS
346 AcpiGetPossibleResources (
347     ACPI_HANDLE             DeviceHandle,
348     ACPI_BUFFER             *RetBuffer)
349 {
350     ACPI_STATUS             Status;
351     ACPI_NAMESPACE_NODE     *Node;
352 
353 
354     ACPI_FUNCTION_TRACE (AcpiGetPossibleResources);
355 
356 
357     /* Validate parameters then dispatch to internal routine */
358 
359     Status = AcpiRsValidateParameters (DeviceHandle, RetBuffer, &Node);
360     if (ACPI_FAILURE (Status))
361     {
362         return_ACPI_STATUS (Status);
363     }
364 
365     Status = AcpiRsGetPrsMethodData (Node, RetBuffer);
366     return_ACPI_STATUS (Status);
367 }
368 
369 ACPI_EXPORT_SYMBOL (AcpiGetPossibleResources)
370 
371 
372 /*******************************************************************************
373  *
374  * FUNCTION:    AcpiSetCurrentResources
375  *
376  * PARAMETERS:  DeviceHandle    - Handle to the device object for the
377  *                                device we are setting resources
378  *              InBuffer        - Pointer to a buffer containing the
379  *                                resources to be set for the device
380  *
381  * RETURN:      Status
382  *
383  * DESCRIPTION: This function is called to set the current resources for a
384  *              specific device. The caller must first acquire a handle for
385  *              the desired device. The resource data is passed to the routine
386  *              the buffer pointed to by the InBuffer variable.
387  *
388  ******************************************************************************/
389 
390 ACPI_STATUS
391 AcpiSetCurrentResources (
392     ACPI_HANDLE             DeviceHandle,
393     ACPI_BUFFER             *InBuffer)
394 {
395     ACPI_STATUS             Status;
396     ACPI_NAMESPACE_NODE     *Node;
397 
398 
399     ACPI_FUNCTION_TRACE (AcpiSetCurrentResources);
400 
401 
402     /* Validate the buffer, don't allow zero length */
403 
404     if ((!InBuffer) ||
405         (!InBuffer->Pointer) ||
406         (!InBuffer->Length))
407     {
408         return_ACPI_STATUS (AE_BAD_PARAMETER);
409     }
410 
411     /* Validate parameters then dispatch to internal routine */
412 
413     Status = AcpiRsValidateParameters (DeviceHandle, InBuffer, &Node);
414     if (ACPI_FAILURE (Status))
415     {
416         return_ACPI_STATUS (Status);
417     }
418 
419     Status = AcpiRsSetSrsMethodData (Node, InBuffer);
420     return_ACPI_STATUS (Status);
421 }
422 
423 ACPI_EXPORT_SYMBOL (AcpiSetCurrentResources)
424 
425 
426 /******************************************************************************
427  *
428  * FUNCTION:    AcpiResourceToAddress64
429  *
430  * PARAMETERS:  Resource        - Pointer to a resource
431  *              Out             - Pointer to the users's return buffer
432  *                                (a struct acpi_resource_address64)
433  *
434  * RETURN:      Status
435  *
436  * DESCRIPTION: If the resource is an address16, address32, or address64,
437  *              copy it to the address64 return buffer. This saves the
438  *              caller from having to duplicate code for different-sized
439  *              addresses.
440  *
441  ******************************************************************************/
442 
443 ACPI_STATUS
444 AcpiResourceToAddress64 (
445     ACPI_RESOURCE               *Resource,
446     ACPI_RESOURCE_ADDRESS64     *Out)
447 {
448     ACPI_RESOURCE_ADDRESS16     *Address16;
449     ACPI_RESOURCE_ADDRESS32     *Address32;
450 
451 
452     if (!Resource || !Out)
453     {
454         return (AE_BAD_PARAMETER);
455     }
456 
457     /* Convert 16 or 32 address descriptor to 64 */
458 
459     switch (Resource->Type)
460     {
461     case ACPI_RESOURCE_TYPE_ADDRESS16:
462 
463         Address16 = (ACPI_RESOURCE_ADDRESS16 *) &Resource->Data;
464         ACPI_COPY_ADDRESS (Out, Address16);
465         break;
466 
467     case ACPI_RESOURCE_TYPE_ADDRESS32:
468 
469         Address32 = (ACPI_RESOURCE_ADDRESS32 *) &Resource->Data;
470         ACPI_COPY_ADDRESS (Out, Address32);
471         break;
472 
473     case ACPI_RESOURCE_TYPE_ADDRESS64:
474 
475         /* Simple copy for 64 bit source */
476 
477         ACPI_MEMCPY (Out, &Resource->Data, sizeof (ACPI_RESOURCE_ADDRESS64));
478         break;
479 
480     default:
481         return (AE_BAD_PARAMETER);
482     }
483 
484     return (AE_OK);
485 }
486 
487 ACPI_EXPORT_SYMBOL (AcpiResourceToAddress64)
488 
489 
490 /*******************************************************************************
491  *
492  * FUNCTION:    AcpiGetVendorResource
493  *
494  * PARAMETERS:  DeviceHandle    - Handle for the parent device object
495  *              Name            - Method name for the parent resource
496  *                                (METHOD_NAME__CRS or METHOD_NAME__PRS)
497  *              Uuid            - Pointer to the UUID to be matched.
498  *                                includes both subtype and 16-byte UUID
499  *              RetBuffer       - Where the vendor resource is returned
500  *
501  * RETURN:      Status
502  *
503  * DESCRIPTION: Walk a resource template for the specified evice to find a
504  *              vendor-defined resource that matches the supplied UUID and
505  *              UUID subtype. Returns a ACPI_RESOURCE of type Vendor.
506  *
507  ******************************************************************************/
508 
509 ACPI_STATUS
510 AcpiGetVendorResource (
511     ACPI_HANDLE             DeviceHandle,
512     char                    *Name,
513     ACPI_VENDOR_UUID        *Uuid,
514     ACPI_BUFFER             *RetBuffer)
515 {
516     ACPI_VENDOR_WALK_INFO   Info;
517     ACPI_STATUS             Status;
518 
519 
520     /* Other parameters are validated by AcpiWalkResources */
521 
522     if (!Uuid || !RetBuffer)
523     {
524         return (AE_BAD_PARAMETER);
525     }
526 
527     Info.Uuid = Uuid;
528     Info.Buffer = RetBuffer;
529     Info.Status = AE_NOT_EXIST;
530 
531     /* Walk the _CRS or _PRS resource list for this device */
532 
533     Status = AcpiWalkResources (DeviceHandle, Name, AcpiRsMatchVendorResource,
534                 &Info);
535     if (ACPI_FAILURE (Status))
536     {
537         return (Status);
538     }
539 
540     return (Info.Status);
541 }
542 
543 ACPI_EXPORT_SYMBOL (AcpiGetVendorResource)
544 
545 
546 /*******************************************************************************
547  *
548  * FUNCTION:    AcpiRsMatchVendorResource
549  *
550  * PARAMETERS:  ACPI_WALK_RESOURCE_CALLBACK
551  *
552  * RETURN:      Status
553  *
554  * DESCRIPTION: Match a vendor resource via the ACPI 3.0 UUID
555  *
556  ******************************************************************************/
557 
558 static ACPI_STATUS
559 AcpiRsMatchVendorResource (
560     ACPI_RESOURCE           *Resource,
561     void                    *Context)
562 {
563     ACPI_VENDOR_WALK_INFO       *Info = Context;
564     ACPI_RESOURCE_VENDOR_TYPED  *Vendor;
565     ACPI_BUFFER                 *Buffer;
566     ACPI_STATUS                 Status;
567 
568 
569     /* Ignore all descriptors except Vendor */
570 
571     if (Resource->Type != ACPI_RESOURCE_TYPE_VENDOR)
572     {
573         return (AE_OK);
574     }
575 
576     Vendor = &Resource->Data.VendorTyped;
577 
578     /*
579      * For a valid match, these conditions must hold:
580      *
581      * 1) Length of descriptor data must be at least as long as a UUID struct
582      * 2) The UUID subtypes must match
583      * 3) The UUID data must match
584      */
585     if ((Vendor->ByteLength < (ACPI_UUID_LENGTH + 1)) ||
586         (Vendor->UuidSubtype != Info->Uuid->Subtype)  ||
587         (ACPI_MEMCMP (Vendor->Uuid, Info->Uuid->Data, ACPI_UUID_LENGTH)))
588     {
589         return (AE_OK);
590     }
591 
592     /* Validate/Allocate/Clear caller buffer */
593 
594     Buffer = Info->Buffer;
595     Status = AcpiUtInitializeBuffer (Buffer, Resource->Length);
596     if (ACPI_FAILURE (Status))
597     {
598         return (Status);
599     }
600 
601     /* Found the correct resource, copy and return it */
602 
603     ACPI_MEMCPY (Buffer->Pointer, Resource, Resource->Length);
604     Buffer->Length = Resource->Length;
605 
606     /* Found the desired descriptor, terminate resource walk */
607 
608     Info->Status = AE_OK;
609     return (AE_CTRL_TERMINATE);
610 }
611 
612 
613 /*******************************************************************************
614  *
615  * FUNCTION:    AcpiWalkResources
616  *
617  * PARAMETERS:  DeviceHandle    - Handle to the device object for the
618  *                                device we are querying
619  *              Name            - Method name of the resources we want
620  *                                (METHOD_NAME__CRS or METHOD_NAME__PRS)
621  *              UserFunction    - Called for each resource
622  *              Context         - Passed to UserFunction
623  *
624  * RETURN:      Status
625  *
626  * DESCRIPTION: Retrieves the current or possible resource list for the
627  *              specified device. The UserFunction is called once for
628  *              each resource in the list.
629  *
630  ******************************************************************************/
631 
632 ACPI_STATUS
633 AcpiWalkResources (
634     ACPI_HANDLE                 DeviceHandle,
635     char                        *Name,
636     ACPI_WALK_RESOURCE_CALLBACK UserFunction,
637     void                        *Context)
638 {
639     ACPI_STATUS                 Status;
640     ACPI_BUFFER                 Buffer;
641     ACPI_RESOURCE               *Resource;
642     ACPI_RESOURCE               *ResourceEnd;
643 
644 
645     ACPI_FUNCTION_TRACE (AcpiWalkResources);
646 
647 
648     /* Parameter validation */
649 
650     if (!DeviceHandle || !UserFunction || !Name ||
651         (!ACPI_COMPARE_NAME (Name, METHOD_NAME__CRS) &&
652          !ACPI_COMPARE_NAME (Name, METHOD_NAME__PRS)))
653     {
654         return_ACPI_STATUS (AE_BAD_PARAMETER);
655     }
656 
657     /* Get the _CRS or _PRS resource list */
658 
659     Buffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
660     Status = AcpiRsGetMethodData (DeviceHandle, Name, &Buffer);
661     if (ACPI_FAILURE (Status))
662     {
663         return_ACPI_STATUS (Status);
664     }
665 
666     /* Buffer now contains the resource list */
667 
668     Resource = ACPI_CAST_PTR (ACPI_RESOURCE, Buffer.Pointer);
669     ResourceEnd = ACPI_ADD_PTR (ACPI_RESOURCE, Buffer.Pointer, Buffer.Length);
670 
671     /* Walk the resource list until the EndTag is found (or buffer end) */
672 
673     while (Resource < ResourceEnd)
674     {
675         /* Sanity check the resource */
676 
677         if (Resource->Type > ACPI_RESOURCE_TYPE_MAX)
678         {
679             Status = AE_AML_INVALID_RESOURCE_TYPE;
680             break;
681         }
682 
683         /* Invoke the user function, abort on any error returned */
684 
685         Status = UserFunction (Resource, Context);
686         if (ACPI_FAILURE (Status))
687         {
688             if (Status == AE_CTRL_TERMINATE)
689             {
690                 /* This is an OK termination by the user function */
691 
692                 Status = AE_OK;
693             }
694             break;
695         }
696 
697         /* EndTag indicates end-of-list */
698 
699         if (Resource->Type == ACPI_RESOURCE_TYPE_END_TAG)
700         {
701             break;
702         }
703 
704         /* Get the next resource descriptor */
705 
706         Resource = ACPI_ADD_PTR (ACPI_RESOURCE, Resource, Resource->Length);
707     }
708 
709     ACPI_FREE (Buffer.Pointer);
710     return_ACPI_STATUS (Status);
711 }
712 
713 ACPI_EXPORT_SYMBOL (AcpiWalkResources)
714