1 /****************************************************************************** 2 * 3 * Module Name: aslrestype2s - Serial Large resource descriptors 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 #include "aslcompiler.h" 46 #include "aslcompiler.y.h" 47 #include "amlcode.h" 48 49 #define _COMPONENT ACPI_COMPILER 50 ACPI_MODULE_NAME ("aslrestype2s") 51 52 53 static UINT16 54 RsGetBufferDataLength ( 55 ACPI_PARSE_OBJECT *InitializerOp); 56 57 static UINT16 58 RsGetInterruptDataLength ( 59 ACPI_PARSE_OBJECT *InitializerOp); 60 61 static BOOLEAN 62 RsGetVendorData ( 63 ACPI_PARSE_OBJECT *InitializerOp, 64 UINT8 *VendorData, 65 ACPI_SIZE DescriptorOffset); 66 67 /* 68 * This module contains descriptors for serial buses and GPIO: 69 * 70 * GpioInt 71 * GpioIo 72 * I2cSerialBus 73 * SpiSerialBus 74 * UartSerialBus 75 */ 76 77 78 /******************************************************************************* 79 * 80 * FUNCTION: RsGetBufferDataLength 81 * 82 * PARAMETERS: InitializerOp - Current parse op, start of the resource 83 * descriptor 84 * 85 * RETURN: Length of the data buffer 86 * 87 * DESCRIPTION: Get the length of a RawDataBuffer, used for vendor data. 88 * 89 ******************************************************************************/ 90 91 static UINT16 92 RsGetBufferDataLength ( 93 ACPI_PARSE_OBJECT *InitializerOp) 94 { 95 UINT16 ExtraDataSize = 0; 96 ACPI_PARSE_OBJECT *DataList; 97 98 99 /* Find the byte-initializer list */ 100 101 while (InitializerOp) 102 { 103 if (InitializerOp->Asl.ParseOpcode == PARSEOP_DATABUFFER) 104 { 105 /* First child is the optional length (ignore it here) */ 106 107 DataList = InitializerOp->Asl.Child; 108 DataList = ASL_GET_PEER_NODE (DataList); 109 110 /* Count the data items (each one is a byte of data) */ 111 112 while (DataList) 113 { 114 ExtraDataSize++; 115 DataList = ASL_GET_PEER_NODE (DataList); 116 } 117 118 return (ExtraDataSize); 119 } 120 121 InitializerOp = ASL_GET_PEER_NODE (InitializerOp); 122 } 123 124 return (ExtraDataSize); 125 } 126 127 128 /******************************************************************************* 129 * 130 * FUNCTION: RsGetInterruptDataLength 131 * 132 * PARAMETERS: InitializerOp - Current parse op, start of the resource 133 * descriptor 134 * 135 * RETURN: Length of the interrupt data list 136 * 137 * DESCRIPTION: Get the length of a list of interrupt DWORDs for the GPIO 138 * descriptors. 139 * 140 ******************************************************************************/ 141 142 static UINT16 143 RsGetInterruptDataLength ( 144 ACPI_PARSE_OBJECT *InitializerOp) 145 { 146 UINT16 InterruptLength; 147 UINT32 i; 148 149 150 /* Count the interrupt numbers */ 151 152 InterruptLength = 0; 153 for (i = 0; InitializerOp; i++) 154 { 155 InitializerOp = ASL_GET_PEER_NODE (InitializerOp); 156 157 /* Interrupt list starts at offset 10 (Gpio descriptors) */ 158 159 if (i >= 10) 160 { 161 InterruptLength += 2; 162 } 163 } 164 165 return (InterruptLength); 166 } 167 168 169 /******************************************************************************* 170 * 171 * FUNCTION: RsGetVendorData 172 * 173 * PARAMETERS: InitializerOp - Current parse op, start of the resource 174 * descriptor. 175 * VendorData - Where the vendor data is returned 176 * DescriptorOffset - Where vendor data begins in descriptor 177 * 178 * RETURN: TRUE if valid vendor data was returned, FALSE otherwise. 179 * 180 * DESCRIPTION: Extract the vendor data and construct a vendor data buffer. 181 * 182 ******************************************************************************/ 183 184 static BOOLEAN 185 RsGetVendorData ( 186 ACPI_PARSE_OBJECT *InitializerOp, 187 UINT8 *VendorData, 188 ACPI_SIZE DescriptorOffset) 189 { 190 ACPI_PARSE_OBJECT *BufferOp; 191 UINT32 SpecifiedLength = ACPI_UINT32_MAX; 192 UINT16 ActualLength = 0; 193 194 195 /* Vendor Data field is always optional */ 196 197 if (InitializerOp->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG) 198 { 199 return (FALSE); 200 } 201 202 BufferOp = InitializerOp->Asl.Child; 203 if (!BufferOp) 204 { 205 AslError (ASL_ERROR, ASL_MSG_SYNTAX, InitializerOp, ""); 206 return (FALSE); 207 } 208 209 /* First child is the optional buffer length (WORD) */ 210 211 if (BufferOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) 212 { 213 SpecifiedLength = (UINT16) BufferOp->Asl.Value.Integer; 214 } 215 216 /* Insert field tag _VEN */ 217 218 RsCreateByteField (InitializerOp, ACPI_RESTAG_VENDORDATA, 219 (UINT16) DescriptorOffset); 220 221 /* Walk the list of buffer initializers (each is one byte) */ 222 223 BufferOp = RsCompleteNodeAndGetNext (BufferOp); 224 if (BufferOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) 225 { 226 while (BufferOp) 227 { 228 *VendorData = (UINT8) BufferOp->Asl.Value.Integer; 229 VendorData++; 230 ActualLength++; 231 BufferOp = RsCompleteNodeAndGetNext (BufferOp); 232 } 233 } 234 235 /* Length validation. Buffer cannot be of zero length */ 236 237 if ((SpecifiedLength == 0) || 238 ((SpecifiedLength == ACPI_UINT32_MAX) && (ActualLength == 0))) 239 { 240 AslError (ASL_ERROR, ASL_MSG_BUFFER_LENGTH, InitializerOp, NULL); 241 return (FALSE); 242 } 243 244 if (SpecifiedLength != ACPI_UINT32_MAX) 245 { 246 /* ActualLength > SpecifiedLength -> error */ 247 248 if (ActualLength > SpecifiedLength) 249 { 250 AslError (ASL_ERROR, ASL_MSG_LIST_LENGTH_LONG, InitializerOp, NULL); 251 return (FALSE); 252 } 253 254 /* ActualLength < SpecifiedLength -> remark */ 255 256 else if (ActualLength < SpecifiedLength) 257 { 258 AslError (ASL_REMARK, ASL_MSG_LIST_LENGTH_SHORT, InitializerOp, NULL); 259 return (FALSE); 260 } 261 } 262 263 return (TRUE); 264 } 265 266 267 /******************************************************************************* 268 * 269 * FUNCTION: RsDoGpioIntDescriptor 270 * 271 * PARAMETERS: Op - Parent resource descriptor parse node 272 * CurrentByteOffset - Offset into the resource template AML 273 * buffer (to track references to the desc) 274 * 275 * RETURN: Completed resource node 276 * 277 * DESCRIPTION: Construct a long "GpioInt" descriptor 278 * 279 ******************************************************************************/ 280 281 ASL_RESOURCE_NODE * 282 RsDoGpioIntDescriptor ( 283 ACPI_PARSE_OBJECT *Op, 284 UINT32 CurrentByteOffset) 285 { 286 AML_RESOURCE *Descriptor; 287 ACPI_PARSE_OBJECT *InitializerOp; 288 ASL_RESOURCE_NODE *Rnode; 289 char *ResourceSource = NULL; 290 UINT8 *VendorData = NULL; 291 UINT16 *InterruptList = NULL; 292 UINT16 ResSourceLength; 293 UINT16 VendorLength; 294 UINT16 InterruptLength; 295 UINT16 DescriptorSize; 296 UINT32 i; 297 298 299 InitializerOp = Op->Asl.Child; 300 301 /* 302 * Calculate lengths for fields that have variable length: 303 * 1) Resource Source string 304 * 2) Vendor Data buffer 305 * 3) PIN (interrupt) list 306 */ 307 ResSourceLength = RsGetStringDataLength (InitializerOp); 308 VendorLength = RsGetBufferDataLength (InitializerOp); 309 InterruptLength = RsGetInterruptDataLength (InitializerOp); 310 311 DescriptorSize = ACPI_AML_SIZE_LARGE (AML_RESOURCE_GPIO) + 312 ResSourceLength + VendorLength + InterruptLength; 313 314 /* Allocate the local resource node and initialize */ 315 316 Rnode = RsAllocateResourceNode (DescriptorSize + sizeof (AML_RESOURCE_LARGE_HEADER)); 317 318 Descriptor = Rnode->Buffer; 319 Descriptor->Gpio.ResourceLength = DescriptorSize; 320 Descriptor->Gpio.DescriptorType = ACPI_RESOURCE_NAME_GPIO; 321 Descriptor->Gpio.RevisionId = AML_RESOURCE_GPIO_REVISION; 322 Descriptor->Gpio.ConnectionType = AML_RESOURCE_GPIO_TYPE_INT; 323 324 /* Build pointers to optional areas */ 325 326 InterruptList = ACPI_ADD_PTR (UINT16, Descriptor, sizeof (AML_RESOURCE_GPIO)); 327 ResourceSource = ACPI_ADD_PTR (char, InterruptList, InterruptLength); 328 VendorData = ACPI_ADD_PTR (UINT8, ResourceSource, ResSourceLength); 329 330 /* Setup offsets within the descriptor */ 331 332 Descriptor->Gpio.PinTableOffset = (UINT16) 333 ACPI_PTR_DIFF (InterruptList, Descriptor); 334 335 Descriptor->Gpio.ResSourceOffset = (UINT16) 336 ACPI_PTR_DIFF (ResourceSource, Descriptor); 337 338 DbgPrint (ASL_DEBUG_OUTPUT, 339 "%16s - Actual: %.2X, Base: %.2X, ResLen: %.2X, VendLen: %.2X, IntLen: %.2X\n", 340 "GpioInt", Descriptor->Gpio.ResourceLength, (UINT16) sizeof (AML_RESOURCE_GPIO), 341 ResSourceLength, VendorLength, InterruptLength); 342 343 /* Process all child initialization nodes */ 344 345 for (i = 0; InitializerOp; i++) 346 { 347 switch (i) 348 { 349 case 0: /* Interrupt Mode - edge/level [Flag] (_MOD) */ 350 351 RsSetFlagBits16 (&Descriptor->Gpio.IntFlags, InitializerOp, 0, 0); 352 RsCreateBitField (InitializerOp, ACPI_RESTAG_MODE, 353 CurrentByteOffset + ASL_RESDESC_OFFSET (Gpio.IntFlags), 0); 354 break; 355 356 case 1: /* Interrupt Polarity - Active high/low [Flags] (_POL) */ 357 358 RsSetFlagBits16 (&Descriptor->Gpio.IntFlags, InitializerOp, 1, 0); 359 RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_POLARITY, 360 CurrentByteOffset + ASL_RESDESC_OFFSET (Gpio.IntFlags), 1, 2); 361 break; 362 363 case 2: /* Share Type - Default: exclusive (0) [Flags] (_SHR) */ 364 365 RsSetFlagBits16 (&Descriptor->Gpio.IntFlags, InitializerOp, 3, 0); 366 RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_INTERRUPTSHARE, 367 CurrentByteOffset + ASL_RESDESC_OFFSET (Gpio.IntFlags), 3, 2); 368 break; 369 370 case 3: /* Pin Config [BYTE] (_PPI) */ 371 372 Descriptor->Gpio.PinConfig = (UINT8) InitializerOp->Asl.Value.Integer; 373 RsCreateByteField (InitializerOp, ACPI_RESTAG_PINCONFIG, 374 CurrentByteOffset + ASL_RESDESC_OFFSET (Gpio.PinConfig)); 375 break; 376 377 case 4: /* Debounce Timeout [WORD] (_DBT) */ 378 379 Descriptor->Gpio.DebounceTimeout = (UINT16) InitializerOp->Asl.Value.Integer; 380 RsCreateWordField (InitializerOp, ACPI_RESTAG_DEBOUNCETIME, 381 CurrentByteOffset + ASL_RESDESC_OFFSET (Gpio.DebounceTimeout)); 382 break; 383 384 case 5: /* ResSource [Optional Field - STRING] */ 385 386 if (ResSourceLength) 387 { 388 /* Copy string to the descriptor */ 389 390 strcpy (ResourceSource, 391 InitializerOp->Asl.Value.String); 392 } 393 break; 394 395 case 6: /* Resource Index */ 396 397 if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) 398 { 399 Descriptor->Gpio.ResSourceIndex = (UINT8) InitializerOp->Asl.Value.Integer; 400 } 401 break; 402 403 case 7: /* Resource Usage (consumer/producer) */ 404 405 RsSetFlagBits16 (&Descriptor->Gpio.Flags, InitializerOp, 0, 1); 406 break; 407 408 case 8: /* Resource Tag (Descriptor Name) */ 409 410 UtAttachNamepathToOwner (Op, InitializerOp); 411 break; 412 413 case 9: /* Vendor Data (Optional - Buffer of BYTEs) (_VEN) */ 414 415 /* 416 * Always set the VendorOffset even if there is no Vendor Data. 417 * This field is required in order to calculate the length 418 * of the ResourceSource at runtime. 419 */ 420 Descriptor->Gpio.VendorOffset = (UINT16) 421 ACPI_PTR_DIFF (VendorData, Descriptor); 422 423 if (RsGetVendorData (InitializerOp, VendorData, 424 (CurrentByteOffset + Descriptor->Gpio.VendorOffset))) 425 { 426 Descriptor->Gpio.VendorLength = VendorLength; 427 } 428 break; 429 430 default: 431 /* 432 * PINs come through here, repeatedly. Each PIN must be a DWORD. 433 * NOTE: there is no "length" field for this, so from ACPI spec: 434 * The number of pins in the table can be calculated from: 435 * PinCount = (Resource Source Name Offset - Pin Table Offset) / 2 436 * (implies resource source must immediately follow the pin list.) 437 * Name: _PIN 438 */ 439 *InterruptList = (UINT16) InitializerOp->Asl.Value.Integer; 440 InterruptList++; 441 442 /* Case 10: First interrupt number in list */ 443 444 if (i == 10) 445 { 446 if (InitializerOp->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG) 447 { 448 /* Must be at least one interrupt */ 449 450 AslError (ASL_ERROR, ASL_MSG_EX_INTERRUPT_LIST_MIN, 451 InitializerOp, NULL); 452 } 453 454 /* Check now for duplicates in list */ 455 456 RsCheckListForDuplicates (InitializerOp); 457 458 /* Create a named field at the start of the list */ 459 460 RsCreateDwordField (InitializerOp, ACPI_RESTAG_PIN, 461 CurrentByteOffset + Descriptor->Gpio.PinTableOffset); 462 } 463 break; 464 } 465 466 InitializerOp = RsCompleteNodeAndGetNext (InitializerOp); 467 } 468 469 return (Rnode); 470 } 471 472 473 /******************************************************************************* 474 * 475 * FUNCTION: RsDoGpioIoDescriptor 476 * 477 * PARAMETERS: Op - Parent resource descriptor parse node 478 * CurrentByteOffset - Offset into the resource template AML 479 * buffer (to track references to the desc) 480 * 481 * RETURN: Completed resource node 482 * 483 * DESCRIPTION: Construct a long "GpioIo" descriptor 484 * 485 ******************************************************************************/ 486 487 ASL_RESOURCE_NODE * 488 RsDoGpioIoDescriptor ( 489 ACPI_PARSE_OBJECT *Op, 490 UINT32 CurrentByteOffset) 491 { 492 AML_RESOURCE *Descriptor; 493 ACPI_PARSE_OBJECT *InitializerOp; 494 ASL_RESOURCE_NODE *Rnode; 495 char *ResourceSource = NULL; 496 UINT8 *VendorData = NULL; 497 UINT16 *InterruptList = NULL; 498 UINT16 ResSourceLength; 499 UINT16 VendorLength; 500 UINT16 InterruptLength; 501 UINT16 DescriptorSize; 502 UINT32 i; 503 504 505 InitializerOp = Op->Asl.Child; 506 507 /* 508 * Calculate lengths for fields that have variable length: 509 * 1) Resource Source string 510 * 2) Vendor Data buffer 511 * 3) PIN (interrupt) list 512 */ 513 ResSourceLength = RsGetStringDataLength (InitializerOp); 514 VendorLength = RsGetBufferDataLength (InitializerOp); 515 InterruptLength = RsGetInterruptDataLength (InitializerOp); 516 517 DescriptorSize = ACPI_AML_SIZE_LARGE (AML_RESOURCE_GPIO) + 518 ResSourceLength + VendorLength + InterruptLength; 519 520 /* Allocate the local resource node and initialize */ 521 522 Rnode = RsAllocateResourceNode (DescriptorSize + sizeof (AML_RESOURCE_LARGE_HEADER)); 523 524 Descriptor = Rnode->Buffer; 525 Descriptor->Gpio.ResourceLength = DescriptorSize; 526 Descriptor->Gpio.DescriptorType = ACPI_RESOURCE_NAME_GPIO; 527 Descriptor->Gpio.RevisionId = AML_RESOURCE_GPIO_REVISION; 528 Descriptor->Gpio.ConnectionType = AML_RESOURCE_GPIO_TYPE_IO; 529 530 /* Build pointers to optional areas */ 531 532 InterruptList = ACPI_ADD_PTR (UINT16, Descriptor, sizeof (AML_RESOURCE_GPIO)); 533 ResourceSource = ACPI_ADD_PTR (char, InterruptList, InterruptLength); 534 VendorData = ACPI_ADD_PTR (UINT8, ResourceSource, ResSourceLength); 535 536 /* Setup offsets within the descriptor */ 537 538 Descriptor->Gpio.PinTableOffset = (UINT16) 539 ACPI_PTR_DIFF (InterruptList, Descriptor); 540 541 Descriptor->Gpio.ResSourceOffset = (UINT16) 542 ACPI_PTR_DIFF (ResourceSource, Descriptor); 543 544 DbgPrint (ASL_DEBUG_OUTPUT, 545 "%16s - Actual: %.2X, Base: %.2X, ResLen: %.2X, VendLen: %.2X, IntLen: %.2X\n", 546 "GpioIo", Descriptor->Gpio.ResourceLength, (UINT16) sizeof (AML_RESOURCE_GPIO), 547 ResSourceLength, VendorLength, InterruptLength); 548 549 /* Process all child initialization nodes */ 550 551 for (i = 0; InitializerOp; i++) 552 { 553 switch (i) 554 { 555 case 0: /* Share Type [Flags] (_SHR) */ 556 557 RsSetFlagBits16 (&Descriptor->Gpio.IntFlags, InitializerOp, 3, 0); 558 RsCreateBitField (InitializerOp, ACPI_RESTAG_INTERRUPTSHARE, 559 CurrentByteOffset + ASL_RESDESC_OFFSET (Gpio.IntFlags), 3); 560 break; 561 562 case 1: /* Pin Config [BYTE] (_PPI) */ 563 564 Descriptor->Gpio.PinConfig = (UINT8) InitializerOp->Asl.Value.Integer; 565 RsCreateByteField (InitializerOp, ACPI_RESTAG_PINCONFIG, 566 CurrentByteOffset + ASL_RESDESC_OFFSET (Gpio.PinConfig)); 567 break; 568 569 case 2: /* Debounce Timeout [WORD] (_DBT) */ 570 571 Descriptor->Gpio.DebounceTimeout = (UINT16) InitializerOp->Asl.Value.Integer; 572 RsCreateWordField (InitializerOp, ACPI_RESTAG_DEBOUNCETIME, 573 CurrentByteOffset + ASL_RESDESC_OFFSET (Gpio.DebounceTimeout)); 574 break; 575 576 case 3: /* Drive Strength [WORD] (_DRS) */ 577 578 Descriptor->Gpio.DriveStrength = (UINT16) InitializerOp->Asl.Value.Integer; 579 RsCreateWordField (InitializerOp, ACPI_RESTAG_DRIVESTRENGTH, 580 CurrentByteOffset + ASL_RESDESC_OFFSET (Gpio.DriveStrength)); 581 break; 582 583 case 4: /* I/O Restriction [Flag] (_IOR) */ 584 585 RsSetFlagBits16 (&Descriptor->Gpio.IntFlags, InitializerOp, 0, 0); 586 RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_IORESTRICTION, 587 CurrentByteOffset + ASL_RESDESC_OFFSET (Gpio.IntFlags), 0, 2); 588 break; 589 590 case 5: /* ResSource [Optional Field - STRING] */ 591 592 if (ResSourceLength) 593 { 594 /* Copy string to the descriptor */ 595 596 strcpy (ResourceSource, 597 InitializerOp->Asl.Value.String); 598 } 599 break; 600 601 case 6: /* Resource Index */ 602 603 if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) 604 { 605 Descriptor->Gpio.ResSourceIndex = (UINT8) InitializerOp->Asl.Value.Integer; 606 } 607 break; 608 609 case 7: /* Resource Usage (consumer/producer) */ 610 611 RsSetFlagBits16 (&Descriptor->Gpio.Flags, InitializerOp, 0, 1); 612 break; 613 614 case 8: /* Resource Tag (Descriptor Name) */ 615 616 UtAttachNamepathToOwner (Op, InitializerOp); 617 break; 618 619 case 9: /* Vendor Data (Optional - Buffer of BYTEs) (_VEN) */ 620 /* 621 * Always set the VendorOffset even if there is no Vendor Data. 622 * This field is required in order to calculate the length 623 * of the ResourceSource at runtime. 624 */ 625 Descriptor->Gpio.VendorOffset = (UINT16) 626 ACPI_PTR_DIFF (VendorData, Descriptor); 627 628 if (RsGetVendorData (InitializerOp, VendorData, 629 (CurrentByteOffset + Descriptor->Gpio.VendorOffset))) 630 { 631 Descriptor->Gpio.VendorLength = VendorLength; 632 } 633 break; 634 635 default: 636 /* 637 * PINs come through here, repeatedly. Each PIN must be a DWORD. 638 * NOTE: there is no "length" field for this, so from ACPI spec: 639 * The number of pins in the table can be calculated from: 640 * PinCount = (Resource Source Name Offset - Pin Table Offset) / 2 641 * (implies resource source must immediately follow the pin list.) 642 * Name: _PIN 643 */ 644 *InterruptList = (UINT16) InitializerOp->Asl.Value.Integer; 645 InterruptList++; 646 647 /* Case 10: First interrupt number in list */ 648 649 if (i == 10) 650 { 651 if (InitializerOp->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG) 652 { 653 /* Must be at least one interrupt */ 654 655 AslError (ASL_ERROR, ASL_MSG_EX_INTERRUPT_LIST_MIN, 656 InitializerOp, NULL); 657 } 658 659 /* Check now for duplicates in list */ 660 661 RsCheckListForDuplicates (InitializerOp); 662 663 /* Create a named field at the start of the list */ 664 665 RsCreateDwordField (InitializerOp, ACPI_RESTAG_PIN, 666 CurrentByteOffset + Descriptor->Gpio.PinTableOffset); 667 } 668 break; 669 } 670 671 InitializerOp = RsCompleteNodeAndGetNext (InitializerOp); 672 } 673 674 return (Rnode); 675 } 676 677 678 /******************************************************************************* 679 * 680 * FUNCTION: RsDoI2cSerialBusDescriptor 681 * 682 * PARAMETERS: Op - Parent resource descriptor parse node 683 * CurrentByteOffset - Offset into the resource template AML 684 * buffer (to track references to the desc) 685 * 686 * RETURN: Completed resource node 687 * 688 * DESCRIPTION: Construct a long "I2cSerialBus" descriptor 689 * 690 ******************************************************************************/ 691 692 ASL_RESOURCE_NODE * 693 RsDoI2cSerialBusDescriptor ( 694 ACPI_PARSE_OBJECT *Op, 695 UINT32 CurrentByteOffset) 696 { 697 AML_RESOURCE *Descriptor; 698 ACPI_PARSE_OBJECT *InitializerOp; 699 ASL_RESOURCE_NODE *Rnode; 700 char *ResourceSource = NULL; 701 UINT8 *VendorData = NULL; 702 UINT16 ResSourceLength; 703 UINT16 VendorLength; 704 UINT16 DescriptorSize; 705 UINT32 i; 706 707 708 InitializerOp = Op->Asl.Child; 709 710 /* 711 * Calculate lengths for fields that have variable length: 712 * 1) Resource Source string 713 * 2) Vendor Data buffer 714 */ 715 ResSourceLength = RsGetStringDataLength (InitializerOp); 716 VendorLength = RsGetBufferDataLength (InitializerOp); 717 718 DescriptorSize = ACPI_AML_SIZE_LARGE (AML_RESOURCE_I2C_SERIALBUS) + 719 ResSourceLength + VendorLength; 720 721 /* Allocate the local resource node and initialize */ 722 723 Rnode = RsAllocateResourceNode (DescriptorSize + sizeof (AML_RESOURCE_LARGE_HEADER)); 724 725 Descriptor = Rnode->Buffer; 726 Descriptor->I2cSerialBus.ResourceLength = DescriptorSize; 727 Descriptor->I2cSerialBus.DescriptorType = ACPI_RESOURCE_NAME_SERIAL_BUS; 728 Descriptor->I2cSerialBus.RevisionId = AML_RESOURCE_I2C_REVISION; 729 Descriptor->I2cSerialBus.TypeRevisionId = AML_RESOURCE_I2C_TYPE_REVISION; 730 Descriptor->I2cSerialBus.Type = AML_RESOURCE_I2C_SERIALBUSTYPE; 731 Descriptor->I2cSerialBus.TypeDataLength = AML_RESOURCE_I2C_MIN_DATA_LEN + VendorLength; 732 733 /* Build pointers to optional areas */ 734 735 VendorData = ACPI_ADD_PTR (UINT8, Descriptor, sizeof (AML_RESOURCE_I2C_SERIALBUS)); 736 ResourceSource = ACPI_ADD_PTR (char, VendorData, VendorLength); 737 738 DbgPrint (ASL_DEBUG_OUTPUT, 739 "%16s - Actual: %.2X, Base: %.2X, ResLen: %.2X, VendLen: %.2X, TypLen: %.2X\n", 740 "I2cSerialBus", Descriptor->I2cSerialBus.ResourceLength, 741 (UINT16) sizeof (AML_RESOURCE_I2C_SERIALBUS), ResSourceLength, 742 VendorLength, Descriptor->I2cSerialBus.TypeDataLength); 743 744 /* Process all child initialization nodes */ 745 746 for (i = 0; InitializerOp; i++) 747 { 748 switch (i) 749 { 750 case 0: /* Slave Address [WORD] (_ADR) */ 751 752 Descriptor->I2cSerialBus.SlaveAddress = (UINT16) InitializerOp->Asl.Value.Integer; 753 RsCreateWordField (InitializerOp, ACPI_RESTAG_ADDRESS, 754 CurrentByteOffset + ASL_RESDESC_OFFSET (I2cSerialBus.SlaveAddress)); 755 break; 756 757 case 1: /* Slave Mode [Flag] (_SLV) */ 758 759 RsSetFlagBits (&Descriptor->I2cSerialBus.Flags, InitializerOp, 0, 0); 760 RsCreateBitField (InitializerOp, ACPI_RESTAG_SLAVEMODE, 761 CurrentByteOffset + ASL_RESDESC_OFFSET (I2cSerialBus.Flags), 0); 762 break; 763 764 case 2: /* Connection Speed [DWORD] (_SPE) */ 765 766 Descriptor->I2cSerialBus.ConnectionSpeed = (UINT32) InitializerOp->Asl.Value.Integer; 767 RsCreateDwordField (InitializerOp, ACPI_RESTAG_SPEED, 768 CurrentByteOffset + ASL_RESDESC_OFFSET (I2cSerialBus.ConnectionSpeed)); 769 break; 770 771 case 3: /* Addressing Mode [Flag] (_MOD) */ 772 773 RsSetFlagBits16 (&Descriptor->I2cSerialBus.TypeSpecificFlags, InitializerOp, 0, 0); 774 RsCreateBitField (InitializerOp, ACPI_RESTAG_MODE, 775 CurrentByteOffset + ASL_RESDESC_OFFSET (I2cSerialBus.TypeSpecificFlags), 0); 776 break; 777 778 case 4: /* ResSource [Optional Field - STRING] */ 779 780 if (ResSourceLength) 781 { 782 /* Copy string to the descriptor */ 783 784 strcpy (ResourceSource, 785 InitializerOp->Asl.Value.String); 786 } 787 break; 788 789 case 5: /* Resource Index */ 790 791 if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) 792 { 793 Descriptor->I2cSerialBus.ResSourceIndex = (UINT8) InitializerOp->Asl.Value.Integer; 794 } 795 break; 796 797 case 6: /* Resource Usage (consumer/producer) */ 798 799 RsSetFlagBits (&Descriptor->I2cSerialBus.Flags, InitializerOp, 1, 1); 800 break; 801 802 case 7: /* Resource Tag (Descriptor Name) */ 803 804 UtAttachNamepathToOwner (Op, InitializerOp); 805 break; 806 807 case 8: /* Vendor Data (Optional - Buffer of BYTEs) (_VEN) */ 808 809 RsGetVendorData (InitializerOp, VendorData, 810 CurrentByteOffset + sizeof (AML_RESOURCE_I2C_SERIALBUS)); 811 break; 812 813 default: /* Ignore any extra nodes */ 814 815 break; 816 } 817 818 InitializerOp = RsCompleteNodeAndGetNext (InitializerOp); 819 } 820 821 return (Rnode); 822 } 823 824 825 /******************************************************************************* 826 * 827 * FUNCTION: RsDoSpiSerialBusDescriptor 828 * 829 * PARAMETERS: Op - Parent resource descriptor parse node 830 * CurrentByteOffset - Offset into the resource template AML 831 * buffer (to track references to the desc) 832 * 833 * RETURN: Completed resource node 834 * 835 * DESCRIPTION: Construct a long "SPI Serial Bus" descriptor 836 * 837 ******************************************************************************/ 838 839 ASL_RESOURCE_NODE * 840 RsDoSpiSerialBusDescriptor ( 841 ACPI_PARSE_OBJECT *Op, 842 UINT32 CurrentByteOffset) 843 { 844 AML_RESOURCE *Descriptor; 845 ACPI_PARSE_OBJECT *InitializerOp; 846 ASL_RESOURCE_NODE *Rnode; 847 char *ResourceSource = NULL; 848 UINT8 *VendorData = NULL; 849 UINT16 ResSourceLength; 850 UINT16 VendorLength; 851 UINT16 DescriptorSize; 852 UINT32 i; 853 854 855 InitializerOp = Op->Asl.Child; 856 857 /* 858 * Calculate lengths for fields that have variable length: 859 * 1) Resource Source string 860 * 2) Vendor Data buffer 861 */ 862 ResSourceLength = RsGetStringDataLength (InitializerOp); 863 VendorLength = RsGetBufferDataLength (InitializerOp); 864 865 DescriptorSize = ACPI_AML_SIZE_LARGE (AML_RESOURCE_SPI_SERIALBUS) + 866 ResSourceLength + VendorLength; 867 868 /* Allocate the local resource node and initialize */ 869 870 Rnode = RsAllocateResourceNode (DescriptorSize + sizeof (AML_RESOURCE_LARGE_HEADER)); 871 872 Descriptor = Rnode->Buffer; 873 Descriptor->SpiSerialBus.ResourceLength = DescriptorSize; 874 Descriptor->SpiSerialBus.DescriptorType = ACPI_RESOURCE_NAME_SERIAL_BUS; 875 Descriptor->SpiSerialBus.RevisionId = AML_RESOURCE_SPI_REVISION; 876 Descriptor->SpiSerialBus.TypeRevisionId = AML_RESOURCE_SPI_TYPE_REVISION; 877 Descriptor->SpiSerialBus.Type = AML_RESOURCE_SPI_SERIALBUSTYPE; 878 Descriptor->SpiSerialBus.TypeDataLength = AML_RESOURCE_SPI_MIN_DATA_LEN + VendorLength; 879 880 /* Build pointers to optional areas */ 881 882 VendorData = ACPI_ADD_PTR (UINT8, Descriptor, sizeof (AML_RESOURCE_SPI_SERIALBUS)); 883 ResourceSource = ACPI_ADD_PTR (char, VendorData, VendorLength); 884 885 DbgPrint (ASL_DEBUG_OUTPUT, 886 "%16s - Actual: %.2X, Base: %.2X, ResLen: %.2X, VendLen: %.2X, TypLen: %.2X\n", 887 "SpiSerialBus", Descriptor->SpiSerialBus.ResourceLength, 888 (UINT16) sizeof (AML_RESOURCE_SPI_SERIALBUS), ResSourceLength, 889 VendorLength, Descriptor->SpiSerialBus.TypeDataLength); 890 891 /* Process all child initialization nodes */ 892 893 for (i = 0; InitializerOp; i++) 894 { 895 switch (i) 896 { 897 case 0: /* Device Selection [WORD] (_ADR) */ 898 899 Descriptor->SpiSerialBus.DeviceSelection = (UINT16) InitializerOp->Asl.Value.Integer; 900 RsCreateWordField (InitializerOp, ACPI_RESTAG_ADDRESS, 901 CurrentByteOffset + ASL_RESDESC_OFFSET (SpiSerialBus.DeviceSelection)); 902 break; 903 904 case 1: /* Device Polarity [Flag] (_DPL) */ 905 906 RsSetFlagBits16 (&Descriptor->SpiSerialBus.TypeSpecificFlags, InitializerOp, 1, 0); 907 RsCreateBitField (InitializerOp, ACPI_RESTAG_DEVICEPOLARITY, 908 CurrentByteOffset + ASL_RESDESC_OFFSET (SpiSerialBus.TypeSpecificFlags), 1); 909 break; 910 911 case 2: /* Wire Mode [Flag] (_MOD) */ 912 913 RsSetFlagBits16 (&Descriptor->SpiSerialBus.TypeSpecificFlags, InitializerOp, 0, 0); 914 RsCreateBitField (InitializerOp, ACPI_RESTAG_MODE, 915 CurrentByteOffset + ASL_RESDESC_OFFSET (SpiSerialBus.TypeSpecificFlags), 0); 916 break; 917 918 case 3: /* Device Bit Length [BYTE] (_LEN) */ 919 920 Descriptor->SpiSerialBus.DataBitLength = (UINT8) InitializerOp->Asl.Value.Integer; 921 RsCreateByteField (InitializerOp, ACPI_RESTAG_LENGTH, 922 CurrentByteOffset + ASL_RESDESC_OFFSET (SpiSerialBus.DataBitLength)); 923 break; 924 925 case 4: /* Slave Mode [Flag] (_SLV) */ 926 927 RsSetFlagBits (&Descriptor->SpiSerialBus.Flags, InitializerOp, 0, 0); 928 RsCreateBitField (InitializerOp, ACPI_RESTAG_SLAVEMODE, 929 CurrentByteOffset + ASL_RESDESC_OFFSET (SpiSerialBus.Flags), 0); 930 break; 931 932 case 5: /* Connection Speed [DWORD] (_SPE) */ 933 934 Descriptor->SpiSerialBus.ConnectionSpeed = (UINT32) InitializerOp->Asl.Value.Integer; 935 RsCreateDwordField (InitializerOp, ACPI_RESTAG_SPEED, 936 CurrentByteOffset + ASL_RESDESC_OFFSET (SpiSerialBus.ConnectionSpeed)); 937 break; 938 939 case 6: /* Clock Polarity [BYTE] (_POL) */ 940 941 Descriptor->SpiSerialBus.ClockPolarity = (UINT8) InitializerOp->Asl.Value.Integer; 942 RsCreateByteField (InitializerOp, ACPI_RESTAG_POLARITY, 943 CurrentByteOffset + ASL_RESDESC_OFFSET (SpiSerialBus.ClockPolarity)); 944 break; 945 946 case 7: /* Clock Phase [BYTE] (_PHA) */ 947 948 Descriptor->SpiSerialBus.ClockPhase = (UINT8) InitializerOp->Asl.Value.Integer; 949 RsCreateByteField (InitializerOp, ACPI_RESTAG_PHASE, 950 CurrentByteOffset + ASL_RESDESC_OFFSET (SpiSerialBus.ClockPhase)); 951 break; 952 953 case 8: /* ResSource [Optional Field - STRING] */ 954 955 if (ResSourceLength) 956 { 957 /* Copy string to the descriptor */ 958 959 strcpy (ResourceSource, 960 InitializerOp->Asl.Value.String); 961 } 962 break; 963 964 case 9: /* Resource Index */ 965 966 if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) 967 { 968 Descriptor->SpiSerialBus.ResSourceIndex = (UINT8) InitializerOp->Asl.Value.Integer; 969 } 970 break; 971 972 case 10: /* Resource Usage (consumer/producer) */ 973 974 RsSetFlagBits (&Descriptor->SpiSerialBus.Flags, InitializerOp, 1, 1); 975 break; 976 977 case 11: /* Resource Tag (Descriptor Name) */ 978 979 UtAttachNamepathToOwner (Op, InitializerOp); 980 break; 981 982 case 12: /* Vendor Data (Optional - Buffer of BYTEs) (_VEN) */ 983 984 RsGetVendorData (InitializerOp, VendorData, 985 CurrentByteOffset + sizeof (AML_RESOURCE_SPI_SERIALBUS)); 986 break; 987 988 default: /* Ignore any extra nodes */ 989 990 break; 991 } 992 993 InitializerOp = RsCompleteNodeAndGetNext (InitializerOp); 994 } 995 996 return (Rnode); 997 } 998 999 1000 /******************************************************************************* 1001 * 1002 * FUNCTION: RsDoUartSerialBusDescriptor 1003 * 1004 * PARAMETERS: Op - Parent resource descriptor parse node 1005 * CurrentByteOffset - Offset into the resource template AML 1006 * buffer (to track references to the desc) 1007 * 1008 * RETURN: Completed resource node 1009 * 1010 * DESCRIPTION: Construct a long "UART Serial Bus" descriptor 1011 * 1012 ******************************************************************************/ 1013 1014 ASL_RESOURCE_NODE * 1015 RsDoUartSerialBusDescriptor ( 1016 ACPI_PARSE_OBJECT *Op, 1017 UINT32 CurrentByteOffset) 1018 { 1019 AML_RESOURCE *Descriptor; 1020 ACPI_PARSE_OBJECT *InitializerOp; 1021 ASL_RESOURCE_NODE *Rnode; 1022 char *ResourceSource = NULL; 1023 UINT8 *VendorData = NULL; 1024 UINT16 ResSourceLength; 1025 UINT16 VendorLength; 1026 UINT16 DescriptorSize; 1027 UINT32 i; 1028 1029 1030 InitializerOp = Op->Asl.Child; 1031 1032 /* 1033 * Calculate lengths for fields that have variable length: 1034 * 1) Resource Source string 1035 * 2) Vendor Data buffer 1036 */ 1037 ResSourceLength = RsGetStringDataLength (InitializerOp); 1038 VendorLength = RsGetBufferDataLength (InitializerOp); 1039 1040 DescriptorSize = ACPI_AML_SIZE_LARGE (AML_RESOURCE_UART_SERIALBUS) + 1041 ResSourceLength + VendorLength; 1042 1043 /* Allocate the local resource node and initialize */ 1044 1045 Rnode = RsAllocateResourceNode (DescriptorSize + sizeof (AML_RESOURCE_LARGE_HEADER)); 1046 1047 Descriptor = Rnode->Buffer; 1048 Descriptor->UartSerialBus.ResourceLength = DescriptorSize; 1049 Descriptor->UartSerialBus.DescriptorType = ACPI_RESOURCE_NAME_SERIAL_BUS; 1050 Descriptor->UartSerialBus.RevisionId = AML_RESOURCE_UART_REVISION; 1051 Descriptor->UartSerialBus.TypeRevisionId = AML_RESOURCE_UART_TYPE_REVISION; 1052 Descriptor->UartSerialBus.Type = AML_RESOURCE_UART_SERIALBUSTYPE; 1053 Descriptor->UartSerialBus.TypeDataLength = AML_RESOURCE_UART_MIN_DATA_LEN + VendorLength; 1054 1055 /* Build pointers to optional areas */ 1056 1057 VendorData = ACPI_ADD_PTR (UINT8, Descriptor, sizeof (AML_RESOURCE_UART_SERIALBUS)); 1058 ResourceSource = ACPI_ADD_PTR (char, VendorData, VendorLength); 1059 1060 DbgPrint (ASL_DEBUG_OUTPUT, 1061 "%16s - Actual: %.2X, Base: %.2X, ResLen: %.2X, VendLen: %.2X, TypLen: %.2X\n", 1062 "UartSerialBus", Descriptor->UartSerialBus.ResourceLength, 1063 (UINT16) sizeof (AML_RESOURCE_UART_SERIALBUS), ResSourceLength, 1064 VendorLength, Descriptor->UartSerialBus.TypeDataLength); 1065 1066 /* Process all child initialization nodes */ 1067 1068 for (i = 0; InitializerOp; i++) 1069 { 1070 switch (i) 1071 { 1072 case 0: /* Connection Speed (Baud Rate) [DWORD] (_SPE) */ 1073 1074 Descriptor->UartSerialBus.DefaultBaudRate = (UINT32) InitializerOp->Asl.Value.Integer; 1075 RsCreateDwordField (InitializerOp, ACPI_RESTAG_SPEED, 1076 CurrentByteOffset + ASL_RESDESC_OFFSET (UartSerialBus.DefaultBaudRate)); 1077 break; 1078 1079 case 1: /* Bits Per Byte [Flags] (_LEN) */ 1080 1081 RsSetFlagBits16 (&Descriptor->UartSerialBus.TypeSpecificFlags, InitializerOp, 4, 3); 1082 RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_LENGTH, 1083 CurrentByteOffset + ASL_RESDESC_OFFSET (UartSerialBus.TypeSpecificFlags), 4, 3); 1084 break; 1085 1086 case 2: /* Stop Bits [Flags] (_STB) */ 1087 1088 RsSetFlagBits16 (&Descriptor->UartSerialBus.TypeSpecificFlags, InitializerOp, 2, 1); 1089 RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_STOPBITS, 1090 CurrentByteOffset + ASL_RESDESC_OFFSET (UartSerialBus.TypeSpecificFlags), 2, 2); 1091 break; 1092 1093 case 3: /* Lines In Use [BYTE] (_LIN) */ 1094 1095 Descriptor->UartSerialBus.LinesEnabled = (UINT8) InitializerOp->Asl.Value.Integer; 1096 RsCreateByteField (InitializerOp, ACPI_RESTAG_LINE, 1097 CurrentByteOffset + ASL_RESDESC_OFFSET (UartSerialBus.LinesEnabled)); 1098 break; 1099 1100 case 4: /* Endianness [Flag] (_END) */ 1101 1102 RsSetFlagBits16 (&Descriptor->UartSerialBus.TypeSpecificFlags, InitializerOp, 7, 0); 1103 RsCreateBitField (InitializerOp, ACPI_RESTAG_ENDIANNESS, 1104 CurrentByteOffset + ASL_RESDESC_OFFSET (UartSerialBus.TypeSpecificFlags), 7); 1105 break; 1106 1107 case 5: /* Parity [BYTE] (_PAR) */ 1108 1109 Descriptor->UartSerialBus.Parity = (UINT8) InitializerOp->Asl.Value.Integer; 1110 RsCreateByteField (InitializerOp, ACPI_RESTAG_PARITY, 1111 CurrentByteOffset + ASL_RESDESC_OFFSET (UartSerialBus.Parity)); 1112 break; 1113 1114 case 6: /* Flow Control [Flags] (_FLC) */ 1115 1116 RsSetFlagBits16 (&Descriptor->UartSerialBus.TypeSpecificFlags, InitializerOp, 0, 0); 1117 RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_FLOWCONTROL, 1118 CurrentByteOffset + ASL_RESDESC_OFFSET (UartSerialBus.TypeSpecificFlags), 0, 2); 1119 break; 1120 1121 case 7: /* Rx Buffer Size [WORD] (_RXL) */ 1122 1123 Descriptor->UartSerialBus.RxFifoSize = (UINT16) InitializerOp->Asl.Value.Integer; 1124 RsCreateWordField (InitializerOp, ACPI_RESTAG_LENGTH_RX, 1125 CurrentByteOffset + ASL_RESDESC_OFFSET (UartSerialBus.RxFifoSize)); 1126 break; 1127 1128 case 8: /* Tx Buffer Size [WORD] (_TXL) */ 1129 1130 Descriptor->UartSerialBus.TxFifoSize = (UINT16) InitializerOp->Asl.Value.Integer; 1131 RsCreateWordField (InitializerOp, ACPI_RESTAG_LENGTH_TX, 1132 CurrentByteOffset + ASL_RESDESC_OFFSET (UartSerialBus.TxFifoSize)); 1133 break; 1134 1135 case 9: /* ResSource [Optional Field - STRING] */ 1136 1137 if (ResSourceLength) 1138 { 1139 /* Copy string to the descriptor */ 1140 1141 strcpy (ResourceSource, 1142 InitializerOp->Asl.Value.String); 1143 } 1144 break; 1145 1146 case 10: /* Resource Index */ 1147 1148 if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) 1149 { 1150 Descriptor->UartSerialBus.ResSourceIndex = (UINT8) InitializerOp->Asl.Value.Integer; 1151 } 1152 break; 1153 1154 case 11: /* Resource Usage (consumer/producer) */ 1155 1156 RsSetFlagBits (&Descriptor->UartSerialBus.Flags, InitializerOp, 1, 1); 1157 1158 /* 1159 * Slave Mode [Flag] (_SLV) 1160 * 1161 * Note: There is no SlaveMode argument to the UartSerialBus macro, but 1162 * we add this name anyway to allow the flag to be set by ASL in the 1163 * rare case where there is a slave mode associated with the UART. 1164 */ 1165 RsCreateBitField (InitializerOp, ACPI_RESTAG_SLAVEMODE, 1166 CurrentByteOffset + ASL_RESDESC_OFFSET (UartSerialBus.Flags), 0); 1167 break; 1168 1169 case 12: /* Resource Tag (Descriptor Name) */ 1170 1171 UtAttachNamepathToOwner (Op, InitializerOp); 1172 break; 1173 1174 case 13: /* Vendor Data (Optional - Buffer of BYTEs) (_VEN) */ 1175 1176 RsGetVendorData (InitializerOp, VendorData, 1177 CurrentByteOffset + sizeof (AML_RESOURCE_UART_SERIALBUS)); 1178 break; 1179 1180 default: /* Ignore any extra nodes */ 1181 1182 break; 1183 } 1184 1185 InitializerOp = RsCompleteNodeAndGetNext (InitializerOp); 1186 } 1187 1188 return (Rnode); 1189 }