1151937Sjkim/******************************************************************************* 2151937Sjkim * 3151937Sjkim * Module Name: utstate - state object support procedures 4151937Sjkim * 5151937Sjkim ******************************************************************************/ 6151937Sjkim 7217365Sjkim/* 8217365Sjkim * Copyright (C) 2000 - 2011, Intel Corp. 9151937Sjkim * All rights reserved. 10151937Sjkim * 11217365Sjkim * Redistribution and use in source and binary forms, with or without 12217365Sjkim * modification, are permitted provided that the following conditions 13217365Sjkim * are met: 14217365Sjkim * 1. Redistributions of source code must retain the above copyright 15217365Sjkim * notice, this list of conditions, and the following disclaimer, 16217365Sjkim * without modification. 17217365Sjkim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18217365Sjkim * substantially similar to the "NO WARRANTY" disclaimer below 19217365Sjkim * ("Disclaimer") and any redistribution must be conditioned upon 20217365Sjkim * including a substantially similar Disclaimer requirement for further 21217365Sjkim * binary redistribution. 22217365Sjkim * 3. Neither the names of the above-listed copyright holders nor the names 23217365Sjkim * of any contributors may be used to endorse or promote products derived 24217365Sjkim * from this software without specific prior written permission. 25151937Sjkim * 26217365Sjkim * Alternatively, this software may be distributed under the terms of the 27217365Sjkim * GNU General Public License ("GPL") version 2 as published by the Free 28217365Sjkim * Software Foundation. 29151937Sjkim * 30217365Sjkim * NO WARRANTY 31217365Sjkim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32217365Sjkim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33217365Sjkim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34217365Sjkim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35217365Sjkim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36217365Sjkim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37217365Sjkim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38217365Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39217365Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40217365Sjkim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41217365Sjkim * POSSIBILITY OF SUCH DAMAGES. 42217365Sjkim */ 43151937Sjkim 44151937Sjkim 45151937Sjkim#define __UTSTATE_C__ 46151937Sjkim 47193341Sjkim#include <contrib/dev/acpica/include/acpi.h> 48193341Sjkim#include <contrib/dev/acpica/include/accommon.h> 49151937Sjkim 50151937Sjkim#define _COMPONENT ACPI_UTILITIES 51151937Sjkim ACPI_MODULE_NAME ("utstate") 52151937Sjkim 53151937Sjkim 54151937Sjkim/******************************************************************************* 55151937Sjkim * 56151937Sjkim * FUNCTION: AcpiUtCreatePkgStateAndPush 57151937Sjkim * 58151937Sjkim * PARAMETERS: Object - Object to be added to the new state 59151937Sjkim * Action - Increment/Decrement 60151937Sjkim * StateList - List the state will be added to 61151937Sjkim * 62151937Sjkim * RETURN: Status 63151937Sjkim * 64151937Sjkim * DESCRIPTION: Create a new state and push it 65151937Sjkim * 66151937Sjkim ******************************************************************************/ 67151937Sjkim 68151937SjkimACPI_STATUS 69151937SjkimAcpiUtCreatePkgStateAndPush ( 70151937Sjkim void *InternalObject, 71151937Sjkim void *ExternalObject, 72151937Sjkim UINT16 Index, 73151937Sjkim ACPI_GENERIC_STATE **StateList) 74151937Sjkim{ 75151937Sjkim ACPI_GENERIC_STATE *State; 76151937Sjkim 77151937Sjkim 78151937Sjkim ACPI_FUNCTION_ENTRY (); 79151937Sjkim 80151937Sjkim 81151937Sjkim State = AcpiUtCreatePkgState (InternalObject, ExternalObject, Index); 82151937Sjkim if (!State) 83151937Sjkim { 84151937Sjkim return (AE_NO_MEMORY); 85151937Sjkim } 86151937Sjkim 87151937Sjkim AcpiUtPushGenericState (StateList, State); 88151937Sjkim return (AE_OK); 89151937Sjkim} 90151937Sjkim 91151937Sjkim 92151937Sjkim/******************************************************************************* 93151937Sjkim * 94151937Sjkim * FUNCTION: AcpiUtPushGenericState 95151937Sjkim * 96151937Sjkim * PARAMETERS: ListHead - Head of the state stack 97151937Sjkim * State - State object to push 98151937Sjkim * 99151937Sjkim * RETURN: None 100151937Sjkim * 101151937Sjkim * DESCRIPTION: Push a state object onto a state stack 102151937Sjkim * 103151937Sjkim ******************************************************************************/ 104151937Sjkim 105151937Sjkimvoid 106151937SjkimAcpiUtPushGenericState ( 107151937Sjkim ACPI_GENERIC_STATE **ListHead, 108151937Sjkim ACPI_GENERIC_STATE *State) 109151937Sjkim{ 110167802Sjkim ACPI_FUNCTION_TRACE (UtPushGenericState); 111151937Sjkim 112151937Sjkim 113151937Sjkim /* Push the state object onto the front of the list (stack) */ 114151937Sjkim 115151937Sjkim State->Common.Next = *ListHead; 116151937Sjkim *ListHead = State; 117151937Sjkim 118151937Sjkim return_VOID; 119151937Sjkim} 120151937Sjkim 121151937Sjkim 122151937Sjkim/******************************************************************************* 123151937Sjkim * 124151937Sjkim * FUNCTION: AcpiUtPopGenericState 125151937Sjkim * 126151937Sjkim * PARAMETERS: ListHead - Head of the state stack 127151937Sjkim * 128151937Sjkim * RETURN: The popped state object 129151937Sjkim * 130151937Sjkim * DESCRIPTION: Pop a state object from a state stack 131151937Sjkim * 132151937Sjkim ******************************************************************************/ 133151937Sjkim 134151937SjkimACPI_GENERIC_STATE * 135151937SjkimAcpiUtPopGenericState ( 136151937Sjkim ACPI_GENERIC_STATE **ListHead) 137151937Sjkim{ 138151937Sjkim ACPI_GENERIC_STATE *State; 139151937Sjkim 140151937Sjkim 141167802Sjkim ACPI_FUNCTION_TRACE (UtPopGenericState); 142151937Sjkim 143151937Sjkim 144151937Sjkim /* Remove the state object at the head of the list (stack) */ 145151937Sjkim 146151937Sjkim State = *ListHead; 147151937Sjkim if (State) 148151937Sjkim { 149151937Sjkim /* Update the list head */ 150151937Sjkim 151151937Sjkim *ListHead = State->Common.Next; 152151937Sjkim } 153151937Sjkim 154151937Sjkim return_PTR (State); 155151937Sjkim} 156151937Sjkim 157151937Sjkim 158151937Sjkim/******************************************************************************* 159151937Sjkim * 160151937Sjkim * FUNCTION: AcpiUtCreateGenericState 161151937Sjkim * 162151937Sjkim * PARAMETERS: None 163151937Sjkim * 164151937Sjkim * RETURN: The new state object. NULL on failure. 165151937Sjkim * 166151937Sjkim * DESCRIPTION: Create a generic state object. Attempt to obtain one from 167151937Sjkim * the global state cache; If none available, create a new one. 168151937Sjkim * 169151937Sjkim ******************************************************************************/ 170151937Sjkim 171151937SjkimACPI_GENERIC_STATE * 172151937SjkimAcpiUtCreateGenericState ( 173151937Sjkim void) 174151937Sjkim{ 175151937Sjkim ACPI_GENERIC_STATE *State; 176151937Sjkim 177151937Sjkim 178151937Sjkim ACPI_FUNCTION_ENTRY (); 179151937Sjkim 180151937Sjkim 181151937Sjkim State = AcpiOsAcquireObject (AcpiGbl_StateCache); 182151937Sjkim if (State) 183151937Sjkim { 184151937Sjkim /* Initialize */ 185167802Sjkim State->Common.DescriptorType = ACPI_DESC_TYPE_STATE; 186151937Sjkim } 187151937Sjkim 188151937Sjkim return (State); 189151937Sjkim} 190151937Sjkim 191151937Sjkim 192151937Sjkim/******************************************************************************* 193151937Sjkim * 194151937Sjkim * FUNCTION: AcpiUtCreateThreadState 195151937Sjkim * 196151937Sjkim * PARAMETERS: None 197151937Sjkim * 198151937Sjkim * RETURN: New Thread State. NULL on failure 199151937Sjkim * 200151937Sjkim * DESCRIPTION: Create a "Thread State" - a flavor of the generic state used 201151937Sjkim * to track per-thread info during method execution 202151937Sjkim * 203151937Sjkim ******************************************************************************/ 204151937Sjkim 205151937SjkimACPI_THREAD_STATE * 206151937SjkimAcpiUtCreateThreadState ( 207151937Sjkim void) 208151937Sjkim{ 209151937Sjkim ACPI_GENERIC_STATE *State; 210151937Sjkim 211151937Sjkim 212167802Sjkim ACPI_FUNCTION_TRACE (UtCreateThreadState); 213151937Sjkim 214151937Sjkim 215151937Sjkim /* Create the generic state object */ 216151937Sjkim 217151937Sjkim State = AcpiUtCreateGenericState (); 218151937Sjkim if (!State) 219151937Sjkim { 220151937Sjkim return_PTR (NULL); 221151937Sjkim } 222151937Sjkim 223151937Sjkim /* Init fields specific to the update struct */ 224151937Sjkim 225167802Sjkim State->Common.DescriptorType = ACPI_DESC_TYPE_STATE_THREAD; 226151937Sjkim State->Thread.ThreadId = AcpiOsGetThreadId (); 227151937Sjkim 228167802Sjkim /* Check for invalid thread ID - zero is very bad, it will break things */ 229167802Sjkim 230167802Sjkim if (!State->Thread.ThreadId) 231167802Sjkim { 232167802Sjkim ACPI_ERROR ((AE_INFO, "Invalid zero ID from AcpiOsGetThreadId")); 233193267Sjkim State->Thread.ThreadId = (ACPI_THREAD_ID) 1; 234167802Sjkim } 235167802Sjkim 236151937Sjkim return_PTR ((ACPI_THREAD_STATE *) State); 237151937Sjkim} 238151937Sjkim 239151937Sjkim 240151937Sjkim/******************************************************************************* 241151937Sjkim * 242151937Sjkim * FUNCTION: AcpiUtCreateUpdateState 243151937Sjkim * 244151937Sjkim * PARAMETERS: Object - Initial Object to be installed in the state 245151937Sjkim * Action - Update action to be performed 246151937Sjkim * 247151937Sjkim * RETURN: New state object, null on failure 248151937Sjkim * 249151937Sjkim * DESCRIPTION: Create an "Update State" - a flavor of the generic state used 250151937Sjkim * to update reference counts and delete complex objects such 251151937Sjkim * as packages. 252151937Sjkim * 253151937Sjkim ******************************************************************************/ 254151937Sjkim 255151937SjkimACPI_GENERIC_STATE * 256151937SjkimAcpiUtCreateUpdateState ( 257151937Sjkim ACPI_OPERAND_OBJECT *Object, 258151937Sjkim UINT16 Action) 259151937Sjkim{ 260151937Sjkim ACPI_GENERIC_STATE *State; 261151937Sjkim 262151937Sjkim 263167802Sjkim ACPI_FUNCTION_TRACE_PTR (UtCreateUpdateState, Object); 264151937Sjkim 265151937Sjkim 266151937Sjkim /* Create the generic state object */ 267151937Sjkim 268151937Sjkim State = AcpiUtCreateGenericState (); 269151937Sjkim if (!State) 270151937Sjkim { 271151937Sjkim return_PTR (NULL); 272151937Sjkim } 273151937Sjkim 274151937Sjkim /* Init fields specific to the update struct */ 275151937Sjkim 276167802Sjkim State->Common.DescriptorType = ACPI_DESC_TYPE_STATE_UPDATE; 277151937Sjkim State->Update.Object = Object; 278167802Sjkim State->Update.Value = Action; 279151937Sjkim 280151937Sjkim return_PTR (State); 281151937Sjkim} 282151937Sjkim 283151937Sjkim 284151937Sjkim/******************************************************************************* 285151937Sjkim * 286151937Sjkim * FUNCTION: AcpiUtCreatePkgState 287151937Sjkim * 288151937Sjkim * PARAMETERS: Object - Initial Object to be installed in the state 289151937Sjkim * Action - Update action to be performed 290151937Sjkim * 291151937Sjkim * RETURN: New state object, null on failure 292151937Sjkim * 293151937Sjkim * DESCRIPTION: Create a "Package State" 294151937Sjkim * 295151937Sjkim ******************************************************************************/ 296151937Sjkim 297151937SjkimACPI_GENERIC_STATE * 298151937SjkimAcpiUtCreatePkgState ( 299151937Sjkim void *InternalObject, 300151937Sjkim void *ExternalObject, 301151937Sjkim UINT16 Index) 302151937Sjkim{ 303151937Sjkim ACPI_GENERIC_STATE *State; 304151937Sjkim 305151937Sjkim 306167802Sjkim ACPI_FUNCTION_TRACE_PTR (UtCreatePkgState, InternalObject); 307151937Sjkim 308151937Sjkim 309151937Sjkim /* Create the generic state object */ 310151937Sjkim 311151937Sjkim State = AcpiUtCreateGenericState (); 312151937Sjkim if (!State) 313151937Sjkim { 314151937Sjkim return_PTR (NULL); 315151937Sjkim } 316151937Sjkim 317151937Sjkim /* Init fields specific to the update struct */ 318151937Sjkim 319167802Sjkim State->Common.DescriptorType = ACPI_DESC_TYPE_STATE_PACKAGE; 320151937Sjkim State->Pkg.SourceObject = (ACPI_OPERAND_OBJECT *) InternalObject; 321167802Sjkim State->Pkg.DestObject = ExternalObject; 322167802Sjkim State->Pkg.Index= Index; 323167802Sjkim State->Pkg.NumPackages = 1; 324151937Sjkim 325151937Sjkim return_PTR (State); 326151937Sjkim} 327151937Sjkim 328151937Sjkim 329151937Sjkim/******************************************************************************* 330151937Sjkim * 331151937Sjkim * FUNCTION: AcpiUtCreateControlState 332151937Sjkim * 333151937Sjkim * PARAMETERS: None 334151937Sjkim * 335151937Sjkim * RETURN: New state object, null on failure 336151937Sjkim * 337151937Sjkim * DESCRIPTION: Create a "Control State" - a flavor of the generic state used 338151937Sjkim * to support nested IF/WHILE constructs in the AML. 339151937Sjkim * 340151937Sjkim ******************************************************************************/ 341151937Sjkim 342151937SjkimACPI_GENERIC_STATE * 343151937SjkimAcpiUtCreateControlState ( 344151937Sjkim void) 345151937Sjkim{ 346151937Sjkim ACPI_GENERIC_STATE *State; 347151937Sjkim 348151937Sjkim 349167802Sjkim ACPI_FUNCTION_TRACE (UtCreateControlState); 350151937Sjkim 351151937Sjkim 352151937Sjkim /* Create the generic state object */ 353151937Sjkim 354151937Sjkim State = AcpiUtCreateGenericState (); 355151937Sjkim if (!State) 356151937Sjkim { 357151937Sjkim return_PTR (NULL); 358151937Sjkim } 359151937Sjkim 360151937Sjkim /* Init fields specific to the control struct */ 361151937Sjkim 362167802Sjkim State->Common.DescriptorType = ACPI_DESC_TYPE_STATE_CONTROL; 363167802Sjkim State->Common.State = ACPI_CONTROL_CONDITIONAL_EXECUTING; 364151937Sjkim 365151937Sjkim return_PTR (State); 366151937Sjkim} 367151937Sjkim 368151937Sjkim 369151937Sjkim/******************************************************************************* 370151937Sjkim * 371151937Sjkim * FUNCTION: AcpiUtDeleteGenericState 372151937Sjkim * 373151937Sjkim * PARAMETERS: State - The state object to be deleted 374151937Sjkim * 375151937Sjkim * RETURN: None 376151937Sjkim * 377167802Sjkim * DESCRIPTION: Release a state object to the state cache. NULL state objects 378167802Sjkim * are ignored. 379151937Sjkim * 380151937Sjkim ******************************************************************************/ 381151937Sjkim 382151937Sjkimvoid 383151937SjkimAcpiUtDeleteGenericState ( 384151937Sjkim ACPI_GENERIC_STATE *State) 385151937Sjkim{ 386167802Sjkim ACPI_FUNCTION_TRACE (UtDeleteGenericState); 387151937Sjkim 388151937Sjkim 389167802Sjkim /* Ignore null state */ 390167802Sjkim 391167802Sjkim if (State) 392167802Sjkim { 393167802Sjkim (void) AcpiOsReleaseObject (AcpiGbl_StateCache, State); 394167802Sjkim } 395151937Sjkim return_VOID; 396151937Sjkim} 397151937Sjkim 398151937Sjkim 399