Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 16 Jan 2015 18:47:21 +0000 (UTC)
From:      Nathan Whitehorn <nwhitehorn@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r277257 - head/sys/dev/ofw
Message-ID:  <201501161847.t0GIlLrw021055@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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);
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201501161847.t0GIlLrw021055>