UINT32 AcpiHwGetMode ( void) { ACPI_STATUS Status; UINT32 Value; ACPI_FUNCTION_TRACE (HwGetMode); /* * ACPI 2.0 clarified that if SMI_CMD in FADT is zero, * system does not support mode transition. */ if (!AcpiGbl_FADT.SmiCommand) { return_UINT32 (ACPI_SYS_MODE_ACPI); } Status = AcpiGetRegister (ACPI_BITREG_SCI_ENABLE, &Value); if (ACPI_FAILURE (Status)) { return_UINT32 (ACPI_SYS_MODE_LEGACY); } if (Value) { return_UINT32 (ACPI_SYS_MODE_ACPI); } else { return_UINT32 (ACPI_SYS_MODE_LEGACY); } }
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 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 AcpiGetEventStatus ( UINT32 Event, UINT32 Type, ACPI_EVENT_STATUS *EventStatus) { ACPI_STATUS Status = AE_OK; ACPI_GPE_EVENT_INFO *GpeEventInfo; ACPI_FUNCTION_TRACE ("AcpiGetEventStatus"); if (!EventStatus) { return_ACPI_STATUS (AE_BAD_PARAMETER); } /* 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); } /* Get the status of the requested fixed event */ Status = AcpiGetRegister (AcpiGbl_FixedEventInfo[Event].StatusRegisterId, EventStatus, 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); } /* Obtain status on the requested GPE number */ Status = AcpiHwGetGpeStatus (Event, EventStatus); 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); }