1227896Sjkim/*******************************************************************************
2227896Sjkim *
3227896Sjkim * Module Name: utxfmutex - external AML mutex access functions
4227896Sjkim *
5227896Sjkim ******************************************************************************/
6227896Sjkim
7227896Sjkim/*
8298714Sjkim * Copyright (C) 2000 - 2016, 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
44228110Sjkim#include <contrib/dev/acpica/include/acpi.h>
45228110Sjkim#include <contrib/dev/acpica/include/accommon.h>
46228110Sjkim#include <contrib/dev/acpica/include/acnamesp.h>
47227896Sjkim
48227896Sjkim
49227896Sjkim#define _COMPONENT          ACPI_UTILITIES
50227896Sjkim        ACPI_MODULE_NAME    ("utxfmutex")
51227896Sjkim
52227896Sjkim
53227896Sjkim/* Local prototypes */
54227896Sjkim
55227896Sjkimstatic ACPI_STATUS
56227896SjkimAcpiUtGetMutexObject (
57227896Sjkim    ACPI_HANDLE             Handle,
58227896Sjkim    ACPI_STRING             Pathname,
59227896Sjkim    ACPI_OPERAND_OBJECT     **RetObj);
60227896Sjkim
61227896Sjkim
62227896Sjkim/*******************************************************************************
63227896Sjkim *
64227896Sjkim * FUNCTION:    AcpiUtGetMutexObject
65227896Sjkim *
66227896Sjkim * PARAMETERS:  Handle              - Mutex or prefix handle (optional)
67227896Sjkim *              Pathname            - Mutex pathname (optional)
68227896Sjkim *              RetObj              - Where the mutex object is returned
69227896Sjkim *
70227896Sjkim * RETURN:      Status
71227896Sjkim *
72227896Sjkim * DESCRIPTION: Get an AML mutex object. The mutex node is pointed to by
73227896Sjkim *              Handle:Pathname. Either Handle or Pathname can be NULL, but
74227896Sjkim *              not both.
75227896Sjkim *
76227896Sjkim ******************************************************************************/
77227896Sjkim
78227896Sjkimstatic ACPI_STATUS
79227896SjkimAcpiUtGetMutexObject (
80227896Sjkim    ACPI_HANDLE             Handle,
81227896Sjkim    ACPI_STRING             Pathname,
82227896Sjkim    ACPI_OPERAND_OBJECT     **RetObj)
83227896Sjkim{
84227896Sjkim    ACPI_NAMESPACE_NODE     *MutexNode;
85227896Sjkim    ACPI_OPERAND_OBJECT     *MutexObj;
86227896Sjkim    ACPI_STATUS             Status;
87227896Sjkim
88227896Sjkim
89227896Sjkim    /* Parameter validation */
90227896Sjkim
91227896Sjkim    if (!RetObj || (!Handle && !Pathname))
92227896Sjkim    {
93227896Sjkim        return (AE_BAD_PARAMETER);
94227896Sjkim    }
95227896Sjkim
96227896Sjkim    /* Get a the namespace node for the mutex */
97227896Sjkim
98227896Sjkim    MutexNode = Handle;
99227896Sjkim    if (Pathname != NULL)
100227896Sjkim    {
101298714Sjkim        Status = AcpiGetHandle (
102298714Sjkim            Handle, Pathname, ACPI_CAST_PTR (ACPI_HANDLE, &MutexNode));
103227896Sjkim        if (ACPI_FAILURE (Status))
104227896Sjkim        {
105227896Sjkim            return (Status);
106227896Sjkim        }
107227896Sjkim    }
108227896Sjkim
109227896Sjkim    /* Ensure that we actually have a Mutex object */
110227896Sjkim
111227896Sjkim    if (!MutexNode ||
112227896Sjkim        (MutexNode->Type != ACPI_TYPE_MUTEX))
113227896Sjkim    {
114227896Sjkim        return (AE_TYPE);
115227896Sjkim    }
116227896Sjkim
117227896Sjkim    /* Get the low-level mutex object */
118227896Sjkim
119227896Sjkim    MutexObj = AcpiNsGetAttachedObject (MutexNode);
120227896Sjkim    if (!MutexObj)
121227896Sjkim    {
122227896Sjkim        return (AE_NULL_OBJECT);
123227896Sjkim    }
124227896Sjkim
125227896Sjkim    *RetObj = MutexObj;
126227896Sjkim    return (AE_OK);
127227896Sjkim}
128227896Sjkim
129227896Sjkim
130227896Sjkim/*******************************************************************************
131227896Sjkim *
132227896Sjkim * FUNCTION:    AcpiAcquireMutex
133227896Sjkim *
134227896Sjkim * PARAMETERS:  Handle              - Mutex or prefix handle (optional)
135227896Sjkim *              Pathname            - Mutex pathname (optional)
136227896Sjkim *              Timeout             - Max time to wait for the lock (millisec)
137227896Sjkim *
138227896Sjkim * RETURN:      Status
139227896Sjkim *
140227896Sjkim * DESCRIPTION: Acquire an AML mutex. This is a device driver interface to
141227896Sjkim *              AML mutex objects, and allows for transaction locking between
142227896Sjkim *              drivers and AML code. The mutex node is pointed to by
143227896Sjkim *              Handle:Pathname. Either Handle or Pathname can be NULL, but
144227896Sjkim *              not both.
145227896Sjkim *
146227896Sjkim ******************************************************************************/
147227896Sjkim
148227896SjkimACPI_STATUS
149227896SjkimAcpiAcquireMutex (
150227896Sjkim    ACPI_HANDLE             Handle,
151227896Sjkim    ACPI_STRING             Pathname,
152227896Sjkim    UINT16                  Timeout)
153227896Sjkim{
154227896Sjkim    ACPI_STATUS             Status;
155227896Sjkim    ACPI_OPERAND_OBJECT     *MutexObj;
156227896Sjkim
157227896Sjkim
158227896Sjkim    /* Get the low-level mutex associated with Handle:Pathname */
159227896Sjkim
160227896Sjkim    Status = AcpiUtGetMutexObject (Handle, Pathname, &MutexObj);
161227896Sjkim    if (ACPI_FAILURE (Status))
162227896Sjkim    {
163227896Sjkim        return (Status);
164227896Sjkim    }
165227896Sjkim
166227896Sjkim    /* Acquire the OS mutex */
167227896Sjkim
168227896Sjkim    Status = AcpiOsAcquireMutex (MutexObj->Mutex.OsMutex, Timeout);
169227896Sjkim    return (Status);
170227896Sjkim}
171227896Sjkim
172227896Sjkim
173227896Sjkim/*******************************************************************************
174227896Sjkim *
175227896Sjkim * FUNCTION:    AcpiReleaseMutex
176227896Sjkim *
177227896Sjkim * PARAMETERS:  Handle              - Mutex or prefix handle (optional)
178227896Sjkim *              Pathname            - Mutex pathname (optional)
179227896Sjkim *
180227896Sjkim * RETURN:      Status
181227896Sjkim *
182227896Sjkim * DESCRIPTION: Release an AML mutex. This is a device driver interface to
183227896Sjkim *              AML mutex objects, and allows for transaction locking between
184227896Sjkim *              drivers and AML code. The mutex node is pointed to by
185227896Sjkim *              Handle:Pathname. Either Handle or Pathname can be NULL, but
186227896Sjkim *              not both.
187227896Sjkim *
188227896Sjkim ******************************************************************************/
189227896Sjkim
190227896SjkimACPI_STATUS
191227896SjkimAcpiReleaseMutex (
192227896Sjkim    ACPI_HANDLE             Handle,
193227896Sjkim    ACPI_STRING             Pathname)
194227896Sjkim{
195227896Sjkim    ACPI_STATUS             Status;
196227896Sjkim    ACPI_OPERAND_OBJECT     *MutexObj;
197227896Sjkim
198227896Sjkim
199227896Sjkim    /* Get the low-level mutex associated with Handle:Pathname */
200227896Sjkim
201227896Sjkim    Status = AcpiUtGetMutexObject (Handle, Pathname, &MutexObj);
202227896Sjkim    if (ACPI_FAILURE (Status))
203227896Sjkim    {
204227896Sjkim        return (Status);
205227896Sjkim    }
206227896Sjkim
207227896Sjkim    /* Release the OS mutex */
208227896Sjkim
209227896Sjkim    AcpiOsReleaseMutex (MutexObj->Mutex.OsMutex);
210227896Sjkim    return (AE_OK);
211227896Sjkim}
212