tbxface.c

来自「linux 内核源代码」· C语言 代码 · 共 648 行 · 第 1/2 页

C
648
字号
ACPI_EXPORT_SYMBOL(acpi_get_table_header)/****************************************************************************** * * FUNCTION:    acpi_unload_table_id * * PARAMETERS:  id            - Owner ID of the table to be removed. * * RETURN:      Status * * DESCRIPTION: This routine is used to force the unload of a table (by id) * ******************************************************************************/acpi_status acpi_unload_table_id(acpi_owner_id id){	int i;	acpi_status status = AE_NOT_EXIST;	ACPI_FUNCTION_TRACE(acpi_unload_table_id);	/* Find table in the global table list */	for (i = 0; i < acpi_gbl_root_table_list.count; ++i) {		if (id != acpi_gbl_root_table_list.tables[i].owner_id) {			continue;		}		/*		 * Delete all namespace objects owned by this table. Note that these		 * objects can appear anywhere in the namespace by virtue of the AML		 * "Scope" operator. Thus, we need to track ownership by an ID, not		 * simply a position within the hierarchy		 */		acpi_tb_delete_namespace_by_owner(i);		status = acpi_tb_release_owner_id(i);		acpi_tb_set_table_loaded_flag(i, FALSE);		break;	}	return_ACPI_STATUS(status);}ACPI_EXPORT_SYMBOL(acpi_unload_table_id)/******************************************************************************* * * FUNCTION:    acpi_get_table * * PARAMETERS:  Signature           - ACPI signature of needed table *              Instance            - Which instance (for SSDTs) *              out_table           - Where the pointer to the table is returned * * RETURN:      Status and pointer to table * * DESCRIPTION: Finds and verifies an ACPI table. * *****************************************************************************/acpi_statusacpi_get_table(char *signature,	       acpi_native_uint instance, struct acpi_table_header **out_table){	acpi_native_uint i;	acpi_native_uint j;	acpi_status status;	/* Parameter validation */	if (!signature || !out_table) {		return (AE_BAD_PARAMETER);	}	/*	 * Walk the root table list	 */	for (i = 0, j = 0; i < acpi_gbl_root_table_list.count; i++) {		if (!ACPI_COMPARE_NAME		    (&(acpi_gbl_root_table_list.tables[i].signature),		     signature)) {			continue;		}		if (++j < instance) {			continue;		}		status =		    acpi_tb_verify_table(&acpi_gbl_root_table_list.tables[i]);		if (ACPI_SUCCESS(status)) {			*out_table = acpi_gbl_root_table_list.tables[i].pointer;		}		if (!acpi_gbl_permanent_mmap) {			acpi_gbl_root_table_list.tables[i].pointer = NULL;		}		return (status);	}	return (AE_NOT_FOUND);}ACPI_EXPORT_SYMBOL(acpi_get_table)/******************************************************************************* * * FUNCTION:    acpi_get_table_by_index * * PARAMETERS:  table_index         - Table index *              Table               - Where the pointer to the table is returned * * RETURN:      Status and pointer to the table * * DESCRIPTION: Obtain a table by an index into the global table list. * ******************************************************************************/acpi_statusacpi_get_table_by_index(acpi_native_uint table_index,			struct acpi_table_header ** table){	acpi_status status;	ACPI_FUNCTION_TRACE(acpi_get_table_by_index);	/* Parameter validation */	if (!table) {		return_ACPI_STATUS(AE_BAD_PARAMETER);	}	(void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES);	/* Validate index */	if (table_index >= acpi_gbl_root_table_list.count) {		(void)acpi_ut_release_mutex(ACPI_MTX_TABLES);		return_ACPI_STATUS(AE_BAD_PARAMETER);	}	if (!acpi_gbl_root_table_list.tables[table_index].pointer) {		/* Table is not mapped, map it */		status =		    acpi_tb_verify_table(&acpi_gbl_root_table_list.					 tables[table_index]);		if (ACPI_FAILURE(status)) {			(void)acpi_ut_release_mutex(ACPI_MTX_TABLES);			return_ACPI_STATUS(status);		}	}	*table = acpi_gbl_root_table_list.tables[table_index].pointer;	(void)acpi_ut_release_mutex(ACPI_MTX_TABLES);	return_ACPI_STATUS(AE_OK);}ACPI_EXPORT_SYMBOL(acpi_get_table_by_index)/******************************************************************************* * * FUNCTION:    acpi_tb_load_namespace * * PARAMETERS:  None * * RETURN:      Status * * DESCRIPTION: Load the namespace from the DSDT and all SSDTs/PSDTs found in *              the RSDT/XSDT. * ******************************************************************************/static acpi_status acpi_tb_load_namespace(void){	acpi_status status;	struct acpi_table_header *table;	acpi_native_uint i;	ACPI_FUNCTION_TRACE(tb_load_namespace);	(void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES);	/*	 * Load the namespace. The DSDT is required, but any SSDT and PSDT tables	 * are optional.	 */	if (!acpi_gbl_root_table_list.count ||	    !ACPI_COMPARE_NAME(&			       (acpi_gbl_root_table_list.				tables[ACPI_TABLE_INDEX_DSDT].signature),			       ACPI_SIG_DSDT)	    ||	    ACPI_FAILURE(acpi_tb_verify_table			 (&acpi_gbl_root_table_list.			  tables[ACPI_TABLE_INDEX_DSDT]))) {		status = AE_NO_ACPI_TABLES;		goto unlock_and_exit;	}	/*	 * Find DSDT table	 */	status =	    acpi_os_table_override(acpi_gbl_root_table_list.				   tables[ACPI_TABLE_INDEX_DSDT].pointer,				   &table);	if (ACPI_SUCCESS(status) && table) {		/*		 * DSDT table has been found		 */		acpi_tb_delete_table(&acpi_gbl_root_table_list.				     tables[ACPI_TABLE_INDEX_DSDT]);		acpi_gbl_root_table_list.tables[ACPI_TABLE_INDEX_DSDT].pointer =		    table;		acpi_gbl_root_table_list.tables[ACPI_TABLE_INDEX_DSDT].length =		    table->length;		acpi_gbl_root_table_list.tables[ACPI_TABLE_INDEX_DSDT].flags =		    ACPI_TABLE_ORIGIN_UNKNOWN;		ACPI_INFO((AE_INFO, "Table DSDT replaced by host OS"));		acpi_tb_print_table_header(0, table);		if (no_auto_ssdt == 0) {			printk(KERN_WARNING "ACPI: DSDT override uses original SSDTs unless \"acpi_no_auto_ssdt\"");		}	}	status =	    acpi_tb_verify_table(&acpi_gbl_root_table_list.				 tables[ACPI_TABLE_INDEX_DSDT]);	if (ACPI_FAILURE(status)) {		/* A valid DSDT is required */		status = AE_NO_ACPI_TABLES;		goto unlock_and_exit;	}	(void)acpi_ut_release_mutex(ACPI_MTX_TABLES);	/*	 * Load and parse tables.	 */	status = acpi_ns_load_table(ACPI_TABLE_INDEX_DSDT, acpi_gbl_root_node);	if (ACPI_FAILURE(status)) {		return_ACPI_STATUS(status);	}	/*	 * Load any SSDT or PSDT tables. Note: Loop leaves tables locked	 */	(void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES);	for (i = 0; i < acpi_gbl_root_table_list.count; ++i) {		if ((!ACPI_COMPARE_NAME		     (&(acpi_gbl_root_table_list.tables[i].signature),		      ACPI_SIG_SSDT)		     &&		     !ACPI_COMPARE_NAME(&					(acpi_gbl_root_table_list.tables[i].					 signature), ACPI_SIG_PSDT))		    ||		    ACPI_FAILURE(acpi_tb_verify_table				 (&acpi_gbl_root_table_list.tables[i]))) {			continue;		}		if (no_auto_ssdt) {			printk(KERN_WARNING "ACPI: SSDT ignored due to \"acpi_no_auto_ssdt\"\n");			continue;		}		/* Ignore errors while loading tables, get as many as possible */		(void)acpi_ut_release_mutex(ACPI_MTX_TABLES);		(void)acpi_ns_load_table(i, acpi_gbl_root_node);		(void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES);	}	ACPI_DEBUG_PRINT((ACPI_DB_INIT, "ACPI Tables successfully acquired\n"));      unlock_and_exit:	(void)acpi_ut_release_mutex(ACPI_MTX_TABLES);	return_ACPI_STATUS(status);}/******************************************************************************* * * FUNCTION:    acpi_load_tables * * PARAMETERS:  None * * RETURN:      Status * * DESCRIPTION: Load the ACPI tables from the RSDT/XSDT * ******************************************************************************/acpi_status acpi_load_tables(void){	acpi_status status;	ACPI_FUNCTION_TRACE(acpi_load_tables);	/*	 * Load the namespace from the tables	 */	status = acpi_tb_load_namespace();	if (ACPI_FAILURE(status)) {		ACPI_EXCEPTION((AE_INFO, status,				"While loading namespace from ACPI tables"));	}	return_ACPI_STATUS(status);}ACPI_EXPORT_SYMBOL(acpi_load_tables)static int __init acpi_no_auto_ssdt_setup(char *s) {        printk(KERN_NOTICE "ACPI: SSDT auto-load disabled\n");        no_auto_ssdt = 1;        return 1;}__setup("acpi_no_auto_ssdt", acpi_no_auto_ssdt_setup);

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?