Hmm, do you mean add the support of acpi inactive table management in ACPICA? Thanks, rui >-----Original Message----- >From: Moore, Robert >Sent: Friday, October 24, 2008 1:16 AM >To: Zhang, Rui >Cc: Len Brown; linux-acpi >Subject: RE: [PATCH 1/6] ACPI: introduce the inactive ACPI tables mangement > >Now, how about doing a native ACPICA version of this? >Bob > > >>-----Original Message----- >>From: Zhang, Rui >>Sent: Monday, October 13, 2008 6:26 PM >>To: Moore, Robert >>Cc: Len Brown; linux-acpi >>Subject: RE: [PATCH 1/6] ACPI: introduce the inactive ACPI tables mangement >> >>On Mon, 2008-10-13 at 15:57 -0600, Moore, Robert wrote: >>> acpi_initialize_inactive_tables is fairly large. I would suspect that >>there is a lot of common code with the "normal" initialize tables >>yes. >>> - just a different pointer to the root table list, maybe a couple >>> more. >> >>just a different pointer to a different root table >>list(acpi_gbl_inactive_root_table_list). >>others are quite similar to acpi_tb_parse_root_table. >>but it's not easy to reuse the code >>as acpi_gbl_root_table_list is hard coded there. >> >>thanks, >>rui >>> >>> >-----Original Message----- >>> >From: linux-acpi-owner@xxxxxxxxxxxxxxx [mailto:linux-acpi- >>> >owner@xxxxxxxxxxxxxxx] On Behalf Of Zhang Rui >>> >Sent: Monday, October 13, 2008 1:10 AM >>> >To: Len Brown >>> >Cc: linux-acpi; Moore, Robert; Zhang, Rui >>> >Subject: [PATCH 1/6] ACPI: introduce the inactive ACPI tables mangement >>> > >>> > >>> >RSDT and XSDT may export different tables. >>> >Linux uses either RSDT or XSDT as the root table. >>> >There are some inactive tables which exists but is not used, >>> >e.g. Linux is using XSDT but the table is exported by RSDT only. >>> > >>> >Sometimes we still need to dump these inactive tables for debugging. >>> > >>> >This patch introduces the inactive table management in Linux. >>> > >>> >Signed-off-by: Zhang Rui <rui.zhang@xxxxxxxxx> >>> >--- >>> > drivers/acpi/tables/tbutils.c | 22 +++---- >>> > drivers/acpi/tables/tbxface.c | 131 >>> >++++++++++++++++++++++++++++++++++++++++++ >>> > include/acpi/acglobal.h | 3 >>> > include/acpi/acpixf.h | 2 >>> > include/acpi/actables.h | 3 >>> > 5 files changed, 151 insertions(+), 10 deletions(-) >>> > >>> >Index: linux-acpi-2.6/include/acpi/acglobal.h >>> >=================================================================== >>> >--- linux-acpi-2.6.orig/include/acpi/acglobal.h >>> >+++ linux-acpi-2.6/include/acpi/acglobal.h >>> >@@ -139,6 +139,9 @@ ACPI_EXTERN u32 acpi_gbl_trace_flags; >>> > * acpi_gbl_FADT is a local copy of the FADT, converted to a common >>> >format. >>> > */ >>> > ACPI_EXTERN struct acpi_internal_rsdt acpi_gbl_root_table_list; >>> >+ACPI_EXTERN struct acpi_internal_rsdt >>acpi_gbl_inactive_root_table_list; >>> >+ACPI_EXTERN acpi_physical_address acpi_inactive_tables_root_pointer; >>> >+ACPI_EXTERN u32 acpi_inactive_tables_entry_size; >>> > ACPI_EXTERN struct acpi_table_fadt acpi_gbl_FADT; >>> > extern u8 acpi_gbl_permanent_mmap; >>> > >>> >Index: linux-acpi-2.6/include/acpi/acpixf.h >>> >=================================================================== >>> >--- linux-acpi-2.6.orig/include/acpi/acpixf.h >>> >+++ linux-acpi-2.6/include/acpi/acpixf.h >>> >@@ -54,6 +54,8 @@ >>> > acpi_status >>> > acpi_initialize_tables(struct acpi_table_desc *initial_storage, >>> > u32 initial_table_count, u8 allow_resize); >>> >+acpi_status >>> >+acpi_initialize_inactive_tables(void); >>> > >>> > acpi_status __init acpi_initialize_subsystem(void); >>> > >>> >Index: linux-acpi-2.6/drivers/acpi/tables/tbutils.c >>> >=================================================================== >>> >--- linux-acpi-2.6.orig/drivers/acpi/tables/tbutils.c >>> >+++ linux-acpi-2.6/drivers/acpi/tables/tbutils.c >>> >@@ -47,10 +47,6 @@ >>> > #define _COMPONENT ACPI_TABLES >>> > ACPI_MODULE_NAME("tbutils") >>> > >>> >-/* Local prototypes */ >>> >-static acpi_physical_address >>> >-acpi_tb_get_root_table_entry(u8 *table_entry, u32 table_entry_size); >>> >- >>> > >>> >>>/************************************************************************ >* >>* >>> >***** >>> > * >>> > * FUNCTION: acpi_tb_check_xsdt >>> >@@ -335,7 +331,7 @@ acpi_tb_install_table(acpi_physical_addr >>> > * >>> > >>> >>>************************************************************************* >* >>* >>> >***/ >>> > >>> >-static acpi_physical_address >>> >+acpi_physical_address >>> > acpi_tb_get_root_table_entry(u8 *table_entry, u32 table_entry_size) >>> > { >>> > u64 address64; >>> >@@ -399,7 +395,7 @@ acpi_tb_parse_root_table(acpi_physical_a >>> > u32 table_count; >>> > struct acpi_table_header *table; >>> > acpi_physical_address address; >>> >- acpi_physical_address uninitialized_var(rsdt_address); >>> >+ acpi_physical_address rsdt_address, xsdt_address = 0; >>> > u32 length; >>> > u8 *table_entry; >>> > acpi_status status; >>> >@@ -426,14 +422,15 @@ acpi_tb_parse_root_table(acpi_physical_a >>> > * XSDT if the revision is > 1 and the XSDT pointer is >>> >present, as per >>> > * the ACPI specification. >>> > */ >>> >- address = (acpi_physical_address) rsdp- >>> >>xsdt_physical_address; >>> >+ xsdt_address = (acpi_physical_address) rsdp- >>> >>xsdt_physical_address; >>> >+ address = xsdt_address; >>> > table_entry_size = sizeof(u64); >>> >- rsdt_address = (acpi_physical_address) >>> >- rsdp->rsdt_physical_address; >>> >+ rsdt_address = (acpi_physical_address) rsdp- >>> >>rsdt_physical_address; >>> > } else { >>> > /* Root table is an RSDT (32-bit physical addresses) */ >>> > >>> >- address = (acpi_physical_address) rsdp- >>> >>rsdt_physical_address; >>> >+ rsdt_address = (acpi_physical_address) rsdp- >>> >>rsdt_physical_address; >>> >+ address = rsdt_address; >>> > table_entry_size = sizeof(u32); >>> > } >>> > >>> >@@ -452,6 +449,11 @@ acpi_tb_parse_root_table(acpi_physical_a >>> > "using RSDT")); >>> > } >>> > } >>> >+ acpi_inactive_tables_root_pointer = >>> >+ (address == rsdt_address ? xsdt_address : rsdt_address); >>> >+ acpi_inactive_tables_entry_size = >>> >+ (table_entry_size == sizeof(u32) ? sizeof(u64) : >>> >sizeof(u32)); >>> >+ >>> > /* Map the RSDT/XSDT table header to get the full table length >>*/ >>> > >>> > table = acpi_os_map_memory(address, sizeof(struct >>> >acpi_table_header)); >>> >Index: linux-acpi-2.6/include/acpi/actables.h >>> >=================================================================== >>> >--- linux-acpi-2.6.orig/include/acpi/actables.h >>> >+++ linux-acpi-2.6/include/acpi/actables.h >>> >@@ -105,6 +105,9 @@ u8 acpi_tb_checksum(u8 *buffer, u32 leng >>> > acpi_status >>> > acpi_tb_verify_checksum(struct acpi_table_header *table, u32 length); >>> > >>> >+acpi_physical_address >>> >+acpi_tb_get_root_table_entry(u8 *table_entry, u32 table_entry_size); >>> >+ >>> > void >>> > acpi_tb_install_table(acpi_physical_address address, >>> > u8 flags, char *signature, u32 table_index); >>> >Index: linux-acpi-2.6/drivers/acpi/tables/tbxface.c >>> >=================================================================== >>> >--- linux-acpi-2.6.orig/drivers/acpi/tables/tbxface.c >>> >+++ linux-acpi-2.6/drivers/acpi/tables/tbxface.c >>> >@@ -156,6 +156,137 @@ acpi_initialize_tables(struct acpi_table >>> > >>> > >>> >>>/************************************************************************ >* >>* >>> >***** >>> > * >>> >+ * FUNCTION: acpi_initialize_inactive_tables >>> >+ * >>> >+ * RETURN: Status >>> >+ * >>> >+ * DESCRIPTION: Initialize the inactive table manager. >>> >+ * Get the unused root table pointer, parse all the >>inactive >>> >tables >>> >+ * and install them to the global inactive table list. >>> >+ * >>> >+ >>> >>>************************************************************************* >* >>* >>> >***/ >>> >+acpi_status __init >>> >+acpi_initialize_inactive_tables(void) >>> >+{ >>> >+ acpi_status status; >>> >+ u32 length; >>> >+ u32 table_count; >>> >+ u8 *table_entry; >>> >+ u32 i; >>> >+ struct acpi_table_header *table; >>> >+ struct acpi_table_fadt *fadt; >>> >+ >>> >+ if (!acpi_inactive_tables_root_pointer) >>> >+ return AE_NOT_EXIST; >>> >+ /* Map the RSDT/XSDT table header to get the full table length >>*/ >>> >+ table = acpi_os_map_memory(acpi_inactive_tables_root_pointer, >>> >+ sizeof(struct acpi_table_header)); >>> >+ if (!table) >>> >+ return_ACPI_STATUS(AE_NO_MEMORY); >>> >+ >>> >+ length = table->length; >>> >+ acpi_os_unmap_memory(table, sizeof(struct acpi_table_header)); >>> >+ >>> >+ if (length < sizeof(struct acpi_table_header)) >>> >+ return_ACPI_STATUS(AE_INVALID_TABLE_LENGTH); >>> >+ >>> >+ table = acpi_os_map_memory(acpi_inactive_tables_root_pointer, >>> >length); >>> >+ if (!table) >>> >+ return_ACPI_STATUS(AE_NO_MEMORY); >>> >+ >>> >+ status = acpi_tb_verify_checksum(table, length); >>> >+ if (ACPI_FAILURE(status)) { >>> >+ acpi_os_unmap_memory(table, length); >>> >+ return_ACPI_STATUS(status); >>> >+ } >>> >+ >>> >+ table_count = (u32) ((table->length - sizeof(struct >>> >acpi_table_header)) >>> >+ / acpi_inactive_tables_entry_size); >>> >+ >>> >+ /* talbe_count tables + XSDT/RSDT + FACP + DSDT */ >>> >+ acpi_gbl_inactive_root_table_list.size = table_count + 3; >>> >+ acpi_gbl_inactive_root_table_list.tables = ACPI_ALLOCATE_ZEROED( >>> >+ sizeof(struct acpi_table_desc) * >>> >+ >>> >acpi_gbl_inactive_root_table_list.size); >>> >+ if (!acpi_gbl_inactive_root_table_list.tables) >>> >+ return_ACPI_STATUS(AE_NO_MEMORY); >>> >+ >>> >+ acpi_gbl_inactive_root_table_list.tables[0].address = >>> >+ acpi_inactive_tables_root_pointer; >>> >+ acpi_gbl_inactive_root_table_list.count++; >>> >+ >>> >+ table_entry = >>> >+ ACPI_CAST_PTR(u8, table) + sizeof(struct >>> >acpi_table_header); >>> >+ >>> >+ for (i = 0; i < table_count; i++) { >>> >+ acpi_gbl_inactive_root_table_list.tables >>> >+ >>[acpi_gbl_inactive_root_table_list.count].address = >>> >+ acpi_tb_get_root_table_entry(table_entry, >>> >+ >>acpi_inactive_tables_entry_size); >>> >+ >>> >+ table_entry += acpi_inactive_tables_entry_size; >>> >+ acpi_gbl_inactive_root_table_list.count++; >>> >+ } >>> >+ acpi_os_unmap_memory(table, length); >>> >+ >>> >+ for (i = 0; i < acpi_gbl_inactive_root_table_list.count; i++) { >>> >+ if >>(!acpi_gbl_inactive_root_table_list.tables[i].address) { >>> >+ ACPI_WARNING((AE_INFO, >>> >+ "Null table entry")); >>> >+ continue; >>> >+ } >>> >+ /* install inactive ACPI tables */ >>> >+ table = acpi_os_map_memory( >>> >+ >>> >acpi_gbl_inactive_root_table_list.tables[i].address, >>> >+ sizeof(struct acpi_table_header)); >>> >+ if (!table) >>> >+ return_ACPI_STATUS(AE_NO_MEMORY); >>> >+ >>> >+ acpi_gbl_inactive_root_table_list.tables[i].length = >>> >+ table- >>> >>length; >>> >+ acpi_gbl_inactive_root_table_list.tables[i].flags = >>> >+ >>> >ACPI_TABLE_ORIGIN_MAPPED; >>> >+ ACPI_MOVE_32_TO_32(& >>> >+ (acpi_gbl_inactive_root_table_list.tables[i]. >>> >+ signature), table->signature); >>> >+ acpi_os_unmap_memory(table, sizeof(struct >>> >acpi_table_header)); >>> >+ >>> >+ /* Special case for FADT - get the DSDT and FACS */ >>> >+ if (!ACPI_COMPARE_NAME >>> >+ >>> >(&acpi_gbl_inactive_root_table_list.tables[i].signature, >>> >+ ACPI_SIG_FADT)) >>> >+ continue; >>> >+ >>> >+ fadt = acpi_os_map_memory( >>> >+ >>> >acpi_gbl_inactive_root_table_list.tables[i].address, >>> >+ >>> >acpi_gbl_inactive_root_table_list.tables[i].length); >>> >+ if (!fadt) >>> >+ return_ACPI_STATUS(AE_NOT_FOUND); >>> >+ >>> >+ acpi_gbl_inactive_root_table_list.tables >>> >+ >>[acpi_gbl_inactive_root_table_list.count].address = >>> >+ (acpi_physical_address) >>> >+ (((fadt->header.length == >>> >+ sizeof(struct acpi_table_fadt)) && >>> >+ fadt->Xdsdt) ? fadt->Xdsdt : fadt- >>>dsdt); >>> >+ acpi_gbl_inactive_root_table_list.count++; >>> >+ >>> >+ acpi_gbl_inactive_root_table_list.tables >>> >+ >>[acpi_gbl_inactive_root_table_list.count].address = >>> >+ (acpi_physical_address) >>> >+ (((fadt->header.length == >>> >+ sizeof(struct acpi_table_fadt)) && >>> >+ fadt->Xfacs) ? fadt->Xfacs : fadt- >>>facs); >>> >+ acpi_gbl_inactive_root_table_list.count++; >>> >+ >>> >+ acpi_os_unmap_memory(fadt, >>> >+ >>> >acpi_gbl_inactive_root_table_list.tables[i].length); >>> >+ } >>> >+ >>> >+ return_ACPI_STATUS(status); >>> >+} >>> >>>+/*********************************************************************** >* >>* >>> >****** >>> >+ * >>> > * FUNCTION: acpi_reallocate_root_table >>> > * >>> > * PARAMETERS: None >>> > >>> > >>> >-- >>> >To unsubscribe from this list: send the line "unsubscribe linux-acpi" in >>> >the body of a message to majordomo@xxxxxxxxxxxxxxx >>> >More majordomo info at http://vger.kernel.org/majordomo-info.html ��.n��������+%������w��{.n�����{�����ܨ}���Ơz�j:+v�����w����ޙ��&�)ߡ�a����z�ޗ���ݢj��w�f