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