Commit b2dff6a8 authored by bibo,mao's avatar bibo,mao Committed by Andi Kleen

[PATCH] i386: Move find_max_pfn function to e820.c

Move more code from setup.c into e820.c
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarAndi Kleen <ak@suse.de>
parent 8e3342f7
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/mm.h> #include <linux/mm.h>
#include <linux/efi.h> #include <linux/efi.h>
#include <linux/pfn.h>
#include <asm/pgtable.h> #include <asm/pgtable.h>
#include <asm/page.h> #include <asm/page.h>
...@@ -539,3 +540,54 @@ int __init copy_e820_map(struct e820entry * biosmap, int nr_map) ...@@ -539,3 +540,54 @@ int __init copy_e820_map(struct e820entry * biosmap, int nr_map)
return 0; return 0;
} }
/*
* Callback for efi_memory_walk.
*/
static int __init
efi_find_max_pfn(unsigned long start, unsigned long end, void *arg)
{
unsigned long *max_pfn = arg, pfn;
if (start < end) {
pfn = PFN_UP(end -1);
if (pfn > *max_pfn)
*max_pfn = pfn;
}
return 0;
}
static int __init
efi_memory_present_wrapper(unsigned long start, unsigned long end, void *arg)
{
memory_present(0, PFN_UP(start), PFN_DOWN(end));
return 0;
}
/*
* Find the highest page frame number we have available
*/
void __init find_max_pfn(void)
{
int i;
max_pfn = 0;
if (efi_enabled) {
efi_memmap_walk(efi_find_max_pfn, &max_pfn);
efi_memmap_walk(efi_memory_present_wrapper, NULL);
return;
}
for (i = 0; i < e820.nr_map; i++) {
unsigned long start, end;
/* RAM? */
if (e820.map[i].type != E820_RAM)
continue;
start = PFN_UP(e820.map[i].addr);
end = PFN_DOWN(e820.map[i].addr + e820.map[i].size);
if (start >= end)
continue;
if (end > max_pfn)
max_pfn = end;
memory_present(0, start, end);
}
}
...@@ -63,9 +63,6 @@ ...@@ -63,9 +63,6 @@
#include <setup_arch.h> #include <setup_arch.h>
#include <bios_ebda.h> #include <bios_ebda.h>
/* Forward Declaration. */
void __init find_max_pfn(void);
/* This value is set up by the early boot code to point to the value /* This value is set up by the early boot code to point to the value
immediately after the boot time page tables. It contains a *physical* immediately after the boot time page tables. It contains a *physical*
address, and must not be in the .bss segment! */ address, and must not be in the .bss segment! */
...@@ -387,29 +384,6 @@ static int __init parse_reservetop(char *arg) ...@@ -387,29 +384,6 @@ static int __init parse_reservetop(char *arg)
} }
early_param("reservetop", parse_reservetop); early_param("reservetop", parse_reservetop);
/*
* Callback for efi_memory_walk.
*/
static int __init
efi_find_max_pfn(unsigned long start, unsigned long end, void *arg)
{
unsigned long *max_pfn = arg, pfn;
if (start < end) {
pfn = PFN_UP(end -1);
if (pfn > *max_pfn)
*max_pfn = pfn;
}
return 0;
}
static int __init
efi_memory_present_wrapper(unsigned long start, unsigned long end, void *arg)
{
memory_present(0, PFN_UP(start), PFN_DOWN(end));
return 0;
}
/* /*
* This function checks if the entire range <start,end> is mapped with type. * This function checks if the entire range <start,end> is mapped with type.
* *
...@@ -442,35 +416,6 @@ e820_all_mapped(unsigned long s, unsigned long e, unsigned type) ...@@ -442,35 +416,6 @@ e820_all_mapped(unsigned long s, unsigned long e, unsigned type)
return 0; return 0;
} }
/*
* Find the highest page frame number we have available
*/
void __init find_max_pfn(void)
{
int i;
max_pfn = 0;
if (efi_enabled) {
efi_memmap_walk(efi_find_max_pfn, &max_pfn);
efi_memmap_walk(efi_memory_present_wrapper, NULL);
return;
}
for (i = 0; i < e820.nr_map; i++) {
unsigned long start, end;
/* RAM? */
if (e820.map[i].type != E820_RAM)
continue;
start = PFN_UP(e820.map[i].addr);
end = PFN_DOWN(e820.map[i].addr + e820.map[i].size);
if (start >= end)
continue;
if (end > max_pfn)
max_pfn = end;
memory_present(0, start, end);
}
}
/* /*
* Determine low and high memory ranges: * Determine low and high memory ranges:
*/ */
......
...@@ -38,6 +38,7 @@ extern struct e820map e820; ...@@ -38,6 +38,7 @@ extern struct e820map e820;
extern int e820_all_mapped(unsigned long start, unsigned long end, extern int e820_all_mapped(unsigned long start, unsigned long end,
unsigned type); unsigned type);
extern void find_max_pfn(void);
#endif/*!__ASSEMBLY__*/ #endif/*!__ASSEMBLY__*/
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment