ACPICA: acpidump: Add support for ACPI 1.0 GUID in Linux
authorLv Zheng <lv.zheng@intel.com>
Tue, 8 Jul 2014 02:05:58 +0000 (10:05 +0800)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Tue, 8 Jul 2014 12:22:24 +0000 (14:22 +0200)
For older EFI platforms, searches for the RSDP using ACPI 1.0 GUID if the
2.0 GUID search fails.

Signed-off-by: Lv Zheng <lv.zheng@intel.com>
Signed-off-by: David E. Box <david.e.box@linux.intel.com>
Signed-off-by: Bob Moore <robert.moore@intel.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
tools/power/acpi/os_specific/service_layers/oslinuxtbl.c

index 28c5200..0dc2485 100644 (file)
@@ -77,6 +77,9 @@ osl_map_table(acpi_size address,
 
 static void osl_unmap_table(struct acpi_table_header *table);
 
+static acpi_physical_address
+osl_find_rsdp_via_efi_by_keyword(FILE * file, const char *keyword);
+
 static acpi_physical_address osl_find_rsdp_via_efi(void);
 
 static acpi_status osl_load_rsdp(void);
@@ -415,6 +418,38 @@ acpi_os_get_table_by_index(u32 index,
        return (status);
 }
 
+/******************************************************************************
+ *
+ * FUNCTION:    osl_find_rsdp_via_efi_by_keyword
+ *
+ * PARAMETERS:  keyword         - Character string indicating ACPI GUID version
+ *                                in the EFI table
+ *
+ * RETURN:      RSDP address if found
+ *
+ * DESCRIPTION: Find RSDP address via EFI using keyword indicating the ACPI
+ *              GUID version.
+ *
+ *****************************************************************************/
+
+static acpi_physical_address
+osl_find_rsdp_via_efi_by_keyword(FILE * file, const char *keyword)
+{
+       char buffer[80];
+       unsigned long long address = 0;
+       char format[32];
+
+       snprintf(format, 32, "%s=%s", keyword, "%llx");
+       fseek(file, 0, SEEK_SET);
+       while (fgets(buffer, 80, file)) {
+               if (sscanf(buffer, format, &address) == 1) {
+                       break;
+               }
+       }
+
+       return ((acpi_physical_address) (address));
+}
+
 /******************************************************************************
  *
  * FUNCTION:    osl_find_rsdp_via_efi
@@ -430,20 +465,19 @@ acpi_os_get_table_by_index(u32 index,
 static acpi_physical_address osl_find_rsdp_via_efi(void)
 {
        FILE *file;
-       char buffer[80];
-       unsigned long address = 0;
+       acpi_physical_address address = 0;
 
        file = fopen(EFI_SYSTAB, "r");
        if (file) {
-               while (fgets(buffer, 80, file)) {
-                       if (sscanf(buffer, "ACPI20=0x%lx", &address) == 1) {
-                               break;
-                       }
+               address = osl_find_rsdp_via_efi_by_keyword(file, "ACPI20");
+               if (!address) {
+                       address =
+                           osl_find_rsdp_via_efi_by_keyword(file, "ACPI");
                }
                fclose(file);
        }
 
-       return ((acpi_physical_address) (address));
+       return (address);
 }
 
 /******************************************************************************