Author: rwatson
Date: Sat Jan 12 13:20:21 2013
New Revision: 245330
URL: http://svnweb.freebsd.org/changeset/base/245330

Log:
  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

Modified:
  head/sys/mips/beri/beri_machdep.c
  head/sys/mips/include/metadata.h

Modified: head/sys/mips/beri/beri_machdep.c
==============================================================================
--- head/sys/mips/beri/beri_machdep.c   Sat Jan 12 12:34:59 2013        
(r245329)
+++ head/sys/mips/beri/beri_machdep.c   Sat Jan 12 13:20:21 2013        
(r245330)
@@ -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, __regist
        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, __regist
        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)

Modified: head/sys/mips/include/metadata.h
==============================================================================
--- head/sys/mips/include/metadata.h    Sat Jan 12 12:34:59 2013        
(r245329)
+++ head/sys/mips/include/metadata.h    Sat Jan 12 13:20:21 2013        
(r245330)
@@ -30,5 +30,6 @@
 #define        _MACHINE_METADATA_H_
 
 #define        MODINFOMD_SMAP          0x1001
+#define        MODINFOMD_DTBP  0x1002
 
 #endif /* !_MACHINE_METADATA_H_ */
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to