1 /*******************************************************************************
   2  *
   3  * Module Name: rsmisc - Miscellaneous 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 #define __RSMISC_C__
  45 
  46 #include "acpi.h"
  47 #include "accommon.h"
  48 #include "acresrc.h"
  49 
  50 #define _COMPONENT          ACPI_RESOURCES
  51         ACPI_MODULE_NAME    ("rsmisc")
  52 
  53 
  54 #define INIT_RESOURCE_TYPE(i)       i->ResourceOffset
  55 #define INIT_RESOURCE_LENGTH(i)     i->AmlOffset
  56 #define INIT_TABLE_LENGTH(i)        i->Value
  57 
  58 #define COMPARE_OPCODE(i)           i->ResourceOffset
  59 #define COMPARE_TARGET(i)           i->AmlOffset
  60 #define COMPARE_VALUE(i)            i->Value
  61 
  62 
  63 /*******************************************************************************
  64  *
  65  * FUNCTION:    AcpiRsConvertAmlToResource
  66  *
  67  * PARAMETERS:  Resource            - Pointer to the resource descriptor
  68  *              Aml                 - Where the AML descriptor is returned
  69  *              Info                - Pointer to appropriate conversion table
  70  *
  71  * RETURN:      Status
  72  *
  73  * DESCRIPTION: Convert an external AML resource descriptor to the corresponding
  74  *              internal resource descriptor
  75  *
  76  ******************************************************************************/
  77 
  78 ACPI_STATUS
  79 AcpiRsConvertAmlToResource (
  80     ACPI_RESOURCE           *Resource,
  81     AML_RESOURCE            *Aml,
  82     ACPI_RSCONVERT_INFO     *Info)
  83 {
  84     ACPI_RS_LENGTH          AmlResourceLength;
  85     void                    *Source;
  86     void                    *Destination;
  87     char                    *Target;
  88     UINT8                   Count;
  89     UINT8                   FlagsMode = FALSE;
  90     UINT16                  ItemCount = 0;
  91     UINT16                  Temp16 = 0;
  92 
  93 
  94     ACPI_FUNCTION_TRACE (RsConvertAmlToResource);
  95 
  96 
  97     if (!Info)
  98     {
  99         return_ACPI_STATUS (AE_BAD_PARAMETER);
 100     }
 101 
 102     if (((ACPI_SIZE) Resource) & 0x3)
 103     {
 104         /* Each internal resource struct is expected to be 32-bit aligned */
 105 
 106         ACPI_WARNING ((AE_INFO,
 107             "Misaligned resource pointer (get): %p Type 0x%2.2X Length %u",
 108             Resource, Resource->Type, Resource->Length));
 109     }
 110 
 111     /* Extract the resource Length field (does not include header length) */
 112 
 113     AmlResourceLength = AcpiUtGetResourceLength (Aml);
 114 
 115     /*
 116      * First table entry must be ACPI_RSC_INITxxx and must contain the
 117      * table length (# of table entries)
 118      */
 119     Count = INIT_TABLE_LENGTH (Info);
 120     while (Count)
 121     {
 122         /*
 123          * Source is the external AML byte stream buffer,
 124          * destination is the internal resource descriptor
 125          */
 126         Source      = ACPI_ADD_PTR (void, Aml, Info->AmlOffset);
 127         Destination = ACPI_ADD_PTR (void, Resource, Info->ResourceOffset);
 128 
 129         switch (Info->Opcode)
 130         {
 131         case ACPI_RSC_INITGET:
 132             /*
 133              * Get the resource type and the initial (minimum) length
 134              */
 135             ACPI_MEMSET (Resource, 0, INIT_RESOURCE_LENGTH (Info));
 136             Resource->Type = INIT_RESOURCE_TYPE (Info);
 137             Resource->Length = INIT_RESOURCE_LENGTH (Info);
 138             break;
 139 
 140         case ACPI_RSC_INITSET:
 141             break;
 142 
 143         case ACPI_RSC_FLAGINIT:
 144 
 145             FlagsMode = TRUE;
 146             break;
 147 
 148         case ACPI_RSC_1BITFLAG:
 149             /*
 150              * Mask and shift the flag bit
 151              */
 152             ACPI_SET8 (Destination,
 153                 ((ACPI_GET8 (Source) >> Info->Value) & 0x01));
 154             break;
 155 
 156         case ACPI_RSC_2BITFLAG:
 157             /*
 158              * Mask and shift the flag bits
 159              */
 160             ACPI_SET8 (Destination,
 161                 ((ACPI_GET8 (Source) >> Info->Value) & 0x03));
 162             break;
 163 
 164         case ACPI_RSC_3BITFLAG:
 165             /*
 166              * Mask and shift the flag bits
 167              */
 168             ACPI_SET8 (Destination,
 169                 ((ACPI_GET8 (Source) >> Info->Value) & 0x07));
 170             break;
 171 
 172         case ACPI_RSC_COUNT:
 173 
 174             ItemCount = ACPI_GET8 (Source);
 175             ACPI_SET8 (Destination, ItemCount);
 176 
 177             Resource->Length = Resource->Length +
 178                 (Info->Value * (ItemCount - 1));
 179             break;
 180 
 181         case ACPI_RSC_COUNT16:
 182 
 183             ItemCount = AmlResourceLength;
 184             ACPI_SET16 (Destination, ItemCount);
 185 
 186             Resource->Length = Resource->Length +
 187                 (Info->Value * (ItemCount - 1));
 188             break;
 189 
 190         case ACPI_RSC_COUNT_GPIO_PIN:
 191 
 192             Target = ACPI_ADD_PTR (void, Aml, Info->Value);
 193             ItemCount = ACPI_GET16 (Target) - ACPI_GET16 (Source);
 194 
 195             Resource->Length = Resource->Length + ItemCount;
 196             ItemCount = ItemCount / 2;
 197             ACPI_SET16 (Destination, ItemCount);
 198             break;
 199 
 200         case ACPI_RSC_COUNT_GPIO_VEN:
 201 
 202             ItemCount = ACPI_GET8 (Source);
 203             ACPI_SET8 (Destination, ItemCount);
 204 
 205             Resource->Length = Resource->Length +
 206                 (Info->Value * ItemCount);
 207             break;
 208 
 209         case ACPI_RSC_COUNT_GPIO_RES:
 210             /*
 211              * Vendor data is optional (length/offset may both be zero)
 212              * Examine vendor data length field first
 213              */
 214             Target = ACPI_ADD_PTR (void, Aml, (Info->Value + 2));
 215             if (ACPI_GET16 (Target))
 216             {
 217                 /* Use vendor offset to get resource source length */
 218 
 219                 Target = ACPI_ADD_PTR (void, Aml, Info->Value);
 220                 ItemCount = ACPI_GET16 (Target) - ACPI_GET16 (Source);
 221             }
 222             else
 223             {
 224                 /* No vendor data to worry about */
 225 
 226                 ItemCount = Aml->LargeHeader.ResourceLength +
 227                     sizeof (AML_RESOURCE_LARGE_HEADER) -
 228                     ACPI_GET16 (Source);
 229             }
 230 
 231             Resource->Length = Resource->Length + ItemCount;
 232             ACPI_SET16 (Destination, ItemCount);
 233             break;
 234 
 235         case ACPI_RSC_COUNT_SERIAL_VEN:
 236 
 237             ItemCount = ACPI_GET16 (Source) - Info->Value;
 238 
 239             Resource->Length = Resource->Length + ItemCount;
 240             ACPI_SET16 (Destination, ItemCount);
 241             break;
 242 
 243         case ACPI_RSC_COUNT_SERIAL_RES:
 244 
 245             ItemCount = (AmlResourceLength +
 246                 sizeof (AML_RESOURCE_LARGE_HEADER)) -
 247                 ACPI_GET16 (Source) - Info->Value;
 248 
 249             Resource->Length = Resource->Length + ItemCount;
 250             ACPI_SET16 (Destination, ItemCount);
 251             break;
 252 
 253         case ACPI_RSC_LENGTH:
 254 
 255             Resource->Length = Resource->Length + Info->Value;
 256             break;
 257 
 258         case ACPI_RSC_MOVE8:
 259         case ACPI_RSC_MOVE16:
 260         case ACPI_RSC_MOVE32:
 261         case ACPI_RSC_MOVE64:
 262             /*
 263              * Raw data move. Use the Info value field unless ItemCount has
 264              * been previously initialized via a COUNT opcode
 265              */
 266             if (Info->Value)
 267             {
 268                 ItemCount = Info->Value;
 269             }
 270             AcpiRsMoveData (Destination, Source, ItemCount, Info->Opcode);
 271             break;
 272 
 273         case ACPI_RSC_MOVE_GPIO_PIN:
 274 
 275             /* Generate and set the PIN data pointer */
 276 
 277             Target = (char *) ACPI_ADD_PTR (void, Resource,
 278                   (Resource->Length - ItemCount * 2));
 279             *(UINT16 **) Destination = ACPI_CAST_PTR (UINT16, Target);
 280 
 281             /* Copy the PIN data */
 282 
 283             Source = ACPI_ADD_PTR (void, Aml, ACPI_GET16 (Source));
 284             AcpiRsMoveData (Target, Source, ItemCount, Info->Opcode);
 285             break;
 286 
 287         case ACPI_RSC_MOVE_GPIO_RES:
 288 
 289             /* Generate and set the ResourceSource string pointer */
 290 
 291             Target = (char *) ACPI_ADD_PTR (void, Resource,
 292                   (Resource->Length - ItemCount));
 293             *(UINT8 **) Destination = ACPI_CAST_PTR (UINT8, Target);
 294 
 295             /* Copy the ResourceSource string */
 296 
 297             Source = ACPI_ADD_PTR (void, Aml, ACPI_GET16 (Source));
 298             AcpiRsMoveData (Target, Source, ItemCount, Info->Opcode);
 299             break;
 300 
 301         case ACPI_RSC_MOVE_SERIAL_VEN:
 302 
 303             /* Generate and set the Vendor Data pointer */
 304 
 305             Target = (char *) ACPI_ADD_PTR (void, Resource,
 306                   (Resource->Length - ItemCount));
 307             *(UINT8 **) Destination = ACPI_CAST_PTR (UINT8, Target);
 308 
 309             /* Copy the Vendor Data */
 310 
 311             Source = ACPI_ADD_PTR (void, Aml, Info->Value);
 312             AcpiRsMoveData (Target, Source, ItemCount, Info->Opcode);
 313             break;
 314 
 315         case ACPI_RSC_MOVE_SERIAL_RES:
 316 
 317             /* Generate and set the ResourceSource string pointer */
 318 
 319             Target = (char *) ACPI_ADD_PTR (void, Resource,
 320                   (Resource->Length - ItemCount));
 321             *(UINT8 **) Destination = ACPI_CAST_PTR (UINT8, Target);
 322 
 323             /* Copy the ResourceSource string */
 324 
 325             Source = ACPI_ADD_PTR (void, Aml, (ACPI_GET16 (Source) + Info->Value));
 326             AcpiRsMoveData (Target, Source, ItemCount, Info->Opcode);
 327             break;
 328 
 329         case ACPI_RSC_SET8:
 330 
 331             ACPI_MEMSET (Destination, Info->AmlOffset, Info->Value);
 332             break;
 333 
 334         case ACPI_RSC_DATA8:
 335 
 336             Target = ACPI_ADD_PTR (char, Resource, Info->Value);
 337             ACPI_MEMCPY (Destination, Source,  ACPI_GET16 (Target));
 338             break;
 339 
 340         case ACPI_RSC_ADDRESS:
 341             /*
 342              * Common handler for address descriptor flags
 343              */
 344             if (!AcpiRsGetAddressCommon (Resource, Aml))
 345             {
 346                 return_ACPI_STATUS (AE_AML_INVALID_RESOURCE_TYPE);
 347             }
 348             break;
 349 
 350         case ACPI_RSC_SOURCE:
 351             /*
 352              * Optional ResourceSource (Index and String)
 353              */
 354             Resource->Length +=
 355                 AcpiRsGetResourceSource (AmlResourceLength, Info->Value,
 356                     Destination, Aml, NULL);
 357             break;
 358 
 359         case ACPI_RSC_SOURCEX:
 360             /*
 361              * Optional ResourceSource (Index and String). This is the more
 362              * complicated case used by the Interrupt() macro
 363              */
 364             Target = ACPI_ADD_PTR (char, Resource,
 365                 Info->AmlOffset + (ItemCount * 4));
 366 
 367             Resource->Length +=
 368                 AcpiRsGetResourceSource (AmlResourceLength, (ACPI_RS_LENGTH)
 369                     (((ItemCount - 1) * sizeof (UINT32)) + Info->Value),
 370                     Destination, Aml, Target);
 371             break;
 372 
 373         case ACPI_RSC_BITMASK:
 374             /*
 375              * 8-bit encoded bitmask (DMA macro)
 376              */
 377             ItemCount = AcpiRsDecodeBitmask (ACPI_GET8 (Source), Destination);
 378             if (ItemCount)
 379             {
 380                 Resource->Length += (ItemCount - 1);
 381             }
 382 
 383             Target = ACPI_ADD_PTR (char, Resource, Info->Value);
 384             ACPI_SET8 (Target, ItemCount);
 385             break;
 386 
 387         case ACPI_RSC_BITMASK16:
 388             /*
 389              * 16-bit encoded bitmask (IRQ macro)
 390              */
 391             ACPI_MOVE_16_TO_16 (&Temp16, Source);
 392 
 393             ItemCount = AcpiRsDecodeBitmask (Temp16, Destination);
 394             if (ItemCount)
 395             {
 396                 Resource->Length += (ItemCount - 1);
 397             }
 398 
 399             Target = ACPI_ADD_PTR (char, Resource, Info->Value);
 400             ACPI_SET8 (Target, ItemCount);
 401             break;
 402 
 403         case ACPI_RSC_EXIT_NE:
 404             /*
 405              * Control - Exit conversion if not equal
 406              */
 407             switch (Info->ResourceOffset)
 408             {
 409             case ACPI_RSC_COMPARE_AML_LENGTH:
 410 
 411                 if (AmlResourceLength != Info->Value)
 412                 {
 413                     goto Exit;
 414                 }
 415                 break;
 416 
 417             case ACPI_RSC_COMPARE_VALUE:
 418 
 419                 if (ACPI_GET8 (Source) != Info->Value)
 420                 {
 421                     goto Exit;
 422                 }
 423                 break;
 424 
 425             default:
 426 
 427                 ACPI_ERROR ((AE_INFO, "Invalid conversion sub-opcode"));
 428                 return_ACPI_STATUS (AE_BAD_PARAMETER);
 429             }
 430             break;
 431 
 432         default:
 433 
 434             ACPI_ERROR ((AE_INFO, "Invalid conversion opcode"));
 435             return_ACPI_STATUS (AE_BAD_PARAMETER);
 436         }
 437 
 438         Count--;
 439         Info++;
 440     }
 441 
 442 Exit:
 443     if (!FlagsMode)
 444     {
 445         /* Round the resource struct length up to the next boundary (32 or 64) */
 446 
 447         Resource->Length = (UINT32) ACPI_ROUND_UP_TO_NATIVE_WORD (Resource->Length);
 448     }
 449     return_ACPI_STATUS (AE_OK);
 450 }
 451 
 452 
 453 /*******************************************************************************
 454  *
 455  * FUNCTION:    AcpiRsConvertResourceToAml
 456  *
 457  * PARAMETERS:  Resource            - Pointer to the resource descriptor
 458  *              Aml                 - Where the AML descriptor is returned
 459  *              Info                - Pointer to appropriate conversion table
 460  *
 461  * RETURN:      Status
 462  *
 463  * DESCRIPTION: Convert an internal resource descriptor to the corresponding
 464  *              external AML resource descriptor.
 465  *
 466  ******************************************************************************/
 467 
 468 ACPI_STATUS
 469 AcpiRsConvertResourceToAml (
 470     ACPI_RESOURCE           *Resource,
 471     AML_RESOURCE            *Aml,
 472     ACPI_RSCONVERT_INFO     *Info)
 473 {
 474     void                    *Source = NULL;
 475     void                    *Destination;
 476     char                    *Target;
 477     ACPI_RSDESC_SIZE        AmlLength = 0;
 478     UINT8                   Count;
 479     UINT16                  Temp16 = 0;
 480     UINT16                  ItemCount = 0;
 481 
 482 
 483     ACPI_FUNCTION_TRACE (RsConvertResourceToAml);
 484 
 485 
 486     if (!Info)
 487     {
 488         return_ACPI_STATUS (AE_BAD_PARAMETER);
 489     }
 490 
 491     /*
 492      * First table entry must be ACPI_RSC_INITxxx and must contain the
 493      * table length (# of table entries)
 494      */
 495     Count = INIT_TABLE_LENGTH (Info);
 496 
 497     while (Count)
 498     {
 499         /*
 500          * Source is the internal resource descriptor,
 501          * destination is the external AML byte stream buffer
 502          */
 503         Source      = ACPI_ADD_PTR (void, Resource, Info->ResourceOffset);
 504         Destination = ACPI_ADD_PTR (void, Aml, Info->AmlOffset);
 505 
 506         switch (Info->Opcode)
 507         {
 508         case ACPI_RSC_INITSET:
 509 
 510             ACPI_MEMSET (Aml, 0, INIT_RESOURCE_LENGTH (Info));
 511             AmlLength = INIT_RESOURCE_LENGTH (Info);
 512             AcpiRsSetResourceHeader (INIT_RESOURCE_TYPE (Info), AmlLength, Aml);
 513             break;
 514 
 515         case ACPI_RSC_INITGET:
 516             break;
 517 
 518         case ACPI_RSC_FLAGINIT:
 519             /*
 520              * Clear the flag byte
 521              */
 522             ACPI_SET8 (Destination, 0);
 523             break;
 524 
 525         case ACPI_RSC_1BITFLAG:
 526             /*
 527              * Mask and shift the flag bit
 528              */
 529             ACPI_SET_BIT (*ACPI_CAST8 (Destination), (UINT8)
 530                 ((ACPI_GET8 (Source) & 0x01) << Info->Value));
 531             break;
 532 
 533         case ACPI_RSC_2BITFLAG:
 534             /*
 535              * Mask and shift the flag bits
 536              */
 537             ACPI_SET_BIT (*ACPI_CAST8 (Destination), (UINT8)
 538                 ((ACPI_GET8 (Source) & 0x03) << Info->Value));
 539             break;
 540 
 541         case ACPI_RSC_3BITFLAG:
 542             /*
 543              * Mask and shift the flag bits
 544              */
 545             ACPI_SET_BIT (*ACPI_CAST8 (Destination), (UINT8)
 546                 ((ACPI_GET8 (Source) & 0x07) << Info->Value));
 547             break;
 548 
 549         case ACPI_RSC_COUNT:
 550 
 551             ItemCount = ACPI_GET8 (Source);
 552             ACPI_SET8 (Destination, ItemCount);
 553 
 554             AmlLength = (UINT16) (AmlLength + (Info->Value * (ItemCount - 1)));
 555             break;
 556 
 557         case ACPI_RSC_COUNT16:
 558 
 559             ItemCount = ACPI_GET16 (Source);
 560             AmlLength = (UINT16) (AmlLength + ItemCount);
 561             AcpiRsSetResourceLength (AmlLength, Aml);
 562             break;
 563 
 564         case ACPI_RSC_COUNT_GPIO_PIN:
 565 
 566             ItemCount = ACPI_GET16 (Source);
 567             ACPI_SET16 (Destination, AmlLength);
 568 
 569             AmlLength = (UINT16) (AmlLength + ItemCount * 2);
 570             Target = ACPI_ADD_PTR (void, Aml, Info->Value);
 571             ACPI_SET16 (Target, AmlLength);
 572             AcpiRsSetResourceLength (AmlLength, Aml);
 573             break;
 574 
 575         case ACPI_RSC_COUNT_GPIO_VEN:
 576 
 577             ItemCount = ACPI_GET16 (Source);
 578             ACPI_SET16 (Destination, ItemCount);
 579 
 580             AmlLength = (UINT16) (AmlLength + (Info->Value * ItemCount));
 581             AcpiRsSetResourceLength (AmlLength, Aml);
 582             break;
 583 
 584         case ACPI_RSC_COUNT_GPIO_RES:
 585 
 586             /* Set resource source string length */
 587 
 588             ItemCount = ACPI_GET16 (Source);
 589             ACPI_SET16 (Destination, AmlLength);
 590 
 591             /* Compute offset for the Vendor Data */
 592 
 593             AmlLength = (UINT16) (AmlLength + ItemCount);
 594             Target = ACPI_ADD_PTR (void, Aml, Info->Value);
 595 
 596             /* Set vendor offset only if there is vendor data */
 597 
 598             if (Resource->Data.Gpio.VendorLength)
 599             {
 600                 ACPI_SET16 (Target, AmlLength);
 601             }
 602 
 603             AcpiRsSetResourceLength (AmlLength, Aml);
 604             break;
 605 
 606         case ACPI_RSC_COUNT_SERIAL_VEN:
 607 
 608             ItemCount = ACPI_GET16 (Source);
 609             ACPI_SET16 (Destination, ItemCount + Info->Value);
 610             AmlLength = (UINT16) (AmlLength + ItemCount);
 611             AcpiRsSetResourceLength (AmlLength, Aml);
 612             break;
 613 
 614         case ACPI_RSC_COUNT_SERIAL_RES:
 615 
 616             ItemCount = ACPI_GET16 (Source);
 617             AmlLength = (UINT16) (AmlLength + ItemCount);
 618             AcpiRsSetResourceLength (AmlLength, Aml);
 619             break;
 620 
 621         case ACPI_RSC_LENGTH:
 622 
 623             AcpiRsSetResourceLength (Info->Value, Aml);
 624             break;
 625 
 626         case ACPI_RSC_MOVE8:
 627         case ACPI_RSC_MOVE16:
 628         case ACPI_RSC_MOVE32:
 629         case ACPI_RSC_MOVE64:
 630 
 631             if (Info->Value)
 632             {
 633                 ItemCount = Info->Value;
 634             }
 635             AcpiRsMoveData (Destination, Source, ItemCount, Info->Opcode);
 636             break;
 637 
 638         case ACPI_RSC_MOVE_GPIO_PIN:
 639 
 640             Destination = (char *) ACPI_ADD_PTR (void, Aml,
 641                   ACPI_GET16 (Destination));
 642             Source = * (UINT16 **) Source;
 643             AcpiRsMoveData (Destination, Source, ItemCount, Info->Opcode);
 644             break;
 645 
 646         case ACPI_RSC_MOVE_GPIO_RES:
 647 
 648             /* Used for both ResourceSource string and VendorData */
 649 
 650             Destination = (char *) ACPI_ADD_PTR (void, Aml,
 651                   ACPI_GET16 (Destination));
 652             Source = * (UINT8 **) Source;
 653             AcpiRsMoveData (Destination, Source, ItemCount, Info->Opcode);
 654             break;
 655 
 656         case ACPI_RSC_MOVE_SERIAL_VEN:
 657 
 658             Destination = (char *) ACPI_ADD_PTR (void, Aml,
 659                   (AmlLength - ItemCount));
 660             Source = * (UINT8 **) Source;
 661             AcpiRsMoveData (Destination, Source, ItemCount, Info->Opcode);
 662             break;
 663 
 664         case ACPI_RSC_MOVE_SERIAL_RES:
 665 
 666             Destination = (char *) ACPI_ADD_PTR (void, Aml,
 667                   (AmlLength - ItemCount));
 668             Source = * (UINT8 **) Source;
 669             AcpiRsMoveData (Destination, Source, ItemCount, Info->Opcode);
 670             break;
 671 
 672         case ACPI_RSC_ADDRESS:
 673 
 674             /* Set the Resource Type, General Flags, and Type-Specific Flags */
 675 
 676             AcpiRsSetAddressCommon (Aml, Resource);
 677             break;
 678 
 679         case ACPI_RSC_SOURCEX:
 680             /*
 681              * Optional ResourceSource (Index and String)
 682              */
 683             AmlLength = AcpiRsSetResourceSource (
 684                             Aml, (ACPI_RS_LENGTH) AmlLength, Source);
 685             AcpiRsSetResourceLength (AmlLength, Aml);
 686             break;
 687 
 688         case ACPI_RSC_SOURCE:
 689             /*
 690              * Optional ResourceSource (Index and String). This is the more
 691              * complicated case used by the Interrupt() macro
 692              */
 693             AmlLength = AcpiRsSetResourceSource (Aml, Info->Value, Source);
 694             AcpiRsSetResourceLength (AmlLength, Aml);
 695             break;
 696 
 697         case ACPI_RSC_BITMASK:
 698             /*
 699              * 8-bit encoded bitmask (DMA macro)
 700              */
 701             ACPI_SET8 (Destination,
 702                 AcpiRsEncodeBitmask (Source,
 703                     *ACPI_ADD_PTR (UINT8, Resource, Info->Value)));
 704             break;
 705 
 706         case ACPI_RSC_BITMASK16:
 707             /*
 708              * 16-bit encoded bitmask (IRQ macro)
 709              */
 710             Temp16 = AcpiRsEncodeBitmask (Source,
 711                         *ACPI_ADD_PTR (UINT8, Resource, Info->Value));
 712             ACPI_MOVE_16_TO_16 (Destination, &Temp16);
 713             break;
 714 
 715         case ACPI_RSC_EXIT_LE:
 716             /*
 717              * Control - Exit conversion if less than or equal
 718              */
 719             if (ItemCount <= Info->Value)
 720             {
 721                 goto Exit;
 722             }
 723             break;
 724 
 725         case ACPI_RSC_EXIT_NE:
 726             /*
 727              * Control - Exit conversion if not equal
 728              */
 729             switch (COMPARE_OPCODE (Info))
 730             {
 731             case ACPI_RSC_COMPARE_VALUE:
 732 
 733                 if (*ACPI_ADD_PTR (UINT8, Resource,
 734                         COMPARE_TARGET (Info)) != COMPARE_VALUE (Info))
 735                 {
 736                     goto Exit;
 737                 }
 738                 break;
 739 
 740             default:
 741 
 742                 ACPI_ERROR ((AE_INFO, "Invalid conversion sub-opcode"));
 743                 return_ACPI_STATUS (AE_BAD_PARAMETER);
 744             }
 745             break;
 746 
 747         case ACPI_RSC_EXIT_EQ:
 748             /*
 749              * Control - Exit conversion if equal
 750              */
 751             if (*ACPI_ADD_PTR (UINT8, Resource,
 752                     COMPARE_TARGET (Info)) == COMPARE_VALUE (Info))
 753             {
 754                 goto Exit;
 755             }
 756             break;
 757 
 758         default:
 759 
 760             ACPI_ERROR ((AE_INFO, "Invalid conversion opcode"));
 761             return_ACPI_STATUS (AE_BAD_PARAMETER);
 762         }
 763 
 764         Count--;
 765         Info++;
 766     }
 767 
 768 Exit:
 769     return_ACPI_STATUS (AE_OK);
 770 }
 771 
 772 
 773 #if 0
 774 /* Previous resource validations */
 775 
 776     if (Aml->ExtAddress64.RevisionID != AML_RESOURCE_EXTENDED_ADDRESS_REVISION)
 777     {
 778         return_ACPI_STATUS (AE_SUPPORT);
 779     }
 780 
 781     if (Resource->Data.StartDpf.PerformanceRobustness >= 3)
 782     {
 783         return_ACPI_STATUS (AE_AML_BAD_RESOURCE_VALUE);
 784     }
 785 
 786     if (((Aml->Irq.Flags & 0x09) == 0x00) ||
 787         ((Aml->Irq.Flags & 0x09) == 0x09))
 788     {
 789         /*
 790          * Only [ActiveHigh, EdgeSensitive] or [ActiveLow, LevelSensitive]
 791          * polarity/trigger interrupts are allowed (ACPI spec, section
 792          * "IRQ Format"), so 0x00 and 0x09 are illegal.
 793          */
 794         ACPI_ERROR ((AE_INFO,
 795             "Invalid interrupt polarity/trigger in resource list, 0x%X",
 796             Aml->Irq.Flags));
 797         return_ACPI_STATUS (AE_BAD_DATA);
 798     }
 799 
 800     Resource->Data.ExtendedIrq.InterruptCount = Temp8;
 801     if (Temp8 < 1)
 802     {
 803         /* Must have at least one IRQ */
 804 
 805         return_ACPI_STATUS (AE_AML_BAD_RESOURCE_LENGTH);
 806     }
 807 
 808     if (Resource->Data.Dma.Transfer == 0x03)
 809     {
 810         ACPI_ERROR ((AE_INFO,
 811             "Invalid DMA.Transfer preference (3)"));
 812         return_ACPI_STATUS (AE_BAD_DATA);
 813     }
 814 #endif