#include <mapmem.h>
#include <memalign.h>
#include <part.h>
+#include <fdt_support.h>
struct persistent_ram_buffer {
u32 sig;
{
char node[32];
int nodeoffset; /* node offset from libfdt */
+ u32 addr_cells;
+ u32 size_cells;
nodeoffset = fdt_path_offset(blob, "/");
if (nodeoffset < 0) {
return;
}
- nodeoffset = fdt_add_subnode(blob, nodeoffset, "reserved-memory");
+ nodeoffset = fdt_find_or_add_subnode(blob, nodeoffset, "reserved-memory");
if (nodeoffset < 0) {
log_err("Add 'reserved-memory' node failed: %s\n",
fdt_strerror(nodeoffset));
return;
}
- fdt_setprop_u32(blob, nodeoffset, "#address-cells", 2);
- fdt_setprop_u32(blob, nodeoffset, "#size-cells", 2);
+
+ addr_cells = fdt_getprop_u32_default_node(blob, nodeoffset, 0, "#address-cells", 2);
+ size_cells = fdt_getprop_u32_default_node(blob, nodeoffset, 0, "#size-cells", 2);
+ fdt_setprop_u32(blob, nodeoffset, "#address-cells", addr_cells);
+ fdt_setprop_u32(blob, nodeoffset, "#size-cells", size_cells);
+
fdt_setprop_empty(blob, nodeoffset, "ranges");
sprintf(node, "ramoops@%llx", (unsigned long long)pstore_addr);
log_err("Add '%s' node failed: %s\n", node, fdt_strerror(nodeoffset));
return;
}
+
fdt_setprop_string(blob, nodeoffset, "compatible", "ramoops");
- fdt_setprop_u64(blob, nodeoffset, "reg", pstore_addr);
- fdt_appendprop_u64(blob, nodeoffset, "reg", pstore_length);
+
+ if (addr_cells == 1) {
+ fdt_setprop_u32(blob, nodeoffset, "reg", pstore_addr);
+ } else if (addr_cells == 2) {
+ fdt_setprop_u64(blob, nodeoffset, "reg", pstore_addr);
+ } else {
+ log_err("Unsupported #address-cells: %u\n", addr_cells);
+ goto clean_ramoops;
+ }
+
+ if (size_cells == 1) {
+ // Let's consider that the pstore_length fits in a 32 bits value
+ fdt_appendprop_u32(blob, nodeoffset, "reg", pstore_length);
+ } else if (size_cells == 2) {
+ fdt_appendprop_u64(blob, nodeoffset, "reg", pstore_length);
+ } else {
+ log_err("Unsupported #size-cells: %u\n", addr_cells);
+ goto clean_ramoops;
+ }
+
fdt_setprop_u32(blob, nodeoffset, "record-size", pstore_record_size);
fdt_setprop_u32(blob, nodeoffset, "console-size", pstore_console_size);
fdt_setprop_u32(blob, nodeoffset, "ftrace-size", pstore_ftrace_size);
fdt_setprop_u32(blob, nodeoffset, "pmsg-size", pstore_pmsg_size);
fdt_setprop_u32(blob, nodeoffset, "ecc-size", pstore_ecc_size);
+
+clean_ramoops:
+ fdt_del_node_and_alias(blob, node);
}
U_BOOT_CMD(pstore, 10, 0, do_pstore,