1 2 /****************************************************************************** 3 * 4 * Module Name: hwgpe - Low level GPE enable/disable/clear functions 5 * $Revision: 1.76 $ 6 * 7 *****************************************************************************/ 8 9 /****************************************************************************** 10 * 11 * 1. Copyright Notice 12 * 13 * Some or all of this work - Copyright (c) 1999 - 2008, 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 * 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 #include "acpi.h" 119 #include "acevents.h" 120 121 #define _COMPONENT ACPI_HARDWARE 122 ACPI_MODULE_NAME ("hwgpe") 123 124 /* Local prototypes */ 125 126 static ACPI_STATUS 127 AcpiHwEnableWakeupGpeBlock ( 128 ACPI_GPE_XRUPT_INFO *GpeXruptInfo, 129 ACPI_GPE_BLOCK_INFO *GpeBlock); 130 131 132 133 /****************************************************************************** 134 * 135 * FUNCTION: AcpiHwLowDisableGpe 136 * 137 * PARAMETERS: GpeEventInfo - Info block for the GPE to be disabled 138 * 139 * RETURN: Status 140 * 141 * DESCRIPTION: Disable a single GPE in the enable register. 142 * 143 ******************************************************************************/ 144 145 ACPI_STATUS 146 AcpiHwLowDisableGpe ( 147 ACPI_GPE_EVENT_INFO *GpeEventInfo) 148 { 149 ACPI_GPE_REGISTER_INFO *GpeRegisterInfo; 150 ACPI_STATUS Status; 151 UINT32 EnableMask; 152 153 154 /* Get the info block for the entire GPE register */ 155 156 GpeRegisterInfo = GpeEventInfo->RegisterInfo; 157 if (!GpeRegisterInfo) 158 { 159 return (AE_NOT_EXIST); 160 } 161 162 /* Get current value of the enable register that contains this GPE */ 163 164 Status = AcpiHwLowLevelRead (ACPI_GPE_REGISTER_WIDTH, &EnableMask, 165 &GpeRegisterInfo->EnableAddress); 166 if (ACPI_FAILURE (Status)) 167 { 168 return (Status); 169 } 170 171 /* Clear just the bit that corresponds to this GPE */ 172 173 ACPI_CLEAR_BIT (EnableMask, 174 ((UINT32) 1 << (GpeEventInfo->GpeNumber - GpeRegisterInfo->BaseGpeNumber))); 175 176 177 /* Write the updated enable mask */ 178 179 Status = AcpiHwLowLevelWrite (ACPI_GPE_REGISTER_WIDTH, EnableMask, 180 &GpeRegisterInfo->EnableAddress); 181 182 return (Status); 183 } 184 185 186 /****************************************************************************** 187 * 188 * FUNCTION: AcpiHwWriteGpeEnableReg 189 * 190 * PARAMETERS: GpeEventInfo - Info block for the GPE to be enabled 191 * 192 * RETURN: Status 193 * 194 * DESCRIPTION: Write a GPE enable register. Note: The bit for this GPE must 195 * already be cleared or set in the parent register 196 * EnableForRun mask. 197 * 198 ******************************************************************************/ 199 200 ACPI_STATUS 201 AcpiHwWriteGpeEnableReg ( 202 ACPI_GPE_EVENT_INFO *GpeEventInfo) 203 { 204 ACPI_GPE_REGISTER_INFO *GpeRegisterInfo; 205 ACPI_STATUS Status; 206 207 208 ACPI_FUNCTION_ENTRY (); 209 210 211 /* Get the info block for the entire GPE register */ 212 213 GpeRegisterInfo = GpeEventInfo->RegisterInfo; 214 if (!GpeRegisterInfo) 215 { 216 return (AE_NOT_EXIST); 217 } 218 219 /* Write the entire GPE (runtime) enable register */ 220 221 Status = AcpiHwLowLevelWrite (8, GpeRegisterInfo->EnableForRun, 222 &GpeRegisterInfo->EnableAddress); 223 224 return (Status); 225 } 226 227 228 /****************************************************************************** 229 * 230 * FUNCTION: AcpiHwClearGpe 231 * 232 * PARAMETERS: GpeEventInfo - Info block for the GPE to be cleared 233 * 234 * RETURN: Status 235 * 236 * DESCRIPTION: Clear the status bit for a single GPE. 237 * 238 ******************************************************************************/ 239 240 ACPI_STATUS 241 AcpiHwClearGpe ( 242 ACPI_GPE_EVENT_INFO *GpeEventInfo) 243 { 244 ACPI_STATUS Status; 245 UINT8 RegisterBit; 246 247 248 ACPI_FUNCTION_ENTRY (); 249 250 251 RegisterBit = (UINT8) 252 (1 << (GpeEventInfo->GpeNumber - GpeEventInfo->RegisterInfo->BaseGpeNumber)); 253 254 /* 255 * Write a one to the appropriate bit in the status register to 256 * clear this GPE. 257 */ 258 Status = AcpiHwLowLevelWrite (8, RegisterBit, 259 &GpeEventInfo->RegisterInfo->StatusAddress); 260 261 return (Status); 262 } 263 264 265 /****************************************************************************** 266 * 267 * FUNCTION: AcpiHwGetGpeStatus 268 * 269 * PARAMETERS: GpeEventInfo - Info block for the GPE to queried 270 * EventStatus - Where the GPE status is returned 271 * 272 * RETURN: Status 273 * 274 * DESCRIPTION: Return the status of a single GPE. 275 * 276 ******************************************************************************/ 277 278 ACPI_STATUS 279 AcpiHwGetGpeStatus ( 280 ACPI_GPE_EVENT_INFO *GpeEventInfo, 281 ACPI_EVENT_STATUS *EventStatus) 282 { 283 UINT32 InByte; 284 UINT8 RegisterBit; 285 ACPI_GPE_REGISTER_INFO *GpeRegisterInfo; 286 ACPI_STATUS Status; 287 ACPI_EVENT_STATUS LocalEventStatus = 0; 288 289 290 ACPI_FUNCTION_ENTRY (); 291 292 293 if (!EventStatus) 294 { 295 return (AE_BAD_PARAMETER); 296 } 297 298 /* Get the info block for the entire GPE register */ 299 300 GpeRegisterInfo = GpeEventInfo->RegisterInfo; 301 302 /* Get the register bitmask for this GPE */ 303 304 RegisterBit = (UINT8) 305 (1 << (GpeEventInfo->GpeNumber - GpeEventInfo->RegisterInfo->BaseGpeNumber)); 306 307 /* GPE currently enabled? (enabled for runtime?) */ 308 309 if (RegisterBit & GpeRegisterInfo->EnableForRun) 310 { 311 LocalEventStatus |= ACPI_EVENT_FLAG_ENABLED; 312 } 313 314 /* GPE enabled for wake? */ 315 316 if (RegisterBit & GpeRegisterInfo->EnableForWake) 317 { 318 LocalEventStatus |= ACPI_EVENT_FLAG_WAKE_ENABLED; 319 } 320 321 /* GPE currently active (status bit == 1)? */ 322 323 Status = AcpiHwLowLevelRead (8, &InByte, &GpeRegisterInfo->StatusAddress); 324 if (ACPI_FAILURE (Status)) 325 { 326 goto UnlockAndExit; 327 } 328 329 if (RegisterBit & InByte) 330 { 331 LocalEventStatus |= ACPI_EVENT_FLAG_SET; 332 } 333 334 /* Set return value */ 335 336 (*EventStatus) = LocalEventStatus; 337 338 339 UnlockAndExit: 340 return (Status); 341 } 342 343 344 /****************************************************************************** 345 * 346 * FUNCTION: AcpiHwDisableGpeBlock 347 * 348 * PARAMETERS: GpeXruptInfo - GPE Interrupt info 349 * GpeBlock - Gpe Block info 350 * 351 * RETURN: Status 352 * 353 * DESCRIPTION: Disable all GPEs within a single GPE block 354 * 355 ******************************************************************************/ 356 357 ACPI_STATUS 358 AcpiHwDisableGpeBlock ( 359 ACPI_GPE_XRUPT_INFO *GpeXruptInfo, 360 ACPI_GPE_BLOCK_INFO *GpeBlock) 361 { 362 UINT32 i; 363 ACPI_STATUS Status; 364 365 366 /* Examine each GPE Register within the block */ 367 368 for (i = 0; i < GpeBlock->RegisterCount; i++) 369 { 370 /* Disable all GPEs in this register */ 371 372 Status = AcpiHwLowLevelWrite (8, 0x00, 373 &GpeBlock->RegisterInfo[i].EnableAddress); 374 if (ACPI_FAILURE (Status)) 375 { 376 return (Status); 377 } 378 } 379 380 return (AE_OK); 381 } 382 383 384 /****************************************************************************** 385 * 386 * FUNCTION: AcpiHwClearGpeBlock 387 * 388 * PARAMETERS: GpeXruptInfo - GPE Interrupt info 389 * GpeBlock - Gpe Block info 390 * 391 * RETURN: Status 392 * 393 * DESCRIPTION: Clear status bits for all GPEs within a single GPE block 394 * 395 ******************************************************************************/ 396 397 ACPI_STATUS 398 AcpiHwClearGpeBlock ( 399 ACPI_GPE_XRUPT_INFO *GpeXruptInfo, 400 ACPI_GPE_BLOCK_INFO *GpeBlock) 401 { 402 UINT32 i; 403 ACPI_STATUS Status; 404 405 406 /* Examine each GPE Register within the block */ 407 408 for (i = 0; i < GpeBlock->RegisterCount; i++) 409 { 410 /* Clear status on all GPEs in this register */ 411 412 Status = AcpiHwLowLevelWrite (8, 0xFF, 413 &GpeBlock->RegisterInfo[i].StatusAddress); 414 if (ACPI_FAILURE (Status)) 415 { 416 return (Status); 417 } 418 } 419 420 return (AE_OK); 421 } 422 423 424 /****************************************************************************** 425 * 426 * FUNCTION: AcpiHwEnableRuntimeGpeBlock 427 * 428 * PARAMETERS: GpeXruptInfo - GPE Interrupt info 429 * GpeBlock - Gpe Block info 430 * 431 * RETURN: Status 432 * 433 * DESCRIPTION: Enable all "runtime" GPEs within a single GPE block. Includes 434 * combination wake/run GPEs. 435 * 436 ******************************************************************************/ 437 438 ACPI_STATUS 439 AcpiHwEnableRuntimeGpeBlock ( 440 ACPI_GPE_XRUPT_INFO *GpeXruptInfo, 441 ACPI_GPE_BLOCK_INFO *GpeBlock) 442 { 443 UINT32 i; 444 ACPI_STATUS Status; 445 446 447 /* NOTE: assumes that all GPEs are currently disabled */ 448 449 /* Examine each GPE Register within the block */ 450 451 for (i = 0; i < GpeBlock->RegisterCount; i++) 452 { 453 if (!GpeBlock->RegisterInfo[i].EnableForRun) 454 { 455 continue; 456 } 457 458 /* Enable all "runtime" GPEs in this register */ 459 460 Status = AcpiHwLowLevelWrite (8, GpeBlock->RegisterInfo[i].EnableForRun, 461 &GpeBlock->RegisterInfo[i].EnableAddress); 462 if (ACPI_FAILURE (Status)) 463 { 464 return (Status); 465 } 466 } 467 468 return (AE_OK); 469 } 470 471 472 /****************************************************************************** 473 * 474 * FUNCTION: AcpiHwEnableWakeupGpeBlock 475 * 476 * PARAMETERS: GpeXruptInfo - GPE Interrupt info 477 * GpeBlock - Gpe Block info 478 * 479 * RETURN: Status 480 * 481 * DESCRIPTION: Enable all "wake" GPEs within a single GPE block. Includes 482 * combination wake/run GPEs. 483 * 484 ******************************************************************************/ 485 486 static ACPI_STATUS 487 AcpiHwEnableWakeupGpeBlock ( 488 ACPI_GPE_XRUPT_INFO *GpeXruptInfo, 489 ACPI_GPE_BLOCK_INFO *GpeBlock) 490 { 491 UINT32 i; 492 ACPI_STATUS Status; 493 494 495 /* Examine each GPE Register within the block */ 496 497 for (i = 0; i < GpeBlock->RegisterCount; i++) 498 { 499 if (!GpeBlock->RegisterInfo[i].EnableForWake) 500 { 501 continue; 502 } 503 504 /* Enable all "wake" GPEs in this register */ 505 506 Status = AcpiHwLowLevelWrite (8, 507 GpeBlock->RegisterInfo[i].EnableForWake, 508 &GpeBlock->RegisterInfo[i].EnableAddress); 509 if (ACPI_FAILURE (Status)) 510 { 511 return (Status); 512 } 513 } 514 515 return (AE_OK); 516 } 517 518 519 /****************************************************************************** 520 * 521 * FUNCTION: AcpiHwDisableAllGpes 522 * 523 * PARAMETERS: None 524 * 525 * RETURN: Status 526 * 527 * DESCRIPTION: Disable and clear all GPEs in all GPE blocks 528 * 529 ******************************************************************************/ 530 531 ACPI_STATUS 532 AcpiHwDisableAllGpes ( 533 void) 534 { 535 ACPI_STATUS Status; 536 537 538 ACPI_FUNCTION_TRACE (HwDisableAllGpes); 539 540 541 Status = AcpiEvWalkGpeList (AcpiHwDisableGpeBlock); 542 Status = AcpiEvWalkGpeList (AcpiHwClearGpeBlock); 543 return_ACPI_STATUS (Status); 544 } 545 546 547 /****************************************************************************** 548 * 549 * FUNCTION: AcpiHwEnableAllRuntimeGpes 550 * 551 * PARAMETERS: None 552 * 553 * RETURN: Status 554 * 555 * DESCRIPTION: Enable all "runtime" GPEs, in all GPE blocks 556 * 557 ******************************************************************************/ 558 559 ACPI_STATUS 560 AcpiHwEnableAllRuntimeGpes ( 561 void) 562 { 563 ACPI_STATUS Status; 564 565 566 ACPI_FUNCTION_TRACE (HwEnableAllRuntimeGpes); 567 568 569 Status = AcpiEvWalkGpeList (AcpiHwEnableRuntimeGpeBlock); 570 return_ACPI_STATUS (Status); 571 } 572 573 574 /****************************************************************************** 575 * 576 * FUNCTION: AcpiHwEnableAllWakeupGpes 577 * 578 * PARAMETERS: None 579 * 580 * RETURN: Status 581 * 582 * DESCRIPTION: Enable all "wakeup" GPEs, in all GPE blocks 583 * 584 ******************************************************************************/ 585 586 ACPI_STATUS 587 AcpiHwEnableAllWakeupGpes ( 588 void) 589 { 590 ACPI_STATUS Status; 591 592 593 ACPI_FUNCTION_TRACE (HwEnableAllWakeupGpes); 594 595 596 Status = AcpiEvWalkGpeList (AcpiHwEnableWakeupGpeBlock); 597 return_ACPI_STATUS (Status); 598 } 599 600