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