If there're no PHBs under P5IOC2 HUB device tree node, we should
bail early to avoid zero devisor and allocating TCE tables.

Reported-by: Anton Blanchard <an...@samba.org>
Signed-off-by: Gavin Shan <gws...@linux.vnet.ibm.com>
---
 arch/powerpc/platforms/powernv/pci-p5ioc2.c | 28 ++++++++++++++++------------
 1 file changed, 16 insertions(+), 12 deletions(-)

diff --git a/arch/powerpc/platforms/powernv/pci-p5ioc2.c 
b/arch/powerpc/platforms/powernv/pci-p5ioc2.c
index 94ce348..3336fcb 100644
--- a/arch/powerpc/platforms/powernv/pci-p5ioc2.c
+++ b/arch/powerpc/platforms/powernv/pci-p5ioc2.c
@@ -196,6 +196,22 @@ void __init pnv_pci_init_p5ioc2_hub(struct device_node *np)
        hub_id = be64_to_cpup(prop64);
        pr_info(" HUB-ID : 0x%016llx\n", hub_id);
 
+       /* Count child PHBs and calculate TCE space per PHB */
+       for_each_child_of_node(np, phbn) {
+               if (of_device_is_compatible(phbn, "ibm,p5ioc2-pcix") ||
+                   of_device_is_compatible(phbn, "ibm,p5ioc2-pciex"))
+                       phb_count++;
+       }
+
+       if (phb_count <= 0) {
+               pr_info(" No PHBs for Hub %s\n", np->full_name);
+               return;
+       }
+
+       tce_per_phb = __rounddown_pow_of_two(P5IOC2_TCE_MEMORY / phb_count);
+       pr_info(" Allocating %lld MB of TCE memory per PHB\n",
+               tce_per_phb >> 20);
+
        /* Currently allocate 16M of TCE memory for every Hub
         *
         * XXX TODO: Make it chip local if possible
@@ -215,18 +231,6 @@ void __init pnv_pci_init_p5ioc2_hub(struct device_node *np)
                return;
        }
 
-       /* Count child PHBs */
-       for_each_child_of_node(np, phbn) {
-               if (of_device_is_compatible(phbn, "ibm,p5ioc2-pcix") ||
-                   of_device_is_compatible(phbn, "ibm,p5ioc2-pciex"))
-                       phb_count++;
-       }
-
-       /* Calculate how much TCE space we can give per PHB */
-       tce_per_phb = __rounddown_pow_of_two(P5IOC2_TCE_MEMORY / phb_count);
-       pr_info(" Allocating %lld MB of TCE memory per PHB\n",
-               tce_per_phb >> 20);
-
        /* Initialize PHBs */
        for_each_child_of_node(np, phbn) {
                if (of_device_is_compatible(phbn, "ibm,p5ioc2-pcix") ||
-- 
1.8.3.2

_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Reply via email to