^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * Module Name: evevent - Fixed Event handling and dispatch
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * Copyright (C) 2000 - 2020, Intel Corp.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) *****************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <acpi/acpi.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include "accommon.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include "acevents.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #define _COMPONENT ACPI_EVENTS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) ACPI_MODULE_NAME("evevent")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #if (!ACPI_REDUCED_HARDWARE) /* Entire module */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) /* Local prototypes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) static acpi_status acpi_ev_fixed_event_initialize(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) static u32 acpi_ev_fixed_event_dispatch(u32 event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) * FUNCTION: acpi_ev_initialize_events
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) * PARAMETERS: None
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) * RETURN: Status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) * DESCRIPTION: Initialize global data structures for ACPI events (Fixed, GPE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) acpi_status acpi_ev_initialize_events(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) acpi_status status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) ACPI_FUNCTION_TRACE(ev_initialize_events);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) /* If Hardware Reduced flag is set, there are no fixed events */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) if (acpi_gbl_reduced_hardware) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) return_ACPI_STATUS(AE_OK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) * Initialize the Fixed and General Purpose Events. This is done prior to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) * enabling SCIs to prevent interrupts from occurring before the handlers
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) * are installed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) status = acpi_ev_fixed_event_initialize();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) if (ACPI_FAILURE(status)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) ACPI_EXCEPTION((AE_INFO, status,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) "Unable to initialize fixed events"));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) return_ACPI_STATUS(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) status = acpi_ev_gpe_initialize();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) if (ACPI_FAILURE(status)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) ACPI_EXCEPTION((AE_INFO, status,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) "Unable to initialize general purpose events"));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) return_ACPI_STATUS(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) return_ACPI_STATUS(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) * FUNCTION: acpi_ev_install_xrupt_handlers
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) * PARAMETERS: None
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) * RETURN: Status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) * DESCRIPTION: Install interrupt handlers for the SCI and Global Lock
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) acpi_status acpi_ev_install_xrupt_handlers(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) acpi_status status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) ACPI_FUNCTION_TRACE(ev_install_xrupt_handlers);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) /* If Hardware Reduced flag is set, there is no ACPI h/w */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) if (acpi_gbl_reduced_hardware) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) return_ACPI_STATUS(AE_OK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) /* Install the SCI handler */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) status = acpi_ev_install_sci_handler();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) if (ACPI_FAILURE(status)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) ACPI_EXCEPTION((AE_INFO, status,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) "Unable to install System Control Interrupt handler"));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) return_ACPI_STATUS(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) /* Install the handler for the Global Lock */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) status = acpi_ev_init_global_lock_handler();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) if (ACPI_FAILURE(status)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) ACPI_EXCEPTION((AE_INFO, status,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) "Unable to initialize Global Lock handler"));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) return_ACPI_STATUS(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) acpi_gbl_events_initialized = TRUE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) return_ACPI_STATUS(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) * FUNCTION: acpi_ev_fixed_event_initialize
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) * PARAMETERS: None
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) * RETURN: Status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) * DESCRIPTION: Install the fixed event handlers and disable all fixed events.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) static acpi_status acpi_ev_fixed_event_initialize(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) u32 i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) acpi_status status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) * Initialize the structure that keeps track of fixed event handlers and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) * disable all of the fixed events.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) for (i = 0; i < ACPI_NUM_FIXED_EVENTS; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) acpi_gbl_fixed_event_handlers[i].handler = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) acpi_gbl_fixed_event_handlers[i].context = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) /* Disable the fixed event */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) if (acpi_gbl_fixed_event_info[i].enable_register_id != 0xFF) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) status =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) acpi_write_bit_register(acpi_gbl_fixed_event_info
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) [i].enable_register_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) ACPI_DISABLE_EVENT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) if (ACPI_FAILURE(status)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) return (status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) return (AE_OK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) * FUNCTION: acpi_ev_fixed_event_detect
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) * PARAMETERS: None
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) * RETURN: INTERRUPT_HANDLED or INTERRUPT_NOT_HANDLED
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) * DESCRIPTION: Checks the PM status register for active fixed events
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) u32 acpi_ev_fixed_event_detect(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) u32 int_status = ACPI_INTERRUPT_NOT_HANDLED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) u32 fixed_status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) u32 fixed_enable;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) u32 i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) acpi_status status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) ACPI_FUNCTION_NAME(ev_fixed_event_detect);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) * Read the fixed feature status and enable registers, as all the cases
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) * depend on their values. Ignore errors here.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) status = acpi_hw_register_read(ACPI_REGISTER_PM1_STATUS, &fixed_status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) status |=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) acpi_hw_register_read(ACPI_REGISTER_PM1_ENABLE, &fixed_enable);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) if (ACPI_FAILURE(status)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) return (int_status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) ACPI_DEBUG_PRINT((ACPI_DB_INTERRUPTS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) "Fixed Event Block: Enable %08X Status %08X\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) fixed_enable, fixed_status));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) * Check for all possible Fixed Events and dispatch those that are active
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) for (i = 0; i < ACPI_NUM_FIXED_EVENTS; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) /* Both the status and enable bits must be on for this event */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) if ((fixed_status & acpi_gbl_fixed_event_info[i].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) status_bit_mask)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) && (fixed_enable & acpi_gbl_fixed_event_info[i].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) enable_bit_mask)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) * Found an active (signalled) event. Invoke global event
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) * handler if present.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) acpi_fixed_event_count[i]++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) if (acpi_gbl_global_event_handler) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) acpi_gbl_global_event_handler
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) (ACPI_EVENT_TYPE_FIXED, NULL, i,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) acpi_gbl_global_event_handler_context);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) int_status |= acpi_ev_fixed_event_dispatch(i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) return (int_status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) * FUNCTION: acpi_ev_fixed_event_dispatch
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) * PARAMETERS: event - Event type
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) * RETURN: INTERRUPT_HANDLED or INTERRUPT_NOT_HANDLED
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) * DESCRIPTION: Clears the status bit for the requested event, calls the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) * handler that previously registered for the event.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) * NOTE: If there is no handler for the event, the event is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) * disabled to prevent further interrupts.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) static u32 acpi_ev_fixed_event_dispatch(u32 event)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) ACPI_FUNCTION_ENTRY();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) /* Clear the status bit */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) (void)acpi_write_bit_register(acpi_gbl_fixed_event_info[event].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) status_register_id, ACPI_CLEAR_STATUS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) * Make sure that a handler exists. If not, report an error
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) * and disable the event to prevent further interrupts.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) if (!acpi_gbl_fixed_event_handlers[event].handler) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) (void)acpi_write_bit_register(acpi_gbl_fixed_event_info[event].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) enable_register_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) ACPI_DISABLE_EVENT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) ACPI_ERROR((AE_INFO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) "No installed handler for fixed event - %s (%u), disabling",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) acpi_ut_get_event_name(event), event));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) return (ACPI_INTERRUPT_NOT_HANDLED);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) /* Invoke the Fixed Event handler */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) return ((acpi_gbl_fixed_event_handlers[event].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) handler) (acpi_gbl_fixed_event_handlers[event].context));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) * FUNCTION: acpi_any_fixed_event_status_set
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) * PARAMETERS: None
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) * RETURN: TRUE or FALSE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) * DESCRIPTION: Checks the PM status register for active fixed events
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) u32 acpi_any_fixed_event_status_set(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) acpi_status status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) u32 in_status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) u32 in_enable;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) u32 i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) status = acpi_hw_register_read(ACPI_REGISTER_PM1_ENABLE, &in_enable);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) if (ACPI_FAILURE(status)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) return (FALSE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) status = acpi_hw_register_read(ACPI_REGISTER_PM1_STATUS, &in_status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) if (ACPI_FAILURE(status)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) return (FALSE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) * Check for all possible Fixed Events and dispatch those that are active
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) for (i = 0; i < ACPI_NUM_FIXED_EVENTS; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) /* Both the status and enable bits must be on for this event */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) if ((in_status & acpi_gbl_fixed_event_info[i].status_bit_mask) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) (in_enable & acpi_gbl_fixed_event_info[i].enable_bit_mask)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) return (TRUE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) return (FALSE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) #endif /* !ACPI_REDUCED_HARDWARE */