1 /******************************************************************************* 2 * 3 * Module Name: evsci - System Control Interrupt configuration and 4 * legacy to ACPI mode state transition functions 5 * 6 ******************************************************************************/ 7 8 /****************************************************************************** 9 * 10 * 1. Copyright Notice 11 * 12 * Some or all of this work - Copyright (c) 1999 - 2023, Intel Corp. 13 * All rights reserved. 14 * 15 * 2. License 16 * 17 * 2.1. This is your license from Intel Corp. under its intellectual property 18 * rights. You may have additional license terms from the party that provided 19 * you this software, covering your right to use that party's intellectual 20 * property rights. 21 * 22 * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a 23 * copy of the source code appearing in this file ("Covered Code") an 24 * irrevocable, perpetual, worldwide license under Intel's copyrights in the 25 * base code distributed originally by Intel ("Original Intel Code") to copy, 26 * make derivatives, distribute, use and display any portion of the Covered 27 * Code in any form, with the right to sublicense such rights; and 28 * 29 * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent 30 * license (with the right to sublicense), under only those claims of Intel 31 * patents that are infringed by the Original Intel Code, to make, use, sell, 32 * offer to sell, and import the Covered Code and derivative works thereof 33 * solely to the minimum extent necessary to exercise the above copyright 34 * license, and in no event shall the patent license extend to any additions 35 * to or modifications of the Original Intel Code. No other license or right 36 * is granted directly or by implication, estoppel or otherwise; 37 * 38 * The above copyright and patent license is granted only if the following 39 * conditions are met: 40 * 41 * 3. Conditions 42 * 43 * 3.1. Redistribution of Source with Rights to Further Distribute Source. 44 * Redistribution of source code of any substantial portion of the Covered 45 * Code or modification with rights to further distribute source must include 46 * the above Copyright Notice, the above License, this list of Conditions, 47 * and the following Disclaimer and Export Compliance provision. In addition, 48 * Licensee must cause all Covered Code to which Licensee contributes to 49 * contain a file documenting the changes Licensee made to create that Covered 50 * Code and the date of any change. Licensee must include in that file the 51 * documentation of any changes made by any predecessor Licensee. Licensee 52 * must include a prominent statement that the modification is derived, 53 * directly or indirectly, from Original Intel Code. 54 * 55 * 3.2. Redistribution of Source with no Rights to Further Distribute Source. 56 * Redistribution of source code of any substantial portion of the Covered 57 * Code or modification without rights to further distribute source must 58 * include the following Disclaimer and Export Compliance provision in the 59 * documentation and/or other materials provided with distribution. In 60 * addition, Licensee may not authorize further sublicense of source of any 61 * portion of the Covered Code, and must include terms to the effect that the 62 * license from Licensee to its licensee is limited to the intellectual 63 * property embodied in the software Licensee provides to its licensee, and 64 * not to intellectual property embodied in modifications its licensee may 65 66 * make. 67 * 68 * 3.3. Redistribution of Executable. Redistribution in executable form of any 69 * substantial portion of the Covered Code or modification must reproduce the 70 * above Copyright Notice, and the following Disclaimer and Export Compliance 71 * provision in the documentation and/or other materials provided with the 72 * distribution. 73 * 74 * 3.4. Intel retains all right, title, and interest in and to the Original 75 * Intel Code. 76 * 77 * 3.5. Neither the name Intel nor any other trademark owned or controlled by 78 * Intel shall be used in advertising or otherwise to promote the sale, use or 79 * other dealings in products derived from or relating to the Covered Code 80 * without prior written authorization from Intel. 81 * 82 * 4. Disclaimer and Export Compliance 83 * 84 * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED 85 * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE 86 * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, 87 * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY 88 * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY 89 * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A 90 * PARTICULAR PURPOSE. 91 * 92 * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES 93 * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR 94 * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, 95 * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY 96 * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL 97 * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS 98 * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY 99 * LIMITED REMEDY. 100 * 101 * 4.3. Licensee shall not export, either directly or indirectly, any of this 102 * software or system incorporating such software without first obtaining any 103 * required license or other approval from the U. S. Department of Commerce or 104 * any other agency or department of the United States Government. In the 105 * event Licensee exports any such software from the United States or 106 * re-exports any such software from a foreign destination, Licensee shall 107 * ensure that the distribution and export/re-export of the software is in 108 * compliance with all laws, regulations, orders, or other restrictions of the 109 * U.S. Export Administration Regulations. Licensee agrees that neither it nor 110 * any of its subsidiaries will export/re-export any technical data, process, 111 * software, or service, directly or indirectly, to any country for which the 112 * United States government or any agency thereof requires an export license, 113 * other governmental approval, or letter of assurance, without first obtaining 114 * such license, approval or letter. 115 * 116 ***************************************************************************** 117 * 118 * Alternatively, you may choose to be licensed under the terms of the 119 * following license: 120 * 121 * Redistribution and use in source and binary forms, with or without 122 * modification, are permitted provided that the following conditions 123 * are met: 124 * 1. Redistributions of source code must retain the above copyright 125 * notice, this list of conditions, and the following disclaimer, 126 * without modification. 127 * 2. Redistributions in binary form must reproduce at minimum a disclaimer 128 * substantially similar to the "NO WARRANTY" disclaimer below 129 * ("Disclaimer") and any redistribution must be conditioned upon 130 * including a substantially similar Disclaimer requirement for further 131 * binary redistribution. 132 * 3. Neither the names of the above-listed copyright holders nor the names 133 * of any contributors may be used to endorse or promote products derived 134 * from this software without specific prior written permission. 135 * 136 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 137 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 138 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 139 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 140 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 141 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 142 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 143 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 144 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 145 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 146 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 147 * 148 * Alternatively, you may choose to be licensed under the terms of the 149 * GNU General Public License ("GPL") version 2 as published by the Free 150 * Software Foundation. 151 * 152 *****************************************************************************/ 153 154 #include <contrib/dev/acpica/include/acpi.h> 155 #include <contrib/dev/acpica/include/accommon.h> 156 #include <contrib/dev/acpica/include/acevents.h> 157 158 159 #define _COMPONENT ACPI_EVENTS 160 ACPI_MODULE_NAME ("evsci") 161 162 #if (!ACPI_REDUCED_HARDWARE) /* Entire module */ 163 164 /* Local prototypes */ 165 166 static UINT32 ACPI_SYSTEM_XFACE 167 AcpiEvSciXruptHandler ( 168 void *Context); 169 170 171 /******************************************************************************* 172 * 173 * FUNCTION: AcpiEvSciDispatch 174 * 175 * PARAMETERS: None 176 * 177 * RETURN: Status code indicates whether interrupt was handled. 178 * 179 * DESCRIPTION: Dispatch the SCI to all host-installed SCI handlers. 180 * 181 ******************************************************************************/ 182 183 UINT32 184 AcpiEvSciDispatch ( 185 void) 186 { 187 ACPI_SCI_HANDLER_INFO *SciHandler; 188 ACPI_CPU_FLAGS Flags; 189 UINT32 IntStatus = ACPI_INTERRUPT_NOT_HANDLED; 190 191 192 ACPI_FUNCTION_NAME (EvSciDispatch); 193 194 195 /* Are there any host-installed SCI handlers? */ 196 197 if (!AcpiGbl_SciHandlerList) 198 { 199 return (IntStatus); 200 } 201 202 Flags = AcpiOsAcquireLock (AcpiGbl_GpeLock); 203 204 /* Invoke all host-installed SCI handlers */ 205 206 SciHandler = AcpiGbl_SciHandlerList; 207 while (SciHandler) 208 { 209 /* Invoke the installed handler (at interrupt level) */ 210 211 IntStatus |= SciHandler->Address ( 212 SciHandler->Context); 213 214 SciHandler = SciHandler->Next; 215 } 216 217 AcpiOsReleaseLock (AcpiGbl_GpeLock, Flags); 218 return (IntStatus); 219 } 220 221 222 /******************************************************************************* 223 * 224 * FUNCTION: AcpiEvSciXruptHandler 225 * 226 * PARAMETERS: Context - Calling Context 227 * 228 * RETURN: Status code indicates whether interrupt was handled. 229 * 230 * DESCRIPTION: Interrupt handler that will figure out what function or 231 * control method to call to deal with a SCI. 232 * 233 ******************************************************************************/ 234 235 static UINT32 ACPI_SYSTEM_XFACE 236 AcpiEvSciXruptHandler ( 237 void *Context) 238 { 239 ACPI_GPE_XRUPT_INFO *GpeXruptList = Context; 240 UINT32 InterruptHandled = ACPI_INTERRUPT_NOT_HANDLED; 241 242 243 ACPI_FUNCTION_TRACE (EvSciXruptHandler); 244 245 246 /* 247 * We are guaranteed by the ACPICA initialization/shutdown code that 248 * if this interrupt handler is installed, ACPI is enabled. 249 */ 250 251 /* 252 * Fixed Events: 253 * Check for and dispatch any Fixed Events that have occurred 254 */ 255 InterruptHandled |= AcpiEvFixedEventDetect (); 256 257 /* 258 * General Purpose Events: 259 * Check for and dispatch any GPEs that have occurred 260 */ 261 InterruptHandled |= AcpiEvGpeDetect (GpeXruptList); 262 263 /* Invoke all host-installed SCI handlers */ 264 265 InterruptHandled |= AcpiEvSciDispatch (); 266 267 AcpiSciCount++; 268 return_UINT32 (InterruptHandled); 269 } 270 271 272 /******************************************************************************* 273 * 274 * FUNCTION: AcpiEvGpeXruptHandler 275 * 276 * PARAMETERS: Context - Calling Context 277 * 278 * RETURN: Status code indicates whether interrupt was handled. 279 * 280 * DESCRIPTION: Handler for GPE Block Device interrupts 281 * 282 ******************************************************************************/ 283 284 UINT32 ACPI_SYSTEM_XFACE 285 AcpiEvGpeXruptHandler ( 286 void *Context) 287 { 288 ACPI_GPE_XRUPT_INFO *GpeXruptList = Context; 289 UINT32 InterruptHandled = ACPI_INTERRUPT_NOT_HANDLED; 290 291 292 ACPI_FUNCTION_TRACE (EvGpeXruptHandler); 293 294 295 /* 296 * We are guaranteed by the ACPICA initialization/shutdown code that 297 * if this interrupt handler is installed, ACPI is enabled. 298 */ 299 300 /* GPEs: Check for and dispatch any GPEs that have occurred */ 301 302 InterruptHandled |= AcpiEvGpeDetect (GpeXruptList); 303 return_UINT32 (InterruptHandled); 304 } 305 306 307 /****************************************************************************** 308 * 309 * FUNCTION: AcpiEvInstallSciHandler 310 * 311 * PARAMETERS: none 312 * 313 * RETURN: Status 314 * 315 * DESCRIPTION: Installs SCI handler. 316 * 317 ******************************************************************************/ 318 319 UINT32 320 AcpiEvInstallSciHandler ( 321 void) 322 { 323 UINT32 Status = AE_OK; 324 325 326 ACPI_FUNCTION_TRACE (EvInstallSciHandler); 327 328 329 Status = AcpiOsInstallInterruptHandler ((UINT32) AcpiGbl_FADT.SciInterrupt, 330 AcpiEvSciXruptHandler, AcpiGbl_GpeXruptListHead); 331 return_ACPI_STATUS (Status); 332 } 333 334 335 /****************************************************************************** 336 * 337 * FUNCTION: AcpiEvRemoveAllSciHandlers 338 * 339 * PARAMETERS: none 340 * 341 * RETURN: AE_OK if handler uninstalled, AE_ERROR if handler was not 342 * installed to begin with 343 * 344 * DESCRIPTION: Remove the SCI interrupt handler. No further SCIs will be 345 * taken. Remove all host-installed SCI handlers. 346 * 347 * Note: It doesn't seem important to disable all events or set the event 348 * enable registers to their original values. The OS should disable 349 * the SCI interrupt level when the handler is removed, so no more 350 * events will come in. 351 * 352 ******************************************************************************/ 353 354 ACPI_STATUS 355 AcpiEvRemoveAllSciHandlers ( 356 void) 357 { 358 ACPI_SCI_HANDLER_INFO *SciHandler; 359 ACPI_CPU_FLAGS Flags; 360 ACPI_STATUS Status; 361 362 363 ACPI_FUNCTION_TRACE (EvRemoveAllSciHandlers); 364 365 366 /* Just let the OS remove the handler and disable the level */ 367 368 Status = AcpiOsRemoveInterruptHandler ((UINT32) AcpiGbl_FADT.SciInterrupt, 369 AcpiEvSciXruptHandler); 370 371 if (!AcpiGbl_SciHandlerList) 372 { 373 return (Status); 374 } 375 376 Flags = AcpiOsAcquireLock (AcpiGbl_GpeLock); 377 378 /* Free all host-installed SCI handlers */ 379 380 while (AcpiGbl_SciHandlerList) 381 { 382 SciHandler = AcpiGbl_SciHandlerList; 383 AcpiGbl_SciHandlerList = SciHandler->Next; 384 ACPI_FREE (SciHandler); 385 } 386 387 AcpiOsReleaseLock (AcpiGbl_GpeLock, Flags); 388 return_ACPI_STATUS (Status); 389 } 390 391 #endif /* !ACPI_REDUCED_HARDWARE */ 392