1db2bae30SDana Myers /****************************************************************************** 2db2bae30SDana Myers * 3db2bae30SDana Myers * Module Name: excreate - Named object creation 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 "acinterp.h" 47db2bae30SDana Myers #include "amlcode.h" 48db2bae30SDana Myers #include "acnamesp.h" 49db2bae30SDana Myers 50db2bae30SDana Myers 51db2bae30SDana Myers #define _COMPONENT ACPI_EXECUTER 52db2bae30SDana Myers ACPI_MODULE_NAME ("excreate") 53db2bae30SDana Myers 54db2bae30SDana Myers 55db2bae30SDana Myers #ifndef ACPI_NO_METHOD_EXECUTION 56db2bae30SDana Myers /******************************************************************************* 57db2bae30SDana Myers * 58db2bae30SDana Myers * FUNCTION: AcpiExCreateAlias 59db2bae30SDana Myers * 60db2bae30SDana Myers * PARAMETERS: WalkState - Current state, contains operands 61db2bae30SDana Myers * 62db2bae30SDana Myers * RETURN: Status 63db2bae30SDana Myers * 64db2bae30SDana Myers * DESCRIPTION: Create a new named alias 65db2bae30SDana Myers * 66db2bae30SDana Myers ******************************************************************************/ 67db2bae30SDana Myers 68db2bae30SDana Myers ACPI_STATUS 69db2bae30SDana Myers AcpiExCreateAlias ( 70db2bae30SDana Myers ACPI_WALK_STATE *WalkState) 71db2bae30SDana Myers { 72db2bae30SDana Myers ACPI_NAMESPACE_NODE *TargetNode; 73db2bae30SDana Myers ACPI_NAMESPACE_NODE *AliasNode; 74db2bae30SDana Myers ACPI_STATUS Status = AE_OK; 75db2bae30SDana Myers 76db2bae30SDana Myers 77db2bae30SDana Myers ACPI_FUNCTION_TRACE (ExCreateAlias); 78db2bae30SDana Myers 79db2bae30SDana Myers 80db2bae30SDana Myers /* Get the source/alias operands (both namespace nodes) */ 81db2bae30SDana Myers 82db2bae30SDana Myers AliasNode = (ACPI_NAMESPACE_NODE *) WalkState->Operands[0]; 83db2bae30SDana Myers TargetNode = (ACPI_NAMESPACE_NODE *) WalkState->Operands[1]; 84db2bae30SDana Myers 85db2bae30SDana Myers if ((TargetNode->Type == ACPI_TYPE_LOCAL_ALIAS) || 86db2bae30SDana Myers (TargetNode->Type == ACPI_TYPE_LOCAL_METHOD_ALIAS)) 87db2bae30SDana Myers { 88db2bae30SDana Myers /* 89db2bae30SDana Myers * Dereference an existing alias so that we don't create a chain 90db2bae30SDana Myers * of aliases. With this code, we guarantee that an alias is 91db2bae30SDana Myers * always exactly one level of indirection away from the 92db2bae30SDana Myers * actual aliased name. 93db2bae30SDana Myers */ 94db2bae30SDana Myers TargetNode = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, TargetNode->Object); 95db2bae30SDana Myers } 96db2bae30SDana Myers 97db2bae30SDana Myers /* 98db2bae30SDana Myers * For objects that can never change (i.e., the NS node will 99db2bae30SDana Myers * permanently point to the same object), we can simply attach 100db2bae30SDana Myers * the object to the new NS node. For other objects (such as 101db2bae30SDana Myers * Integers, buffers, etc.), we have to point the Alias node 102db2bae30SDana Myers * to the original Node. 103db2bae30SDana Myers */ 104db2bae30SDana Myers switch (TargetNode->Type) 105db2bae30SDana Myers { 106db2bae30SDana Myers 107db2bae30SDana Myers /* For these types, the sub-object can change dynamically via a Store */ 108db2bae30SDana Myers 109db2bae30SDana Myers case ACPI_TYPE_INTEGER: 110db2bae30SDana Myers case ACPI_TYPE_STRING: 111db2bae30SDana Myers case ACPI_TYPE_BUFFER: 112db2bae30SDana Myers case ACPI_TYPE_PACKAGE: 113db2bae30SDana Myers case ACPI_TYPE_BUFFER_FIELD: 114db2bae30SDana Myers /* 115db2bae30SDana Myers * These types open a new scope, so we need the NS node in order to access 116db2bae30SDana Myers * any children. 117db2bae30SDana Myers */ 118db2bae30SDana Myers case ACPI_TYPE_DEVICE: 119db2bae30SDana Myers case ACPI_TYPE_POWER: 120db2bae30SDana Myers case ACPI_TYPE_PROCESSOR: 121db2bae30SDana Myers case ACPI_TYPE_THERMAL: 122db2bae30SDana Myers case ACPI_TYPE_LOCAL_SCOPE: 123db2bae30SDana Myers /* 124db2bae30SDana Myers * The new alias has the type ALIAS and points to the original 125db2bae30SDana Myers * NS node, not the object itself. 126db2bae30SDana Myers */ 127db2bae30SDana Myers AliasNode->Type = ACPI_TYPE_LOCAL_ALIAS; 128db2bae30SDana Myers AliasNode->Object = ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, TargetNode); 129db2bae30SDana Myers break; 130db2bae30SDana Myers 131db2bae30SDana Myers case ACPI_TYPE_METHOD: 132db2bae30SDana Myers /* 133db2bae30SDana Myers * Control method aliases need to be differentiated 134db2bae30SDana Myers */ 135db2bae30SDana Myers AliasNode->Type = ACPI_TYPE_LOCAL_METHOD_ALIAS; 136db2bae30SDana Myers AliasNode->Object = ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, TargetNode); 137db2bae30SDana Myers break; 138db2bae30SDana Myers 139db2bae30SDana Myers default: 140db2bae30SDana Myers 141db2bae30SDana Myers /* Attach the original source object to the new Alias Node */ 142db2bae30SDana Myers 143db2bae30SDana Myers /* 144db2bae30SDana Myers * The new alias assumes the type of the target, and it points 145db2bae30SDana Myers * to the same object. The reference count of the object has an 146db2bae30SDana Myers * additional reference to prevent deletion out from under either the 147db2bae30SDana Myers * target node or the alias Node 148db2bae30SDana Myers */ 149db2bae30SDana Myers Status = AcpiNsAttachObject (AliasNode, 150db2bae30SDana Myers AcpiNsGetAttachedObject (TargetNode), TargetNode->Type); 151db2bae30SDana Myers break; 152db2bae30SDana Myers } 153db2bae30SDana Myers 154db2bae30SDana Myers /* Since both operands are Nodes, we don't need to delete them */ 155db2bae30SDana Myers 156db2bae30SDana Myers return_ACPI_STATUS (Status); 157db2bae30SDana Myers } 158db2bae30SDana Myers 159db2bae30SDana Myers 160db2bae30SDana Myers /******************************************************************************* 161db2bae30SDana Myers * 162db2bae30SDana Myers * FUNCTION: AcpiExCreateEvent 163db2bae30SDana Myers * 164db2bae30SDana Myers * PARAMETERS: WalkState - Current state 165db2bae30SDana Myers * 166db2bae30SDana Myers * RETURN: Status 167db2bae30SDana Myers * 168db2bae30SDana Myers * DESCRIPTION: Create a new event object 169db2bae30SDana Myers * 170db2bae30SDana Myers ******************************************************************************/ 171db2bae30SDana Myers 172db2bae30SDana Myers ACPI_STATUS 173db2bae30SDana Myers AcpiExCreateEvent ( 174db2bae30SDana Myers ACPI_WALK_STATE *WalkState) 175db2bae30SDana Myers { 176db2bae30SDana Myers ACPI_STATUS Status; 177db2bae30SDana Myers ACPI_OPERAND_OBJECT *ObjDesc; 178db2bae30SDana Myers 179db2bae30SDana Myers 180db2bae30SDana Myers ACPI_FUNCTION_TRACE (ExCreateEvent); 181db2bae30SDana Myers 182db2bae30SDana Myers 183db2bae30SDana Myers ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_EVENT); 184db2bae30SDana Myers if (!ObjDesc) 185db2bae30SDana Myers { 186db2bae30SDana Myers Status = AE_NO_MEMORY; 187db2bae30SDana Myers goto Cleanup; 188db2bae30SDana Myers } 189db2bae30SDana Myers 190db2bae30SDana Myers /* 191db2bae30SDana Myers * Create the actual OS semaphore, with zero initial units -- meaning 192db2bae30SDana Myers * that the event is created in an unsignalled state 193db2bae30SDana Myers */ 194db2bae30SDana Myers Status = AcpiOsCreateSemaphore (ACPI_NO_UNIT_LIMIT, 0, 195db2bae30SDana Myers &ObjDesc->Event.OsSemaphore); 196db2bae30SDana Myers if (ACPI_FAILURE (Status)) 197db2bae30SDana Myers { 198db2bae30SDana Myers goto Cleanup; 199db2bae30SDana Myers } 200db2bae30SDana Myers 201db2bae30SDana Myers /* Attach object to the Node */ 202db2bae30SDana Myers 203*385cc6b4SJerry Jelinek Status = AcpiNsAttachObject ( 204*385cc6b4SJerry Jelinek (ACPI_NAMESPACE_NODE *) WalkState->Operands[0], 205db2bae30SDana Myers ObjDesc, ACPI_TYPE_EVENT); 206db2bae30SDana Myers 207db2bae30SDana Myers Cleanup: 208db2bae30SDana Myers /* 209db2bae30SDana Myers * Remove local reference to the object (on error, will cause deletion 210db2bae30SDana Myers * of both object and semaphore if present.) 211db2bae30SDana Myers */ 212db2bae30SDana Myers AcpiUtRemoveReference (ObjDesc); 213db2bae30SDana Myers return_ACPI_STATUS (Status); 214db2bae30SDana Myers } 215db2bae30SDana Myers 216db2bae30SDana Myers 217db2bae30SDana Myers /******************************************************************************* 218db2bae30SDana Myers * 219db2bae30SDana Myers * FUNCTION: AcpiExCreateMutex 220db2bae30SDana Myers * 221db2bae30SDana Myers * PARAMETERS: WalkState - Current state 222db2bae30SDana Myers * 223db2bae30SDana Myers * RETURN: Status 224db2bae30SDana Myers * 225db2bae30SDana Myers * DESCRIPTION: Create a new mutex object 226db2bae30SDana Myers * 227db2bae30SDana Myers * Mutex (Name[0], SyncLevel[1]) 228db2bae30SDana Myers * 229db2bae30SDana Myers ******************************************************************************/ 230db2bae30SDana Myers 231db2bae30SDana Myers ACPI_STATUS 232db2bae30SDana Myers AcpiExCreateMutex ( 233db2bae30SDana Myers ACPI_WALK_STATE *WalkState) 234db2bae30SDana Myers { 235db2bae30SDana Myers ACPI_STATUS Status = AE_OK; 236db2bae30SDana Myers ACPI_OPERAND_OBJECT *ObjDesc; 237db2bae30SDana Myers 238db2bae30SDana Myers 239db2bae30SDana Myers ACPI_FUNCTION_TRACE_PTR (ExCreateMutex, ACPI_WALK_OPERANDS); 240db2bae30SDana Myers 241db2bae30SDana Myers 242db2bae30SDana Myers /* Create the new mutex object */ 243db2bae30SDana Myers 244db2bae30SDana Myers ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_MUTEX); 245db2bae30SDana Myers if (!ObjDesc) 246db2bae30SDana Myers { 247db2bae30SDana Myers Status = AE_NO_MEMORY; 248db2bae30SDana Myers goto Cleanup; 249db2bae30SDana Myers } 250db2bae30SDana Myers 251db2bae30SDana Myers /* Create the actual OS Mutex */ 252db2bae30SDana Myers 253db2bae30SDana Myers Status = AcpiOsCreateMutex (&ObjDesc->Mutex.OsMutex); 254db2bae30SDana Myers if (ACPI_FAILURE (Status)) 255db2bae30SDana Myers { 256db2bae30SDana Myers goto Cleanup; 257db2bae30SDana Myers } 258db2bae30SDana Myers 259db2bae30SDana Myers /* Init object and attach to NS node */ 260db2bae30SDana Myers 261db2bae30SDana Myers ObjDesc->Mutex.SyncLevel = (UINT8) WalkState->Operands[1]->Integer.Value; 262db2bae30SDana Myers ObjDesc->Mutex.Node = (ACPI_NAMESPACE_NODE *) WalkState->Operands[0]; 263db2bae30SDana Myers 264*385cc6b4SJerry Jelinek Status = AcpiNsAttachObject ( 265*385cc6b4SJerry Jelinek ObjDesc->Mutex.Node, ObjDesc, ACPI_TYPE_MUTEX); 266db2bae30SDana Myers 267db2bae30SDana Myers 268db2bae30SDana Myers Cleanup: 269db2bae30SDana Myers /* 270db2bae30SDana Myers * Remove local reference to the object (on error, will cause deletion 271db2bae30SDana Myers * of both object and semaphore if present.) 272db2bae30SDana Myers */ 273db2bae30SDana Myers AcpiUtRemoveReference (ObjDesc); 274db2bae30SDana Myers return_ACPI_STATUS (Status); 275db2bae30SDana Myers } 276db2bae30SDana Myers 277db2bae30SDana Myers 278db2bae30SDana Myers /******************************************************************************* 279db2bae30SDana Myers * 280db2bae30SDana Myers * FUNCTION: AcpiExCreateRegion 281db2bae30SDana Myers * 282db2bae30SDana Myers * PARAMETERS: AmlStart - Pointer to the region declaration AML 283db2bae30SDana Myers * AmlLength - Max length of the declaration AML 284*385cc6b4SJerry Jelinek * SpaceId - Address space ID for the region 285db2bae30SDana Myers * WalkState - Current state 286db2bae30SDana Myers * 287db2bae30SDana Myers * RETURN: Status 288db2bae30SDana Myers * 289db2bae30SDana Myers * DESCRIPTION: Create a new operation region object 290db2bae30SDana Myers * 291db2bae30SDana Myers ******************************************************************************/ 292db2bae30SDana Myers 293db2bae30SDana Myers ACPI_STATUS 294db2bae30SDana Myers AcpiExCreateRegion ( 295db2bae30SDana Myers UINT8 *AmlStart, 296db2bae30SDana Myers UINT32 AmlLength, 297*385cc6b4SJerry Jelinek UINT8 SpaceId, 298db2bae30SDana Myers ACPI_WALK_STATE *WalkState) 299db2bae30SDana Myers { 300db2bae30SDana Myers ACPI_STATUS Status; 301db2bae30SDana Myers ACPI_OPERAND_OBJECT *ObjDesc; 302db2bae30SDana Myers ACPI_NAMESPACE_NODE *Node; 303db2bae30SDana Myers ACPI_OPERAND_OBJECT *RegionObj2; 304db2bae30SDana Myers 305db2bae30SDana Myers 306db2bae30SDana Myers ACPI_FUNCTION_TRACE (ExCreateRegion); 307db2bae30SDana Myers 308db2bae30SDana Myers 309db2bae30SDana Myers /* Get the Namespace Node */ 310db2bae30SDana Myers 311db2bae30SDana Myers Node = WalkState->Op->Common.Node; 312db2bae30SDana Myers 313db2bae30SDana Myers /* 314db2bae30SDana Myers * If the region object is already attached to this node, 315db2bae30SDana Myers * just return 316db2bae30SDana Myers */ 317db2bae30SDana Myers if (AcpiNsGetAttachedObject (Node)) 318db2bae30SDana Myers { 319db2bae30SDana Myers return_ACPI_STATUS (AE_OK); 320db2bae30SDana Myers } 321db2bae30SDana Myers 322db2bae30SDana Myers /* 323db2bae30SDana Myers * Space ID must be one of the predefined IDs, or in the user-defined 324db2bae30SDana Myers * range 325db2bae30SDana Myers */ 326*385cc6b4SJerry Jelinek if (!AcpiIsValidSpaceId (SpaceId)) 327db2bae30SDana Myers { 328*385cc6b4SJerry Jelinek /* 329*385cc6b4SJerry Jelinek * Print an error message, but continue. We don't want to abort 330*385cc6b4SJerry Jelinek * a table load for this exception. Instead, if the region is 331*385cc6b4SJerry Jelinek * actually used at runtime, abort the executing method. 332*385cc6b4SJerry Jelinek */ 333*385cc6b4SJerry Jelinek ACPI_ERROR ((AE_INFO, 334*385cc6b4SJerry Jelinek "Invalid/unknown Address Space ID: 0x%2.2X", SpaceId)); 335db2bae30SDana Myers } 336db2bae30SDana Myers 33726f3cdf0SGordon Ross ACPI_DEBUG_PRINT ((ACPI_DB_LOAD, "Region Type - %s (0x%X)\n", 338*385cc6b4SJerry Jelinek AcpiUtGetRegionName (SpaceId), SpaceId)); 339db2bae30SDana Myers 340db2bae30SDana Myers /* Create the region descriptor */ 341db2bae30SDana Myers 342db2bae30SDana Myers ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_REGION); 343db2bae30SDana Myers if (!ObjDesc) 344db2bae30SDana Myers { 345db2bae30SDana Myers Status = AE_NO_MEMORY; 346db2bae30SDana Myers goto Cleanup; 347db2bae30SDana Myers } 348db2bae30SDana Myers 349db2bae30SDana Myers /* 350db2bae30SDana Myers * Remember location in AML stream of address & length 351db2bae30SDana Myers * operands since they need to be evaluated at run time. 352db2bae30SDana Myers */ 353*385cc6b4SJerry Jelinek RegionObj2 = AcpiNsGetSecondaryObject (ObjDesc); 354db2bae30SDana Myers RegionObj2->Extra.AmlStart = AmlStart; 355db2bae30SDana Myers RegionObj2->Extra.AmlLength = AmlLength; 356*385cc6b4SJerry Jelinek RegionObj2->Extra.Method_REG = NULL; 357*385cc6b4SJerry Jelinek if (WalkState->ScopeInfo) 358*385cc6b4SJerry Jelinek { 359*385cc6b4SJerry Jelinek RegionObj2->Extra.ScopeNode = WalkState->ScopeInfo->Scope.Node; 360*385cc6b4SJerry Jelinek } 361*385cc6b4SJerry Jelinek else 362*385cc6b4SJerry Jelinek { 363*385cc6b4SJerry Jelinek RegionObj2->Extra.ScopeNode = Node; 364*385cc6b4SJerry Jelinek } 365db2bae30SDana Myers 366db2bae30SDana Myers /* Init the region from the operands */ 367db2bae30SDana Myers 368*385cc6b4SJerry Jelinek ObjDesc->Region.SpaceId = SpaceId; 369db2bae30SDana Myers ObjDesc->Region.Address = 0; 370db2bae30SDana Myers ObjDesc->Region.Length = 0; 371db2bae30SDana Myers ObjDesc->Region.Node = Node; 372*385cc6b4SJerry Jelinek ObjDesc->Region.Handler = NULL; 373*385cc6b4SJerry Jelinek ObjDesc->Common.Flags &= 374*385cc6b4SJerry Jelinek ~(AOPOBJ_SETUP_COMPLETE | AOPOBJ_REG_CONNECTED | 375*385cc6b4SJerry Jelinek AOPOBJ_OBJECT_INITIALIZED); 376db2bae30SDana Myers 377db2bae30SDana Myers /* Install the new region object in the parent Node */ 378db2bae30SDana Myers 379db2bae30SDana Myers Status = AcpiNsAttachObject (Node, ObjDesc, ACPI_TYPE_REGION); 380db2bae30SDana Myers 381db2bae30SDana Myers 382db2bae30SDana Myers Cleanup: 383db2bae30SDana Myers 384db2bae30SDana Myers /* Remove local reference to the object */ 385db2bae30SDana Myers 386db2bae30SDana Myers AcpiUtRemoveReference (ObjDesc); 387db2bae30SDana Myers return_ACPI_STATUS (Status); 388db2bae30SDana Myers } 389db2bae30SDana Myers 390db2bae30SDana Myers 391db2bae30SDana Myers /******************************************************************************* 392db2bae30SDana Myers * 393db2bae30SDana Myers * FUNCTION: AcpiExCreateProcessor 394db2bae30SDana Myers * 395db2bae30SDana Myers * PARAMETERS: WalkState - Current state 396db2bae30SDana Myers * 397db2bae30SDana Myers * RETURN: Status 398db2bae30SDana Myers * 399db2bae30SDana Myers * DESCRIPTION: Create a new processor object and populate the fields 400db2bae30SDana Myers * 401db2bae30SDana Myers * Processor (Name[0], CpuID[1], PblockAddr[2], PblockLength[3]) 402db2bae30SDana Myers * 403db2bae30SDana Myers ******************************************************************************/ 404db2bae30SDana Myers 405db2bae30SDana Myers ACPI_STATUS 406db2bae30SDana Myers AcpiExCreateProcessor ( 407db2bae30SDana Myers ACPI_WALK_STATE *WalkState) 408db2bae30SDana Myers { 409db2bae30SDana Myers ACPI_OPERAND_OBJECT **Operand = &WalkState->Operands[0]; 410db2bae30SDana Myers ACPI_OPERAND_OBJECT *ObjDesc; 411db2bae30SDana Myers ACPI_STATUS Status; 412db2bae30SDana Myers 413db2bae30SDana Myers 414db2bae30SDana Myers ACPI_FUNCTION_TRACE_PTR (ExCreateProcessor, WalkState); 415db2bae30SDana Myers 416db2bae30SDana Myers 417db2bae30SDana Myers /* Create the processor object */ 418db2bae30SDana Myers 419db2bae30SDana Myers ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_PROCESSOR); 420db2bae30SDana Myers if (!ObjDesc) 421db2bae30SDana Myers { 422db2bae30SDana Myers return_ACPI_STATUS (AE_NO_MEMORY); 423db2bae30SDana Myers } 424db2bae30SDana Myers 425db2bae30SDana Myers /* Initialize the processor object from the operands */ 426db2bae30SDana Myers 427db2bae30SDana Myers ObjDesc->Processor.ProcId = (UINT8) Operand[1]->Integer.Value; 428db2bae30SDana Myers ObjDesc->Processor.Length = (UINT8) Operand[3]->Integer.Value; 429db2bae30SDana Myers ObjDesc->Processor.Address = (ACPI_IO_ADDRESS) Operand[2]->Integer.Value; 430db2bae30SDana Myers 431db2bae30SDana Myers /* Install the processor object in the parent Node */ 432db2bae30SDana Myers 433db2bae30SDana Myers Status = AcpiNsAttachObject ((ACPI_NAMESPACE_NODE *) Operand[0], 434db2bae30SDana Myers ObjDesc, ACPI_TYPE_PROCESSOR); 435db2bae30SDana Myers 436db2bae30SDana Myers /* Remove local reference to the object */ 437db2bae30SDana Myers 438db2bae30SDana Myers AcpiUtRemoveReference (ObjDesc); 439db2bae30SDana Myers return_ACPI_STATUS (Status); 440db2bae30SDana Myers } 441db2bae30SDana Myers 442db2bae30SDana Myers 443db2bae30SDana Myers /******************************************************************************* 444db2bae30SDana Myers * 445db2bae30SDana Myers * FUNCTION: AcpiExCreatePowerResource 446db2bae30SDana Myers * 447db2bae30SDana Myers * PARAMETERS: WalkState - Current state 448db2bae30SDana Myers * 449db2bae30SDana Myers * RETURN: Status 450db2bae30SDana Myers * 451db2bae30SDana Myers * DESCRIPTION: Create a new PowerResource object and populate the fields 452db2bae30SDana Myers * 453db2bae30SDana Myers * PowerResource (Name[0], SystemLevel[1], ResourceOrder[2]) 454db2bae30SDana Myers * 455db2bae30SDana Myers ******************************************************************************/ 456db2bae30SDana Myers 457db2bae30SDana Myers ACPI_STATUS 458db2bae30SDana Myers AcpiExCreatePowerResource ( 459db2bae30SDana Myers ACPI_WALK_STATE *WalkState) 460db2bae30SDana Myers { 461db2bae30SDana Myers ACPI_OPERAND_OBJECT **Operand = &WalkState->Operands[0]; 462db2bae30SDana Myers ACPI_STATUS Status; 463db2bae30SDana Myers ACPI_OPERAND_OBJECT *ObjDesc; 464db2bae30SDana Myers 465db2bae30SDana Myers 466db2bae30SDana Myers ACPI_FUNCTION_TRACE_PTR (ExCreatePowerResource, WalkState); 467db2bae30SDana Myers 468db2bae30SDana Myers 469db2bae30SDana Myers /* Create the power resource object */ 470db2bae30SDana Myers 471db2bae30SDana Myers ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_POWER); 472db2bae30SDana Myers if (!ObjDesc) 473db2bae30SDana Myers { 474db2bae30SDana Myers return_ACPI_STATUS (AE_NO_MEMORY); 475db2bae30SDana Myers } 476db2bae30SDana Myers 477db2bae30SDana Myers /* Initialize the power object from the operands */ 478db2bae30SDana Myers 479db2bae30SDana Myers ObjDesc->PowerResource.SystemLevel = (UINT8) Operand[1]->Integer.Value; 480db2bae30SDana Myers ObjDesc->PowerResource.ResourceOrder = (UINT16) Operand[2]->Integer.Value; 481db2bae30SDana Myers 482db2bae30SDana Myers /* Install the power resource object in the parent Node */ 483db2bae30SDana Myers 484db2bae30SDana Myers Status = AcpiNsAttachObject ((ACPI_NAMESPACE_NODE *) Operand[0], 485db2bae30SDana Myers ObjDesc, ACPI_TYPE_POWER); 486db2bae30SDana Myers 487db2bae30SDana Myers /* Remove local reference to the object */ 488db2bae30SDana Myers 489db2bae30SDana Myers AcpiUtRemoveReference (ObjDesc); 490db2bae30SDana Myers return_ACPI_STATUS (Status); 491db2bae30SDana Myers } 492db2bae30SDana Myers #endif 493db2bae30SDana Myers 494db2bae30SDana Myers 495db2bae30SDana Myers /******************************************************************************* 496db2bae30SDana Myers * 497db2bae30SDana Myers * FUNCTION: AcpiExCreateMethod 498db2bae30SDana Myers * 499db2bae30SDana Myers * PARAMETERS: AmlStart - First byte of the method's AML 500db2bae30SDana Myers * AmlLength - AML byte count for this method 501db2bae30SDana Myers * WalkState - Current state 502db2bae30SDana Myers * 503db2bae30SDana Myers * RETURN: Status 504db2bae30SDana Myers * 505db2bae30SDana Myers * DESCRIPTION: Create a new method object 506db2bae30SDana Myers * 507db2bae30SDana Myers ******************************************************************************/ 508db2bae30SDana Myers 509db2bae30SDana Myers ACPI_STATUS 510db2bae30SDana Myers AcpiExCreateMethod ( 511db2bae30SDana Myers UINT8 *AmlStart, 512db2bae30SDana Myers UINT32 AmlLength, 513db2bae30SDana Myers ACPI_WALK_STATE *WalkState) 514db2bae30SDana Myers { 515db2bae30SDana Myers ACPI_OPERAND_OBJECT **Operand = &WalkState->Operands[0]; 516db2bae30SDana Myers ACPI_OPERAND_OBJECT *ObjDesc; 517db2bae30SDana Myers ACPI_STATUS Status; 518db2bae30SDana Myers UINT8 MethodFlags; 519db2bae30SDana Myers 520db2bae30SDana Myers 521db2bae30SDana Myers ACPI_FUNCTION_TRACE_PTR (ExCreateMethod, WalkState); 522db2bae30SDana Myers 523db2bae30SDana Myers 524db2bae30SDana Myers /* Create a new method object */ 525db2bae30SDana Myers 526db2bae30SDana Myers ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_METHOD); 527db2bae30SDana Myers if (!ObjDesc) 528db2bae30SDana Myers { 529db2bae30SDana Myers Status = AE_NO_MEMORY; 530db2bae30SDana Myers goto Exit; 531db2bae30SDana Myers } 532db2bae30SDana Myers 533db2bae30SDana Myers /* Save the method's AML pointer and length */ 534db2bae30SDana Myers 535db2bae30SDana Myers ObjDesc->Method.AmlStart = AmlStart; 536db2bae30SDana Myers ObjDesc->Method.AmlLength = AmlLength; 537*385cc6b4SJerry Jelinek ObjDesc->Method.Node = Operand[0]; 538db2bae30SDana Myers 539db2bae30SDana Myers /* 54026f3cdf0SGordon Ross * Disassemble the method flags. Split off the ArgCount, Serialized 54126f3cdf0SGordon Ross * flag, and SyncLevel for efficiency. 542db2bae30SDana Myers */ 543db2bae30SDana Myers MethodFlags = (UINT8) Operand[1]->Integer.Value; 544*385cc6b4SJerry Jelinek ObjDesc->Method.ParamCount = (UINT8) 545*385cc6b4SJerry Jelinek (MethodFlags & AML_METHOD_ARG_COUNT); 546db2bae30SDana Myers 547db2bae30SDana Myers /* 548db2bae30SDana Myers * Get the SyncLevel. If method is serialized, a mutex will be 549db2bae30SDana Myers * created for this method when it is parsed. 550db2bae30SDana Myers */ 551db2bae30SDana Myers if (MethodFlags & AML_METHOD_SERIALIZED) 552db2bae30SDana Myers { 55326f3cdf0SGordon Ross ObjDesc->Method.InfoFlags = ACPI_METHOD_SERIALIZED; 55426f3cdf0SGordon Ross 555db2bae30SDana Myers /* 556db2bae30SDana Myers * ACPI 1.0: SyncLevel = 0 557db2bae30SDana Myers * ACPI 2.0: SyncLevel = SyncLevel in method declaration 558db2bae30SDana Myers */ 559db2bae30SDana Myers ObjDesc->Method.SyncLevel = (UINT8) 560aa2aa9a6SDana Myers ((MethodFlags & AML_METHOD_SYNC_LEVEL) >> 4); 561db2bae30SDana Myers } 562db2bae30SDana Myers 563db2bae30SDana Myers /* Attach the new object to the method Node */ 564db2bae30SDana Myers 565db2bae30SDana Myers Status = AcpiNsAttachObject ((ACPI_NAMESPACE_NODE *) Operand[0], 566db2bae30SDana Myers ObjDesc, ACPI_TYPE_METHOD); 567db2bae30SDana Myers 568db2bae30SDana Myers /* Remove local reference to the object */ 569db2bae30SDana Myers 570db2bae30SDana Myers AcpiUtRemoveReference (ObjDesc); 571db2bae30SDana Myers 572db2bae30SDana Myers Exit: 573db2bae30SDana Myers /* Remove a reference to the operand */ 574db2bae30SDana Myers 575db2bae30SDana Myers AcpiUtRemoveReference (Operand[1]); 576db2bae30SDana Myers return_ACPI_STATUS (Status); 577db2bae30SDana Myers } 578