1227896Sjkim/*******************************************************************************
2227896Sjkim *
3227896Sjkim * Module Name: utxfmutex - external AML mutex access functions
4227896Sjkim *
5227896Sjkim ******************************************************************************/
6227896Sjkim
7227896Sjkim/*
8245582Sjkim * Copyright (C) 2000 - 2013, Intel Corp.
9227896Sjkim * All rights reserved.
10227896Sjkim *
11227896Sjkim * Redistribution and use in source and binary forms, with or without
12227896Sjkim * modification, are permitted provided that the following conditions
13227896Sjkim * are met:
14227896Sjkim * 1. Redistributions of source code must retain the above copyright
15227896Sjkim *    notice, this list of conditions, and the following disclaimer,
16227896Sjkim *    without modification.
17227896Sjkim * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18227896Sjkim *    substantially similar to the "NO WARRANTY" disclaimer below
19227896Sjkim *    ("Disclaimer") and any redistribution must be conditioned upon
20227896Sjkim *    including a substantially similar Disclaimer requirement for further
21227896Sjkim *    binary redistribution.
22227896Sjkim * 3. Neither the names of the above-listed copyright holders nor the names
23227896Sjkim *    of any contributors may be used to endorse or promote products derived
24227896Sjkim *    from this software without specific prior written permission.
25227896Sjkim *
26227896Sjkim * Alternatively, this software may be distributed under the terms of the
27227896Sjkim * GNU General Public License ("GPL") version 2 as published by the Free
28227896Sjkim * Software Foundation.
29227896Sjkim *
30227896Sjkim * NO WARRANTY
31227896Sjkim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32227896Sjkim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33227896Sjkim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34227896Sjkim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35227896Sjkim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36227896Sjkim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37227896Sjkim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38227896Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39227896Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40227896Sjkim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41227896Sjkim * POSSIBILITY OF SUCH DAMAGES.
42227896Sjkim */
43227896Sjkim
44227896Sjkim#define __UTXFMUTEX_C__
45227896Sjkim
46228110Sjkim#include <contrib/dev/acpica/include/acpi.h>
47228110Sjkim#include <contrib/dev/acpica/include/accommon.h>
48228110Sjkim#include <contrib/dev/acpica/include/acnamesp.h>
49227896Sjkim
50227896Sjkim
51227896Sjkim#define _COMPONENT          ACPI_UTILITIES
52227896Sjkim        ACPI_MODULE_NAME    ("utxfmutex")
53227896Sjkim
54227896Sjkim
55227896Sjkim/* Local prototypes */
56227896Sjkim
57227896Sjkimstatic ACPI_STATUS
58227896SjkimAcpiUtGetMutexObject (
59227896Sjkim    ACPI_HANDLE             Handle,
60227896Sjkim    ACPI_STRING             Pathname,
61227896Sjkim    ACPI_OPERAND_OBJECT     **RetObj);
62227896Sjkim
63227896Sjkim
64227896Sjkim/*******************************************************************************
65227896Sjkim *
66227896Sjkim * FUNCTION:    AcpiUtGetMutexObject
67227896Sjkim *
68227896Sjkim * PARAMETERS:  Handle              - Mutex or prefix handle (optional)
69227896Sjkim *              Pathname            - Mutex pathname (optional)
70227896Sjkim *              RetObj              - Where the mutex object is returned
71227896Sjkim *
72227896Sjkim * RETURN:      Status
73227896Sjkim *
74227896Sjkim * DESCRIPTION: Get an AML mutex object. The mutex node is pointed to by
75227896Sjkim *              Handle:Pathname. Either Handle or Pathname can be NULL, but
76227896Sjkim *              not both.
77227896Sjkim *
78227896Sjkim ******************************************************************************/
79227896Sjkim
80227896Sjkimstatic ACPI_STATUS
81227896SjkimAcpiUtGetMutexObject (
82227896Sjkim    ACPI_HANDLE             Handle,
83227896Sjkim    ACPI_STRING             Pathname,
84227896Sjkim    ACPI_OPERAND_OBJECT     **RetObj)
85227896Sjkim{
86227896Sjkim    ACPI_NAMESPACE_NODE     *MutexNode;
87227896Sjkim    ACPI_OPERAND_OBJECT     *MutexObj;
88227896Sjkim    ACPI_STATUS             Status;
89227896Sjkim
90227896Sjkim
91227896Sjkim    /* Parameter validation */
92227896Sjkim
93227896Sjkim    if (!RetObj || (!Handle && !Pathname))
94227896Sjkim    {
95227896Sjkim        return (AE_BAD_PARAMETER);
96227896Sjkim    }
97227896Sjkim
98227896Sjkim    /* Get a the namespace node for the mutex */
99227896Sjkim
100227896Sjkim    MutexNode = Handle;
101227896Sjkim    if (Pathname != NULL)
102227896Sjkim    {
103227896Sjkim        Status = AcpiGetHandle (Handle, Pathname,
104227896Sjkim            ACPI_CAST_PTR (ACPI_HANDLE, &MutexNode));
105227896Sjkim        if (ACPI_FAILURE (Status))
106227896Sjkim        {
107227896Sjkim            return (Status);
108227896Sjkim        }
109227896Sjkim    }
110227896Sjkim
111227896Sjkim    /* Ensure that we actually have a Mutex object */
112227896Sjkim
113227896Sjkim    if (!MutexNode ||
114227896Sjkim        (MutexNode->Type != ACPI_TYPE_MUTEX))
115227896Sjkim    {
116227896Sjkim        return (AE_TYPE);
117227896Sjkim    }
118227896Sjkim
119227896Sjkim    /* Get the low-level mutex object */
120227896Sjkim
121227896Sjkim    MutexObj = AcpiNsGetAttachedObject (MutexNode);
122227896Sjkim    if (!MutexObj)
123227896Sjkim    {
124227896Sjkim        return (AE_NULL_OBJECT);
125227896Sjkim    }
126227896Sjkim
127227896Sjkim    *RetObj = MutexObj;
128227896Sjkim    return (AE_OK);
129227896Sjkim}
130227896Sjkim
131227896Sjkim
132227896Sjkim/*******************************************************************************
133227896Sjkim *
134227896Sjkim * FUNCTION:    AcpiAcquireMutex
135227896Sjkim *
136227896Sjkim * PARAMETERS:  Handle              - Mutex or prefix handle (optional)
137227896Sjkim *              Pathname            - Mutex pathname (optional)
138227896Sjkim *              Timeout             - Max time to wait for the lock (millisec)
139227896Sjkim *
140227896Sjkim * RETURN:      Status
141227896Sjkim *
142227896Sjkim * DESCRIPTION: Acquire an AML mutex. This is a device driver interface to
143227896Sjkim *              AML mutex objects, and allows for transaction locking between
144227896Sjkim *              drivers and AML code. The mutex node is pointed to by
145227896Sjkim *              Handle:Pathname. Either Handle or Pathname can be NULL, but
146227896Sjkim *              not both.
147227896Sjkim *
148227896Sjkim ******************************************************************************/
149227896Sjkim
150227896SjkimACPI_STATUS
151227896SjkimAcpiAcquireMutex (
152227896Sjkim    ACPI_HANDLE             Handle,
153227896Sjkim    ACPI_STRING             Pathname,
154227896Sjkim    UINT16                  Timeout)
155227896Sjkim{
156227896Sjkim    ACPI_STATUS             Status;
157227896Sjkim    ACPI_OPERAND_OBJECT     *MutexObj;
158227896Sjkim
159227896Sjkim
160227896Sjkim    /* Get the low-level mutex associated with Handle:Pathname */
161227896Sjkim
162227896Sjkim    Status = AcpiUtGetMutexObject (Handle, Pathname, &MutexObj);
163227896Sjkim    if (ACPI_FAILURE (Status))
164227896Sjkim    {
165227896Sjkim        return (Status);
166227896Sjkim    }
167227896Sjkim
168227896Sjkim    /* Acquire the OS mutex */
169227896Sjkim
170227896Sjkim    Status = AcpiOsAcquireMutex (MutexObj->Mutex.OsMutex, Timeout);
171227896Sjkim    return (Status);
172227896Sjkim}
173227896Sjkim
174227896Sjkim
175227896Sjkim/*******************************************************************************
176227896Sjkim *
177227896Sjkim * FUNCTION:    AcpiReleaseMutex
178227896Sjkim *
179227896Sjkim * PARAMETERS:  Handle              - Mutex or prefix handle (optional)
180227896Sjkim *              Pathname            - Mutex pathname (optional)
181227896Sjkim *
182227896Sjkim * RETURN:      Status
183227896Sjkim *
184227896Sjkim * DESCRIPTION: Release an AML mutex. This is a device driver interface to
185227896Sjkim *              AML mutex objects, and allows for transaction locking between
186227896Sjkim *              drivers and AML code. The mutex node is pointed to by
187227896Sjkim *              Handle:Pathname. Either Handle or Pathname can be NULL, but
188227896Sjkim *              not both.
189227896Sjkim *
190227896Sjkim ******************************************************************************/
191227896Sjkim
192227896SjkimACPI_STATUS
193227896SjkimAcpiReleaseMutex (
194227896Sjkim    ACPI_HANDLE             Handle,
195227896Sjkim    ACPI_STRING             Pathname)
196227896Sjkim{
197227896Sjkim    ACPI_STATUS             Status;
198227896Sjkim    ACPI_OPERAND_OBJECT     *MutexObj;
199227896Sjkim
200227896Sjkim
201227896Sjkim    /* Get the low-level mutex associated with Handle:Pathname */
202227896Sjkim
203227896Sjkim    Status = AcpiUtGetMutexObject (Handle, Pathname, &MutexObj);
204227896Sjkim    if (ACPI_FAILURE (Status))
205227896Sjkim    {
206227896Sjkim        return (Status);
207227896Sjkim    }
208227896Sjkim
209227896Sjkim    /* Release the OS mutex */
210227896Sjkim
211227896Sjkim    AcpiOsReleaseMutex (MutexObj->Mutex.OsMutex);
212227896Sjkim    return (AE_OK);
213227896Sjkim}
214