mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-27 06:34:11 +08:00
f5c1e1c5a6
ACPICA commit b2294cae776f5a66a7697414b21949d307e6856f This patch removes unwanted spaces for typedef. This solution doesn't cover function types. Note that the linuxize result of this commit is very giant and should have many conflicts against the current Linux upstream. Thus it is required to modify the linuxize result of this commit and the commits around it manually in order to have them merged to the Linux upstream. Since this is very costy, we should do this only once, and if we can't ensure to do this only once, we need to revert the Linux code to the wrong indentation result before merging the linuxize result of this commit. Lv Zheng. Link: https://github.com/acpica/acpica/commit/b2294cae Signed-off-by: Lv Zheng <lv.zheng@intel.com> Signed-off-by: Bob Moore <robert.moore@intel.com> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
300 lines
8.6 KiB
C
300 lines
8.6 KiB
C
/******************************************************************************
|
|
*
|
|
* Module Name: evmisc - Miscellaneous event manager support functions
|
|
*
|
|
*****************************************************************************/
|
|
|
|
/*
|
|
* Copyright (C) 2000 - 2016, Intel Corp.
|
|
* All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions, and the following disclaimer,
|
|
* without modification.
|
|
* 2. Redistributions in binary form must reproduce at minimum a disclaimer
|
|
* substantially similar to the "NO WARRANTY" disclaimer below
|
|
* ("Disclaimer") and any redistribution must be conditioned upon
|
|
* including a substantially similar Disclaimer requirement for further
|
|
* binary redistribution.
|
|
* 3. Neither the names of the above-listed copyright holders nor the names
|
|
* of any contributors may be used to endorse or promote products derived
|
|
* from this software without specific prior written permission.
|
|
*
|
|
* Alternatively, this software may be distributed under the terms of the
|
|
* GNU General Public License ("GPL") version 2 as published by the Free
|
|
* Software Foundation.
|
|
*
|
|
* NO WARRANTY
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
|
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
* HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
|
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
* POSSIBILITY OF SUCH DAMAGES.
|
|
*/
|
|
|
|
#include <acpi/acpi.h>
|
|
#include "accommon.h"
|
|
#include "acevents.h"
|
|
#include "acnamesp.h"
|
|
|
|
#define _COMPONENT ACPI_EVENTS
|
|
ACPI_MODULE_NAME("evmisc")
|
|
|
|
/* Local prototypes */
|
|
static void ACPI_SYSTEM_XFACE acpi_ev_notify_dispatch(void *context);
|
|
|
|
/*******************************************************************************
|
|
*
|
|
* FUNCTION: acpi_ev_is_notify_object
|
|
*
|
|
* PARAMETERS: node - Node to check
|
|
*
|
|
* RETURN: TRUE if notifies allowed on this object
|
|
*
|
|
* DESCRIPTION: Check type of node for a object that supports notifies.
|
|
*
|
|
* TBD: This could be replaced by a flag bit in the node.
|
|
*
|
|
******************************************************************************/
|
|
|
|
u8 acpi_ev_is_notify_object(struct acpi_namespace_node *node)
|
|
{
|
|
|
|
switch (node->type) {
|
|
case ACPI_TYPE_DEVICE:
|
|
case ACPI_TYPE_PROCESSOR:
|
|
case ACPI_TYPE_THERMAL:
|
|
/*
|
|
* These are the ONLY objects that can receive ACPI notifications
|
|
*/
|
|
return (TRUE);
|
|
|
|
default:
|
|
|
|
return (FALSE);
|
|
}
|
|
}
|
|
|
|
/*******************************************************************************
|
|
*
|
|
* FUNCTION: acpi_ev_queue_notify_request
|
|
*
|
|
* PARAMETERS: node - NS node for the notified object
|
|
* notify_value - Value from the Notify() request
|
|
*
|
|
* RETURN: Status
|
|
*
|
|
* DESCRIPTION: Dispatch a device notification event to a previously
|
|
* installed handler.
|
|
*
|
|
******************************************************************************/
|
|
|
|
acpi_status
|
|
acpi_ev_queue_notify_request(struct acpi_namespace_node *node, u32 notify_value)
|
|
{
|
|
union acpi_operand_object *obj_desc;
|
|
union acpi_operand_object *handler_list_head = NULL;
|
|
union acpi_generic_state *info;
|
|
u8 handler_list_id = 0;
|
|
acpi_status status = AE_OK;
|
|
|
|
ACPI_FUNCTION_NAME(ev_queue_notify_request);
|
|
|
|
/* Are Notifies allowed on this object? */
|
|
|
|
if (!acpi_ev_is_notify_object(node)) {
|
|
return (AE_TYPE);
|
|
}
|
|
|
|
/* Get the correct notify list type (System or Device) */
|
|
|
|
if (notify_value <= ACPI_MAX_SYS_NOTIFY) {
|
|
handler_list_id = ACPI_SYSTEM_HANDLER_LIST;
|
|
} else {
|
|
handler_list_id = ACPI_DEVICE_HANDLER_LIST;
|
|
}
|
|
|
|
/* Get the notify object attached to the namespace Node */
|
|
|
|
obj_desc = acpi_ns_get_attached_object(node);
|
|
if (obj_desc) {
|
|
|
|
/* We have an attached object, Get the correct handler list */
|
|
|
|
handler_list_head =
|
|
obj_desc->common_notify.notify_list[handler_list_id];
|
|
}
|
|
|
|
/*
|
|
* If there is no notify handler (Global or Local)
|
|
* for this object, just ignore the notify
|
|
*/
|
|
if (!acpi_gbl_global_notify[handler_list_id].handler
|
|
&& !handler_list_head) {
|
|
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
|
|
"No notify handler for Notify, ignoring (%4.4s, %X) node %p\n",
|
|
acpi_ut_get_node_name(node), notify_value,
|
|
node));
|
|
|
|
return (AE_OK);
|
|
}
|
|
|
|
/* Setup notify info and schedule the notify dispatcher */
|
|
|
|
info = acpi_ut_create_generic_state();
|
|
if (!info) {
|
|
return (AE_NO_MEMORY);
|
|
}
|
|
|
|
info->common.descriptor_type = ACPI_DESC_TYPE_STATE_NOTIFY;
|
|
|
|
info->notify.node = node;
|
|
info->notify.value = (u16)notify_value;
|
|
info->notify.handler_list_id = handler_list_id;
|
|
info->notify.handler_list_head = handler_list_head;
|
|
info->notify.global = &acpi_gbl_global_notify[handler_list_id];
|
|
|
|
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
|
|
"Dispatching Notify on [%4.4s] (%s) Value 0x%2.2X (%s) Node %p\n",
|
|
acpi_ut_get_node_name(node),
|
|
acpi_ut_get_type_name(node->type), notify_value,
|
|
acpi_ut_get_notify_name(notify_value, ACPI_TYPE_ANY),
|
|
node));
|
|
|
|
status = acpi_os_execute(OSL_NOTIFY_HANDLER,
|
|
acpi_ev_notify_dispatch, info);
|
|
if (ACPI_FAILURE(status)) {
|
|
acpi_ut_delete_generic_state(info);
|
|
}
|
|
|
|
return (status);
|
|
}
|
|
|
|
/*******************************************************************************
|
|
*
|
|
* FUNCTION: acpi_ev_notify_dispatch
|
|
*
|
|
* PARAMETERS: context - To be passed to the notify handler
|
|
*
|
|
* RETURN: None.
|
|
*
|
|
* DESCRIPTION: Dispatch a device notification event to a previously
|
|
* installed handler.
|
|
*
|
|
******************************************************************************/
|
|
|
|
static void ACPI_SYSTEM_XFACE acpi_ev_notify_dispatch(void *context)
|
|
{
|
|
union acpi_generic_state *info = (union acpi_generic_state *)context;
|
|
union acpi_operand_object *handler_obj;
|
|
|
|
ACPI_FUNCTION_ENTRY();
|
|
|
|
/* Invoke a global notify handler if installed */
|
|
|
|
if (info->notify.global->handler) {
|
|
info->notify.global->handler(info->notify.node,
|
|
info->notify.value,
|
|
info->notify.global->context);
|
|
}
|
|
|
|
/* Now invoke the local notify handler(s) if any are installed */
|
|
|
|
handler_obj = info->notify.handler_list_head;
|
|
while (handler_obj) {
|
|
handler_obj->notify.handler(info->notify.node,
|
|
info->notify.value,
|
|
handler_obj->notify.context);
|
|
|
|
handler_obj =
|
|
handler_obj->notify.next[info->notify.handler_list_id];
|
|
}
|
|
|
|
/* All done with the info object */
|
|
|
|
acpi_ut_delete_generic_state(info);
|
|
}
|
|
|
|
#if (!ACPI_REDUCED_HARDWARE)
|
|
/******************************************************************************
|
|
*
|
|
* FUNCTION: acpi_ev_terminate
|
|
*
|
|
* PARAMETERS: none
|
|
*
|
|
* RETURN: none
|
|
*
|
|
* DESCRIPTION: Disable events and free memory allocated for table storage.
|
|
*
|
|
******************************************************************************/
|
|
|
|
void acpi_ev_terminate(void)
|
|
{
|
|
u32 i;
|
|
acpi_status status;
|
|
|
|
ACPI_FUNCTION_TRACE(ev_terminate);
|
|
|
|
if (acpi_gbl_events_initialized) {
|
|
/*
|
|
* Disable all event-related functionality. In all cases, on error,
|
|
* print a message but obviously we don't abort.
|
|
*/
|
|
|
|
/* Disable all fixed events */
|
|
|
|
for (i = 0; i < ACPI_NUM_FIXED_EVENTS; i++) {
|
|
status = acpi_disable_event(i, 0);
|
|
if (ACPI_FAILURE(status)) {
|
|
ACPI_ERROR((AE_INFO,
|
|
"Could not disable fixed event %u",
|
|
(u32) i));
|
|
}
|
|
}
|
|
|
|
/* Disable all GPEs in all GPE blocks */
|
|
|
|
status = acpi_ev_walk_gpe_list(acpi_hw_disable_gpe_block, NULL);
|
|
|
|
status = acpi_ev_remove_global_lock_handler();
|
|
if (ACPI_FAILURE(status)) {
|
|
ACPI_ERROR((AE_INFO,
|
|
"Could not remove Global Lock handler"));
|
|
}
|
|
|
|
acpi_gbl_events_initialized = FALSE;
|
|
}
|
|
|
|
/* Remove SCI handlers */
|
|
|
|
status = acpi_ev_remove_all_sci_handlers();
|
|
if (ACPI_FAILURE(status)) {
|
|
ACPI_ERROR((AE_INFO, "Could not remove SCI handler"));
|
|
}
|
|
|
|
/* Deallocate all handler objects installed within GPE info structs */
|
|
|
|
status = acpi_ev_walk_gpe_list(acpi_ev_delete_gpe_handlers, NULL);
|
|
|
|
/* Return to original mode if necessary */
|
|
|
|
if (acpi_gbl_original_mode == ACPI_SYS_MODE_LEGACY) {
|
|
status = acpi_disable();
|
|
if (ACPI_FAILURE(status)) {
|
|
ACPI_WARNING((AE_INFO, "AcpiDisable failed"));
|
|
}
|
|
}
|
|
return_VOID;
|
|
}
|
|
|
|
#endif /* !ACPI_REDUCED_HARDWARE */
|