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 <detlev.casanova@collabora.com>
This commit is contained in:
parent
162c22bfbc
commit
ac52cba63f
39
cmd/pstore.c
39
cmd/pstore.c
@ -11,6 +11,7 @@
|
|||||||
#include <mapmem.h>
|
#include <mapmem.h>
|
||||||
#include <memalign.h>
|
#include <memalign.h>
|
||||||
#include <part.h>
|
#include <part.h>
|
||||||
|
#include <fdt_support.h>
|
||||||
|
|
||||||
struct persistent_ram_buffer {
|
struct persistent_ram_buffer {
|
||||||
u32 sig;
|
u32 sig;
|
||||||
@ -485,6 +486,8 @@ void fdt_fixup_pstore(void *blob)
|
|||||||
{
|
{
|
||||||
char node[32];
|
char node[32];
|
||||||
int nodeoffset; /* node offset from libfdt */
|
int nodeoffset; /* node offset from libfdt */
|
||||||
|
u32 addr_cells;
|
||||||
|
u32 size_cells;
|
||||||
|
|
||||||
nodeoffset = fdt_path_offset(blob, "/");
|
nodeoffset = fdt_path_offset(blob, "/");
|
||||||
if (nodeoffset < 0) {
|
if (nodeoffset < 0) {
|
||||||
@ -493,14 +496,18 @@ void fdt_fixup_pstore(void *blob)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
nodeoffset = fdt_add_subnode(blob, nodeoffset, "reserved-memory");
|
nodeoffset = fdt_find_or_add_subnode(blob, nodeoffset, "reserved-memory");
|
||||||
if (nodeoffset < 0) {
|
if (nodeoffset < 0) {
|
||||||
log_err("Add 'reserved-memory' node failed: %s\n",
|
log_err("Add 'reserved-memory' node failed: %s\n",
|
||||||
fdt_strerror(nodeoffset));
|
fdt_strerror(nodeoffset));
|
||||||
return;
|
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");
|
fdt_setprop_empty(blob, nodeoffset, "ranges");
|
||||||
|
|
||||||
sprintf(node, "ramoops@%llx", (unsigned long long)pstore_addr);
|
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));
|
log_err("Add '%s' node failed: %s\n", node, fdt_strerror(nodeoffset));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
fdt_setprop_string(blob, nodeoffset, "compatible", "ramoops");
|
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, "record-size", pstore_record_size);
|
||||||
fdt_setprop_u32(blob, nodeoffset, "console-size", pstore_console_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, "ftrace-size", pstore_ftrace_size);
|
||||||
fdt_setprop_u32(blob, nodeoffset, "pmsg-size", pstore_pmsg_size);
|
fdt_setprop_u32(blob, nodeoffset, "pmsg-size", pstore_pmsg_size);
|
||||||
fdt_setprop_u32(blob, nodeoffset, "ecc-size", pstore_ecc_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,
|
U_BOOT_CMD(pstore, 10, 0, do_pstore,
|
||||||
|
Loading…
Reference in New Issue
Block a user