static UINT32 AcpiEvFixedEventDispatch ( UINT32 Event) { ACPI_FUNCTION_ENTRY (); /* Clear the status bit */ (void) AcpiSetRegister (AcpiGbl_FixedEventInfo[Event].StatusRegisterId, 1, ACPI_MTX_DO_NOT_LOCK); /* * Make sure we've got a handler. If not, report an error. * The event is disabled to prevent further interrupts. */ if (NULL == AcpiGbl_FixedEventHandlers[Event].Handler) { (void) AcpiSetRegister (AcpiGbl_FixedEventInfo[Event].EnableRegisterId, 0, ACPI_MTX_DO_NOT_LOCK); ACPI_ERROR ((AE_INFO, "No installed handler for fixed event [%08X]", Event)); return (ACPI_INTERRUPT_NOT_HANDLED); } /* Invoke the Fixed Event handler */ return ((AcpiGbl_FixedEventHandlers[Event].Handler)( AcpiGbl_FixedEventHandlers[Event].Context)); }
static ACPI_STATUS AcpiEvFixedEventInitialize ( void) { ACPI_NATIVE_UINT i; ACPI_STATUS Status; /* * Initialize the structure that keeps track of fixed event handlers * and enable the fixed events. */ for (i = 0; i < ACPI_NUM_FIXED_EVENTS; i++) { AcpiGbl_FixedEventHandlers[i].Handler = NULL; AcpiGbl_FixedEventHandlers[i].Context = NULL; /* Enable the fixed event */ if (AcpiGbl_FixedEventInfo[i].EnableRegisterId != 0xFF) { Status = AcpiSetRegister ( AcpiGbl_FixedEventInfo[i].EnableRegisterId, 0, ACPI_MTX_LOCK); if (ACPI_FAILURE (Status)) { return (Status); } } } return (AE_OK); }
ACPI_STATUS AcpiClearEvent ( UINT32 Event, UINT32 Type) { ACPI_STATUS Status = AE_OK; ACPI_GPE_EVENT_INFO *GpeEventInfo; ACPI_FUNCTION_TRACE ("AcpiClearEvent"); /* The Type must be either Fixed Event or GPE */ switch (Type) { case ACPI_EVENT_FIXED: /* Decode the Fixed Event */ if (Event > ACPI_EVENT_MAX) { return_ACPI_STATUS (AE_BAD_PARAMETER); } /* * Clear the requested fixed event (By writing a one to the * status register bit) */ Status = AcpiSetRegister (AcpiGbl_FixedEventInfo[Event].StatusRegisterId, 1, ACPI_MTX_LOCK); break; case ACPI_EVENT_GPE: /* Ensure that we have a valid GPE number */ GpeEventInfo = AcpiEvGetGpeEventInfo (Event); if (!GpeEventInfo) { return_ACPI_STATUS (AE_BAD_PARAMETER); } Status = AcpiHwClearGpe (GpeEventInfo); break; default: Status = AE_BAD_PARAMETER; } return_ACPI_STATUS (Status); }
static ACPI_STATUS enter_s4_with_bios(void) { ACPI_OBJECT_LIST ArgList; ACPI_OBJECT Arg; u_long ef; UINT32 ret; ACPI_STATUS status; /* run the _PTS and _GTS methods */ ACPI_MEMSET(&ArgList, 0, sizeof(ArgList)); ArgList.Count = 1; ArgList.Pointer = &Arg; ACPI_MEMSET(&Arg, 0, sizeof(Arg)); Arg.Type = ACPI_TYPE_INTEGER; Arg.Integer.Value = ACPI_STATE_S4; AcpiEvaluateObject(NULL, "\\_PTS", &ArgList, NULL); AcpiEvaluateObject(NULL, "\\_GTS", &ArgList, NULL); /* clear wake status */ AcpiSetRegister(ACPI_BITREG_WAKE_STATUS, 1, ACPI_MTX_LOCK); ef = read_eflags(); disable_intr(); AcpiHwDisableNonWakeupGpes(); /* flush caches */ ACPI_FLUSH_CPU_CACHE(); /* * write the value to command port and wait until we enter sleep state */ do { AcpiOsStall(1000000); AcpiOsWritePort(AcpiGbl_FADT->SmiCmd, AcpiGbl_FADT->S4BiosReq, 8); status = AcpiGetRegister(ACPI_BITREG_WAKE_STATUS, &ret, ACPI_MTX_LOCK); if (ACPI_FAILURE(status)) break; } while (!ret); AcpiHwEnableNonWakeupGpes(); write_eflags(ef); return (AE_OK); }
ACPI_STATUS AcpiEvReleaseGlobalLock ( void) { BOOLEAN Pending = FALSE; ACPI_STATUS Status = AE_OK; ACPI_FUNCTION_TRACE (EvReleaseGlobalLock); /* Lock must be already acquired */ if (!AcpiGbl_GlobalLockAcquired) { ACPI_WARNING ((AE_INFO, "Cannot release the ACPI Global Lock, it has not been acquired")); return_ACPI_STATUS (AE_NOT_ACQUIRED); } if (AcpiGbl_GlobalLockPresent) { /* Allow any thread to release the lock */ ACPI_RELEASE_GLOBAL_LOCK (Facs, Pending); /* * If the pending bit was set, we must write GBL_RLS to the control * register */ if (Pending) { Status = AcpiSetRegister ( ACPI_BITREG_GLOBAL_LOCK_RELEASE, 1); } ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Released hardware Global Lock\n")); } AcpiGbl_GlobalLockAcquired = FALSE; /* Release the local GL mutex */ AcpiOsReleaseMutex (AcpiGbl_GlobalLockMutex->Mutex.OsMutex); return_ACPI_STATUS (Status); }
ACPI_STATUS AcpiDisableEvent ( UINT32 Event, UINT32 Type, UINT32 Flags) { ACPI_STATUS Status = AE_OK; UINT32 Value; ACPI_GPE_EVENT_INFO *GpeEventInfo; ACPI_FUNCTION_TRACE ("AcpiDisableEvent"); /* The Type must be either Fixed Event or GPE */ switch (Type) { case ACPI_EVENT_FIXED: /* Decode the Fixed Event */ if (Event > ACPI_EVENT_MAX) { return_ACPI_STATUS (AE_BAD_PARAMETER); } /* * Disable the requested fixed event (by writing a zero to the * enable register bit) */ Status = AcpiSetRegister (AcpiGbl_FixedEventInfo[Event].EnableRegisterId, 0, ACPI_MTX_LOCK); if (ACPI_FAILURE (Status)) { return_ACPI_STATUS (Status); } Status = AcpiGetRegister (AcpiGbl_FixedEventInfo[Event].EnableRegisterId, &Value, ACPI_MTX_LOCK); if (ACPI_FAILURE (Status)) { return_ACPI_STATUS (Status); } if (Value != 0) { ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Could not disable %s events\n", AcpiUtGetEventName (Event))); return_ACPI_STATUS (AE_NO_HARDWARE_RESPONSE); } break; case ACPI_EVENT_GPE: /* Ensure that we have a valid GPE number */ GpeEventInfo = AcpiEvGetGpeEventInfo (Event); if (!GpeEventInfo) { return_ACPI_STATUS (AE_BAD_PARAMETER); } /* * Only disable the requested GPE number for wake if specified. * Otherwise, turn it totally off */ if (Flags & ACPI_EVENT_WAKE_DISABLE) { AcpiHwDisableGpeForWakeup (GpeEventInfo); } else { Status = AcpiHwDisableGpe (GpeEventInfo); } break; default: Status = AE_BAD_PARAMETER; } return_ACPI_STATUS (Status); }
ACPI_STATUS AcpiEnableEvent ( UINT32 Event, UINT32 Type, UINT32 Flags) { ACPI_STATUS Status = AE_OK; UINT32 Value; ACPI_GPE_EVENT_INFO *GpeEventInfo; ACPI_FUNCTION_TRACE ("AcpiEnableEvent"); /* The Type must be either Fixed Event or GPE */ switch (Type) { case ACPI_EVENT_FIXED: /* Decode the Fixed Event */ if (Event > ACPI_EVENT_MAX) { return_ACPI_STATUS (AE_BAD_PARAMETER); } /* * Enable the requested fixed event (by writing a one to the * enable register bit) */ Status = AcpiSetRegister (AcpiGbl_FixedEventInfo[Event].EnableRegisterId, 1, ACPI_MTX_LOCK); if (ACPI_FAILURE (Status)) { return_ACPI_STATUS (Status); } /* Make sure that the hardware responded */ Status = AcpiGetRegister (AcpiGbl_FixedEventInfo[Event].EnableRegisterId, &Value, ACPI_MTX_LOCK); if (ACPI_FAILURE (Status)) { return_ACPI_STATUS (Status); } if (Value != 1) { ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Could not enable %s event\n", AcpiUtGetEventName (Event))); return_ACPI_STATUS (AE_NO_HARDWARE_RESPONSE); } break; case ACPI_EVENT_GPE: /* Ensure that we have a valid GPE number */ GpeEventInfo = AcpiEvGetGpeEventInfo (Event); if (!GpeEventInfo) { return_ACPI_STATUS (AE_BAD_PARAMETER); } /* Enable the requested GPE number */ Status = AcpiHwEnableGpe (GpeEventInfo); if (ACPI_FAILURE (Status)) { return_ACPI_STATUS (Status); } if (Flags & ACPI_EVENT_WAKE_ENABLE) { AcpiHwEnableGpeForWakeup (GpeEventInfo); } break; default: Status = AE_BAD_PARAMETER; } return_ACPI_STATUS (Status); }