Add fdt init for octeon.
authorvisa <visa@openbsd.org>
Fri, 1 Jul 2016 15:12:37 +0000 (15:12 +0000)
committervisa <visa@openbsd.org>
Fri, 1 Jul 2016 15:12:37 +0000 (15:12 +0000)
sys/arch/octeon/conf/files.octeon
sys/arch/octeon/include/octeonvar.h
sys/arch/octeon/octeon/machdep.c

index 08a67b2..093da55 100644 (file)
@@ -1,4 +1,4 @@
-#      $OpenBSD: files.octeon,v 1.29 2016/03/18 05:38:10 jmatthew Exp $
+#      $OpenBSD: files.octeon,v 1.30 2016/07/01 15:12:37 visa Exp $
 
 # Standard stanzas config(8) can't run without
 maxpartitions 16
@@ -13,6 +13,7 @@ major { octcf = 15 }
 major  { amdcf = 19 }
 
 file   dev/cninit.c
+file   dev/ofw/fdt.c
 file   arch/octeon/octeon/autoconf.c
 file   arch/octeon/octeon/bus_dma.c
 file   arch/octeon/octeon/conf.c
index 60c9474..02cee40 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: octeonvar.h,v 1.28 2016/06/22 13:09:35 visa Exp $     */
+/*     $OpenBSD: octeonvar.h,v 1.29 2016/07/01 15:12:37 visa Exp $     */
 /*     $NetBSD: maltavar.h,v 1.3 2002/03/18 10:10:16 simonb Exp $      */
 
 /*-
@@ -260,6 +260,8 @@ struct boot_info {
        uint64_t led_display_addr;
        uint32_t dfaclock;
        uint32_t config_flags;
+       /* The fields below are available when ver_minor >= 3. */
+       uint64_t fdt_addr;
 };
 
 struct octeon_bootmem_desc {
index 5872fe5..f323024 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: machdep.c,v 1.73 2016/03/21 14:20:57 visa Exp $ */
+/*     $OpenBSD: machdep.c,v 1.74 2016/07/01 15:12:37 visa Exp $ */
 
 /*
  * Copyright (c) 2009, 2010 Miodrag Vallat.
@@ -78,6 +78,7 @@
 #include <machine/memconf.h>
 
 #include <dev/cons.h>
+#include <dev/ofw/fdt.h>
 
 #include <octeon/dev/cn30xxipdreg.h>
 #include <octeon/dev/iobusvar.h>
@@ -98,6 +99,8 @@ vm_map_t phys_map;
 struct boot_desc *octeon_boot_desc;
 struct boot_info *octeon_boot_info;
 
+void *octeon_fdt;
+
 char uboot_rootdev[OCTEON_ARGV_MAX];
 
 /*
@@ -355,6 +358,24 @@ mips_init(__register_t a0, __register_t a1, __register_t a2 __unused,
 
        process_bootargs();
 
+       /*
+        * Save the FDT and let the system use it.
+        */
+       if (octeon_boot_info->ver_minor >= 3 &&
+           octeon_boot_info->fdt_addr != 0) {
+               void *fdt;
+               size_t fdt_size;
+
+               fdt = (void *)PHYS_TO_XKPHYS(octeon_boot_info->fdt_addr,
+                   CCA_CACHED);
+               if (fdt_init(fdt) != 0 && (fdt_size = fdt_get_size(fdt)) != 0) {
+                       octeon_fdt = (void *)pmap_steal_memory(fdt_size, NULL,
+                           NULL);
+                       memcpy(octeon_fdt, fdt, fdt_size);
+                       fdt_init(octeon_fdt);
+               }
+       }
+
        /*
         * Get a console, very early but after initial mapping setup.
         */
@@ -407,6 +428,8 @@ mips_init(__register_t a0, __register_t a1, __register_t a2 __unused,
        DUMP_BOOT_INFO(led_display_addr, %#llx);
        DUMP_BOOT_INFO(dfaclock, %d);
        DUMP_BOOT_INFO(config_flags, %#x);
+       if (octeon_boot_info->ver_minor >= 3)
+               DUMP_BOOT_INFO(fdt_addr, %#llx);
 #endif
 
        /*