evsci.c revision 83174
1/******************************************************************************* 2 * 3 * Module Name: evsci - System Control Interrupt configuration and 4 * legacy to ACPI mode state transition functions 5 * $Revision: 74 $ 6 * 7 ******************************************************************************/ 8 9/****************************************************************************** 10 * 11 * 1. Copyright Notice 12 * 13 * Some or all of this work - Copyright (c) 1999, 2000, 2001, Intel Corp. 14 * All rights reserved. 15 * 16 * 2. License 17 * 18 * 2.1. This is your license from Intel Corp. under its intellectual property 19 * rights. You may have additional license terms from the party that provided 20 * you this software, covering your right to use that party's intellectual 21 * property rights. 22 * 23 * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a 24 * copy of the source code appearing in this file ("Covered Code") an 25 * irrevocable, perpetual, worldwide license under Intel's copyrights in the 26 * base code distributed originally by Intel ("Original Intel Code") to copy, 27 * make derivatives, distribute, use and display any portion of the Covered 28 * Code in any form, with the right to sublicense such rights; and 29 * 30 * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent 31 * license (with the right to sublicense), under only those claims of Intel 32 * patents that are infringed by the Original Intel Code, to make, use, sell, 33 * offer to sell, and import the Covered Code and derivative works thereof 34 * solely to the minimum extent necessary to exercise the above copyright 35 * license, and in no event shall the patent license extend to any additions 36 * to or modifications of the Original Intel Code. No other license or right 37 * is granted directly or by implication, estoppel or otherwise; 38 * 39 * The above copyright and patent license is granted only if the following 40 * conditions are met: 41 * 42 * 3. Conditions 43 * 44 * 3.1. Redistribution of Source with Rights to Further Distribute Source. 45 * Redistribution of source code of any substantial portion of the Covered 46 * Code or modification with rights to further distribute source must include 47 * the above Copyright Notice, the above License, this list of Conditions, 48 * and the following Disclaimer and Export Compliance provision. In addition, 49 * Licensee must cause all Covered Code to which Licensee contributes to 50 * contain a file documenting the changes Licensee made to create that Covered 51 * Code and the date of any change. Licensee must include in that file the 52 * documentation of any changes made by any predecessor Licensee. Licensee 53 * must include a prominent statement that the modification is derived, 54 * directly or indirectly, from Original Intel Code. 55 * 56 * 3.2. Redistribution of Source with no Rights to Further Distribute Source. 57 * Redistribution of source code of any substantial portion of the Covered 58 * Code or modification without rights to further distribute source must 59 * include the following Disclaimer and Export Compliance provision in the 60 * documentation and/or other materials provided with distribution. In 61 * addition, Licensee may not authorize further sublicense of source of any 62 * portion of the Covered Code, and must include terms to the effect that the 63 * license from Licensee to its licensee is limited to the intellectual 64 * property embodied in the software Licensee provides to its licensee, and 65 * not to intellectual property embodied in modifications its licensee may 66 67 * make. 68 * 69 * 3.3. Redistribution of Executable. Redistribution in executable form of any 70 * substantial portion of the Covered Code or modification must reproduce the 71 * above Copyright Notice, and the following Disclaimer and Export Compliance 72 * provision in the documentation and/or other materials provided with the 73 * distribution. 74 * 75 * 3.4. Intel retains all right, title, and interest in and to the Original 76 * Intel Code. 77 * 78 * 3.5. Neither the name Intel nor any other trademark owned or controlled by 79 * Intel shall be used in advertising or otherwise to promote the sale, use or 80 * other dealings in products derived from or relating to the Covered Code 81 * without prior written authorization from Intel. 82 * 83 * 4. Disclaimer and Export Compliance 84 * 85 * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED 86 * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE 87 * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, 88 * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY 89 * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY 90 * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A 91 * PARTICULAR PURPOSE. 92 * 93 * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES 94 * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR 95 * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, 96 * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY 97 * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL 98 * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS 99 * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY 100 * LIMITED REMEDY. 101 * 102 * 4.3. Licensee shall not export, either directly or indirectly, any of this 103 * software or system incorporating such software without first obtaining any 104 * required license or other approval from the U. S. Department of Commerce or 105 * any other agency or department of the United States Government. In the 106 * event Licensee exports any such software from the United States or 107 * re-exports any such software from a foreign destination, Licensee shall 108 * ensure that the distribution and export/re-export of the software is in 109 * compliance with all laws, regulations, orders, or other restrictions of the 110 * U.S. Export Administration Regulations. Licensee agrees that neither it nor 111 * any of its subsidiaries will export/re-export any technical data, process, 112 * software, or service, directly or indirectly, to any country for which the 113 * United States government or any agency thereof requires an export license, 114 * other governmental approval, or letter of assurance, without first obtaining 115 * such license, approval or letter. 116 * 117 *****************************************************************************/ 118 119#include "acpi.h" 120#include "acnamesp.h" 121#include "achware.h" 122#include "acevents.h" 123 124 125#define _COMPONENT ACPI_EVENTS 126 MODULE_NAME ("evsci") 127 128 129/* 130 * Elements correspond to counts for TMR, NOT_USED, GBL, PWR_BTN, SLP_BTN, RTC, 131 * and GENERAL respectively. These counts are modified by the ACPI interrupt 132 * handler. 133 * 134 * TBD: [Investigate] Note that GENERAL should probably be split out into 135 * one element for each bit in the GPE registers 136 */ 137 138 139/******************************************************************************* 140 * 141 * FUNCTION: AcpiEvSciHandler 142 * 143 * PARAMETERS: Context - Calling Context 144 * 145 * RETURN: Status code indicates whether interrupt was handled. 146 * 147 * DESCRIPTION: Interrupt handler that will figure out what function or 148 * control method to call to deal with a SCI. Installed 149 * using BU interrupt support. 150 * 151 ******************************************************************************/ 152 153static UINT32 154AcpiEvSciHandler (void *Context) 155{ 156 UINT32 InterruptHandled = INTERRUPT_NOT_HANDLED; 157 158 159 FUNCTION_TRACE("EvSciHandler"); 160 161 162 /* 163 * Make sure that ACPI is enabled by checking SCI_EN. Note that we are 164 * required to treat the SCI interrupt as sharable, level, active low. 165 */ 166 if (!AcpiHwRegisterBitAccess (ACPI_READ, ACPI_MTX_DO_NOT_LOCK, SCI_EN)) 167 { 168 /* ACPI is not enabled; this interrupt cannot be for us */ 169 170 return_VALUE (INTERRUPT_NOT_HANDLED); 171 } 172 173 /* 174 * Fixed AcpiEvents: 175 * ------------- 176 * Check for and dispatch any Fixed AcpiEvents that have occurred 177 */ 178 InterruptHandled |= AcpiEvFixedEventDetect (); 179 180 /* 181 * GPEs: 182 * ----- 183 * Check for and dispatch any GPEs that have occurred 184 */ 185 InterruptHandled |= AcpiEvGpeDetect (); 186 187 return_VALUE (InterruptHandled); 188} 189 190 191/****************************************************************************** 192 * 193 * FUNCTION: AcpiEvInstallSciHandler 194 * 195 * PARAMETERS: none 196 * 197 * RETURN: Status 198 * 199 * DESCRIPTION: Installs SCI handler. 200 * 201 ******************************************************************************/ 202 203UINT32 204AcpiEvInstallSciHandler (void) 205{ 206 UINT32 Status = AE_OK; 207 208 209 FUNCTION_TRACE ("EvInstallSciHandler"); 210 211 212 Status = AcpiOsInstallInterruptHandler ((UINT32) AcpiGbl_FADT->SciInt, 213 AcpiEvSciHandler, NULL); 214 return_ACPI_STATUS (Status); 215} 216 217 218/****************************************************************************** 219 220 * 221 * FUNCTION: AcpiEvRemoveSciHandler 222 * 223 * PARAMETERS: none 224 * 225 * RETURN: E_OK if handler uninstalled OK, E_ERROR if handler was not 226 * installed to begin with 227 * 228 * DESCRIPTION: Restores original status of all fixed event enable bits and 229 * removes SCI handler. 230 * 231 ******************************************************************************/ 232 233ACPI_STATUS 234AcpiEvRemoveSciHandler (void) 235{ 236 FUNCTION_TRACE ("EvRemoveSciHandler"); 237 238 239#if 0 240 /* TBD:[Investigate] Figure this out!! Disable all events first ??? */ 241 242 if (OriginalFixedEnableBitStatus ^ 1 << AcpiEventIndex (TMR_FIXED_EVENT)) 243 { 244 AcpiEventDisableEvent (TMR_FIXED_EVENT); 245 } 246 247 if (OriginalFixedEnableBitStatus ^ 1 << AcpiEventIndex (GBL_FIXED_EVENT)) 248 { 249 AcpiEventDisableEvent (GBL_FIXED_EVENT); 250 } 251 252 if (OriginalFixedEnableBitStatus ^ 1 << AcpiEventIndex (PWR_BTN_FIXED_EVENT)) 253 { 254 AcpiEventDisableEvent (PWR_BTN_FIXED_EVENT); 255 } 256 257 if (OriginalFixedEnableBitStatus ^ 1 << AcpiEventIndex (SLP_BTN_FIXED_EVENT)) 258 { 259 AcpiEventDisableEvent (SLP_BTN_FIXED_EVENT); 260 } 261 262 if (OriginalFixedEnableBitStatus ^ 1 << AcpiEventIndex (RTC_FIXED_EVENT)) 263 { 264 AcpiEventDisableEvent (RTC_FIXED_EVENT); 265 } 266 267 OriginalFixedEnableBitStatus = 0; 268 269#endif 270 271 AcpiOsRemoveInterruptHandler ((UINT32) AcpiGbl_FADT->SciInt, 272 AcpiEvSciHandler); 273 274 return_ACPI_STATUS (AE_OK); 275} 276 277 278/******************************************************************************* 279 * 280 * FUNCTION: AcpiEvRestoreAcpiState 281 * 282 * PARAMETERS: none 283 * 284 * RETURN: none 285 * 286 * DESCRIPTION: Restore the original ACPI state of the machine 287 * 288 ******************************************************************************/ 289 290void 291AcpiEvRestoreAcpiState (void) 292{ 293 UINT32 Index; 294 295 296 FUNCTION_TRACE ("EvRestoreAcpiState"); 297 298 299 /* Restore the state of the chipset enable bits. */ 300 301 if (AcpiGbl_RestoreAcpiChipset == TRUE) 302 { 303 /* Restore the fixed events */ 304 305 if (AcpiHwRegisterRead (ACPI_MTX_LOCK, PM1_EN) != 306 AcpiGbl_Pm1EnableRegisterSave) 307 { 308 AcpiHwRegisterWrite (ACPI_MTX_LOCK, PM1_EN, 309 AcpiGbl_Pm1EnableRegisterSave); 310 } 311 312 313 /* Ensure that all status bits are clear */ 314 315 AcpiHwClearAcpiStatus (); 316 317 318 /* Now restore the GPEs */ 319 320 for (Index = 0; Index < DIV_2 (AcpiGbl_FADT->Gpe0BlkLen); Index++) 321 { 322 if (AcpiHwRegisterRead (ACPI_MTX_LOCK, GPE0_EN_BLOCK | Index) != 323 AcpiGbl_Gpe0EnableRegisterSave[Index]) 324 { 325 AcpiHwRegisterWrite (ACPI_MTX_LOCK, GPE0_EN_BLOCK | Index, 326 AcpiGbl_Gpe0EnableRegisterSave[Index]); 327 } 328 } 329 330 /* GPE 1 present? */ 331 332 if (AcpiGbl_FADT->Gpe1BlkLen) 333 { 334 for (Index = 0; Index < DIV_2 (AcpiGbl_FADT->Gpe1BlkLen); Index++) 335 { 336 if (AcpiHwRegisterRead (ACPI_MTX_LOCK, GPE1_EN_BLOCK | Index) != 337 AcpiGbl_Gpe1EnableRegisterSave[Index]) 338 { 339 AcpiHwRegisterWrite (ACPI_MTX_LOCK, GPE1_EN_BLOCK | Index, 340 AcpiGbl_Gpe1EnableRegisterSave[Index]); 341 } 342 } 343 } 344 345 if (AcpiHwGetMode() != AcpiGbl_OriginalMode) 346 { 347 AcpiHwSetMode (AcpiGbl_OriginalMode); 348 } 349 } 350 351 return_VOID; 352} 353 354 355/****************************************************************************** 356 * 357 * FUNCTION: AcpiEvTerminate 358 * 359 * PARAMETERS: none 360 * 361 * RETURN: none 362 * 363 * DESCRIPTION: free memory allocated for table storage. 364 * 365 ******************************************************************************/ 366 367void 368AcpiEvTerminate (void) 369{ 370 371 FUNCTION_TRACE ("EvTerminate"); 372 373 374 /* 375 * Free global tables, etc. 376 */ 377 if (AcpiGbl_GpeRegisters) 378 { 379 ACPI_MEM_FREE (AcpiGbl_GpeRegisters); 380 } 381 382 if (AcpiGbl_GpeInfo) 383 { 384 ACPI_MEM_FREE (AcpiGbl_GpeInfo); 385 } 386 387 return_VOID; 388} 389 390 391