1*7851SDana.Myers@Sun.COM /****************************************************************************** 2*7851SDana.Myers@Sun.COM * 3*7851SDana.Myers@Sun.COM * Module Name: dsfield - Dispatcher field routines 4*7851SDana.Myers@Sun.COM * $Revision: 1.87 $ 5*7851SDana.Myers@Sun.COM * 6*7851SDana.Myers@Sun.COM *****************************************************************************/ 7*7851SDana.Myers@Sun.COM 8*7851SDana.Myers@Sun.COM /****************************************************************************** 9*7851SDana.Myers@Sun.COM * 10*7851SDana.Myers@Sun.COM * 1. Copyright Notice 11*7851SDana.Myers@Sun.COM * 12*7851SDana.Myers@Sun.COM * Some or all of this work - Copyright (c) 1999 - 2008, Intel Corp. 13*7851SDana.Myers@Sun.COM * All rights reserved. 14*7851SDana.Myers@Sun.COM * 15*7851SDana.Myers@Sun.COM * 2. License 16*7851SDana.Myers@Sun.COM * 17*7851SDana.Myers@Sun.COM * 2.1. This is your license from Intel Corp. under its intellectual property 18*7851SDana.Myers@Sun.COM * rights. You may have additional license terms from the party that provided 19*7851SDana.Myers@Sun.COM * you this software, covering your right to use that party's intellectual 20*7851SDana.Myers@Sun.COM * property rights. 21*7851SDana.Myers@Sun.COM * 22*7851SDana.Myers@Sun.COM * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a 23*7851SDana.Myers@Sun.COM * copy of the source code appearing in this file ("Covered Code") an 24*7851SDana.Myers@Sun.COM * irrevocable, perpetual, worldwide license under Intel's copyrights in the 25*7851SDana.Myers@Sun.COM * base code distributed originally by Intel ("Original Intel Code") to copy, 26*7851SDana.Myers@Sun.COM * make derivatives, distribute, use and display any portion of the Covered 27*7851SDana.Myers@Sun.COM * Code in any form, with the right to sublicense such rights; and 28*7851SDana.Myers@Sun.COM * 29*7851SDana.Myers@Sun.COM * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent 30*7851SDana.Myers@Sun.COM * license (with the right to sublicense), under only those claims of Intel 31*7851SDana.Myers@Sun.COM * patents that are infringed by the Original Intel Code, to make, use, sell, 32*7851SDana.Myers@Sun.COM * offer to sell, and import the Covered Code and derivative works thereof 33*7851SDana.Myers@Sun.COM * solely to the minimum extent necessary to exercise the above copyright 34*7851SDana.Myers@Sun.COM * license, and in no event shall the patent license extend to any additions 35*7851SDana.Myers@Sun.COM * to or modifications of the Original Intel Code. No other license or right 36*7851SDana.Myers@Sun.COM * is granted directly or by implication, estoppel or otherwise; 37*7851SDana.Myers@Sun.COM * 38*7851SDana.Myers@Sun.COM * The above copyright and patent license is granted only if the following 39*7851SDana.Myers@Sun.COM * conditions are met: 40*7851SDana.Myers@Sun.COM * 41*7851SDana.Myers@Sun.COM * 3. Conditions 42*7851SDana.Myers@Sun.COM * 43*7851SDana.Myers@Sun.COM * 3.1. Redistribution of Source with Rights to Further Distribute Source. 44*7851SDana.Myers@Sun.COM * Redistribution of source code of any substantial portion of the Covered 45*7851SDana.Myers@Sun.COM * Code or modification with rights to further distribute source must include 46*7851SDana.Myers@Sun.COM * the above Copyright Notice, the above License, this list of Conditions, 47*7851SDana.Myers@Sun.COM * and the following Disclaimer and Export Compliance provision. In addition, 48*7851SDana.Myers@Sun.COM * Licensee must cause all Covered Code to which Licensee contributes to 49*7851SDana.Myers@Sun.COM * contain a file documenting the changes Licensee made to create that Covered 50*7851SDana.Myers@Sun.COM * Code and the date of any change. Licensee must include in that file the 51*7851SDana.Myers@Sun.COM * documentation of any changes made by any predecessor Licensee. Licensee 52*7851SDana.Myers@Sun.COM * must include a prominent statement that the modification is derived, 53*7851SDana.Myers@Sun.COM * directly or indirectly, from Original Intel Code. 54*7851SDana.Myers@Sun.COM * 55*7851SDana.Myers@Sun.COM * 3.2. Redistribution of Source with no Rights to Further Distribute Source. 56*7851SDana.Myers@Sun.COM * Redistribution of source code of any substantial portion of the Covered 57*7851SDana.Myers@Sun.COM * Code or modification without rights to further distribute source must 58*7851SDana.Myers@Sun.COM * include the following Disclaimer and Export Compliance provision in the 59*7851SDana.Myers@Sun.COM * documentation and/or other materials provided with distribution. In 60*7851SDana.Myers@Sun.COM * addition, Licensee may not authorize further sublicense of source of any 61*7851SDana.Myers@Sun.COM * portion of the Covered Code, and must include terms to the effect that the 62*7851SDana.Myers@Sun.COM * license from Licensee to its licensee is limited to the intellectual 63*7851SDana.Myers@Sun.COM * property embodied in the software Licensee provides to its licensee, and 64*7851SDana.Myers@Sun.COM * not to intellectual property embodied in modifications its licensee may 65*7851SDana.Myers@Sun.COM * make. 66*7851SDana.Myers@Sun.COM * 67*7851SDana.Myers@Sun.COM * 3.3. Redistribution of Executable. Redistribution in executable form of any 68*7851SDana.Myers@Sun.COM * substantial portion of the Covered Code or modification must reproduce the 69*7851SDana.Myers@Sun.COM * above Copyright Notice, and the following Disclaimer and Export Compliance 70*7851SDana.Myers@Sun.COM * provision in the documentation and/or other materials provided with the 71*7851SDana.Myers@Sun.COM * distribution. 72*7851SDana.Myers@Sun.COM * 73*7851SDana.Myers@Sun.COM * 3.4. Intel retains all right, title, and interest in and to the Original 74*7851SDana.Myers@Sun.COM * Intel Code. 75*7851SDana.Myers@Sun.COM * 76*7851SDana.Myers@Sun.COM * 3.5. Neither the name Intel nor any other trademark owned or controlled by 77*7851SDana.Myers@Sun.COM * Intel shall be used in advertising or otherwise to promote the sale, use or 78*7851SDana.Myers@Sun.COM * other dealings in products derived from or relating to the Covered Code 79*7851SDana.Myers@Sun.COM * without prior written authorization from Intel. 80*7851SDana.Myers@Sun.COM * 81*7851SDana.Myers@Sun.COM * 4. Disclaimer and Export Compliance 82*7851SDana.Myers@Sun.COM * 83*7851SDana.Myers@Sun.COM * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED 84*7851SDana.Myers@Sun.COM * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE 85*7851SDana.Myers@Sun.COM * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, 86*7851SDana.Myers@Sun.COM * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY 87*7851SDana.Myers@Sun.COM * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY 88*7851SDana.Myers@Sun.COM * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A 89*7851SDana.Myers@Sun.COM * PARTICULAR PURPOSE. 90*7851SDana.Myers@Sun.COM * 91*7851SDana.Myers@Sun.COM * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES 92*7851SDana.Myers@Sun.COM * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR 93*7851SDana.Myers@Sun.COM * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, 94*7851SDana.Myers@Sun.COM * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY 95*7851SDana.Myers@Sun.COM * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL 96*7851SDana.Myers@Sun.COM * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS 97*7851SDana.Myers@Sun.COM * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY 98*7851SDana.Myers@Sun.COM * LIMITED REMEDY. 99*7851SDana.Myers@Sun.COM * 100*7851SDana.Myers@Sun.COM * 4.3. Licensee shall not export, either directly or indirectly, any of this 101*7851SDana.Myers@Sun.COM * software or system incorporating such software without first obtaining any 102*7851SDana.Myers@Sun.COM * required license or other approval from the U. S. Department of Commerce or 103*7851SDana.Myers@Sun.COM * any other agency or department of the United States Government. In the 104*7851SDana.Myers@Sun.COM * event Licensee exports any such software from the United States or 105*7851SDana.Myers@Sun.COM * re-exports any such software from a foreign destination, Licensee shall 106*7851SDana.Myers@Sun.COM * ensure that the distribution and export/re-export of the software is in 107*7851SDana.Myers@Sun.COM * compliance with all laws, regulations, orders, or other restrictions of the 108*7851SDana.Myers@Sun.COM * U.S. Export Administration Regulations. Licensee agrees that neither it nor 109*7851SDana.Myers@Sun.COM * any of its subsidiaries will export/re-export any technical data, process, 110*7851SDana.Myers@Sun.COM * software, or service, directly or indirectly, to any country for which the 111*7851SDana.Myers@Sun.COM * United States government or any agency thereof requires an export license, 112*7851SDana.Myers@Sun.COM * other governmental approval, or letter of assurance, without first obtaining 113*7851SDana.Myers@Sun.COM * such license, approval or letter. 114*7851SDana.Myers@Sun.COM * 115*7851SDana.Myers@Sun.COM *****************************************************************************/ 116*7851SDana.Myers@Sun.COM 117*7851SDana.Myers@Sun.COM #define __DSFIELD_C__ 118*7851SDana.Myers@Sun.COM 119*7851SDana.Myers@Sun.COM #include "acpi.h" 120*7851SDana.Myers@Sun.COM #include "amlcode.h" 121*7851SDana.Myers@Sun.COM #include "acdispat.h" 122*7851SDana.Myers@Sun.COM #include "acinterp.h" 123*7851SDana.Myers@Sun.COM #include "acnamesp.h" 124*7851SDana.Myers@Sun.COM #include "acparser.h" 125*7851SDana.Myers@Sun.COM 126*7851SDana.Myers@Sun.COM 127*7851SDana.Myers@Sun.COM #define _COMPONENT ACPI_DISPATCHER 128*7851SDana.Myers@Sun.COM ACPI_MODULE_NAME ("dsfield") 129*7851SDana.Myers@Sun.COM 130*7851SDana.Myers@Sun.COM /* Local prototypes */ 131*7851SDana.Myers@Sun.COM 132*7851SDana.Myers@Sun.COM static ACPI_STATUS 133*7851SDana.Myers@Sun.COM AcpiDsGetFieldNames ( 134*7851SDana.Myers@Sun.COM ACPI_CREATE_FIELD_INFO *Info, 135*7851SDana.Myers@Sun.COM ACPI_WALK_STATE *WalkState, 136*7851SDana.Myers@Sun.COM ACPI_PARSE_OBJECT *Arg); 137*7851SDana.Myers@Sun.COM 138*7851SDana.Myers@Sun.COM 139*7851SDana.Myers@Sun.COM /******************************************************************************* 140*7851SDana.Myers@Sun.COM * 141*7851SDana.Myers@Sun.COM * FUNCTION: AcpiDsCreateBufferField 142*7851SDana.Myers@Sun.COM * 143*7851SDana.Myers@Sun.COM * PARAMETERS: Op - Current parse op (CreateXXField) 144*7851SDana.Myers@Sun.COM * WalkState - Current state 145*7851SDana.Myers@Sun.COM * 146*7851SDana.Myers@Sun.COM * RETURN: Status 147*7851SDana.Myers@Sun.COM * 148*7851SDana.Myers@Sun.COM * DESCRIPTION: Execute the CreateField operators: 149*7851SDana.Myers@Sun.COM * CreateBitFieldOp, 150*7851SDana.Myers@Sun.COM * CreateByteFieldOp, 151*7851SDana.Myers@Sun.COM * CreateWordFieldOp, 152*7851SDana.Myers@Sun.COM * CreateDWordFieldOp, 153*7851SDana.Myers@Sun.COM * CreateQWordFieldOp, 154*7851SDana.Myers@Sun.COM * CreateFieldOp (all of which define a field in a buffer) 155*7851SDana.Myers@Sun.COM * 156*7851SDana.Myers@Sun.COM ******************************************************************************/ 157*7851SDana.Myers@Sun.COM 158*7851SDana.Myers@Sun.COM ACPI_STATUS 159*7851SDana.Myers@Sun.COM AcpiDsCreateBufferField ( 160*7851SDana.Myers@Sun.COM ACPI_PARSE_OBJECT *Op, 161*7851SDana.Myers@Sun.COM ACPI_WALK_STATE *WalkState) 162*7851SDana.Myers@Sun.COM { 163*7851SDana.Myers@Sun.COM ACPI_PARSE_OBJECT *Arg; 164*7851SDana.Myers@Sun.COM ACPI_NAMESPACE_NODE *Node; 165*7851SDana.Myers@Sun.COM ACPI_STATUS Status; 166*7851SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT *ObjDesc; 167*7851SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT *SecondDesc = NULL; 168*7851SDana.Myers@Sun.COM UINT32 Flags; 169*7851SDana.Myers@Sun.COM 170*7851SDana.Myers@Sun.COM 171*7851SDana.Myers@Sun.COM ACPI_FUNCTION_TRACE (DsCreateBufferField); 172*7851SDana.Myers@Sun.COM 173*7851SDana.Myers@Sun.COM 174*7851SDana.Myers@Sun.COM /* 175*7851SDana.Myers@Sun.COM * Get the NameString argument (name of the new BufferField) 176*7851SDana.Myers@Sun.COM */ 177*7851SDana.Myers@Sun.COM if (Op->Common.AmlOpcode == AML_CREATE_FIELD_OP) 178*7851SDana.Myers@Sun.COM { 179*7851SDana.Myers@Sun.COM /* For CreateField, name is the 4th argument */ 180*7851SDana.Myers@Sun.COM 181*7851SDana.Myers@Sun.COM Arg = AcpiPsGetArg (Op, 3); 182*7851SDana.Myers@Sun.COM } 183*7851SDana.Myers@Sun.COM else 184*7851SDana.Myers@Sun.COM { 185*7851SDana.Myers@Sun.COM /* For all other CreateXXXField operators, name is the 3rd argument */ 186*7851SDana.Myers@Sun.COM 187*7851SDana.Myers@Sun.COM Arg = AcpiPsGetArg (Op, 2); 188*7851SDana.Myers@Sun.COM } 189*7851SDana.Myers@Sun.COM 190*7851SDana.Myers@Sun.COM if (!Arg) 191*7851SDana.Myers@Sun.COM { 192*7851SDana.Myers@Sun.COM return_ACPI_STATUS (AE_AML_NO_OPERAND); 193*7851SDana.Myers@Sun.COM } 194*7851SDana.Myers@Sun.COM 195*7851SDana.Myers@Sun.COM if (WalkState->DeferredNode) 196*7851SDana.Myers@Sun.COM { 197*7851SDana.Myers@Sun.COM Node = WalkState->DeferredNode; 198*7851SDana.Myers@Sun.COM Status = AE_OK; 199*7851SDana.Myers@Sun.COM } 200*7851SDana.Myers@Sun.COM else 201*7851SDana.Myers@Sun.COM { 202*7851SDana.Myers@Sun.COM /* Execute flag should always be set when this function is entered */ 203*7851SDana.Myers@Sun.COM 204*7851SDana.Myers@Sun.COM if (!(WalkState->ParseFlags & ACPI_PARSE_EXECUTE)) 205*7851SDana.Myers@Sun.COM { 206*7851SDana.Myers@Sun.COM return_ACPI_STATUS (AE_AML_INTERNAL); 207*7851SDana.Myers@Sun.COM } 208*7851SDana.Myers@Sun.COM 209*7851SDana.Myers@Sun.COM /* Creating new namespace node, should not already exist */ 210*7851SDana.Myers@Sun.COM 211*7851SDana.Myers@Sun.COM Flags = ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE | 212*7851SDana.Myers@Sun.COM ACPI_NS_ERROR_IF_FOUND; 213*7851SDana.Myers@Sun.COM 214*7851SDana.Myers@Sun.COM /* Mark node temporary if we are executing a method */ 215*7851SDana.Myers@Sun.COM 216*7851SDana.Myers@Sun.COM if (WalkState->MethodNode) 217*7851SDana.Myers@Sun.COM { 218*7851SDana.Myers@Sun.COM Flags |= ACPI_NS_TEMPORARY; 219*7851SDana.Myers@Sun.COM } 220*7851SDana.Myers@Sun.COM 221*7851SDana.Myers@Sun.COM /* Enter the NameString into the namespace */ 222*7851SDana.Myers@Sun.COM 223*7851SDana.Myers@Sun.COM Status = AcpiNsLookup (WalkState->ScopeInfo, Arg->Common.Value.String, 224*7851SDana.Myers@Sun.COM ACPI_TYPE_ANY, ACPI_IMODE_LOAD_PASS1, 225*7851SDana.Myers@Sun.COM Flags, WalkState, &Node); 226*7851SDana.Myers@Sun.COM if (ACPI_FAILURE (Status)) 227*7851SDana.Myers@Sun.COM { 228*7851SDana.Myers@Sun.COM ACPI_ERROR_NAMESPACE (Arg->Common.Value.String, Status); 229*7851SDana.Myers@Sun.COM return_ACPI_STATUS (Status); 230*7851SDana.Myers@Sun.COM } 231*7851SDana.Myers@Sun.COM } 232*7851SDana.Myers@Sun.COM 233*7851SDana.Myers@Sun.COM /* 234*7851SDana.Myers@Sun.COM * We could put the returned object (Node) on the object stack for later, 235*7851SDana.Myers@Sun.COM * but for now, we will put it in the "op" object that the parser uses, 236*7851SDana.Myers@Sun.COM * so we can get it again at the end of this scope. 237*7851SDana.Myers@Sun.COM */ 238*7851SDana.Myers@Sun.COM Op->Common.Node = Node; 239*7851SDana.Myers@Sun.COM 240*7851SDana.Myers@Sun.COM /* 241*7851SDana.Myers@Sun.COM * If there is no object attached to the node, this node was just created 242*7851SDana.Myers@Sun.COM * and we need to create the field object. Otherwise, this was a lookup 243*7851SDana.Myers@Sun.COM * of an existing node and we don't want to create the field object again. 244*7851SDana.Myers@Sun.COM */ 245*7851SDana.Myers@Sun.COM ObjDesc = AcpiNsGetAttachedObject (Node); 246*7851SDana.Myers@Sun.COM if (ObjDesc) 247*7851SDana.Myers@Sun.COM { 248*7851SDana.Myers@Sun.COM return_ACPI_STATUS (AE_OK); 249*7851SDana.Myers@Sun.COM } 250*7851SDana.Myers@Sun.COM 251*7851SDana.Myers@Sun.COM /* 252*7851SDana.Myers@Sun.COM * The Field definition is not fully parsed at this time. 253*7851SDana.Myers@Sun.COM * (We must save the address of the AML for the buffer and index operands) 254*7851SDana.Myers@Sun.COM */ 255*7851SDana.Myers@Sun.COM 256*7851SDana.Myers@Sun.COM /* Create the buffer field object */ 257*7851SDana.Myers@Sun.COM 258*7851SDana.Myers@Sun.COM ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_BUFFER_FIELD); 259*7851SDana.Myers@Sun.COM if (!ObjDesc) 260*7851SDana.Myers@Sun.COM { 261*7851SDana.Myers@Sun.COM Status = AE_NO_MEMORY; 262*7851SDana.Myers@Sun.COM goto Cleanup; 263*7851SDana.Myers@Sun.COM } 264*7851SDana.Myers@Sun.COM 265*7851SDana.Myers@Sun.COM /* 266*7851SDana.Myers@Sun.COM * Remember location in AML stream of the field unit opcode and operands -- 267*7851SDana.Myers@Sun.COM * since the buffer and index operands must be evaluated. 268*7851SDana.Myers@Sun.COM */ 269*7851SDana.Myers@Sun.COM SecondDesc = ObjDesc->Common.NextObject; 270*7851SDana.Myers@Sun.COM SecondDesc->Extra.AmlStart = Op->Named.Data; 271*7851SDana.Myers@Sun.COM SecondDesc->Extra.AmlLength = Op->Named.Length; 272*7851SDana.Myers@Sun.COM ObjDesc->BufferField.Node = Node; 273*7851SDana.Myers@Sun.COM 274*7851SDana.Myers@Sun.COM /* Attach constructed field descriptors to parent node */ 275*7851SDana.Myers@Sun.COM 276*7851SDana.Myers@Sun.COM Status = AcpiNsAttachObject (Node, ObjDesc, ACPI_TYPE_BUFFER_FIELD); 277*7851SDana.Myers@Sun.COM if (ACPI_FAILURE (Status)) 278*7851SDana.Myers@Sun.COM { 279*7851SDana.Myers@Sun.COM goto Cleanup; 280*7851SDana.Myers@Sun.COM } 281*7851SDana.Myers@Sun.COM 282*7851SDana.Myers@Sun.COM 283*7851SDana.Myers@Sun.COM Cleanup: 284*7851SDana.Myers@Sun.COM 285*7851SDana.Myers@Sun.COM /* Remove local reference to the object */ 286*7851SDana.Myers@Sun.COM 287*7851SDana.Myers@Sun.COM AcpiUtRemoveReference (ObjDesc); 288*7851SDana.Myers@Sun.COM return_ACPI_STATUS (Status); 289*7851SDana.Myers@Sun.COM } 290*7851SDana.Myers@Sun.COM 291*7851SDana.Myers@Sun.COM 292*7851SDana.Myers@Sun.COM /******************************************************************************* 293*7851SDana.Myers@Sun.COM * 294*7851SDana.Myers@Sun.COM * FUNCTION: AcpiDsGetFieldNames 295*7851SDana.Myers@Sun.COM * 296*7851SDana.Myers@Sun.COM * PARAMETERS: Info - CreateField info structure 297*7851SDana.Myers@Sun.COM * ` WalkState - Current method state 298*7851SDana.Myers@Sun.COM * Arg - First parser arg for the field name list 299*7851SDana.Myers@Sun.COM * 300*7851SDana.Myers@Sun.COM * RETURN: Status 301*7851SDana.Myers@Sun.COM * 302*7851SDana.Myers@Sun.COM * DESCRIPTION: Process all named fields in a field declaration. Names are 303*7851SDana.Myers@Sun.COM * entered into the namespace. 304*7851SDana.Myers@Sun.COM * 305*7851SDana.Myers@Sun.COM ******************************************************************************/ 306*7851SDana.Myers@Sun.COM 307*7851SDana.Myers@Sun.COM static ACPI_STATUS 308*7851SDana.Myers@Sun.COM AcpiDsGetFieldNames ( 309*7851SDana.Myers@Sun.COM ACPI_CREATE_FIELD_INFO *Info, 310*7851SDana.Myers@Sun.COM ACPI_WALK_STATE *WalkState, 311*7851SDana.Myers@Sun.COM ACPI_PARSE_OBJECT *Arg) 312*7851SDana.Myers@Sun.COM { 313*7851SDana.Myers@Sun.COM ACPI_STATUS Status; 314*7851SDana.Myers@Sun.COM ACPI_INTEGER Position; 315*7851SDana.Myers@Sun.COM 316*7851SDana.Myers@Sun.COM 317*7851SDana.Myers@Sun.COM ACPI_FUNCTION_TRACE_PTR (DsGetFieldNames, Info); 318*7851SDana.Myers@Sun.COM 319*7851SDana.Myers@Sun.COM 320*7851SDana.Myers@Sun.COM /* First field starts at bit zero */ 321*7851SDana.Myers@Sun.COM 322*7851SDana.Myers@Sun.COM Info->FieldBitPosition = 0; 323*7851SDana.Myers@Sun.COM 324*7851SDana.Myers@Sun.COM /* Process all elements in the field list (of parse nodes) */ 325*7851SDana.Myers@Sun.COM 326*7851SDana.Myers@Sun.COM while (Arg) 327*7851SDana.Myers@Sun.COM { 328*7851SDana.Myers@Sun.COM /* 329*7851SDana.Myers@Sun.COM * Three types of field elements are handled: 330*7851SDana.Myers@Sun.COM * 1) Offset - specifies a bit offset 331*7851SDana.Myers@Sun.COM * 2) AccessAs - changes the access mode 332*7851SDana.Myers@Sun.COM * 3) Name - Enters a new named field into the namespace 333*7851SDana.Myers@Sun.COM */ 334*7851SDana.Myers@Sun.COM switch (Arg->Common.AmlOpcode) 335*7851SDana.Myers@Sun.COM { 336*7851SDana.Myers@Sun.COM case AML_INT_RESERVEDFIELD_OP: 337*7851SDana.Myers@Sun.COM 338*7851SDana.Myers@Sun.COM Position = (ACPI_INTEGER) Info->FieldBitPosition 339*7851SDana.Myers@Sun.COM + (ACPI_INTEGER) Arg->Common.Value.Size; 340*7851SDana.Myers@Sun.COM 341*7851SDana.Myers@Sun.COM if (Position > ACPI_UINT32_MAX) 342*7851SDana.Myers@Sun.COM { 343*7851SDana.Myers@Sun.COM ACPI_ERROR ((AE_INFO, 344*7851SDana.Myers@Sun.COM "Bit offset within field too large (> 0xFFFFFFFF)")); 345*7851SDana.Myers@Sun.COM return_ACPI_STATUS (AE_SUPPORT); 346*7851SDana.Myers@Sun.COM } 347*7851SDana.Myers@Sun.COM 348*7851SDana.Myers@Sun.COM Info->FieldBitPosition = (UINT32) Position; 349*7851SDana.Myers@Sun.COM break; 350*7851SDana.Myers@Sun.COM 351*7851SDana.Myers@Sun.COM 352*7851SDana.Myers@Sun.COM case AML_INT_ACCESSFIELD_OP: 353*7851SDana.Myers@Sun.COM 354*7851SDana.Myers@Sun.COM /* 355*7851SDana.Myers@Sun.COM * Get a new AccessType and AccessAttribute -- to be used for all 356*7851SDana.Myers@Sun.COM * field units that follow, until field end or another AccessAs 357*7851SDana.Myers@Sun.COM * keyword. 358*7851SDana.Myers@Sun.COM * 359*7851SDana.Myers@Sun.COM * In FieldFlags, preserve the flag bits other than the 360*7851SDana.Myers@Sun.COM * ACCESS_TYPE bits 361*7851SDana.Myers@Sun.COM */ 362*7851SDana.Myers@Sun.COM Info->FieldFlags = (UINT8) 363*7851SDana.Myers@Sun.COM ((Info->FieldFlags & ~(AML_FIELD_ACCESS_TYPE_MASK)) | 364*7851SDana.Myers@Sun.COM ((UINT8) ((UINT32) Arg->Common.Value.Integer >> 8))); 365*7851SDana.Myers@Sun.COM 366*7851SDana.Myers@Sun.COM Info->Attribute = (UINT8) (Arg->Common.Value.Integer); 367*7851SDana.Myers@Sun.COM break; 368*7851SDana.Myers@Sun.COM 369*7851SDana.Myers@Sun.COM 370*7851SDana.Myers@Sun.COM case AML_INT_NAMEDFIELD_OP: 371*7851SDana.Myers@Sun.COM 372*7851SDana.Myers@Sun.COM /* Lookup the name, it should already exist */ 373*7851SDana.Myers@Sun.COM 374*7851SDana.Myers@Sun.COM Status = AcpiNsLookup (WalkState->ScopeInfo, 375*7851SDana.Myers@Sun.COM (char *) &Arg->Named.Name, Info->FieldType, 376*7851SDana.Myers@Sun.COM ACPI_IMODE_EXECUTE, ACPI_NS_DONT_OPEN_SCOPE, 377*7851SDana.Myers@Sun.COM WalkState, &Info->FieldNode); 378*7851SDana.Myers@Sun.COM if (ACPI_FAILURE (Status)) 379*7851SDana.Myers@Sun.COM { 380*7851SDana.Myers@Sun.COM ACPI_ERROR_NAMESPACE ((char *) &Arg->Named.Name, Status); 381*7851SDana.Myers@Sun.COM return_ACPI_STATUS (Status); 382*7851SDana.Myers@Sun.COM } 383*7851SDana.Myers@Sun.COM else 384*7851SDana.Myers@Sun.COM { 385*7851SDana.Myers@Sun.COM Arg->Common.Node = Info->FieldNode; 386*7851SDana.Myers@Sun.COM Info->FieldBitLength = Arg->Common.Value.Size; 387*7851SDana.Myers@Sun.COM 388*7851SDana.Myers@Sun.COM /* 389*7851SDana.Myers@Sun.COM * If there is no object attached to the node, this node was 390*7851SDana.Myers@Sun.COM * just created and we need to create the field object. 391*7851SDana.Myers@Sun.COM * Otherwise, this was a lookup of an existing node and we 392*7851SDana.Myers@Sun.COM * don't want to create the field object again. 393*7851SDana.Myers@Sun.COM */ 394*7851SDana.Myers@Sun.COM if (!AcpiNsGetAttachedObject (Info->FieldNode)) 395*7851SDana.Myers@Sun.COM { 396*7851SDana.Myers@Sun.COM Status = AcpiExPrepFieldValue (Info); 397*7851SDana.Myers@Sun.COM if (ACPI_FAILURE (Status)) 398*7851SDana.Myers@Sun.COM { 399*7851SDana.Myers@Sun.COM return_ACPI_STATUS (Status); 400*7851SDana.Myers@Sun.COM } 401*7851SDana.Myers@Sun.COM } 402*7851SDana.Myers@Sun.COM } 403*7851SDana.Myers@Sun.COM 404*7851SDana.Myers@Sun.COM /* Keep track of bit position for the next field */ 405*7851SDana.Myers@Sun.COM 406*7851SDana.Myers@Sun.COM Position = (ACPI_INTEGER) Info->FieldBitPosition 407*7851SDana.Myers@Sun.COM + (ACPI_INTEGER) Arg->Common.Value.Size; 408*7851SDana.Myers@Sun.COM 409*7851SDana.Myers@Sun.COM if (Position > ACPI_UINT32_MAX) 410*7851SDana.Myers@Sun.COM { 411*7851SDana.Myers@Sun.COM ACPI_ERROR ((AE_INFO, 412*7851SDana.Myers@Sun.COM "Field [%4.4s] bit offset too large (> 0xFFFFFFFF)", 413*7851SDana.Myers@Sun.COM ACPI_CAST_PTR (char, &Info->FieldNode->Name))); 414*7851SDana.Myers@Sun.COM return_ACPI_STATUS (AE_SUPPORT); 415*7851SDana.Myers@Sun.COM } 416*7851SDana.Myers@Sun.COM 417*7851SDana.Myers@Sun.COM Info->FieldBitPosition += Info->FieldBitLength; 418*7851SDana.Myers@Sun.COM break; 419*7851SDana.Myers@Sun.COM 420*7851SDana.Myers@Sun.COM 421*7851SDana.Myers@Sun.COM default: 422*7851SDana.Myers@Sun.COM 423*7851SDana.Myers@Sun.COM ACPI_ERROR ((AE_INFO, 424*7851SDana.Myers@Sun.COM "Invalid opcode in field list: %X", Arg->Common.AmlOpcode)); 425*7851SDana.Myers@Sun.COM return_ACPI_STATUS (AE_AML_BAD_OPCODE); 426*7851SDana.Myers@Sun.COM } 427*7851SDana.Myers@Sun.COM 428*7851SDana.Myers@Sun.COM Arg = Arg->Common.Next; 429*7851SDana.Myers@Sun.COM } 430*7851SDana.Myers@Sun.COM 431*7851SDana.Myers@Sun.COM return_ACPI_STATUS (AE_OK); 432*7851SDana.Myers@Sun.COM } 433*7851SDana.Myers@Sun.COM 434*7851SDana.Myers@Sun.COM 435*7851SDana.Myers@Sun.COM /******************************************************************************* 436*7851SDana.Myers@Sun.COM * 437*7851SDana.Myers@Sun.COM * FUNCTION: AcpiDsCreateField 438*7851SDana.Myers@Sun.COM * 439*7851SDana.Myers@Sun.COM * PARAMETERS: Op - Op containing the Field definition and args 440*7851SDana.Myers@Sun.COM * RegionNode - Object for the containing Operation Region 441*7851SDana.Myers@Sun.COM * ` WalkState - Current method state 442*7851SDana.Myers@Sun.COM * 443*7851SDana.Myers@Sun.COM * RETURN: Status 444*7851SDana.Myers@Sun.COM * 445*7851SDana.Myers@Sun.COM * DESCRIPTION: Create a new field in the specified operation region 446*7851SDana.Myers@Sun.COM * 447*7851SDana.Myers@Sun.COM ******************************************************************************/ 448*7851SDana.Myers@Sun.COM 449*7851SDana.Myers@Sun.COM ACPI_STATUS 450*7851SDana.Myers@Sun.COM AcpiDsCreateField ( 451*7851SDana.Myers@Sun.COM ACPI_PARSE_OBJECT *Op, 452*7851SDana.Myers@Sun.COM ACPI_NAMESPACE_NODE *RegionNode, 453*7851SDana.Myers@Sun.COM ACPI_WALK_STATE *WalkState) 454*7851SDana.Myers@Sun.COM { 455*7851SDana.Myers@Sun.COM ACPI_STATUS Status; 456*7851SDana.Myers@Sun.COM ACPI_PARSE_OBJECT *Arg; 457*7851SDana.Myers@Sun.COM ACPI_CREATE_FIELD_INFO Info; 458*7851SDana.Myers@Sun.COM 459*7851SDana.Myers@Sun.COM 460*7851SDana.Myers@Sun.COM ACPI_FUNCTION_TRACE_PTR (DsCreateField, Op); 461*7851SDana.Myers@Sun.COM 462*7851SDana.Myers@Sun.COM 463*7851SDana.Myers@Sun.COM /* First arg is the name of the parent OpRegion (must already exist) */ 464*7851SDana.Myers@Sun.COM 465*7851SDana.Myers@Sun.COM Arg = Op->Common.Value.Arg; 466*7851SDana.Myers@Sun.COM if (!RegionNode) 467*7851SDana.Myers@Sun.COM { 468*7851SDana.Myers@Sun.COM Status = AcpiNsLookup (WalkState->ScopeInfo, Arg->Common.Value.Name, 469*7851SDana.Myers@Sun.COM ACPI_TYPE_REGION, ACPI_IMODE_EXECUTE, 470*7851SDana.Myers@Sun.COM ACPI_NS_SEARCH_PARENT, WalkState, &RegionNode); 471*7851SDana.Myers@Sun.COM if (ACPI_FAILURE (Status)) 472*7851SDana.Myers@Sun.COM { 473*7851SDana.Myers@Sun.COM ACPI_ERROR_NAMESPACE (Arg->Common.Value.Name, Status); 474*7851SDana.Myers@Sun.COM return_ACPI_STATUS (Status); 475*7851SDana.Myers@Sun.COM } 476*7851SDana.Myers@Sun.COM } 477*7851SDana.Myers@Sun.COM 478*7851SDana.Myers@Sun.COM /* Second arg is the field flags */ 479*7851SDana.Myers@Sun.COM 480*7851SDana.Myers@Sun.COM Arg = Arg->Common.Next; 481*7851SDana.Myers@Sun.COM Info.FieldFlags = (UINT8) Arg->Common.Value.Integer; 482*7851SDana.Myers@Sun.COM Info.Attribute = 0; 483*7851SDana.Myers@Sun.COM 484*7851SDana.Myers@Sun.COM /* Each remaining arg is a Named Field */ 485*7851SDana.Myers@Sun.COM 486*7851SDana.Myers@Sun.COM Info.FieldType = ACPI_TYPE_LOCAL_REGION_FIELD; 487*7851SDana.Myers@Sun.COM Info.RegionNode = RegionNode; 488*7851SDana.Myers@Sun.COM 489*7851SDana.Myers@Sun.COM Status = AcpiDsGetFieldNames (&Info, WalkState, Arg->Common.Next); 490*7851SDana.Myers@Sun.COM 491*7851SDana.Myers@Sun.COM return_ACPI_STATUS (Status); 492*7851SDana.Myers@Sun.COM } 493*7851SDana.Myers@Sun.COM 494*7851SDana.Myers@Sun.COM 495*7851SDana.Myers@Sun.COM /******************************************************************************* 496*7851SDana.Myers@Sun.COM * 497*7851SDana.Myers@Sun.COM * FUNCTION: AcpiDsInitFieldObjects 498*7851SDana.Myers@Sun.COM * 499*7851SDana.Myers@Sun.COM * PARAMETERS: Op - Op containing the Field definition and args 500*7851SDana.Myers@Sun.COM * ` WalkState - Current method state 501*7851SDana.Myers@Sun.COM * 502*7851SDana.Myers@Sun.COM * RETURN: Status 503*7851SDana.Myers@Sun.COM * 504*7851SDana.Myers@Sun.COM * DESCRIPTION: For each "Field Unit" name in the argument list that is 505*7851SDana.Myers@Sun.COM * part of the field declaration, enter the name into the 506*7851SDana.Myers@Sun.COM * namespace. 507*7851SDana.Myers@Sun.COM * 508*7851SDana.Myers@Sun.COM ******************************************************************************/ 509*7851SDana.Myers@Sun.COM 510*7851SDana.Myers@Sun.COM ACPI_STATUS 511*7851SDana.Myers@Sun.COM AcpiDsInitFieldObjects ( 512*7851SDana.Myers@Sun.COM ACPI_PARSE_OBJECT *Op, 513*7851SDana.Myers@Sun.COM ACPI_WALK_STATE *WalkState) 514*7851SDana.Myers@Sun.COM { 515*7851SDana.Myers@Sun.COM ACPI_STATUS Status; 516*7851SDana.Myers@Sun.COM ACPI_PARSE_OBJECT *Arg = NULL; 517*7851SDana.Myers@Sun.COM ACPI_NAMESPACE_NODE *Node; 518*7851SDana.Myers@Sun.COM UINT8 Type = 0; 519*7851SDana.Myers@Sun.COM UINT32 Flags; 520*7851SDana.Myers@Sun.COM 521*7851SDana.Myers@Sun.COM 522*7851SDana.Myers@Sun.COM ACPI_FUNCTION_TRACE_PTR (DsInitFieldObjects, Op); 523*7851SDana.Myers@Sun.COM 524*7851SDana.Myers@Sun.COM 525*7851SDana.Myers@Sun.COM /* Execute flag should always be set when this function is entered */ 526*7851SDana.Myers@Sun.COM 527*7851SDana.Myers@Sun.COM if (!(WalkState->ParseFlags & ACPI_PARSE_EXECUTE)) 528*7851SDana.Myers@Sun.COM { 529*7851SDana.Myers@Sun.COM if (WalkState->ParseFlags & ACPI_PARSE_DEFERRED_OP) 530*7851SDana.Myers@Sun.COM { 531*7851SDana.Myers@Sun.COM /* BankField Op is deferred, just return OK */ 532*7851SDana.Myers@Sun.COM 533*7851SDana.Myers@Sun.COM return_ACPI_STATUS (AE_OK); 534*7851SDana.Myers@Sun.COM } 535*7851SDana.Myers@Sun.COM 536*7851SDana.Myers@Sun.COM return_ACPI_STATUS (AE_AML_INTERNAL); 537*7851SDana.Myers@Sun.COM } 538*7851SDana.Myers@Sun.COM 539*7851SDana.Myers@Sun.COM /* 540*7851SDana.Myers@Sun.COM * Get the FieldList argument for this opcode. This is the start of the 541*7851SDana.Myers@Sun.COM * list of field elements. 542*7851SDana.Myers@Sun.COM */ 543*7851SDana.Myers@Sun.COM switch (WalkState->Opcode) 544*7851SDana.Myers@Sun.COM { 545*7851SDana.Myers@Sun.COM case AML_FIELD_OP: 546*7851SDana.Myers@Sun.COM Arg = AcpiPsGetArg (Op, 2); 547*7851SDana.Myers@Sun.COM Type = ACPI_TYPE_LOCAL_REGION_FIELD; 548*7851SDana.Myers@Sun.COM break; 549*7851SDana.Myers@Sun.COM 550*7851SDana.Myers@Sun.COM case AML_BANK_FIELD_OP: 551*7851SDana.Myers@Sun.COM Arg = AcpiPsGetArg (Op, 4); 552*7851SDana.Myers@Sun.COM Type = ACPI_TYPE_LOCAL_BANK_FIELD; 553*7851SDana.Myers@Sun.COM break; 554*7851SDana.Myers@Sun.COM 555*7851SDana.Myers@Sun.COM case AML_INDEX_FIELD_OP: 556*7851SDana.Myers@Sun.COM Arg = AcpiPsGetArg (Op, 3); 557*7851SDana.Myers@Sun.COM Type = ACPI_TYPE_LOCAL_INDEX_FIELD; 558*7851SDana.Myers@Sun.COM break; 559*7851SDana.Myers@Sun.COM 560*7851SDana.Myers@Sun.COM default: 561*7851SDana.Myers@Sun.COM return_ACPI_STATUS (AE_BAD_PARAMETER); 562*7851SDana.Myers@Sun.COM } 563*7851SDana.Myers@Sun.COM 564*7851SDana.Myers@Sun.COM /* Creating new namespace node(s), should not already exist */ 565*7851SDana.Myers@Sun.COM 566*7851SDana.Myers@Sun.COM Flags = ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE | 567*7851SDana.Myers@Sun.COM ACPI_NS_ERROR_IF_FOUND; 568*7851SDana.Myers@Sun.COM 569*7851SDana.Myers@Sun.COM /* Mark node(s) temporary if we are executing a method */ 570*7851SDana.Myers@Sun.COM 571*7851SDana.Myers@Sun.COM if (WalkState->MethodNode) 572*7851SDana.Myers@Sun.COM { 573*7851SDana.Myers@Sun.COM Flags |= ACPI_NS_TEMPORARY; 574*7851SDana.Myers@Sun.COM } 575*7851SDana.Myers@Sun.COM 576*7851SDana.Myers@Sun.COM /* 577*7851SDana.Myers@Sun.COM * Walk the list of entries in the FieldList 578*7851SDana.Myers@Sun.COM * Note: FieldList can be of zero length. In this case, Arg will be NULL. 579*7851SDana.Myers@Sun.COM */ 580*7851SDana.Myers@Sun.COM while (Arg) 581*7851SDana.Myers@Sun.COM { 582*7851SDana.Myers@Sun.COM /* 583*7851SDana.Myers@Sun.COM * Ignore OFFSET and ACCESSAS terms here; we are only interested in the 584*7851SDana.Myers@Sun.COM * field names in order to enter them into the namespace. 585*7851SDana.Myers@Sun.COM */ 586*7851SDana.Myers@Sun.COM if (Arg->Common.AmlOpcode == AML_INT_NAMEDFIELD_OP) 587*7851SDana.Myers@Sun.COM { 588*7851SDana.Myers@Sun.COM Status = AcpiNsLookup (WalkState->ScopeInfo, 589*7851SDana.Myers@Sun.COM (char *) &Arg->Named.Name, Type, ACPI_IMODE_LOAD_PASS1, 590*7851SDana.Myers@Sun.COM Flags, WalkState, &Node); 591*7851SDana.Myers@Sun.COM if (ACPI_FAILURE (Status)) 592*7851SDana.Myers@Sun.COM { 593*7851SDana.Myers@Sun.COM ACPI_ERROR_NAMESPACE ((char *) &Arg->Named.Name, Status); 594*7851SDana.Myers@Sun.COM if (Status != AE_ALREADY_EXISTS) 595*7851SDana.Myers@Sun.COM { 596*7851SDana.Myers@Sun.COM return_ACPI_STATUS (Status); 597*7851SDana.Myers@Sun.COM } 598*7851SDana.Myers@Sun.COM 599*7851SDana.Myers@Sun.COM /* Name already exists, just ignore this error */ 600*7851SDana.Myers@Sun.COM 601*7851SDana.Myers@Sun.COM Status = AE_OK; 602*7851SDana.Myers@Sun.COM } 603*7851SDana.Myers@Sun.COM 604*7851SDana.Myers@Sun.COM Arg->Common.Node = Node; 605*7851SDana.Myers@Sun.COM } 606*7851SDana.Myers@Sun.COM 607*7851SDana.Myers@Sun.COM /* Get the next field element in the list */ 608*7851SDana.Myers@Sun.COM 609*7851SDana.Myers@Sun.COM Arg = Arg->Common.Next; 610*7851SDana.Myers@Sun.COM } 611*7851SDana.Myers@Sun.COM 612*7851SDana.Myers@Sun.COM return_ACPI_STATUS (AE_OK); 613*7851SDana.Myers@Sun.COM } 614*7851SDana.Myers@Sun.COM 615*7851SDana.Myers@Sun.COM 616*7851SDana.Myers@Sun.COM /******************************************************************************* 617*7851SDana.Myers@Sun.COM * 618*7851SDana.Myers@Sun.COM * FUNCTION: AcpiDsCreateBankField 619*7851SDana.Myers@Sun.COM * 620*7851SDana.Myers@Sun.COM * PARAMETERS: Op - Op containing the Field definition and args 621*7851SDana.Myers@Sun.COM * RegionNode - Object for the containing Operation Region 622*7851SDana.Myers@Sun.COM * WalkState - Current method state 623*7851SDana.Myers@Sun.COM * 624*7851SDana.Myers@Sun.COM * RETURN: Status 625*7851SDana.Myers@Sun.COM * 626*7851SDana.Myers@Sun.COM * DESCRIPTION: Create a new bank field in the specified operation region 627*7851SDana.Myers@Sun.COM * 628*7851SDana.Myers@Sun.COM ******************************************************************************/ 629*7851SDana.Myers@Sun.COM 630*7851SDana.Myers@Sun.COM ACPI_STATUS 631*7851SDana.Myers@Sun.COM AcpiDsCreateBankField ( 632*7851SDana.Myers@Sun.COM ACPI_PARSE_OBJECT *Op, 633*7851SDana.Myers@Sun.COM ACPI_NAMESPACE_NODE *RegionNode, 634*7851SDana.Myers@Sun.COM ACPI_WALK_STATE *WalkState) 635*7851SDana.Myers@Sun.COM { 636*7851SDana.Myers@Sun.COM ACPI_STATUS Status; 637*7851SDana.Myers@Sun.COM ACPI_PARSE_OBJECT *Arg; 638*7851SDana.Myers@Sun.COM ACPI_CREATE_FIELD_INFO Info; 639*7851SDana.Myers@Sun.COM 640*7851SDana.Myers@Sun.COM 641*7851SDana.Myers@Sun.COM ACPI_FUNCTION_TRACE_PTR (DsCreateBankField, Op); 642*7851SDana.Myers@Sun.COM 643*7851SDana.Myers@Sun.COM 644*7851SDana.Myers@Sun.COM /* First arg is the name of the parent OpRegion (must already exist) */ 645*7851SDana.Myers@Sun.COM 646*7851SDana.Myers@Sun.COM Arg = Op->Common.Value.Arg; 647*7851SDana.Myers@Sun.COM if (!RegionNode) 648*7851SDana.Myers@Sun.COM { 649*7851SDana.Myers@Sun.COM Status = AcpiNsLookup (WalkState->ScopeInfo, Arg->Common.Value.Name, 650*7851SDana.Myers@Sun.COM ACPI_TYPE_REGION, ACPI_IMODE_EXECUTE, 651*7851SDana.Myers@Sun.COM ACPI_NS_SEARCH_PARENT, WalkState, &RegionNode); 652*7851SDana.Myers@Sun.COM if (ACPI_FAILURE (Status)) 653*7851SDana.Myers@Sun.COM { 654*7851SDana.Myers@Sun.COM ACPI_ERROR_NAMESPACE (Arg->Common.Value.Name, Status); 655*7851SDana.Myers@Sun.COM return_ACPI_STATUS (Status); 656*7851SDana.Myers@Sun.COM } 657*7851SDana.Myers@Sun.COM } 658*7851SDana.Myers@Sun.COM 659*7851SDana.Myers@Sun.COM /* Second arg is the Bank Register (Field) (must already exist) */ 660*7851SDana.Myers@Sun.COM 661*7851SDana.Myers@Sun.COM Arg = Arg->Common.Next; 662*7851SDana.Myers@Sun.COM Status = AcpiNsLookup (WalkState->ScopeInfo, Arg->Common.Value.String, 663*7851SDana.Myers@Sun.COM ACPI_TYPE_ANY, ACPI_IMODE_EXECUTE, 664*7851SDana.Myers@Sun.COM ACPI_NS_SEARCH_PARENT, WalkState, &Info.RegisterNode); 665*7851SDana.Myers@Sun.COM if (ACPI_FAILURE (Status)) 666*7851SDana.Myers@Sun.COM { 667*7851SDana.Myers@Sun.COM ACPI_ERROR_NAMESPACE (Arg->Common.Value.String, Status); 668*7851SDana.Myers@Sun.COM return_ACPI_STATUS (Status); 669*7851SDana.Myers@Sun.COM } 670*7851SDana.Myers@Sun.COM 671*7851SDana.Myers@Sun.COM /* 672*7851SDana.Myers@Sun.COM * Third arg is the BankValue 673*7851SDana.Myers@Sun.COM * This arg is a TermArg, not a constant 674*7851SDana.Myers@Sun.COM * It will be evaluated later, by AcpiDsEvalBankFieldOperands 675*7851SDana.Myers@Sun.COM */ 676*7851SDana.Myers@Sun.COM Arg = Arg->Common.Next; 677*7851SDana.Myers@Sun.COM 678*7851SDana.Myers@Sun.COM /* Fourth arg is the field flags */ 679*7851SDana.Myers@Sun.COM 680*7851SDana.Myers@Sun.COM Arg = Arg->Common.Next; 681*7851SDana.Myers@Sun.COM Info.FieldFlags = (UINT8) Arg->Common.Value.Integer; 682*7851SDana.Myers@Sun.COM 683*7851SDana.Myers@Sun.COM /* Each remaining arg is a Named Field */ 684*7851SDana.Myers@Sun.COM 685*7851SDana.Myers@Sun.COM Info.FieldType = ACPI_TYPE_LOCAL_BANK_FIELD; 686*7851SDana.Myers@Sun.COM Info.RegionNode = RegionNode; 687*7851SDana.Myers@Sun.COM 688*7851SDana.Myers@Sun.COM /* 689*7851SDana.Myers@Sun.COM * Use Info.DataRegisterNode to store BankField Op 690*7851SDana.Myers@Sun.COM * It's safe because DataRegisterNode will never be used when create bank field 691*7851SDana.Myers@Sun.COM * We store AmlStart and AmlLength in the BankField Op for late evaluation 692*7851SDana.Myers@Sun.COM * Used in AcpiExPrepFieldValue(Info) 693*7851SDana.Myers@Sun.COM * 694*7851SDana.Myers@Sun.COM * TBD: Or, should we add a field in ACPI_CREATE_FIELD_INFO, like "void *ParentOp"? 695*7851SDana.Myers@Sun.COM */ 696*7851SDana.Myers@Sun.COM Info.DataRegisterNode = (ACPI_NAMESPACE_NODE*) Op; 697*7851SDana.Myers@Sun.COM 698*7851SDana.Myers@Sun.COM Status = AcpiDsGetFieldNames (&Info, WalkState, Arg->Common.Next); 699*7851SDana.Myers@Sun.COM return_ACPI_STATUS (Status); 700*7851SDana.Myers@Sun.COM } 701*7851SDana.Myers@Sun.COM 702*7851SDana.Myers@Sun.COM 703*7851SDana.Myers@Sun.COM /******************************************************************************* 704*7851SDana.Myers@Sun.COM * 705*7851SDana.Myers@Sun.COM * FUNCTION: AcpiDsCreateIndexField 706*7851SDana.Myers@Sun.COM * 707*7851SDana.Myers@Sun.COM * PARAMETERS: Op - Op containing the Field definition and args 708*7851SDana.Myers@Sun.COM * RegionNode - Object for the containing Operation Region 709*7851SDana.Myers@Sun.COM * ` WalkState - Current method state 710*7851SDana.Myers@Sun.COM * 711*7851SDana.Myers@Sun.COM * RETURN: Status 712*7851SDana.Myers@Sun.COM * 713*7851SDana.Myers@Sun.COM * DESCRIPTION: Create a new index field in the specified operation region 714*7851SDana.Myers@Sun.COM * 715*7851SDana.Myers@Sun.COM ******************************************************************************/ 716*7851SDana.Myers@Sun.COM 717*7851SDana.Myers@Sun.COM ACPI_STATUS 718*7851SDana.Myers@Sun.COM AcpiDsCreateIndexField ( 719*7851SDana.Myers@Sun.COM ACPI_PARSE_OBJECT *Op, 720*7851SDana.Myers@Sun.COM ACPI_NAMESPACE_NODE *RegionNode, 721*7851SDana.Myers@Sun.COM ACPI_WALK_STATE *WalkState) 722*7851SDana.Myers@Sun.COM { 723*7851SDana.Myers@Sun.COM ACPI_STATUS Status; 724*7851SDana.Myers@Sun.COM ACPI_PARSE_OBJECT *Arg; 725*7851SDana.Myers@Sun.COM ACPI_CREATE_FIELD_INFO Info; 726*7851SDana.Myers@Sun.COM 727*7851SDana.Myers@Sun.COM 728*7851SDana.Myers@Sun.COM ACPI_FUNCTION_TRACE_PTR (DsCreateIndexField, Op); 729*7851SDana.Myers@Sun.COM 730*7851SDana.Myers@Sun.COM 731*7851SDana.Myers@Sun.COM /* First arg is the name of the Index register (must already exist) */ 732*7851SDana.Myers@Sun.COM 733*7851SDana.Myers@Sun.COM Arg = Op->Common.Value.Arg; 734*7851SDana.Myers@Sun.COM Status = AcpiNsLookup (WalkState->ScopeInfo, Arg->Common.Value.String, 735*7851SDana.Myers@Sun.COM ACPI_TYPE_ANY, ACPI_IMODE_EXECUTE, 736*7851SDana.Myers@Sun.COM ACPI_NS_SEARCH_PARENT, WalkState, &Info.RegisterNode); 737*7851SDana.Myers@Sun.COM if (ACPI_FAILURE (Status)) 738*7851SDana.Myers@Sun.COM { 739*7851SDana.Myers@Sun.COM ACPI_ERROR_NAMESPACE (Arg->Common.Value.String, Status); 740*7851SDana.Myers@Sun.COM return_ACPI_STATUS (Status); 741*7851SDana.Myers@Sun.COM } 742*7851SDana.Myers@Sun.COM 743*7851SDana.Myers@Sun.COM /* Second arg is the data register (must already exist) */ 744*7851SDana.Myers@Sun.COM 745*7851SDana.Myers@Sun.COM Arg = Arg->Common.Next; 746*7851SDana.Myers@Sun.COM Status = AcpiNsLookup (WalkState->ScopeInfo, Arg->Common.Value.String, 747*7851SDana.Myers@Sun.COM ACPI_TYPE_ANY, ACPI_IMODE_EXECUTE, 748*7851SDana.Myers@Sun.COM ACPI_NS_SEARCH_PARENT, WalkState, &Info.DataRegisterNode); 749*7851SDana.Myers@Sun.COM if (ACPI_FAILURE (Status)) 750*7851SDana.Myers@Sun.COM { 751*7851SDana.Myers@Sun.COM ACPI_ERROR_NAMESPACE (Arg->Common.Value.String, Status); 752*7851SDana.Myers@Sun.COM return_ACPI_STATUS (Status); 753*7851SDana.Myers@Sun.COM } 754*7851SDana.Myers@Sun.COM 755*7851SDana.Myers@Sun.COM /* Next arg is the field flags */ 756*7851SDana.Myers@Sun.COM 757*7851SDana.Myers@Sun.COM Arg = Arg->Common.Next; 758*7851SDana.Myers@Sun.COM Info.FieldFlags = (UINT8) Arg->Common.Value.Integer; 759*7851SDana.Myers@Sun.COM 760*7851SDana.Myers@Sun.COM /* Each remaining arg is a Named Field */ 761*7851SDana.Myers@Sun.COM 762*7851SDana.Myers@Sun.COM Info.FieldType = ACPI_TYPE_LOCAL_INDEX_FIELD; 763*7851SDana.Myers@Sun.COM Info.RegionNode = RegionNode; 764*7851SDana.Myers@Sun.COM 765*7851SDana.Myers@Sun.COM Status = AcpiDsGetFieldNames (&Info, WalkState, Arg->Common.Next); 766*7851SDana.Myers@Sun.COM 767*7851SDana.Myers@Sun.COM return_ACPI_STATUS (Status); 768*7851SDana.Myers@Sun.COM } 769*7851SDana.Myers@Sun.COM 770*7851SDana.Myers@Sun.COM 771