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