Home | History | Annotate | Line # | Download | only in events
evsci.c revision 1.1.1.2
      1 /*******************************************************************************
      2  *
      3  * Module Name: evsci - System Control Interrupt configuration and
      4  *                      legacy to ACPI mode state transition functions
      5  *
      6  ******************************************************************************/
      7 
      8 /*
      9  * Copyright (C) 2000 - 2011, Intel Corp.
     10  * All rights reserved.
     11  *
     12  * Redistribution and use in source and binary forms, with or without
     13  * modification, are permitted provided that the following conditions
     14  * are met:
     15  * 1. Redistributions of source code must retain the above copyright
     16  *    notice, this list of conditions, and the following disclaimer,
     17  *    without modification.
     18  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
     19  *    substantially similar to the "NO WARRANTY" disclaimer below
     20  *    ("Disclaimer") and any redistribution must be conditioned upon
     21  *    including a substantially similar Disclaimer requirement for further
     22  *    binary redistribution.
     23  * 3. Neither the names of the above-listed copyright holders nor the names
     24  *    of any contributors may be used to endorse or promote products derived
     25  *    from this software without specific prior written permission.
     26  *
     27  * Alternatively, this software may be distributed under the terms of the
     28  * GNU General Public License ("GPL") version 2 as published by the Free
     29  * Software Foundation.
     30  *
     31  * NO WARRANTY
     32  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     33  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     34  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
     35  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     36  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     37  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     38  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     39  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
     40  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
     41  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     42  * POSSIBILITY OF SUCH DAMAGES.
     43  */
     44 
     45 #include "acpi.h"
     46 #include "accommon.h"
     47 #include "acevents.h"
     48 
     49 
     50 #define _COMPONENT          ACPI_EVENTS
     51         ACPI_MODULE_NAME    ("evsci")
     52 
     53 /* Local prototypes */
     54 
     55 static UINT32 ACPI_SYSTEM_XFACE
     56 AcpiEvSciXruptHandler (
     57     void                    *Context);
     58 
     59 
     60 /*******************************************************************************
     61  *
     62  * FUNCTION:    AcpiEvSciXruptHandler
     63  *
     64  * PARAMETERS:  Context   - Calling Context
     65  *
     66  * RETURN:      Status code indicates whether interrupt was handled.
     67  *
     68  * DESCRIPTION: Interrupt handler that will figure out what function or
     69  *              control method to call to deal with a SCI.
     70  *
     71  ******************************************************************************/
     72 
     73 static UINT32 ACPI_SYSTEM_XFACE
     74 AcpiEvSciXruptHandler (
     75     void                    *Context)
     76 {
     77     ACPI_GPE_XRUPT_INFO     *GpeXruptList = Context;
     78     UINT32                  InterruptHandled = ACPI_INTERRUPT_NOT_HANDLED;
     79 
     80 
     81     ACPI_FUNCTION_TRACE (EvSciXruptHandler);
     82 
     83 
     84     /*
     85      * We are guaranteed by the ACPI CA initialization/shutdown code that
     86      * if this interrupt handler is installed, ACPI is enabled.
     87      */
     88 
     89     /*
     90      * Fixed Events:
     91      * Check for and dispatch any Fixed Events that have occurred
     92      */
     93     InterruptHandled |= AcpiEvFixedEventDetect ();
     94 
     95     /*
     96      * General Purpose Events:
     97      * Check for and dispatch any GPEs that have occurred
     98      */
     99     InterruptHandled |= AcpiEvGpeDetect (GpeXruptList);
    100 
    101     AcpiSciCount++;
    102     return_UINT32 (InterruptHandled);
    103 }
    104 
    105 
    106 /*******************************************************************************
    107  *
    108  * FUNCTION:    AcpiEvGpeXruptHandler
    109  *
    110  * PARAMETERS:  Context   - Calling Context
    111  *
    112  * RETURN:      Status code indicates whether interrupt was handled.
    113  *
    114  * DESCRIPTION: Handler for GPE Block Device interrupts
    115  *
    116  ******************************************************************************/
    117 
    118 UINT32 ACPI_SYSTEM_XFACE
    119 AcpiEvGpeXruptHandler (
    120     void                    *Context)
    121 {
    122     ACPI_GPE_XRUPT_INFO     *GpeXruptList = Context;
    123     UINT32                  InterruptHandled = ACPI_INTERRUPT_NOT_HANDLED;
    124 
    125 
    126     ACPI_FUNCTION_TRACE (EvGpeXruptHandler);
    127 
    128 
    129     /*
    130      * We are guaranteed by the ACPI CA initialization/shutdown code that
    131      * if this interrupt handler is installed, ACPI is enabled.
    132      */
    133 
    134     /* GPEs: Check for and dispatch any GPEs that have occurred */
    135 
    136     InterruptHandled |= AcpiEvGpeDetect (GpeXruptList);
    137 
    138     return_UINT32 (InterruptHandled);
    139 }
    140 
    141 
    142 /******************************************************************************
    143  *
    144  * FUNCTION:    AcpiEvInstallSciHandler
    145  *
    146  * PARAMETERS:  none
    147  *
    148  * RETURN:      Status
    149  *
    150  * DESCRIPTION: Installs SCI handler.
    151  *
    152  ******************************************************************************/
    153 
    154 UINT32
    155 AcpiEvInstallSciHandler (
    156     void)
    157 {
    158     UINT32                  Status = AE_OK;
    159 
    160 
    161     ACPI_FUNCTION_TRACE (EvInstallSciHandler);
    162 
    163 
    164     Status = AcpiOsInstallInterruptHandler ((UINT32) AcpiGbl_FADT.SciInterrupt,
    165                 AcpiEvSciXruptHandler, AcpiGbl_GpeXruptListHead);
    166     return_ACPI_STATUS (Status);
    167 }
    168 
    169 
    170 /******************************************************************************
    171  *
    172  * FUNCTION:    AcpiEvRemoveSciHandler
    173  *
    174  * PARAMETERS:  none
    175  *
    176  * RETURN:      E_OK if handler uninstalled OK, E_ERROR if handler was not
    177  *              installed to begin with
    178  *
    179  * DESCRIPTION: Remove the SCI interrupt handler. No further SCIs will be
    180  *              taken.
    181  *
    182  * Note:  It doesn't seem important to disable all events or set the event
    183  *        enable registers to their original values. The OS should disable
    184  *        the SCI interrupt level when the handler is removed, so no more
    185  *        events will come in.
    186  *
    187  ******************************************************************************/
    188 
    189 ACPI_STATUS
    190 AcpiEvRemoveSciHandler (
    191     void)
    192 {
    193     ACPI_STATUS             Status;
    194 
    195 
    196     ACPI_FUNCTION_TRACE (EvRemoveSciHandler);
    197 
    198 
    199     /* Just let the OS remove the handler and disable the level */
    200 
    201     Status = AcpiOsRemoveInterruptHandler ((UINT32) AcpiGbl_FADT.SciInterrupt,
    202                 AcpiEvSciXruptHandler);
    203 
    204     return_ACPI_STATUS (Status);
    205 }
    206 
    207 
    208