Linux Audio

Check our new training course

Loading...
  1// SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
  2/******************************************************************************
  3 *
  4 * Module Name: evxfevnt - External Interfaces, ACPI event disable/enable
  5 *
  6 * Copyright (C) 2000 - 2023, Intel Corp.
  7 *
  8 *****************************************************************************/
  9
 10#define EXPORT_ACPI_INTERFACES
 11
 12#include <acpi/acpi.h>
 13#include "accommon.h"
 14#include "actables.h"
 15
 16#define _COMPONENT          ACPI_EVENTS
 17ACPI_MODULE_NAME("evxfevnt")
 18
 19#if (!ACPI_REDUCED_HARDWARE)	/* Entire module */
 20/*******************************************************************************
 21 *
 22 * FUNCTION:    acpi_enable
 23 *
 24 * PARAMETERS:  None
 25 *
 26 * RETURN:      Status
 27 *
 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_disable
 88 *
 89 * PARAMETERS:  None
 90 *
 91 * RETURN:      Status
 92 *
 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_event
133 *
134 * PARAMETERS:  event           - The fixed eventto be enabled
135 *              flags           - Reserved
136 *
137 * RETURN:      Status
138 *
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 enable
163	 * 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_event
196 *
197 * PARAMETERS:  event           - The fixed event to be disabled
198 *              flags           - Reserved
199 *
200 * RETURN:      Status
201 *
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 enable
226	 * 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_event
257 *
258 * PARAMETERS:  event           - The fixed event to be cleared
259 *
260 * RETURN:      Status
261 *
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 status
285	 * 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_status
299 *
300 * PARAMETERS:  event           - The fixed event
301 *              event_status    - Where the current status of the event will
302 *                                be returned
303 *
304 * RETURN:      Status
305 *
306 * DESCRIPTION: Obtains and returns the current status of the event
307 *
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 */