diff options
author | Andi Kleen <ak@suse.de> | 2006-03-25 10:30:22 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-03-25 12:10:55 -0500 |
commit | f2d3efedbecc04dc348d723e4c90b46731b3bb48 (patch) | |
tree | 982c7838a97a5c2420de392e5a36f49eaa1778b0 /arch/x86_64/mm/init.c | |
parent | f083a329e63d471a5e9238e837772b1b76c218db (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.c | 27 |
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 | |||
228 | static void __meminit | 255 | static void __meminit |
229 | phys_pmd_init(pmd_t *pmd, unsigned long address, unsigned long end) | 256 | phys_pmd_init(pmd_t *pmd, unsigned long address, unsigned long end) |
230 | { | 257 | { |