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