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