1 /******************************************************************************* 2 * 3 * Module Name: rsxface - Public interfaces to the resource manager 4 * 5 ******************************************************************************/ 6 7 /* 8 * Copyright (C) 2000 - 2014, 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 616 ACPI_FUNCTION_TRACE (AcpiWalkResourceBuffer); 617 618 619 /* Parameter validation */ 620 621 if (!Buffer || !Buffer->Pointer || !UserFunction) 622 { 623 return_ACPI_STATUS (AE_BAD_PARAMETER); 624 } 625 626 /* Buffer contains the resource list and length */ 627 628 Resource = ACPI_CAST_PTR (ACPI_RESOURCE, Buffer->Pointer); 629 ResourceEnd = ACPI_ADD_PTR (ACPI_RESOURCE, Buffer->Pointer, Buffer->Length); 630 631 /* Walk the resource list until the EndTag is found (or buffer end) */ 632 633 while (Resource < ResourceEnd) 634 { 635 /* Sanity check the resource type */ 636 637 if (Resource->Type > ACPI_RESOURCE_TYPE_MAX) 638 { 639 Status = AE_AML_INVALID_RESOURCE_TYPE; 640 break; 641 } 642 643 /* Sanity check the length. It must not be zero, or we loop forever */ 644 645 if (!Resource->Length) 646 { 647 return_ACPI_STATUS (AE_AML_BAD_RESOURCE_LENGTH); 648 } 649 650 /* Invoke the user function, abort on any error returned */ 651 652 Status = UserFunction (Resource, Context); 653 if (ACPI_FAILURE (Status)) 654 { 655 if (Status == AE_CTRL_TERMINATE) 656 { 657 /* This is an OK termination by the user function */ 658 659 Status = AE_OK; 660 } 661 break; 662 } 663 664 /* EndTag indicates end-of-list */ 665 666 if (Resource->Type == ACPI_RESOURCE_TYPE_END_TAG) 667 { 668 break; 669 } 670 671 /* Get the next resource descriptor */ 672 673 Resource = ACPI_NEXT_RESOURCE (Resource); 674 } 675 676 return_ACPI_STATUS (Status); 677 } 678 679 ACPI_EXPORT_SYMBOL (AcpiWalkResourceBuffer) 680 681 682 /******************************************************************************* 683 * 684 * FUNCTION: AcpiWalkResources 685 * 686 * PARAMETERS: DeviceHandle - Handle to the device object for the 687 * device we are querying 688 * Name - Method name of the resources we want. 689 * (METHOD_NAME__CRS, METHOD_NAME__PRS, or 690 * METHOD_NAME__AEI) 691 * UserFunction - Called for each resource 692 * Context - Passed to UserFunction 693 * 694 * RETURN: Status 695 * 696 * DESCRIPTION: Retrieves the current or possible resource list for the 697 * specified device. The UserFunction is called once for 698 * each resource in the list. 699 * 700 ******************************************************************************/ 701 702 ACPI_STATUS 703 AcpiWalkResources ( 704 ACPI_HANDLE DeviceHandle, 705 char *Name, 706 ACPI_WALK_RESOURCE_CALLBACK UserFunction, 707 void *Context) 708 { 709 ACPI_STATUS Status; 710 ACPI_BUFFER Buffer; 711 712 713 ACPI_FUNCTION_TRACE (AcpiWalkResources); 714 715 716 /* Parameter validation */ 717 718 if (!DeviceHandle || !UserFunction || !Name || 719 (!ACPI_COMPARE_NAME (Name, METHOD_NAME__CRS) && 720 !ACPI_COMPARE_NAME (Name, METHOD_NAME__PRS) && 721 !ACPI_COMPARE_NAME (Name, METHOD_NAME__AEI))) 722 { 723 return_ACPI_STATUS (AE_BAD_PARAMETER); 724 } 725 726 /* Get the _CRS/_PRS/_AEI resource list */ 727 728 Buffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER; 729 Status = AcpiRsGetMethodData (DeviceHandle, Name, &Buffer); 730 if (ACPI_FAILURE (Status)) 731 { 732 return_ACPI_STATUS (Status); 733 } 734 735 /* Walk the resource list and cleanup */ 736 737 Status = AcpiWalkResourceBuffer (&Buffer, UserFunction, Context); 738 ACPI_FREE (Buffer.Pointer); 739 return_ACPI_STATUS (Status); 740 } 741 742 ACPI_EXPORT_SYMBOL (AcpiWalkResources)