x86: use early_ioremap in __acpi_map_table
authorJeremy Fitzhardinge <jeremy@goop.org>
Sat, 7 Feb 2009 23:39:38 +0000 (15:39 -0800)
committerIngo Molnar <mingo@elte.hu>
Mon, 9 Feb 2009 12:33:51 +0000 (13:33 +0100)
__acpi_map_table() effectively reimplements early_ioremap().  Rather
than have that duplication, just implement it in terms of
early_ioremap().

However, unlike early_ioremap(), __acpi_map_table() just maintains a
single mapping which gets replaced each call, and has no corresponding
unmap function.  Implement this by just removing the previous mapping
each time its called.  Unfortunately, this will leave a stray mapping
at the end.

Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
arch/x86/include/asm/acpi.h
arch/x86/include/asm/fixmap_32.h
arch/x86/include/asm/fixmap_64.h
arch/x86/kernel/acpi/boot.c

index 9830681446ad4346bacfbbed00efdb95e52eca14..4518dc50090380b6676074b3f2466709ddea5a4b 100644 (file)
@@ -102,9 +102,6 @@ static inline void disable_acpi(void)
        acpi_noirq = 1;
 }
 
-/* Fixmap pages to reserve for ACPI boot-time tables (see fixmap.h) */
-#define FIX_ACPI_PAGES 4
-
 extern int acpi_gsi_to_irq(u32 gsi, unsigned int *irq);
 
 static inline void acpi_noirq_set(void) { acpi_noirq = 1; }
index c7115c1d721721d8929e998c9c4032e27ca399d2..047d9bab2b31439b4099842b751d731f129e2884 100644 (file)
@@ -95,10 +95,6 @@ enum fixed_addresses {
                        (__end_of_permanent_fixed_addresses & 255),
        FIX_BTMAP_BEGIN = FIX_BTMAP_END + NR_FIX_BTMAPS*FIX_BTMAPS_SLOTS - 1,
        FIX_WP_TEST,
-#ifdef CONFIG_ACPI
-       FIX_ACPI_BEGIN,
-       FIX_ACPI_END = FIX_ACPI_BEGIN + FIX_ACPI_PAGES - 1,
-#endif
 #ifdef CONFIG_PROVIDE_OHCI1394_DMA_INIT
        FIX_OHCI1394_BASE,
 #endif
index 00a30ab9b1a5ba466a44c165e1d553d36a77cd19..298d9ba3faebc1eb4d3bcf814ccc53ff7a9867c4 100644 (file)
@@ -50,10 +50,6 @@ enum fixed_addresses {
        FIX_PARAVIRT_BOOTMAP,
 #endif
        __end_of_permanent_fixed_addresses,
-#ifdef CONFIG_ACPI
-       FIX_ACPI_BEGIN,
-       FIX_ACPI_END = FIX_ACPI_BEGIN + FIX_ACPI_PAGES - 1,
-#endif
 #ifdef CONFIG_PROVIDE_OHCI1394_DMA_INIT
        FIX_OHCI1394_BASE,
 #endif
index d37593c2f438d80ff609ed61e0584032670db260..c518599e4264d4a6dfddf91a178401994e8e0038 100644 (file)
@@ -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