diff --git a/common/fdt_fixup.c b/common/fdt_fixup.c index 0ae0050..8843404 100644 --- a/common/fdt_fixup.c +++ b/common/fdt_fixup.c @@ -9,6 +9,9 @@ * payloads like BL32 and BL33 (and further down the boot chain). * This allows to easily add PSCI nodes, when the original DT does not have * it or advertises another method. + * Also it supports to add reserved memory nodes to describe memory that + * is used by the secure world, so that non-secure software avoids using + * that. */ #include @@ -124,3 +127,30 @@ return ret; } + +#define HIGH_BITS(x) ((sizeof(x) > 4) ? ((x) >> 32) : (typeof(x))0) + +int fdt_add_reserved_memory(void *dtb, const char *node_name, + uintptr_t base, size_t size) +{ + int offs = fdt_path_offset(dtb, "/reserved-memory"); + uint32_t addresses[3]; + + if (offs < 0) { /* create if not existing yet */ + offs = fdt_add_subnode(dtb, 0, "reserved-memory"); + if (offs < 0) + return offs; + fdt_setprop_u32(dtb, offs, "#address-cells", 2); + fdt_setprop_u32(dtb, offs, "#size-cells", 1); + fdt_setprop(dtb, offs, "ranges", NULL, 0); + } + + addresses[0] = cpu_to_fdt32(HIGH_BITS(base)); + addresses[1] = cpu_to_fdt32(base & 0xffffffff); + addresses[2] = cpu_to_fdt32(size & 0xffffffff); + offs = fdt_add_subnode(dtb, offs, node_name); + fdt_setprop(dtb, offs, "no-map", NULL, 0); + fdt_setprop(dtb, offs, "reg", addresses, 12); + + return 0; +} diff --git a/include/common/fdt_fixup.h b/include/common/fdt_fixup.h index bb05bf5..0248de9 100644 --- a/include/common/fdt_fixup.h +++ b/include/common/fdt_fixup.h @@ -9,5 +9,7 @@ int dt_add_psci_node(void *fdt); int dt_add_psci_cpu_enable_methods(void *fdt); +int fdt_add_reserved_memory(void *dtb, const char *node_name, + uintptr_t base, size_t size); #endif /* FDT_FIXUP_H */