svn commit: r276513 - user/nwhitehorn/kboot/powerpc/kboot
Nathan Whitehorn
nwhitehorn at FreeBSD.org
Thu Jan 1 22:18:28 UTC 2015
Author: nwhitehorn
Date: Thu Jan 1 22:18:27 2015
New Revision: 276513
URL: https://svnweb.freebsd.org/changeset/base/276513
Log:
Add some fixups for what you get out of /proc/device-tree, which is not
*quite* a transcription of the FDT as far as phandles are concerned.
Modified:
user/nwhitehorn/kboot/powerpc/kboot/kbootfdt.c
Modified: user/nwhitehorn/kboot/powerpc/kboot/kbootfdt.c
==============================================================================
--- user/nwhitehorn/kboot/powerpc/kboot/kbootfdt.c Thu Jan 1 20:53:38 2015 (r276512)
+++ user/nwhitehorn/kboot/powerpc/kboot/kbootfdt.c Thu Jan 1 22:18:27 2015 (r276513)
@@ -96,19 +96,62 @@ add_node_to_fdt(void *buffer, const char
host_close(fd);
}
+/* Fix up wrong values added to the device tree by prom_init() in Linux */
+
+static void
+fdt_linux_fixups(void *fdtp)
+{
+ int offset, len;
+ const void *prop;
+
+ /*
+ * Remove /memory/available properties, which reflect long-gone OF
+ * state
+ */
+
+ offset = fdt_path_offset(fdtp, "/memory at 0");
+ if (offset > 0) {
+ fdt_delprop(fdtp, offset, "available");
+ /*
+ * XXX: add real available properties to reflect RTAS, etc.
+ * reservations?
+ */
+ }
+
+ /*
+ * Patch up /chosen nodes so that the stored handles mean something,
+ * where possible.
+ */
+ offset = fdt_path_offset(fdtp, "/chosen");
+ if (offset > 0) {
+ fdt_delprop(fdtp, offset, "cpu"); /* This node not meaningful */
+
+ offset = fdt_path_offset(fdtp, "/chosen");
+ prop = fdt_getprop(fdtp, offset, "linux,stdout-package", &len);
+ if (prop != NULL) {
+ fdt_setprop(fdtp, offset, "stdout", prop, len);
+ offset = fdt_path_offset(fdtp, "/chosen");
+ fdt_setprop(fdtp, offset, "stdin", prop, len);
+ }
+ }
+}
+
int
fdt_platform_load_dtb(void)
{
void *buffer;
size_t buflen = 409600;
- char path[255] = "/proc/device-tree";
buffer = malloc(buflen);
fdt_create_empty_tree(buffer, buflen);
- add_node_to_fdt(buffer, path, fdt_path_offset(buffer, "/"));
+ add_node_to_fdt(buffer, "/proc/device-tree",
+ fdt_path_offset(buffer, "/"));
+ fdt_linux_fixups(buffer);
+
fdt_pack(buffer);
fdt_load_dtb_addr(buffer);
+ free(buffer);
return (0);
}
More information about the svn-src-user
mailing list