1 /******************************************************************************* 2 * 3 * Module Name: rsutils - Utilities for the resource manager 4 * 5 ******************************************************************************/ 6 7 /****************************************************************************** 8 * 9 * 1. Copyright Notice 10 * 11 * Some or all of this work - Copyright (c) 1999 - 2017, Intel Corp. 12 * All rights reserved. 13 * 14 * 2. License 15 * 16 * 2.1. This is your license from Intel Corp. under its intellectual property 17 * rights. You may have additional license terms from the party that provided 18 * you this software, covering your right to use that party's intellectual 19 * property rights. 20 * 21 * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a 22 * copy of the source code appearing in this file ("Covered Code") an 23 * irrevocable, perpetual, worldwide license under Intel's copyrights in the 24 * base code distributed originally by Intel ("Original Intel Code") to copy, 25 * make derivatives, distribute, use and display any portion of the Covered 26 * Code in any form, with the right to sublicense such rights; and 27 * 28 * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent 29 * license (with the right to sublicense), under only those claims of Intel 30 * patents that are infringed by the Original Intel Code, to make, use, sell, 31 * offer to sell, and import the Covered Code and derivative works thereof 32 * solely to the minimum extent necessary to exercise the above copyright 33 * license, and in no event shall the patent license extend to any additions 34 * to or modifications of the Original Intel Code. No other license or right 35 * is granted directly or by implication, estoppel or otherwise; 36 * 37 * The above copyright and patent license is granted only if the following 38 * conditions are met: 39 * 40 * 3. Conditions 41 * 42 * 3.1. Redistribution of Source with Rights to Further Distribute Source. 43 * Redistribution of source code of any substantial portion of the Covered 44 * Code or modification with rights to further distribute source must include 45 * the above Copyright Notice, the above License, this list of Conditions, 46 * and the following Disclaimer and Export Compliance provision. In addition, 47 * Licensee must cause all Covered Code to which Licensee contributes to 48 * contain a file documenting the changes Licensee made to create that Covered 49 * Code and the date of any change. Licensee must include in that file the 50 * documentation of any changes made by any predecessor Licensee. Licensee 51 * must include a prominent statement that the modification is derived, 52 * directly or indirectly, from Original Intel Code. 53 * 54 * 3.2. Redistribution of Source with no Rights to Further Distribute Source. 55 * Redistribution of source code of any substantial portion of the Covered 56 * Code or modification without rights to further distribute source must 57 * include the following Disclaimer and Export Compliance provision in the 58 * documentation and/or other materials provided with distribution. In 59 * addition, Licensee may not authorize further sublicense of source of any 60 * portion of the Covered Code, and must include terms to the effect that the 61 * license from Licensee to its licensee is limited to the intellectual 62 * property embodied in the software Licensee provides to its licensee, and 63 * not to intellectual property embodied in modifications its licensee may 64 * make. 65 * 66 * 3.3. Redistribution of Executable. Redistribution in executable form of any 67 * substantial portion of the Covered Code or modification must reproduce the 68 * above Copyright Notice, and the following Disclaimer and Export Compliance 69 * provision in the documentation and/or other materials provided with the 70 * distribution. 71 * 72 * 3.4. Intel retains all right, title, and interest in and to the Original 73 * Intel Code. 74 * 75 * 3.5. Neither the name Intel nor any other trademark owned or controlled by 76 * Intel shall be used in advertising or otherwise to promote the sale, use or 77 * other dealings in products derived from or relating to the Covered Code 78 * without prior written authorization from Intel. 79 * 80 * 4. Disclaimer and Export Compliance 81 * 82 * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED 83 * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE 84 * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, 85 * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY 86 * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY 87 * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A 88 * PARTICULAR PURPOSE. 89 * 90 * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES 91 * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR 92 * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, 93 * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY 94 * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL 95 * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS 96 * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY 97 * LIMITED REMEDY. 98 * 99 * 4.3. Licensee shall not export, either directly or indirectly, any of this 100 * software or system incorporating such software without first obtaining any 101 * required license or other approval from the U. S. Department of Commerce or 102 * any other agency or department of the United States Government. In the 103 * event Licensee exports any such software from the United States or 104 * re-exports any such software from a foreign destination, Licensee shall 105 * ensure that the distribution and export/re-export of the software is in 106 * compliance with all laws, regulations, orders, or other restrictions of the 107 * U.S. Export Administration Regulations. Licensee agrees that neither it nor 108 * any of its subsidiaries will export/re-export any technical data, process, 109 * software, or service, directly or indirectly, to any country for which the 110 * United States government or any agency thereof requires an export license, 111 * other governmental approval, or letter of assurance, without first obtaining 112 * such license, approval or letter. 113 * 114 ***************************************************************************** 115 * 116 * Alternatively, you may choose to be licensed under the terms of the 117 * following license: 118 * 119 * Redistribution and use in source and binary forms, with or without 120 * modification, are permitted provided that the following conditions 121 * are met: 122 * 1. Redistributions of source code must retain the above copyright 123 * notice, this list of conditions, and the following disclaimer, 124 * without modification. 125 * 2. Redistributions in binary form must reproduce at minimum a disclaimer 126 * substantially similar to the "NO WARRANTY" disclaimer below 127 * ("Disclaimer") and any redistribution must be conditioned upon 128 * including a substantially similar Disclaimer requirement for further 129 * binary redistribution. 130 * 3. Neither the names of the above-listed copyright holders nor the names 131 * of any contributors may be used to endorse or promote products derived 132 * from this software without specific prior written permission. 133 * 134 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 135 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 136 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 137 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 138 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 139 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 140 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 141 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 142 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 143 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 144 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 145 * 146 * Alternatively, you may choose to be licensed under the terms of the 147 * GNU General Public License ("GPL") version 2 as published by the Free 148 * Software Foundation. 149 * 150 *****************************************************************************/ 151 152 #include <contrib/dev/acpica/include/acpi.h> 153 #include <contrib/dev/acpica/include/accommon.h> 154 #include <contrib/dev/acpica/include/acnamesp.h> 155 #include <contrib/dev/acpica/include/acresrc.h> 156 157 158 #define _COMPONENT ACPI_RESOURCES 159 ACPI_MODULE_NAME ("rsutils") 160 161 162 /******************************************************************************* 163 * 164 * FUNCTION: AcpiRsDecodeBitmask 165 * 166 * PARAMETERS: Mask - Bitmask to decode 167 * List - Where the converted list is returned 168 * 169 * RETURN: Count of bits set (length of list) 170 * 171 * DESCRIPTION: Convert a bit mask into a list of values 172 * 173 ******************************************************************************/ 174 175 UINT8 176 AcpiRsDecodeBitmask ( 177 UINT16 Mask, 178 UINT8 *List) 179 { 180 UINT8 i; 181 UINT8 BitCount; 182 183 184 ACPI_FUNCTION_ENTRY (); 185 186 187 /* Decode the mask bits */ 188 189 for (i = 0, BitCount = 0; Mask; i++) 190 { 191 if (Mask & 0x0001) 192 { 193 List[BitCount] = i; 194 BitCount++; 195 } 196 197 Mask >>= 1; 198 } 199 200 return (BitCount); 201 } 202 203 204 /******************************************************************************* 205 * 206 * FUNCTION: AcpiRsEncodeBitmask 207 * 208 * PARAMETERS: List - List of values to encode 209 * Count - Length of list 210 * 211 * RETURN: Encoded bitmask 212 * 213 * DESCRIPTION: Convert a list of values to an encoded bitmask 214 * 215 ******************************************************************************/ 216 217 UINT16 218 AcpiRsEncodeBitmask ( 219 UINT8 *List, 220 UINT8 Count) 221 { 222 UINT32 i; 223 UINT16 Mask; 224 225 226 ACPI_FUNCTION_ENTRY (); 227 228 229 /* Encode the list into a single bitmask */ 230 231 for (i = 0, Mask = 0; i < Count; i++) 232 { 233 Mask |= (0x1 << List[i]); 234 } 235 236 return (Mask); 237 } 238 239 240 /******************************************************************************* 241 * 242 * FUNCTION: AcpiRsMoveData 243 * 244 * PARAMETERS: Destination - Pointer to the destination descriptor 245 * Source - Pointer to the source descriptor 246 * ItemCount - How many items to move 247 * MoveType - Byte width 248 * 249 * RETURN: None 250 * 251 * DESCRIPTION: Move multiple data items from one descriptor to another. Handles 252 * alignment issues and endian issues if necessary, as configured 253 * via the ACPI_MOVE_* macros. (This is why a memcpy is not used) 254 * 255 ******************************************************************************/ 256 257 void 258 AcpiRsMoveData ( 259 void *Destination, 260 void *Source, 261 UINT16 ItemCount, 262 UINT8 MoveType) 263 { 264 UINT32 i; 265 266 267 ACPI_FUNCTION_ENTRY (); 268 269 270 /* One move per item */ 271 272 for (i = 0; i < ItemCount; i++) 273 { 274 switch (MoveType) 275 { 276 /* 277 * For the 8-bit case, we can perform the move all at once 278 * since there are no alignment or endian issues 279 */ 280 case ACPI_RSC_MOVE8: 281 case ACPI_RSC_MOVE_GPIO_RES: 282 case ACPI_RSC_MOVE_SERIAL_VEN: 283 case ACPI_RSC_MOVE_SERIAL_RES: 284 285 memcpy (Destination, Source, ItemCount); 286 return; 287 288 /* 289 * 16-, 32-, and 64-bit cases must use the move macros that perform 290 * endian conversion and/or accommodate hardware that cannot perform 291 * misaligned memory transfers 292 */ 293 case ACPI_RSC_MOVE16: 294 case ACPI_RSC_MOVE_GPIO_PIN: 295 296 ACPI_MOVE_16_TO_16 ( 297 &ACPI_CAST_PTR (UINT16, Destination)[i], 298 &ACPI_CAST_PTR (UINT16, Source)[i]); 299 break; 300 301 case ACPI_RSC_MOVE32: 302 303 ACPI_MOVE_32_TO_32 ( 304 &ACPI_CAST_PTR (UINT32, Destination)[i], 305 &ACPI_CAST_PTR (UINT32, Source)[i]); 306 break; 307 308 case ACPI_RSC_MOVE64: 309 310 ACPI_MOVE_64_TO_64 ( 311 &ACPI_CAST_PTR (UINT64, Destination)[i], 312 &ACPI_CAST_PTR (UINT64, Source)[i]); 313 break; 314 315 default: 316 317 return; 318 } 319 } 320 } 321 322 323 /******************************************************************************* 324 * 325 * FUNCTION: AcpiRsSetResourceLength 326 * 327 * PARAMETERS: TotalLength - Length of the AML descriptor, including 328 * the header and length fields. 329 * Aml - Pointer to the raw AML descriptor 330 * 331 * RETURN: None 332 * 333 * DESCRIPTION: Set the ResourceLength field of an AML 334 * resource descriptor, both Large and Small descriptors are 335 * supported automatically. Note: Descriptor Type field must 336 * be valid. 337 * 338 ******************************************************************************/ 339 340 void 341 AcpiRsSetResourceLength ( 342 ACPI_RSDESC_SIZE TotalLength, 343 AML_RESOURCE *Aml) 344 { 345 ACPI_RS_LENGTH ResourceLength; 346 347 348 ACPI_FUNCTION_ENTRY (); 349 350 351 /* Length is the total descriptor length minus the header length */ 352 353 ResourceLength = (ACPI_RS_LENGTH) 354 (TotalLength - AcpiUtGetResourceHeaderLength (Aml)); 355 356 /* Length is stored differently for large and small descriptors */ 357 358 if (Aml->SmallHeader.DescriptorType & ACPI_RESOURCE_NAME_LARGE) 359 { 360 /* Large descriptor -- bytes 1-2 contain the 16-bit length */ 361 362 ACPI_MOVE_16_TO_16 ( 363 &Aml->LargeHeader.ResourceLength, &ResourceLength); 364 } 365 else 366 { 367 /* 368 * Small descriptor -- bits 2:0 of byte 0 contain the length 369 * Clear any existing length, preserving descriptor type bits 370 */ 371 Aml->SmallHeader.DescriptorType = (UINT8) 372 ((Aml->SmallHeader.DescriptorType & 373 ~ACPI_RESOURCE_NAME_SMALL_LENGTH_MASK) 374 | ResourceLength); 375 } 376 } 377 378 379 /******************************************************************************* 380 * 381 * FUNCTION: AcpiRsSetResourceHeader 382 * 383 * PARAMETERS: DescriptorType - Byte to be inserted as the type 384 * TotalLength - Length of the AML descriptor, including 385 * the header and length fields. 386 * Aml - Pointer to the raw AML descriptor 387 * 388 * RETURN: None 389 * 390 * DESCRIPTION: Set the DescriptorType and ResourceLength fields of an AML 391 * resource descriptor, both Large and Small descriptors are 392 * supported automatically 393 * 394 ******************************************************************************/ 395 396 void 397 AcpiRsSetResourceHeader ( 398 UINT8 DescriptorType, 399 ACPI_RSDESC_SIZE TotalLength, 400 AML_RESOURCE *Aml) 401 { 402 ACPI_FUNCTION_ENTRY (); 403 404 405 /* Set the Resource Type */ 406 407 Aml->SmallHeader.DescriptorType = DescriptorType; 408 409 /* Set the Resource Length */ 410 411 AcpiRsSetResourceLength (TotalLength, Aml); 412 } 413 414 415 /******************************************************************************* 416 * 417 * FUNCTION: AcpiRsStrcpy 418 * 419 * PARAMETERS: Destination - Pointer to the destination string 420 * Source - Pointer to the source string 421 * 422 * RETURN: String length, including NULL terminator 423 * 424 * DESCRIPTION: Local string copy that returns the string length, saving a 425 * strcpy followed by a strlen. 426 * 427 ******************************************************************************/ 428 429 static UINT16 430 AcpiRsStrcpy ( 431 char *Destination, 432 char *Source) 433 { 434 UINT16 i; 435 436 437 ACPI_FUNCTION_ENTRY (); 438 439 440 for (i = 0; Source[i]; i++) 441 { 442 Destination[i] = Source[i]; 443 } 444 445 Destination[i] = 0; 446 447 /* Return string length including the NULL terminator */ 448 449 return ((UINT16) (i + 1)); 450 } 451 452 453 /******************************************************************************* 454 * 455 * FUNCTION: AcpiRsGetResourceSource 456 * 457 * PARAMETERS: ResourceLength - Length field of the descriptor 458 * MinimumLength - Minimum length of the descriptor (minus 459 * any optional fields) 460 * ResourceSource - Where the ResourceSource is returned 461 * Aml - Pointer to the raw AML descriptor 462 * StringPtr - (optional) where to store the actual 463 * ResourceSource string 464 * 465 * RETURN: Length of the string plus NULL terminator, rounded up to native 466 * word boundary 467 * 468 * DESCRIPTION: Copy the optional ResourceSource data from a raw AML descriptor 469 * to an internal resource descriptor 470 * 471 ******************************************************************************/ 472 473 ACPI_RS_LENGTH 474 AcpiRsGetResourceSource ( 475 ACPI_RS_LENGTH ResourceLength, 476 ACPI_RS_LENGTH MinimumLength, 477 ACPI_RESOURCE_SOURCE *ResourceSource, 478 AML_RESOURCE *Aml, 479 char *StringPtr) 480 { 481 ACPI_RSDESC_SIZE TotalLength; 482 UINT8 *AmlResourceSource; 483 484 485 ACPI_FUNCTION_ENTRY (); 486 487 488 TotalLength = ResourceLength + sizeof (AML_RESOURCE_LARGE_HEADER); 489 AmlResourceSource = ACPI_ADD_PTR (UINT8, Aml, MinimumLength); 490 491 /* 492 * ResourceSource is present if the length of the descriptor is longer 493 * than the minimum length. 494 * 495 * Note: Some resource descriptors will have an additional null, so 496 * we add 1 to the minimum length. 497 */ 498 if (TotalLength > (ACPI_RSDESC_SIZE) (MinimumLength + 1)) 499 { 500 /* Get the ResourceSourceIndex */ 501 502 ResourceSource->Index = AmlResourceSource[0]; 503 504 ResourceSource->StringPtr = StringPtr; 505 if (!StringPtr) 506 { 507 /* 508 * String destination pointer is not specified; Set the String 509 * pointer to the end of the current ResourceSource structure. 510 */ 511 ResourceSource->StringPtr = ACPI_ADD_PTR ( 512 char, ResourceSource, sizeof (ACPI_RESOURCE_SOURCE)); 513 } 514 515 /* 516 * In order for the Resource length to be a multiple of the native 517 * word, calculate the length of the string (+1 for NULL terminator) 518 * and expand to the next word multiple. 519 * 520 * Zero the entire area of the buffer. 521 */ 522 TotalLength = (UINT32) strlen ( 523 ACPI_CAST_PTR (char, &AmlResourceSource[1])) + 1; 524 525 TotalLength = (UINT32) ACPI_ROUND_UP_TO_NATIVE_WORD (TotalLength); 526 527 memset (ResourceSource->StringPtr, 0, TotalLength); 528 529 /* Copy the ResourceSource string to the destination */ 530 531 ResourceSource->StringLength = AcpiRsStrcpy ( 532 ResourceSource->StringPtr, 533 ACPI_CAST_PTR (char, &AmlResourceSource[1])); 534 535 return ((ACPI_RS_LENGTH) TotalLength); 536 } 537 538 /* ResourceSource is not present */ 539 540 ResourceSource->Index = 0; 541 ResourceSource->StringLength = 0; 542 ResourceSource->StringPtr = NULL; 543 return (0); 544 } 545 546 547 /******************************************************************************* 548 * 549 * FUNCTION: AcpiRsSetResourceSource 550 * 551 * PARAMETERS: Aml - Pointer to the raw AML descriptor 552 * MinimumLength - Minimum length of the descriptor (minus 553 * any optional fields) 554 * ResourceSource - Internal ResourceSource 555 556 * 557 * RETURN: Total length of the AML descriptor 558 * 559 * DESCRIPTION: Convert an optional ResourceSource from internal format to a 560 * raw AML resource descriptor 561 * 562 ******************************************************************************/ 563 564 ACPI_RSDESC_SIZE 565 AcpiRsSetResourceSource ( 566 AML_RESOURCE *Aml, 567 ACPI_RS_LENGTH MinimumLength, 568 ACPI_RESOURCE_SOURCE *ResourceSource) 569 { 570 UINT8 *AmlResourceSource; 571 ACPI_RSDESC_SIZE DescriptorLength; 572 573 574 ACPI_FUNCTION_ENTRY (); 575 576 577 DescriptorLength = MinimumLength; 578 579 /* Non-zero string length indicates presence of a ResourceSource */ 580 581 if (ResourceSource->StringLength) 582 { 583 /* Point to the end of the AML descriptor */ 584 585 AmlResourceSource = ACPI_ADD_PTR (UINT8, Aml, MinimumLength); 586 587 /* Copy the ResourceSourceIndex */ 588 589 AmlResourceSource[0] = (UINT8) ResourceSource->Index; 590 591 /* Copy the ResourceSource string */ 592 593 strcpy (ACPI_CAST_PTR (char, &AmlResourceSource[1]), 594 ResourceSource->StringPtr); 595 596 /* 597 * Add the length of the string (+ 1 for null terminator) to the 598 * final descriptor length 599 */ 600 DescriptorLength += ((ACPI_RSDESC_SIZE) 601 ResourceSource->StringLength + 1); 602 } 603 604 /* Return the new total length of the AML descriptor */ 605 606 return (DescriptorLength); 607 } 608 609 610 /******************************************************************************* 611 * 612 * FUNCTION: AcpiRsGetPrtMethodData 613 * 614 * PARAMETERS: Node - Device node 615 * RetBuffer - Pointer to a buffer structure for the 616 * results 617 * 618 * RETURN: Status 619 * 620 * DESCRIPTION: This function is called to get the _PRT value of an object 621 * contained in an object specified by the handle passed in 622 * 623 * If the function fails an appropriate status will be returned 624 * and the contents of the callers buffer is undefined. 625 * 626 ******************************************************************************/ 627 628 ACPI_STATUS 629 AcpiRsGetPrtMethodData ( 630 ACPI_NAMESPACE_NODE *Node, 631 ACPI_BUFFER *RetBuffer) 632 { 633 ACPI_OPERAND_OBJECT *ObjDesc; 634 ACPI_STATUS Status; 635 636 637 ACPI_FUNCTION_TRACE (RsGetPrtMethodData); 638 639 640 /* Parameters guaranteed valid by caller */ 641 642 /* Execute the method, no parameters */ 643 644 Status = AcpiUtEvaluateObject ( 645 Node, METHOD_NAME__PRT, ACPI_BTYPE_PACKAGE, &ObjDesc); 646 if (ACPI_FAILURE (Status)) 647 { 648 return_ACPI_STATUS (Status); 649 } 650 651 /* 652 * Create a resource linked list from the byte stream buffer that comes 653 * back from the _CRS method execution. 654 */ 655 Status = AcpiRsCreatePciRoutingTable (ObjDesc, RetBuffer); 656 657 /* On exit, we must delete the object returned by EvaluateObject */ 658 659 AcpiUtRemoveReference (ObjDesc); 660 return_ACPI_STATUS (Status); 661 } 662 663 664 /******************************************************************************* 665 * 666 * FUNCTION: AcpiRsGetCrsMethodData 667 * 668 * PARAMETERS: Node - Device node 669 * RetBuffer - Pointer to a buffer structure for the 670 * results 671 * 672 * RETURN: Status 673 * 674 * DESCRIPTION: This function is called to get the _CRS value of an object 675 * contained in an object specified by the handle passed in 676 * 677 * If the function fails an appropriate status will be returned 678 * and the contents of the callers buffer is undefined. 679 * 680 ******************************************************************************/ 681 682 ACPI_STATUS 683 AcpiRsGetCrsMethodData ( 684 ACPI_NAMESPACE_NODE *Node, 685 ACPI_BUFFER *RetBuffer) 686 { 687 ACPI_OPERAND_OBJECT *ObjDesc; 688 ACPI_STATUS Status; 689 690 691 ACPI_FUNCTION_TRACE (RsGetCrsMethodData); 692 693 694 /* Parameters guaranteed valid by caller */ 695 696 /* Execute the method, no parameters */ 697 698 Status = AcpiUtEvaluateObject ( 699 Node, METHOD_NAME__CRS, ACPI_BTYPE_BUFFER, &ObjDesc); 700 if (ACPI_FAILURE (Status)) 701 { 702 return_ACPI_STATUS (Status); 703 } 704 705 /* 706 * Make the call to create a resource linked list from the 707 * byte stream buffer that comes back from the _CRS method 708 * execution. 709 */ 710 Status = AcpiRsCreateResourceList (ObjDesc, RetBuffer); 711 712 /* On exit, we must delete the object returned by evaluateObject */ 713 714 AcpiUtRemoveReference (ObjDesc); 715 return_ACPI_STATUS (Status); 716 } 717 718 719 /******************************************************************************* 720 * 721 * FUNCTION: AcpiRsGetPrsMethodData 722 * 723 * PARAMETERS: Node - Device node 724 * RetBuffer - Pointer to a buffer structure for the 725 * results 726 * 727 * RETURN: Status 728 * 729 * DESCRIPTION: This function is called to get the _PRS value of an object 730 * contained in an object specified by the handle passed in 731 * 732 * If the function fails an appropriate status will be returned 733 * and the contents of the callers buffer is undefined. 734 * 735 ******************************************************************************/ 736 737 ACPI_STATUS 738 AcpiRsGetPrsMethodData ( 739 ACPI_NAMESPACE_NODE *Node, 740 ACPI_BUFFER *RetBuffer) 741 { 742 ACPI_OPERAND_OBJECT *ObjDesc; 743 ACPI_STATUS Status; 744 745 746 ACPI_FUNCTION_TRACE (RsGetPrsMethodData); 747 748 749 /* Parameters guaranteed valid by caller */ 750 751 /* Execute the method, no parameters */ 752 753 Status = AcpiUtEvaluateObject ( 754 Node, METHOD_NAME__PRS, ACPI_BTYPE_BUFFER, &ObjDesc); 755 if (ACPI_FAILURE (Status)) 756 { 757 return_ACPI_STATUS (Status); 758 } 759 760 /* 761 * Make the call to create a resource linked list from the 762 * byte stream buffer that comes back from the _CRS method 763 * execution. 764 */ 765 Status = AcpiRsCreateResourceList (ObjDesc, RetBuffer); 766 767 /* On exit, we must delete the object returned by evaluateObject */ 768 769 AcpiUtRemoveReference (ObjDesc); 770 return_ACPI_STATUS (Status); 771 } 772 773 774 /******************************************************************************* 775 * 776 * FUNCTION: AcpiRsGetAeiMethodData 777 * 778 * PARAMETERS: Node - Device node 779 * RetBuffer - Pointer to a buffer structure for the 780 * results 781 * 782 * RETURN: Status 783 * 784 * DESCRIPTION: This function is called to get the _AEI value of an object 785 * contained in an object specified by the handle passed in 786 * 787 * If the function fails an appropriate status will be returned 788 * and the contents of the callers buffer is undefined. 789 * 790 ******************************************************************************/ 791 792 ACPI_STATUS 793 AcpiRsGetAeiMethodData ( 794 ACPI_NAMESPACE_NODE *Node, 795 ACPI_BUFFER *RetBuffer) 796 { 797 ACPI_OPERAND_OBJECT *ObjDesc; 798 ACPI_STATUS Status; 799 800 801 ACPI_FUNCTION_TRACE (RsGetAeiMethodData); 802 803 804 /* Parameters guaranteed valid by caller */ 805 806 /* Execute the method, no parameters */ 807 808 Status = AcpiUtEvaluateObject ( 809 Node, METHOD_NAME__AEI, ACPI_BTYPE_BUFFER, &ObjDesc); 810 if (ACPI_FAILURE (Status)) 811 { 812 return_ACPI_STATUS (Status); 813 } 814 815 /* 816 * Make the call to create a resource linked list from the 817 * byte stream buffer that comes back from the _CRS method 818 * execution. 819 */ 820 Status = AcpiRsCreateResourceList (ObjDesc, RetBuffer); 821 822 /* On exit, we must delete the object returned by evaluateObject */ 823 824 AcpiUtRemoveReference (ObjDesc); 825 return_ACPI_STATUS (Status); 826 } 827 828 829 /******************************************************************************* 830 * 831 * FUNCTION: AcpiRsGetMethodData 832 * 833 * PARAMETERS: Handle - Handle to the containing object 834 * Path - Path to method, relative to Handle 835 * RetBuffer - Pointer to a buffer structure for the 836 * results 837 * 838 * RETURN: Status 839 * 840 * DESCRIPTION: This function is called to get the _CRS or _PRS value of an 841 * object contained in an object specified by the handle passed in 842 * 843 * If the function fails an appropriate status will be returned 844 * and the contents of the callers buffer is undefined. 845 * 846 ******************************************************************************/ 847 848 ACPI_STATUS 849 AcpiRsGetMethodData ( 850 ACPI_HANDLE Handle, 851 const char *Path, 852 ACPI_BUFFER *RetBuffer) 853 { 854 ACPI_OPERAND_OBJECT *ObjDesc; 855 ACPI_STATUS Status; 856 857 858 ACPI_FUNCTION_TRACE (RsGetMethodData); 859 860 861 /* Parameters guaranteed valid by caller */ 862 863 /* Execute the method, no parameters */ 864 865 Status = AcpiUtEvaluateObject ( 866 ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, Handle), 867 Path, ACPI_BTYPE_BUFFER, &ObjDesc); 868 if (ACPI_FAILURE (Status)) 869 { 870 return_ACPI_STATUS (Status); 871 } 872 873 /* 874 * Make the call to create a resource linked list from the 875 * byte stream buffer that comes back from the method 876 * execution. 877 */ 878 Status = AcpiRsCreateResourceList (ObjDesc, RetBuffer); 879 880 /* On exit, we must delete the object returned by EvaluateObject */ 881 882 AcpiUtRemoveReference (ObjDesc); 883 return_ACPI_STATUS (Status); 884 } 885 886 887 /******************************************************************************* 888 * 889 * FUNCTION: AcpiRsSetSrsMethodData 890 * 891 * PARAMETERS: Node - Device node 892 * InBuffer - Pointer to a buffer structure of the 893 * parameter 894 * 895 * RETURN: Status 896 * 897 * DESCRIPTION: This function is called to set the _SRS of an object contained 898 * in an object specified by the handle passed in 899 * 900 * If the function fails an appropriate status will be returned 901 * and the contents of the callers buffer is undefined. 902 * 903 * Note: Parameters guaranteed valid by caller 904 * 905 ******************************************************************************/ 906 907 ACPI_STATUS 908 AcpiRsSetSrsMethodData ( 909 ACPI_NAMESPACE_NODE *Node, 910 ACPI_BUFFER *InBuffer) 911 { 912 ACPI_EVALUATE_INFO *Info; 913 ACPI_OPERAND_OBJECT *Args[2]; 914 ACPI_STATUS Status; 915 ACPI_BUFFER Buffer; 916 917 918 ACPI_FUNCTION_TRACE (RsSetSrsMethodData); 919 920 921 /* Allocate and initialize the evaluation information block */ 922 923 Info = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_EVALUATE_INFO)); 924 if (!Info) 925 { 926 return_ACPI_STATUS (AE_NO_MEMORY); 927 } 928 929 Info->PrefixNode = Node; 930 Info->RelativePathname = METHOD_NAME__SRS; 931 Info->Parameters = Args; 932 Info->Flags = ACPI_IGNORE_RETURN_VALUE; 933 934 /* 935 * The InBuffer parameter will point to a linked list of 936 * resource parameters. It needs to be formatted into a 937 * byte stream to be sent in as an input parameter to _SRS 938 * 939 * Convert the linked list into a byte stream 940 */ 941 Buffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER; 942 Status = AcpiRsCreateAmlResources (InBuffer, &Buffer); 943 if (ACPI_FAILURE (Status)) 944 { 945 goto Cleanup; 946 } 947 948 /* Create and initialize the method parameter object */ 949 950 Args[0] = AcpiUtCreateInternalObject (ACPI_TYPE_BUFFER); 951 if (!Args[0]) 952 { 953 /* 954 * Must free the buffer allocated above (otherwise it is freed 955 * later) 956 */ 957 ACPI_FREE (Buffer.Pointer); 958 Status = AE_NO_MEMORY; 959 goto Cleanup; 960 } 961 962 Args[0]->Buffer.Length = (UINT32) Buffer.Length; 963 Args[0]->Buffer.Pointer = Buffer.Pointer; 964 Args[0]->Common.Flags = AOPOBJ_DATA_VALID; 965 Args[1] = NULL; 966 967 /* Execute the method, no return value is expected */ 968 969 Status = AcpiNsEvaluate (Info); 970 971 /* Clean up and return the status from AcpiNsEvaluate */ 972 973 AcpiUtRemoveReference (Args[0]); 974 975 Cleanup: 976 ACPI_FREE (Info); 977 return_ACPI_STATUS (Status); 978 } 979