aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86_64/mm/init.c
diff options
context:
space:
mode:
authorAndi Kleen <ak@suse.de>2006-03-25 10:30:22 -0500
committerLinus Torvalds <torvalds@g5.osdl.org>2006-03-25 12:10:55 -0500
commitf2d3efedbecc04dc348d723e4c90b46731b3bb48 (patch)
tree982c7838a97a5c2420de392e5a36f49eaa1778b0 /arch/x86_64/mm/init.c
parentf083a329e63d471a5e9238e837772b1b76c218db (diff)
[PATCH] x86_64: Implement early DMI scanning
There are more and more cases where we need to know DMI information early to work around bugs. i386 already had early DMI scanning, but x86-64 didn't. Implement this now. This required some cleanup in the i386 code. Signed-off-by: Andi Kleen <ak@suse.de> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'arch/x86_64/mm/init.c')
-rw-r--r--arch/x86_64/mm/init.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/arch/x86_64/mm/init.c b/arch/x86_64/mm/init.c
index 675a45691338..54c7f5975b44 100644
--- a/arch/x86_64/mm/init.c
+++ b/arch/x86_64/mm/init.c
@@ -225,6 +225,33 @@ static __meminit void unmap_low_page(int i)
225 ti->allocated = 0; 225 ti->allocated = 0;
226} 226}
227 227
228/* Must run before zap_low_mappings */
229__init void *early_ioremap(unsigned long addr, unsigned long size)
230{
231 unsigned long map = round_down(addr, LARGE_PAGE_SIZE);
232
233 /* actually usually some more */
234 if (size >= LARGE_PAGE_SIZE) {
235 printk("SMBIOS area too long %lu\n", size);
236 return NULL;
237 }
238 set_pmd(temp_mappings[0].pmd, __pmd(map | _KERNPG_TABLE | _PAGE_PSE));
239 map += LARGE_PAGE_SIZE;
240 set_pmd(temp_mappings[1].pmd, __pmd(map | _KERNPG_TABLE | _PAGE_PSE));
241 __flush_tlb();
242 return temp_mappings[0].address + (addr & (LARGE_PAGE_SIZE-1));
243}
244
245/* To avoid virtual aliases later */
246__init void early_iounmap(void *addr, unsigned long size)
247{
248 if ((void *)round_down((unsigned long)addr, LARGE_PAGE_SIZE) != temp_mappings[0].address)
249 printk("early_iounmap: bad address %p\n", addr);
250 set_pmd(temp_mappings[0].pmd, __pmd(0));
251 set_pmd(temp_mappings[1].pmd, __pmd(0));
252 __flush_tlb();
253}
254
228static void __meminit 255static void __meminit
229phys_pmd_init(pmd_t *pmd, unsigned long address, unsigned long end) 256phys_pmd_init(pmd_t *pmd, unsigned long address, unsigned long end)
230{ 257{