mirror of https://gitee.com/openkylin/linux.git
powerpc/powernv: Fix potential zero devisor
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 <anton@samba.org> Signed-off-by: Gavin Shan <gwshan@linux.vnet.ibm.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
This commit is contained in:
parent
ec8e4e9d3d
commit
cf2b1e0eb0
|
@ -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") ||
|
||||
|
|
Loading…
Reference in New Issue