aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kernel
diff options
context:
space:
mode:
authorJeremy Fitzhardinge <jeremy@goop.org>2009-02-07 18:39:38 -0500
committerIngo Molnar <mingo@elte.hu>2009-02-09 07:33:51 -0500
commit1c14fa4937eb73509e07ac12bf8db1fdf4c42a59 (patch)
treed137f1587078f2909a2df48a5206ca1e9751f47f /arch/x86/kernel
parentd5b562330ec766292a3ac54ae5e0673610bd5b3d (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.c27
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 */
122char *__init __acpi_map_table(unsigned long phys, unsigned long size) 122char *__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