1 /******************************************************************************
   2  *
   3  * Module Name: dsfield - Dispatcher field routines
   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 __DSFIELD_C__
  45 
  46 #include "acpi.h"
  47 #include "accommon.h"
  48 #include "amlcode.h"
  49 #include "acdispat.h"
  50 #include "acinterp.h"
  51 #include "acnamesp.h"
  52 #include "acparser.h"
  53 
  54 
  55 #define _COMPONENT          ACPI_DISPATCHER
  56         ACPI_MODULE_NAME    ("dsfield")
  57 
  58 /* Local prototypes */
  59 
  60 #ifdef ACPI_ASL_COMPILER
  61 #include "acdisasm.h"
  62 
  63 static ACPI_STATUS
  64 AcpiDsCreateExternalRegion (
  65     ACPI_STATUS             LookupStatus,
  66     ACPI_PARSE_OBJECT       *Op,
  67     char                    *Path,
  68     ACPI_WALK_STATE         *WalkState,
  69     ACPI_NAMESPACE_NODE     **Node);
  70 #endif
  71 
  72 static ACPI_STATUS
  73 AcpiDsGetFieldNames (
  74     ACPI_CREATE_FIELD_INFO  *Info,
  75     ACPI_WALK_STATE         *WalkState,
  76     ACPI_PARSE_OBJECT       *Arg);
  77 
  78 
  79 #ifdef ACPI_ASL_COMPILER
  80 /*******************************************************************************
  81  *
  82  * FUNCTION:    AcpiDsCreateExternalRegion (iASL Disassembler only)
  83  *
  84  * PARAMETERS:  LookupStatus    - Status from NsLookup operation
  85  *              Op              - Op containing the Field definition and args
  86  *              Path            - Pathname of the region
  87  *  `           WalkState       - Current method state
  88  *              Node            - Where the new region node is returned
  89  *
  90  * RETURN:      Status
  91  *
  92  * DESCRIPTION: Add region to the external list if NOT_FOUND. Create a new
  93  *              region node/object.
  94  *
  95  ******************************************************************************/
  96 
  97 static ACPI_STATUS
  98 AcpiDsCreateExternalRegion (
  99     ACPI_STATUS             LookupStatus,
 100     ACPI_PARSE_OBJECT       *Op,
 101     char                    *Path,
 102     ACPI_WALK_STATE         *WalkState,
 103     ACPI_NAMESPACE_NODE     **Node)
 104 {
 105     ACPI_STATUS             Status;
 106     ACPI_OPERAND_OBJECT     *ObjDesc;
 107 
 108 
 109     if (LookupStatus != AE_NOT_FOUND)
 110     {
 111         return (LookupStatus);
 112     }
 113 
 114     /*
 115      * Table disassembly:
 116      * OperationRegion not found. Generate an External for it, and
 117      * insert the name into the namespace.
 118      */
 119     AcpiDmAddOpToExternalList (Op, Path, ACPI_TYPE_REGION, 0, 0);
 120     Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ACPI_TYPE_REGION,
 121        ACPI_IMODE_LOAD_PASS1, ACPI_NS_SEARCH_PARENT, WalkState, Node);
 122     if (ACPI_FAILURE (Status))
 123     {
 124         return (Status);
 125     }
 126 
 127     /* Must create and install a region object for the new node */
 128 
 129     ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_REGION);
 130     if (!ObjDesc)
 131     {
 132         return (AE_NO_MEMORY);
 133     }
 134 
 135     ObjDesc->Region.Node = *Node;
 136     Status = AcpiNsAttachObject (*Node, ObjDesc, ACPI_TYPE_REGION);
 137     return (Status);
 138 }
 139 #endif
 140 
 141 
 142 /*******************************************************************************
 143  *
 144  * FUNCTION:    AcpiDsCreateBufferField
 145  *
 146  * PARAMETERS:  Op                  - Current parse op (CreateXXField)
 147  *              WalkState           - Current state
 148  *
 149  * RETURN:      Status
 150  *
 151  * DESCRIPTION: Execute the CreateField operators:
 152  *              CreateBitFieldOp,
 153  *              CreateByteFieldOp,
 154  *              CreateWordFieldOp,
 155  *              CreateDwordFieldOp,
 156  *              CreateQwordFieldOp,
 157  *              CreateFieldOp       (all of which define a field in a buffer)
 158  *
 159  ******************************************************************************/
 160 
 161 ACPI_STATUS
 162 AcpiDsCreateBufferField (
 163     ACPI_PARSE_OBJECT       *Op,
 164     ACPI_WALK_STATE         *WalkState)
 165 {
 166     ACPI_PARSE_OBJECT       *Arg;
 167     ACPI_NAMESPACE_NODE     *Node;
 168     ACPI_STATUS             Status;
 169     ACPI_OPERAND_OBJECT     *ObjDesc;
 170     ACPI_OPERAND_OBJECT     *SecondDesc = NULL;
 171     UINT32                  Flags;
 172 
 173 
 174     ACPI_FUNCTION_TRACE (DsCreateBufferField);
 175 
 176 
 177     /*
 178      * Get the NameString argument (name of the new BufferField)
 179      */
 180     if (Op->Common.AmlOpcode == AML_CREATE_FIELD_OP)
 181     {
 182         /* For CreateField, name is the 4th argument */
 183 
 184         Arg = AcpiPsGetArg (Op, 3);
 185     }
 186     else
 187     {
 188         /* For all other CreateXXXField operators, name is the 3rd argument */
 189 
 190         Arg = AcpiPsGetArg (Op, 2);
 191     }
 192 
 193     if (!Arg)
 194     {
 195         return_ACPI_STATUS (AE_AML_NO_OPERAND);
 196     }
 197 
 198     if (WalkState->DeferredNode)
 199     {
 200         Node = WalkState->DeferredNode;
 201         Status = AE_OK;
 202     }
 203     else
 204     {
 205         /* Execute flag should always be set when this function is entered */
 206 
 207         if (!(WalkState->ParseFlags & ACPI_PARSE_EXECUTE))
 208         {
 209             return_ACPI_STATUS (AE_AML_INTERNAL);
 210         }
 211 
 212         /* Creating new namespace node, should not already exist */
 213 
 214         Flags = ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE |
 215                 ACPI_NS_ERROR_IF_FOUND;
 216 
 217         /*
 218          * Mark node temporary if we are executing a normal control
 219          * method. (Don't mark if this is a module-level code method)
 220          */
 221         if (WalkState->MethodNode &&
 222             !(WalkState->ParseFlags & ACPI_PARSE_MODULE_LEVEL))
 223         {
 224             Flags |= ACPI_NS_TEMPORARY;
 225         }
 226 
 227         /* Enter the NameString into the namespace */
 228 
 229         Status = AcpiNsLookup (WalkState->ScopeInfo, Arg->Common.Value.String,
 230                     ACPI_TYPE_ANY, ACPI_IMODE_LOAD_PASS1,
 231                     Flags, WalkState, &Node);
 232         if (ACPI_FAILURE (Status))
 233         {
 234             ACPI_ERROR_NAMESPACE (Arg->Common.Value.String, Status);
 235             return_ACPI_STATUS (Status);
 236         }
 237     }
 238 
 239     /*
 240      * We could put the returned object (Node) on the object stack for later,
 241      * but for now, we will put it in the "op" object that the parser uses,
 242      * so we can get it again at the end of this scope.
 243      */
 244     Op->Common.Node = Node;
 245 
 246     /*
 247      * If there is no object attached to the node, this node was just created
 248      * and we need to create the field object. Otherwise, this was a lookup
 249      * of an existing node and we don't want to create the field object again.
 250      */
 251     ObjDesc = AcpiNsGetAttachedObject (Node);
 252     if (ObjDesc)
 253     {
 254         return_ACPI_STATUS (AE_OK);
 255     }
 256 
 257     /*
 258      * The Field definition is not fully parsed at this time.
 259      * (We must save the address of the AML for the buffer and index operands)
 260      */
 261 
 262     /* Create the buffer field object */
 263 
 264     ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_BUFFER_FIELD);
 265     if (!ObjDesc)
 266     {
 267         Status = AE_NO_MEMORY;
 268         goto Cleanup;
 269     }
 270 
 271     /*
 272      * Remember location in AML stream of the field unit opcode and operands --
 273      * since the buffer and index operands must be evaluated.
 274      */
 275     SecondDesc                  = ObjDesc->Common.NextObject;
 276     SecondDesc->Extra.AmlStart  = Op->Named.Data;
 277     SecondDesc->Extra.AmlLength = Op->Named.Length;
 278     ObjDesc->BufferField.Node   = Node;
 279 
 280     /* Attach constructed field descriptors to parent node */
 281 
 282     Status = AcpiNsAttachObject (Node, ObjDesc, ACPI_TYPE_BUFFER_FIELD);
 283     if (ACPI_FAILURE (Status))
 284     {
 285         goto Cleanup;
 286     }
 287 
 288 
 289 Cleanup:
 290 
 291     /* Remove local reference to the object */
 292 
 293     AcpiUtRemoveReference (ObjDesc);
 294     return_ACPI_STATUS (Status);
 295 }
 296 
 297 
 298 /*******************************************************************************
 299  *
 300  * FUNCTION:    AcpiDsGetFieldNames
 301  *
 302  * PARAMETERS:  Info            - CreateField info structure
 303  *  `           WalkState       - Current method state
 304  *              Arg             - First parser arg for the field name list
 305  *
 306  * RETURN:      Status
 307  *
 308  * DESCRIPTION: Process all named fields in a field declaration. Names are
 309  *              entered into the namespace.
 310  *
 311  ******************************************************************************/
 312 
 313 static ACPI_STATUS
 314 AcpiDsGetFieldNames (
 315     ACPI_CREATE_FIELD_INFO  *Info,
 316     ACPI_WALK_STATE         *WalkState,
 317     ACPI_PARSE_OBJECT       *Arg)
 318 {
 319     ACPI_STATUS             Status;
 320     UINT64                  Position;
 321     ACPI_PARSE_OBJECT       *Child;
 322 
 323 
 324     ACPI_FUNCTION_TRACE_PTR (DsGetFieldNames, Info);
 325 
 326 
 327     /* First field starts at bit zero */
 328 
 329     Info->FieldBitPosition = 0;
 330 
 331     /* Process all elements in the field list (of parse nodes) */
 332 
 333     while (Arg)
 334     {
 335         /*
 336          * Four types of field elements are handled:
 337          * 1) Name - Enters a new named field into the namespace
 338          * 2) Offset - specifies a bit offset
 339          * 3) AccessAs - changes the access mode/attributes
 340          * 4) Connection - Associate a resource template with the field
 341          */
 342         switch (Arg->Common.AmlOpcode)
 343         {
 344         case AML_INT_RESERVEDFIELD_OP:
 345 
 346             Position = (UINT64) Info->FieldBitPosition
 347                         + (UINT64) Arg->Common.Value.Size;
 348 
 349             if (Position > ACPI_UINT32_MAX)
 350             {
 351                 ACPI_ERROR ((AE_INFO,
 352                     "Bit offset within field too large (> 0xFFFFFFFF)"));
 353                 return_ACPI_STATUS (AE_SUPPORT);
 354             }
 355 
 356             Info->FieldBitPosition = (UINT32) Position;
 357             break;
 358 
 359         case AML_INT_ACCESSFIELD_OP:
 360         case AML_INT_EXTACCESSFIELD_OP:
 361             /*
 362              * Get new AccessType, AccessAttribute, and AccessLength fields
 363              * -- to be used for all field units that follow, until the
 364              * end-of-field or another AccessAs keyword is encountered.
 365              * NOTE. These three bytes are encoded in the integer value
 366              * of the parseop for convenience.
 367              *
 368              * In FieldFlags, preserve the flag bits other than the
 369              * ACCESS_TYPE bits.
 370              */
 371 
 372             /* AccessType (ByteAcc, WordAcc, etc.) */
 373 
 374             Info->FieldFlags = (UINT8)
 375                 ((Info->FieldFlags & ~(AML_FIELD_ACCESS_TYPE_MASK)) |
 376                 ((UINT8) ((UINT32) (Arg->Common.Value.Integer & 0x07))));
 377 
 378             /* AccessAttribute (AttribQuick, AttribByte, etc.) */
 379 
 380             Info->Attribute = (UINT8) ((Arg->Common.Value.Integer >> 8) & 0xFF);
 381 
 382             /* AccessLength (for serial/buffer protocols) */
 383 
 384             Info->AccessLength = (UINT8) ((Arg->Common.Value.Integer >> 16) & 0xFF);
 385             break;
 386 
 387         case AML_INT_CONNECTION_OP:
 388             /*
 389              * Clear any previous connection. New connection is used for all
 390              * fields that follow, similar to AccessAs
 391              */
 392             Info->ResourceBuffer = NULL;
 393             Info->ConnectionNode = NULL;
 394 
 395             /*
 396              * A Connection() is either an actual resource descriptor (buffer)
 397              * or a named reference to a resource template
 398              */
 399             Child = Arg->Common.Value.Arg;
 400             if (Child->Common.AmlOpcode == AML_INT_BYTELIST_OP)
 401             {
 402                 Info->ResourceBuffer = Child->Named.Data;
 403                 Info->ResourceLength = (UINT16) Child->Named.Value.Integer;
 404             }
 405             else
 406             {
 407                 /* Lookup the Connection() namepath, it should already exist */
 408 
 409                 Status = AcpiNsLookup (WalkState->ScopeInfo,
 410                             Child->Common.Value.Name, ACPI_TYPE_ANY,
 411                             ACPI_IMODE_EXECUTE, ACPI_NS_DONT_OPEN_SCOPE,
 412                             WalkState, &Info->ConnectionNode);
 413                 if (ACPI_FAILURE (Status))
 414                 {
 415                     ACPI_ERROR_NAMESPACE (Child->Common.Value.Name, Status);
 416                     return_ACPI_STATUS (Status);
 417                 }
 418             }
 419             break;
 420 
 421         case AML_INT_NAMEDFIELD_OP:
 422 
 423             /* Lookup the name, it should already exist */
 424 
 425             Status = AcpiNsLookup (WalkState->ScopeInfo,
 426                         (char *) &Arg->Named.Name, Info->FieldType,
 427                         ACPI_IMODE_EXECUTE, ACPI_NS_DONT_OPEN_SCOPE,
 428                         WalkState, &Info->FieldNode);
 429             if (ACPI_FAILURE (Status))
 430             {
 431                 ACPI_ERROR_NAMESPACE ((char *) &Arg->Named.Name, Status);
 432                 return_ACPI_STATUS (Status);
 433             }
 434             else
 435             {
 436                 Arg->Common.Node = Info->FieldNode;
 437                 Info->FieldBitLength = Arg->Common.Value.Size;
 438 
 439                 /*
 440                  * If there is no object attached to the node, this node was
 441                  * just created and we need to create the field object.
 442                  * Otherwise, this was a lookup of an existing node and we
 443                  * don't want to create the field object again.
 444                  */
 445                 if (!AcpiNsGetAttachedObject (Info->FieldNode))
 446                 {
 447                     Status = AcpiExPrepFieldValue (Info);
 448                     if (ACPI_FAILURE (Status))
 449                     {
 450                         return_ACPI_STATUS (Status);
 451                     }
 452                 }
 453             }
 454 
 455             /* Keep track of bit position for the next field */
 456 
 457             Position = (UINT64) Info->FieldBitPosition
 458                         + (UINT64) Arg->Common.Value.Size;
 459 
 460             if (Position > ACPI_UINT32_MAX)
 461             {
 462                 ACPI_ERROR ((AE_INFO,
 463                     "Field [%4.4s] bit offset too large (> 0xFFFFFFFF)",
 464                     ACPI_CAST_PTR (char, &Info->FieldNode->Name)));
 465                 return_ACPI_STATUS (AE_SUPPORT);
 466             }
 467 
 468             Info->FieldBitPosition += Info->FieldBitLength;
 469             break;
 470 
 471         default:
 472 
 473             ACPI_ERROR ((AE_INFO,
 474                 "Invalid opcode in field list: 0x%X", Arg->Common.AmlOpcode));
 475             return_ACPI_STATUS (AE_AML_BAD_OPCODE);
 476         }
 477 
 478         Arg = Arg->Common.Next;
 479     }
 480 
 481     return_ACPI_STATUS (AE_OK);
 482 }
 483 
 484 
 485 /*******************************************************************************
 486  *
 487  * FUNCTION:    AcpiDsCreateField
 488  *
 489  * PARAMETERS:  Op              - Op containing the Field definition and args
 490  *              RegionNode      - Object for the containing Operation Region
 491  *  `           WalkState       - Current method state
 492  *
 493  * RETURN:      Status
 494  *
 495  * DESCRIPTION: Create a new field in the specified operation region
 496  *
 497  ******************************************************************************/
 498 
 499 ACPI_STATUS
 500 AcpiDsCreateField (
 501     ACPI_PARSE_OBJECT       *Op,
 502     ACPI_NAMESPACE_NODE     *RegionNode,
 503     ACPI_WALK_STATE         *WalkState)
 504 {
 505     ACPI_STATUS             Status;
 506     ACPI_PARSE_OBJECT       *Arg;
 507     ACPI_CREATE_FIELD_INFO  Info;
 508 
 509 
 510     ACPI_FUNCTION_TRACE_PTR (DsCreateField, Op);
 511 
 512 
 513     /* First arg is the name of the parent OpRegion (must already exist) */
 514 
 515     Arg = Op->Common.Value.Arg;
 516 
 517     if (!RegionNode)
 518     {
 519         Status = AcpiNsLookup (WalkState->ScopeInfo, Arg->Common.Value.Name,
 520                         ACPI_TYPE_REGION, ACPI_IMODE_EXECUTE,
 521                         ACPI_NS_SEARCH_PARENT, WalkState, &RegionNode);
 522 #ifdef ACPI_ASL_COMPILER
 523         Status = AcpiDsCreateExternalRegion (Status, Arg,
 524             Arg->Common.Value.Name, WalkState, &RegionNode);
 525 #endif
 526         if (ACPI_FAILURE (Status))
 527         {
 528             ACPI_ERROR_NAMESPACE (Arg->Common.Value.Name, Status);
 529             return_ACPI_STATUS (Status);
 530         }
 531     }
 532 
 533     ACPI_MEMSET (&Info, 0, sizeof (ACPI_CREATE_FIELD_INFO));
 534 
 535     /* Second arg is the field flags */
 536 
 537     Arg = Arg->Common.Next;
 538     Info.FieldFlags = (UINT8) Arg->Common.Value.Integer;
 539     Info.Attribute = 0;
 540 
 541     /* Each remaining arg is a Named Field */
 542 
 543     Info.FieldType = ACPI_TYPE_LOCAL_REGION_FIELD;
 544     Info.RegionNode = RegionNode;
 545 
 546     Status = AcpiDsGetFieldNames (&Info, WalkState, Arg->Common.Next);
 547     return_ACPI_STATUS (Status);
 548 }
 549 
 550 
 551 /*******************************************************************************
 552  *
 553  * FUNCTION:    AcpiDsInitFieldObjects
 554  *
 555  * PARAMETERS:  Op              - Op containing the Field definition and args
 556  *  `           WalkState       - Current method state
 557  *
 558  * RETURN:      Status
 559  *
 560  * DESCRIPTION: For each "Field Unit" name in the argument list that is
 561  *              part of the field declaration, enter the name into the
 562  *              namespace.
 563  *
 564  ******************************************************************************/
 565 
 566 ACPI_STATUS
 567 AcpiDsInitFieldObjects (
 568     ACPI_PARSE_OBJECT       *Op,
 569     ACPI_WALK_STATE         *WalkState)
 570 {
 571     ACPI_STATUS             Status;
 572     ACPI_PARSE_OBJECT       *Arg = NULL;
 573     ACPI_NAMESPACE_NODE     *Node;
 574     UINT8                   Type = 0;
 575     UINT32                  Flags;
 576 
 577 
 578     ACPI_FUNCTION_TRACE_PTR (DsInitFieldObjects, Op);
 579 
 580 
 581     /* Execute flag should always be set when this function is entered */
 582 
 583     if (!(WalkState->ParseFlags & ACPI_PARSE_EXECUTE))
 584     {
 585         if (WalkState->ParseFlags & ACPI_PARSE_DEFERRED_OP)
 586         {
 587             /* BankField Op is deferred, just return OK */
 588 
 589             return_ACPI_STATUS (AE_OK);
 590         }
 591 
 592         return_ACPI_STATUS (AE_AML_INTERNAL);
 593     }
 594 
 595     /*
 596      * Get the FieldList argument for this opcode. This is the start of the
 597      * list of field elements.
 598      */
 599     switch (WalkState->Opcode)
 600     {
 601     case AML_FIELD_OP:
 602 
 603         Arg = AcpiPsGetArg (Op, 2);
 604         Type = ACPI_TYPE_LOCAL_REGION_FIELD;
 605         break;
 606 
 607     case AML_BANK_FIELD_OP:
 608 
 609         Arg = AcpiPsGetArg (Op, 4);
 610         Type = ACPI_TYPE_LOCAL_BANK_FIELD;
 611         break;
 612 
 613     case AML_INDEX_FIELD_OP:
 614 
 615         Arg = AcpiPsGetArg (Op, 3);
 616         Type = ACPI_TYPE_LOCAL_INDEX_FIELD;
 617         break;
 618 
 619     default:
 620 
 621         return_ACPI_STATUS (AE_BAD_PARAMETER);
 622     }
 623 
 624     /* Creating new namespace node(s), should not already exist */
 625 
 626     Flags = ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE |
 627             ACPI_NS_ERROR_IF_FOUND;
 628 
 629     /*
 630      * Mark node(s) temporary if we are executing a normal control
 631      * method. (Don't mark if this is a module-level code method)
 632      */
 633     if (WalkState->MethodNode &&
 634         !(WalkState->ParseFlags & ACPI_PARSE_MODULE_LEVEL))
 635     {
 636         Flags |= ACPI_NS_TEMPORARY;
 637     }
 638 
 639     /*
 640      * Walk the list of entries in the FieldList
 641      * Note: FieldList can be of zero length. In this case, Arg will be NULL.
 642      */
 643     while (Arg)
 644     {
 645         /*
 646          * Ignore OFFSET/ACCESSAS/CONNECTION terms here; we are only interested
 647          * in the field names in order to enter them into the namespace.
 648          */
 649         if (Arg->Common.AmlOpcode == AML_INT_NAMEDFIELD_OP)
 650         {
 651             Status = AcpiNsLookup (WalkState->ScopeInfo,
 652                         (char *) &Arg->Named.Name, Type, ACPI_IMODE_LOAD_PASS1,
 653                         Flags, WalkState, &Node);
 654             if (ACPI_FAILURE (Status))
 655             {
 656                 ACPI_ERROR_NAMESPACE ((char *) &Arg->Named.Name, Status);
 657                 if (Status != AE_ALREADY_EXISTS)
 658                 {
 659                     return_ACPI_STATUS (Status);
 660                 }
 661 
 662                 /* Name already exists, just ignore this error */
 663 
 664                 Status = AE_OK;
 665             }
 666 
 667             Arg->Common.Node = Node;
 668         }
 669 
 670         /* Get the next field element in the list */
 671 
 672         Arg = Arg->Common.Next;
 673     }
 674 
 675     return_ACPI_STATUS (AE_OK);
 676 }
 677 
 678 
 679 /*******************************************************************************
 680  *
 681  * FUNCTION:    AcpiDsCreateBankField
 682  *
 683  * PARAMETERS:  Op              - Op containing the Field definition and args
 684  *              RegionNode      - Object for the containing Operation Region
 685  *              WalkState       - Current method state
 686  *
 687  * RETURN:      Status
 688  *
 689  * DESCRIPTION: Create a new bank field in the specified operation region
 690  *
 691  ******************************************************************************/
 692 
 693 ACPI_STATUS
 694 AcpiDsCreateBankField (
 695     ACPI_PARSE_OBJECT       *Op,
 696     ACPI_NAMESPACE_NODE     *RegionNode,
 697     ACPI_WALK_STATE         *WalkState)
 698 {
 699     ACPI_STATUS             Status;
 700     ACPI_PARSE_OBJECT       *Arg;
 701     ACPI_CREATE_FIELD_INFO  Info;
 702 
 703 
 704     ACPI_FUNCTION_TRACE_PTR (DsCreateBankField, Op);
 705 
 706 
 707     /* First arg is the name of the parent OpRegion (must already exist) */
 708 
 709     Arg = Op->Common.Value.Arg;
 710     if (!RegionNode)
 711     {
 712         Status = AcpiNsLookup (WalkState->ScopeInfo, Arg->Common.Value.Name,
 713                         ACPI_TYPE_REGION, ACPI_IMODE_EXECUTE,
 714                         ACPI_NS_SEARCH_PARENT, WalkState, &RegionNode);
 715 #ifdef ACPI_ASL_COMPILER
 716         Status = AcpiDsCreateExternalRegion (Status, Arg,
 717             Arg->Common.Value.Name, WalkState, &RegionNode);
 718 #endif
 719         if (ACPI_FAILURE (Status))
 720         {
 721             ACPI_ERROR_NAMESPACE (Arg->Common.Value.Name, Status);
 722             return_ACPI_STATUS (Status);
 723         }
 724     }
 725 
 726     /* Second arg is the Bank Register (Field) (must already exist) */
 727 
 728     Arg = Arg->Common.Next;
 729     Status = AcpiNsLookup (WalkState->ScopeInfo, Arg->Common.Value.String,
 730                     ACPI_TYPE_ANY, ACPI_IMODE_EXECUTE,
 731                     ACPI_NS_SEARCH_PARENT, WalkState, &Info.RegisterNode);
 732     if (ACPI_FAILURE (Status))
 733     {
 734         ACPI_ERROR_NAMESPACE (Arg->Common.Value.String, Status);
 735         return_ACPI_STATUS (Status);
 736     }
 737 
 738     /*
 739      * Third arg is the BankValue
 740      * This arg is a TermArg, not a constant
 741      * It will be evaluated later, by AcpiDsEvalBankFieldOperands
 742      */
 743     Arg = Arg->Common.Next;
 744 
 745     /* Fourth arg is the field flags */
 746 
 747     Arg = Arg->Common.Next;
 748     Info.FieldFlags = (UINT8) Arg->Common.Value.Integer;
 749 
 750     /* Each remaining arg is a Named Field */
 751 
 752     Info.FieldType = ACPI_TYPE_LOCAL_BANK_FIELD;
 753     Info.RegionNode = RegionNode;
 754 
 755     /*
 756      * Use Info.DataRegisterNode to store BankField Op
 757      * It's safe because DataRegisterNode will never be used when create bank field
 758      * We store AmlStart and AmlLength in the BankField Op for late evaluation
 759      * Used in AcpiExPrepFieldValue(Info)
 760      *
 761      * TBD: Or, should we add a field in ACPI_CREATE_FIELD_INFO, like "void *ParentOp"?
 762      */
 763     Info.DataRegisterNode = (ACPI_NAMESPACE_NODE*) Op;
 764 
 765     Status = AcpiDsGetFieldNames (&Info, WalkState, Arg->Common.Next);
 766     return_ACPI_STATUS (Status);
 767 }
 768 
 769 
 770 /*******************************************************************************
 771  *
 772  * FUNCTION:    AcpiDsCreateIndexField
 773  *
 774  * PARAMETERS:  Op              - Op containing the Field definition and args
 775  *              RegionNode      - Object for the containing Operation Region
 776  *  `           WalkState       - Current method state
 777  *
 778  * RETURN:      Status
 779  *
 780  * DESCRIPTION: Create a new index field in the specified operation region
 781  *
 782  ******************************************************************************/
 783 
 784 ACPI_STATUS
 785 AcpiDsCreateIndexField (
 786     ACPI_PARSE_OBJECT       *Op,
 787     ACPI_NAMESPACE_NODE     *RegionNode,
 788     ACPI_WALK_STATE         *WalkState)
 789 {
 790     ACPI_STATUS             Status;
 791     ACPI_PARSE_OBJECT       *Arg;
 792     ACPI_CREATE_FIELD_INFO  Info;
 793 
 794 
 795     ACPI_FUNCTION_TRACE_PTR (DsCreateIndexField, Op);
 796 
 797 
 798     /* First arg is the name of the Index register (must already exist) */
 799 
 800     Arg = Op->Common.Value.Arg;
 801     Status = AcpiNsLookup (WalkState->ScopeInfo, Arg->Common.Value.String,
 802                     ACPI_TYPE_ANY, ACPI_IMODE_EXECUTE,
 803                     ACPI_NS_SEARCH_PARENT, WalkState, &Info.RegisterNode);
 804     if (ACPI_FAILURE (Status))
 805     {
 806         ACPI_ERROR_NAMESPACE (Arg->Common.Value.String, Status);
 807         return_ACPI_STATUS (Status);
 808     }
 809 
 810     /* Second arg is the data register (must already exist) */
 811 
 812     Arg = Arg->Common.Next;
 813     Status = AcpiNsLookup (WalkState->ScopeInfo, Arg->Common.Value.String,
 814                     ACPI_TYPE_ANY, ACPI_IMODE_EXECUTE,
 815                     ACPI_NS_SEARCH_PARENT, WalkState, &Info.DataRegisterNode);
 816     if (ACPI_FAILURE (Status))
 817     {
 818         ACPI_ERROR_NAMESPACE (Arg->Common.Value.String, Status);
 819         return_ACPI_STATUS (Status);
 820     }
 821 
 822     /* Next arg is the field flags */
 823 
 824     Arg = Arg->Common.Next;
 825     Info.FieldFlags = (UINT8) Arg->Common.Value.Integer;
 826 
 827     /* Each remaining arg is a Named Field */
 828 
 829     Info.FieldType = ACPI_TYPE_LOCAL_INDEX_FIELD;
 830     Info.RegionNode = RegionNode;
 831 
 832     Status = AcpiDsGetFieldNames (&Info, WalkState, Arg->Common.Next);
 833     return_ACPI_STATUS (Status);
 834 }