mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-12-29 17:25:38 +00:00
of: WARN on deprecated #address-cells/#size-cells handling
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>
This commit is contained in:
parent
67759cfb04
commit
045b14ca5c
@ -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);
|
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)
|
int of_bus_n_addr_cells(struct device_node *np)
|
||||||
{
|
{
|
||||||
u32 cells;
|
u32 cells;
|
||||||
|
|
||||||
for (; np; np = np->parent)
|
for (; np; np = np->parent) {
|
||||||
if (!of_property_read_u32(np, "#address-cells", &cells))
|
if (!of_property_read_u32(np, "#address-cells", &cells))
|
||||||
return 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;
|
return OF_ROOT_NODE_ADDR_CELLS_DEFAULT;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -112,11 +122,17 @@ int of_bus_n_size_cells(struct device_node *np)
|
|||||||
{
|
{
|
||||||
u32 cells;
|
u32 cells;
|
||||||
|
|
||||||
for (; np; np = np->parent)
|
for (; np; np = np->parent) {
|
||||||
if (!of_property_read_u32(np, "#size-cells", &cells))
|
if (!of_property_read_u32(np, "#size-cells", &cells))
|
||||||
return 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;
|
return OF_ROOT_NODE_SIZE_CELLS_DEFAULT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -937,12 +937,12 @@ int __init early_init_dt_scan_root(void)
|
|||||||
dt_root_addr_cells = OF_ROOT_NODE_ADDR_CELLS_DEFAULT;
|
dt_root_addr_cells = OF_ROOT_NODE_ADDR_CELLS_DEFAULT;
|
||||||
|
|
||||||
prop = of_get_flat_dt_prop(node, "#size-cells", NULL);
|
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);
|
dt_root_size_cells = be32_to_cpup(prop);
|
||||||
pr_debug("dt_root_size_cells = %x\n", dt_root_size_cells);
|
pr_debug("dt_root_size_cells = %x\n", dt_root_size_cells);
|
||||||
|
|
||||||
prop = of_get_flat_dt_prop(node, "#address-cells", NULL);
|
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);
|
dt_root_addr_cells = be32_to_cpup(prop);
|
||||||
pr_debug("dt_root_addr_cells = %x\n", dt_root_addr_cells);
|
pr_debug("dt_root_addr_cells = %x\n", dt_root_addr_cells);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user