Skip to content

Commit

Permalink
of: WARN on deprecated #address-cells/#size-cells handling
Browse files Browse the repository at this point in the history
While OpenFirmware originally allowed walking parent nodes and default
root values for #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. The
warning is disabled for Sparc as there are known systems relying on
default root node values.

Link: https://lore.kernel.org/r/20241106171028.3830266-1-robh@kernel.org
Signed-off-by: Rob Herring (Arm) <robh@kernel.org>
  • Loading branch information
Rob Herring (Arm) committed Nov 8, 2024
1 parent 67759cf commit 045b14c
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 8 deletions.
28 changes: 22 additions & 6 deletions drivers/of/base.c
Original file line number Diff line number Diff line change
Expand Up @@ -87,15 +87,25 @@ static bool __of_node_is_type(const struct device_node *np, const char *type)
return np && match && type && !strcmp(match, type);
}

#define EXCLUDED_DEFAULT_CELLS_PLATFORMS ( \
IS_ENABLED(CONFIG_SPARC) \
)

int of_bus_n_addr_cells(struct device_node *np)
{
u32 cells;

for (; np; np = np->parent)
for (; np; np = np->parent) {
if (!of_property_read_u32(np, "#address-cells", &cells))
return cells;

/* No #address-cells property for the root node */
/*
* Default root value and walking parent nodes for "#address-cells"
* is deprecated. Any platforms which hit this warning should
* be added to the excluded list.
*/
WARN_ONCE(!EXCLUDED_DEFAULT_CELLS_PLATFORMS,
"Missing '#address-cells' in %pOF\n", np);
}
return OF_ROOT_NODE_ADDR_CELLS_DEFAULT;
}

Expand All @@ -112,11 +122,17 @@ int of_bus_n_size_cells(struct device_node *np)
{
u32 cells;

for (; np; np = np->parent)
for (; np; np = np->parent) {
if (!of_property_read_u32(np, "#size-cells", &cells))
return cells;

/* No #size-cells property for the root node */
/*
* Default root value and walking parent nodes for "#size-cells"
* is deprecated. Any platforms which hit this warning should
* be added to the excluded list.
*/
WARN_ONCE(!EXCLUDED_DEFAULT_CELLS_PLATFORMS,
"Missing '#size-cells' in %pOF\n", np);
}
return OF_ROOT_NODE_SIZE_CELLS_DEFAULT;
}

Expand Down
4 changes: 2 additions & 2 deletions drivers/of/fdt.c
Original file line number Diff line number Diff line change
Expand Up @@ -937,12 +937,12 @@ int __init early_init_dt_scan_root(void)
dt_root_addr_cells = OF_ROOT_NODE_ADDR_CELLS_DEFAULT;

prop = of_get_flat_dt_prop(node, "#size-cells", NULL);
if (prop)
if (!WARN(!prop, "No '#size-cells' in root node\n"))
dt_root_size_cells = be32_to_cpup(prop);
pr_debug("dt_root_size_cells = %x\n", dt_root_size_cells);

prop = of_get_flat_dt_prop(node, "#address-cells", NULL);
if (prop)
if (!WARN(!prop, "No '#address-cells' in root node\n"))
dt_root_addr_cells = be32_to_cpup(prop);
pr_debug("dt_root_addr_cells = %x\n", dt_root_addr_cells);

Expand Down

0 comments on commit 045b14c

Please sign in to comment.