Author: nwhitehorn
Date: Fri Jan 16 18:47:20 2015
New Revision: 277257
URL: https://svnweb.freebsd.org/changeset/base/277257

Log:
  Add two fake properties ("fdtbootcpu" and "fdtmemreserv") to the device
  tree's /chosen node to provide out-of-band header fields of the FDT. This
  emulation is not perfect without corresponding changes to ofw_fdt_nextprop(),
  but is enough to enable lookup by memory-map-parsing code.
  
  MFC after:    1 week

Modified:
  head/sys/dev/ofw/ofw_fdt.c

Modified: head/sys/dev/ofw/ofw_fdt.c
==============================================================================
--- head/sys/dev/ofw/ofw_fdt.c  Fri Jan 16 18:42:49 2015        (r277256)
+++ head/sys/dev/ofw/ofw_fdt.c  Fri Jan 16 18:47:20 2015        (r277257)
@@ -231,6 +231,13 @@ ofw_fdt_getproplen(ofw_t ofw, phandle_t 
                return (len + 1);
        }
 
+       if (prop == NULL && offset == fdt_path_offset(fdtp, "/chosen")) {
+               if (strcmp(propname, "fdtbootcpu") == 0)
+                       return (sizeof(cell_t));
+               if (strcmp(propname, "fdtmemreserv") == 0)
+                       return (sizeof(uint64_t)*2*fdt_num_mem_rsv(fdtp));
+       }
+
        return (len);
 }
 
@@ -242,6 +249,7 @@ ofw_fdt_getprop(ofw_t ofw, phandle_t pac
        const void *prop;
        const char *name;
        int len, offset;
+       uint32_t cpuid;
 
        offset = fdt_phandle_offset(package);
        if (offset < 0)
@@ -258,6 +266,18 @@ ofw_fdt_getprop(ofw_t ofw, phandle_t pac
                return (len + 1);
        }
 
+       if (prop == NULL && offset == fdt_path_offset(fdtp, "/chosen")) {
+               if (strcmp(propname, "fdtbootcpu") == 0) {
+                       cpuid = cpu_to_fdt32(fdt_boot_cpuid_phys(fdtp));
+                       len = sizeof(cpuid);
+                       prop = &cpuid;
+               }
+               if (strcmp(propname, "fdtmemreserv") == 0) {
+                       prop = (char *)fdtp + fdt_off_mem_rsvmap(fdtp);
+                       len = sizeof(uint64_t)*2*fdt_num_mem_rsv(fdtp);
+               }
+       }
+
        if (prop == NULL)
                return (-1);
 
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to