From: Michael Ellerman <m...@ellerman.id.au>

[ Upstream commit cf89c9434af122f28a3552e6f9cc5158c33ce50a ]

On some powermacs `escc` nodes are missing `#size-cells` properties,
which is deprecated and now triggers a warning at boot since commit
045b14ca5c36 ("of: WARN on deprecated #address-cells/#size-cells
handling").

For example:

  Missing '#size-cells' in /pci@f2000000/mac-io@c/escc@13000
  WARNING: CPU: 0 PID: 0 at drivers/of/base.c:133 of_bus_n_size_cells+0x98/0x108
  Hardware name: PowerMac3,1 7400 0xc0209 PowerMac
  ...
  Call Trace:
    of_bus_n_size_cells+0x98/0x108 (unreliable)
    of_bus_default_count_cells+0x40/0x60
    __of_get_address+0xc8/0x21c
    __of_address_to_resource+0x5c/0x228
    pmz_init_port+0x5c/0x2ec
    pmz_probe.isra.0+0x144/0x1e4
    pmz_console_init+0x10/0x48
    console_init+0xcc/0x138
    start_kernel+0x5c4/0x694

As powermacs boot via prom_init it's possible to add the missing
properties to the device tree during boot, avoiding the warning. Note
that `escc-legacy` nodes are also missing `#size-cells` properties, but
they are skipped by the macio driver, so leave them alone.

Depends-on: 045b14ca5c36 ("of: WARN on deprecated #address-cells/#size-cells 
handling")
Signed-off-by: Michael Ellerman <m...@ellerman.id.au>
Reviewed-by: Rob Herring <r...@kernel.org>
Signed-off-by: Madhavan Srinivasan <ma...@linux.ibm.com>
Link: https://patch.msgid.link/20241126025710.591683-1-...@ellerman.id.au
Signed-off-by: Sasha Levin <sas...@kernel.org>
---
 arch/powerpc/kernel/prom_init.c | 29 +++++++++++++++++++++++++++--
 1 file changed, 27 insertions(+), 2 deletions(-)

diff --git a/arch/powerpc/kernel/prom_init.c b/arch/powerpc/kernel/prom_init.c
index f845065c860e3..302c2acc8dcbf 100644
--- a/arch/powerpc/kernel/prom_init.c
+++ b/arch/powerpc/kernel/prom_init.c
@@ -2928,7 +2928,7 @@ static void __init fixup_device_tree_chrp(void)
 #endif
 
 #if defined(CONFIG_PPC64) && defined(CONFIG_PPC_PMAC)
-static void __init fixup_device_tree_pmac(void)
+static void __init fixup_device_tree_pmac64(void)
 {
        phandle u3, i2c, mpic;
        u32 u3_rev;
@@ -2968,7 +2968,31 @@ static void __init fixup_device_tree_pmac(void)
                     &parent, sizeof(parent));
 }
 #else
-#define fixup_device_tree_pmac()
+#define fixup_device_tree_pmac64()
+#endif
+
+#ifdef CONFIG_PPC_PMAC
+static void __init fixup_device_tree_pmac(void)
+{
+       __be32 val = 1;
+       char type[8];
+       phandle node;
+
+       // Some pmacs are missing #size-cells on escc nodes
+       for (node = 0; prom_next_node(&node); ) {
+               type[0] = '\0';
+               prom_getprop(node, "device_type", type, sizeof(type));
+               if (prom_strcmp(type, "escc"))
+                       continue;
+
+               if (prom_getproplen(node, "#size-cells") != PROM_ERROR)
+                       continue;
+
+               prom_setprop(node, NULL, "#size-cells", &val, sizeof(val));
+       }
+}
+#else
+static inline void fixup_device_tree_pmac(void) { }
 #endif
 
 #ifdef CONFIG_PPC_EFIKA
@@ -3193,6 +3217,7 @@ static void __init fixup_device_tree(void)
        fixup_device_tree_maple_memory_controller();
        fixup_device_tree_chrp();
        fixup_device_tree_pmac();
+       fixup_device_tree_pmac64();
        fixup_device_tree_efika();
        fixup_device_tree_pasemi();
 }
-- 
2.43.0


Reply via email to