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 /arch/x86/kernel | |
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>
Diffstat (limited to 'arch/x86/kernel')
-rw-r--r-- | arch/x86/kernel/acpi/boot.c | 27 |
1 files changed, 7 insertions, 20 deletions
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 |