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