diff options
| author | Jeremy Fitzhardinge <jeremy@goop.org> | 2009-02-07 18:39:38 -0500 |
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2009-02-09 07:33:51 -0500 |
| commit | 1c14fa4937eb73509e07ac12bf8db1fdf4c42a59 (patch) | |
| tree | d137f1587078f2909a2df48a5206ca1e9751f47f | |
| parent | d5b562330ec766292a3ac54ae5e0673610bd5b3d (diff) | |
x86: use early_ioremap in __acpi_map_table
__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>
| -rw-r--r-- | arch/x86/include/asm/acpi.h | 3 | ||||
| -rw-r--r-- | arch/x86/include/asm/fixmap_32.h | 4 | ||||
| -rw-r--r-- | arch/x86/include/asm/fixmap_64.h | 4 | ||||
| -rw-r--r-- | arch/x86/kernel/acpi/boot.c | 27 |
4 files changed, 7 insertions, 31 deletions
diff --git a/arch/x86/include/asm/acpi.h b/arch/x86/include/asm/acpi.h index 9830681446ad..4518dc500903 100644 --- a/arch/x86/include/asm/acpi.h +++ b/arch/x86/include/asm/acpi.h | |||
| @@ -102,9 +102,6 @@ static inline void disable_acpi(void) | |||
| 102 | acpi_noirq = 1; | 102 | acpi_noirq = 1; |
| 103 | } | 103 | } |
| 104 | 104 | ||
| 105 | /* Fixmap pages to reserve for ACPI boot-time tables (see fixmap.h) */ | ||
| 106 | #define FIX_ACPI_PAGES 4 | ||
| 107 | |||
| 108 | extern int acpi_gsi_to_irq(u32 gsi, unsigned int *irq); | 105 | extern int acpi_gsi_to_irq(u32 gsi, unsigned int *irq); |
| 109 | 106 | ||
| 110 | static inline void acpi_noirq_set(void) { acpi_noirq = 1; } | 107 | static inline void acpi_noirq_set(void) { acpi_noirq = 1; } |
diff --git a/arch/x86/include/asm/fixmap_32.h b/arch/x86/include/asm/fixmap_32.h index c7115c1d7217..047d9bab2b31 100644 --- a/arch/x86/include/asm/fixmap_32.h +++ b/arch/x86/include/asm/fixmap_32.h | |||
| @@ -95,10 +95,6 @@ enum fixed_addresses { | |||
| 95 | (__end_of_permanent_fixed_addresses & 255), | 95 | (__end_of_permanent_fixed_addresses & 255), |
| 96 | FIX_BTMAP_BEGIN = FIX_BTMAP_END + NR_FIX_BTMAPS*FIX_BTMAPS_SLOTS - 1, | 96 | FIX_BTMAP_BEGIN = FIX_BTMAP_END + NR_FIX_BTMAPS*FIX_BTMAPS_SLOTS - 1, |
| 97 | FIX_WP_TEST, | 97 | FIX_WP_TEST, |
| 98 | #ifdef CONFIG_ACPI | ||
| 99 | FIX_ACPI_BEGIN, | ||
| 100 | FIX_ACPI_END = FIX_ACPI_BEGIN + FIX_ACPI_PAGES - 1, | ||
| 101 | #endif | ||
| 102 | #ifdef CONFIG_PROVIDE_OHCI1394_DMA_INIT | 98 | #ifdef CONFIG_PROVIDE_OHCI1394_DMA_INIT |
| 103 | FIX_OHCI1394_BASE, | 99 | FIX_OHCI1394_BASE, |
| 104 | #endif | 100 | #endif |
diff --git a/arch/x86/include/asm/fixmap_64.h b/arch/x86/include/asm/fixmap_64.h index 00a30ab9b1a5..298d9ba3faeb 100644 --- a/arch/x86/include/asm/fixmap_64.h +++ b/arch/x86/include/asm/fixmap_64.h | |||
| @@ -50,10 +50,6 @@ enum fixed_addresses { | |||
| 50 | FIX_PARAVIRT_BOOTMAP, | 50 | FIX_PARAVIRT_BOOTMAP, |
| 51 | #endif | 51 | #endif |
| 52 | __end_of_permanent_fixed_addresses, | 52 | __end_of_permanent_fixed_addresses, |
| 53 | #ifdef CONFIG_ACPI | ||
| 54 | FIX_ACPI_BEGIN, | ||
| 55 | FIX_ACPI_END = FIX_ACPI_BEGIN + FIX_ACPI_PAGES - 1, | ||
| 56 | #endif | ||
| 57 | #ifdef CONFIG_PROVIDE_OHCI1394_DMA_INIT | 53 | #ifdef CONFIG_PROVIDE_OHCI1394_DMA_INIT |
| 58 | FIX_OHCI1394_BASE, | 54 | FIX_OHCI1394_BASE, |
| 59 | #endif | 55 | #endif |
diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c index d37593c2f438..c518599e4264 100644 --- a/arch/x86/kernel/acpi/boot.c +++ b/arch/x86/kernel/acpi/boot.c | |||
| @@ -121,8 +121,8 @@ enum acpi_irq_model_id acpi_irq_model = ACPI_IRQ_MODEL_PIC; | |||
| 121 | */ | 121 | */ |
| 122 | char *__init __acpi_map_table(unsigned long phys, unsigned long size) | 122 | char *__init __acpi_map_table(unsigned long phys, unsigned long size) |
| 123 | { | 123 | { |
| 124 | unsigned long base, offset, mapped_size; | 124 | static char *prev_map; |
| 125 | int idx; | 125 | static unsigned long prev_size; |
| 126 | 126 | ||
| 127 | if (!phys || !size) | 127 | if (!phys || !size) |
| 128 | return NULL; | 128 | return NULL; |
| @@ -130,26 +130,13 @@ char *__init __acpi_map_table(unsigned long phys, unsigned long size) | |||
| 130 | if (phys+size <= (max_low_pfn_mapped << PAGE_SHIFT)) | 130 | if (phys+size <= (max_low_pfn_mapped << PAGE_SHIFT)) |
| 131 | return __va(phys); | 131 | return __va(phys); |
| 132 | 132 | ||
| 133 | offset = phys & (PAGE_SIZE - 1); | 133 | if (prev_map) |
| 134 | mapped_size = PAGE_SIZE - offset; | 134 | early_iounmap(prev_map, prev_size); |
| 135 | clear_fixmap(FIX_ACPI_END); | ||
| 136 | set_fixmap(FIX_ACPI_END, phys); | ||
| 137 | base = fix_to_virt(FIX_ACPI_END); | ||
| 138 | 135 | ||
| 139 | /* | 136 | prev_size = size; |
| 140 | * Most cases can be covered by the below. | 137 | prev_map = early_ioremap(phys, size); |
| 141 | */ | ||
| 142 | idx = FIX_ACPI_END; | ||
| 143 | while (mapped_size < size) { | ||
| 144 | if (--idx < FIX_ACPI_BEGIN) | ||
| 145 | return NULL; /* cannot handle this */ | ||
| 146 | phys += PAGE_SIZE; | ||
| 147 | clear_fixmap(idx); | ||
| 148 | set_fixmap(idx, phys); | ||
| 149 | mapped_size += PAGE_SIZE; | ||
| 150 | } | ||
| 151 | 138 | ||
| 152 | return ((unsigned char *)base + offset); | 139 | return prev_map; |
| 153 | } | 140 | } |
| 154 | 141 | ||
| 155 | #ifdef CONFIG_PCI_MMCONFIG | 142 | #ifdef CONFIG_PCI_MMCONFIG |
