1151937Sjkim/******************************************************************************* 2151937Sjkim * 3151937Sjkim * Module Name: utstate - state object support procedures 4151937Sjkim * 5151937Sjkim ******************************************************************************/ 6151937Sjkim 7217365Sjkim/* 8306536Sjkim * Copyright (C) 2000 - 2016, 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 44193341Sjkim#include <contrib/dev/acpica/include/acpi.h> 45193341Sjkim#include <contrib/dev/acpica/include/accommon.h> 46151937Sjkim 47151937Sjkim#define _COMPONENT ACPI_UTILITIES 48151937Sjkim ACPI_MODULE_NAME ("utstate") 49151937Sjkim 50151937Sjkim 51151937Sjkim/******************************************************************************* 52151937Sjkim * 53151937Sjkim * FUNCTION: AcpiUtPushGenericState 54151937Sjkim * 55151937Sjkim * PARAMETERS: ListHead - Head of the state stack 56151937Sjkim * State - State object to push 57151937Sjkim * 58151937Sjkim * RETURN: None 59151937Sjkim * 60151937Sjkim * DESCRIPTION: Push a state object onto a state stack 61151937Sjkim * 62151937Sjkim ******************************************************************************/ 63151937Sjkim 64151937Sjkimvoid 65151937SjkimAcpiUtPushGenericState ( 66151937Sjkim ACPI_GENERIC_STATE **ListHead, 67151937Sjkim ACPI_GENERIC_STATE *State) 68151937Sjkim{ 69243347Sjkim ACPI_FUNCTION_ENTRY (); 70151937Sjkim 71151937Sjkim 72151937Sjkim /* Push the state object onto the front of the list (stack) */ 73151937Sjkim 74151937Sjkim State->Common.Next = *ListHead; 75151937Sjkim *ListHead = State; 76243347Sjkim return; 77151937Sjkim} 78151937Sjkim 79151937Sjkim 80151937Sjkim/******************************************************************************* 81151937Sjkim * 82151937Sjkim * FUNCTION: AcpiUtPopGenericState 83151937Sjkim * 84151937Sjkim * PARAMETERS: ListHead - Head of the state stack 85151937Sjkim * 86151937Sjkim * RETURN: The popped state object 87151937Sjkim * 88151937Sjkim * DESCRIPTION: Pop a state object from a state stack 89151937Sjkim * 90151937Sjkim ******************************************************************************/ 91151937Sjkim 92151937SjkimACPI_GENERIC_STATE * 93151937SjkimAcpiUtPopGenericState ( 94151937Sjkim ACPI_GENERIC_STATE **ListHead) 95151937Sjkim{ 96151937Sjkim ACPI_GENERIC_STATE *State; 97151937Sjkim 98151937Sjkim 99243347Sjkim ACPI_FUNCTION_ENTRY (); 100151937Sjkim 101151937Sjkim 102151937Sjkim /* Remove the state object at the head of the list (stack) */ 103151937Sjkim 104151937Sjkim State = *ListHead; 105151937Sjkim if (State) 106151937Sjkim { 107151937Sjkim /* Update the list head */ 108151937Sjkim 109151937Sjkim *ListHead = State->Common.Next; 110151937Sjkim } 111151937Sjkim 112243347Sjkim return (State); 113151937Sjkim} 114151937Sjkim 115151937Sjkim 116151937Sjkim/******************************************************************************* 117151937Sjkim * 118151937Sjkim * FUNCTION: AcpiUtCreateGenericState 119151937Sjkim * 120151937Sjkim * PARAMETERS: None 121151937Sjkim * 122151937Sjkim * RETURN: The new state object. NULL on failure. 123151937Sjkim * 124241973Sjkim * DESCRIPTION: Create a generic state object. Attempt to obtain one from 125151937Sjkim * the global state cache; If none available, create a new one. 126151937Sjkim * 127151937Sjkim ******************************************************************************/ 128151937Sjkim 129151937SjkimACPI_GENERIC_STATE * 130151937SjkimAcpiUtCreateGenericState ( 131151937Sjkim void) 132151937Sjkim{ 133151937Sjkim ACPI_GENERIC_STATE *State; 134151937Sjkim 135151937Sjkim 136151937Sjkim ACPI_FUNCTION_ENTRY (); 137151937Sjkim 138151937Sjkim 139151937Sjkim State = AcpiOsAcquireObject (AcpiGbl_StateCache); 140151937Sjkim if (State) 141151937Sjkim { 142151937Sjkim /* Initialize */ 143167802Sjkim State->Common.DescriptorType = ACPI_DESC_TYPE_STATE; 144151937Sjkim } 145151937Sjkim 146151937Sjkim return (State); 147151937Sjkim} 148151937Sjkim 149151937Sjkim 150151937Sjkim/******************************************************************************* 151151937Sjkim * 152151937Sjkim * FUNCTION: AcpiUtCreateThreadState 153151937Sjkim * 154151937Sjkim * PARAMETERS: None 155151937Sjkim * 156151937Sjkim * RETURN: New Thread State. NULL on failure 157151937Sjkim * 158151937Sjkim * DESCRIPTION: Create a "Thread State" - a flavor of the generic state used 159151937Sjkim * to track per-thread info during method execution 160151937Sjkim * 161151937Sjkim ******************************************************************************/ 162151937Sjkim 163151937SjkimACPI_THREAD_STATE * 164151937SjkimAcpiUtCreateThreadState ( 165151937Sjkim void) 166151937Sjkim{ 167151937Sjkim ACPI_GENERIC_STATE *State; 168151937Sjkim 169151937Sjkim 170243347Sjkim ACPI_FUNCTION_ENTRY (); 171151937Sjkim 172151937Sjkim 173151937Sjkim /* Create the generic state object */ 174151937Sjkim 175151937Sjkim State = AcpiUtCreateGenericState (); 176151937Sjkim if (!State) 177151937Sjkim { 178243347Sjkim return (NULL); 179151937Sjkim } 180151937Sjkim 181151937Sjkim /* Init fields specific to the update struct */ 182151937Sjkim 183167802Sjkim State->Common.DescriptorType = ACPI_DESC_TYPE_STATE_THREAD; 184151937Sjkim State->Thread.ThreadId = AcpiOsGetThreadId (); 185151937Sjkim 186167802Sjkim /* Check for invalid thread ID - zero is very bad, it will break things */ 187167802Sjkim 188167802Sjkim if (!State->Thread.ThreadId) 189167802Sjkim { 190167802Sjkim ACPI_ERROR ((AE_INFO, "Invalid zero ID from AcpiOsGetThreadId")); 191193267Sjkim State->Thread.ThreadId = (ACPI_THREAD_ID) 1; 192167802Sjkim } 193167802Sjkim 194243347Sjkim return ((ACPI_THREAD_STATE *) State); 195151937Sjkim} 196151937Sjkim 197151937Sjkim 198151937Sjkim/******************************************************************************* 199151937Sjkim * 200151937Sjkim * FUNCTION: AcpiUtCreateUpdateState 201151937Sjkim * 202151937Sjkim * PARAMETERS: Object - Initial Object to be installed in the state 203151937Sjkim * Action - Update action to be performed 204151937Sjkim * 205151937Sjkim * RETURN: New state object, null on failure 206151937Sjkim * 207151937Sjkim * DESCRIPTION: Create an "Update State" - a flavor of the generic state used 208151937Sjkim * to update reference counts and delete complex objects such 209151937Sjkim * as packages. 210151937Sjkim * 211151937Sjkim ******************************************************************************/ 212151937Sjkim 213151937SjkimACPI_GENERIC_STATE * 214151937SjkimAcpiUtCreateUpdateState ( 215151937Sjkim ACPI_OPERAND_OBJECT *Object, 216151937Sjkim UINT16 Action) 217151937Sjkim{ 218151937Sjkim ACPI_GENERIC_STATE *State; 219151937Sjkim 220151937Sjkim 221243347Sjkim ACPI_FUNCTION_ENTRY (); 222151937Sjkim 223151937Sjkim 224151937Sjkim /* Create the generic state object */ 225151937Sjkim 226151937Sjkim State = AcpiUtCreateGenericState (); 227151937Sjkim if (!State) 228151937Sjkim { 229243347Sjkim return (NULL); 230151937Sjkim } 231151937Sjkim 232151937Sjkim /* Init fields specific to the update struct */ 233151937Sjkim 234167802Sjkim State->Common.DescriptorType = ACPI_DESC_TYPE_STATE_UPDATE; 235151937Sjkim State->Update.Object = Object; 236167802Sjkim State->Update.Value = Action; 237243347Sjkim return (State); 238151937Sjkim} 239151937Sjkim 240151937Sjkim 241151937Sjkim/******************************************************************************* 242151937Sjkim * 243151937Sjkim * FUNCTION: AcpiUtCreatePkgState 244151937Sjkim * 245151937Sjkim * PARAMETERS: Object - Initial Object to be installed in the state 246151937Sjkim * Action - Update action to be performed 247151937Sjkim * 248151937Sjkim * RETURN: New state object, null on failure 249151937Sjkim * 250151937Sjkim * DESCRIPTION: Create a "Package State" 251151937Sjkim * 252151937Sjkim ******************************************************************************/ 253151937Sjkim 254151937SjkimACPI_GENERIC_STATE * 255151937SjkimAcpiUtCreatePkgState ( 256151937Sjkim void *InternalObject, 257151937Sjkim void *ExternalObject, 258151937Sjkim UINT16 Index) 259151937Sjkim{ 260151937Sjkim ACPI_GENERIC_STATE *State; 261151937Sjkim 262151937Sjkim 263243347Sjkim ACPI_FUNCTION_ENTRY (); 264151937Sjkim 265151937Sjkim 266151937Sjkim /* Create the generic state object */ 267151937Sjkim 268151937Sjkim State = AcpiUtCreateGenericState (); 269151937Sjkim if (!State) 270151937Sjkim { 271243347Sjkim return (NULL); 272151937Sjkim } 273151937Sjkim 274151937Sjkim /* Init fields specific to the update struct */ 275151937Sjkim 276167802Sjkim State->Common.DescriptorType = ACPI_DESC_TYPE_STATE_PACKAGE; 277151937Sjkim State->Pkg.SourceObject = (ACPI_OPERAND_OBJECT *) InternalObject; 278167802Sjkim State->Pkg.DestObject = ExternalObject; 279167802Sjkim State->Pkg.Index= Index; 280167802Sjkim State->Pkg.NumPackages = 1; 281306536Sjkim 282243347Sjkim return (State); 283151937Sjkim} 284151937Sjkim 285151937Sjkim 286151937Sjkim/******************************************************************************* 287151937Sjkim * 288151937Sjkim * FUNCTION: AcpiUtCreateControlState 289151937Sjkim * 290151937Sjkim * PARAMETERS: None 291151937Sjkim * 292151937Sjkim * RETURN: New state object, null on failure 293151937Sjkim * 294151937Sjkim * DESCRIPTION: Create a "Control State" - a flavor of the generic state used 295151937Sjkim * to support nested IF/WHILE constructs in the AML. 296151937Sjkim * 297151937Sjkim ******************************************************************************/ 298151937Sjkim 299151937SjkimACPI_GENERIC_STATE * 300151937SjkimAcpiUtCreateControlState ( 301151937Sjkim void) 302151937Sjkim{ 303151937Sjkim ACPI_GENERIC_STATE *State; 304151937Sjkim 305151937Sjkim 306243347Sjkim ACPI_FUNCTION_ENTRY (); 307151937Sjkim 308151937Sjkim 309151937Sjkim /* Create the generic state object */ 310151937Sjkim 311151937Sjkim State = AcpiUtCreateGenericState (); 312151937Sjkim if (!State) 313151937Sjkim { 314243347Sjkim return (NULL); 315151937Sjkim } 316151937Sjkim 317151937Sjkim /* Init fields specific to the control struct */ 318151937Sjkim 319167802Sjkim State->Common.DescriptorType = ACPI_DESC_TYPE_STATE_CONTROL; 320167802Sjkim State->Common.State = ACPI_CONTROL_CONDITIONAL_EXECUTING; 321306536Sjkim 322243347Sjkim return (State); 323151937Sjkim} 324151937Sjkim 325151937Sjkim 326151937Sjkim/******************************************************************************* 327151937Sjkim * 328151937Sjkim * FUNCTION: AcpiUtDeleteGenericState 329151937Sjkim * 330151937Sjkim * PARAMETERS: State - The state object to be deleted 331151937Sjkim * 332151937Sjkim * RETURN: None 333151937Sjkim * 334167802Sjkim * DESCRIPTION: Release a state object to the state cache. NULL state objects 335167802Sjkim * are ignored. 336151937Sjkim * 337151937Sjkim ******************************************************************************/ 338151937Sjkim 339151937Sjkimvoid 340151937SjkimAcpiUtDeleteGenericState ( 341151937Sjkim ACPI_GENERIC_STATE *State) 342151937Sjkim{ 343243347Sjkim ACPI_FUNCTION_ENTRY (); 344151937Sjkim 345151937Sjkim 346167802Sjkim /* Ignore null state */ 347167802Sjkim 348167802Sjkim if (State) 349167802Sjkim { 350167802Sjkim (void) AcpiOsReleaseObject (AcpiGbl_StateCache, State); 351167802Sjkim } 352306536Sjkim 353243347Sjkim return; 354151937Sjkim} 355