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 - 2012, 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/acpi.h> 46 #include "accommon.h" 47 #include "acevents.h" 48 49 #define _COMPONENT ACPI_EVENTS 50 ACPI_MODULE_NAME("evsci") 51 52 /* Local prototypes */ 53 static u32 ACPI_SYSTEM_XFACE acpi_ev_sci_xrupt_handler(void *context); 54 55 /******************************************************************************* 56 * 57 * FUNCTION: acpi_ev_sci_xrupt_handler 58 * 59 * PARAMETERS: Context - Calling Context 60 * 61 * RETURN: Status code indicates whether interrupt was handled. 62 * 63 * DESCRIPTION: Interrupt handler that will figure out what function or 64 * control method to call to deal with a SCI. 65 * 66 ******************************************************************************/ 67 68 static u32 ACPI_SYSTEM_XFACE acpi_ev_sci_xrupt_handler(void *context) 69 { 70 struct acpi_gpe_xrupt_info *gpe_xrupt_list = context; 71 u32 interrupt_handled = ACPI_INTERRUPT_NOT_HANDLED; 72 73 ACPI_FUNCTION_TRACE(ev_sci_xrupt_handler); 74 75 /* 76 * We are guaranteed by the ACPI CA initialization/shutdown code that 77 * if this interrupt handler is installed, ACPI is enabled. 78 */ 79 80 /* 81 * Fixed Events: 82 * Check for and dispatch any Fixed Events that have occurred 83 */ 84 interrupt_handled |= acpi_ev_fixed_event_detect(); 85 86 /* 87 * General Purpose Events: 88 * Check for and dispatch any GPEs that have occurred 89 */ 90 interrupt_handled |= acpi_ev_gpe_detect(gpe_xrupt_list); 91 92 return_UINT32(interrupt_handled); 93 } 94 95 /******************************************************************************* 96 * 97 * FUNCTION: acpi_ev_gpe_xrupt_handler 98 * 99 * PARAMETERS: Context - Calling Context 100 * 101 * RETURN: Status code indicates whether interrupt was handled. 102 * 103 * DESCRIPTION: Handler for GPE Block Device interrupts 104 * 105 ******************************************************************************/ 106 107 u32 ACPI_SYSTEM_XFACE acpi_ev_gpe_xrupt_handler(void *context) 108 { 109 struct acpi_gpe_xrupt_info *gpe_xrupt_list = context; 110 u32 interrupt_handled = ACPI_INTERRUPT_NOT_HANDLED; 111 112 ACPI_FUNCTION_TRACE(ev_gpe_xrupt_handler); 113 114 /* 115 * We are guaranteed by the ACPI CA initialization/shutdown code that 116 * if this interrupt handler is installed, ACPI is enabled. 117 */ 118 119 /* GPEs: Check for and dispatch any GPEs that have occurred */ 120 121 interrupt_handled |= acpi_ev_gpe_detect(gpe_xrupt_list); 122 123 return_UINT32(interrupt_handled); 124 } 125 126 /****************************************************************************** 127 * 128 * FUNCTION: acpi_ev_install_sci_handler 129 * 130 * PARAMETERS: none 131 * 132 * RETURN: Status 133 * 134 * DESCRIPTION: Installs SCI handler. 135 * 136 ******************************************************************************/ 137 138 u32 acpi_ev_install_sci_handler(void) 139 { 140 u32 status = AE_OK; 141 142 ACPI_FUNCTION_TRACE(ev_install_sci_handler); 143 144 status = 145 acpi_os_install_interrupt_handler((u32) acpi_gbl_FADT.sci_interrupt, 146 acpi_ev_sci_xrupt_handler, 147 acpi_gbl_gpe_xrupt_list_head); 148 return_ACPI_STATUS(status); 149 } 150 151 /****************************************************************************** 152 * 153 * FUNCTION: acpi_ev_remove_sci_handler 154 * 155 * PARAMETERS: none 156 * 157 * RETURN: E_OK if handler uninstalled OK, E_ERROR if handler was not 158 * installed to begin with 159 * 160 * DESCRIPTION: Remove the SCI interrupt handler. No further SCIs will be 161 * taken. 162 * 163 * Note: It doesn't seem important to disable all events or set the event 164 * enable registers to their original values. The OS should disable 165 * the SCI interrupt level when the handler is removed, so no more 166 * events will come in. 167 * 168 ******************************************************************************/ 169 170 acpi_status acpi_ev_remove_sci_handler(void) 171 { 172 acpi_status status; 173 174 ACPI_FUNCTION_TRACE(ev_remove_sci_handler); 175 176 /* Just let the OS remove the handler and disable the level */ 177 178 status = 179 acpi_os_remove_interrupt_handler((u32) acpi_gbl_FADT.sci_interrupt, 180 acpi_ev_sci_xrupt_handler); 181 182 return_ACPI_STATUS(status); 183 } 184