Index: sys/mips/beri/beri_machdep.c
===================================================================
--- sys/mips/beri/beri_machdep.c (revision 27580328)
+++ sys/mips/beri/beri_machdep.c (working copy)
@@ -184,6 +184,8 @@
char **envp = (char **)a2;
long memsize;
#ifdef FDT
+ struct mem_region mr[FDT_MEM_REGIONS];
+ int mr_cnt, val;
char buf[2048]; /* early stack supposedly big enough */
vm_offset_t dtbp;
phandle_t chosen;
@@ -256,6 +258,13 @@
chosen = OF_finddevice("/chosen");
if (OF_getprop(chosen, "bootargs", buf, sizeof(buf)) != -1)
_parse_bootargs(buf);
+
+ /*
+ * Try to grab physical memory regions information from device tree.
+ * Override value provided by miniboot on success.
+ */
+ if (fdt_get_mem_regions(mr, &mr_cnt, &val) == 0)
+ memsize = val;
#endif
UPD
Index: sys/mips/beri/beri_machdep.c
===================================================================
--- sys/mips/beri/beri_machdep.c (revision 275803)
+++ sys/mips/beri/beri_machdep.c (working copy)
@@ -88,6 +88,11 @@
mips_init(void)
{
int i;
+#ifdef FDT
+ struct mem_region mr[FDT_MEM_REGIONS];
+ int mr_cnt, val;
+ int j;
+#endif
for (i = 0; i < 10; i++) {
phys_avail[i] = 0;
@@ -97102,6 +102,17 @@7,25 @@
phys_avail[0] = MIPS_KSEG0_TO_PHYS(kernel_kseg0_end);mem = realmem;
phys_avail[1] = ctob(realmem);
+#ifdef FDT
+ if (fdt_get_mem_regions(mr, &mr_cnt, &val) == 0) {
+ phys_avail[1] = mr[0].mr_size;
+
+ for (i = 1, j = 2; i < mr_cnt; i++, j+=2) {+ physmem = btoc(val);
+ phys_avail[j] = mr[i].mr_start;
+ phys_avail[j+1] = mr[i].mr_size;+ /* Limit size of the first region */
+ }+ phys_avail[1] = MIN(mr[0].mr_size, ctob(realmem));
+ }+ dump_avail[1] = phys_avail[1];
+#endif
+
dump_avail[0] = phys_avail[0];+ /* Add the rest of regions */
dump_avail[1] = phys_avail[1];+ for (i = 1, j = 2; i < mr_cnt; i++, j+=2) {
@@ -184,6 +200,8 @@+ phys_avail[j] = mr[i].mr_start;
char **envp = (char **)a2;+ phys_avail[j+1] = mr[i].mr_size;
long memsize;+ dump_avail[j] = phys_avail[j];
#ifdef FDT+ dump_avail[j+1] = phys_avail[j+1];
+ struct mem_region mr[FDT_MEM_REGIONS];+ }
+ int mr_cnt, val;+ }
char buf[2048]; /* early stack supposedly big enough */+#endif
vm_offset_t dtbp;+
phandle_t chosen;init_param1();
@@ -256,6 +274,13 @@
chosen = OF_finddevice("/chosen");init_param2(physmem);
if (OF_getprop(chosen, "bootargs", buf, sizeof(buf)) != -1)
_parse_bootargs(buf);
+
+ /*
+ * Try to grab physical memory regions information from device tree.
+ * Override value provided by miniboot on success.
+ */
+ if (fdt_get_mem_regions(mr, &mr_cnt, &val) == 0)
+ memsize = val;
#endif
/*mips_cpu_init();