===================================================================
@@ -172,6 +172,11 @@ char *__init __acpi_map_table(unsigned l
return __va(phys_addr);
}
+char *__init __acpi_map_table_permanent(unsigned long phys_addr, unsigned long size)
+{
+ return ioremap(phys_addr, size);
+}
+
void __init __acpi_unmap_table(char *map, unsigned long size)
{
}
===================================================================
@@ -167,6 +167,20 @@ void __init __acpi_unmap_table(char *map
early_iounmap(map, size);
}
+/*
+ * Permanently map memory for ACPI. Map ACPI tables and RAM as WB,
+ * other regions as UC.
+ */
+char *__init __acpi_map_table_permanent(unsigned long phys, unsigned long size)
+{
+ if (e820_all_mapped(phys, phys + size, E820_RAM) ||
+ e820_all_mapped(phys, phys + size, E820_ACPI) ||
+ e820_all_mapped(phys, phys + size, E820_NVS))
+ return ioremap_cache((unsigned long)phys, size);
+ else
+ return ioremap(phys, size);
+}
+
#ifdef CONFIG_X86_LOCAL_APIC
static int __init acpi_parse_madt(struct acpi_table_header *table)
{
===================================================================
@@ -271,7 +271,7 @@ acpi_os_map_memory(acpi_physical_address
/*
* ioremap checks to ensure this is in reserved space
*/
- return ioremap((unsigned long)phys, size);
+ return __acpi_map_table_permanent((unsigned long)phys, size);
else
return __acpi_map_table((unsigned long)phys, size);
}
===================================================================
@@ -77,6 +77,7 @@ typedef int (*acpi_table_handler) (struc
typedef int (*acpi_table_entry_handler) (struct acpi_subtable_header *header, const unsigned long end);
char * __acpi_map_table (unsigned long phys_addr, unsigned long size);
+char * __acpi_map_table_permanent (unsigned long phys_addr, unsigned long size);
void __acpi_unmap_table(char *map, unsigned long size);
int early_acpi_boot_init(void);
int acpi_boot_init (void);