[BACK]Return to evevent.c CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / sys / external / bsd / acpica / dist / events

Annotation of src/sys/external/bsd/acpica/dist/events/evevent.c, Revision 1.1.1.2.20.1

1.1       jruoho      1: /******************************************************************************
                      2:  *
                      3:  * Module Name: evevent - Fixed Event handling and dispatch
                      4:  *
                      5:  *****************************************************************************/
                      6:
1.1.1.2   jruoho      7: /*
1.1.1.2.20.1! tls         8:  * Copyright (C) 2000 - 2013, Intel Corp.
1.1       jruoho      9:  * All rights reserved.
                     10:  *
1.1.1.2   jruoho     11:  * Redistribution and use in source and binary forms, with or without
                     12:  * modification, are permitted provided that the following conditions
                     13:  * are met:
                     14:  * 1. Redistributions of source code must retain the above copyright
                     15:  *    notice, this list of conditions, and the following disclaimer,
                     16:  *    without modification.
                     17:  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
                     18:  *    substantially similar to the "NO WARRANTY" disclaimer below
                     19:  *    ("Disclaimer") and any redistribution must be conditioned upon
                     20:  *    including a substantially similar Disclaimer requirement for further
                     21:  *    binary redistribution.
                     22:  * 3. Neither the names of the above-listed copyright holders nor the names
                     23:  *    of any contributors may be used to endorse or promote products derived
                     24:  *    from this software without specific prior written permission.
                     25:  *
                     26:  * Alternatively, this software may be distributed under the terms of the
                     27:  * GNU General Public License ("GPL") version 2 as published by the Free
                     28:  * Software Foundation.
                     29:  *
                     30:  * NO WARRANTY
                     31:  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
                     32:  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
                     33:  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
                     34:  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
                     35:  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                     36:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
                     37:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     38:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
                     39:  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
                     40:  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
                     41:  * POSSIBILITY OF SUCH DAMAGES.
                     42:  */
1.1       jruoho     43:
                     44: #include "acpi.h"
                     45: #include "accommon.h"
                     46: #include "acevents.h"
                     47:
                     48: #define _COMPONENT          ACPI_EVENTS
                     49:         ACPI_MODULE_NAME    ("evevent")
                     50:
1.1.1.2.20.1! tls        51: #if (!ACPI_REDUCED_HARDWARE) /* Entire module */
        !            52:
1.1       jruoho     53: /* Local prototypes */
                     54:
                     55: static ACPI_STATUS
                     56: AcpiEvFixedEventInitialize (
                     57:     void);
                     58:
                     59: static UINT32
                     60: AcpiEvFixedEventDispatch (
                     61:     UINT32                  Event);
                     62:
                     63:
                     64: /*******************************************************************************
                     65:  *
                     66:  * FUNCTION:    AcpiEvInitializeEvents
                     67:  *
                     68:  * PARAMETERS:  None
                     69:  *
                     70:  * RETURN:      Status
                     71:  *
                     72:  * DESCRIPTION: Initialize global data structures for ACPI events (Fixed, GPE)
                     73:  *
                     74:  ******************************************************************************/
                     75:
                     76: ACPI_STATUS
                     77: AcpiEvInitializeEvents (
                     78:     void)
                     79: {
                     80:     ACPI_STATUS             Status;
                     81:
                     82:
                     83:     ACPI_FUNCTION_TRACE (EvInitializeEvents);
                     84:
                     85:
1.1.1.2.20.1! tls        86:     /* If Hardware Reduced flag is set, there are no fixed events */
        !            87:
        !            88:     if (AcpiGbl_ReducedHardware)
        !            89:     {
        !            90:         return_ACPI_STATUS (AE_OK);
        !            91:     }
        !            92:
1.1       jruoho     93:     /*
                     94:      * Initialize the Fixed and General Purpose Events. This is done prior to
                     95:      * enabling SCIs to prevent interrupts from occurring before the handlers
                     96:      * are installed.
                     97:      */
                     98:     Status = AcpiEvFixedEventInitialize ();
                     99:     if (ACPI_FAILURE (Status))
                    100:     {
                    101:         ACPI_EXCEPTION ((AE_INFO, Status,
                    102:             "Unable to initialize fixed events"));
                    103:         return_ACPI_STATUS (Status);
                    104:     }
                    105:
                    106:     Status = AcpiEvGpeInitialize ();
                    107:     if (ACPI_FAILURE (Status))
                    108:     {
                    109:         ACPI_EXCEPTION ((AE_INFO, Status,
                    110:             "Unable to initialize general purpose events"));
                    111:         return_ACPI_STATUS (Status);
                    112:     }
                    113:
                    114:     return_ACPI_STATUS (Status);
                    115: }
                    116:
                    117:
                    118: /*******************************************************************************
                    119:  *
                    120:  * FUNCTION:    AcpiEvInstallXruptHandlers
                    121:  *
                    122:  * PARAMETERS:  None
                    123:  *
                    124:  * RETURN:      Status
                    125:  *
                    126:  * DESCRIPTION: Install interrupt handlers for the SCI and Global Lock
                    127:  *
                    128:  ******************************************************************************/
                    129:
                    130: ACPI_STATUS
                    131: AcpiEvInstallXruptHandlers (
                    132:     void)
                    133: {
                    134:     ACPI_STATUS             Status;
                    135:
                    136:
                    137:     ACPI_FUNCTION_TRACE (EvInstallXruptHandlers);
                    138:
                    139:
1.1.1.2.20.1! tls       140:     /* If Hardware Reduced flag is set, there is no ACPI h/w */
        !           141:
        !           142:     if (AcpiGbl_ReducedHardware)
        !           143:     {
        !           144:         return_ACPI_STATUS (AE_OK);
        !           145:     }
        !           146:
1.1       jruoho    147:     /* Install the SCI handler */
                    148:
                    149:     Status = AcpiEvInstallSciHandler ();
                    150:     if (ACPI_FAILURE (Status))
                    151:     {
                    152:         ACPI_EXCEPTION ((AE_INFO, Status,
                    153:             "Unable to install System Control Interrupt handler"));
                    154:         return_ACPI_STATUS (Status);
                    155:     }
                    156:
                    157:     /* Install the handler for the Global Lock */
                    158:
                    159:     Status = AcpiEvInitGlobalLockHandler ();
                    160:     if (ACPI_FAILURE (Status))
                    161:     {
                    162:         ACPI_EXCEPTION ((AE_INFO, Status,
                    163:             "Unable to initialize Global Lock handler"));
                    164:         return_ACPI_STATUS (Status);
                    165:     }
                    166:
                    167:     AcpiGbl_EventsInitialized = TRUE;
                    168:     return_ACPI_STATUS (Status);
                    169: }
                    170:
                    171:
                    172: /*******************************************************************************
                    173:  *
                    174:  * FUNCTION:    AcpiEvFixedEventInitialize
                    175:  *
                    176:  * PARAMETERS:  None
                    177:  *
                    178:  * RETURN:      Status
                    179:  *
                    180:  * DESCRIPTION: Install the fixed event handlers and disable all fixed events.
                    181:  *
                    182:  ******************************************************************************/
                    183:
                    184: static ACPI_STATUS
                    185: AcpiEvFixedEventInitialize (
                    186:     void)
                    187: {
                    188:     UINT32                  i;
                    189:     ACPI_STATUS             Status;
                    190:
                    191:
                    192:     /*
                    193:      * Initialize the structure that keeps track of fixed event handlers and
                    194:      * enable the fixed events.
                    195:      */
                    196:     for (i = 0; i < ACPI_NUM_FIXED_EVENTS; i++)
                    197:     {
                    198:         AcpiGbl_FixedEventHandlers[i].Handler = NULL;
                    199:         AcpiGbl_FixedEventHandlers[i].Context = NULL;
                    200:
                    201:         /* Disable the fixed event */
                    202:
                    203:         if (AcpiGbl_FixedEventInfo[i].EnableRegisterId != 0xFF)
                    204:         {
                    205:             Status = AcpiWriteBitRegister (
                    206:                         AcpiGbl_FixedEventInfo[i].EnableRegisterId,
                    207:                         ACPI_DISABLE_EVENT);
                    208:             if (ACPI_FAILURE (Status))
                    209:             {
                    210:                 return (Status);
                    211:             }
                    212:         }
                    213:     }
                    214:
                    215:     return (AE_OK);
                    216: }
                    217:
                    218:
                    219: /*******************************************************************************
                    220:  *
                    221:  * FUNCTION:    AcpiEvFixedEventDetect
                    222:  *
                    223:  * PARAMETERS:  None
                    224:  *
                    225:  * RETURN:      INTERRUPT_HANDLED or INTERRUPT_NOT_HANDLED
                    226:  *
                    227:  * DESCRIPTION: Checks the PM status register for active fixed events
                    228:  *
                    229:  ******************************************************************************/
                    230:
                    231: UINT32
                    232: AcpiEvFixedEventDetect (
                    233:     void)
                    234: {
                    235:     UINT32                  IntStatus = ACPI_INTERRUPT_NOT_HANDLED;
                    236:     UINT32                  FixedStatus;
                    237:     UINT32                  FixedEnable;
                    238:     UINT32                  i;
                    239:
                    240:
                    241:     ACPI_FUNCTION_NAME (EvFixedEventDetect);
                    242:
                    243:
                    244:     /*
                    245:      * Read the fixed feature status and enable registers, as all the cases
                    246:      * depend on their values. Ignore errors here.
                    247:      */
                    248:     (void) AcpiHwRegisterRead (ACPI_REGISTER_PM1_STATUS, &FixedStatus);
                    249:     (void) AcpiHwRegisterRead (ACPI_REGISTER_PM1_ENABLE, &FixedEnable);
                    250:
                    251:     ACPI_DEBUG_PRINT ((ACPI_DB_INTERRUPTS,
                    252:         "Fixed Event Block: Enable %08X Status %08X\n",
                    253:         FixedEnable, FixedStatus));
                    254:
                    255:     /*
                    256:      * Check for all possible Fixed Events and dispatch those that are active
                    257:      */
                    258:     for (i = 0; i < ACPI_NUM_FIXED_EVENTS; i++)
                    259:     {
                    260:         /* Both the status and enable bits must be on for this event */
                    261:
                    262:         if ((FixedStatus & AcpiGbl_FixedEventInfo[i].StatusBitMask) &&
                    263:             (FixedEnable & AcpiGbl_FixedEventInfo[i].EnableBitMask))
                    264:         {
1.1.1.2   jruoho    265:             /*
                    266:              * Found an active (signalled) event. Invoke global event
                    267:              * handler if present.
                    268:              */
1.1       jruoho    269:             AcpiFixedEventCount[i]++;
1.1.1.2   jruoho    270:             if (AcpiGbl_GlobalEventHandler)
                    271:             {
                    272:                 AcpiGbl_GlobalEventHandler (ACPI_EVENT_TYPE_FIXED, NULL,
                    273:                      i, AcpiGbl_GlobalEventHandlerContext);
                    274:             }
                    275:
1.1       jruoho    276:             IntStatus |= AcpiEvFixedEventDispatch (i);
                    277:         }
                    278:     }
                    279:
                    280:     return (IntStatus);
                    281: }
                    282:
                    283:
                    284: /*******************************************************************************
                    285:  *
                    286:  * FUNCTION:    AcpiEvFixedEventDispatch
                    287:  *
                    288:  * PARAMETERS:  Event               - Event type
                    289:  *
                    290:  * RETURN:      INTERRUPT_HANDLED or INTERRUPT_NOT_HANDLED
                    291:  *
                    292:  * DESCRIPTION: Clears the status bit for the requested event, calls the
                    293:  *              handler that previously registered for the event.
1.1.1.2.20.1! tls       294:  *              NOTE: If there is no handler for the event, the event is
        !           295:  *              disabled to prevent further interrupts.
1.1       jruoho    296:  *
                    297:  ******************************************************************************/
                    298:
                    299: static UINT32
                    300: AcpiEvFixedEventDispatch (
                    301:     UINT32                  Event)
                    302: {
                    303:
                    304:     ACPI_FUNCTION_ENTRY ();
                    305:
                    306:
                    307:     /* Clear the status bit */
                    308:
                    309:     (void) AcpiWriteBitRegister (
                    310:             AcpiGbl_FixedEventInfo[Event].StatusRegisterId,
                    311:             ACPI_CLEAR_STATUS);
                    312:
                    313:     /*
1.1.1.2.20.1! tls       314:      * Make sure that a handler exists. If not, report an error
        !           315:      * and disable the event to prevent further interrupts.
1.1       jruoho    316:      */
1.1.1.2.20.1! tls       317:     if (!AcpiGbl_FixedEventHandlers[Event].Handler)
1.1       jruoho    318:     {
                    319:         (void) AcpiWriteBitRegister (
                    320:                 AcpiGbl_FixedEventInfo[Event].EnableRegisterId,
                    321:                 ACPI_DISABLE_EVENT);
                    322:
                    323:         ACPI_ERROR ((AE_INFO,
1.1.1.2.20.1! tls       324:             "No installed handler for fixed event - %s (%u), disabling",
        !           325:             AcpiUtGetEventName (Event), Event));
1.1       jruoho    326:
                    327:         return (ACPI_INTERRUPT_NOT_HANDLED);
                    328:     }
                    329:
                    330:     /* Invoke the Fixed Event handler */
                    331:
                    332:     return ((AcpiGbl_FixedEventHandlers[Event].Handler)(
                    333:                 AcpiGbl_FixedEventHandlers[Event].Context));
                    334: }
                    335:
1.1.1.2.20.1! tls       336: #endif /* !ACPI_REDUCED_HARDWARE */

CVSweb <webmaster@jp.NetBSD.org>