Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. /******************************************************************************
  2.  *
  3.  * Module Name: evxfevnt - External Interfaces, ACPI event disable/enable
  4.  *
  5.  *****************************************************************************/
  6.  
  7. /******************************************************************************
  8.  *
  9.  * 1. Copyright Notice
  10.  *
  11.  * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp.
  12.  * All rights reserved.
  13.  *
  14.  * 2. License
  15.  *
  16.  * 2.1. This is your license from Intel Corp. under its intellectual property
  17.  * rights.  You may have additional license terms from the party that provided
  18.  * you this software, covering your right to use that party's intellectual
  19.  * property rights.
  20.  *
  21.  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
  22.  * copy of the source code appearing in this file ("Covered Code") an
  23.  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
  24.  * base code distributed originally by Intel ("Original Intel Code") to copy,
  25.  * make derivatives, distribute, use and display any portion of the Covered
  26.  * Code in any form, with the right to sublicense such rights; and
  27.  *
  28.  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
  29.  * license (with the right to sublicense), under only those claims of Intel
  30.  * patents that are infringed by the Original Intel Code, to make, use, sell,
  31.  * offer to sell, and import the Covered Code and derivative works thereof
  32.  * solely to the minimum extent necessary to exercise the above copyright
  33.  * license, and in no event shall the patent license extend to any additions
  34.  * to or modifications of the Original Intel Code.  No other license or right
  35.  * is granted directly or by implication, estoppel or otherwise;
  36.  *
  37.  * The above copyright and patent license is granted only if the following
  38.  * conditions are met:
  39.  *
  40.  * 3. Conditions
  41.  *
  42.  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
  43.  * Redistribution of source code of any substantial portion of the Covered
  44.  * Code or modification with rights to further distribute source must include
  45.  * the above Copyright Notice, the above License, this list of Conditions,
  46.  * and the following Disclaimer and Export Compliance provision.  In addition,
  47.  * Licensee must cause all Covered Code to which Licensee contributes to
  48.  * contain a file documenting the changes Licensee made to create that Covered
  49.  * Code and the date of any change.  Licensee must include in that file the
  50.  * documentation of any changes made by any predecessor Licensee.  Licensee
  51.  * must include a prominent statement that the modification is derived,
  52.  * directly or indirectly, from Original Intel Code.
  53.  *
  54.  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
  55.  * Redistribution of source code of any substantial portion of the Covered
  56.  * Code or modification without rights to further distribute source must
  57.  * include the following Disclaimer and Export Compliance provision in the
  58.  * documentation and/or other materials provided with distribution.  In
  59.  * addition, Licensee may not authorize further sublicense of source of any
  60.  * portion of the Covered Code, and must include terms to the effect that the
  61.  * license from Licensee to its licensee is limited to the intellectual
  62.  * property embodied in the software Licensee provides to its licensee, and
  63.  * not to intellectual property embodied in modifications its licensee may
  64.  * make.
  65.  *
  66.  * 3.3. Redistribution of Executable. Redistribution in executable form of any
  67.  * substantial portion of the Covered Code or modification must reproduce the
  68.  * above Copyright Notice, and the following Disclaimer and Export Compliance
  69.  * provision in the documentation and/or other materials provided with the
  70.  * distribution.
  71.  *
  72.  * 3.4. Intel retains all right, title, and interest in and to the Original
  73.  * Intel Code.
  74.  *
  75.  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
  76.  * Intel shall be used in advertising or otherwise to promote the sale, use or
  77.  * other dealings in products derived from or relating to the Covered Code
  78.  * without prior written authorization from Intel.
  79.  *
  80.  * 4. Disclaimer and Export Compliance
  81.  *
  82.  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
  83.  * HERE.  ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
  84.  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT,  ASSISTANCE,
  85.  * INSTALLATION, TRAINING OR OTHER SERVICES.  INTEL WILL NOT PROVIDE ANY
  86.  * UPDATES, ENHANCEMENTS OR EXTENSIONS.  INTEL SPECIFICALLY DISCLAIMS ANY
  87.  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
  88.  * PARTICULAR PURPOSE.
  89.  *
  90.  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
  91.  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
  92.  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
  93.  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
  94.  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
  95.  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES.  THESE LIMITATIONS
  96.  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
  97.  * LIMITED REMEDY.
  98.  *
  99.  * 4.3. Licensee shall not export, either directly or indirectly, any of this
  100.  * software or system incorporating such software without first obtaining any
  101.  * required license or other approval from the U. S. Department of Commerce or
  102.  * any other agency or department of the United States Government.  In the
  103.  * event Licensee exports any such software from the United States or
  104.  * re-exports any such software from a foreign destination, Licensee shall
  105.  * ensure that the distribution and export/re-export of the software is in
  106.  * compliance with all laws, regulations, orders, or other restrictions of the
  107.  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
  108.  * any of its subsidiaries will export/re-export any technical data, process,
  109.  * software, or service, directly or indirectly, to any country for which the
  110.  * United States government or any agency thereof requires an export license,
  111.  * other governmental approval, or letter of assurance, without first obtaining
  112.  * such license, approval or letter.
  113.  *
  114.  *****************************************************************************/
  115.  
  116.  
  117. #define __EVXFEVNT_C__
  118.  
  119. #include "acpi.h"
  120. #include "accommon.h"
  121. #include "acevents.h"
  122. #include "acnamesp.h"
  123. #include "actables.h"
  124.  
  125. #define _COMPONENT          ACPI_EVENTS
  126.         ACPI_MODULE_NAME    ("evxfevnt")
  127.  
  128. /* Local prototypes */
  129.  
  130. static ACPI_STATUS
  131. AcpiEvGetGpeDevice (
  132.     ACPI_GPE_XRUPT_INFO     *GpeXruptInfo,
  133.     ACPI_GPE_BLOCK_INFO     *GpeBlock,
  134.     void                    *Context);
  135.  
  136.  
  137. /*******************************************************************************
  138.  *
  139.  * FUNCTION:    AcpiEnable
  140.  *
  141.  * PARAMETERS:  None
  142.  *
  143.  * RETURN:      Status
  144.  *
  145.  * DESCRIPTION: Transfers the system into ACPI mode.
  146.  *
  147.  ******************************************************************************/
  148.  
  149. ACPI_STATUS
  150. AcpiEnable (
  151.     void)
  152. {
  153.     ACPI_STATUS             Status = AE_OK;
  154.  
  155.  
  156.     ACPI_FUNCTION_TRACE (AcpiEnable);
  157.  
  158.  
  159.     /* ACPI tables must be present */
  160.  
  161.     if (!AcpiTbTablesLoaded ())
  162.     {
  163.         return_ACPI_STATUS (AE_NO_ACPI_TABLES);
  164.     }
  165.  
  166.     /* Check current mode */
  167.  
  168.     if (AcpiHwGetMode() == ACPI_SYS_MODE_ACPI)
  169.     {
  170.         ACPI_DEBUG_PRINT ((ACPI_DB_INIT, "System is already in ACPI mode\n"));
  171.     }
  172.     else
  173.     {
  174.         /* Transition to ACPI mode */
  175.  
  176.         Status = AcpiHwSetMode (ACPI_SYS_MODE_ACPI);
  177.         if (ACPI_FAILURE (Status))
  178.         {
  179.             ACPI_ERROR ((AE_INFO, "Could not transition to ACPI mode"));
  180.             return_ACPI_STATUS (Status);
  181.         }
  182.  
  183.         ACPI_DEBUG_PRINT ((ACPI_DB_INIT,
  184.             "Transition to ACPI mode successful\n"));
  185.     }
  186.  
  187.     return_ACPI_STATUS (Status);
  188. }
  189.  
  190. ACPI_EXPORT_SYMBOL (AcpiEnable)
  191.  
  192.  
  193. /*******************************************************************************
  194.  *
  195.  * FUNCTION:    AcpiDisable
  196.  *
  197.  * PARAMETERS:  None
  198.  *
  199.  * RETURN:      Status
  200.  *
  201.  * DESCRIPTION: Transfers the system into LEGACY (non-ACPI) mode.
  202.  *
  203.  ******************************************************************************/
  204.  
  205. ACPI_STATUS
  206. AcpiDisable (
  207.     void)
  208. {
  209.     ACPI_STATUS             Status = AE_OK;
  210.  
  211.  
  212.     ACPI_FUNCTION_TRACE (AcpiDisable);
  213.  
  214.  
  215.     if (AcpiHwGetMode() == ACPI_SYS_MODE_LEGACY)
  216.     {
  217.         ACPI_DEBUG_PRINT ((ACPI_DB_INIT,
  218.             "System is already in legacy (non-ACPI) mode\n"));
  219.     }
  220.     else
  221.     {
  222.         /* Transition to LEGACY mode */
  223.  
  224.         Status = AcpiHwSetMode (ACPI_SYS_MODE_LEGACY);
  225.  
  226.         if (ACPI_FAILURE (Status))
  227.         {
  228.             ACPI_ERROR ((AE_INFO,
  229.                 "Could not exit ACPI mode to legacy mode"));
  230.             return_ACPI_STATUS (Status);
  231.         }
  232.  
  233.         ACPI_DEBUG_PRINT ((ACPI_DB_INIT, "ACPI mode disabled\n"));
  234.     }
  235.  
  236.     return_ACPI_STATUS (Status);
  237. }
  238.  
  239. ACPI_EXPORT_SYMBOL (AcpiDisable)
  240.  
  241.  
  242. /*******************************************************************************
  243.  *
  244.  * FUNCTION:    AcpiEnableEvent
  245.  *
  246.  * PARAMETERS:  Event           - The fixed eventto be enabled
  247.  *              Flags           - Reserved
  248.  *
  249.  * RETURN:      Status
  250.  *
  251.  * DESCRIPTION: Enable an ACPI event (fixed)
  252.  *
  253.  ******************************************************************************/
  254.  
  255. ACPI_STATUS
  256. AcpiEnableEvent (
  257.     UINT32                  Event,
  258.     UINT32                  Flags)
  259. {
  260.     ACPI_STATUS             Status = AE_OK;
  261.     UINT32                  Value;
  262.  
  263.  
  264.     ACPI_FUNCTION_TRACE (AcpiEnableEvent);
  265.  
  266.  
  267.     /* Decode the Fixed Event */
  268.  
  269.     if (Event > ACPI_EVENT_MAX)
  270.     {
  271.         return_ACPI_STATUS (AE_BAD_PARAMETER);
  272.     }
  273.  
  274.     /*
  275.      * Enable the requested fixed event (by writing a one to the enable
  276.      * register bit)
  277.      */
  278.     Status = AcpiWriteBitRegister (
  279.                 AcpiGbl_FixedEventInfo[Event].EnableRegisterId,
  280.                 ACPI_ENABLE_EVENT);
  281.     if (ACPI_FAILURE (Status))
  282.     {
  283.         return_ACPI_STATUS (Status);
  284.     }
  285.  
  286.     /* Make sure that the hardware responded */
  287.  
  288.     Status = AcpiReadBitRegister (
  289.                 AcpiGbl_FixedEventInfo[Event].EnableRegisterId, &Value);
  290.     if (ACPI_FAILURE (Status))
  291.     {
  292.         return_ACPI_STATUS (Status);
  293.     }
  294.  
  295.     if (Value != 1)
  296.     {
  297.         ACPI_ERROR ((AE_INFO,
  298.             "Could not enable %s event", AcpiUtGetEventName (Event)));
  299.         return_ACPI_STATUS (AE_NO_HARDWARE_RESPONSE);
  300.     }
  301.  
  302.     return_ACPI_STATUS (Status);
  303. }
  304.  
  305. ACPI_EXPORT_SYMBOL (AcpiEnableEvent)
  306.  
  307.  
  308. /*******************************************************************************
  309.  *
  310.  * FUNCTION:    AcpiEnableGpe
  311.  *
  312.  * PARAMETERS:  GpeDevice       - Parent GPE Device. NULL for GPE0/GPE1
  313.  *              GpeNumber       - GPE level within the GPE block
  314.  *              GpeType         - ACPI_GPE_TYPE_RUNTIME or ACPI_GPE_TYPE_WAKE
  315.  *                                or both
  316.  *
  317.  * RETURN:      Status
  318.  *
  319.  * DESCRIPTION: Add a reference to a GPE. On the first reference, the GPE is
  320.  *              hardware-enabled (for runtime GPEs), or the GPE register mask
  321.  *              is updated (for wake GPEs).
  322.  *
  323.  ******************************************************************************/
  324.  
  325. ACPI_STATUS
  326. AcpiEnableGpe (
  327.     ACPI_HANDLE             GpeDevice,
  328.     UINT32                  GpeNumber,
  329.     UINT8                   GpeType)
  330. {
  331.     ACPI_STATUS             Status = AE_OK;
  332.     ACPI_GPE_EVENT_INFO     *GpeEventInfo;
  333.     ACPI_CPU_FLAGS          Flags;
  334.  
  335.  
  336.     ACPI_FUNCTION_TRACE (AcpiEnableGpe);
  337.  
  338.  
  339.     /* Parameter validation */
  340.  
  341.     if (!GpeType || (GpeType & ~ACPI_GPE_TYPE_WAKE_RUN))
  342.     {
  343.         return_ACPI_STATUS (AE_BAD_PARAMETER);
  344.     }
  345.  
  346.     Flags = AcpiOsAcquireLock (AcpiGbl_GpeLock);
  347.  
  348.     /* Ensure that we have a valid GPE number */
  349.  
  350.     GpeEventInfo = AcpiEvGetGpeEventInfo (GpeDevice, GpeNumber);
  351.     if (!GpeEventInfo)
  352.     {
  353.         Status = AE_BAD_PARAMETER;
  354.         goto UnlockAndExit;
  355.     }
  356.  
  357.     if (GpeType & ACPI_GPE_TYPE_RUNTIME)
  358.     {
  359.         if (GpeEventInfo->RuntimeCount == ACPI_UINT8_MAX)
  360.         {
  361.             Status = AE_LIMIT; /* Too many references */
  362.             goto UnlockAndExit;
  363.         }
  364.  
  365.         GpeEventInfo->RuntimeCount++;
  366.         if (GpeEventInfo->RuntimeCount == 1)
  367.         {
  368.             Status = AcpiEvEnableGpe (GpeEventInfo);
  369.             if (ACPI_FAILURE (Status))
  370.             {
  371.                 GpeEventInfo->RuntimeCount--;
  372.                 goto UnlockAndExit;
  373.             }
  374.         }
  375.     }
  376.  
  377.     if (GpeType & ACPI_GPE_TYPE_WAKE)
  378.     {
  379.         /* The GPE must have the ability to wake the system */
  380.  
  381.         if (!(GpeEventInfo->Flags & ACPI_GPE_CAN_WAKE))
  382.         {
  383.             Status = AE_TYPE;
  384.             goto UnlockAndExit;
  385.         }
  386.  
  387.         if (GpeEventInfo->WakeupCount == ACPI_UINT8_MAX)
  388.         {
  389.             Status = AE_LIMIT; /* Too many references */
  390.             goto UnlockAndExit;
  391.         }
  392.  
  393.         /*
  394.          * Update the enable mask on the first wakeup reference. Wake GPEs
  395.          * are only hardware-enabled just before sleeping.
  396.          */
  397.         GpeEventInfo->WakeupCount++;
  398.         if (GpeEventInfo->WakeupCount == 1)
  399.         {
  400.             (void) AcpiEvUpdateGpeEnableMasks (GpeEventInfo);
  401.         }
  402.     }
  403.  
  404. UnlockAndExit:
  405.     AcpiOsReleaseLock (AcpiGbl_GpeLock, Flags);
  406.     return_ACPI_STATUS (Status);
  407. }
  408.  
  409. ACPI_EXPORT_SYMBOL (AcpiEnableGpe)
  410.  
  411.  
  412. /*******************************************************************************
  413.  *
  414.  * FUNCTION:    AcpiDisableGpe
  415.  *
  416.  * PARAMETERS:  GpeDevice       - Parent GPE Device. NULL for GPE0/GPE1
  417.  *              GpeNumber       - GPE level within the GPE block
  418.  *              GpeType         - ACPI_GPE_TYPE_RUNTIME or ACPI_GPE_TYPE_WAKE
  419.  *                                or both
  420.  *
  421.  * RETURN:      Status
  422.  *
  423.  * DESCRIPTION: Remove a reference to a GPE. When the last reference is
  424.  *              removed, only then is the GPE disabled (for runtime GPEs), or
  425.  *              the GPE mask bit disabled (for wake GPEs)
  426.  *
  427.  ******************************************************************************/
  428.  
  429. ACPI_STATUS
  430. AcpiDisableGpe (
  431.     ACPI_HANDLE             GpeDevice,
  432.     UINT32                  GpeNumber,
  433.     UINT8                   GpeType)
  434. {
  435.     ACPI_STATUS             Status = AE_OK;
  436.     ACPI_GPE_EVENT_INFO     *GpeEventInfo;
  437.     ACPI_CPU_FLAGS          Flags;
  438.  
  439.  
  440.     ACPI_FUNCTION_TRACE (AcpiDisableGpe);
  441.  
  442.  
  443.     /* Parameter validation */
  444.  
  445.     if (!GpeType || (GpeType & ~ACPI_GPE_TYPE_WAKE_RUN))
  446.     {
  447.         return_ACPI_STATUS (AE_BAD_PARAMETER);
  448.     }
  449.  
  450.     Flags = AcpiOsAcquireLock (AcpiGbl_GpeLock);
  451.  
  452.     /* Ensure that we have a valid GPE number */
  453.  
  454.     GpeEventInfo = AcpiEvGetGpeEventInfo (GpeDevice, GpeNumber);
  455.     if (!GpeEventInfo)
  456.     {
  457.         Status = AE_BAD_PARAMETER;
  458.         goto UnlockAndExit;
  459.     }
  460.  
  461.     /* Hardware-disable a runtime GPE on removal of the last reference */
  462.  
  463.     if (GpeType & ACPI_GPE_TYPE_RUNTIME)
  464.     {
  465.         if (!GpeEventInfo->RuntimeCount)
  466.         {
  467.             Status = AE_LIMIT; /* There are no references to remove */
  468.             goto UnlockAndExit;
  469.         }
  470.  
  471.         GpeEventInfo->RuntimeCount--;
  472.         if (!GpeEventInfo->RuntimeCount)
  473.         {
  474.             Status = AcpiEvDisableGpe (GpeEventInfo);
  475.             if (ACPI_FAILURE (Status))
  476.             {
  477.                 GpeEventInfo->RuntimeCount++;
  478.                 goto UnlockAndExit;
  479.             }
  480.         }
  481.     }
  482.  
  483.     /*
  484.      * Update masks for wake GPE on removal of the last reference.
  485.      * No need to hardware-disable wake GPEs here, they are not currently
  486.      * enabled.
  487.      */
  488.     if (GpeType & ACPI_GPE_TYPE_WAKE)
  489.     {
  490.         if (!GpeEventInfo->WakeupCount)
  491.         {
  492.             Status = AE_LIMIT; /* There are no references to remove */
  493.             goto UnlockAndExit;
  494.         }
  495.  
  496.         GpeEventInfo->WakeupCount--;
  497.         if (!GpeEventInfo->WakeupCount)
  498.         {
  499.             (void) AcpiEvUpdateGpeEnableMasks (GpeEventInfo);
  500.         }
  501.     }
  502.  
  503.  
  504. UnlockAndExit:
  505.     AcpiOsReleaseLock (AcpiGbl_GpeLock, Flags);
  506.     return_ACPI_STATUS (Status);
  507. }
  508.  
  509. ACPI_EXPORT_SYMBOL (AcpiDisableGpe)
  510.  
  511.  
  512. /*******************************************************************************
  513.  *
  514.  * FUNCTION:    AcpiSetGpe
  515.  *
  516.  * PARAMETERS:  GpeDevice       - Parent GPE Device. NULL for GPE0/GPE1
  517.  *              GpeNumber       - GPE level within the GPE block
  518.  *              Action          - ACPI_GPE_ENABLE or ACPI_GPE_DISABLE
  519.  *
  520.  * RETURN:      Status
  521.  *
  522.  * DESCRIPTION: Enable or disable an individual GPE. This function bypasses
  523.  *              the reference count mechanism used in the AcpiEnableGpe and
  524.  *              AcpiDisableGpe interfaces -- and should be used with care.
  525.  *
  526.  * Note: Typically used to disable a runtime GPE for short period of time,
  527.  * then re-enable it, without disturbing the existing reference counts. This
  528.  * is useful, for example, in the Embedded Controller (EC) driver.
  529.  *
  530.  ******************************************************************************/
  531.  
  532. ACPI_STATUS
  533. AcpiSetGpe (
  534.     ACPI_HANDLE             GpeDevice,
  535.     UINT32                  GpeNumber,
  536.     UINT8                   Action)
  537. {
  538.     ACPI_GPE_EVENT_INFO     *GpeEventInfo;
  539.     ACPI_STATUS             Status;
  540.     ACPI_CPU_FLAGS          Flags;
  541.  
  542.  
  543.     ACPI_FUNCTION_TRACE (AcpiSetGpe);
  544.  
  545.  
  546.     Flags = AcpiOsAcquireLock (AcpiGbl_GpeLock);
  547.  
  548.     /* Ensure that we have a valid GPE number */
  549.  
  550.     GpeEventInfo = AcpiEvGetGpeEventInfo (GpeDevice, GpeNumber);
  551.     if (!GpeEventInfo)
  552.     {
  553.         Status = AE_BAD_PARAMETER;
  554.         goto UnlockAndExit;
  555.     }
  556.  
  557.     /* Perform the action */
  558.  
  559.     switch (Action)
  560.     {
  561.     case ACPI_GPE_ENABLE:
  562.         Status = AcpiEvEnableGpe (GpeEventInfo);
  563.         break;
  564.  
  565.     case ACPI_GPE_DISABLE:
  566.         Status = AcpiEvDisableGpe (GpeEventInfo);
  567.         break;
  568.  
  569.     default:
  570.         Status = AE_BAD_PARAMETER;
  571.         break;
  572.     }
  573.  
  574. UnlockAndExit:
  575.     AcpiOsReleaseLock (AcpiGbl_GpeLock, Flags);
  576.     return_ACPI_STATUS (Status);
  577. }
  578.  
  579. ACPI_EXPORT_SYMBOL (AcpiSetGpe)
  580.  
  581.  
  582. /*******************************************************************************
  583.  *
  584.  * FUNCTION:    AcpiDisableEvent
  585.  *
  586.  * PARAMETERS:  Event           - The fixed eventto be enabled
  587.  *              Flags           - Reserved
  588.  *
  589.  * RETURN:      Status
  590.  *
  591.  * DESCRIPTION: Disable an ACPI event (fixed)
  592.  *
  593.  ******************************************************************************/
  594.  
  595. ACPI_STATUS
  596. AcpiDisableEvent (
  597.     UINT32                  Event,
  598.     UINT32                  Flags)
  599. {
  600.     ACPI_STATUS             Status = AE_OK;
  601.     UINT32                  Value;
  602.  
  603.  
  604.     ACPI_FUNCTION_TRACE (AcpiDisableEvent);
  605.  
  606.  
  607.     /* Decode the Fixed Event */
  608.  
  609.     if (Event > ACPI_EVENT_MAX)
  610.     {
  611.         return_ACPI_STATUS (AE_BAD_PARAMETER);
  612.     }
  613.  
  614.     /*
  615.      * Disable the requested fixed event (by writing a zero to the enable
  616.      * register bit)
  617.      */
  618.     Status = AcpiWriteBitRegister (
  619.                 AcpiGbl_FixedEventInfo[Event].EnableRegisterId,
  620.                 ACPI_DISABLE_EVENT);
  621.     if (ACPI_FAILURE (Status))
  622.     {
  623.         return_ACPI_STATUS (Status);
  624.     }
  625.  
  626.     Status = AcpiReadBitRegister (
  627.                 AcpiGbl_FixedEventInfo[Event].EnableRegisterId, &Value);
  628.     if (ACPI_FAILURE (Status))
  629.     {
  630.         return_ACPI_STATUS (Status);
  631.     }
  632.  
  633.     if (Value != 0)
  634.     {
  635.         ACPI_ERROR ((AE_INFO,
  636.             "Could not disable %s events", AcpiUtGetEventName (Event)));
  637.         return_ACPI_STATUS (AE_NO_HARDWARE_RESPONSE);
  638.     }
  639.  
  640.     return_ACPI_STATUS (Status);
  641. }
  642.  
  643. ACPI_EXPORT_SYMBOL (AcpiDisableEvent)
  644.  
  645.  
  646. /*******************************************************************************
  647.  *
  648.  * FUNCTION:    AcpiClearEvent
  649.  *
  650.  * PARAMETERS:  Event           - The fixed event to be cleared
  651.  *
  652.  * RETURN:      Status
  653.  *
  654.  * DESCRIPTION: Clear an ACPI event (fixed)
  655.  *
  656.  ******************************************************************************/
  657.  
  658. ACPI_STATUS
  659. AcpiClearEvent (
  660.     UINT32                  Event)
  661. {
  662.     ACPI_STATUS             Status = AE_OK;
  663.  
  664.  
  665.     ACPI_FUNCTION_TRACE (AcpiClearEvent);
  666.  
  667.  
  668.     /* Decode the Fixed Event */
  669.  
  670.     if (Event > ACPI_EVENT_MAX)
  671.     {
  672.         return_ACPI_STATUS (AE_BAD_PARAMETER);
  673.     }
  674.  
  675.     /*
  676.      * Clear the requested fixed event (By writing a one to the status
  677.      * register bit)
  678.      */
  679.     Status = AcpiWriteBitRegister (
  680.                 AcpiGbl_FixedEventInfo[Event].StatusRegisterId,
  681.                 ACPI_CLEAR_STATUS);
  682.  
  683.     return_ACPI_STATUS (Status);
  684. }
  685.  
  686. ACPI_EXPORT_SYMBOL (AcpiClearEvent)
  687.  
  688.  
  689. /*******************************************************************************
  690.  *
  691.  * FUNCTION:    AcpiClearGpe
  692.  *
  693.  * PARAMETERS:  GpeDevice       - Parent GPE Device. NULL for GPE0/GPE1
  694.  *              GpeNumber       - GPE level within the GPE block
  695.  *
  696.  * RETURN:      Status
  697.  *
  698.  * DESCRIPTION: Clear an ACPI event (general purpose)
  699.  *
  700.  ******************************************************************************/
  701.  
  702. ACPI_STATUS
  703. AcpiClearGpe (
  704.     ACPI_HANDLE             GpeDevice,
  705.     UINT32                  GpeNumber)
  706. {
  707.     ACPI_STATUS             Status = AE_OK;
  708.     ACPI_GPE_EVENT_INFO     *GpeEventInfo;
  709.     ACPI_CPU_FLAGS          Flags;
  710.  
  711.  
  712.     ACPI_FUNCTION_TRACE (AcpiClearGpe);
  713.  
  714.  
  715.     Flags = AcpiOsAcquireLock (AcpiGbl_GpeLock);
  716.  
  717.     /* Ensure that we have a valid GPE number */
  718.  
  719.     GpeEventInfo = AcpiEvGetGpeEventInfo (GpeDevice, GpeNumber);
  720.     if (!GpeEventInfo)
  721.     {
  722.         Status = AE_BAD_PARAMETER;
  723.         goto UnlockAndExit;
  724.     }
  725.  
  726.     Status = AcpiHwClearGpe (GpeEventInfo);
  727.  
  728. UnlockAndExit:
  729.     AcpiOsReleaseLock (AcpiGbl_GpeLock, Flags);
  730.     return_ACPI_STATUS (Status);
  731. }
  732.  
  733. ACPI_EXPORT_SYMBOL (AcpiClearGpe)
  734.  
  735.  
  736. /*******************************************************************************
  737.  *
  738.  * FUNCTION:    AcpiGetEventStatus
  739.  *
  740.  * PARAMETERS:  Event           - The fixed event
  741.  *              EventStatus     - Where the current status of the event will
  742.  *                                be returned
  743.  *
  744.  * RETURN:      Status
  745.  *
  746.  * DESCRIPTION: Obtains and returns the current status of the event
  747.  *
  748.  ******************************************************************************/
  749.  
  750. ACPI_STATUS
  751. AcpiGetEventStatus (
  752.     UINT32                  Event,
  753.     ACPI_EVENT_STATUS       *EventStatus)
  754. {
  755.     ACPI_STATUS             Status = AE_OK;
  756.  
  757.  
  758.     ACPI_FUNCTION_TRACE (AcpiGetEventStatus);
  759.  
  760.  
  761.     if (!EventStatus)
  762.     {
  763.         return_ACPI_STATUS (AE_BAD_PARAMETER);
  764.     }
  765.  
  766.     /* Decode the Fixed Event */
  767.  
  768.     if (Event > ACPI_EVENT_MAX)
  769.     {
  770.         return_ACPI_STATUS (AE_BAD_PARAMETER);
  771.     }
  772.  
  773.     /* Get the status of the requested fixed event */
  774.  
  775.     Status = AcpiReadBitRegister (
  776.                 AcpiGbl_FixedEventInfo[Event].StatusRegisterId, EventStatus);
  777.  
  778.     return_ACPI_STATUS (Status);
  779. }
  780.  
  781. ACPI_EXPORT_SYMBOL (AcpiGetEventStatus)
  782.  
  783.  
  784. /*******************************************************************************
  785.  *
  786.  * FUNCTION:    AcpiGetGpeStatus
  787.  *
  788.  * PARAMETERS:  GpeDevice       - Parent GPE Device. NULL for GPE0/GPE1
  789.  *              GpeNumber       - GPE level within the GPE block
  790.  *              EventStatus     - Where the current status of the event will
  791.  *                                be returned
  792.  *
  793.  * RETURN:      Status
  794.  *
  795.  * DESCRIPTION: Get status of an event (general purpose)
  796.  *
  797.  ******************************************************************************/
  798.  
  799. ACPI_STATUS
  800. AcpiGetGpeStatus (
  801.     ACPI_HANDLE             GpeDevice,
  802.     UINT32                  GpeNumber,
  803.     ACPI_EVENT_STATUS       *EventStatus)
  804. {
  805.     ACPI_STATUS             Status = AE_OK;
  806.     ACPI_GPE_EVENT_INFO     *GpeEventInfo;
  807.     ACPI_CPU_FLAGS          Flags;
  808.  
  809.  
  810.     ACPI_FUNCTION_TRACE (AcpiGetGpeStatus);
  811.  
  812.  
  813.     Flags = AcpiOsAcquireLock (AcpiGbl_GpeLock);
  814.  
  815.     /* Ensure that we have a valid GPE number */
  816.  
  817.     GpeEventInfo = AcpiEvGetGpeEventInfo (GpeDevice, GpeNumber);
  818.     if (!GpeEventInfo)
  819.     {
  820.         Status = AE_BAD_PARAMETER;
  821.         goto UnlockAndExit;
  822.     }
  823.  
  824.     /* Obtain status on the requested GPE number */
  825.  
  826.     Status = AcpiHwGetGpeStatus (GpeEventInfo, EventStatus);
  827.  
  828. UnlockAndExit:
  829.     AcpiOsReleaseLock (AcpiGbl_GpeLock, Flags);
  830.     return_ACPI_STATUS (Status);
  831. }
  832.  
  833. ACPI_EXPORT_SYMBOL (AcpiGetGpeStatus)
  834.  
  835.  
  836. /*******************************************************************************
  837.  *
  838.  * FUNCTION:    AcpiInstallGpeBlock
  839.  *
  840.  * PARAMETERS:  GpeDevice           - Handle to the parent GPE Block Device
  841.  *              GpeBlockAddress     - Address and SpaceID
  842.  *              RegisterCount       - Number of GPE register pairs in the block
  843.  *              InterruptNumber     - H/W interrupt for the block
  844.  *
  845.  * RETURN:      Status
  846.  *
  847.  * DESCRIPTION: Create and Install a block of GPE registers
  848.  *
  849.  ******************************************************************************/
  850.  
  851. ACPI_STATUS
  852. AcpiInstallGpeBlock (
  853.     ACPI_HANDLE             GpeDevice,
  854.     ACPI_GENERIC_ADDRESS    *GpeBlockAddress,
  855.     UINT32                  RegisterCount,
  856.     UINT32                  InterruptNumber)
  857. {
  858.     ACPI_STATUS             Status;
  859.     ACPI_OPERAND_OBJECT     *ObjDesc;
  860.     ACPI_NAMESPACE_NODE     *Node;
  861.     ACPI_GPE_BLOCK_INFO     *GpeBlock;
  862.  
  863.  
  864.     ACPI_FUNCTION_TRACE (AcpiInstallGpeBlock);
  865.  
  866.  
  867.     if ((!GpeDevice)       ||
  868.         (!GpeBlockAddress) ||
  869.         (!RegisterCount))
  870.     {
  871.         return_ACPI_STATUS (AE_BAD_PARAMETER);
  872.     }
  873.  
  874.     Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
  875.     if (ACPI_FAILURE (Status))
  876.     {
  877.         return (Status);
  878.     }
  879.  
  880.     Node = AcpiNsValidateHandle (GpeDevice);
  881.     if (!Node)
  882.     {
  883.         Status = AE_BAD_PARAMETER;
  884.         goto UnlockAndExit;
  885.     }
  886.  
  887.     /*
  888.      * For user-installed GPE Block Devices, the GpeBlockBaseNumber
  889.      * is always zero
  890.      */
  891.     Status = AcpiEvCreateGpeBlock (Node, GpeBlockAddress, RegisterCount,
  892.                 0, InterruptNumber, &GpeBlock);
  893.     if (ACPI_FAILURE (Status))
  894.     {
  895.         goto UnlockAndExit;
  896.     }
  897.  
  898.     /* Install block in the DeviceObject attached to the node */
  899.  
  900.     ObjDesc = AcpiNsGetAttachedObject (Node);
  901.     if (!ObjDesc)
  902.     {
  903.         /*
  904.          * No object, create a new one (Device nodes do not always have
  905.          * an attached object)
  906.          */
  907.         ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_DEVICE);
  908.         if (!ObjDesc)
  909.         {
  910.             Status = AE_NO_MEMORY;
  911.             goto UnlockAndExit;
  912.         }
  913.  
  914.         Status = AcpiNsAttachObject (Node, ObjDesc, ACPI_TYPE_DEVICE);
  915.  
  916.         /* Remove local reference to the object */
  917.  
  918.         AcpiUtRemoveReference (ObjDesc);
  919.         if (ACPI_FAILURE (Status))
  920.         {
  921.             goto UnlockAndExit;
  922.         }
  923.     }
  924.  
  925.     /* Now install the GPE block in the DeviceObject */
  926.  
  927.     ObjDesc->Device.GpeBlock = GpeBlock;
  928.  
  929.     /* Run the _PRW methods and enable the runtime GPEs in the new block */
  930.  
  931.     Status = AcpiEvInitializeGpeBlock (Node, GpeBlock);
  932.  
  933.  
  934. UnlockAndExit:
  935.     (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
  936.     return_ACPI_STATUS (Status);
  937. }
  938.  
  939. ACPI_EXPORT_SYMBOL (AcpiInstallGpeBlock)
  940.  
  941.  
  942. /*******************************************************************************
  943.  *
  944.  * FUNCTION:    AcpiRemoveGpeBlock
  945.  *
  946.  * PARAMETERS:  GpeDevice           - Handle to the parent GPE Block Device
  947.  *
  948.  * RETURN:      Status
  949.  *
  950.  * DESCRIPTION: Remove a previously installed block of GPE registers
  951.  *
  952.  ******************************************************************************/
  953.  
  954. ACPI_STATUS
  955. AcpiRemoveGpeBlock (
  956.     ACPI_HANDLE             GpeDevice)
  957. {
  958.     ACPI_OPERAND_OBJECT     *ObjDesc;
  959.     ACPI_STATUS             Status;
  960.     ACPI_NAMESPACE_NODE     *Node;
  961.  
  962.  
  963.     ACPI_FUNCTION_TRACE (AcpiRemoveGpeBlock);
  964.  
  965.  
  966.     if (!GpeDevice)
  967.     {
  968.         return_ACPI_STATUS (AE_BAD_PARAMETER);
  969.     }
  970.  
  971.     Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
  972.     if (ACPI_FAILURE (Status))
  973.     {
  974.         return (Status);
  975.     }
  976.  
  977.     Node = AcpiNsValidateHandle (GpeDevice);
  978.     if (!Node)
  979.     {
  980.         Status = AE_BAD_PARAMETER;
  981.         goto UnlockAndExit;
  982.     }
  983.  
  984.     /* Get the DeviceObject attached to the node */
  985.  
  986.     ObjDesc = AcpiNsGetAttachedObject (Node);
  987.     if (!ObjDesc ||
  988.         !ObjDesc->Device.GpeBlock)
  989.     {
  990.         return_ACPI_STATUS (AE_NULL_OBJECT);
  991.     }
  992.  
  993.     /* Delete the GPE block (but not the DeviceObject) */
  994.  
  995.     Status = AcpiEvDeleteGpeBlock (ObjDesc->Device.GpeBlock);
  996.     if (ACPI_SUCCESS (Status))
  997.     {
  998.         ObjDesc->Device.GpeBlock = NULL;
  999.     }
  1000.  
  1001. UnlockAndExit:
  1002.     (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
  1003.     return_ACPI_STATUS (Status);
  1004. }
  1005.  
  1006. ACPI_EXPORT_SYMBOL (AcpiRemoveGpeBlock)
  1007.  
  1008.  
  1009. /*******************************************************************************
  1010.  *
  1011.  * FUNCTION:    AcpiGetGpeDevice
  1012.  *
  1013.  * PARAMETERS:  Index               - System GPE index (0-CurrentGpeCount)
  1014.  *              GpeDevice           - Where the parent GPE Device is returned
  1015.  *
  1016.  * RETURN:      Status
  1017.  *
  1018.  * DESCRIPTION: Obtain the GPE device associated with the input index. A NULL
  1019.  *              gpe device indicates that the gpe number is contained in one of
  1020.  *              the FADT-defined gpe blocks. Otherwise, the GPE block device.
  1021.  *
  1022.  ******************************************************************************/
  1023.  
  1024. ACPI_STATUS
  1025. AcpiGetGpeDevice (
  1026.     UINT32                  Index,
  1027.     ACPI_HANDLE             *GpeDevice)
  1028. {
  1029.     ACPI_GPE_DEVICE_INFO    Info;
  1030.     ACPI_STATUS             Status;
  1031.  
  1032.  
  1033.     ACPI_FUNCTION_TRACE (AcpiGetGpeDevice);
  1034.  
  1035.  
  1036.     if (!GpeDevice)
  1037.     {
  1038.         return_ACPI_STATUS (AE_BAD_PARAMETER);
  1039.     }
  1040.  
  1041.     if (Index >= AcpiCurrentGpeCount)
  1042.     {
  1043.         return_ACPI_STATUS (AE_NOT_EXIST);
  1044.     }
  1045.  
  1046.     /* Setup and walk the GPE list */
  1047.  
  1048.     Info.Index = Index;
  1049.     Info.Status = AE_NOT_EXIST;
  1050.     Info.GpeDevice = NULL;
  1051.     Info.NextBlockBaseIndex = 0;
  1052.  
  1053.     Status = AcpiEvWalkGpeList (AcpiEvGetGpeDevice, &Info);
  1054.     if (ACPI_FAILURE (Status))
  1055.     {
  1056.         return_ACPI_STATUS (Status);
  1057.     }
  1058.  
  1059.     *GpeDevice = ACPI_CAST_PTR (ACPI_HANDLE, Info.GpeDevice);
  1060.     return_ACPI_STATUS (Info.Status);
  1061. }
  1062.  
  1063. ACPI_EXPORT_SYMBOL (AcpiGetGpeDevice)
  1064.  
  1065.  
  1066. /*******************************************************************************
  1067.  *
  1068.  * FUNCTION:    AcpiEvGetGpeDevice
  1069.  *
  1070.  * PARAMETERS:  GPE_WALK_CALLBACK
  1071.  *
  1072.  * RETURN:      Status
  1073.  *
  1074.  * DESCRIPTION: Matches the input GPE index (0-CurrentGpeCount) with a GPE
  1075.  *              block device. NULL if the GPE is one of the FADT-defined GPEs.
  1076.  *
  1077.  ******************************************************************************/
  1078.  
  1079. static ACPI_STATUS
  1080. AcpiEvGetGpeDevice (
  1081.     ACPI_GPE_XRUPT_INFO     *GpeXruptInfo,
  1082.     ACPI_GPE_BLOCK_INFO     *GpeBlock,
  1083.     void                    *Context)
  1084. {
  1085.     ACPI_GPE_DEVICE_INFO    *Info = Context;
  1086.  
  1087.  
  1088.     /* Increment Index by the number of GPEs in this block */
  1089.  
  1090.     Info->NextBlockBaseIndex += GpeBlock->GpeCount;
  1091.  
  1092.     if (Info->Index < Info->NextBlockBaseIndex)
  1093.     {
  1094.         /*
  1095.          * The GPE index is within this block, get the node. Leave the node
  1096.          * NULL for the FADT-defined GPEs
  1097.          */
  1098.         if ((GpeBlock->Node)->Type == ACPI_TYPE_DEVICE)
  1099.         {
  1100.             Info->GpeDevice = GpeBlock->Node;
  1101.         }
  1102.  
  1103.         Info->Status = AE_OK;
  1104.         return (AE_CTRL_END);
  1105.     }
  1106.  
  1107.     return (AE_OK);
  1108. }
  1109.  
  1110.  
  1111. /******************************************************************************
  1112.  *
  1113.  * FUNCTION:    AcpiDisableAllGpes
  1114.  *
  1115.  * PARAMETERS:  None
  1116.  *
  1117.  * RETURN:      Status
  1118.  *
  1119.  * DESCRIPTION: Disable and clear all GPEs in all GPE blocks
  1120.  *
  1121.  ******************************************************************************/
  1122.  
  1123. ACPI_STATUS
  1124. AcpiDisableAllGpes (
  1125.     void)
  1126. {
  1127.     ACPI_STATUS             Status;
  1128.  
  1129.  
  1130.     ACPI_FUNCTION_TRACE (AcpiDisableAllGpes);
  1131.  
  1132.  
  1133.     Status = AcpiUtAcquireMutex (ACPI_MTX_EVENTS);
  1134.     if (ACPI_FAILURE (Status))
  1135.     {
  1136.         return_ACPI_STATUS (Status);
  1137.     }
  1138.  
  1139.     Status = AcpiHwDisableAllGpes ();
  1140.     (void) AcpiUtReleaseMutex (ACPI_MTX_EVENTS);
  1141.  
  1142.     return_ACPI_STATUS (Status);
  1143. }
  1144.  
  1145.  
  1146. /******************************************************************************
  1147.  *
  1148.  * FUNCTION:    AcpiEnableAllRuntimeGpes
  1149.  *
  1150.  * PARAMETERS:  None
  1151.  *
  1152.  * RETURN:      Status
  1153.  *
  1154.  * DESCRIPTION: Enable all "runtime" GPEs, in all GPE blocks
  1155.  *
  1156.  ******************************************************************************/
  1157.  
  1158. ACPI_STATUS
  1159. AcpiEnableAllRuntimeGpes (
  1160.     void)
  1161. {
  1162.     ACPI_STATUS             Status;
  1163.  
  1164.  
  1165.     ACPI_FUNCTION_TRACE (AcpiEnableAllRuntimeGpes);
  1166.  
  1167.  
  1168.     Status = AcpiUtAcquireMutex (ACPI_MTX_EVENTS);
  1169.     if (ACPI_FAILURE (Status))
  1170.     {
  1171.         return_ACPI_STATUS (Status);
  1172.     }
  1173.  
  1174.     Status = AcpiHwEnableAllRuntimeGpes ();
  1175.     (void) AcpiUtReleaseMutex (ACPI_MTX_EVENTS);
  1176.  
  1177.     return_ACPI_STATUS (Status);
  1178. }
  1179.  
  1180.  
  1181.