Commit a94a172d authored by David S. Miller's avatar David S. Miller

sparc64: Work around memory probing bug in openfirmware.

Read all of the OF memory and translation tables, then read
the physical available memory list twice.

When making these requests, OF can allocate more memory to
do it's job, which can remove pages from the available
memory list.

So fetch in all of the tables at once, and fetch the available
list last to make sure we read a stable value.
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 8bf3028e
...@@ -610,8 +610,6 @@ static void __init remap_kernel(void) ...@@ -610,8 +610,6 @@ static void __init remap_kernel(void)
static void __init inherit_prom_mappings(void) static void __init inherit_prom_mappings(void)
{ {
read_obp_translations();
/* Now fixup OBP's idea about where we really are mapped. */ /* Now fixup OBP's idea about where we really are mapped. */
printk("Remapping the kernel... "); printk("Remapping the kernel... ");
remap_kernel(); remap_kernel();
...@@ -1747,7 +1745,17 @@ void __init paging_init(void) ...@@ -1747,7 +1745,17 @@ void __init paging_init(void)
lmb_init(); lmb_init();
/* Find available physical memory... */ /* Find available physical memory...
*
* Read it twice in order to work around a bug in openfirmware.
* The call to grab this table itself can cause openfirmware to
* allocate memory, which in turn can take away some space from
* the list of available memory. Reading it twice makes sure
* we really do get the final value.
*/
read_obp_translations();
read_obp_memory("reg", &pall[0], &pall_ents);
read_obp_memory("available", &pavail[0], &pavail_ents);
read_obp_memory("available", &pavail[0], &pavail_ents); read_obp_memory("available", &pavail[0], &pavail_ents);
phys_base = 0xffffffffffffffffUL; phys_base = 0xffffffffffffffffUL;
...@@ -1788,8 +1796,6 @@ void __init paging_init(void) ...@@ -1788,8 +1796,6 @@ void __init paging_init(void)
inherit_prom_mappings(); inherit_prom_mappings();
read_obp_memory("reg", &pall[0], &pall_ents);
init_kpte_bitmap(); init_kpte_bitmap();
/* Ok, we can use our TLB miss and window trap handlers safely. */ /* Ok, we can use our TLB miss and window trap handlers safely. */
......
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