From ac52cba63f26eab9c74f3d1c2da00835724d3484 Mon Sep 17 00:00:00 2001 From: Detlev Casanova Date: Mon, 7 Feb 2022 11:02:30 -0500 Subject: [PATCH] pstore: Support already existing reserved-memory node The pstore command tries to create a reserved-memory node but fails if it is already present with: Add 'reserved-memory' node failed: FDT_ERR_EXISTS This patch creates the node only if it does not exist and adapts the reg values sizes depending on already present #address-cells and #size-cells values. Signed-off-by: Detlev Casanova --- cmd/pstore.c | 39 ++++++++++++++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/cmd/pstore.c b/cmd/pstore.c index 9fac8c7218..cd6f6feb2f 100644 --- a/cmd/pstore.c +++ b/cmd/pstore.c @@ -11,6 +11,7 @@ #include #include #include +#include struct persistent_ram_buffer { u32 sig; @@ -485,6 +486,8 @@ void fdt_fixup_pstore(void *blob) { char node[32]; int nodeoffset; /* node offset from libfdt */ + u32 addr_cells; + u32 size_cells; nodeoffset = fdt_path_offset(blob, "/"); if (nodeoffset < 0) { @@ -493,14 +496,18 @@ void fdt_fixup_pstore(void *blob) 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); @@ -509,14 +516,36 @@ void fdt_fixup_pstore(void *blob) 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, -- 2.39.5