
On 8/26/23 14:16, Andrey Skvortsov wrote:
u-boot adds reserve-memory node, if it's missing, with following properties:
reserved-memory { #address-cells = <2>; #size-cells = <2>;
This defines the size of cells for the children of reserved-memory and and for the ranges property. If you set the cell sizes to 1 you can no longer encode 64 bit addresses.
ranges; }
But with these default address-cells and size-cells values, pstore isn't working on A64. Root node for A64 defines 'address-cells' and 'size-cells' as 1. dtc complains if reserved-memory has different address-cells and size-cells.
Warning (ranges_format): /reserved-memory:ranges: empty "ranges" property but its #address-cells (2) differs from / (1)
I cannot find any such requirement in the Devicetree Specification 1.4. Is this a dtc bug?
This patch takes into account address-cells and size-cells of the root node and uses them as values for new reserved-memory node.
Reservations may be above 4 GiB. How does your patch consider this?
Best regards
Heinrich
Signed-off-by: Andrey Skvortsov andrej.skvortzov@gmail.com
cmd/pstore.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/cmd/pstore.c b/cmd/pstore.c index cd6f6feb2f..9795eea2db 100644 --- a/cmd/pstore.c +++ b/cmd/pstore.c @@ -486,6 +486,8 @@ void fdt_fixup_pstore(void *blob) { char node[32]; int nodeoffset; /* node offset from libfdt */
- u32 addr_cells_root;
- u32 size_cells_root; u32 addr_cells; u32 size_cells;
@@ -495,6 +497,8 @@ void fdt_fixup_pstore(void *blob) log_err("fdt_path_offset() returned %s\n", fdt_strerror(nodeoffset)); return; }
addr_cells_root = fdt_getprop_u32_default_node(blob, nodeoffset, 0, "#address-cells", 2);
size_cells_root = fdt_getprop_u32_default_node(blob, nodeoffset, 0, "#size-cells", 2);
nodeoffset = fdt_find_or_add_subnode(blob, nodeoffset, "reserved-memory"); if (nodeoffset < 0) {
@@ -503,8 +507,10 @@ void fdt_fixup_pstore(void *blob) return; }
- 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);
- addr_cells = fdt_getprop_u32_default_node(blob, nodeoffset, 0,
"#address-cells", addr_cells_root);
- size_cells = fdt_getprop_u32_default_node(blob, nodeoffset, 0,
fdt_setprop_u32(blob, nodeoffset, "#address-cells", addr_cells); fdt_setprop_u32(blob, nodeoffset, "#size-cells", size_cells);"#size-cells", size_cells_root);