xref: /minix3/minix/drivers/power/acpi/utilities/utxfmutex.c (revision 29492bb71c7148a089a5afafa0c99409161218df)
1*29492bb7SDavid van Moolenbroek /*******************************************************************************
2*29492bb7SDavid van Moolenbroek  *
3*29492bb7SDavid van Moolenbroek  * Module Name: utxfmutex - external AML mutex access functions
4*29492bb7SDavid van Moolenbroek  *
5*29492bb7SDavid van Moolenbroek  ******************************************************************************/
6*29492bb7SDavid van Moolenbroek 
7*29492bb7SDavid van Moolenbroek /*
8*29492bb7SDavid van Moolenbroek  * Copyright (C) 2000 - 2014, Intel Corp.
9*29492bb7SDavid van Moolenbroek  * All rights reserved.
10*29492bb7SDavid van Moolenbroek  *
11*29492bb7SDavid van Moolenbroek  * Redistribution and use in source and binary forms, with or without
12*29492bb7SDavid van Moolenbroek  * modification, are permitted provided that the following conditions
13*29492bb7SDavid van Moolenbroek  * are met:
14*29492bb7SDavid van Moolenbroek  * 1. Redistributions of source code must retain the above copyright
15*29492bb7SDavid van Moolenbroek  *    notice, this list of conditions, and the following disclaimer,
16*29492bb7SDavid van Moolenbroek  *    without modification.
17*29492bb7SDavid van Moolenbroek  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18*29492bb7SDavid van Moolenbroek  *    substantially similar to the "NO WARRANTY" disclaimer below
19*29492bb7SDavid van Moolenbroek  *    ("Disclaimer") and any redistribution must be conditioned upon
20*29492bb7SDavid van Moolenbroek  *    including a substantially similar Disclaimer requirement for further
21*29492bb7SDavid van Moolenbroek  *    binary redistribution.
22*29492bb7SDavid van Moolenbroek  * 3. Neither the names of the above-listed copyright holders nor the names
23*29492bb7SDavid van Moolenbroek  *    of any contributors may be used to endorse or promote products derived
24*29492bb7SDavid van Moolenbroek  *    from this software without specific prior written permission.
25*29492bb7SDavid van Moolenbroek  *
26*29492bb7SDavid van Moolenbroek  * Alternatively, this software may be distributed under the terms of the
27*29492bb7SDavid van Moolenbroek  * GNU General Public License ("GPL") version 2 as published by the Free
28*29492bb7SDavid van Moolenbroek  * Software Foundation.
29*29492bb7SDavid van Moolenbroek  *
30*29492bb7SDavid van Moolenbroek  * NO WARRANTY
31*29492bb7SDavid van Moolenbroek  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32*29492bb7SDavid van Moolenbroek  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33*29492bb7SDavid van Moolenbroek  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34*29492bb7SDavid van Moolenbroek  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35*29492bb7SDavid van Moolenbroek  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36*29492bb7SDavid van Moolenbroek  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37*29492bb7SDavid van Moolenbroek  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38*29492bb7SDavid van Moolenbroek  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39*29492bb7SDavid van Moolenbroek  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40*29492bb7SDavid van Moolenbroek  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41*29492bb7SDavid van Moolenbroek  * POSSIBILITY OF SUCH DAMAGES.
42*29492bb7SDavid van Moolenbroek  */
43*29492bb7SDavid van Moolenbroek 
44*29492bb7SDavid van Moolenbroek #include "acpi.h"
45*29492bb7SDavid van Moolenbroek #include "accommon.h"
46*29492bb7SDavid van Moolenbroek #include "acnamesp.h"
47*29492bb7SDavid van Moolenbroek 
48*29492bb7SDavid van Moolenbroek 
49*29492bb7SDavid van Moolenbroek #define _COMPONENT          ACPI_UTILITIES
50*29492bb7SDavid van Moolenbroek         ACPI_MODULE_NAME    ("utxfmutex")
51*29492bb7SDavid van Moolenbroek 
52*29492bb7SDavid van Moolenbroek 
53*29492bb7SDavid van Moolenbroek /* Local prototypes */
54*29492bb7SDavid van Moolenbroek 
55*29492bb7SDavid van Moolenbroek static ACPI_STATUS
56*29492bb7SDavid van Moolenbroek AcpiUtGetMutexObject (
57*29492bb7SDavid van Moolenbroek     ACPI_HANDLE             Handle,
58*29492bb7SDavid van Moolenbroek     ACPI_STRING             Pathname,
59*29492bb7SDavid van Moolenbroek     ACPI_OPERAND_OBJECT     **RetObj);
60*29492bb7SDavid van Moolenbroek 
61*29492bb7SDavid van Moolenbroek 
62*29492bb7SDavid van Moolenbroek /*******************************************************************************
63*29492bb7SDavid van Moolenbroek  *
64*29492bb7SDavid van Moolenbroek  * FUNCTION:    AcpiUtGetMutexObject
65*29492bb7SDavid van Moolenbroek  *
66*29492bb7SDavid van Moolenbroek  * PARAMETERS:  Handle              - Mutex or prefix handle (optional)
67*29492bb7SDavid van Moolenbroek  *              Pathname            - Mutex pathname (optional)
68*29492bb7SDavid van Moolenbroek  *              RetObj              - Where the mutex object is returned
69*29492bb7SDavid van Moolenbroek  *
70*29492bb7SDavid van Moolenbroek  * RETURN:      Status
71*29492bb7SDavid van Moolenbroek  *
72*29492bb7SDavid van Moolenbroek  * DESCRIPTION: Get an AML mutex object. The mutex node is pointed to by
73*29492bb7SDavid van Moolenbroek  *              Handle:Pathname. Either Handle or Pathname can be NULL, but
74*29492bb7SDavid van Moolenbroek  *              not both.
75*29492bb7SDavid van Moolenbroek  *
76*29492bb7SDavid van Moolenbroek  ******************************************************************************/
77*29492bb7SDavid van Moolenbroek 
78*29492bb7SDavid van Moolenbroek static ACPI_STATUS
AcpiUtGetMutexObject(ACPI_HANDLE Handle,ACPI_STRING Pathname,ACPI_OPERAND_OBJECT ** RetObj)79*29492bb7SDavid van Moolenbroek AcpiUtGetMutexObject (
80*29492bb7SDavid van Moolenbroek     ACPI_HANDLE             Handle,
81*29492bb7SDavid van Moolenbroek     ACPI_STRING             Pathname,
82*29492bb7SDavid van Moolenbroek     ACPI_OPERAND_OBJECT     **RetObj)
83*29492bb7SDavid van Moolenbroek {
84*29492bb7SDavid van Moolenbroek     ACPI_NAMESPACE_NODE     *MutexNode;
85*29492bb7SDavid van Moolenbroek     ACPI_OPERAND_OBJECT     *MutexObj;
86*29492bb7SDavid van Moolenbroek     ACPI_STATUS             Status;
87*29492bb7SDavid van Moolenbroek 
88*29492bb7SDavid van Moolenbroek 
89*29492bb7SDavid van Moolenbroek     /* Parameter validation */
90*29492bb7SDavid van Moolenbroek 
91*29492bb7SDavid van Moolenbroek     if (!RetObj || (!Handle && !Pathname))
92*29492bb7SDavid van Moolenbroek     {
93*29492bb7SDavid van Moolenbroek         return (AE_BAD_PARAMETER);
94*29492bb7SDavid van Moolenbroek     }
95*29492bb7SDavid van Moolenbroek 
96*29492bb7SDavid van Moolenbroek     /* Get a the namespace node for the mutex */
97*29492bb7SDavid van Moolenbroek 
98*29492bb7SDavid van Moolenbroek     MutexNode = Handle;
99*29492bb7SDavid van Moolenbroek     if (Pathname != NULL)
100*29492bb7SDavid van Moolenbroek     {
101*29492bb7SDavid van Moolenbroek         Status = AcpiGetHandle (Handle, Pathname,
102*29492bb7SDavid van Moolenbroek             ACPI_CAST_PTR (ACPI_HANDLE, &MutexNode));
103*29492bb7SDavid van Moolenbroek         if (ACPI_FAILURE (Status))
104*29492bb7SDavid van Moolenbroek         {
105*29492bb7SDavid van Moolenbroek             return (Status);
106*29492bb7SDavid van Moolenbroek         }
107*29492bb7SDavid van Moolenbroek     }
108*29492bb7SDavid van Moolenbroek 
109*29492bb7SDavid van Moolenbroek     /* Ensure that we actually have a Mutex object */
110*29492bb7SDavid van Moolenbroek 
111*29492bb7SDavid van Moolenbroek     if (!MutexNode ||
112*29492bb7SDavid van Moolenbroek         (MutexNode->Type != ACPI_TYPE_MUTEX))
113*29492bb7SDavid van Moolenbroek     {
114*29492bb7SDavid van Moolenbroek         return (AE_TYPE);
115*29492bb7SDavid van Moolenbroek     }
116*29492bb7SDavid van Moolenbroek 
117*29492bb7SDavid van Moolenbroek     /* Get the low-level mutex object */
118*29492bb7SDavid van Moolenbroek 
119*29492bb7SDavid van Moolenbroek     MutexObj = AcpiNsGetAttachedObject (MutexNode);
120*29492bb7SDavid van Moolenbroek     if (!MutexObj)
121*29492bb7SDavid van Moolenbroek     {
122*29492bb7SDavid van Moolenbroek         return (AE_NULL_OBJECT);
123*29492bb7SDavid van Moolenbroek     }
124*29492bb7SDavid van Moolenbroek 
125*29492bb7SDavid van Moolenbroek     *RetObj = MutexObj;
126*29492bb7SDavid van Moolenbroek     return (AE_OK);
127*29492bb7SDavid van Moolenbroek }
128*29492bb7SDavid van Moolenbroek 
129*29492bb7SDavid van Moolenbroek 
130*29492bb7SDavid van Moolenbroek /*******************************************************************************
131*29492bb7SDavid van Moolenbroek  *
132*29492bb7SDavid van Moolenbroek  * FUNCTION:    AcpiAcquireMutex
133*29492bb7SDavid van Moolenbroek  *
134*29492bb7SDavid van Moolenbroek  * PARAMETERS:  Handle              - Mutex or prefix handle (optional)
135*29492bb7SDavid van Moolenbroek  *              Pathname            - Mutex pathname (optional)
136*29492bb7SDavid van Moolenbroek  *              Timeout             - Max time to wait for the lock (millisec)
137*29492bb7SDavid van Moolenbroek  *
138*29492bb7SDavid van Moolenbroek  * RETURN:      Status
139*29492bb7SDavid van Moolenbroek  *
140*29492bb7SDavid van Moolenbroek  * DESCRIPTION: Acquire an AML mutex. This is a device driver interface to
141*29492bb7SDavid van Moolenbroek  *              AML mutex objects, and allows for transaction locking between
142*29492bb7SDavid van Moolenbroek  *              drivers and AML code. The mutex node is pointed to by
143*29492bb7SDavid van Moolenbroek  *              Handle:Pathname. Either Handle or Pathname can be NULL, but
144*29492bb7SDavid van Moolenbroek  *              not both.
145*29492bb7SDavid van Moolenbroek  *
146*29492bb7SDavid van Moolenbroek  ******************************************************************************/
147*29492bb7SDavid van Moolenbroek 
148*29492bb7SDavid van Moolenbroek ACPI_STATUS
AcpiAcquireMutex(ACPI_HANDLE Handle,ACPI_STRING Pathname,UINT16 Timeout)149*29492bb7SDavid van Moolenbroek AcpiAcquireMutex (
150*29492bb7SDavid van Moolenbroek     ACPI_HANDLE             Handle,
151*29492bb7SDavid van Moolenbroek     ACPI_STRING             Pathname,
152*29492bb7SDavid van Moolenbroek     UINT16                  Timeout)
153*29492bb7SDavid van Moolenbroek {
154*29492bb7SDavid van Moolenbroek     ACPI_STATUS             Status;
155*29492bb7SDavid van Moolenbroek     ACPI_OPERAND_OBJECT     *MutexObj;
156*29492bb7SDavid van Moolenbroek 
157*29492bb7SDavid van Moolenbroek 
158*29492bb7SDavid van Moolenbroek     /* Get the low-level mutex associated with Handle:Pathname */
159*29492bb7SDavid van Moolenbroek 
160*29492bb7SDavid van Moolenbroek     Status = AcpiUtGetMutexObject (Handle, Pathname, &MutexObj);
161*29492bb7SDavid van Moolenbroek     if (ACPI_FAILURE (Status))
162*29492bb7SDavid van Moolenbroek     {
163*29492bb7SDavid van Moolenbroek         return (Status);
164*29492bb7SDavid van Moolenbroek     }
165*29492bb7SDavid van Moolenbroek 
166*29492bb7SDavid van Moolenbroek     /* Acquire the OS mutex */
167*29492bb7SDavid van Moolenbroek 
168*29492bb7SDavid van Moolenbroek     Status = AcpiOsAcquireMutex (MutexObj->Mutex.OsMutex, Timeout);
169*29492bb7SDavid van Moolenbroek     return (Status);
170*29492bb7SDavid van Moolenbroek }
171*29492bb7SDavid van Moolenbroek 
172*29492bb7SDavid van Moolenbroek 
173*29492bb7SDavid van Moolenbroek /*******************************************************************************
174*29492bb7SDavid van Moolenbroek  *
175*29492bb7SDavid van Moolenbroek  * FUNCTION:    AcpiReleaseMutex
176*29492bb7SDavid van Moolenbroek  *
177*29492bb7SDavid van Moolenbroek  * PARAMETERS:  Handle              - Mutex or prefix handle (optional)
178*29492bb7SDavid van Moolenbroek  *              Pathname            - Mutex pathname (optional)
179*29492bb7SDavid van Moolenbroek  *
180*29492bb7SDavid van Moolenbroek  * RETURN:      Status
181*29492bb7SDavid van Moolenbroek  *
182*29492bb7SDavid van Moolenbroek  * DESCRIPTION: Release an AML mutex. This is a device driver interface to
183*29492bb7SDavid van Moolenbroek  *              AML mutex objects, and allows for transaction locking between
184*29492bb7SDavid van Moolenbroek  *              drivers and AML code. The mutex node is pointed to by
185*29492bb7SDavid van Moolenbroek  *              Handle:Pathname. Either Handle or Pathname can be NULL, but
186*29492bb7SDavid van Moolenbroek  *              not both.
187*29492bb7SDavid van Moolenbroek  *
188*29492bb7SDavid van Moolenbroek  ******************************************************************************/
189*29492bb7SDavid van Moolenbroek 
190*29492bb7SDavid van Moolenbroek ACPI_STATUS
AcpiReleaseMutex(ACPI_HANDLE Handle,ACPI_STRING Pathname)191*29492bb7SDavid van Moolenbroek AcpiReleaseMutex (
192*29492bb7SDavid van Moolenbroek     ACPI_HANDLE             Handle,
193*29492bb7SDavid van Moolenbroek     ACPI_STRING             Pathname)
194*29492bb7SDavid van Moolenbroek {
195*29492bb7SDavid van Moolenbroek     ACPI_STATUS             Status;
196*29492bb7SDavid van Moolenbroek     ACPI_OPERAND_OBJECT     *MutexObj;
197*29492bb7SDavid van Moolenbroek 
198*29492bb7SDavid van Moolenbroek 
199*29492bb7SDavid van Moolenbroek     /* Get the low-level mutex associated with Handle:Pathname */
200*29492bb7SDavid van Moolenbroek 
201*29492bb7SDavid van Moolenbroek     Status = AcpiUtGetMutexObject (Handle, Pathname, &MutexObj);
202*29492bb7SDavid van Moolenbroek     if (ACPI_FAILURE (Status))
203*29492bb7SDavid van Moolenbroek     {
204*29492bb7SDavid van Moolenbroek         return (Status);
205*29492bb7SDavid van Moolenbroek     }
206*29492bb7SDavid van Moolenbroek 
207*29492bb7SDavid van Moolenbroek     /* Release the OS mutex */
208*29492bb7SDavid van Moolenbroek 
209*29492bb7SDavid van Moolenbroek     AcpiOsReleaseMutex (MutexObj->Mutex.OsMutex);
210*29492bb7SDavid van Moolenbroek     return (AE_OK);
211*29492bb7SDavid van Moolenbroek }
212