aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86
diff options
context:
space:
mode:
authorJeremy Fitzhardinge <jeremy@goop.org>2008-06-25 00:19:03 -0400
committerIngo Molnar <mingo@elte.hu>2008-07-08 07:10:28 -0400
commit4583ed514ea9ac844a6eb02d33120beaedf6837f (patch)
tree9df2d1e1a5d1726303f761954593defc483e2d20 /arch/x86
parentbb23e403e5162765dabe3dc78646724753d6359b (diff)
x86, 64-bit: unify early_ioremap
The 32-bit early_ioremap will work equally well for 64-bit, so just use it. Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com> Cc: xen-devel <xen-devel@lists.xensource.com> Cc: Stephen Tweedie <sct@redhat.com> Cc: Eduardo Habkost <ehabkost@redhat.com> Cc: Mark McLoughlin <markmc@redhat.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'arch/x86')
-rw-r--r--arch/x86/mm/init_64.c52
-rw-r--r--arch/x86/mm/ioremap.c5
2 files changed, 1 insertions, 56 deletions
diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c
index bfea7605eaab..9b6049133a82 100644
--- a/arch/x86/mm/init_64.c
+++ b/arch/x86/mm/init_64.c
@@ -257,58 +257,6 @@ static __meminit void unmap_low_page(void *adr)
257 early_iounmap(adr, PAGE_SIZE); 257 early_iounmap(adr, PAGE_SIZE);
258} 258}
259 259
260/* Must run before zap_low_mappings */
261__meminit void *early_ioremap(unsigned long addr, unsigned long size)
262{
263 pmd_t *pmd, *last_pmd;
264 unsigned long vaddr;
265 int i, pmds;
266
267 pmds = ((addr & ~PMD_MASK) + size + ~PMD_MASK) / PMD_SIZE;
268 vaddr = __START_KERNEL_map;
269 pmd = level2_kernel_pgt;
270 last_pmd = level2_kernel_pgt + PTRS_PER_PMD - 1;
271
272 for (; pmd <= last_pmd; pmd++, vaddr += PMD_SIZE) {
273 for (i = 0; i < pmds; i++) {
274 if (pmd_present(pmd[i]))
275 goto continue_outer_loop;
276 }
277 vaddr += addr & ~PMD_MASK;
278 addr &= PMD_MASK;
279
280 for (i = 0; i < pmds; i++, addr += PMD_SIZE)
281 set_pmd(pmd+i, __pmd(addr | __PAGE_KERNEL_LARGE_EXEC));
282 __flush_tlb_all();
283
284 return (void *)vaddr;
285continue_outer_loop:
286 ;
287 }
288 printk(KERN_ERR "early_ioremap(0x%lx, %lu) failed\n", addr, size);
289
290 return NULL;
291}
292
293/*
294 * To avoid virtual aliases later:
295 */
296__meminit void early_iounmap(void *addr, unsigned long size)
297{
298 unsigned long vaddr;
299 pmd_t *pmd;
300 int i, pmds;
301
302 vaddr = (unsigned long)addr;
303 pmds = ((vaddr & ~PMD_MASK) + size + ~PMD_MASK) / PMD_SIZE;
304 pmd = level2_kernel_pgt + pmd_index(vaddr);
305
306 for (i = 0; i < pmds; i++)
307 pmd_clear(pmd + i);
308
309 __flush_tlb_all();
310}
311
312static unsigned long __meminit 260static unsigned long __meminit
313phys_pmd_init(pmd_t *pmd_page, unsigned long address, unsigned long end) 261phys_pmd_init(pmd_t *pmd_page, unsigned long address, unsigned long end)
314{ 262{
diff --git a/arch/x86/mm/ioremap.c b/arch/x86/mm/ioremap.c
index 0561fde56a51..092b3d72498c 100644
--- a/arch/x86/mm/ioremap.c
+++ b/arch/x86/mm/ioremap.c
@@ -381,8 +381,6 @@ void unxlate_dev_mem_ptr(unsigned long phys, void *addr)
381 return; 381 return;
382} 382}
383 383
384#ifdef CONFIG_X86_32
385
386int __initdata early_ioremap_debug; 384int __initdata early_ioremap_debug;
387 385
388static int __init early_ioremap_debug_setup(char *str) 386static int __init early_ioremap_debug_setup(char *str)
@@ -483,6 +481,7 @@ static void __init __early_set_fixmap(enum fixed_addresses idx,
483 return; 481 return;
484 } 482 }
485 pte = early_ioremap_pte(addr); 483 pte = early_ioremap_pte(addr);
484
486 if (pgprot_val(flags)) 485 if (pgprot_val(flags))
487 set_pte(pte, pfn_pte(phys >> PAGE_SHIFT, flags)); 486 set_pte(pte, pfn_pte(phys >> PAGE_SHIFT, flags));
488 else 487 else
@@ -624,5 +623,3 @@ void __this_fixmap_does_not_exist(void)
624{ 623{
625 WARN_ON(1); 624 WARN_ON(1);
626} 625}
627
628#endif /* CONFIG_X86_32 */