Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3e08e2d2 authored by Lin Ming's avatar Lin Ming Committed by Len Brown
Browse files

ACPICA: New interfaces for table event handlers



Designed and implemented new external interfaces to install and
remove handlers for ACPI table-related events. Current events that
are defined are LOAD and UNLOAD. These interfaces allow the host to
track ACPI tables as they are dynamically loaded and unloaded. See
AcpiInstallTableHandler and AcpiRemoveTableHandler.

Signed-off-by: default avatarLin Ming <ming.m.lin@intel.com>
Signed-off-by: default avatarBob Moore <robert.moore@intel.com>
Signed-off-by: default avatarAlexey Starikovskiy <astarikovskiy@suse.de>
Signed-off-by: default avatarLen Brown <len.brown@intel.com>
parent 698c0a0c
Loading
Loading
Loading
Loading
+28 −1
Original line number Original line Diff line number Diff line
@@ -234,6 +234,13 @@ acpi_ex_load_table_op(struct acpi_walk_state *walk_state,
			   table->oem_table_id));
			   table->oem_table_id));
	}
	}


	/* Invoke table handler if present */

	if (acpi_gbl_table_handler) {
		(void)acpi_gbl_table_handler(ACPI_TABLE_EVENT_LOAD, table,
					     acpi_gbl_table_handler_context);
	}

	*return_desc = ddb_handle;
	*return_desc = ddb_handle;
	return_ACPI_STATUS(status);
	return_ACPI_STATUS(status);
}
}
@@ -352,6 +359,14 @@ acpi_ex_load_op(union acpi_operand_object *obj_desc,
		return_ACPI_STATUS(status);
		return_ACPI_STATUS(status);
	}
	}


	/* Invoke table handler if present */

	if (acpi_gbl_table_handler) {
		(void)acpi_gbl_table_handler(ACPI_TABLE_EVENT_LOAD,
					     table_desc.pointer,
					     acpi_gbl_table_handler_context);
	}

      cleanup:
      cleanup:
	if (ACPI_FAILURE(status)) {
	if (ACPI_FAILURE(status)) {
		acpi_tb_delete_table(&table_desc);
		acpi_tb_delete_table(&table_desc);
@@ -376,6 +391,7 @@ acpi_status acpi_ex_unload_table(union acpi_operand_object *ddb_handle)
	acpi_status status = AE_OK;
	acpi_status status = AE_OK;
	union acpi_operand_object *table_desc = ddb_handle;
	union acpi_operand_object *table_desc = ddb_handle;
	acpi_native_uint table_index;
	acpi_native_uint table_index;
	struct acpi_table_header *table;


	ACPI_FUNCTION_TRACE(ex_unload_table);
	ACPI_FUNCTION_TRACE(ex_unload_table);


@@ -395,6 +411,17 @@ acpi_status acpi_ex_unload_table(union acpi_operand_object *ddb_handle)


	table_index = (acpi_native_uint) table_desc->reference.object;
	table_index = (acpi_native_uint) table_desc->reference.object;


	/* Invoke table handler if present */

	if (acpi_gbl_table_handler) {
		status = acpi_get_table_by_index(table_index, &table);
		if (ACPI_SUCCESS(status)) {
			(void)acpi_gbl_table_handler(ACPI_TABLE_EVENT_UNLOAD,
						     table,
						     acpi_gbl_table_handler_context);
		}
	}

	/*
	/*
	 * Delete the entire namespace under this table Node
	 * Delete the entire namespace under this table Node
	 * (Offset contains the table_id)
	 * (Offset contains the table_id)
@@ -407,5 +434,5 @@ acpi_status acpi_ex_unload_table(union acpi_operand_object *ddb_handle)
	/* Delete the table descriptor (ddb_handle) */
	/* Delete the table descriptor (ddb_handle) */


	acpi_ut_remove_reference(table_desc);
	acpi_ut_remove_reference(table_desc);
	return_ACPI_STATUS(status);
	return_ACPI_STATUS(AE_OK);
}
}
+89 −0
Original line number Original line Diff line number Diff line
@@ -635,6 +635,95 @@ acpi_status acpi_load_tables(void)
ACPI_EXPORT_SYMBOL(acpi_load_tables)
ACPI_EXPORT_SYMBOL(acpi_load_tables)




/*******************************************************************************
 *
 * FUNCTION:    acpi_install_table_handler
 *
 * PARAMETERS:  Handler         - Table event handler
 *              Context         - Value passed to the handler on each event
 *
 * RETURN:      Status
 *
 * DESCRIPTION: Install table event handler
 *
 ******************************************************************************/
