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