Home | History | Annotate | Line # | Download | only in events
      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