acpi_status
acpi_install_table_handler(acpi_tbl_handler handler, void *context)
{
	acpi_status status;

	ACPI_FUNCTION_TRACE(acpi_install_table_handler);

	if (!handler) {
		return_ACPI_STATUS(AE_BAD_PARAMETER);
	}

	status = acpi_ut_acquire_mutex(ACPI_MTX_EVENTS);
	if (ACPI_FAILURE(status)) {
		return_ACPI_STATUS(status);
	}

	/* Don't allow more than one handler */

	if (acpi_gbl_table_handler) {
		status = AE_ALREADY_EXISTS;
		goto cleanup;
	}

	/* Install the handler */

	acpi_gbl_table_handler = handler;
	acpi_gbl_table_handler_context = context;

      cleanup:
	(void)acpi_ut_release_mutex(ACPI_MTX_EVENTS);
	return_ACPI_STATUS(status);
}

ACPI_EXPORT_SYMBOL(acpi_install_table_handler)

/*******************************************************************************
 *
 * FUNCTION:    acpi_remove_table_handler
 *
 * PARAMETERS:  Handler         - Table event handler that was installed
 *                                previously.
 *
 * RETURN:      Status
 *
 * DESCRIPTION: Remove table event handler
 *
 ******************************************************************************/
acpi_status acpi_remove_table_handler(acpi_tbl_handler handler)
{
	acpi_status status;

	ACPI_FUNCTION_TRACE(acpi_remove_table_handler);

	status = acpi_ut_acquire_mutex(ACPI_MTX_EVENTS);
	if (ACPI_FAILURE(status)) {
		return_ACPI_STATUS(status);
	}

	/* Make sure that the installed handler is the same */

	if (!handler || handler != acpi_gbl_table_handler) {
		status = AE_BAD_PARAMETER;
		goto cleanup;
	}

	/* Remove the handler */

	acpi_gbl_table_handler = NULL;

      cleanup:
	(void)acpi_ut_release_mutex(ACPI_MTX_EVENTS);
	return_ACPI_STATUS(status);
}

ACPI_EXPORT_SYMBOL(acpi_remove_table_handler)


static int __init acpi_no_auto_ssdt_setup(char *s) {
static int __init acpi_no_auto_ssdt_setup(char *s) {


        printk(KERN_NOTICE "ACPI: SSDT auto-load disabled\n");
        printk(KERN_NOTICE "ACPI: SSDT auto-load disabled\n");
+2 −1
Original line number Original line Diff line number Diff line
@@ -675,12 +675,13 @@ void acpi_ut_init_globals(void)
	acpi_gbl_gpe_fadt_blocks[0] = NULL;
	acpi_gbl_gpe_fadt_blocks[0] = NULL;
	acpi_gbl_gpe_fadt_blocks[1] = NULL;
	acpi_gbl_gpe_fadt_blocks[1] = NULL;


	/* Global notify handlers */
	/* Global handlers */


	acpi_gbl_system_notify.handler = NULL;
	acpi_gbl_system_notify.handler = NULL;
	acpi_gbl_device_notify.handler = NULL;
	acpi_gbl_device_notify.handler = NULL;
	acpi_gbl_exception_handler = NULL;
	acpi_gbl_exception_handler = NULL;
	acpi_gbl_init_handler = NULL;
	acpi_gbl_init_handler = NULL;
	acpi_gbl_table_handler = NULL;


	/* Global Lock support */
	/* Global Lock support */


+2 −2
Original line number Original line Diff line number Diff line
@@ -104,12 +104,12 @@ typedef const struct acpi_dmtable_info {
#define ACPI_DMT_SIG                    27
#define ACPI_DMT_SIG                    27


typedef
typedef
void (*ACPI_TABLE_HANDLER) (struct acpi_table_header * table);
void (*acpi_dmtable_handler) (struct acpi_table_header * table);


struct acpi_dmtable_data {
struct acpi_dmtable_data {
	char *signature;
	char *signature;
	struct acpi_dmtable_info *table_info;
	struct acpi_dmtable_info *table_info;
	ACPI_TABLE_HANDLER table_handler;
	acpi_dmtable_handler table_handler;
	char *name;
	char *name;
};
};


+2 −0
Original line number Original line Diff line number Diff line
@@ -217,6 +217,8 @@ ACPI_EXTERN struct acpi_object_notify_handler acpi_gbl_device_notify;
ACPI_EXTERN struct acpi_object_notify_handler acpi_gbl_system_notify;
ACPI_EXTERN struct acpi_object_notify_handler acpi_gbl_system_notify;
ACPI_EXTERN acpi_exception_handler acpi_gbl_exception_handler;
ACPI_EXTERN acpi_exception_handler acpi_gbl_exception_handler;
ACPI_EXTERN acpi_init_handler acpi_gbl_init_handler;
ACPI_EXTERN acpi_init_handler acpi_gbl_init_handler;
ACPI_EXTERN acpi_tbl_handler acpi_gbl_table_handler;
ACPI_EXTERN void *acpi_gbl_table_handler_context;
ACPI_EXTERN struct acpi_walk_state *acpi_gbl_breakpoint_walk;
ACPI_EXTERN struct acpi_walk_state *acpi_gbl_breakpoint_walk;


/* Owner ID support */
/* Owner ID support */
Loading