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