|
@@ -121,8 +121,8 @@ enum acpi_irq_model_id acpi_irq_model = ACPI_IRQ_MODEL_PIC;
|
|
|
*/
|
|
|
char *__init __acpi_map_table(unsigned long phys, unsigned long size)
|
|
|
{
|
|
|
- unsigned long base, offset, mapped_size;
|
|
|
- int idx;
|
|
|
+ static char *prev_map;
|
|
|
+ static unsigned long prev_size;
|
|
|
|
|
|
if (!phys || !size)
|
|
|
return NULL;
|
|
@@ -130,26 +130,13 @@ char *__init __acpi_map_table(unsigned long phys, unsigned long size)
|
|
|
if (phys+size <= (max_low_pfn_mapped << PAGE_SHIFT))
|
|
|
return __va(phys);
|
|
|
|
|
|
- offset = phys & (PAGE_SIZE - 1);
|
|
|
- mapped_size = PAGE_SIZE - offset;
|
|
|
- clear_fixmap(FIX_ACPI_END);
|
|
|
- set_fixmap(FIX_ACPI_END, phys);
|
|
|
- base = fix_to_virt(FIX_ACPI_END);
|
|
|
+ if (prev_map)
|
|
|
+ early_iounmap(prev_map, prev_size);
|
|
|
|
|
|
- /*
|
|
|
- * Most cases can be covered by the below.
|
|
|
- */
|
|
|
- idx = FIX_ACPI_END;
|
|
|
- while (mapped_size < size) {
|
|
|
- if (--idx < FIX_ACPI_BEGIN)
|
|
|
- return NULL; /* cannot handle this */
|
|
|
- phys += PAGE_SIZE;
|
|
|
- clear_fixmap(idx);
|
|
|
- set_fixmap(idx, phys);
|
|
|
- mapped_size += PAGE_SIZE;
|
|
|
- }
|
|
|
+ prev_size = size;
|
|
|
+ prev_map = early_ioremap(phys, size);
|
|
|
|
|
|
- return ((unsigned char *)base + offset);
|
|
|
+ return prev_map;
|
|
|
}
|
|
|
|
|
|
#ifdef CONFIG_PCI_MMCONFIG
|