Browse Source

x86: check dsdt before find oem table for es7000, v2

v2: use __acpi_unmap_table()

Signed-off-by: Yinghai Lu <yhlu.kernel@gmail.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Yinghai Lu 16 years ago
parent
commit
a73aaedd95
3 changed files with 39 additions and 10 deletions
  1. 23 5
      arch/x86/kernel/es7000_32.c
  2. 15 5
      arch/x86/mach-generic/es7000.c
  3. 1 0
      include/asm-x86/es7000/mpparse.h

+ 23 - 5
arch/x86/kernel/es7000_32.c

@@ -109,6 +109,7 @@ struct oem_table {
 };
 };
 
 
 extern int find_unisys_acpi_oem_table(unsigned long *oem_addr);
 extern int find_unisys_acpi_oem_table(unsigned long *oem_addr);
+extern void unmap_unisys_acpi_oem_table(unsigned long oem_addr);
 #endif
 #endif
 
 
 struct mip_reg {
 struct mip_reg {
@@ -243,21 +244,38 @@ parse_unisys_oem (char *oemptr)
 }
 }
 
 
 #ifdef CONFIG_ACPI
 #ifdef CONFIG_ACPI
-int __init
-find_unisys_acpi_oem_table(unsigned long *oem_addr)
+static unsigned long oem_addrX;
+static unsigned long oem_size;
+int __init find_unisys_acpi_oem_table(unsigned long *oem_addr)
 {
 {
 	struct acpi_table_header *header = NULL;
 	struct acpi_table_header *header = NULL;
 	int i = 0;
 	int i = 0;
-	while (ACPI_SUCCESS(acpi_get_table("OEM1", i++, &header))) {
+	acpi_size tbl_size;
+
+	while (ACPI_SUCCESS(acpi_get_table_with_size("OEM1", i++, &header, &tbl_size))) {
 		if (!memcmp((char *) &header->oem_id, "UNISYS", 6)) {
 		if (!memcmp((char *) &header->oem_id, "UNISYS", 6)) {
 			struct oem_table *t = (struct oem_table *)header;
 			struct oem_table *t = (struct oem_table *)header;
-			*oem_addr = (unsigned long)__acpi_map_table(t->OEMTableAddr,
-								    t->OEMTableSize);
+
+			oem_addrX = t->OEMTableAddr;
+			oem_size = t->OEMTableSize;
+			early_acpi_os_unmap_memory(header, tbl_size);
+
+			*oem_addr = (unsigned long)__acpi_map_table(oem_addrX,
+								    oem_size);
 			return 0;
 			return 0;
 		}
 		}
+		early_acpi_os_unmap_memory(header, tbl_size);
 	}
 	}
 	return -1;
 	return -1;
 }
 }
+
+void __init unmap_unisys_acpi_oem_table(unsigned long oem_addr)
+{
+	if (!oem_addr)
+		return;
+
+	__acpi_unmap_table((char *)oem_addr, oem_size);
+}
 #endif
 #endif
 
 
 static void
 static void

+ 15 - 5
arch/x86/mach-generic/es7000.c

@@ -47,16 +47,26 @@ static __init int mps_oem_check(struct mp_config_table *mpc, char *oem,
 /* Hook from generic ACPI tables.c */
 /* Hook from generic ACPI tables.c */
 static int __init acpi_madt_oem_check(char *oem_id, char *oem_table_id)
 static int __init acpi_madt_oem_check(char *oem_id, char *oem_table_id)
 {
 {
-	unsigned long oem_addr;
+	unsigned long oem_addr = 0;
+	int check_dsdt;
+	int ret = 0;
+
+	/* check dsdt at first to avoid clear fix_map for oem_addr */
+	check_dsdt = es7000_check_dsdt();
+
 	if (!find_unisys_acpi_oem_table(&oem_addr)) {
 	if (!find_unisys_acpi_oem_table(&oem_addr)) {
-		if (es7000_check_dsdt())
-			return parse_unisys_oem((char *)oem_addr);
+		if (check_dsdt)
+			ret = parse_unisys_oem((char *)oem_addr);
 		else {
 		else {
 			setup_unisys();
 			setup_unisys();
-			return 1;
+			ret = 1;
 		}
 		}
+		/*
+		 * we need to unmap it
+		 */
+		unmap_unisys_acpi_oem_table(oem_addr);
 	}
 	}
-	return 0;
+	return ret;
 }
 }
 #else
 #else
 static int __init acpi_madt_oem_check(char *oem_id, char *oem_table_id)
 static int __init acpi_madt_oem_check(char *oem_id, char *oem_table_id)

+ 1 - 0
include/asm-x86/es7000/mpparse.h

@@ -5,6 +5,7 @@
 
 
 extern int parse_unisys_oem (char *oemptr);
 extern int parse_unisys_oem (char *oemptr);
 extern int find_unisys_acpi_oem_table(unsigned long *oem_addr);
 extern int find_unisys_acpi_oem_table(unsigned long *oem_addr);
+extern void unmap_unisys_acpi_oem_table(unsigned long oem_addr);
 extern void setup_unisys(void);
 extern void setup_unisys(void);
 
 
 #ifndef CONFIG_X86_GENERICARCH
 #ifndef CONFIG_X86_GENERICARCH