1 /******************************************************************************* 2 * 3 * Module Name: rsutils - Utilities for 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 #include <acpi/acpi.h> 45 #include "accommon.h" 46 #include "acnamesp.h" 47 #include "acresrc.h" 48 49 #define _COMPONENT ACPI_RESOURCES 50 ACPI_MODULE_NAME("rsutils") 51 52 /******************************************************************************* 53 * 54 * FUNCTION: acpi_rs_decode_bitmask 55 * 56 * PARAMETERS: mask - Bitmask to decode 57 * list - Where the converted list is returned 58 * 59 * RETURN: Count of bits set (length of list) 60 * 61 * DESCRIPTION: Convert a bit mask into a list of values 62 * 63 ******************************************************************************/ 64 u8 acpi_rs_decode_bitmask(u16 mask, u8 * list) 65 { 66 u8 i; 67 u8 bit_count; 68 69 ACPI_FUNCTION_ENTRY(); 70 71 /* Decode the mask bits */ 72 73 for (i = 0, bit_count = 0; mask; i++) { 74 if (mask & 0x0001) { 75 list[bit_count] = i; 76 bit_count++; 77 } 78 79 mask >>= 1; 80 } 81 82 return (bit_count); 83 } 84 85 /******************************************************************************* 86 * 87 * FUNCTION: acpi_rs_encode_bitmask 88 * 89 * PARAMETERS: list - List of values to encode 90 * count - Length of list 91 * 92 * RETURN: Encoded bitmask 93 * 94 * DESCRIPTION: Convert a list of values to an encoded bitmask 95 * 96 ******************************************************************************/ 97 98 u16 acpi_rs_encode_bitmask(u8 * list, u8 count) 99 { 100 u32 i; 101 u16 mask; 102 103 ACPI_FUNCTION_ENTRY(); 104 105 /* Encode the list into a single bitmask */ 106 107 for (i = 0, mask = 0; i < count; i++) { 108 mask |= (0x1 << list[i]); 109 } 110 111 return (mask); 112 } 113 114 /******************************************************************************* 115 * 116 * FUNCTION: acpi_rs_move_data 117 * 118 * PARAMETERS: destination - Pointer to the destination descriptor 119 * source - Pointer to the source descriptor 120 * item_count - How many items to move 121 * move_type - Byte width 122 * 123 * RETURN: None 124 * 125 * DESCRIPTION: Move multiple data items from one descriptor to another. Handles 126 * alignment issues and endian issues if necessary, as configured 127 * via the ACPI_MOVE_* macros. (This is why a memcpy is not used) 128 * 129 ******************************************************************************/ 130 131 void 132 acpi_rs_move_data(void *destination, void *source, u16 item_count, u8 move_type) 133 { 134 u32 i; 135 136 ACPI_FUNCTION_ENTRY(); 137 138 /* One move per item */ 139 140 for (i = 0; i < item_count; i++) { 141 switch (move_type) { 142 /* 143 * For the 8-bit case, we can perform the move all at once 144 * since there are no alignment or endian issues 145 */ 146 case ACPI_RSC_MOVE8: 147 case ACPI_RSC_MOVE_GPIO_RES: 148 case ACPI_RSC_MOVE_SERIAL_VEN: 149 case ACPI_RSC_MOVE_SERIAL_RES: 150 151 ACPI_MEMCPY(destination, source, item_count); 152 return; 153 154 /* 155 * 16-, 32-, and 64-bit cases must use the move macros that perform 156 * endian conversion and/or accommodate hardware that cannot perform 157 * misaligned memory transfers 158 */ 159 case ACPI_RSC_MOVE16: 160 case ACPI_RSC_MOVE_GPIO_PIN: 161 162 ACPI_MOVE_16_TO_16(&ACPI_CAST_PTR(u16, destination)[i], 163 &ACPI_CAST_PTR(u16, source)[i]); 164 break; 165 166 case ACPI_RSC_MOVE32: 167 168 ACPI_MOVE_32_TO_32(&ACPI_CAST_PTR(u32, destination)[i], 169 &ACPI_CAST_PTR(u32, source)[i]); 170 break; 171 172 case ACPI_RSC_MOVE64: 173 174 ACPI_MOVE_64_TO_64(&ACPI_CAST_PTR(u64, destination)[i], 175 &ACPI_CAST_PTR(u64, source)[i]); 176 break; 177 178 default: 179 180 return; 181 } 182 } 183 } 184 185 /******************************************************************************* 186 * 187 * FUNCTION: acpi_rs_set_resource_length 188 * 189 * PARAMETERS: total_length - Length of the AML descriptor, including 190 * the header and length fields. 191 * aml - Pointer to the raw AML descriptor 192 * 193 * RETURN: None 194 * 195 * DESCRIPTION: Set the resource_length field of an AML 196 * resource descriptor, both Large and Small descriptors are 197 * supported automatically. Note: Descriptor Type field must 198 * be valid. 199 * 200 ******************************************************************************/ 201 202 void 203 acpi_rs_set_resource_length(acpi_rsdesc_size total_length, 204 union aml_resource *aml) 205 { 206 acpi_rs_length resource_length; 207 208 ACPI_FUNCTION_ENTRY(); 209 210 /* Length is the total descriptor length minus the header length */ 211 212 resource_length = (acpi_rs_length) 213 (total_length - acpi_ut_get_resource_header_length(aml)); 214 215 /* Length is stored differently for large and small descriptors */ 216 217 if (aml->small_header.descriptor_type & ACPI_RESOURCE_NAME_LARGE) { 218 219 /* Large descriptor -- bytes 1-2 contain the 16-bit length */ 220 221 ACPI_MOVE_16_TO_16(&aml->large_header.resource_length, 222 &resource_length); 223 } else { 224 /* Small descriptor -- bits 2:0 of byte 0 contain the length */ 225 226 aml->small_header.descriptor_type = (u8) 227 228 /* Clear any existing length, preserving descriptor type bits */ 229 ((aml->small_header. 230 descriptor_type & ~ACPI_RESOURCE_NAME_SMALL_LENGTH_MASK) 231 232 | resource_length); 233 } 234 } 235 236 /******************************************************************************* 237 * 238 * FUNCTION: acpi_rs_set_resource_header 239 * 240 * PARAMETERS: descriptor_type - Byte to be inserted as the type 241 * total_length - Length of the AML descriptor, including 242 * the header and length fields. 243 * aml - Pointer to the raw AML descriptor 244 * 245 * RETURN: None 246 * 247 * DESCRIPTION: Set the descriptor_type and resource_length fields of an AML 248 * resource descriptor, both Large and Small descriptors are 249 * supported automatically 250 * 251 ******************************************************************************/ 252 253 void 254 acpi_rs_set_resource_header(u8 descriptor_type, 255 acpi_rsdesc_size total_length, 256 union aml_resource *aml) 257 { 258 ACPI_FUNCTION_ENTRY(); 259 260 /* Set the Resource Type */ 261 262 aml->small_header.descriptor_type = descriptor_type; 263 264 /* Set the Resource Length */ 265 266 acpi_rs_set_resource_length(total_length, aml); 267 } 268 269 /******************************************************************************* 270 * 271 * FUNCTION: acpi_rs_strcpy 272 * 273 * PARAMETERS: destination - Pointer to the destination string 274 * source - Pointer to the source string 275 * 276 * RETURN: String length, including NULL terminator 277 * 278 * DESCRIPTION: Local string copy that returns the string length, saving a 279 * strcpy followed by a strlen. 280 * 281 ******************************************************************************/ 282 283 static u16 acpi_rs_strcpy(char *destination, char *source) 284 { 285 u16 i; 286 287 ACPI_FUNCTION_ENTRY(); 288 289 for (i = 0; source[i]; i++) { 290 destination[i] = source[i]; 291 } 292 293 destination[i] = 0; 294 295 /* Return string length including the NULL terminator */ 296 297 return ((u16) (i + 1)); 298 } 299 300 /******************************************************************************* 301 * 302 * FUNCTION: acpi_rs_get_resource_source 303 * 304 * PARAMETERS: resource_length - Length field of the descriptor 305 * minimum_length - Minimum length of the descriptor (minus 306 * any optional fields) 307 * resource_source - Where the resource_source is returned 308 * aml - Pointer to the raw AML descriptor 309 * string_ptr - (optional) where to store the actual 310 * resource_source string 311 * 312 * RETURN: Length of the string plus NULL terminator, rounded up to native 313 * word boundary 314 * 315 * DESCRIPTION: Copy the optional resource_source data from a raw AML descriptor 316 * to an internal resource descriptor 317 * 318 ******************************************************************************/ 319 320 acpi_rs_length 321 acpi_rs_get_resource_source(acpi_rs_length resource_length, 322 acpi_rs_length minimum_length, 323 struct acpi_resource_source * resource_source, 324 union aml_resource * aml, char *string_ptr) 325 { 326 acpi_rsdesc_size total_length; 327 u8 *aml_resource_source; 328 329 ACPI_FUNCTION_ENTRY(); 330 331 total_length = 332 resource_length + sizeof(struct aml_resource_large_header); 333 aml_resource_source = ACPI_ADD_PTR(u8, aml, minimum_length); 334 335 /* 336 * resource_source is present if the length of the descriptor is longer than 337 * the minimum length. 338 * 339 * Note: Some resource descriptors will have an additional null, so 340 * we add 1 to the minimum length. 341 */ 342 if (total_length > (acpi_rsdesc_size) (minimum_length + 1)) { 343 344 /* Get the resource_source_index */ 345 346 resource_source->index = aml_resource_source[0]; 347 348 resource_source->string_ptr = string_ptr; 349 if (!string_ptr) { 350 /* 351 * String destination pointer is not specified; Set the String 352 * pointer to the end of the current resource_source structure. 353 */ 354 resource_source->string_ptr = 355 ACPI_ADD_PTR(char, resource_source, 356 sizeof(struct acpi_resource_source)); 357 } 358 359 /* 360 * In order for the Resource length to be a multiple of the native 361 * word, calculate the length of the string (+1 for NULL terminator) 362 * and expand to the next word multiple. 363 * 364 * Zero the entire area of the buffer. 365 */ 366 total_length = 367 (u32) 368 ACPI_STRLEN(ACPI_CAST_PTR(char, &aml_resource_source[1])) + 369 1; 370 total_length = (u32) ACPI_ROUND_UP_TO_NATIVE_WORD(total_length); 371 372 ACPI_MEMSET(resource_source->string_ptr, 0, total_length); 373 374 /* Copy the resource_source string to the destination */ 375 376 resource_source->string_length = 377 acpi_rs_strcpy(resource_source->string_ptr, 378 ACPI_CAST_PTR(char, 379 &aml_resource_source[1])); 380 381 return ((acpi_rs_length) total_length); 382 } 383 384 /* resource_source is not present */ 385 386 resource_source->index = 0; 387 resource_source->string_length = 0; 388 resource_source->string_ptr = NULL; 389 return (0); 390 } 391 392 /******************************************************************************* 393 * 394 * FUNCTION: acpi_rs_set_resource_source 395 * 396 * PARAMETERS: aml - Pointer to the raw AML descriptor 397 * minimum_length - Minimum length of the descriptor (minus 398 * any optional fields) 399 * resource_source - Internal resource_source 400 401 * 402 * RETURN: Total length of the AML descriptor 403 * 404 * DESCRIPTION: Convert an optional resource_source from internal format to a 405 * raw AML resource descriptor 406 * 407 ******************************************************************************/ 408 409 acpi_rsdesc_size 410 acpi_rs_set_resource_source(union aml_resource * aml, 411 acpi_rs_length minimum_length, 412 struct acpi_resource_source * resource_source) 413 { 414 u8 *aml_resource_source; 415 acpi_rsdesc_size descriptor_length; 416 417 ACPI_FUNCTION_ENTRY(); 418 419 descriptor_length = minimum_length; 420 421 /* Non-zero string length indicates presence of a resource_source */ 422 423 if (resource_source->string_length) { 424 425 /* Point to the end of the AML descriptor */ 426 427 aml_resource_source = ACPI_ADD_PTR(u8, aml, minimum_length); 428 429 /* Copy the resource_source_index */ 430 431 aml_resource_source[0] = (u8) resource_source->index; 432 433 /* Copy the resource_source string */ 434 435 ACPI_STRCPY(ACPI_CAST_PTR(char, &aml_resource_source[1]), 436 resource_source->string_ptr); 437 438 /* 439 * Add the length of the string (+ 1 for null terminator) to the 440 * final descriptor length 441 */ 442 descriptor_length += 443 ((acpi_rsdesc_size) resource_source->string_length + 1); 444 } 445 446 /* Return the new total length of the AML descriptor */ 447 448 return (descriptor_length); 449 } 450 451 /******************************************************************************* 452 * 453 * FUNCTION: acpi_rs_get_prt_method_data 454 * 455 * PARAMETERS: node - Device node 456 * ret_buffer - Pointer to a buffer structure for the 457 * results 458 * 459 * RETURN: Status 460 * 461 * DESCRIPTION: This function is called to get the _PRT value of an object 462 * contained in an object specified by the handle passed in 463 * 464 * If the function fails an appropriate status will be returned 465 * and the contents of the callers buffer is undefined. 466 * 467 ******************************************************************************/ 468 469 acpi_status 470 acpi_rs_get_prt_method_data(struct acpi_namespace_node * node, 471 struct acpi_buffer * ret_buffer) 472 { 473 union acpi_operand_object *obj_desc; 474 acpi_status status; 475 476 ACPI_FUNCTION_TRACE(rs_get_prt_method_data); 477 478 /* Parameters guaranteed valid by caller */ 479 480 /* Execute the method, no parameters */ 481 482 status = acpi_ut_evaluate_object(node, METHOD_NAME__PRT, 483 ACPI_BTYPE_PACKAGE, &obj_desc); 484 if (ACPI_FAILURE(status)) { 485 return_ACPI_STATUS(status); 486 } 487 488 /* 489 * Create a resource linked list from the byte stream buffer that comes 490 * back from the _CRS method execution. 491 */ 492 status = acpi_rs_create_pci_routing_table(obj_desc, ret_buffer); 493 494 /* On exit, we must delete the object returned by evaluate_object */ 495 496 acpi_ut_remove_reference(obj_desc); 497 return_ACPI_STATUS(status); 498 } 499 500 /******************************************************************************* 501 * 502 * FUNCTION: acpi_rs_get_crs_method_data 503 * 504 * PARAMETERS: node - Device node 505 * ret_buffer - Pointer to a buffer structure for the 506 * results 507 * 508 * RETURN: Status 509 * 510 * DESCRIPTION: This function is called to get the _CRS value of an object 511 * contained in an object specified by the handle passed in 512 * 513 * If the function fails an appropriate status will be returned 514 * and the contents of the callers buffer is undefined. 515 * 516 ******************************************************************************/ 517 518 acpi_status 519 acpi_rs_get_crs_method_data(struct acpi_namespace_node *node, 520 struct acpi_buffer *ret_buffer) 521 { 522 union acpi_operand_object *obj_desc; 523 acpi_status status; 524 525 ACPI_FUNCTION_TRACE(rs_get_crs_method_data); 526 527 /* Parameters guaranteed valid by caller */ 528 529 /* Execute the method, no parameters */ 530 531 status = acpi_ut_evaluate_object(node, METHOD_NAME__CRS, 532 ACPI_BTYPE_BUFFER, &obj_desc); 533 if (ACPI_FAILURE(status)) { 534 return_ACPI_STATUS(status); 535 } 536 537 /* 538 * Make the call to create a resource linked list from the 539 * byte stream buffer that comes back from the _CRS method 540 * execution. 541 */ 542 status = acpi_rs_create_resource_list(obj_desc, ret_buffer); 543 544 /* On exit, we must delete the object returned by evaluateObject */ 545 546 acpi_ut_remove_reference(obj_desc); 547 return_ACPI_STATUS(status); 548 } 549 550 /******************************************************************************* 551 * 552 * FUNCTION: acpi_rs_get_prs_method_data 553 * 554 * PARAMETERS: node - Device node 555 * ret_buffer - Pointer to a buffer structure for the 556 * results 557 * 558 * RETURN: Status 559 * 560 * DESCRIPTION: This function is called to get the _PRS value of an object 561 * contained in an object specified by the handle passed in 562 * 563 * If the function fails an appropriate status will be returned 564 * and the contents of the callers buffer is undefined. 565 * 566 ******************************************************************************/ 567 568 #ifdef ACPI_FUTURE_USAGE 569 acpi_status 570 acpi_rs_get_prs_method_data(struct acpi_namespace_node *node, 571 struct acpi_buffer *ret_buffer) 572 { 573 union acpi_operand_object *obj_desc; 574 acpi_status status; 575 576 ACPI_FUNCTION_TRACE(rs_get_prs_method_data); 577 578 /* Parameters guaranteed valid by caller */ 579 580 /* Execute the method, no parameters */ 581 582 status = acpi_ut_evaluate_object(node, METHOD_NAME__PRS, 583 ACPI_BTYPE_BUFFER, &obj_desc); 584 if (ACPI_FAILURE(status)) { 585 return_ACPI_STATUS(status); 586 } 587 588 /* 589 * Make the call to create a resource linked list from the 590 * byte stream buffer that comes back from the _CRS method 591 * execution. 592 */ 593 status = acpi_rs_create_resource_list(obj_desc, ret_buffer); 594 595 /* On exit, we must delete the object returned by evaluateObject */ 596 597 acpi_ut_remove_reference(obj_desc); 598 return_ACPI_STATUS(status); 599 } 600 #endif /* ACPI_FUTURE_USAGE */ 601 602 /******************************************************************************* 603 * 604 * FUNCTION: acpi_rs_get_aei_method_data 605 * 606 * PARAMETERS: node - Device node 607 * ret_buffer - Pointer to a buffer structure for the 608 * results 609 * 610 * RETURN: Status 611 * 612 * DESCRIPTION: This function is called to get the _AEI value of an object 613 * contained in an object specified by the handle passed in 614 * 615 * If the function fails an appropriate status will be returned 616 * and the contents of the callers buffer is undefined. 617 * 618 ******************************************************************************/ 619 620 acpi_status 621 acpi_rs_get_aei_method_data(struct acpi_namespace_node *node, 622 struct acpi_buffer *ret_buffer) 623 { 624 union acpi_operand_object *obj_desc; 625 acpi_status status; 626 627 ACPI_FUNCTION_TRACE(rs_get_aei_method_data); 628 629 /* Parameters guaranteed valid by caller */ 630 631 /* Execute the method, no parameters */ 632 633 status = acpi_ut_evaluate_object(node, METHOD_NAME__AEI, 634 ACPI_BTYPE_BUFFER, &obj_desc); 635 if (ACPI_FAILURE(status)) { 636 return_ACPI_STATUS(status); 637 } 638 639 /* 640 * Make the call to create a resource linked list from the 641 * byte stream buffer that comes back from the _CRS method 642 * execution. 643 */ 644 status = acpi_rs_create_resource_list(obj_desc, ret_buffer); 645 646 /* On exit, we must delete the object returned by evaluateObject */ 647 648 acpi_ut_remove_reference(obj_desc); 649 return_ACPI_STATUS(status); 650 } 651 652 /******************************************************************************* 653 * 654 * FUNCTION: acpi_rs_get_method_data 655 * 656 * PARAMETERS: handle - Handle to the containing object 657 * path - Path to method, relative to Handle 658 * ret_buffer - Pointer to a buffer structure for the 659 * results 660 * 661 * RETURN: Status 662 * 663 * DESCRIPTION: This function is called to get the _CRS or _PRS value of an 664 * object contained in an object specified by the handle passed in 665 * 666 * If the function fails an appropriate status will be returned 667 * and the contents of the callers buffer is undefined. 668 * 669 ******************************************************************************/ 670 671 acpi_status 672 acpi_rs_get_method_data(acpi_handle handle, 673 char *path, struct acpi_buffer *ret_buffer) 674 { 675 union acpi_operand_object *obj_desc; 676 acpi_status status; 677 678 ACPI_FUNCTION_TRACE(rs_get_method_data); 679 680 /* Parameters guaranteed valid by caller */ 681 682 /* Execute the method, no parameters */ 683 684 status = 685 acpi_ut_evaluate_object(ACPI_CAST_PTR 686 (struct acpi_namespace_node, handle), path, 687 ACPI_BTYPE_BUFFER, &obj_desc); 688 if (ACPI_FAILURE(status)) { 689 return_ACPI_STATUS(status); 690 } 691 692 /* 693 * Make the call to create a resource linked list from the 694 * byte stream buffer that comes back from the method 695 * execution. 696 */ 697 status = acpi_rs_create_resource_list(obj_desc, ret_buffer); 698 699 /* On exit, we must delete the object returned by evaluate_object */ 700 701 acpi_ut_remove_reference(obj_desc); 702 return_ACPI_STATUS(status); 703 } 704 705 /******************************************************************************* 706 * 707 * FUNCTION: acpi_rs_set_srs_method_data 708 * 709 * PARAMETERS: node - Device node 710 * in_buffer - Pointer to a buffer structure of the 711 * parameter 712 * 713 * RETURN: Status 714 * 715 * DESCRIPTION: This function is called to set the _SRS of an object contained 716 * in an object specified by the handle passed in 717 * 718 * If the function fails an appropriate status will be returned 719 * and the contents of the callers buffer is undefined. 720 * 721 * Note: Parameters guaranteed valid by caller 722 * 723 ******************************************************************************/ 724 725 acpi_status 726 acpi_rs_set_srs_method_data(struct acpi_namespace_node *node, 727 struct acpi_buffer *in_buffer) 728 { 729 struct acpi_evaluate_info *info; 730 union acpi_operand_object *args[2]; 731 acpi_status status; 732 struct acpi_buffer buffer; 733 734 ACPI_FUNCTION_TRACE(rs_set_srs_method_data); 735 736 /* Allocate and initialize the evaluation information block */ 737 738 info = ACPI_ALLOCATE_ZEROED(sizeof(struct acpi_evaluate_info)); 739 if (!info) { 740 return_ACPI_STATUS(AE_NO_MEMORY); 741 } 742 743 info->prefix_node = node; 744 info->relative_pathname = METHOD_NAME__SRS; 745 info->parameters = args; 746 info->flags = ACPI_IGNORE_RETURN_VALUE; 747 748 /* 749 * The in_buffer parameter will point to a linked list of 750 * resource parameters. It needs to be formatted into a 751 * byte stream to be sent in as an input parameter to _SRS 752 * 753 * Convert the linked list into a byte stream 754 */ 755 buffer.length = ACPI_ALLOCATE_LOCAL_BUFFER; 756 status = acpi_rs_create_aml_resources(in_buffer->pointer, &buffer); 757 if (ACPI_FAILURE(status)) { 758 goto cleanup; 759 } 760 761 /* Create and initialize the method parameter object */ 762 763 args[0] = acpi_ut_create_internal_object(ACPI_TYPE_BUFFER); 764 if (!args[0]) { 765 /* 766 * Must free the buffer allocated above (otherwise it is freed 767 * later) 768 */ 769 ACPI_FREE(buffer.pointer); 770 status = AE_NO_MEMORY; 771 goto cleanup; 772 } 773 774 args[0]->buffer.length = (u32) buffer.length; 775 args[0]->buffer.pointer = buffer.pointer; 776 args[0]->common.flags = AOPOBJ_DATA_VALID; 777 args[1] = NULL; 778 779 /* Execute the method, no return value is expected */ 780 781 status = acpi_ns_evaluate(info); 782 783 /* Clean up and return the status from acpi_ns_evaluate */ 784 785 acpi_ut_remove_reference(args[0]); 786 787 cleanup: 788 ACPI_FREE(info); 789 return_ACPI_STATUS(status); 790 } 791