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