[PATCH] of: WARN on using default root node #address-cells/#size-cells
From: Rob Herring (Arm)
Date: Thu May 30 2024 - 14:51:06 EST
While OpenFirmware originally allowed default values of #address-cells
and #size-cells, FDT has long required explicit values. It's been a
warning in dtc for the root node since the beginning (2005) and for
any parent node since 2007. Of course, not all FDT uses dtc, but that
should be the majority by far. The various extracted OF devicetrees I
have dating back to the 1990s (various PowerMac, OLPC, PASemi Nemo)
all have explicit root node properties.
I have no idea what exists for Sparc, so disabling the warning for it.
If any other platforms hit the warning, then the warning can be
disabled for them.
Signed-off-by: Rob Herring (Arm) <robh@xxxxxxxxxx>
---
Sparc folks, If anyone can dump DTs from some Sparc systems it would be
helpful.
---
drivers/of/base.c | 2 ++
drivers/of/fdt.c | 2 ++
2 files changed, 4 insertions(+)
diff --git a/drivers/of/base.c b/drivers/of/base.c
index 61fff13bbee5..6930aa29fec1 100644
--- a/drivers/of/base.c
+++ b/drivers/of/base.c
@@ -96,6 +96,7 @@ int of_bus_n_addr_cells(struct device_node *np)
return cells;
/* No #address-cells property for the root node */
+ WARN_ONCE(!IS_ENABLED(CONFIG_SPARC), "Only listed platforms should rely on default '#address-cells'\n");
return OF_ROOT_NODE_ADDR_CELLS_DEFAULT;
}
@@ -116,6 +117,7 @@ int of_bus_n_size_cells(struct device_node *np)
return cells;
/* No #size-cells property for the root node */
+ WARN_ONCE(!IS_ENABLED(CONFIG_SPARC), "Only listed platforms should rely on default '#size-cells'\n");
return OF_ROOT_NODE_SIZE_CELLS_DEFAULT;
}
diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c
index a8a04f27915b..568a3fca4c27 100644
--- a/drivers/of/fdt.c
+++ b/drivers/of/fdt.c
@@ -961,11 +961,13 @@ int __init early_init_dt_scan_root(void)
prop = of_get_flat_dt_prop(node, "#size-cells", NULL);
if (prop)
dt_root_size_cells = be32_to_cpup(prop);
+ WARN(!prop, "No '#size-cells' in root node\n");
pr_debug("dt_root_size_cells = %x\n", dt_root_size_cells);
prop = of_get_flat_dt_prop(node, "#address-cells", NULL);
if (prop)
dt_root_addr_cells = be32_to_cpup(prop);
+ WARN(!prop, "No '#address-cells' in root node\n");
pr_debug("dt_root_addr_cells = %x\n", dt_root_addr_cells);
return 0;
--
2.43.0