summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornwhitehorn <nwhitehorn@FreeBSD.org>2015-01-31 19:18:09 +0000
committernwhitehorn <nwhitehorn@FreeBSD.org>2015-01-31 19:18:09 +0000
commit92c5395dfebe86676461d4e940ccf2b4249770e5 (patch)
tree8bdcb32fae84d317003693841587fa8dff2f99e1
parent15fa652898c1e2b569d06147c990f23df264a934 (diff)
downloadFreeBSD-src-92c5395dfebe86676461d4e940ccf2b4249770e5.zip
FreeBSD-src-92c5395dfebe86676461d4e940ccf2b4249770e5.tar.gz
Add FDT reservations for memory areas used by OPAL or RTAS runtime firmware.
This allows a kexec'ed kernel to boot multiuser under PHYP.
-rw-r--r--sys/boot/powerpc/kboot/kbootfdt.c30
1 files changed, 25 insertions, 5 deletions
diff --git a/sys/boot/powerpc/kboot/kbootfdt.c b/sys/boot/powerpc/kboot/kbootfdt.c
index 2c10d52..5ab3c3d 100644
--- a/sys/boot/powerpc/kboot/kbootfdt.c
+++ b/sys/boot/powerpc/kboot/kbootfdt.c
@@ -110,12 +110,32 @@ fdt_linux_fixups(void *fdtp)
*/
offset = fdt_path_offset(fdtp, "/memory@0");
- if (offset > 0) {
+ if (offset > 0)
fdt_delprop(fdtp, offset, "available");
- /*
- * XXX: add real available properties to reflect RTAS, etc.
- * reservations?
- */
+
+ /*
+ * Add reservations for OPAL and RTAS state if present
+ */
+
+ offset = fdt_path_offset(fdtp, "/ibm,opal");
+ if (offset > 0) {
+ uint64_t *base, *size;
+ base = fdt_getprop(fdtp, offset, "opal-base-address",
+ &len);
+ size = fdt_getprop(fdtp, offset, "opal-runtime-size",
+ &len);
+ if (base != NULL && size != NULL)
+ fdt_add_mem_rsv(fdtp, fdt64_to_cpu(*base),
+ fdt64_to_cpu(*size));
+ }
+ offset = fdt_path_offset(fdtp, "/rtas");
+ if (offset > 0) {
+ uint32_t *base, *size;
+ base = fdt_getprop(fdtp, offset, "linux,rtas-base", &len);
+ size = fdt_getprop(fdtp, offset, "rtas-size", &len);
+ if (base != NULL && size != NULL)
+ fdt_add_mem_rsv(fdtp, fdt32_to_cpu(*base),
+ fdt32_to_cpu(*size));
}
/*
OpenPOWER on IntegriCloud