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