Print this page
acpica-unix2-20130823
PANKOVs restructure
   1 /*******************************************************************************
   2  *
   3  * Module Name: nsaccess - Top-level functions for accessing ACPI namespace
   4  *
   5  ******************************************************************************/
   6 
   7 /*
   8  * Copyright (C) 2000 - 2011, 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.


 104      */
 105     AcpiGbl_RootNode = &AcpiGbl_RootNodeStruct;
 106 
 107     /* Enter the pre-defined names in the name table */
 108 
 109     ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
 110         "Entering predefined entries into namespace\n"));
 111 
 112     for (InitVal = AcpiGbl_PreDefinedNames; InitVal->Name; InitVal++)
 113     {
 114         /* _OSI is optional for now, will be permanent later */
 115 
 116         if (!ACPI_STRCMP (InitVal->Name, "_OSI") && !AcpiGbl_CreateOsiMethod)
 117         {
 118             continue;
 119         }
 120 
 121         Status = AcpiNsLookup (NULL, InitVal->Name, InitVal->Type,
 122                         ACPI_IMODE_LOAD_PASS2, ACPI_NS_NO_UPSEARCH,
 123                         NULL, &NewNode);
 124 
 125         if (ACPI_FAILURE (Status) || (!NewNode)) /* Must be on same line for code converter */
 126         {
 127             ACPI_EXCEPTION ((AE_INFO, Status,
 128                 "Could not create predefined name %s",
 129                 InitVal->Name));

 130         }
 131 
 132         /*
 133          * Name entered successfully. If entry in PreDefinedNames[] specifies
 134          * an initial value, create the initial value.
 135          */
 136         if (InitVal->Val)
 137         {
 138             Status = AcpiOsPredefinedOverride (InitVal, &Val);
 139             if (ACPI_FAILURE (Status))
 140             {
 141                 ACPI_ERROR ((AE_INFO,
 142                     "Could not override predefined %s",
 143                     InitVal->Name));
 144             }
 145 
 146             if (!Val)
 147             {
 148                 Val = InitVal->Val;
 149             }
 150 
 151             /*
 152              * Entry requests an initial value, allocate a
 153              * descriptor for it.
 154              */
 155             ObjDesc = AcpiUtCreateInternalObject (InitVal->Type);
 156             if (!ObjDesc)
 157             {
 158                 Status = AE_NO_MEMORY;
 159                 goto UnlockAndExit;
 160             }
 161 
 162             /*
 163              * Convert value string from table entry to
 164              * internal representation. Only types actually
 165              * used for initial values are implemented here.
 166              */
 167             switch (InitVal->Type)
 168             {
 169             case ACPI_TYPE_METHOD:

 170                 ObjDesc->Method.ParamCount = (UINT8) ACPI_TO_INTEGER (Val);
 171                 ObjDesc->Common.Flags |= AOPOBJ_DATA_VALID;
 172 
 173 #if defined (ACPI_ASL_COMPILER)
 174 
 175                 /* Save the parameter count for the iASL compiler */
 176 
 177                 NewNode->Value = ObjDesc->Method.ParamCount;
 178 #else
 179                 /* Mark this as a very SPECIAL method */
 180 
 181                 ObjDesc->Method.InfoFlags = ACPI_METHOD_INTERNAL_ONLY;
 182                 ObjDesc->Method.Dispatch.Implementation = AcpiUtOsiImplementation;
 183 #endif
 184                 break;
 185 
 186             case ACPI_TYPE_INTEGER:
 187 
 188                 ObjDesc->Integer.Value = ACPI_TO_INTEGER (Val);
 189                 break;
 190 
 191 
 192             case ACPI_TYPE_STRING:
 193 
 194                 /* Build an object around the static string */
 195 
 196                 ObjDesc->String.Length = (UINT32) ACPI_STRLEN (Val);
 197                 ObjDesc->String.Pointer = Val;
 198                 ObjDesc->Common.Flags |= AOPOBJ_STATIC_POINTER;
 199                 break;
 200 
 201 
 202             case ACPI_TYPE_MUTEX:
 203 
 204                 ObjDesc->Mutex.Node = NewNode;
 205                 ObjDesc->Mutex.SyncLevel = (UINT8) (ACPI_TO_INTEGER (Val) - 1);
 206 
 207                 /* Create a mutex */
 208 
 209                 Status = AcpiOsCreateMutex (&ObjDesc->Mutex.OsMutex);
 210                 if (ACPI_FAILURE (Status))
 211                 {
 212                     AcpiUtRemoveReference (ObjDesc);
 213                     goto UnlockAndExit;
 214                 }
 215 
 216                 /* Special case for ACPI Global Lock */
 217 
 218                 if (ACPI_STRCMP (InitVal->Name, "_GL_") == 0)
 219                 {
 220                     AcpiGbl_GlobalLockMutex = ObjDesc;
 221 
 222                     /* Create additional counting semaphore for global lock */
 223 
 224                     Status = AcpiOsCreateSemaphore (
 225                                 1, 0, &AcpiGbl_GlobalLockSemaphore);
 226                     if (ACPI_FAILURE (Status))
 227                     {
 228                         AcpiUtRemoveReference (ObjDesc);
 229                         goto UnlockAndExit;
 230                     }
 231                 }
 232                 break;
 233 
 234 
 235             default:
 236 
 237                 ACPI_ERROR ((AE_INFO, "Unsupported initial type value 0x%X",
 238                     InitVal->Type));
 239                 AcpiUtRemoveReference (ObjDesc);
 240                 ObjDesc = NULL;
 241                 continue;
 242             }
 243 
 244             /* Store pointer to value descriptor in the Node */
 245 
 246             Status = AcpiNsAttachObject (NewNode, ObjDesc,
 247                         ObjDesc->Common.Type);
 248 
 249             /* Remove local reference to the object */
 250 
 251             AcpiUtRemoveReference (ObjDesc);
 252         }
 253     }
 254 


 433             {
 434                 /* Name is fully qualified, no search rules apply */
 435 
 436                 SearchParentFlag = ACPI_NS_NO_UPSEARCH;
 437 
 438                 /*
 439                  * Point past this prefix to the name segment
 440                  * part or the next Parent Prefix
 441                  */
 442                 Path++;
 443 
 444                 /* Backup to the parent node */
 445 
 446                 NumCarats++;
 447                 ThisNode = ThisNode->Parent;
 448                 if (!ThisNode)
 449                 {
 450                     /* Current scope has no parent scope */
 451 
 452                     ACPI_ERROR ((AE_INFO,
 453                         "ACPI path has too many parent prefixes (^) "
 454                         "- reached beyond root node"));
 455                     return_ACPI_STATUS (AE_NOT_FOUND);
 456                 }
 457             }
 458 
 459             if (SearchParentFlag == ACPI_NS_NO_UPSEARCH)
 460             {
 461                 ACPI_DEBUG_PRINT ((ACPI_DB_NAMES,
 462                     "Search scope is [%4.4s], path has %u carat(s)\n",
 463                     AcpiUtGetNodeName (ThisNode), NumCarats));
 464             }
 465         }
 466 
 467         /*
 468          * Determine the number of ACPI name segments in this pathname.
 469          *
 470          * The segment part consists of either:
 471          *  - A Null name segment (0)
 472          *  - A DualNamePrefix followed by two 4-byte name segments
 473          *  - A MultiNamePrefix followed by a byte indicating the
 474          *      number of segments and the segments themselves.


 680 
 681     if (!(Flags & ACPI_NS_DONT_OPEN_SCOPE) && (WalkState))
 682     {
 683         /*
 684          * If entry is a type which opens a scope, push the new scope on the
 685          * scope stack.
 686          */
 687         if (AcpiNsOpensScope (Type))
 688         {
 689             Status = AcpiDsScopeStackPush (ThisNode, Type, WalkState);
 690             if (ACPI_FAILURE (Status))
 691             {
 692                 return_ACPI_STATUS (Status);
 693             }
 694         }
 695     }
 696 
 697     *ReturnNode = ThisNode;
 698     return_ACPI_STATUS (AE_OK);
 699 }
 700 
   1 /*******************************************************************************
   2  *
   3  * Module Name: nsaccess - Top-level functions for accessing ACPI namespace
   4  *
   5  ******************************************************************************/
   6 
   7 /*
   8  * Copyright (C) 2000 - 2013, 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.


 104      */
 105     AcpiGbl_RootNode = &AcpiGbl_RootNodeStruct;
 106 
 107     /* Enter the pre-defined names in the name table */
 108 
 109     ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
 110         "Entering predefined entries into namespace\n"));
 111 
 112     for (InitVal = AcpiGbl_PreDefinedNames; InitVal->Name; InitVal++)
 113     {
 114         /* _OSI is optional for now, will be permanent later */
 115 
 116         if (!ACPI_STRCMP (InitVal->Name, "_OSI") && !AcpiGbl_CreateOsiMethod)
 117         {
 118             continue;
 119         }
 120 
 121         Status = AcpiNsLookup (NULL, InitVal->Name, InitVal->Type,
 122                         ACPI_IMODE_LOAD_PASS2, ACPI_NS_NO_UPSEARCH,
 123                         NULL, &NewNode);
 124         if (ACPI_FAILURE (Status))

 125         {
 126             ACPI_EXCEPTION ((AE_INFO, Status,
 127                 "Could not create predefined name %s",
 128                 InitVal->Name));
 129             continue;
 130         }
 131 
 132         /*
 133          * Name entered successfully. If entry in PreDefinedNames[] specifies
 134          * an initial value, create the initial value.
 135          */
 136         if (InitVal->Val)
 137         {
 138             Status = AcpiOsPredefinedOverride (InitVal, &Val);
 139             if (ACPI_FAILURE (Status))
 140             {
 141                 ACPI_ERROR ((AE_INFO,
 142                     "Could not override predefined %s",
 143                     InitVal->Name));
 144             }
 145 
 146             if (!Val)
 147             {
 148                 Val = InitVal->Val;
 149             }
 150 
 151             /*
 152              * Entry requests an initial value, allocate a
 153              * descriptor for it.
 154              */
 155             ObjDesc = AcpiUtCreateInternalObject (InitVal->Type);
 156             if (!ObjDesc)
 157             {
 158                 Status = AE_NO_MEMORY;
 159                 goto UnlockAndExit;
 160             }
 161 
 162             /*
 163              * Convert value string from table entry to
 164              * internal representation. Only types actually
 165              * used for initial values are implemented here.
 166              */
 167             switch (InitVal->Type)
 168             {
 169             case ACPI_TYPE_METHOD:
 170 
 171                 ObjDesc->Method.ParamCount = (UINT8) ACPI_TO_INTEGER (Val);
 172                 ObjDesc->Common.Flags |= AOPOBJ_DATA_VALID;
 173 
 174 #if defined (ACPI_ASL_COMPILER)
 175 
 176                 /* Save the parameter count for the iASL compiler */
 177 
 178                 NewNode->Value = ObjDesc->Method.ParamCount;
 179 #else
 180                 /* Mark this as a very SPECIAL method */
 181 
 182                 ObjDesc->Method.InfoFlags = ACPI_METHOD_INTERNAL_ONLY;
 183                 ObjDesc->Method.Dispatch.Implementation = AcpiUtOsiImplementation;
 184 #endif
 185                 break;
 186 
 187             case ACPI_TYPE_INTEGER:
 188 
 189                 ObjDesc->Integer.Value = ACPI_TO_INTEGER (Val);
 190                 break;
 191 

 192             case ACPI_TYPE_STRING:
 193 
 194                 /* Build an object around the static string */
 195 
 196                 ObjDesc->String.Length = (UINT32) ACPI_STRLEN (Val);
 197                 ObjDesc->String.Pointer = Val;
 198                 ObjDesc->Common.Flags |= AOPOBJ_STATIC_POINTER;
 199                 break;
 200 

 201             case ACPI_TYPE_MUTEX:
 202 
 203                 ObjDesc->Mutex.Node = NewNode;
 204                 ObjDesc->Mutex.SyncLevel = (UINT8) (ACPI_TO_INTEGER (Val) - 1);
 205 
 206                 /* Create a mutex */
 207 
 208                 Status = AcpiOsCreateMutex (&ObjDesc->Mutex.OsMutex);
 209                 if (ACPI_FAILURE (Status))
 210                 {
 211                     AcpiUtRemoveReference (ObjDesc);
 212                     goto UnlockAndExit;
 213                 }
 214 
 215                 /* Special case for ACPI Global Lock */
 216 
 217                 if (ACPI_STRCMP (InitVal->Name, "_GL_") == 0)
 218                 {
 219                     AcpiGbl_GlobalLockMutex = ObjDesc;
 220 
 221                     /* Create additional counting semaphore for global lock */
 222 
 223                     Status = AcpiOsCreateSemaphore (
 224                                 1, 0, &AcpiGbl_GlobalLockSemaphore);
 225                     if (ACPI_FAILURE (Status))
 226                     {
 227                         AcpiUtRemoveReference (ObjDesc);
 228                         goto UnlockAndExit;
 229                     }
 230                 }
 231                 break;
 232 

 233             default:
 234 
 235                 ACPI_ERROR ((AE_INFO, "Unsupported initial type value 0x%X",
 236                     InitVal->Type));
 237                 AcpiUtRemoveReference (ObjDesc);
 238                 ObjDesc = NULL;
 239                 continue;
 240             }
 241 
 242             /* Store pointer to value descriptor in the Node */
 243 
 244             Status = AcpiNsAttachObject (NewNode, ObjDesc,
 245                         ObjDesc->Common.Type);
 246 
 247             /* Remove local reference to the object */
 248 
 249             AcpiUtRemoveReference (ObjDesc);
 250         }
 251     }
 252 


 431             {
 432                 /* Name is fully qualified, no search rules apply */
 433 
 434                 SearchParentFlag = ACPI_NS_NO_UPSEARCH;
 435 
 436                 /*
 437                  * Point past this prefix to the name segment
 438                  * part or the next Parent Prefix
 439                  */
 440                 Path++;
 441 
 442                 /* Backup to the parent node */
 443 
 444                 NumCarats++;
 445                 ThisNode = ThisNode->Parent;
 446                 if (!ThisNode)
 447                 {
 448                     /* Current scope has no parent scope */
 449 
 450                     ACPI_ERROR ((AE_INFO,
 451                         "%s: Path has too many parent prefixes (^) "
 452                         "- reached beyond root node", Pathname));
 453                     return_ACPI_STATUS (AE_NOT_FOUND);
 454                 }
 455             }
 456 
 457             if (SearchParentFlag == ACPI_NS_NO_UPSEARCH)
 458             {
 459                 ACPI_DEBUG_PRINT ((ACPI_DB_NAMES,
 460                     "Search scope is [%4.4s], path has %u carat(s)\n",
 461                     AcpiUtGetNodeName (ThisNode), NumCarats));
 462             }
 463         }
 464 
 465         /*
 466          * Determine the number of ACPI name segments in this pathname.
 467          *
 468          * The segment part consists of either:
 469          *  - A Null name segment (0)
 470          *  - A DualNamePrefix followed by two 4-byte name segments
 471          *  - A MultiNamePrefix followed by a byte indicating the
 472          *      number of segments and the segments themselves.


 678 
 679     if (!(Flags & ACPI_NS_DONT_OPEN_SCOPE) && (WalkState))
 680     {
 681         /*
 682          * If entry is a type which opens a scope, push the new scope on the
 683          * scope stack.
 684          */
 685         if (AcpiNsOpensScope (Type))
 686         {
 687             Status = AcpiDsScopeStackPush (ThisNode, Type, WalkState);
 688             if (ACPI_FAILURE (Status))
 689             {
 690                 return_ACPI_STATUS (Status);
 691             }
 692         }
 693     }
 694 
 695     *ReturnNode = ThisNode;
 696     return_ACPI_STATUS (AE_OK);
 697 }