nsxfeval.c revision 167802
1100966Siwasaki/******************************************************************************* 2100966Siwasaki * 3100966Siwasaki * Module Name: nsxfeval - Public interfaces to the ACPI subsystem 4100966Siwasaki * ACPI Object evaluation interfaces 5167802Sjkim * $Revision: 1.30 $ 6100966Siwasaki * 7100966Siwasaki ******************************************************************************/ 8100966Siwasaki 9100966Siwasaki/****************************************************************************** 10100966Siwasaki * 11100966Siwasaki * 1. Copyright Notice 12100966Siwasaki * 13167802Sjkim * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp. 14100966Siwasaki * All rights reserved. 15100966Siwasaki * 16100966Siwasaki * 2. License 17100966Siwasaki * 18100966Siwasaki * 2.1. This is your license from Intel Corp. under its intellectual property 19100966Siwasaki * rights. You may have additional license terms from the party that provided 20100966Siwasaki * you this software, covering your right to use that party's intellectual 21100966Siwasaki * property rights. 22100966Siwasaki * 23100966Siwasaki * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a 24100966Siwasaki * copy of the source code appearing in this file ("Covered Code") an 25100966Siwasaki * irrevocable, perpetual, worldwide license under Intel's copyrights in the 26100966Siwasaki * base code distributed originally by Intel ("Original Intel Code") to copy, 27100966Siwasaki * make derivatives, distribute, use and display any portion of the Covered 28100966Siwasaki * Code in any form, with the right to sublicense such rights; and 29100966Siwasaki * 30100966Siwasaki * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent 31100966Siwasaki * license (with the right to sublicense), under only those claims of Intel 32100966Siwasaki * patents that are infringed by the Original Intel Code, to make, use, sell, 33100966Siwasaki * offer to sell, and import the Covered Code and derivative works thereof 34100966Siwasaki * solely to the minimum extent necessary to exercise the above copyright 35100966Siwasaki * license, and in no event shall the patent license extend to any additions 36100966Siwasaki * to or modifications of the Original Intel Code. No other license or right 37100966Siwasaki * is granted directly or by implication, estoppel or otherwise; 38100966Siwasaki * 39100966Siwasaki * The above copyright and patent license is granted only if the following 40100966Siwasaki * conditions are met: 41100966Siwasaki * 42100966Siwasaki * 3. Conditions 43100966Siwasaki * 44100966Siwasaki * 3.1. Redistribution of Source with Rights to Further Distribute Source. 45100966Siwasaki * Redistribution of source code of any substantial portion of the Covered 46100966Siwasaki * Code or modification with rights to further distribute source must include 47100966Siwasaki * the above Copyright Notice, the above License, this list of Conditions, 48100966Siwasaki * and the following Disclaimer and Export Compliance provision. In addition, 49100966Siwasaki * Licensee must cause all Covered Code to which Licensee contributes to 50100966Siwasaki * contain a file documenting the changes Licensee made to create that Covered 51100966Siwasaki * Code and the date of any change. Licensee must include in that file the 52100966Siwasaki * documentation of any changes made by any predecessor Licensee. Licensee 53100966Siwasaki * must include a prominent statement that the modification is derived, 54100966Siwasaki * directly or indirectly, from Original Intel Code. 55100966Siwasaki * 56100966Siwasaki * 3.2. Redistribution of Source with no Rights to Further Distribute Source. 57100966Siwasaki * Redistribution of source code of any substantial portion of the Covered 58100966Siwasaki * Code or modification without rights to further distribute source must 59100966Siwasaki * include the following Disclaimer and Export Compliance provision in the 60100966Siwasaki * documentation and/or other materials provided with distribution. In 61100966Siwasaki * addition, Licensee may not authorize further sublicense of source of any 62100966Siwasaki * portion of the Covered Code, and must include terms to the effect that the 63100966Siwasaki * license from Licensee to its licensee is limited to the intellectual 64100966Siwasaki * property embodied in the software Licensee provides to its licensee, and 65100966Siwasaki * not to intellectual property embodied in modifications its licensee may 66100966Siwasaki * make. 67100966Siwasaki * 68100966Siwasaki * 3.3. Redistribution of Executable. Redistribution in executable form of any 69100966Siwasaki * substantial portion of the Covered Code or modification must reproduce the 70100966Siwasaki * above Copyright Notice, and the following Disclaimer and Export Compliance 71100966Siwasaki * provision in the documentation and/or other materials provided with the 72100966Siwasaki * distribution. 73100966Siwasaki * 74100966Siwasaki * 3.4. Intel retains all right, title, and interest in and to the Original 75100966Siwasaki * Intel Code. 76100966Siwasaki * 77100966Siwasaki * 3.5. Neither the name Intel nor any other trademark owned or controlled by 78100966Siwasaki * Intel shall be used in advertising or otherwise to promote the sale, use or 79100966Siwasaki * other dealings in products derived from or relating to the Covered Code 80100966Siwasaki * without prior written authorization from Intel. 81100966Siwasaki * 82100966Siwasaki * 4. Disclaimer and Export Compliance 83100966Siwasaki * 84100966Siwasaki * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED 85100966Siwasaki * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE 86100966Siwasaki * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, 87100966Siwasaki * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY 88100966Siwasaki * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY 89100966Siwasaki * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A 90100966Siwasaki * PARTICULAR PURPOSE. 91100966Siwasaki * 92100966Siwasaki * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES 93100966Siwasaki * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR 94100966Siwasaki * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, 95100966Siwasaki * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY 96100966Siwasaki * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL 97100966Siwasaki * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS 98100966Siwasaki * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY 99100966Siwasaki * LIMITED REMEDY. 100100966Siwasaki * 101100966Siwasaki * 4.3. Licensee shall not export, either directly or indirectly, any of this 102100966Siwasaki * software or system incorporating such software without first obtaining any 103100966Siwasaki * required license or other approval from the U. S. Department of Commerce or 104100966Siwasaki * any other agency or department of the United States Government. In the 105100966Siwasaki * event Licensee exports any such software from the United States or 106100966Siwasaki * re-exports any such software from a foreign destination, Licensee shall 107100966Siwasaki * ensure that the distribution and export/re-export of the software is in 108100966Siwasaki * compliance with all laws, regulations, orders, or other restrictions of the 109100966Siwasaki * U.S. Export Administration Regulations. Licensee agrees that neither it nor 110100966Siwasaki * any of its subsidiaries will export/re-export any technical data, process, 111100966Siwasaki * software, or service, directly or indirectly, to any country for which the 112100966Siwasaki * United States government or any agency thereof requires an export license, 113100966Siwasaki * other governmental approval, or letter of assurance, without first obtaining 114100966Siwasaki * such license, approval or letter. 115100966Siwasaki * 116100966Siwasaki *****************************************************************************/ 117100966Siwasaki 118100966Siwasaki 119100966Siwasaki#define __NSXFEVAL_C__ 120100966Siwasaki 121151600Sobrien#include <contrib/dev/acpica/acpi.h> 122151600Sobrien#include <contrib/dev/acpica/acnamesp.h> 123151600Sobrien#include <contrib/dev/acpica/acinterp.h> 124100966Siwasaki 125100966Siwasaki 126100966Siwasaki#define _COMPONENT ACPI_NAMESPACE 127100966Siwasaki ACPI_MODULE_NAME ("nsxfeval") 128100966Siwasaki 129100966Siwasaki 130100966Siwasaki/******************************************************************************* 131100966Siwasaki * 132100966Siwasaki * FUNCTION: AcpiEvaluateObjectTyped 133100966Siwasaki * 134100966Siwasaki * PARAMETERS: Handle - Object handle (optional) 135151937Sjkim * Pathname - Object pathname (optional) 136151937Sjkim * ExternalParams - List of parameters to pass to method, 137100966Siwasaki * terminated by NULL. May be NULL 138100966Siwasaki * if no parameters are being passed. 139151937Sjkim * ReturnBuffer - Where to put method's return value (if 140100966Siwasaki * any). If NULL, no value is returned. 141100966Siwasaki * ReturnType - Expected type of return object 142100966Siwasaki * 143100966Siwasaki * RETURN: Status 144100966Siwasaki * 145100966Siwasaki * DESCRIPTION: Find and evaluate the given object, passing the given 146100966Siwasaki * parameters if necessary. One of "Handle" or "Pathname" must 147100966Siwasaki * be valid (non-null) 148100966Siwasaki * 149100966Siwasaki ******************************************************************************/ 150100966Siwasaki 151100966SiwasakiACPI_STATUS 152100966SiwasakiAcpiEvaluateObjectTyped ( 153100966Siwasaki ACPI_HANDLE Handle, 154100966Siwasaki ACPI_STRING Pathname, 155100966Siwasaki ACPI_OBJECT_LIST *ExternalParams, 156100966Siwasaki ACPI_BUFFER *ReturnBuffer, 157100966Siwasaki ACPI_OBJECT_TYPE ReturnType) 158100966Siwasaki{ 159100966Siwasaki ACPI_STATUS Status; 160100966Siwasaki BOOLEAN MustFree = FALSE; 161100966Siwasaki 162100966Siwasaki 163167802Sjkim ACPI_FUNCTION_TRACE (AcpiEvaluateObjectTyped); 164100966Siwasaki 165100966Siwasaki 166100966Siwasaki /* Return buffer must be valid */ 167100966Siwasaki 168100966Siwasaki if (!ReturnBuffer) 169100966Siwasaki { 170100966Siwasaki return_ACPI_STATUS (AE_BAD_PARAMETER); 171100966Siwasaki } 172100966Siwasaki 173100966Siwasaki if (ReturnBuffer->Length == ACPI_ALLOCATE_BUFFER) 174100966Siwasaki { 175100966Siwasaki MustFree = TRUE; 176100966Siwasaki } 177100966Siwasaki 178100966Siwasaki /* Evaluate the object */ 179100966Siwasaki 180100966Siwasaki Status = AcpiEvaluateObject (Handle, Pathname, ExternalParams, ReturnBuffer); 181100966Siwasaki if (ACPI_FAILURE (Status)) 182100966Siwasaki { 183100966Siwasaki return_ACPI_STATUS (Status); 184100966Siwasaki } 185100966Siwasaki 186100966Siwasaki /* Type ANY means "don't care" */ 187100966Siwasaki 188100966Siwasaki if (ReturnType == ACPI_TYPE_ANY) 189100966Siwasaki { 190100966Siwasaki return_ACPI_STATUS (AE_OK); 191100966Siwasaki } 192100966Siwasaki 193100966Siwasaki if (ReturnBuffer->Length == 0) 194100966Siwasaki { 195100966Siwasaki /* Error because caller specifically asked for a return value */ 196100966Siwasaki 197167802Sjkim ACPI_ERROR ((AE_INFO, "No return value")); 198100966Siwasaki return_ACPI_STATUS (AE_NULL_OBJECT); 199100966Siwasaki } 200100966Siwasaki 201100966Siwasaki /* Examine the object type returned from EvaluateObject */ 202100966Siwasaki 203100966Siwasaki if (((ACPI_OBJECT *) ReturnBuffer->Pointer)->Type == ReturnType) 204100966Siwasaki { 205100966Siwasaki return_ACPI_STATUS (AE_OK); 206100966Siwasaki } 207100966Siwasaki 208100966Siwasaki /* Return object type does not match requested type */ 209100966Siwasaki 210167802Sjkim ACPI_ERROR ((AE_INFO, 211167802Sjkim "Incorrect return type [%s] requested [%s]", 212100966Siwasaki AcpiUtGetTypeName (((ACPI_OBJECT *) ReturnBuffer->Pointer)->Type), 213100966Siwasaki AcpiUtGetTypeName (ReturnType))); 214100966Siwasaki 215100966Siwasaki if (MustFree) 216100966Siwasaki { 217100966Siwasaki /* Caller used ACPI_ALLOCATE_BUFFER, free the return buffer */ 218100966Siwasaki 219100966Siwasaki AcpiOsFree (ReturnBuffer->Pointer); 220100966Siwasaki ReturnBuffer->Pointer = NULL; 221100966Siwasaki } 222100966Siwasaki 223100966Siwasaki ReturnBuffer->Length = 0; 224100966Siwasaki return_ACPI_STATUS (AE_TYPE); 225100966Siwasaki} 226100966Siwasaki 227167802SjkimACPI_EXPORT_SYMBOL (AcpiEvaluateObjectTyped) 228100966Siwasaki 229167802Sjkim 230100966Siwasaki/******************************************************************************* 231100966Siwasaki * 232100966Siwasaki * FUNCTION: AcpiEvaluateObject 233100966Siwasaki * 234100966Siwasaki * PARAMETERS: Handle - Object handle (optional) 235128212Snjl * Pathname - Object pathname (optional) 236128212Snjl * ExternalParams - List of parameters to pass to method, 237100966Siwasaki * terminated by NULL. May be NULL 238100966Siwasaki * if no parameters are being passed. 239128212Snjl * ReturnBuffer - Where to put method's return value (if 240100966Siwasaki * any). If NULL, no value is returned. 241100966Siwasaki * 242100966Siwasaki * RETURN: Status 243100966Siwasaki * 244100966Siwasaki * DESCRIPTION: Find and evaluate the given object, passing the given 245100966Siwasaki * parameters if necessary. One of "Handle" or "Pathname" must 246100966Siwasaki * be valid (non-null) 247100966Siwasaki * 248100966Siwasaki ******************************************************************************/ 249100966Siwasaki 250100966SiwasakiACPI_STATUS 251100966SiwasakiAcpiEvaluateObject ( 252100966Siwasaki ACPI_HANDLE Handle, 253100966Siwasaki ACPI_STRING Pathname, 254100966Siwasaki ACPI_OBJECT_LIST *ExternalParams, 255100966Siwasaki ACPI_BUFFER *ReturnBuffer) 256100966Siwasaki{ 257100966Siwasaki ACPI_STATUS Status; 258167802Sjkim ACPI_EVALUATE_INFO *Info; 259100966Siwasaki ACPI_SIZE BufferSpaceNeeded; 260100966Siwasaki UINT32 i; 261100966Siwasaki 262100966Siwasaki 263167802Sjkim ACPI_FUNCTION_TRACE (AcpiEvaluateObject); 264100966Siwasaki 265100966Siwasaki 266167802Sjkim /* Allocate and initialize the evaluation information block */ 267129684Snjl 268167802Sjkim Info = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_EVALUATE_INFO)); 269167802Sjkim if (!Info) 270167802Sjkim { 271167802Sjkim return_ACPI_STATUS (AE_NO_MEMORY); 272167802Sjkim } 273167802Sjkim 274167802Sjkim Info->Pathname = Pathname; 275167802Sjkim Info->ParameterType = ACPI_PARAM_ARGS; 276167802Sjkim 277167802Sjkim /* Convert and validate the device handle */ 278167802Sjkim 279167802Sjkim Info->PrefixNode = AcpiNsMapHandleToNode (Handle); 280167802Sjkim if (!Info->PrefixNode) 281167802Sjkim { 282167802Sjkim Status = AE_BAD_PARAMETER; 283167802Sjkim goto Cleanup; 284167802Sjkim } 285167802Sjkim 286100966Siwasaki /* 287167802Sjkim * If there are parameters to be passed to a control method, the external 288167802Sjkim * objects must all be converted to internal objects 289100966Siwasaki */ 290100966Siwasaki if (ExternalParams && ExternalParams->Count) 291100966Siwasaki { 292100966Siwasaki /* 293100966Siwasaki * Allocate a new parameter block for the internal objects 294100966Siwasaki * Add 1 to count to allow for null terminated internal list 295100966Siwasaki */ 296167802Sjkim Info->Parameters = ACPI_ALLOCATE_ZEROED ( 297167802Sjkim ((ACPI_SIZE) ExternalParams->Count + 1) * sizeof (void *)); 298167802Sjkim if (!Info->Parameters) 299100966Siwasaki { 300167802Sjkim Status = AE_NO_MEMORY; 301167802Sjkim goto Cleanup; 302100966Siwasaki } 303100966Siwasaki 304167802Sjkim /* Convert each external object in the list to an internal object */ 305167802Sjkim 306100966Siwasaki for (i = 0; i < ExternalParams->Count; i++) 307100966Siwasaki { 308167802Sjkim Status = AcpiUtCopyEobjectToIobject ( 309167802Sjkim &ExternalParams->Pointer[i], &Info->Parameters[i]); 310100966Siwasaki if (ACPI_FAILURE (Status)) 311100966Siwasaki { 312167802Sjkim goto Cleanup; 313100966Siwasaki } 314100966Siwasaki } 315167802Sjkim Info->Parameters[ExternalParams->Count] = NULL; 316100966Siwasaki } 317100966Siwasaki 318100966Siwasaki /* 319100966Siwasaki * Three major cases: 320100966Siwasaki * 1) Fully qualified pathname 321100966Siwasaki * 2) No handle, not fully qualified pathname (error) 322100966Siwasaki * 3) Valid handle 323100966Siwasaki */ 324100966Siwasaki if ((Pathname) && 325100966Siwasaki (AcpiNsValidRootPrefix (Pathname[0]))) 326100966Siwasaki { 327167802Sjkim /* The path is fully qualified, just evaluate by name */ 328167802Sjkim 329167802Sjkim Info->PrefixNode = NULL; 330167802Sjkim Status = AcpiNsEvaluate (Info); 331100966Siwasaki } 332100966Siwasaki else if (!Handle) 333100966Siwasaki { 334100966Siwasaki /* 335167802Sjkim * A handle is optional iff a fully qualified pathname is specified. 336167802Sjkim * Since we've already handled fully qualified names above, this is 337167802Sjkim * an error 338100966Siwasaki */ 339100966Siwasaki if (!Pathname) 340100966Siwasaki { 341167802Sjkim ACPI_DEBUG_PRINT ((ACPI_DB_INFO, 342167802Sjkim "Both Handle and Pathname are NULL")); 343100966Siwasaki } 344100966Siwasaki else 345100966Siwasaki { 346167802Sjkim ACPI_DEBUG_PRINT ((ACPI_DB_INFO, 347167802Sjkim "Null Handle with relative pathname [%s]", Pathname)); 348100966Siwasaki } 349100966Siwasaki 350100966Siwasaki Status = AE_BAD_PARAMETER; 351100966Siwasaki } 352100966Siwasaki else 353100966Siwasaki { 354167802Sjkim /* We have a namespace a node and a possible relative path */ 355167802Sjkim 356167802Sjkim Status = AcpiNsEvaluate (Info); 357100966Siwasaki } 358100966Siwasaki 359100966Siwasaki /* 360100966Siwasaki * If we are expecting a return value, and all went well above, 361100966Siwasaki * copy the return value to an external object. 362100966Siwasaki */ 363100966Siwasaki if (ReturnBuffer) 364100966Siwasaki { 365167802Sjkim if (!Info->ReturnObject) 366100966Siwasaki { 367100966Siwasaki ReturnBuffer->Length = 0; 368100966Siwasaki } 369100966Siwasaki else 370100966Siwasaki { 371167802Sjkim if (ACPI_GET_DESCRIPTOR_TYPE (Info->ReturnObject) == 372167802Sjkim ACPI_DESC_TYPE_NAMED) 373100966Siwasaki { 374100966Siwasaki /* 375100966Siwasaki * If we received a NS Node as a return object, this means that 376100966Siwasaki * the object we are evaluating has nothing interesting to 377100966Siwasaki * return (such as a mutex, etc.) We return an error because 378100966Siwasaki * these types are essentially unsupported by this interface. 379100966Siwasaki * We don't check up front because this makes it easier to add 380100966Siwasaki * support for various types at a later date if necessary. 381100966Siwasaki */ 382100966Siwasaki Status = AE_TYPE; 383167802Sjkim Info->ReturnObject = NULL; /* No need to delete a NS Node */ 384100966Siwasaki ReturnBuffer->Length = 0; 385100966Siwasaki } 386100966Siwasaki 387100966Siwasaki if (ACPI_SUCCESS (Status)) 388100966Siwasaki { 389167802Sjkim /* Get the size of the returned object */ 390167802Sjkim 391167802Sjkim Status = AcpiUtGetObjectSize (Info->ReturnObject, 392167802Sjkim &BufferSpaceNeeded); 393100966Siwasaki if (ACPI_SUCCESS (Status)) 394100966Siwasaki { 395100966Siwasaki /* Validate/Allocate/Clear caller buffer */ 396100966Siwasaki 397151937Sjkim Status = AcpiUtInitializeBuffer (ReturnBuffer, 398167802Sjkim BufferSpaceNeeded); 399100966Siwasaki if (ACPI_FAILURE (Status)) 400100966Siwasaki { 401100966Siwasaki /* 402167802Sjkim * Caller's buffer is too small or a new one can't 403167802Sjkim * be allocated 404100966Siwasaki */ 405100966Siwasaki ACPI_DEBUG_PRINT ((ACPI_DB_INFO, 406100966Siwasaki "Needed buffer size %X, %s\n", 407129684Snjl (UINT32) BufferSpaceNeeded, 408129684Snjl AcpiFormatException (Status))); 409100966Siwasaki } 410100966Siwasaki else 411100966Siwasaki { 412167802Sjkim /* We have enough space for the object, build it */ 413167802Sjkim 414167802Sjkim Status = AcpiUtCopyIobjectToEobject (Info->ReturnObject, 415167802Sjkim ReturnBuffer); 416100966Siwasaki } 417100966Siwasaki } 418100966Siwasaki } 419100966Siwasaki } 420100966Siwasaki } 421100966Siwasaki 422167802Sjkim if (Info->ReturnObject) 423100966Siwasaki { 424129684Snjl /* 425167802Sjkim * Delete the internal return object. NOTE: Interpreter must be 426167802Sjkim * locked to avoid race condition. 427100966Siwasaki */ 428167802Sjkim AcpiExEnterInterpreter (); 429167802Sjkim 430167802Sjkim /* Remove one reference on the return object (should delete it) */ 431167802Sjkim 432167802Sjkim AcpiUtRemoveReference (Info->ReturnObject); 433167802Sjkim AcpiExExitInterpreter (); 434100966Siwasaki } 435100966Siwasaki 436167802Sjkim 437167802SjkimCleanup: 438167802Sjkim 439167802Sjkim /* Free the input parameter list (if we created one) */ 440167802Sjkim 441167802Sjkim if (Info->Parameters) 442100966Siwasaki { 443100966Siwasaki /* Free the allocated parameter block */ 444100966Siwasaki 445167802Sjkim AcpiUtDeleteInternalObjectList (Info->Parameters); 446100966Siwasaki } 447100966Siwasaki 448167802Sjkim ACPI_FREE (Info); 449100966Siwasaki return_ACPI_STATUS (Status); 450100966Siwasaki} 451100966Siwasaki 452167802SjkimACPI_EXPORT_SYMBOL (AcpiEvaluateObject) 453100966Siwasaki 454167802Sjkim 455100966Siwasaki/******************************************************************************* 456100966Siwasaki * 457100966Siwasaki * FUNCTION: AcpiWalkNamespace 458100966Siwasaki * 459100966Siwasaki * PARAMETERS: Type - ACPI_OBJECT_TYPE to search for 460100966Siwasaki * StartObject - Handle in namespace where search begins 461100966Siwasaki * MaxDepth - Depth to which search is to reach 462100966Siwasaki * UserFunction - Called when an object of "Type" is found 463100966Siwasaki * Context - Passed to user function 464100966Siwasaki * ReturnValue - Location where return value of 465100966Siwasaki * UserFunction is put if terminated early 466100966Siwasaki * 467100966Siwasaki * RETURNS Return value from the UserFunction if terminated early. 468100966Siwasaki * Otherwise, returns NULL. 469100966Siwasaki * 470100966Siwasaki * DESCRIPTION: Performs a modified depth-first walk of the namespace tree, 471100966Siwasaki * starting (and ending) at the object specified by StartHandle. 472100966Siwasaki * The UserFunction is called whenever an object that matches 473100966Siwasaki * the type parameter is found. If the user function returns 474100966Siwasaki * a non-zero value, the search is terminated immediately and this 475100966Siwasaki * value is returned to the caller. 476100966Siwasaki * 477100966Siwasaki * The point of this procedure is to provide a generic namespace 478100966Siwasaki * walk routine that can be called from multiple places to 479100966Siwasaki * provide multiple services; the User Function can be tailored 480100966Siwasaki * to each task, whether it is a print function, a compare 481100966Siwasaki * function, etc. 482100966Siwasaki * 483100966Siwasaki ******************************************************************************/ 484100966Siwasaki 485100966SiwasakiACPI_STATUS 486100966SiwasakiAcpiWalkNamespace ( 487100966Siwasaki ACPI_OBJECT_TYPE Type, 488100966Siwasaki ACPI_HANDLE StartObject, 489100966Siwasaki UINT32 MaxDepth, 490100966Siwasaki ACPI_WALK_CALLBACK UserFunction, 491100966Siwasaki void *Context, 492100966Siwasaki void **ReturnValue) 493100966Siwasaki{ 494100966Siwasaki ACPI_STATUS Status; 495100966Siwasaki 496100966Siwasaki 497167802Sjkim ACPI_FUNCTION_TRACE (AcpiWalkNamespace); 498100966Siwasaki 499100966Siwasaki 500100966Siwasaki /* Parameter validation */ 501100966Siwasaki 502167802Sjkim if ((Type > ACPI_TYPE_LOCAL_MAX) || 503167802Sjkim (!MaxDepth) || 504100966Siwasaki (!UserFunction)) 505100966Siwasaki { 506100966Siwasaki return_ACPI_STATUS (AE_BAD_PARAMETER); 507100966Siwasaki } 508100966Siwasaki 509100966Siwasaki /* 510100966Siwasaki * Lock the namespace around the walk. 511100966Siwasaki * The namespace will be unlocked/locked around each call 512100966Siwasaki * to the user function - since this function 513100966Siwasaki * must be allowed to make Acpi calls itself. 514100966Siwasaki */ 515100966Siwasaki Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE); 516100966Siwasaki if (ACPI_FAILURE (Status)) 517100966Siwasaki { 518100966Siwasaki return_ACPI_STATUS (Status); 519100966Siwasaki } 520100966Siwasaki 521151937Sjkim Status = AcpiNsWalkNamespace (Type, StartObject, MaxDepth, 522151937Sjkim ACPI_NS_WALK_UNLOCK, 523100966Siwasaki UserFunction, Context, ReturnValue); 524100966Siwasaki 525100966Siwasaki (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE); 526100966Siwasaki return_ACPI_STATUS (Status); 527100966Siwasaki} 528100966Siwasaki 529167802SjkimACPI_EXPORT_SYMBOL (AcpiWalkNamespace) 530100966Siwasaki 531167802Sjkim 532100966Siwasaki/******************************************************************************* 533100966Siwasaki * 534100966Siwasaki * FUNCTION: AcpiNsGetDeviceCallback 535100966Siwasaki * 536100966Siwasaki * PARAMETERS: Callback from AcpiGetDevice 537100966Siwasaki * 538100966Siwasaki * RETURN: Status 539100966Siwasaki * 540100966Siwasaki * DESCRIPTION: Takes callbacks from WalkNamespace and filters out all non- 541100966Siwasaki * present devices, or if they specified a HID, it filters based 542100966Siwasaki * on that. 543100966Siwasaki * 544100966Siwasaki ******************************************************************************/ 545100966Siwasaki 546100966Siwasakistatic ACPI_STATUS 547100966SiwasakiAcpiNsGetDeviceCallback ( 548100966Siwasaki ACPI_HANDLE ObjHandle, 549100966Siwasaki UINT32 NestingLevel, 550100966Siwasaki void *Context, 551100966Siwasaki void **ReturnValue) 552100966Siwasaki{ 553117521Snjl ACPI_GET_DEVICES_INFO *Info = Context; 554100966Siwasaki ACPI_STATUS Status; 555100966Siwasaki ACPI_NAMESPACE_NODE *Node; 556100966Siwasaki UINT32 Flags; 557100966Siwasaki ACPI_DEVICE_ID Hid; 558117521Snjl ACPI_COMPATIBLE_ID_LIST *Cid; 559117521Snjl ACPI_NATIVE_UINT i; 560100966Siwasaki 561100966Siwasaki 562100966Siwasaki Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE); 563100966Siwasaki if (ACPI_FAILURE (Status)) 564100966Siwasaki { 565100966Siwasaki return (Status); 566100966Siwasaki } 567100966Siwasaki 568100966Siwasaki Node = AcpiNsMapHandleToNode (ObjHandle); 569100966Siwasaki Status = AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE); 570100966Siwasaki if (ACPI_FAILURE (Status)) 571100966Siwasaki { 572100966Siwasaki return (Status); 573100966Siwasaki } 574100966Siwasaki 575100966Siwasaki if (!Node) 576100966Siwasaki { 577100966Siwasaki return (AE_BAD_PARAMETER); 578100966Siwasaki } 579100966Siwasaki 580117521Snjl /* Run _STA to determine if device is present */ 581117521Snjl 582100966Siwasaki Status = AcpiUtExecute_STA (Node, &Flags); 583100966Siwasaki if (ACPI_FAILURE (Status)) 584100966Siwasaki { 585100966Siwasaki return (AE_CTRL_DEPTH); 586100966Siwasaki } 587100966Siwasaki 588167802Sjkim if (!(Flags & ACPI_STA_DEVICE_PRESENT)) 589100966Siwasaki { 590167802Sjkim /* Don't examine children of the device if not present */ 591117521Snjl 592100966Siwasaki return (AE_CTRL_DEPTH); 593100966Siwasaki } 594100966Siwasaki 595117521Snjl /* Filter based on device HID & CID */ 596117521Snjl 597100966Siwasaki if (Info->Hid != NULL) 598100966Siwasaki { 599100966Siwasaki Status = AcpiUtExecute_HID (Node, &Hid); 600100966Siwasaki if (Status == AE_NOT_FOUND) 601100966Siwasaki { 602100966Siwasaki return (AE_OK); 603100966Siwasaki } 604100966Siwasaki else if (ACPI_FAILURE (Status)) 605100966Siwasaki { 606100966Siwasaki return (AE_CTRL_DEPTH); 607100966Siwasaki } 608100966Siwasaki 609117521Snjl if (ACPI_STRNCMP (Hid.Value, Info->Hid, sizeof (Hid.Value)) != 0) 610100966Siwasaki { 611117521Snjl /* Get the list of Compatible IDs */ 612117521Snjl 613100966Siwasaki Status = AcpiUtExecute_CID (Node, &Cid); 614100966Siwasaki if (Status == AE_NOT_FOUND) 615100966Siwasaki { 616100966Siwasaki return (AE_OK); 617100966Siwasaki } 618100966Siwasaki else if (ACPI_FAILURE (Status)) 619100966Siwasaki { 620100966Siwasaki return (AE_CTRL_DEPTH); 621100966Siwasaki } 622100966Siwasaki 623117521Snjl /* Walk the CID list */ 624100966Siwasaki 625117521Snjl for (i = 0; i < Cid->Count; i++) 626100966Siwasaki { 627117521Snjl if (ACPI_STRNCMP (Cid->Id[i].Value, Info->Hid, 628117521Snjl sizeof (ACPI_COMPATIBLE_ID)) != 0) 629117521Snjl { 630167802Sjkim ACPI_FREE (Cid); 631117521Snjl return (AE_OK); 632117521Snjl } 633100966Siwasaki } 634167802Sjkim ACPI_FREE (Cid); 635100966Siwasaki } 636100966Siwasaki } 637100966Siwasaki 638151937Sjkim Status = Info->UserFunction (ObjHandle, NestingLevel, Info->Context, 639151937Sjkim ReturnValue); 640100966Siwasaki return (Status); 641100966Siwasaki} 642100966Siwasaki 643100966Siwasaki 644100966Siwasaki/******************************************************************************* 645100966Siwasaki * 646100966Siwasaki * FUNCTION: AcpiGetDevices 647100966Siwasaki * 648100966Siwasaki * PARAMETERS: HID - HID to search for. Can be NULL. 649100966Siwasaki * UserFunction - Called when a matching object is found 650100966Siwasaki * Context - Passed to user function 651100966Siwasaki * ReturnValue - Location where return value of 652100966Siwasaki * UserFunction is put if terminated early 653100966Siwasaki * 654100966Siwasaki * RETURNS Return value from the UserFunction if terminated early. 655100966Siwasaki * Otherwise, returns NULL. 656100966Siwasaki * 657100966Siwasaki * DESCRIPTION: Performs a modified depth-first walk of the namespace tree, 658100966Siwasaki * starting (and ending) at the object specified by StartHandle. 659117521Snjl * The UserFunction is called whenever an object of type 660117521Snjl * Device is found. If the user function returns 661100966Siwasaki * a non-zero value, the search is terminated immediately and this 662100966Siwasaki * value is returned to the caller. 663100966Siwasaki * 664100966Siwasaki * This is a wrapper for WalkNamespace, but the callback performs 665100966Siwasaki * additional filtering. Please see AcpiGetDeviceCallback. 666100966Siwasaki * 667100966Siwasaki ******************************************************************************/ 668100966Siwasaki 669100966SiwasakiACPI_STATUS 670100966SiwasakiAcpiGetDevices ( 671114237Snjl char *HID, 672100966Siwasaki ACPI_WALK_CALLBACK UserFunction, 673100966Siwasaki void *Context, 674100966Siwasaki void **ReturnValue) 675100966Siwasaki{ 676100966Siwasaki ACPI_STATUS Status; 677100966Siwasaki ACPI_GET_DEVICES_INFO Info; 678100966Siwasaki 679100966Siwasaki 680167802Sjkim ACPI_FUNCTION_TRACE (AcpiGetDevices); 681100966Siwasaki 682100966Siwasaki 683100966Siwasaki /* Parameter validation */ 684100966Siwasaki 685100966Siwasaki if (!UserFunction) 686100966Siwasaki { 687100966Siwasaki return_ACPI_STATUS (AE_BAD_PARAMETER); 688100966Siwasaki } 689100966Siwasaki 690100966Siwasaki /* 691100966Siwasaki * We're going to call their callback from OUR callback, so we need 692100966Siwasaki * to know what it is, and their context parameter. 693100966Siwasaki */ 694167802Sjkim Info.Hid = HID; 695100966Siwasaki Info.Context = Context; 696100966Siwasaki Info.UserFunction = UserFunction; 697100966Siwasaki 698100966Siwasaki /* 699100966Siwasaki * Lock the namespace around the walk. 700100966Siwasaki * The namespace will be unlocked/locked around each call 701100966Siwasaki * to the user function - since this function 702100966Siwasaki * must be allowed to make Acpi calls itself. 703100966Siwasaki */ 704100966Siwasaki Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE); 705100966Siwasaki if (ACPI_FAILURE (Status)) 706100966Siwasaki { 707100966Siwasaki return_ACPI_STATUS (Status); 708100966Siwasaki } 709100966Siwasaki 710167802Sjkim Status = AcpiNsWalkNamespace (ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT, 711167802Sjkim ACPI_UINT32_MAX, ACPI_NS_WALK_UNLOCK, 712167802Sjkim AcpiNsGetDeviceCallback, &Info, ReturnValue); 713100966Siwasaki 714100966Siwasaki (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE); 715100966Siwasaki return_ACPI_STATUS (Status); 716100966Siwasaki} 717100966Siwasaki 718167802SjkimACPI_EXPORT_SYMBOL (AcpiGetDevices) 719100966Siwasaki 720167802Sjkim 721100966Siwasaki/******************************************************************************* 722100966Siwasaki * 723100966Siwasaki * FUNCTION: AcpiAttachData 724100966Siwasaki * 725114237Snjl * PARAMETERS: ObjHandle - Namespace node 726107325Siwasaki * Handler - Handler for this attachment 727107325Siwasaki * Data - Pointer to data to be attached 728100966Siwasaki * 729100966Siwasaki * RETURN: Status 730100966Siwasaki * 731107325Siwasaki * DESCRIPTION: Attach arbitrary data and handler to a namespace node. 732100966Siwasaki * 733100966Siwasaki ******************************************************************************/ 734100966Siwasaki 735100966SiwasakiACPI_STATUS 736100966SiwasakiAcpiAttachData ( 737100966Siwasaki ACPI_HANDLE ObjHandle, 738100966Siwasaki ACPI_OBJECT_HANDLER Handler, 739100966Siwasaki void *Data) 740100966Siwasaki{ 741100966Siwasaki ACPI_NAMESPACE_NODE *Node; 742100966Siwasaki ACPI_STATUS Status; 743100966Siwasaki 744100966Siwasaki 745100966Siwasaki /* Parameter validation */ 746100966Siwasaki 747100966Siwasaki if (!ObjHandle || 748100966Siwasaki !Handler || 749100966Siwasaki !Data) 750100966Siwasaki { 751100966Siwasaki return (AE_BAD_PARAMETER); 752100966Siwasaki } 753100966Siwasaki 754100966Siwasaki Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE); 755100966Siwasaki if (ACPI_FAILURE (Status)) 756100966Siwasaki { 757100966Siwasaki return (Status); 758100966Siwasaki } 759100966Siwasaki 760100966Siwasaki /* Convert and validate the handle */ 761100966Siwasaki 762100966Siwasaki Node = AcpiNsMapHandleToNode (ObjHandle); 763100966Siwasaki if (!Node) 764100966Siwasaki { 765100966Siwasaki Status = AE_BAD_PARAMETER; 766100966Siwasaki goto UnlockAndExit; 767100966Siwasaki } 768100966Siwasaki 769100966Siwasaki Status = AcpiNsAttachData (Node, Handler, Data); 770100966Siwasaki 771100966SiwasakiUnlockAndExit: 772100966Siwasaki (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE); 773100966Siwasaki return (Status); 774100966Siwasaki} 775100966Siwasaki 776167802SjkimACPI_EXPORT_SYMBOL (AcpiAttachData) 777100966Siwasaki 778167802Sjkim 779100966Siwasaki/******************************************************************************* 780100966Siwasaki * 781100966Siwasaki * FUNCTION: AcpiDetachData 782100966Siwasaki * 783107325Siwasaki * PARAMETERS: ObjHandle - Namespace node handle 784107325Siwasaki * Handler - Handler used in call to AcpiAttachData 785100966Siwasaki * 786100966Siwasaki * RETURN: Status 787100966Siwasaki * 788107325Siwasaki * DESCRIPTION: Remove data that was previously attached to a node. 789100966Siwasaki * 790100966Siwasaki ******************************************************************************/ 791100966Siwasaki 792100966SiwasakiACPI_STATUS 793100966SiwasakiAcpiDetachData ( 794100966Siwasaki ACPI_HANDLE ObjHandle, 795100966Siwasaki ACPI_OBJECT_HANDLER Handler) 796100966Siwasaki{ 797100966Siwasaki ACPI_NAMESPACE_NODE *Node; 798100966Siwasaki ACPI_STATUS Status; 799100966Siwasaki 800100966Siwasaki 801100966Siwasaki /* Parameter validation */ 802100966Siwasaki 803100966Siwasaki if (!ObjHandle || 804100966Siwasaki !Handler) 805100966Siwasaki { 806100966Siwasaki return (AE_BAD_PARAMETER); 807100966Siwasaki } 808100966Siwasaki 809100966Siwasaki Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE); 810100966Siwasaki if (ACPI_FAILURE (Status)) 811100966Siwasaki { 812100966Siwasaki return (Status); 813100966Siwasaki } 814100966Siwasaki 815100966Siwasaki /* Convert and validate the handle */ 816100966Siwasaki 817100966Siwasaki Node = AcpiNsMapHandleToNode (ObjHandle); 818100966Siwasaki if (!Node) 819100966Siwasaki { 820100966Siwasaki Status = AE_BAD_PARAMETER; 821100966Siwasaki goto UnlockAndExit; 822100966Siwasaki } 823100966Siwasaki 824100966Siwasaki Status = AcpiNsDetachData (Node, Handler); 825100966Siwasaki 826100966SiwasakiUnlockAndExit: 827100966Siwasaki (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE); 828100966Siwasaki return (Status); 829100966Siwasaki} 830100966Siwasaki 831167802SjkimACPI_EXPORT_SYMBOL (AcpiDetachData) 832100966Siwasaki 833167802Sjkim 834100966Siwasaki/******************************************************************************* 835100966Siwasaki * 836100966Siwasaki * FUNCTION: AcpiGetData 837100966Siwasaki * 838107325Siwasaki * PARAMETERS: ObjHandle - Namespace node 839107325Siwasaki * Handler - Handler used in call to AttachData 840107325Siwasaki * Data - Where the data is returned 841100966Siwasaki * 842100966Siwasaki * RETURN: Status 843100966Siwasaki * 844107325Siwasaki * DESCRIPTION: Retrieve data that was previously attached to a namespace node. 845100966Siwasaki * 846100966Siwasaki ******************************************************************************/ 847100966Siwasaki 848100966SiwasakiACPI_STATUS 849100966SiwasakiAcpiGetData ( 850100966Siwasaki ACPI_HANDLE ObjHandle, 851100966Siwasaki ACPI_OBJECT_HANDLER Handler, 852100966Siwasaki void **Data) 853100966Siwasaki{ 854100966Siwasaki ACPI_NAMESPACE_NODE *Node; 855100966Siwasaki ACPI_STATUS Status; 856100966Siwasaki 857100966Siwasaki 858100966Siwasaki /* Parameter validation */ 859100966Siwasaki 860100966Siwasaki if (!ObjHandle || 861100966Siwasaki !Handler || 862100966Siwasaki !Data) 863100966Siwasaki { 864100966Siwasaki return (AE_BAD_PARAMETER); 865100966Siwasaki } 866100966Siwasaki 867100966Siwasaki Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE); 868100966Siwasaki if (ACPI_FAILURE (Status)) 869100966Siwasaki { 870100966Siwasaki return (Status); 871100966Siwasaki } 872100966Siwasaki 873100966Siwasaki /* Convert and validate the handle */ 874100966Siwasaki 875100966Siwasaki Node = AcpiNsMapHandleToNode (ObjHandle); 876100966Siwasaki if (!Node) 877100966Siwasaki { 878100966Siwasaki Status = AE_BAD_PARAMETER; 879100966Siwasaki goto UnlockAndExit; 880100966Siwasaki } 881100966Siwasaki 882100966Siwasaki Status = AcpiNsGetAttachedData (Node, Handler, Data); 883100966Siwasaki 884100966SiwasakiUnlockAndExit: 885100966Siwasaki (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE); 886100966Siwasaki return (Status); 887100966Siwasaki} 888100966Siwasaki 889167802SjkimACPI_EXPORT_SYMBOL (AcpiGetData) 890100966Siwasaki 891167802Sjkim 892