1*a159c266SJung-uk Kim /******************************************************************************* 2*a159c266SJung-uk Kim * 3*a159c266SJung-uk Kim * Module Name: utstate - state object support procedures 4*a159c266SJung-uk Kim * 5*a159c266SJung-uk Kim ******************************************************************************/ 6*a159c266SJung-uk Kim 7*a159c266SJung-uk Kim /* 8*a159c266SJung-uk Kim * Copyright (C) 2000 - 2012, Intel Corp. 9*a159c266SJung-uk Kim * All rights reserved. 10*a159c266SJung-uk Kim * 11*a159c266SJung-uk Kim * Redistribution and use in source and binary forms, with or without 12*a159c266SJung-uk Kim * modification, are permitted provided that the following conditions 13*a159c266SJung-uk Kim * are met: 14*a159c266SJung-uk Kim * 1. Redistributions of source code must retain the above copyright 15*a159c266SJung-uk Kim * notice, this list of conditions, and the following disclaimer, 16*a159c266SJung-uk Kim * without modification. 17*a159c266SJung-uk Kim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18*a159c266SJung-uk Kim * substantially similar to the "NO WARRANTY" disclaimer below 19*a159c266SJung-uk Kim * ("Disclaimer") and any redistribution must be conditioned upon 20*a159c266SJung-uk Kim * including a substantially similar Disclaimer requirement for further 21*a159c266SJung-uk Kim * binary redistribution. 22*a159c266SJung-uk Kim * 3. Neither the names of the above-listed copyright holders nor the names 23*a159c266SJung-uk Kim * of any contributors may be used to endorse or promote products derived 24*a159c266SJung-uk Kim * from this software without specific prior written permission. 25*a159c266SJung-uk Kim * 26*a159c266SJung-uk Kim * Alternatively, this software may be distributed under the terms of the 27*a159c266SJung-uk Kim * GNU General Public License ("GPL") version 2 as published by the Free 28*a159c266SJung-uk Kim * Software Foundation. 29*a159c266SJung-uk Kim * 30*a159c266SJung-uk Kim * NO WARRANTY 31*a159c266SJung-uk Kim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32*a159c266SJung-uk Kim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33*a159c266SJung-uk Kim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34*a159c266SJung-uk Kim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35*a159c266SJung-uk Kim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36*a159c266SJung-uk Kim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37*a159c266SJung-uk Kim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38*a159c266SJung-uk Kim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39*a159c266SJung-uk Kim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40*a159c266SJung-uk Kim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41*a159c266SJung-uk Kim * POSSIBILITY OF SUCH DAMAGES. 42*a159c266SJung-uk Kim */ 43*a159c266SJung-uk Kim 44*a159c266SJung-uk Kim 45*a159c266SJung-uk Kim #define __UTSTATE_C__ 46*a159c266SJung-uk Kim 47*a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acpi.h> 48*a159c266SJung-uk Kim #include <contrib/dev/acpica/include/accommon.h> 49*a159c266SJung-uk Kim 50*a159c266SJung-uk Kim #define _COMPONENT ACPI_UTILITIES 51*a159c266SJung-uk Kim ACPI_MODULE_NAME ("utstate") 52*a159c266SJung-uk Kim 53*a159c266SJung-uk Kim 54*a159c266SJung-uk Kim /******************************************************************************* 55*a159c266SJung-uk Kim * 56*a159c266SJung-uk Kim * FUNCTION: AcpiUtCreatePkgStateAndPush 57*a159c266SJung-uk Kim * 58*a159c266SJung-uk Kim * PARAMETERS: Object - Object to be added to the new state 59*a159c266SJung-uk Kim * Action - Increment/Decrement 60*a159c266SJung-uk Kim * StateList - List the state will be added to 61*a159c266SJung-uk Kim * 62*a159c266SJung-uk Kim * RETURN: Status 63*a159c266SJung-uk Kim * 64*a159c266SJung-uk Kim * DESCRIPTION: Create a new state and push it 65*a159c266SJung-uk Kim * 66*a159c266SJung-uk Kim ******************************************************************************/ 67*a159c266SJung-uk Kim 68*a159c266SJung-uk Kim ACPI_STATUS 69*a159c266SJung-uk Kim AcpiUtCreatePkgStateAndPush ( 70*a159c266SJung-uk Kim void *InternalObject, 71*a159c266SJung-uk Kim void *ExternalObject, 72*a159c266SJung-uk Kim UINT16 Index, 73*a159c266SJung-uk Kim ACPI_GENERIC_STATE **StateList) 74*a159c266SJung-uk Kim { 75*a159c266SJung-uk Kim ACPI_GENERIC_STATE *State; 76*a159c266SJung-uk Kim 77*a159c266SJung-uk Kim 78*a159c266SJung-uk Kim ACPI_FUNCTION_ENTRY (); 79*a159c266SJung-uk Kim 80*a159c266SJung-uk Kim 81*a159c266SJung-uk Kim State = AcpiUtCreatePkgState (InternalObject, ExternalObject, Index); 82*a159c266SJung-uk Kim if (!State) 83*a159c266SJung-uk Kim { 84*a159c266SJung-uk Kim return (AE_NO_MEMORY); 85*a159c266SJung-uk Kim } 86*a159c266SJung-uk Kim 87*a159c266SJung-uk Kim AcpiUtPushGenericState (StateList, State); 88*a159c266SJung-uk Kim return (AE_OK); 89*a159c266SJung-uk Kim } 90*a159c266SJung-uk Kim 91*a159c266SJung-uk Kim 92*a159c266SJung-uk Kim /******************************************************************************* 93*a159c266SJung-uk Kim * 94*a159c266SJung-uk Kim * FUNCTION: AcpiUtPushGenericState 95*a159c266SJung-uk Kim * 96*a159c266SJung-uk Kim * PARAMETERS: ListHead - Head of the state stack 97*a159c266SJung-uk Kim * State - State object to push 98*a159c266SJung-uk Kim * 99*a159c266SJung-uk Kim * RETURN: None 100*a159c266SJung-uk Kim * 101*a159c266SJung-uk Kim * DESCRIPTION: Push a state object onto a state stack 102*a159c266SJung-uk Kim * 103*a159c266SJung-uk Kim ******************************************************************************/ 104*a159c266SJung-uk Kim 105*a159c266SJung-uk Kim void 106*a159c266SJung-uk Kim AcpiUtPushGenericState ( 107*a159c266SJung-uk Kim ACPI_GENERIC_STATE **ListHead, 108*a159c266SJung-uk Kim ACPI_GENERIC_STATE *State) 109*a159c266SJung-uk Kim { 110*a159c266SJung-uk Kim ACPI_FUNCTION_TRACE (UtPushGenericState); 111*a159c266SJung-uk Kim 112*a159c266SJung-uk Kim 113*a159c266SJung-uk Kim /* Push the state object onto the front of the list (stack) */ 114*a159c266SJung-uk Kim 115*a159c266SJung-uk Kim State->Common.Next = *ListHead; 116*a159c266SJung-uk Kim *ListHead = State; 117*a159c266SJung-uk Kim 118*a159c266SJung-uk Kim return_VOID; 119*a159c266SJung-uk Kim } 120*a159c266SJung-uk Kim 121*a159c266SJung-uk Kim 122*a159c266SJung-uk Kim /******************************************************************************* 123*a159c266SJung-uk Kim * 124*a159c266SJung-uk Kim * FUNCTION: AcpiUtPopGenericState 125*a159c266SJung-uk Kim * 126*a159c266SJung-uk Kim * PARAMETERS: ListHead - Head of the state stack 127*a159c266SJung-uk Kim * 128*a159c266SJung-uk Kim * RETURN: The popped state object 129*a159c266SJung-uk Kim * 130*a159c266SJung-uk Kim * DESCRIPTION: Pop a state object from a state stack 131*a159c266SJung-uk Kim * 132*a159c266SJung-uk Kim ******************************************************************************/ 133*a159c266SJung-uk Kim 134*a159c266SJung-uk Kim ACPI_GENERIC_STATE * 135*a159c266SJung-uk Kim AcpiUtPopGenericState ( 136*a159c266SJung-uk Kim ACPI_GENERIC_STATE **ListHead) 137*a159c266SJung-uk Kim { 138*a159c266SJung-uk Kim ACPI_GENERIC_STATE *State; 139*a159c266SJung-uk Kim 140*a159c266SJung-uk Kim 141*a159c266SJung-uk Kim ACPI_FUNCTION_TRACE (UtPopGenericState); 142*a159c266SJung-uk Kim 143*a159c266SJung-uk Kim 144*a159c266SJung-uk Kim /* Remove the state object at the head of the list (stack) */ 145*a159c266SJung-uk Kim 146*a159c266SJung-uk Kim State = *ListHead; 147*a159c266SJung-uk Kim if (State) 148*a159c266SJung-uk Kim { 149*a159c266SJung-uk Kim /* Update the list head */ 150*a159c266SJung-uk Kim 151*a159c266SJung-uk Kim *ListHead = State->Common.Next; 152*a159c266SJung-uk Kim } 153*a159c266SJung-uk Kim 154*a159c266SJung-uk Kim return_PTR (State); 155*a159c266SJung-uk Kim } 156*a159c266SJung-uk Kim 157*a159c266SJung-uk Kim 158*a159c266SJung-uk Kim /******************************************************************************* 159*a159c266SJung-uk Kim * 160*a159c266SJung-uk Kim * FUNCTION: AcpiUtCreateGenericState 161*a159c266SJung-uk Kim * 162*a159c266SJung-uk Kim * PARAMETERS: None 163*a159c266SJung-uk Kim * 164*a159c266SJung-uk Kim * RETURN: The new state object. NULL on failure. 165*a159c266SJung-uk Kim * 166*a159c266SJung-uk Kim * DESCRIPTION: Create a generic state object. Attempt to obtain one from 167*a159c266SJung-uk Kim * the global state cache; If none available, create a new one. 168*a159c266SJung-uk Kim * 169*a159c266SJung-uk Kim ******************************************************************************/ 170*a159c266SJung-uk Kim 171*a159c266SJung-uk Kim ACPI_GENERIC_STATE * 172*a159c266SJung-uk Kim AcpiUtCreateGenericState ( 173*a159c266SJung-uk Kim void) 174*a159c266SJung-uk Kim { 175*a159c266SJung-uk Kim ACPI_GENERIC_STATE *State; 176*a159c266SJung-uk Kim 177*a159c266SJung-uk Kim 178*a159c266SJung-uk Kim ACPI_FUNCTION_ENTRY (); 179*a159c266SJung-uk Kim 180*a159c266SJung-uk Kim 181*a159c266SJung-uk Kim State = AcpiOsAcquireObject (AcpiGbl_StateCache); 182*a159c266SJung-uk Kim if (State) 183*a159c266SJung-uk Kim { 184*a159c266SJung-uk Kim /* Initialize */ 185*a159c266SJung-uk Kim State->Common.DescriptorType = ACPI_DESC_TYPE_STATE; 186*a159c266SJung-uk Kim } 187*a159c266SJung-uk Kim 188*a159c266SJung-uk Kim return (State); 189*a159c266SJung-uk Kim } 190*a159c266SJung-uk Kim 191*a159c266SJung-uk Kim 192*a159c266SJung-uk Kim /******************************************************************************* 193*a159c266SJung-uk Kim * 194*a159c266SJung-uk Kim * FUNCTION: AcpiUtCreateThreadState 195*a159c266SJung-uk Kim * 196*a159c266SJung-uk Kim * PARAMETERS: None 197*a159c266SJung-uk Kim * 198*a159c266SJung-uk Kim * RETURN: New Thread State. NULL on failure 199*a159c266SJung-uk Kim * 200*a159c266SJung-uk Kim * DESCRIPTION: Create a "Thread State" - a flavor of the generic state used 201*a159c266SJung-uk Kim * to track per-thread info during method execution 202*a159c266SJung-uk Kim * 203*a159c266SJung-uk Kim ******************************************************************************/ 204*a159c266SJung-uk Kim 205*a159c266SJung-uk Kim ACPI_THREAD_STATE * 206*a159c266SJung-uk Kim AcpiUtCreateThreadState ( 207*a159c266SJung-uk Kim void) 208*a159c266SJung-uk Kim { 209*a159c266SJung-uk Kim ACPI_GENERIC_STATE *State; 210*a159c266SJung-uk Kim 211*a159c266SJung-uk Kim 212*a159c266SJung-uk Kim ACPI_FUNCTION_TRACE (UtCreateThreadState); 213*a159c266SJung-uk Kim 214*a159c266SJung-uk Kim 215*a159c266SJung-uk Kim /* Create the generic state object */ 216*a159c266SJung-uk Kim 217*a159c266SJung-uk Kim State = AcpiUtCreateGenericState (); 218*a159c266SJung-uk Kim if (!State) 219*a159c266SJung-uk Kim { 220*a159c266SJung-uk Kim return_PTR (NULL); 221*a159c266SJung-uk Kim } 222*a159c266SJung-uk Kim 223*a159c266SJung-uk Kim /* Init fields specific to the update struct */ 224*a159c266SJung-uk Kim 225*a159c266SJung-uk Kim State->Common.DescriptorType = ACPI_DESC_TYPE_STATE_THREAD; 226*a159c266SJung-uk Kim State->Thread.ThreadId = AcpiOsGetThreadId (); 227*a159c266SJung-uk Kim 228*a159c266SJung-uk Kim /* Check for invalid thread ID - zero is very bad, it will break things */ 229*a159c266SJung-uk Kim 230*a159c266SJung-uk Kim if (!State->Thread.ThreadId) 231*a159c266SJung-uk Kim { 232*a159c266SJung-uk Kim ACPI_ERROR ((AE_INFO, "Invalid zero ID from AcpiOsGetThreadId")); 233*a159c266SJung-uk Kim State->Thread.ThreadId = (ACPI_THREAD_ID) 1; 234*a159c266SJung-uk Kim } 235*a159c266SJung-uk Kim 236*a159c266SJung-uk Kim return_PTR ((ACPI_THREAD_STATE *) State); 237*a159c266SJung-uk Kim } 238*a159c266SJung-uk Kim 239*a159c266SJung-uk Kim 240*a159c266SJung-uk Kim /******************************************************************************* 241*a159c266SJung-uk Kim * 242*a159c266SJung-uk Kim * FUNCTION: AcpiUtCreateUpdateState 243*a159c266SJung-uk Kim * 244*a159c266SJung-uk Kim * PARAMETERS: Object - Initial Object to be installed in the state 245*a159c266SJung-uk Kim * Action - Update action to be performed 246*a159c266SJung-uk Kim * 247*a159c266SJung-uk Kim * RETURN: New state object, null on failure 248*a159c266SJung-uk Kim * 249*a159c266SJung-uk Kim * DESCRIPTION: Create an "Update State" - a flavor of the generic state used 250*a159c266SJung-uk Kim * to update reference counts and delete complex objects such 251*a159c266SJung-uk Kim * as packages. 252*a159c266SJung-uk Kim * 253*a159c266SJung-uk Kim ******************************************************************************/ 254*a159c266SJung-uk Kim 255*a159c266SJung-uk Kim ACPI_GENERIC_STATE * 256*a159c266SJung-uk Kim AcpiUtCreateUpdateState ( 257*a159c266SJung-uk Kim ACPI_OPERAND_OBJECT *Object, 258*a159c266SJung-uk Kim UINT16 Action) 259*a159c266SJung-uk Kim { 260*a159c266SJung-uk Kim ACPI_GENERIC_STATE *State; 261*a159c266SJung-uk Kim 262*a159c266SJung-uk Kim 263*a159c266SJung-uk Kim ACPI_FUNCTION_TRACE_PTR (UtCreateUpdateState, Object); 264*a159c266SJung-uk Kim 265*a159c266SJung-uk Kim 266*a159c266SJung-uk Kim /* Create the generic state object */ 267*a159c266SJung-uk Kim 268*a159c266SJung-uk Kim State = AcpiUtCreateGenericState (); 269*a159c266SJung-uk Kim if (!State) 270*a159c266SJung-uk Kim { 271*a159c266SJung-uk Kim return_PTR (NULL); 272*a159c266SJung-uk Kim } 273*a159c266SJung-uk Kim 274*a159c266SJung-uk Kim /* Init fields specific to the update struct */ 275*a159c266SJung-uk Kim 276*a159c266SJung-uk Kim State->Common.DescriptorType = ACPI_DESC_TYPE_STATE_UPDATE; 277*a159c266SJung-uk Kim State->Update.Object = Object; 278*a159c266SJung-uk Kim State->Update.Value = Action; 279*a159c266SJung-uk Kim 280*a159c266SJung-uk Kim return_PTR (State); 281*a159c266SJung-uk Kim } 282*a159c266SJung-uk Kim 283*a159c266SJung-uk Kim 284*a159c266SJung-uk Kim /******************************************************************************* 285*a159c266SJung-uk Kim * 286*a159c266SJung-uk Kim * FUNCTION: AcpiUtCreatePkgState 287*a159c266SJung-uk Kim * 288*a159c266SJung-uk Kim * PARAMETERS: Object - Initial Object to be installed in the state 289*a159c266SJung-uk Kim * Action - Update action to be performed 290*a159c266SJung-uk Kim * 291*a159c266SJung-uk Kim * RETURN: New state object, null on failure 292*a159c266SJung-uk Kim * 293*a159c266SJung-uk Kim * DESCRIPTION: Create a "Package State" 294*a159c266SJung-uk Kim * 295*a159c266SJung-uk Kim ******************************************************************************/ 296*a159c266SJung-uk Kim 297*a159c266SJung-uk Kim ACPI_GENERIC_STATE * 298*a159c266SJung-uk Kim AcpiUtCreatePkgState ( 299*a159c266SJung-uk Kim void *InternalObject, 300*a159c266SJung-uk Kim void *ExternalObject, 301*a159c266SJung-uk Kim UINT16 Index) 302*a159c266SJung-uk Kim { 303*a159c266SJung-uk Kim ACPI_GENERIC_STATE *State; 304*a159c266SJung-uk Kim 305*a159c266SJung-uk Kim 306*a159c266SJung-uk Kim ACPI_FUNCTION_TRACE_PTR (UtCreatePkgState, InternalObject); 307*a159c266SJung-uk Kim 308*a159c266SJung-uk Kim 309*a159c266SJung-uk Kim /* Create the generic state object */ 310*a159c266SJung-uk Kim 311*a159c266SJung-uk Kim State = AcpiUtCreateGenericState (); 312*a159c266SJung-uk Kim if (!State) 313*a159c266SJung-uk Kim { 314*a159c266SJung-uk Kim return_PTR (NULL); 315*a159c266SJung-uk Kim } 316*a159c266SJung-uk Kim 317*a159c266SJung-uk Kim /* Init fields specific to the update struct */ 318*a159c266SJung-uk Kim 319*a159c266SJung-uk Kim State->Common.DescriptorType = ACPI_DESC_TYPE_STATE_PACKAGE; 320*a159c266SJung-uk Kim State->Pkg.SourceObject = (ACPI_OPERAND_OBJECT *) InternalObject; 321*a159c266SJung-uk Kim State->Pkg.DestObject = ExternalObject; 322*a159c266SJung-uk Kim State->Pkg.Index= Index; 323*a159c266SJung-uk Kim State->Pkg.NumPackages = 1; 324*a159c266SJung-uk Kim 325*a159c266SJung-uk Kim return_PTR (State); 326*a159c266SJung-uk Kim } 327*a159c266SJung-uk Kim 328*a159c266SJung-uk Kim 329*a159c266SJung-uk Kim /******************************************************************************* 330*a159c266SJung-uk Kim * 331*a159c266SJung-uk Kim * FUNCTION: AcpiUtCreateControlState 332*a159c266SJung-uk Kim * 333*a159c266SJung-uk Kim * PARAMETERS: None 334*a159c266SJung-uk Kim * 335*a159c266SJung-uk Kim * RETURN: New state object, null on failure 336*a159c266SJung-uk Kim * 337*a159c266SJung-uk Kim * DESCRIPTION: Create a "Control State" - a flavor of the generic state used 338*a159c266SJung-uk Kim * to support nested IF/WHILE constructs in the AML. 339*a159c266SJung-uk Kim * 340*a159c266SJung-uk Kim ******************************************************************************/ 341*a159c266SJung-uk Kim 342*a159c266SJung-uk Kim ACPI_GENERIC_STATE * 343*a159c266SJung-uk Kim AcpiUtCreateControlState ( 344*a159c266SJung-uk Kim void) 345*a159c266SJung-uk Kim { 346*a159c266SJung-uk Kim ACPI_GENERIC_STATE *State; 347*a159c266SJung-uk Kim 348*a159c266SJung-uk Kim 349*a159c266SJung-uk Kim ACPI_FUNCTION_TRACE (UtCreateControlState); 350*a159c266SJung-uk Kim 351*a159c266SJung-uk Kim 352*a159c266SJung-uk Kim /* Create the generic state object */ 353*a159c266SJung-uk Kim 354*a159c266SJung-uk Kim State = AcpiUtCreateGenericState (); 355*a159c266SJung-uk Kim if (!State) 356*a159c266SJung-uk Kim { 357*a159c266SJung-uk Kim return_PTR (NULL); 358*a159c266SJung-uk Kim } 359*a159c266SJung-uk Kim 360*a159c266SJung-uk Kim /* Init fields specific to the control struct */ 361*a159c266SJung-uk Kim 362*a159c266SJung-uk Kim State->Common.DescriptorType = ACPI_DESC_TYPE_STATE_CONTROL; 363*a159c266SJung-uk Kim State->Common.State = ACPI_CONTROL_CONDITIONAL_EXECUTING; 364*a159c266SJung-uk Kim 365*a159c266SJung-uk Kim return_PTR (State); 366*a159c266SJung-uk Kim } 367*a159c266SJung-uk Kim 368*a159c266SJung-uk Kim 369*a159c266SJung-uk Kim /******************************************************************************* 370*a159c266SJung-uk Kim * 371*a159c266SJung-uk Kim * FUNCTION: AcpiUtDeleteGenericState 372*a159c266SJung-uk Kim * 373*a159c266SJung-uk Kim * PARAMETERS: State - The state object to be deleted 374*a159c266SJung-uk Kim * 375*a159c266SJung-uk Kim * RETURN: None 376*a159c266SJung-uk Kim * 377*a159c266SJung-uk Kim * DESCRIPTION: Release a state object to the state cache. NULL state objects 378*a159c266SJung-uk Kim * are ignored. 379*a159c266SJung-uk Kim * 380*a159c266SJung-uk Kim ******************************************************************************/ 381*a159c266SJung-uk Kim 382*a159c266SJung-uk Kim void 383*a159c266SJung-uk Kim AcpiUtDeleteGenericState ( 384*a159c266SJung-uk Kim ACPI_GENERIC_STATE *State) 385*a159c266SJung-uk Kim { 386*a159c266SJung-uk Kim ACPI_FUNCTION_TRACE (UtDeleteGenericState); 387*a159c266SJung-uk Kim 388*a159c266SJung-uk Kim 389*a159c266SJung-uk Kim /* Ignore null state */ 390*a159c266SJung-uk Kim 391*a159c266SJung-uk Kim if (State) 392*a159c266SJung-uk Kim { 393*a159c266SJung-uk Kim (void) AcpiOsReleaseObject (AcpiGbl_StateCache, State); 394*a159c266SJung-uk Kim } 395*a159c266SJung-uk Kim return_VOID; 396*a159c266SJung-uk Kim } 397*a159c266SJung-uk Kim 398*a159c266SJung-uk Kim 399