Commit a73aaedd authored by Yinghai Lu's avatar Yinghai Lu Committed by Ingo Molnar

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

v2: use __acpi_unmap_table()
Signed-off-by: default avatarYinghai Lu <yhlu.kernel@gmail.com>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent a32ad462
...@@ -109,6 +109,7 @@ struct oem_table { ...@@ -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) ...@@ -243,21 +244,38 @@ parse_unisys_oem (char *oemptr)
} }
#ifdef CONFIG_ACPI #ifdef CONFIG_ACPI
int __init static unsigned long oem_addrX;
find_unisys_acpi_oem_table(unsigned long *oem_addr) 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
......
...@@ -47,16 +47,26 @@ static __init int mps_oem_check(struct mp_config_table *mpc, char *oem, ...@@ -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()) if (check_dsdt)
return parse_unisys_oem((char *)oem_addr); 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)
......
...@@ -5,6 +5,7 @@ ...@@ -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
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment