RE: [PATCH 1/6] ACPI: introduce the inactive ACPI tables mangement

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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


[Index of Archives]     [Linux IBM ACPI]     [Linux Power Management]     [Linux Kernel]     [Linux Laptop]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]     [Linux Resources]

  Powered by Linux