summaryrefslogtreecommitdiffstats
path: root/sys/mips/beri
diff options
context:
space:
mode:
authorrwatson <rwatson@FreeBSD.org>2013-01-12 13:20:21 +0000
committerrwatson <rwatson@FreeBSD.org>2013-01-12 13:20:21 +0000
commit9a5b2389dd08fb6f5898d5a23036cc90f8834ec4 (patch)
tree4c80f9819d21ef7031e367258806bb6eaff2da46 /sys/mips/beri
parentfe7ea7248397d2413320ea7642c882300a53f2c3 (diff)
downloadFreeBSD-src-9a5b2389dd08fb6f5898d5a23036cc90f8834ec4.zip
FreeBSD-src-9a5b2389dd08fb6f5898d5a23036cc90f8834ec4.tar.gz
Merge Perforce change @219948 to head:
Add code so that the BERI boot process can ask the kernel linker for DTB blobs that may have been left for it by the boot loader, as done on PowerPC and ARM. This will require both a more mature boot loader, and more mature boot loader argument passing mechanism, than currently supported on BERI. Sponsored by: DARPA, AFRL
Diffstat (limited to 'sys/mips/beri')
-rw-r--r--sys/mips/beri/beri_machdep.c26
1 files changed, 24 insertions, 2 deletions
diff --git a/sys/mips/beri/beri_machdep.c b/sys/mips/beri/beri_machdep.c
index f3b52c1..98fcb85a 100644
--- a/sys/mips/beri/beri_machdep.c
+++ b/sys/mips/beri/beri_machdep.c
@@ -45,6 +45,7 @@ __FBSDID("$FreeBSD$");
#include <sys/cpu.h>
#include <sys/cons.h>
#include <sys/exec.h>
+#include <sys/linker.h>
#include <sys/ucontext.h>
#include <sys/proc.h>
#include <sys/kdb.h>
@@ -70,6 +71,7 @@ __FBSDID("$FreeBSD$");
#include <machine/cpuregs.h>
#include <machine/hwfunc.h>
#include <machine/md_var.h>
+#include <machine/metadata.h>
#include <machine/pmap.h>
#include <machine/trap.h>
@@ -135,6 +137,10 @@ platform_start(__register_t a0, __register_t a1, __register_t a2,
char **argv = (char **)a1;
char **envp = (char **)a2;
unsigned int memsize = a3;
+#ifdef FDT
+ vm_offset_t dtbp;
+ void *kmdp;
+#endif
int i;
/* clear the BSS and SBSS segments */
@@ -146,8 +152,24 @@ platform_start(__register_t a0, __register_t a1, __register_t a2,
mips_pcpu0_init();
#ifdef FDT
-#ifndef FDT_DTB_STATIC
-#error "mips_init with FDT requires FDT_DTB_STATIC"
+ /*
+ * Find the dtb passed in by the boot loader (currently fictional).
+ */
+ kmdp = preload_search_by_type("elf kernel");
+ if (kmdp != NULL)
+ dtbp = MD_FETCH(kmdp, MODINFOMD_DTBP, vm_offset_t);
+ else
+ dtbp = (vm_offset_t)NULL;
+
+#if defined(FDT_DTB_STATIC)
+ /*
+ * In case the device tree blob was not retrieved (from metadata) try
+ * to use the statically embedded one.
+ */
+ if (dtbp == (vm_offset_t)NULL)
+ dtbp = (vm_offset_t)&fdt_static_dtb;
+#else
+#error "Non-static FDT not yet supported on BERI"
#endif
if (OF_install(OFW_FDT, 0) == FALSE)
OpenPOWER on IntegriCloud