366 lines · c
1// SPDX-License-Identifier: BSD-3-Clause OR GPL-2.02/******************************************************************************3 *4 * Module Name: evxfevnt - External Interfaces, ACPI event disable/enable5 *6 * Copyright (C) 2000 - 2023, Intel Corp.7 *8 *****************************************************************************/9 10#define EXPORT_ACPI_INTERFACES11 12#include <acpi/acpi.h>13#include "accommon.h"14#include "actables.h"15 16#define _COMPONENT ACPI_EVENTS17ACPI_MODULE_NAME("evxfevnt")18 19#if (!ACPI_REDUCED_HARDWARE) /* Entire module */20/*******************************************************************************21 *22 * FUNCTION: acpi_enable23 *24 * PARAMETERS: None25 *26 * RETURN: Status27 *28 * DESCRIPTION: Transfers the system into ACPI mode.29 *30 ******************************************************************************/31acpi_status acpi_enable(void)32{33 acpi_status status;34 int retry;35 36 ACPI_FUNCTION_TRACE(acpi_enable);37 38 /* ACPI tables must be present */39 40 if (acpi_gbl_fadt_index == ACPI_INVALID_TABLE_INDEX) {41 return_ACPI_STATUS(AE_NO_ACPI_TABLES);42 }43 44 /* If the Hardware Reduced flag is set, machine is always in acpi mode */45 46 if (acpi_gbl_reduced_hardware) {47 return_ACPI_STATUS(AE_OK);48 }49 50 /* Check current mode */51 52 if (acpi_hw_get_mode() == ACPI_SYS_MODE_ACPI) {53 ACPI_DEBUG_PRINT((ACPI_DB_INIT,54 "System is already in ACPI mode\n"));55 return_ACPI_STATUS(AE_OK);56 }57 58 /* Transition to ACPI mode */59 60 status = acpi_hw_set_mode(ACPI_SYS_MODE_ACPI);61 if (ACPI_FAILURE(status)) {62 ACPI_ERROR((AE_INFO,63 "Could not transition to ACPI mode"));64 return_ACPI_STATUS(status);65 }66 67 /* Sanity check that transition succeeded */68 69 for (retry = 0; retry < 30000; ++retry) {70 if (acpi_hw_get_mode() == ACPI_SYS_MODE_ACPI) {71 if (retry != 0)72 ACPI_WARNING((AE_INFO,73 "Platform took > %d00 usec to enter ACPI mode", retry));74 return_ACPI_STATUS(AE_OK);75 }76 acpi_os_stall(100); /* 100 usec */77 }78 79 ACPI_ERROR((AE_INFO, "Hardware did not enter ACPI mode"));80 return_ACPI_STATUS(AE_NO_HARDWARE_RESPONSE);81}82 83ACPI_EXPORT_SYMBOL(acpi_enable)84 85/*******************************************************************************86 *87 * FUNCTION: acpi_disable88 *89 * PARAMETERS: None90 *91 * RETURN: Status92 *93 * DESCRIPTION: Transfers the system into LEGACY (non-ACPI) mode.94 *95 ******************************************************************************/96acpi_status acpi_disable(void)97{98 acpi_status status = AE_OK;99 100 ACPI_FUNCTION_TRACE(acpi_disable);101 102 /* If the Hardware Reduced flag is set, machine is always in acpi mode */103 104 if (acpi_gbl_reduced_hardware) {105 return_ACPI_STATUS(AE_OK);106 }107 108 if (acpi_hw_get_mode() == ACPI_SYS_MODE_LEGACY) {109 ACPI_DEBUG_PRINT((ACPI_DB_INIT,110 "System is already in legacy (non-ACPI) mode\n"));111 } else {112 /* Transition to LEGACY mode */113 114 status = acpi_hw_set_mode(ACPI_SYS_MODE_LEGACY);115 116 if (ACPI_FAILURE(status)) {117 ACPI_ERROR((AE_INFO,118 "Could not exit ACPI mode to legacy mode"));119 return_ACPI_STATUS(status);120 }121 122 ACPI_DEBUG_PRINT((ACPI_DB_INIT, "ACPI mode disabled\n"));123 }124 125 return_ACPI_STATUS(status);126}127 128ACPI_EXPORT_SYMBOL(acpi_disable)129 130/*******************************************************************************131 *132 * FUNCTION: acpi_enable_event133 *134 * PARAMETERS: event - The fixed eventto be enabled135 * flags - Reserved136 *137 * RETURN: Status138 *139 * DESCRIPTION: Enable an ACPI event (fixed)140 *141 ******************************************************************************/142acpi_status acpi_enable_event(u32 event, u32 flags)143{144 acpi_status status = AE_OK;145 u32 value;146 147 ACPI_FUNCTION_TRACE(acpi_enable_event);148 149 /* If Hardware Reduced flag is set, there are no fixed events */150 151 if (acpi_gbl_reduced_hardware) {152 return_ACPI_STATUS(AE_OK);153 }154 155 /* Decode the Fixed Event */156 157 if (event > ACPI_EVENT_MAX) {158 return_ACPI_STATUS(AE_BAD_PARAMETER);159 }160 161 /*162 * Enable the requested fixed event (by writing a one to the enable163 * register bit)164 */165 status =166 acpi_write_bit_register(acpi_gbl_fixed_event_info[event].167 enable_register_id, ACPI_ENABLE_EVENT);168 if (ACPI_FAILURE(status)) {169 return_ACPI_STATUS(status);170 }171 172 /* Make sure that the hardware responded */173 174 status =175 acpi_read_bit_register(acpi_gbl_fixed_event_info[event].176 enable_register_id, &value);177 if (ACPI_FAILURE(status)) {178 return_ACPI_STATUS(status);179 }180 181 if (value != 1) {182 ACPI_ERROR((AE_INFO,183 "Could not enable %s event",184 acpi_ut_get_event_name(event)));185 return_ACPI_STATUS(AE_NO_HARDWARE_RESPONSE);186 }187 188 return_ACPI_STATUS(status);189}190 191ACPI_EXPORT_SYMBOL(acpi_enable_event)192 193/*******************************************************************************194 *195 * FUNCTION: acpi_disable_event196 *197 * PARAMETERS: event - The fixed event to be disabled198 * flags - Reserved199 *200 * RETURN: Status201 *202 * DESCRIPTION: Disable an ACPI event (fixed)203 *204 ******************************************************************************/205acpi_status acpi_disable_event(u32 event, u32 flags)206{207 acpi_status status = AE_OK;208 u32 value;209 210 ACPI_FUNCTION_TRACE(acpi_disable_event);211 212 /* If Hardware Reduced flag is set, there are no fixed events */213 214 if (acpi_gbl_reduced_hardware) {215 return_ACPI_STATUS(AE_OK);216 }217 218 /* Decode the Fixed Event */219 220 if (event > ACPI_EVENT_MAX) {221 return_ACPI_STATUS(AE_BAD_PARAMETER);222 }223 224 /*225 * Disable the requested fixed event (by writing a zero to the enable226 * register bit)227 */228 status =229 acpi_write_bit_register(acpi_gbl_fixed_event_info[event].230 enable_register_id, ACPI_DISABLE_EVENT);231 if (ACPI_FAILURE(status)) {232 return_ACPI_STATUS(status);233 }234 235 status =236 acpi_read_bit_register(acpi_gbl_fixed_event_info[event].237 enable_register_id, &value);238 if (ACPI_FAILURE(status)) {239 return_ACPI_STATUS(status);240 }241 242 if (value != 0) {243 ACPI_ERROR((AE_INFO,244 "Could not disable %s events",245 acpi_ut_get_event_name(event)));246 return_ACPI_STATUS(AE_NO_HARDWARE_RESPONSE);247 }248 249 return_ACPI_STATUS(status);250}251 252ACPI_EXPORT_SYMBOL(acpi_disable_event)253 254/*******************************************************************************255 *256 * FUNCTION: acpi_clear_event257 *258 * PARAMETERS: event - The fixed event to be cleared259 *260 * RETURN: Status261 *262 * DESCRIPTION: Clear an ACPI event (fixed)263 *264 ******************************************************************************/265acpi_status acpi_clear_event(u32 event)266{267 acpi_status status = AE_OK;268 269 ACPI_FUNCTION_TRACE(acpi_clear_event);270 271 /* If Hardware Reduced flag is set, there are no fixed events */272 273 if (acpi_gbl_reduced_hardware) {274 return_ACPI_STATUS(AE_OK);275 }276 277 /* Decode the Fixed Event */278 279 if (event > ACPI_EVENT_MAX) {280 return_ACPI_STATUS(AE_BAD_PARAMETER);281 }282 283 /*284 * Clear the requested fixed event (By writing a one to the status285 * register bit)286 */287 status =288 acpi_write_bit_register(acpi_gbl_fixed_event_info[event].289 status_register_id, ACPI_CLEAR_STATUS);290 291 return_ACPI_STATUS(status);292}293 294ACPI_EXPORT_SYMBOL(acpi_clear_event)295 296/*******************************************************************************297 *298 * FUNCTION: acpi_get_event_status299 *300 * PARAMETERS: event - The fixed event301 * event_status - Where the current status of the event will302 * be returned303 *304 * RETURN: Status305 *306 * DESCRIPTION: Obtains and returns the current status of the event307 *308 ******************************************************************************/309acpi_status acpi_get_event_status(u32 event, acpi_event_status * event_status)310{311 acpi_status status;312 acpi_event_status local_event_status = 0;313 u32 in_byte;314 315 ACPI_FUNCTION_TRACE(acpi_get_event_status);316 317 if (!event_status) {318 return_ACPI_STATUS(AE_BAD_PARAMETER);319 }320 321 /* Decode the Fixed Event */322 323 if (event > ACPI_EVENT_MAX) {324 return_ACPI_STATUS(AE_BAD_PARAMETER);325 }326 327 /* Fixed event currently can be dispatched? */328 329 if (acpi_gbl_fixed_event_handlers[event].handler) {330 local_event_status |= ACPI_EVENT_FLAG_HAS_HANDLER;331 }332 333 /* Fixed event currently enabled? */334 335 status =336 acpi_read_bit_register(acpi_gbl_fixed_event_info[event].337 enable_register_id, &in_byte);338 if (ACPI_FAILURE(status)) {339 return_ACPI_STATUS(status);340 }341 342 if (in_byte) {343 local_event_status |=344 (ACPI_EVENT_FLAG_ENABLED | ACPI_EVENT_FLAG_ENABLE_SET);345 }346 347 /* Fixed event currently active? */348 349 status =350 acpi_read_bit_register(acpi_gbl_fixed_event_info[event].351 status_register_id, &in_byte);352 if (ACPI_FAILURE(status)) {353 return_ACPI_STATUS(status);354 }355 356 if (in_byte) {357 local_event_status |= ACPI_EVENT_FLAG_STATUS_SET;358 }359 360 (*event_status) = local_event_status;361 return_ACPI_STATUS(AE_OK);362}363 364ACPI_EXPORT_SYMBOL(acpi_get_event_status)365#endif /* !ACPI_REDUCED_HARDWARE */366