1 1.1 jruoho /****************************************************************************** 2 1.1 jruoho * 3 1.1 jruoho * Module Name: evxfgpe - External Interfaces for General Purpose Events (GPEs) 4 1.1 jruoho * 5 1.1 jruoho *****************************************************************************/ 6 1.1 jruoho 7 1.1.1.17 christos /****************************************************************************** 8 1.1.1.17 christos * 9 1.1.1.17 christos * 1. Copyright Notice 10 1.1.1.17 christos * 11 1.1.1.18 christos * Some or all of this work - Copyright (c) 1999 - 2025, Intel Corp. 12 1.1 jruoho * All rights reserved. 13 1.1 jruoho * 14 1.1.1.17 christos * 2. License 15 1.1.1.17 christos * 16 1.1.1.17 christos * 2.1. This is your license from Intel Corp. under its intellectual property 17 1.1.1.17 christos * rights. You may have additional license terms from the party that provided 18 1.1.1.17 christos * you this software, covering your right to use that party's intellectual 19 1.1.1.17 christos * property rights. 20 1.1.1.17 christos * 21 1.1.1.17 christos * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a 22 1.1.1.17 christos * copy of the source code appearing in this file ("Covered Code") an 23 1.1.1.17 christos * irrevocable, perpetual, worldwide license under Intel's copyrights in the 24 1.1.1.17 christos * base code distributed originally by Intel ("Original Intel Code") to copy, 25 1.1.1.17 christos * make derivatives, distribute, use and display any portion of the Covered 26 1.1.1.17 christos * Code in any form, with the right to sublicense such rights; and 27 1.1.1.17 christos * 28 1.1.1.17 christos * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent 29 1.1.1.17 christos * license (with the right to sublicense), under only those claims of Intel 30 1.1.1.17 christos * patents that are infringed by the Original Intel Code, to make, use, sell, 31 1.1.1.17 christos * offer to sell, and import the Covered Code and derivative works thereof 32 1.1.1.17 christos * solely to the minimum extent necessary to exercise the above copyright 33 1.1.1.17 christos * license, and in no event shall the patent license extend to any additions 34 1.1.1.17 christos * to or modifications of the Original Intel Code. No other license or right 35 1.1.1.17 christos * is granted directly or by implication, estoppel or otherwise; 36 1.1.1.17 christos * 37 1.1.1.17 christos * The above copyright and patent license is granted only if the following 38 1.1.1.17 christos * conditions are met: 39 1.1.1.17 christos * 40 1.1.1.17 christos * 3. Conditions 41 1.1.1.17 christos * 42 1.1.1.17 christos * 3.1. Redistribution of Source with Rights to Further Distribute Source. 43 1.1.1.17 christos * Redistribution of source code of any substantial portion of the Covered 44 1.1.1.17 christos * Code or modification with rights to further distribute source must include 45 1.1.1.17 christos * the above Copyright Notice, the above License, this list of Conditions, 46 1.1.1.17 christos * and the following Disclaimer and Export Compliance provision. In addition, 47 1.1.1.17 christos * Licensee must cause all Covered Code to which Licensee contributes to 48 1.1.1.17 christos * contain a file documenting the changes Licensee made to create that Covered 49 1.1.1.17 christos * Code and the date of any change. Licensee must include in that file the 50 1.1.1.17 christos * documentation of any changes made by any predecessor Licensee. Licensee 51 1.1.1.17 christos * must include a prominent statement that the modification is derived, 52 1.1.1.17 christos * directly or indirectly, from Original Intel Code. 53 1.1.1.17 christos * 54 1.1.1.17 christos * 3.2. Redistribution of Source with no Rights to Further Distribute Source. 55 1.1.1.17 christos * Redistribution of source code of any substantial portion of the Covered 56 1.1.1.17 christos * Code or modification without rights to further distribute source must 57 1.1.1.17 christos * include the following Disclaimer and Export Compliance provision in the 58 1.1.1.17 christos * documentation and/or other materials provided with distribution. In 59 1.1.1.17 christos * addition, Licensee may not authorize further sublicense of source of any 60 1.1.1.17 christos * portion of the Covered Code, and must include terms to the effect that the 61 1.1.1.17 christos * license from Licensee to its licensee is limited to the intellectual 62 1.1.1.17 christos * property embodied in the software Licensee provides to its licensee, and 63 1.1.1.17 christos * not to intellectual property embodied in modifications its licensee may 64 1.1.1.17 christos * make. 65 1.1.1.17 christos * 66 1.1.1.17 christos * 3.3. Redistribution of Executable. Redistribution in executable form of any 67 1.1.1.17 christos * substantial portion of the Covered Code or modification must reproduce the 68 1.1.1.17 christos * above Copyright Notice, and the following Disclaimer and Export Compliance 69 1.1.1.17 christos * provision in the documentation and/or other materials provided with the 70 1.1.1.17 christos * distribution. 71 1.1.1.17 christos * 72 1.1.1.17 christos * 3.4. Intel retains all right, title, and interest in and to the Original 73 1.1.1.17 christos * Intel Code. 74 1.1.1.17 christos * 75 1.1.1.17 christos * 3.5. Neither the name Intel nor any other trademark owned or controlled by 76 1.1.1.17 christos * Intel shall be used in advertising or otherwise to promote the sale, use or 77 1.1.1.17 christos * other dealings in products derived from or relating to the Covered Code 78 1.1.1.17 christos * without prior written authorization from Intel. 79 1.1.1.17 christos * 80 1.1.1.17 christos * 4. Disclaimer and Export Compliance 81 1.1.1.17 christos * 82 1.1.1.17 christos * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED 83 1.1.1.17 christos * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE 84 1.1.1.17 christos * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, 85 1.1.1.17 christos * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY 86 1.1.1.17 christos * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY 87 1.1.1.17 christos * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A 88 1.1.1.17 christos * PARTICULAR PURPOSE. 89 1.1.1.17 christos * 90 1.1.1.17 christos * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES 91 1.1.1.17 christos * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR 92 1.1.1.17 christos * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, 93 1.1.1.17 christos * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY 94 1.1.1.17 christos * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL 95 1.1.1.17 christos * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS 96 1.1.1.17 christos * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY 97 1.1.1.17 christos * LIMITED REMEDY. 98 1.1.1.17 christos * 99 1.1.1.17 christos * 4.3. Licensee shall not export, either directly or indirectly, any of this 100 1.1.1.17 christos * software or system incorporating such software without first obtaining any 101 1.1.1.17 christos * required license or other approval from the U. S. Department of Commerce or 102 1.1.1.17 christos * any other agency or department of the United States Government. In the 103 1.1.1.17 christos * event Licensee exports any such software from the United States or 104 1.1.1.17 christos * re-exports any such software from a foreign destination, Licensee shall 105 1.1.1.17 christos * ensure that the distribution and export/re-export of the software is in 106 1.1.1.17 christos * compliance with all laws, regulations, orders, or other restrictions of the 107 1.1.1.17 christos * U.S. Export Administration Regulations. Licensee agrees that neither it nor 108 1.1.1.17 christos * any of its subsidiaries will export/re-export any technical data, process, 109 1.1.1.17 christos * software, or service, directly or indirectly, to any country for which the 110 1.1.1.17 christos * United States government or any agency thereof requires an export license, 111 1.1.1.17 christos * other governmental approval, or letter of assurance, without first obtaining 112 1.1.1.17 christos * such license, approval or letter. 113 1.1.1.17 christos * 114 1.1.1.17 christos ***************************************************************************** 115 1.1.1.17 christos * 116 1.1.1.17 christos * Alternatively, you may choose to be licensed under the terms of the 117 1.1.1.17 christos * following license: 118 1.1.1.17 christos * 119 1.1 jruoho * Redistribution and use in source and binary forms, with or without 120 1.1 jruoho * modification, are permitted provided that the following conditions 121 1.1 jruoho * are met: 122 1.1 jruoho * 1. Redistributions of source code must retain the above copyright 123 1.1 jruoho * notice, this list of conditions, and the following disclaimer, 124 1.1 jruoho * without modification. 125 1.1 jruoho * 2. Redistributions in binary form must reproduce at minimum a disclaimer 126 1.1 jruoho * substantially similar to the "NO WARRANTY" disclaimer below 127 1.1 jruoho * ("Disclaimer") and any redistribution must be conditioned upon 128 1.1 jruoho * including a substantially similar Disclaimer requirement for further 129 1.1 jruoho * binary redistribution. 130 1.1 jruoho * 3. Neither the names of the above-listed copyright holders nor the names 131 1.1 jruoho * of any contributors may be used to endorse or promote products derived 132 1.1 jruoho * from this software without specific prior written permission. 133 1.1 jruoho * 134 1.1 jruoho * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 135 1.1 jruoho * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 136 1.1.1.13 christos * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 137 1.1 jruoho * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 138 1.1.1.17 christos * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 139 1.1.1.17 christos * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 140 1.1.1.17 christos * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 141 1.1.1.17 christos * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 142 1.1.1.17 christos * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 143 1.1.1.17 christos * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 144 1.1.1.17 christos * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 145 1.1.1.17 christos * 146 1.1.1.17 christos * Alternatively, you may choose to be licensed under the terms of the 147 1.1.1.17 christos * GNU General Public License ("GPL") version 2 as published by the Free 148 1.1.1.17 christos * Software Foundation. 149 1.1.1.17 christos * 150 1.1.1.17 christos *****************************************************************************/ 151 1.1 jruoho 152 1.1.1.3 christos #define EXPORT_ACPI_INTERFACES 153 1.1 jruoho 154 1.1 jruoho #include "acpi.h" 155 1.1 jruoho #include "accommon.h" 156 1.1 jruoho #include "acevents.h" 157 1.1 jruoho #include "acnamesp.h" 158 1.1 jruoho 159 1.1 jruoho #define _COMPONENT ACPI_EVENTS 160 1.1 jruoho ACPI_MODULE_NAME ("evxfgpe") 161 1.1 jruoho 162 1.1 jruoho 163 1.1.1.3 christos #if (!ACPI_REDUCED_HARDWARE) /* Entire module */ 164 1.1 jruoho /******************************************************************************* 165 1.1 jruoho * 166 1.1 jruoho * FUNCTION: AcpiUpdateAllGpes 167 1.1 jruoho * 168 1.1 jruoho * PARAMETERS: None 169 1.1 jruoho * 170 1.1 jruoho * RETURN: Status 171 1.1 jruoho * 172 1.1 jruoho * DESCRIPTION: Complete GPE initialization and enable all GPEs that have 173 1.1 jruoho * associated _Lxx or _Exx methods and are not pointed to by any 174 1.1 jruoho * device _PRW methods (this indicates that these GPEs are 175 1.1 jruoho * generally intended for system or device wakeup. Such GPEs 176 1.1 jruoho * have to be enabled directly when the devices whose _PRW 177 1.1 jruoho * methods point to them are set up for wakeup signaling.) 178 1.1 jruoho * 179 1.1 jruoho * NOTE: Should be called after any GPEs are added to the system. Primarily, 180 1.1 jruoho * after the system _PRW methods have been run, but also after a GPE Block 181 1.1 jruoho * Device has been added or if any new GPE methods have been added via a 182 1.1 jruoho * dynamic table load. 183 1.1 jruoho * 184 1.1 jruoho ******************************************************************************/ 185 1.1 jruoho 186 1.1 jruoho ACPI_STATUS 187 1.1 jruoho AcpiUpdateAllGpes ( 188 1.1 jruoho void) 189 1.1 jruoho { 190 1.1 jruoho ACPI_STATUS Status; 191 1.1.1.9 christos BOOLEAN IsPollingNeeded = FALSE; 192 1.1 jruoho 193 1.1 jruoho 194 1.1.1.3 christos ACPI_FUNCTION_TRACE (AcpiUpdateAllGpes); 195 1.1 jruoho 196 1.1 jruoho 197 1.1 jruoho Status = AcpiUtAcquireMutex (ACPI_MTX_EVENTS); 198 1.1 jruoho if (ACPI_FAILURE (Status)) 199 1.1 jruoho { 200 1.1 jruoho return_ACPI_STATUS (Status); 201 1.1 jruoho } 202 1.1 jruoho 203 1.1 jruoho if (AcpiGbl_AllGpesInitialized) 204 1.1 jruoho { 205 1.1 jruoho goto UnlockAndExit; 206 1.1 jruoho } 207 1.1 jruoho 208 1.1.1.9 christos Status = AcpiEvWalkGpeList (AcpiEvInitializeGpeBlock, 209 1.1.1.9 christos &IsPollingNeeded); 210 1.1 jruoho if (ACPI_SUCCESS (Status)) 211 1.1 jruoho { 212 1.1 jruoho AcpiGbl_AllGpesInitialized = TRUE; 213 1.1 jruoho } 214 1.1 jruoho 215 1.1 jruoho UnlockAndExit: 216 1.1 jruoho (void) AcpiUtReleaseMutex (ACPI_MTX_EVENTS); 217 1.1.1.9 christos 218 1.1.1.9 christos if (IsPollingNeeded && AcpiGbl_AllGpesInitialized) 219 1.1.1.9 christos { 220 1.1.1.9 christos /* Poll GPEs to handle already triggered events */ 221 1.1.1.9 christos 222 1.1.1.9 christos AcpiEvGpeDetect (AcpiGbl_GpeXruptListHead); 223 1.1.1.9 christos } 224 1.1 jruoho return_ACPI_STATUS (Status); 225 1.1 jruoho } 226 1.1 jruoho 227 1.1 jruoho ACPI_EXPORT_SYMBOL (AcpiUpdateAllGpes) 228 1.1 jruoho 229 1.1 jruoho 230 1.1 jruoho /******************************************************************************* 231 1.1 jruoho * 232 1.1 jruoho * FUNCTION: AcpiEnableGpe 233 1.1 jruoho * 234 1.1 jruoho * PARAMETERS: GpeDevice - Parent GPE Device. NULL for GPE0/GPE1 235 1.1 jruoho * GpeNumber - GPE level within the GPE block 236 1.1 jruoho * 237 1.1 jruoho * RETURN: Status 238 1.1 jruoho * 239 1.1 jruoho * DESCRIPTION: Add a reference to a GPE. On the first reference, the GPE is 240 1.1 jruoho * hardware-enabled. 241 1.1 jruoho * 242 1.1 jruoho ******************************************************************************/ 243 1.1 jruoho 244 1.1 jruoho ACPI_STATUS 245 1.1 jruoho AcpiEnableGpe ( 246 1.1 jruoho ACPI_HANDLE GpeDevice, 247 1.1 jruoho UINT32 GpeNumber) 248 1.1 jruoho { 249 1.1 jruoho ACPI_STATUS Status = AE_BAD_PARAMETER; 250 1.1 jruoho ACPI_GPE_EVENT_INFO *GpeEventInfo; 251 1.1 jruoho ACPI_CPU_FLAGS Flags; 252 1.1 jruoho 253 1.1 jruoho 254 1.1 jruoho ACPI_FUNCTION_TRACE (AcpiEnableGpe); 255 1.1 jruoho 256 1.1 jruoho 257 1.1 jruoho Flags = AcpiOsAcquireLock (AcpiGbl_GpeLock); 258 1.1 jruoho 259 1.1.1.4 christos /* 260 1.1.1.4 christos * Ensure that we have a valid GPE number and that there is some way 261 1.1.1.4 christos * of handling the GPE (handler or a GPE method). In other words, we 262 1.1.1.4 christos * won't allow a valid GPE to be enabled if there is no way to handle it. 263 1.1.1.4 christos */ 264 1.1 jruoho GpeEventInfo = AcpiEvGetGpeEventInfo (GpeDevice, GpeNumber); 265 1.1 jruoho if (GpeEventInfo) 266 1.1 jruoho { 267 1.1.1.5 christos if (ACPI_GPE_DISPATCH_TYPE (GpeEventInfo->Flags) != 268 1.1.1.4 christos ACPI_GPE_DISPATCH_NONE) 269 1.1.1.4 christos { 270 1.1.1.11 christos Status = AcpiEvAddGpeReference (GpeEventInfo, TRUE); 271 1.1.1.9 christos if (ACPI_SUCCESS (Status) && 272 1.1.1.9 christos ACPI_GPE_IS_POLLING_NEEDED (GpeEventInfo)) 273 1.1.1.9 christos { 274 1.1.1.9 christos /* Poll edge-triggered GPEs to handle existing events */ 275 1.1.1.9 christos 276 1.1.1.9 christos AcpiOsReleaseLock (AcpiGbl_GpeLock, Flags); 277 1.1.1.9 christos (void) AcpiEvDetectGpe ( 278 1.1.1.9 christos GpeDevice, GpeEventInfo, GpeNumber); 279 1.1.1.9 christos Flags = AcpiOsAcquireLock (AcpiGbl_GpeLock); 280 1.1.1.9 christos } 281 1.1.1.4 christos } 282 1.1.1.4 christos else 283 1.1.1.4 christos { 284 1.1.1.4 christos Status = AE_NO_HANDLER; 285 1.1.1.4 christos } 286 1.1 jruoho } 287 1.1 jruoho 288 1.1 jruoho AcpiOsReleaseLock (AcpiGbl_GpeLock, Flags); 289 1.1 jruoho return_ACPI_STATUS (Status); 290 1.1 jruoho } 291 1.1 jruoho 292 1.1 jruoho ACPI_EXPORT_SYMBOL (AcpiEnableGpe) 293 1.1 jruoho 294 1.1 jruoho 295 1.1 jruoho /******************************************************************************* 296 1.1 jruoho * 297 1.1 jruoho * FUNCTION: AcpiDisableGpe 298 1.1 jruoho * 299 1.1 jruoho * PARAMETERS: GpeDevice - Parent GPE Device. NULL for GPE0/GPE1 300 1.1 jruoho * GpeNumber - GPE level within the GPE block 301 1.1 jruoho * 302 1.1 jruoho * RETURN: Status 303 1.1 jruoho * 304 1.1 jruoho * DESCRIPTION: Remove a reference to a GPE. When the last reference is 305 1.1 jruoho * removed, only then is the GPE disabled (for runtime GPEs), or 306 1.1 jruoho * the GPE mask bit disabled (for wake GPEs) 307 1.1 jruoho * 308 1.1 jruoho ******************************************************************************/ 309 1.1 jruoho 310 1.1 jruoho ACPI_STATUS 311 1.1 jruoho AcpiDisableGpe ( 312 1.1 jruoho ACPI_HANDLE GpeDevice, 313 1.1 jruoho UINT32 GpeNumber) 314 1.1 jruoho { 315 1.1 jruoho ACPI_STATUS Status = AE_BAD_PARAMETER; 316 1.1 jruoho ACPI_GPE_EVENT_INFO *GpeEventInfo; 317 1.1 jruoho ACPI_CPU_FLAGS Flags; 318 1.1 jruoho 319 1.1 jruoho 320 1.1 jruoho ACPI_FUNCTION_TRACE (AcpiDisableGpe); 321 1.1 jruoho 322 1.1 jruoho 323 1.1 jruoho Flags = AcpiOsAcquireLock (AcpiGbl_GpeLock); 324 1.1 jruoho 325 1.1 jruoho /* Ensure that we have a valid GPE number */ 326 1.1 jruoho 327 1.1 jruoho GpeEventInfo = AcpiEvGetGpeEventInfo (GpeDevice, GpeNumber); 328 1.1 jruoho if (GpeEventInfo) 329 1.1 jruoho { 330 1.1 jruoho Status = AcpiEvRemoveGpeReference (GpeEventInfo); 331 1.1 jruoho } 332 1.1 jruoho 333 1.1 jruoho AcpiOsReleaseLock (AcpiGbl_GpeLock, Flags); 334 1.1 jruoho return_ACPI_STATUS (Status); 335 1.1 jruoho } 336 1.1 jruoho 337 1.1 jruoho ACPI_EXPORT_SYMBOL (AcpiDisableGpe) 338 1.1 jruoho 339 1.1 jruoho 340 1.1 jruoho /******************************************************************************* 341 1.1 jruoho * 342 1.1 jruoho * FUNCTION: AcpiSetGpe 343 1.1 jruoho * 344 1.1 jruoho * PARAMETERS: GpeDevice - Parent GPE Device. NULL for GPE0/GPE1 345 1.1 jruoho * GpeNumber - GPE level within the GPE block 346 1.1 jruoho * Action - ACPI_GPE_ENABLE or ACPI_GPE_DISABLE 347 1.1 jruoho * 348 1.1 jruoho * RETURN: Status 349 1.1 jruoho * 350 1.1 jruoho * DESCRIPTION: Enable or disable an individual GPE. This function bypasses 351 1.1.1.5 christos * the reference count mechanism used in the AcpiEnableGpe(), 352 1.1.1.5 christos * AcpiDisableGpe() interfaces. 353 1.1.1.5 christos * This API is typically used by the GPE raw handler mode driver 354 1.1.1.5 christos * to switch between the polling mode and the interrupt mode after 355 1.1.1.5 christos * the driver has enabled the GPE. 356 1.1.1.5 christos * The APIs should be invoked in this order: 357 1.1.1.5 christos * AcpiEnableGpe() <- Ensure the reference count > 0 358 1.1.1.5 christos * AcpiSetGpe(ACPI_GPE_DISABLE) <- Enter polling mode 359 1.1.1.5 christos * AcpiSetGpe(ACPI_GPE_ENABLE) <- Leave polling mode 360 1.1.1.5 christos * AcpiDisableGpe() <- Decrease the reference count 361 1.1.1.5 christos * 362 1.1.1.5 christos * Note: If a GPE is shared by 2 silicon components, then both the drivers 363 1.1.1.5 christos * should support GPE polling mode or disabling the GPE for long period 364 1.1.1.5 christos * for one driver may break the other. So use it with care since all 365 1.1.1.5 christos * firmware _Lxx/_Exx handlers currently rely on the GPE interrupt mode. 366 1.1 jruoho * 367 1.1 jruoho ******************************************************************************/ 368 1.1 jruoho 369 1.1 jruoho ACPI_STATUS 370 1.1 jruoho AcpiSetGpe ( 371 1.1 jruoho ACPI_HANDLE GpeDevice, 372 1.1 jruoho UINT32 GpeNumber, 373 1.1 jruoho UINT8 Action) 374 1.1 jruoho { 375 1.1 jruoho ACPI_GPE_EVENT_INFO *GpeEventInfo; 376 1.1 jruoho ACPI_STATUS Status; 377 1.1 jruoho ACPI_CPU_FLAGS Flags; 378 1.1 jruoho 379 1.1 jruoho 380 1.1 jruoho ACPI_FUNCTION_TRACE (AcpiSetGpe); 381 1.1 jruoho 382 1.1 jruoho 383 1.1 jruoho Flags = AcpiOsAcquireLock (AcpiGbl_GpeLock); 384 1.1 jruoho 385 1.1 jruoho /* Ensure that we have a valid GPE number */ 386 1.1 jruoho 387 1.1 jruoho GpeEventInfo = AcpiEvGetGpeEventInfo (GpeDevice, GpeNumber); 388 1.1 jruoho if (!GpeEventInfo) 389 1.1 jruoho { 390 1.1 jruoho Status = AE_BAD_PARAMETER; 391 1.1 jruoho goto UnlockAndExit; 392 1.1 jruoho } 393 1.1 jruoho 394 1.1 jruoho /* Perform the action */ 395 1.1 jruoho 396 1.1 jruoho switch (Action) 397 1.1 jruoho { 398 1.1 jruoho case ACPI_GPE_ENABLE: 399 1.1.1.3 christos 400 1.1.1.5 christos Status = AcpiHwLowSetGpe (GpeEventInfo, ACPI_GPE_ENABLE); 401 1.1.1.7 christos GpeEventInfo->DisableForDispatch = FALSE; 402 1.1 jruoho break; 403 1.1 jruoho 404 1.1 jruoho case ACPI_GPE_DISABLE: 405 1.1.1.3 christos 406 1.1 jruoho Status = AcpiHwLowSetGpe (GpeEventInfo, ACPI_GPE_DISABLE); 407 1.1.1.7 christos GpeEventInfo->DisableForDispatch = TRUE; 408 1.1 jruoho break; 409 1.1 jruoho 410 1.1 jruoho default: 411 1.1.1.3 christos 412 1.1 jruoho Status = AE_BAD_PARAMETER; 413 1.1 jruoho break; 414 1.1 jruoho } 415 1.1 jruoho 416 1.1 jruoho UnlockAndExit: 417 1.1 jruoho AcpiOsReleaseLock (AcpiGbl_GpeLock, Flags); 418 1.1 jruoho return_ACPI_STATUS (Status); 419 1.1 jruoho } 420 1.1 jruoho 421 1.1 jruoho ACPI_EXPORT_SYMBOL (AcpiSetGpe) 422 1.1 jruoho 423 1.1 jruoho 424 1.1 jruoho /******************************************************************************* 425 1.1 jruoho * 426 1.1.1.7 christos * FUNCTION: AcpiMaskGpe 427 1.1.1.7 christos * 428 1.1.1.7 christos * PARAMETERS: GpeDevice - Parent GPE Device. NULL for GPE0/GPE1 429 1.1.1.7 christos * GpeNumber - GPE level within the GPE block 430 1.1.1.7 christos * IsMasked - Whether the GPE is masked or not 431 1.1.1.7 christos * 432 1.1.1.7 christos * RETURN: Status 433 1.1.1.7 christos * 434 1.1.1.7 christos * DESCRIPTION: Unconditionally mask/unmask the an individual GPE, ex., to 435 1.1.1.7 christos * prevent a GPE flooding. 436 1.1.1.7 christos * 437 1.1.1.7 christos ******************************************************************************/ 438 1.1.1.7 christos 439 1.1.1.7 christos ACPI_STATUS 440 1.1.1.7 christos AcpiMaskGpe ( 441 1.1.1.7 christos ACPI_HANDLE GpeDevice, 442 1.1.1.7 christos UINT32 GpeNumber, 443 1.1.1.7 christos BOOLEAN IsMasked) 444 1.1.1.7 christos { 445 1.1.1.7 christos ACPI_GPE_EVENT_INFO *GpeEventInfo; 446 1.1.1.7 christos ACPI_STATUS Status; 447 1.1.1.7 christos ACPI_CPU_FLAGS Flags; 448 1.1.1.7 christos 449 1.1.1.7 christos 450 1.1.1.7 christos ACPI_FUNCTION_TRACE (AcpiMaskGpe); 451 1.1.1.7 christos 452 1.1.1.7 christos 453 1.1.1.7 christos Flags = AcpiOsAcquireLock (AcpiGbl_GpeLock); 454 1.1.1.7 christos 455 1.1.1.7 christos /* Ensure that we have a valid GPE number */ 456 1.1.1.7 christos 457 1.1.1.7 christos GpeEventInfo = AcpiEvGetGpeEventInfo (GpeDevice, GpeNumber); 458 1.1.1.7 christos if (!GpeEventInfo) 459 1.1.1.7 christos { 460 1.1.1.7 christos Status = AE_BAD_PARAMETER; 461 1.1.1.7 christos goto UnlockAndExit; 462 1.1.1.7 christos } 463 1.1.1.7 christos 464 1.1.1.7 christos Status = AcpiEvMaskGpe (GpeEventInfo, IsMasked); 465 1.1.1.7 christos 466 1.1.1.7 christos UnlockAndExit: 467 1.1.1.7 christos AcpiOsReleaseLock (AcpiGbl_GpeLock, Flags); 468 1.1.1.7 christos return_ACPI_STATUS (Status); 469 1.1.1.7 christos } 470 1.1.1.7 christos 471 1.1.1.7 christos ACPI_EXPORT_SYMBOL (AcpiMaskGpe) 472 1.1.1.7 christos 473 1.1.1.7 christos 474 1.1.1.7 christos /******************************************************************************* 475 1.1.1.7 christos * 476 1.1.1.4 christos * FUNCTION: AcpiMarkGpeForWake 477 1.1.1.4 christos * 478 1.1.1.4 christos * PARAMETERS: GpeDevice - Parent GPE Device. NULL for GPE0/GPE1 479 1.1.1.4 christos * GpeNumber - GPE level within the GPE block 480 1.1.1.4 christos * 481 1.1.1.4 christos * RETURN: Status 482 1.1.1.4 christos * 483 1.1.1.4 christos * DESCRIPTION: Mark a GPE as having the ability to wake the system. Simply 484 1.1.1.4 christos * sets the ACPI_GPE_CAN_WAKE flag. 485 1.1.1.4 christos * 486 1.1.1.4 christos * Some potential callers of AcpiSetupGpeForWake may know in advance that 487 1.1.1.4 christos * there won't be any notify handlers installed for device wake notifications 488 1.1.1.4 christos * from the given GPE (one example is a button GPE in Linux). For these cases, 489 1.1.1.4 christos * AcpiMarkGpeForWake should be used instead of AcpiSetupGpeForWake. 490 1.1.1.4 christos * This will set the ACPI_GPE_CAN_WAKE flag for the GPE without trying to 491 1.1.1.4 christos * setup implicit wake notification for it (since there's no handler method). 492 1.1.1.4 christos * 493 1.1.1.4 christos ******************************************************************************/ 494 1.1.1.4 christos 495 1.1.1.4 christos ACPI_STATUS 496 1.1.1.4 christos AcpiMarkGpeForWake ( 497 1.1.1.4 christos ACPI_HANDLE GpeDevice, 498 1.1.1.4 christos UINT32 GpeNumber) 499 1.1.1.4 christos { 500 1.1.1.4 christos ACPI_GPE_EVENT_INFO *GpeEventInfo; 501 1.1.1.4 christos ACPI_STATUS Status = AE_BAD_PARAMETER; 502 1.1.1.4 christos ACPI_CPU_FLAGS Flags; 503 1.1.1.4 christos 504 1.1.1.4 christos 505 1.1.1.4 christos ACPI_FUNCTION_TRACE (AcpiMarkGpeForWake); 506 1.1.1.4 christos 507 1.1.1.4 christos 508 1.1.1.4 christos Flags = AcpiOsAcquireLock (AcpiGbl_GpeLock); 509 1.1.1.4 christos 510 1.1.1.4 christos /* Ensure that we have a valid GPE number */ 511 1.1.1.4 christos 512 1.1.1.4 christos GpeEventInfo = AcpiEvGetGpeEventInfo (GpeDevice, GpeNumber); 513 1.1.1.4 christos if (GpeEventInfo) 514 1.1.1.4 christos { 515 1.1.1.4 christos /* Mark the GPE as a possible wake event */ 516 1.1.1.4 christos 517 1.1.1.4 christos GpeEventInfo->Flags |= ACPI_GPE_CAN_WAKE; 518 1.1.1.4 christos Status = AE_OK; 519 1.1.1.4 christos } 520 1.1.1.4 christos 521 1.1.1.4 christos AcpiOsReleaseLock (AcpiGbl_GpeLock, Flags); 522 1.1.1.4 christos return_ACPI_STATUS (Status); 523 1.1.1.4 christos } 524 1.1.1.4 christos 525 1.1.1.4 christos ACPI_EXPORT_SYMBOL (AcpiMarkGpeForWake) 526 1.1.1.4 christos 527 1.1.1.4 christos 528 1.1.1.4 christos /******************************************************************************* 529 1.1.1.4 christos * 530 1.1 jruoho * FUNCTION: AcpiSetupGpeForWake 531 1.1 jruoho * 532 1.1 jruoho * PARAMETERS: WakeDevice - Device associated with the GPE (via _PRW) 533 1.1 jruoho * GpeDevice - Parent GPE Device. NULL for GPE0/GPE1 534 1.1 jruoho * GpeNumber - GPE level within the GPE block 535 1.1 jruoho * 536 1.1 jruoho * RETURN: Status 537 1.1 jruoho * 538 1.1 jruoho * DESCRIPTION: Mark a GPE as having the ability to wake the system. This 539 1.1 jruoho * interface is intended to be used as the host executes the 540 1.1 jruoho * _PRW methods (Power Resources for Wake) in the system tables. 541 1.1 jruoho * Each _PRW appears under a Device Object (The WakeDevice), and 542 1.1 jruoho * contains the info for the wake GPE associated with the 543 1.1 jruoho * WakeDevice. 544 1.1 jruoho * 545 1.1 jruoho ******************************************************************************/ 546 1.1 jruoho 547 1.1 jruoho ACPI_STATUS 548 1.1 jruoho AcpiSetupGpeForWake ( 549 1.1 jruoho ACPI_HANDLE WakeDevice, 550 1.1 jruoho ACPI_HANDLE GpeDevice, 551 1.1 jruoho UINT32 GpeNumber) 552 1.1 jruoho { 553 1.1.1.3 christos ACPI_STATUS Status; 554 1.1 jruoho ACPI_GPE_EVENT_INFO *GpeEventInfo; 555 1.1 jruoho ACPI_NAMESPACE_NODE *DeviceNode; 556 1.1.1.3 christos ACPI_GPE_NOTIFY_INFO *Notify; 557 1.1.1.3 christos ACPI_GPE_NOTIFY_INFO *NewNotify; 558 1.1 jruoho ACPI_CPU_FLAGS Flags; 559 1.1 jruoho 560 1.1 jruoho 561 1.1 jruoho ACPI_FUNCTION_TRACE (AcpiSetupGpeForWake); 562 1.1 jruoho 563 1.1 jruoho 564 1.1 jruoho /* Parameter Validation */ 565 1.1 jruoho 566 1.1 jruoho if (!WakeDevice) 567 1.1 jruoho { 568 1.1 jruoho /* 569 1.1 jruoho * By forcing WakeDevice to be valid, we automatically enable the 570 1.1 jruoho * implicit notify feature on all hosts. 571 1.1 jruoho */ 572 1.1 jruoho return_ACPI_STATUS (AE_BAD_PARAMETER); 573 1.1 jruoho } 574 1.1 jruoho 575 1.1.1.2 jruoho /* Handle root object case */ 576 1.1.1.2 jruoho 577 1.1.1.2 jruoho if (WakeDevice == ACPI_ROOT_OBJECT) 578 1.1.1.2 jruoho { 579 1.1.1.2 jruoho DeviceNode = AcpiGbl_RootNode; 580 1.1.1.2 jruoho } 581 1.1.1.2 jruoho else 582 1.1.1.2 jruoho { 583 1.1.1.2 jruoho DeviceNode = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, WakeDevice); 584 1.1.1.2 jruoho } 585 1.1.1.2 jruoho 586 1.1 jruoho /* Validate WakeDevice is of type Device */ 587 1.1 jruoho 588 1.1 jruoho if (DeviceNode->Type != ACPI_TYPE_DEVICE) 589 1.1 jruoho { 590 1.1 jruoho return_ACPI_STATUS (AE_BAD_PARAMETER); 591 1.1 jruoho } 592 1.1 jruoho 593 1.1.1.3 christos /* 594 1.1.1.3 christos * Allocate a new notify object up front, in case it is needed. 595 1.1.1.3 christos * Memory allocation while holding a spinlock is a big no-no 596 1.1.1.3 christos * on some hosts. 597 1.1.1.3 christos */ 598 1.1.1.3 christos NewNotify = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_GPE_NOTIFY_INFO)); 599 1.1.1.3 christos if (!NewNotify) 600 1.1.1.3 christos { 601 1.1.1.3 christos return_ACPI_STATUS (AE_NO_MEMORY); 602 1.1.1.3 christos } 603 1.1.1.3 christos 604 1.1 jruoho Flags = AcpiOsAcquireLock (AcpiGbl_GpeLock); 605 1.1 jruoho 606 1.1 jruoho /* Ensure that we have a valid GPE number */ 607 1.1 jruoho 608 1.1 jruoho GpeEventInfo = AcpiEvGetGpeEventInfo (GpeDevice, GpeNumber); 609 1.1.1.3 christos if (!GpeEventInfo) 610 1.1.1.3 christos { 611 1.1.1.3 christos Status = AE_BAD_PARAMETER; 612 1.1.1.3 christos goto UnlockAndExit; 613 1.1.1.3 christos } 614 1.1.1.3 christos 615 1.1.1.3 christos /* 616 1.1.1.3 christos * If there is no method or handler for this GPE, then the 617 1.1.1.3 christos * WakeDevice will be notified whenever this GPE fires. This is 618 1.1.1.3 christos * known as an "implicit notify". Note: The GPE is assumed to be 619 1.1.1.3 christos * level-triggered (for windows compatibility). 620 1.1.1.3 christos */ 621 1.1.1.5 christos if (ACPI_GPE_DISPATCH_TYPE (GpeEventInfo->Flags) == 622 1.1.1.6 christos ACPI_GPE_DISPATCH_NONE) 623 1.1 jruoho { 624 1.1 jruoho /* 625 1.1.1.3 christos * This is the first device for implicit notify on this GPE. 626 1.1.1.3 christos * Just set the flags here, and enter the NOTIFY block below. 627 1.1 jruoho */ 628 1.1.1.3 christos GpeEventInfo->Flags = 629 1.1.1.3 christos (ACPI_GPE_DISPATCH_NOTIFY | ACPI_GPE_LEVEL_TRIGGERED); 630 1.1.1.3 christos } 631 1.1.1.9 christos else if (GpeEventInfo->Flags & ACPI_GPE_AUTO_ENABLED) 632 1.1.1.9 christos { 633 1.1.1.9 christos /* 634 1.1.1.9 christos * A reference to this GPE has been added during the GPE block 635 1.1.1.9 christos * initialization, so drop it now to prevent the GPE from being 636 1.1.1.9 christos * permanently enabled and clear its ACPI_GPE_AUTO_ENABLED flag. 637 1.1.1.9 christos */ 638 1.1.1.9 christos (void) AcpiEvRemoveGpeReference (GpeEventInfo); 639 1.1.1.16 christos GpeEventInfo->Flags &= ~ACPI_GPE_AUTO_ENABLED; 640 1.1.1.9 christos } 641 1.1.1.3 christos 642 1.1.1.3 christos /* 643 1.1.1.3 christos * If we already have an implicit notify on this GPE, add 644 1.1.1.3 christos * this device to the notify list. 645 1.1.1.3 christos */ 646 1.1.1.5 christos if (ACPI_GPE_DISPATCH_TYPE (GpeEventInfo->Flags) == 647 1.1.1.6 christos ACPI_GPE_DISPATCH_NOTIFY) 648 1.1.1.3 christos { 649 1.1.1.3 christos /* Ensure that the device is not already in the list */ 650 1.1.1.3 christos 651 1.1.1.3 christos Notify = GpeEventInfo->Dispatch.NotifyList; 652 1.1.1.3 christos while (Notify) 653 1.1 jruoho { 654 1.1.1.3 christos if (Notify->DeviceNode == DeviceNode) 655 1.1.1.3 christos { 656 1.1.1.3 christos Status = AE_ALREADY_EXISTS; 657 1.1.1.3 christos goto UnlockAndExit; 658 1.1.1.3 christos } 659 1.1.1.3 christos Notify = Notify->Next; 660 1.1 jruoho } 661 1.1 jruoho 662 1.1.1.3 christos /* Add this device to the notify list for this GPE */ 663 1.1.1.3 christos 664 1.1.1.3 christos NewNotify->DeviceNode = DeviceNode; 665 1.1.1.3 christos NewNotify->Next = GpeEventInfo->Dispatch.NotifyList; 666 1.1.1.3 christos GpeEventInfo->Dispatch.NotifyList = NewNotify; 667 1.1.1.3 christos NewNotify = NULL; 668 1.1 jruoho } 669 1.1 jruoho 670 1.1.1.3 christos /* Mark the GPE as a possible wake event */ 671 1.1.1.3 christos 672 1.1.1.3 christos GpeEventInfo->Flags |= ACPI_GPE_CAN_WAKE; 673 1.1.1.3 christos Status = AE_OK; 674 1.1.1.3 christos 675 1.1.1.3 christos 676 1.1.1.3 christos UnlockAndExit: 677 1.1 jruoho AcpiOsReleaseLock (AcpiGbl_GpeLock, Flags); 678 1.1.1.3 christos 679 1.1.1.3 christos /* Delete the notify object if it was not used above */ 680 1.1.1.3 christos 681 1.1.1.3 christos if (NewNotify) 682 1.1.1.3 christos { 683 1.1.1.3 christos ACPI_FREE (NewNotify); 684 1.1.1.3 christos } 685 1.1 jruoho return_ACPI_STATUS (Status); 686 1.1 jruoho } 687 1.1 jruoho 688 1.1 jruoho ACPI_EXPORT_SYMBOL (AcpiSetupGpeForWake) 689 1.1 jruoho 690 1.1 jruoho 691 1.1 jruoho /******************************************************************************* 692 1.1 jruoho * 693 1.1 jruoho * FUNCTION: AcpiSetGpeWakeMask 694 1.1 jruoho * 695 1.1 jruoho * PARAMETERS: GpeDevice - Parent GPE Device. NULL for GPE0/GPE1 696 1.1 jruoho * GpeNumber - GPE level within the GPE block 697 1.1 jruoho * Action - Enable or Disable 698 1.1 jruoho * 699 1.1 jruoho * RETURN: Status 700 1.1 jruoho * 701 1.1 jruoho * DESCRIPTION: Set or clear the GPE's wakeup enable mask bit. The GPE must 702 1.1 jruoho * already be marked as a WAKE GPE. 703 1.1 jruoho * 704 1.1 jruoho ******************************************************************************/ 705 1.1 jruoho 706 1.1 jruoho ACPI_STATUS 707 1.1 jruoho AcpiSetGpeWakeMask ( 708 1.1 jruoho ACPI_HANDLE GpeDevice, 709 1.1 jruoho UINT32 GpeNumber, 710 1.1 jruoho UINT8 Action) 711 1.1 jruoho { 712 1.1 jruoho ACPI_STATUS Status = AE_OK; 713 1.1 jruoho ACPI_GPE_EVENT_INFO *GpeEventInfo; 714 1.1 jruoho ACPI_GPE_REGISTER_INFO *GpeRegisterInfo; 715 1.1 jruoho ACPI_CPU_FLAGS Flags; 716 1.1 jruoho UINT32 RegisterBit; 717 1.1 jruoho 718 1.1 jruoho 719 1.1 jruoho ACPI_FUNCTION_TRACE (AcpiSetGpeWakeMask); 720 1.1 jruoho 721 1.1 jruoho 722 1.1 jruoho Flags = AcpiOsAcquireLock (AcpiGbl_GpeLock); 723 1.1 jruoho 724 1.1 jruoho /* 725 1.1 jruoho * Ensure that we have a valid GPE number and that this GPE is in 726 1.1 jruoho * fact a wake GPE 727 1.1 jruoho */ 728 1.1 jruoho GpeEventInfo = AcpiEvGetGpeEventInfo (GpeDevice, GpeNumber); 729 1.1 jruoho if (!GpeEventInfo) 730 1.1 jruoho { 731 1.1 jruoho Status = AE_BAD_PARAMETER; 732 1.1 jruoho goto UnlockAndExit; 733 1.1 jruoho } 734 1.1 jruoho 735 1.1 jruoho if (!(GpeEventInfo->Flags & ACPI_GPE_CAN_WAKE)) 736 1.1 jruoho { 737 1.1 jruoho Status = AE_TYPE; 738 1.1 jruoho goto UnlockAndExit; 739 1.1 jruoho } 740 1.1 jruoho 741 1.1 jruoho GpeRegisterInfo = GpeEventInfo->RegisterInfo; 742 1.1 jruoho if (!GpeRegisterInfo) 743 1.1 jruoho { 744 1.1 jruoho Status = AE_NOT_EXIST; 745 1.1 jruoho goto UnlockAndExit; 746 1.1 jruoho } 747 1.1 jruoho 748 1.1.1.3 christos RegisterBit = AcpiHwGetGpeRegisterBit (GpeEventInfo); 749 1.1 jruoho 750 1.1 jruoho /* Perform the action */ 751 1.1 jruoho 752 1.1 jruoho switch (Action) 753 1.1 jruoho { 754 1.1 jruoho case ACPI_GPE_ENABLE: 755 1.1.1.3 christos 756 1.1 jruoho ACPI_SET_BIT (GpeRegisterInfo->EnableForWake, (UINT8) RegisterBit); 757 1.1 jruoho break; 758 1.1 jruoho 759 1.1 jruoho case ACPI_GPE_DISABLE: 760 1.1.1.3 christos 761 1.1 jruoho ACPI_CLEAR_BIT (GpeRegisterInfo->EnableForWake, (UINT8) RegisterBit); 762 1.1 jruoho break; 763 1.1 jruoho 764 1.1 jruoho default: 765 1.1.1.3 christos 766 1.1 jruoho ACPI_ERROR ((AE_INFO, "%u, Invalid action", Action)); 767 1.1 jruoho Status = AE_BAD_PARAMETER; 768 1.1 jruoho break; 769 1.1 jruoho } 770 1.1 jruoho 771 1.1 jruoho UnlockAndExit: 772 1.1 jruoho AcpiOsReleaseLock (AcpiGbl_GpeLock, Flags); 773 1.1 jruoho return_ACPI_STATUS (Status); 774 1.1 jruoho } 775 1.1 jruoho 776 1.1 jruoho ACPI_EXPORT_SYMBOL (AcpiSetGpeWakeMask) 777 1.1 jruoho 778 1.1 jruoho 779 1.1 jruoho /******************************************************************************* 780 1.1 jruoho * 781 1.1 jruoho * FUNCTION: AcpiClearGpe 782 1.1 jruoho * 783 1.1 jruoho * PARAMETERS: GpeDevice - Parent GPE Device. NULL for GPE0/GPE1 784 1.1 jruoho * GpeNumber - GPE level within the GPE block 785 1.1 jruoho * 786 1.1 jruoho * RETURN: Status 787 1.1 jruoho * 788 1.1 jruoho * DESCRIPTION: Clear an ACPI event (general purpose) 789 1.1 jruoho * 790 1.1 jruoho ******************************************************************************/ 791 1.1 jruoho 792 1.1 jruoho ACPI_STATUS 793 1.1 jruoho AcpiClearGpe ( 794 1.1 jruoho ACPI_HANDLE GpeDevice, 795 1.1 jruoho UINT32 GpeNumber) 796 1.1 jruoho { 797 1.1 jruoho ACPI_STATUS Status = AE_OK; 798 1.1 jruoho ACPI_GPE_EVENT_INFO *GpeEventInfo; 799 1.1 jruoho ACPI_CPU_FLAGS Flags; 800 1.1 jruoho 801 1.1 jruoho 802 1.1 jruoho ACPI_FUNCTION_TRACE (AcpiClearGpe); 803 1.1 jruoho 804 1.1 jruoho 805 1.1 jruoho Flags = AcpiOsAcquireLock (AcpiGbl_GpeLock); 806 1.1 jruoho 807 1.1 jruoho /* Ensure that we have a valid GPE number */ 808 1.1 jruoho 809 1.1 jruoho GpeEventInfo = AcpiEvGetGpeEventInfo (GpeDevice, GpeNumber); 810 1.1 jruoho if (!GpeEventInfo) 811 1.1 jruoho { 812 1.1 jruoho Status = AE_BAD_PARAMETER; 813 1.1 jruoho goto UnlockAndExit; 814 1.1 jruoho } 815 1.1 jruoho 816 1.1 jruoho Status = AcpiHwClearGpe (GpeEventInfo); 817 1.1 jruoho 818 1.1 jruoho UnlockAndExit: 819 1.1 jruoho AcpiOsReleaseLock (AcpiGbl_GpeLock, Flags); 820 1.1 jruoho return_ACPI_STATUS (Status); 821 1.1 jruoho } 822 1.1 jruoho 823 1.1 jruoho ACPI_EXPORT_SYMBOL (AcpiClearGpe) 824 1.1 jruoho 825 1.1 jruoho 826 1.1 jruoho /******************************************************************************* 827 1.1 jruoho * 828 1.1 jruoho * FUNCTION: AcpiGetGpeStatus 829 1.1 jruoho * 830 1.1 jruoho * PARAMETERS: GpeDevice - Parent GPE Device. NULL for GPE0/GPE1 831 1.1 jruoho * GpeNumber - GPE level within the GPE block 832 1.1 jruoho * EventStatus - Where the current status of the event 833 1.1 jruoho * will be returned 834 1.1 jruoho * 835 1.1 jruoho * RETURN: Status 836 1.1 jruoho * 837 1.1 jruoho * DESCRIPTION: Get the current status of a GPE (signalled/not_signalled) 838 1.1 jruoho * 839 1.1 jruoho ******************************************************************************/ 840 1.1 jruoho 841 1.1 jruoho ACPI_STATUS 842 1.1 jruoho AcpiGetGpeStatus ( 843 1.1 jruoho ACPI_HANDLE GpeDevice, 844 1.1 jruoho UINT32 GpeNumber, 845 1.1 jruoho ACPI_EVENT_STATUS *EventStatus) 846 1.1 jruoho { 847 1.1 jruoho ACPI_STATUS Status = AE_OK; 848 1.1 jruoho ACPI_GPE_EVENT_INFO *GpeEventInfo; 849 1.1 jruoho ACPI_CPU_FLAGS Flags; 850 1.1 jruoho 851 1.1 jruoho 852 1.1 jruoho ACPI_FUNCTION_TRACE (AcpiGetGpeStatus); 853 1.1 jruoho 854 1.1 jruoho 855 1.1 jruoho Flags = AcpiOsAcquireLock (AcpiGbl_GpeLock); 856 1.1 jruoho 857 1.1 jruoho /* Ensure that we have a valid GPE number */ 858 1.1 jruoho 859 1.1 jruoho GpeEventInfo = AcpiEvGetGpeEventInfo (GpeDevice, GpeNumber); 860 1.1 jruoho if (!GpeEventInfo) 861 1.1 jruoho { 862 1.1 jruoho Status = AE_BAD_PARAMETER; 863 1.1 jruoho goto UnlockAndExit; 864 1.1 jruoho } 865 1.1 jruoho 866 1.1 jruoho /* Obtain status on the requested GPE number */ 867 1.1 jruoho 868 1.1 jruoho Status = AcpiHwGetGpeStatus (GpeEventInfo, EventStatus); 869 1.1 jruoho 870 1.1 jruoho UnlockAndExit: 871 1.1 jruoho AcpiOsReleaseLock (AcpiGbl_GpeLock, Flags); 872 1.1 jruoho return_ACPI_STATUS (Status); 873 1.1 jruoho } 874 1.1 jruoho 875 1.1 jruoho ACPI_EXPORT_SYMBOL (AcpiGetGpeStatus) 876 1.1 jruoho 877 1.1 jruoho 878 1.1 jruoho /******************************************************************************* 879 1.1 jruoho * 880 1.1.1.11 christos * FUNCTION: AcpiDispatchGpe 881 1.1.1.11 christos * 882 1.1.1.11 christos * PARAMETERS: GpeDevice - Parent GPE Device. NULL for GPE0/GPE1 883 1.1.1.11 christos * GpeNumber - GPE level within the GPE block 884 1.1.1.11 christos * 885 1.1.1.11 christos * RETURN: INTERRUPT_HANDLED or INTERRUPT_NOT_HANDLED 886 1.1.1.11 christos * 887 1.1.1.11 christos * DESCRIPTION: Detect and dispatch a General Purpose Event to either a function 888 1.1.1.11 christos * (e.g. EC) or method (e.g. _Lxx/_Exx) handler. 889 1.1.1.11 christos * 890 1.1.1.11 christos ******************************************************************************/ 891 1.1.1.11 christos 892 1.1.1.11 christos UINT32 893 1.1.1.11 christos AcpiDispatchGpe( 894 1.1.1.11 christos ACPI_HANDLE GpeDevice, 895 1.1.1.11 christos UINT32 GpeNumber) 896 1.1.1.11 christos { 897 1.1.1.11 christos ACPI_FUNCTION_TRACE(acpi_dispatch_gpe); 898 1.1.1.11 christos 899 1.1.1.11 christos return (AcpiEvDetectGpe (GpeDevice, NULL, GpeNumber)); 900 1.1.1.11 christos } 901 1.1.1.11 christos 902 1.1.1.11 christos ACPI_EXPORT_SYMBOL (AcpiDispatchGpe) 903 1.1.1.11 christos 904 1.1.1.11 christos 905 1.1.1.11 christos /******************************************************************************* 906 1.1.1.11 christos * 907 1.1 jruoho * FUNCTION: AcpiFinishGpe 908 1.1 jruoho * 909 1.1 jruoho * PARAMETERS: GpeDevice - Namespace node for the GPE Block 910 1.1 jruoho * (NULL for FADT defined GPEs) 911 1.1 jruoho * GpeNumber - GPE level within the GPE block 912 1.1 jruoho * 913 1.1 jruoho * RETURN: Status 914 1.1 jruoho * 915 1.1.1.10 christos * DESCRIPTION: Clear and conditionally re-enable a GPE. This completes the GPE 916 1.1 jruoho * processing. Intended for use by asynchronous host-installed 917 1.1.1.10 christos * GPE handlers. The GPE is only re-enabled if the EnableForRun bit 918 1.1 jruoho * is set in the GPE info. 919 1.1 jruoho * 920 1.1 jruoho ******************************************************************************/ 921 1.1 jruoho 922 1.1 jruoho ACPI_STATUS 923 1.1 jruoho AcpiFinishGpe ( 924 1.1 jruoho ACPI_HANDLE GpeDevice, 925 1.1 jruoho UINT32 GpeNumber) 926 1.1 jruoho { 927 1.1 jruoho ACPI_GPE_EVENT_INFO *GpeEventInfo; 928 1.1 jruoho ACPI_STATUS Status; 929 1.1 jruoho ACPI_CPU_FLAGS Flags; 930 1.1 jruoho 931 1.1 jruoho 932 1.1 jruoho ACPI_FUNCTION_TRACE (AcpiFinishGpe); 933 1.1 jruoho 934 1.1 jruoho 935 1.1 jruoho Flags = AcpiOsAcquireLock (AcpiGbl_GpeLock); 936 1.1 jruoho 937 1.1 jruoho /* Ensure that we have a valid GPE number */ 938 1.1 jruoho 939 1.1 jruoho GpeEventInfo = AcpiEvGetGpeEventInfo (GpeDevice, GpeNumber); 940 1.1 jruoho if (!GpeEventInfo) 941 1.1 jruoho { 942 1.1 jruoho Status = AE_BAD_PARAMETER; 943 1.1 jruoho goto UnlockAndExit; 944 1.1 jruoho } 945 1.1 jruoho 946 1.1 jruoho Status = AcpiEvFinishGpe (GpeEventInfo); 947 1.1 jruoho 948 1.1 jruoho UnlockAndExit: 949 1.1 jruoho AcpiOsReleaseLock (AcpiGbl_GpeLock, Flags); 950 1.1 jruoho return_ACPI_STATUS (Status); 951 1.1 jruoho } 952 1.1 jruoho 953 1.1 jruoho ACPI_EXPORT_SYMBOL (AcpiFinishGpe) 954 1.1 jruoho 955 1.1 jruoho 956 1.1 jruoho /****************************************************************************** 957 1.1 jruoho * 958 1.1 jruoho * FUNCTION: AcpiDisableAllGpes 959 1.1 jruoho * 960 1.1 jruoho * PARAMETERS: None 961 1.1 jruoho * 962 1.1 jruoho * RETURN: Status 963 1.1 jruoho * 964 1.1 jruoho * DESCRIPTION: Disable and clear all GPEs in all GPE blocks 965 1.1 jruoho * 966 1.1 jruoho ******************************************************************************/ 967 1.1 jruoho 968 1.1 jruoho ACPI_STATUS 969 1.1 jruoho AcpiDisableAllGpes ( 970 1.1 jruoho void) 971 1.1 jruoho { 972 1.1 jruoho ACPI_STATUS Status; 973 1.1 jruoho 974 1.1 jruoho 975 1.1 jruoho ACPI_FUNCTION_TRACE (AcpiDisableAllGpes); 976 1.1 jruoho 977 1.1 jruoho 978 1.1 jruoho Status = AcpiUtAcquireMutex (ACPI_MTX_EVENTS); 979 1.1 jruoho if (ACPI_FAILURE (Status)) 980 1.1 jruoho { 981 1.1 jruoho return_ACPI_STATUS (Status); 982 1.1 jruoho } 983 1.1 jruoho 984 1.1 jruoho Status = AcpiHwDisableAllGpes (); 985 1.1 jruoho (void) AcpiUtReleaseMutex (ACPI_MTX_EVENTS); 986 1.1 jruoho 987 1.1 jruoho return_ACPI_STATUS (Status); 988 1.1 jruoho } 989 1.1 jruoho 990 1.1 jruoho ACPI_EXPORT_SYMBOL (AcpiDisableAllGpes) 991 1.1 jruoho 992 1.1 jruoho 993 1.1 jruoho /****************************************************************************** 994 1.1 jruoho * 995 1.1 jruoho * FUNCTION: AcpiEnableAllRuntimeGpes 996 1.1 jruoho * 997 1.1 jruoho * PARAMETERS: None 998 1.1 jruoho * 999 1.1 jruoho * RETURN: Status 1000 1.1 jruoho * 1001 1.1 jruoho * DESCRIPTION: Enable all "runtime" GPEs, in all GPE blocks 1002 1.1 jruoho * 1003 1.1 jruoho ******************************************************************************/ 1004 1.1 jruoho 1005 1.1 jruoho ACPI_STATUS 1006 1.1 jruoho AcpiEnableAllRuntimeGpes ( 1007 1.1 jruoho void) 1008 1.1 jruoho { 1009 1.1 jruoho ACPI_STATUS Status; 1010 1.1 jruoho 1011 1.1 jruoho 1012 1.1 jruoho ACPI_FUNCTION_TRACE (AcpiEnableAllRuntimeGpes); 1013 1.1 jruoho 1014 1.1 jruoho 1015 1.1 jruoho Status = AcpiUtAcquireMutex (ACPI_MTX_EVENTS); 1016 1.1 jruoho if (ACPI_FAILURE (Status)) 1017 1.1 jruoho { 1018 1.1 jruoho return_ACPI_STATUS (Status); 1019 1.1 jruoho } 1020 1.1 jruoho 1021 1.1 jruoho Status = AcpiHwEnableAllRuntimeGpes (); 1022 1.1 jruoho (void) AcpiUtReleaseMutex (ACPI_MTX_EVENTS); 1023 1.1 jruoho 1024 1.1 jruoho return_ACPI_STATUS (Status); 1025 1.1 jruoho } 1026 1.1 jruoho 1027 1.1 jruoho ACPI_EXPORT_SYMBOL (AcpiEnableAllRuntimeGpes) 1028 1.1 jruoho 1029 1.1 jruoho 1030 1.1.1.5 christos /****************************************************************************** 1031 1.1.1.5 christos * 1032 1.1.1.5 christos * FUNCTION: AcpiEnableAllWakeupGpes 1033 1.1.1.5 christos * 1034 1.1.1.5 christos * PARAMETERS: None 1035 1.1.1.5 christos * 1036 1.1.1.5 christos * RETURN: Status 1037 1.1.1.5 christos * 1038 1.1.1.5 christos * DESCRIPTION: Enable all "wakeup" GPEs and disable all of the other GPEs, in 1039 1.1.1.5 christos * all GPE blocks. 1040 1.1.1.5 christos * 1041 1.1.1.5 christos ******************************************************************************/ 1042 1.1.1.5 christos 1043 1.1.1.5 christos ACPI_STATUS 1044 1.1.1.5 christos AcpiEnableAllWakeupGpes ( 1045 1.1.1.5 christos void) 1046 1.1.1.5 christos { 1047 1.1.1.5 christos ACPI_STATUS Status; 1048 1.1.1.5 christos 1049 1.1.1.5 christos 1050 1.1.1.5 christos ACPI_FUNCTION_TRACE (AcpiEnableAllWakeupGpes); 1051 1.1.1.5 christos 1052 1.1.1.5 christos 1053 1.1.1.5 christos Status = AcpiUtAcquireMutex (ACPI_MTX_EVENTS); 1054 1.1.1.5 christos if (ACPI_FAILURE (Status)) 1055 1.1.1.5 christos { 1056 1.1.1.5 christos return_ACPI_STATUS (Status); 1057 1.1.1.5 christos } 1058 1.1.1.5 christos 1059 1.1.1.5 christos Status = AcpiHwEnableAllWakeupGpes (); 1060 1.1.1.5 christos (void) AcpiUtReleaseMutex (ACPI_MTX_EVENTS); 1061 1.1.1.5 christos 1062 1.1.1.5 christos return_ACPI_STATUS (Status); 1063 1.1.1.5 christos } 1064 1.1.1.5 christos 1065 1.1.1.5 christos ACPI_EXPORT_SYMBOL (AcpiEnableAllWakeupGpes) 1066 1.1.1.5 christos 1067 1.1.1.5 christos 1068 1.1.1.12 christos /****************************************************************************** 1069 1.1.1.12 christos * 1070 1.1.1.12 christos * FUNCTION: AcpiAnyGpeStatusSet 1071 1.1.1.12 christos * 1072 1.1.1.12 christos * PARAMETERS: None 1073 1.1.1.12 christos * 1074 1.1.1.12 christos * RETURN: Whether or not the status bit is set for any GPE 1075 1.1.1.12 christos * 1076 1.1.1.12 christos * DESCRIPTION: Check the status bits of all enabled GPEs and return TRUE if any 1077 1.1.1.12 christos * of them is set or FALSE otherwise. 1078 1.1.1.12 christos * 1079 1.1.1.12 christos ******************************************************************************/ 1080 1.1.1.12 christos 1081 1.1.1.12 christos UINT32 1082 1.1.1.12 christos AcpiAnyGpeStatusSet ( 1083 1.1.1.12 christos void) 1084 1.1.1.12 christos { 1085 1.1.1.12 christos ACPI_STATUS Status; 1086 1.1.1.12 christos UINT8 Ret; 1087 1.1.1.12 christos 1088 1.1.1.12 christos 1089 1.1.1.12 christos ACPI_FUNCTION_TRACE (AcpiAnyGpeStatusSet); 1090 1.1.1.12 christos 1091 1.1.1.12 christos Status = AcpiUtAcquireMutex (ACPI_MTX_EVENTS); 1092 1.1.1.12 christos if (ACPI_FAILURE (Status)) 1093 1.1.1.12 christos { 1094 1.1.1.12 christos return (FALSE); 1095 1.1.1.12 christos } 1096 1.1.1.12 christos 1097 1.1.1.12 christos Ret = AcpiHwCheckAllGpes (); 1098 1.1.1.12 christos (void) AcpiUtReleaseMutex (ACPI_MTX_EVENTS); 1099 1.1.1.12 christos 1100 1.1.1.12 christos return (Ret); 1101 1.1.1.12 christos } 1102 1.1.1.12 christos 1103 1.1.1.12 christos ACPI_EXPORT_SYMBOL(AcpiAnyGpeStatusSet) 1104 1.1.1.12 christos 1105 1.1.1.12 christos 1106 1.1 jruoho /******************************************************************************* 1107 1.1 jruoho * 1108 1.1 jruoho * FUNCTION: AcpiInstallGpeBlock 1109 1.1 jruoho * 1110 1.1 jruoho * PARAMETERS: GpeDevice - Handle to the parent GPE Block Device 1111 1.1 jruoho * GpeBlockAddress - Address and SpaceID 1112 1.1 jruoho * RegisterCount - Number of GPE register pairs in the block 1113 1.1 jruoho * InterruptNumber - H/W interrupt for the block 1114 1.1 jruoho * 1115 1.1 jruoho * RETURN: Status 1116 1.1 jruoho * 1117 1.1 jruoho * DESCRIPTION: Create and Install a block of GPE registers. The GPEs are not 1118 1.1 jruoho * enabled here. 1119 1.1 jruoho * 1120 1.1 jruoho ******************************************************************************/ 1121 1.1 jruoho 1122 1.1 jruoho ACPI_STATUS 1123 1.1 jruoho AcpiInstallGpeBlock ( 1124 1.1 jruoho ACPI_HANDLE GpeDevice, 1125 1.1 jruoho ACPI_GENERIC_ADDRESS *GpeBlockAddress, 1126 1.1 jruoho UINT32 RegisterCount, 1127 1.1 jruoho UINT32 InterruptNumber) 1128 1.1 jruoho { 1129 1.1 jruoho ACPI_STATUS Status; 1130 1.1 jruoho ACPI_OPERAND_OBJECT *ObjDesc; 1131 1.1 jruoho ACPI_NAMESPACE_NODE *Node; 1132 1.1 jruoho ACPI_GPE_BLOCK_INFO *GpeBlock; 1133 1.1 jruoho 1134 1.1 jruoho 1135 1.1 jruoho ACPI_FUNCTION_TRACE (AcpiInstallGpeBlock); 1136 1.1 jruoho 1137 1.1 jruoho 1138 1.1 jruoho if ((!GpeDevice) || 1139 1.1 jruoho (!GpeBlockAddress) || 1140 1.1 jruoho (!RegisterCount)) 1141 1.1 jruoho { 1142 1.1 jruoho return_ACPI_STATUS (AE_BAD_PARAMETER); 1143 1.1 jruoho } 1144 1.1 jruoho 1145 1.1 jruoho Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE); 1146 1.1 jruoho if (ACPI_FAILURE (Status)) 1147 1.1 jruoho { 1148 1.1.1.3 christos return_ACPI_STATUS (Status); 1149 1.1 jruoho } 1150 1.1 jruoho 1151 1.1 jruoho Node = AcpiNsValidateHandle (GpeDevice); 1152 1.1 jruoho if (!Node) 1153 1.1 jruoho { 1154 1.1 jruoho Status = AE_BAD_PARAMETER; 1155 1.1 jruoho goto UnlockAndExit; 1156 1.1 jruoho } 1157 1.1 jruoho 1158 1.1.1.4 christos /* Validate the parent device */ 1159 1.1.1.4 christos 1160 1.1.1.4 christos if (Node->Type != ACPI_TYPE_DEVICE) 1161 1.1.1.4 christos { 1162 1.1.1.4 christos Status = AE_TYPE; 1163 1.1.1.4 christos goto UnlockAndExit; 1164 1.1.1.4 christos } 1165 1.1.1.4 christos 1166 1.1.1.4 christos if (Node->Object) 1167 1.1.1.4 christos { 1168 1.1.1.4 christos Status = AE_ALREADY_EXISTS; 1169 1.1.1.4 christos goto UnlockAndExit; 1170 1.1.1.4 christos } 1171 1.1.1.4 christos 1172 1.1 jruoho /* 1173 1.1 jruoho * For user-installed GPE Block Devices, the GpeBlockBaseNumber 1174 1.1 jruoho * is always zero 1175 1.1 jruoho */ 1176 1.1.1.4 christos Status = AcpiEvCreateGpeBlock (Node, GpeBlockAddress->Address, 1177 1.1.1.6 christos GpeBlockAddress->SpaceId, RegisterCount, 1178 1.1.1.6 christos 0, InterruptNumber, &GpeBlock); 1179 1.1 jruoho if (ACPI_FAILURE (Status)) 1180 1.1 jruoho { 1181 1.1 jruoho goto UnlockAndExit; 1182 1.1 jruoho } 1183 1.1 jruoho 1184 1.1 jruoho /* Install block in the DeviceObject attached to the node */ 1185 1.1 jruoho 1186 1.1 jruoho ObjDesc = AcpiNsGetAttachedObject (Node); 1187 1.1 jruoho if (!ObjDesc) 1188 1.1 jruoho { 1189 1.1 jruoho /* 1190 1.1 jruoho * No object, create a new one (Device nodes do not always have 1191 1.1 jruoho * an attached object) 1192 1.1 jruoho */ 1193 1.1 jruoho ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_DEVICE); 1194 1.1 jruoho if (!ObjDesc) 1195 1.1 jruoho { 1196 1.1 jruoho Status = AE_NO_MEMORY; 1197 1.1 jruoho goto UnlockAndExit; 1198 1.1 jruoho } 1199 1.1 jruoho 1200 1.1 jruoho Status = AcpiNsAttachObject (Node, ObjDesc, ACPI_TYPE_DEVICE); 1201 1.1 jruoho 1202 1.1 jruoho /* Remove local reference to the object */ 1203 1.1 jruoho 1204 1.1 jruoho AcpiUtRemoveReference (ObjDesc); 1205 1.1 jruoho if (ACPI_FAILURE (Status)) 1206 1.1 jruoho { 1207 1.1 jruoho goto UnlockAndExit; 1208 1.1 jruoho } 1209 1.1 jruoho } 1210 1.1 jruoho 1211 1.1 jruoho /* Now install the GPE block in the DeviceObject */ 1212 1.1 jruoho 1213 1.1 jruoho ObjDesc->Device.GpeBlock = GpeBlock; 1214 1.1 jruoho 1215 1.1 jruoho 1216 1.1 jruoho UnlockAndExit: 1217 1.1 jruoho (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE); 1218 1.1 jruoho return_ACPI_STATUS (Status); 1219 1.1 jruoho } 1220 1.1 jruoho 1221 1.1 jruoho ACPI_EXPORT_SYMBOL (AcpiInstallGpeBlock) 1222 1.1 jruoho 1223 1.1 jruoho 1224 1.1 jruoho /******************************************************************************* 1225 1.1 jruoho * 1226 1.1 jruoho * FUNCTION: AcpiRemoveGpeBlock 1227 1.1 jruoho * 1228 1.1 jruoho * PARAMETERS: GpeDevice - Handle to the parent GPE Block Device 1229 1.1 jruoho * 1230 1.1 jruoho * RETURN: Status 1231 1.1 jruoho * 1232 1.1 jruoho * DESCRIPTION: Remove a previously installed block of GPE registers 1233 1.1 jruoho * 1234 1.1 jruoho ******************************************************************************/ 1235 1.1 jruoho 1236 1.1 jruoho ACPI_STATUS 1237 1.1 jruoho AcpiRemoveGpeBlock ( 1238 1.1 jruoho ACPI_HANDLE GpeDevice) 1239 1.1 jruoho { 1240 1.1 jruoho ACPI_OPERAND_OBJECT *ObjDesc; 1241 1.1 jruoho ACPI_STATUS Status; 1242 1.1 jruoho ACPI_NAMESPACE_NODE *Node; 1243 1.1 jruoho 1244 1.1 jruoho 1245 1.1 jruoho ACPI_FUNCTION_TRACE (AcpiRemoveGpeBlock); 1246 1.1 jruoho 1247 1.1 jruoho 1248 1.1 jruoho if (!GpeDevice) 1249 1.1 jruoho { 1250 1.1 jruoho return_ACPI_STATUS (AE_BAD_PARAMETER); 1251 1.1 jruoho } 1252 1.1 jruoho 1253 1.1 jruoho Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE); 1254 1.1 jruoho if (ACPI_FAILURE (Status)) 1255 1.1 jruoho { 1256 1.1.1.3 christos return_ACPI_STATUS (Status); 1257 1.1 jruoho } 1258 1.1 jruoho 1259 1.1 jruoho Node = AcpiNsValidateHandle (GpeDevice); 1260 1.1 jruoho if (!Node) 1261 1.1 jruoho { 1262 1.1 jruoho Status = AE_BAD_PARAMETER; 1263 1.1 jruoho goto UnlockAndExit; 1264 1.1 jruoho } 1265 1.1 jruoho 1266 1.1.1.4 christos /* Validate the parent device */ 1267 1.1.1.4 christos 1268 1.1.1.4 christos if (Node->Type != ACPI_TYPE_DEVICE) 1269 1.1.1.4 christos { 1270 1.1.1.4 christos Status = AE_TYPE; 1271 1.1.1.4 christos goto UnlockAndExit; 1272 1.1.1.4 christos } 1273 1.1.1.4 christos 1274 1.1 jruoho /* Get the DeviceObject attached to the node */ 1275 1.1 jruoho 1276 1.1 jruoho ObjDesc = AcpiNsGetAttachedObject (Node); 1277 1.1 jruoho if (!ObjDesc || 1278 1.1 jruoho !ObjDesc->Device.GpeBlock) 1279 1.1 jruoho { 1280 1.1 jruoho return_ACPI_STATUS (AE_NULL_OBJECT); 1281 1.1 jruoho } 1282 1.1 jruoho 1283 1.1 jruoho /* Delete the GPE block (but not the DeviceObject) */ 1284 1.1 jruoho 1285 1.1 jruoho Status = AcpiEvDeleteGpeBlock (ObjDesc->Device.GpeBlock); 1286 1.1 jruoho if (ACPI_SUCCESS (Status)) 1287 1.1 jruoho { 1288 1.1 jruoho ObjDesc->Device.GpeBlock = NULL; 1289 1.1 jruoho } 1290 1.1 jruoho 1291 1.1 jruoho UnlockAndExit: 1292 1.1 jruoho (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE); 1293 1.1 jruoho return_ACPI_STATUS (Status); 1294 1.1 jruoho } 1295 1.1 jruoho 1296 1.1 jruoho ACPI_EXPORT_SYMBOL (AcpiRemoveGpeBlock) 1297 1.1 jruoho 1298 1.1 jruoho 1299 1.1 jruoho /******************************************************************************* 1300 1.1 jruoho * 1301 1.1 jruoho * FUNCTION: AcpiGetGpeDevice 1302 1.1 jruoho * 1303 1.1 jruoho * PARAMETERS: Index - System GPE index (0-CurrentGpeCount) 1304 1.1 jruoho * GpeDevice - Where the parent GPE Device is returned 1305 1.1 jruoho * 1306 1.1 jruoho * RETURN: Status 1307 1.1 jruoho * 1308 1.1 jruoho * DESCRIPTION: Obtain the GPE device associated with the input index. A NULL 1309 1.1 jruoho * gpe device indicates that the gpe number is contained in one of 1310 1.1 jruoho * the FADT-defined gpe blocks. Otherwise, the GPE block device. 1311 1.1 jruoho * 1312 1.1 jruoho ******************************************************************************/ 1313 1.1 jruoho 1314 1.1 jruoho ACPI_STATUS 1315 1.1 jruoho AcpiGetGpeDevice ( 1316 1.1 jruoho UINT32 Index, 1317 1.1 jruoho ACPI_HANDLE *GpeDevice) 1318 1.1 jruoho { 1319 1.1 jruoho ACPI_GPE_DEVICE_INFO Info; 1320 1.1 jruoho ACPI_STATUS Status; 1321 1.1 jruoho 1322 1.1 jruoho 1323 1.1 jruoho ACPI_FUNCTION_TRACE (AcpiGetGpeDevice); 1324 1.1 jruoho 1325 1.1 jruoho 1326 1.1 jruoho if (!GpeDevice) 1327 1.1 jruoho { 1328 1.1 jruoho return_ACPI_STATUS (AE_BAD_PARAMETER); 1329 1.1 jruoho } 1330 1.1 jruoho 1331 1.1 jruoho if (Index >= AcpiCurrentGpeCount) 1332 1.1 jruoho { 1333 1.1 jruoho return_ACPI_STATUS (AE_NOT_EXIST); 1334 1.1 jruoho } 1335 1.1 jruoho 1336 1.1 jruoho /* Setup and walk the GPE list */ 1337 1.1 jruoho 1338 1.1 jruoho Info.Index = Index; 1339 1.1 jruoho Info.Status = AE_NOT_EXIST; 1340 1.1 jruoho Info.GpeDevice = NULL; 1341 1.1 jruoho Info.NextBlockBaseIndex = 0; 1342 1.1 jruoho 1343 1.1 jruoho Status = AcpiEvWalkGpeList (AcpiEvGetGpeDevice, &Info); 1344 1.1 jruoho if (ACPI_FAILURE (Status)) 1345 1.1 jruoho { 1346 1.1 jruoho return_ACPI_STATUS (Status); 1347 1.1 jruoho } 1348 1.1 jruoho 1349 1.1 jruoho *GpeDevice = ACPI_CAST_PTR (ACPI_HANDLE, Info.GpeDevice); 1350 1.1 jruoho return_ACPI_STATUS (Info.Status); 1351 1.1 jruoho } 1352 1.1 jruoho 1353 1.1 jruoho ACPI_EXPORT_SYMBOL (AcpiGetGpeDevice) 1354 1.1.1.3 christos 1355 1.1.1.3 christos #endif /* !ACPI_REDUCED_HARDWARE */ 1356