Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 61e8a0d5 authored by Michael Ellerman's avatar Michael Ellerman
Browse files

powerpc/pci: Fix endian bug in fixed PHB numbering



The recent commit 63a72284 ("powerpc/pci: Assign fixed PHB number
based on device-tree properties"), added code to read a 64-bit property
from the device tree, and if not found read a 32-bit property (reg).

There was a bug in the 32-bit case, on big endian machines, due to the
use of the 64-bit value to read the 32-bit property. The cast of &prop
means we end up writing to the high 32-bit of prop, leaving the low
32-bits containing whatever junk was on the stack.

If that junk value was non-zero, and < MAX_PHBS, we would end up using
it as the PHB id. This results in users seeing what appear to be random
PHB ids.

Fix it by reading into a u32 property and then assigning that to the
u64 value, letting the CPU do the correct conversions for us.

Fixes: 63a72284 ("powerpc/pci: Assign fixed PHB number based on device-tree properties")
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent 10560b9a
Loading
Loading
Loading
Loading
+5 −2
Original line number Diff line number Diff line
@@ -78,6 +78,7 @@ EXPORT_SYMBOL(get_pci_dma_ops);
static int get_phb_number(struct device_node *dn)
{
	int ret, phb_id = -1;
	u32 prop_32;
	u64 prop;

	/*
@@ -86,8 +87,10 @@ static int get_phb_number(struct device_node *dn)
	 * reading "ibm,opal-phbid", only present in OPAL environment.
	 */
	ret = of_property_read_u64(dn, "ibm,opal-phbid", &prop);
	if (ret)
		ret = of_property_read_u32_index(dn, "reg", 1, (u32 *)&prop);
	if (ret) {
		ret = of_property_read_u32_index(dn, "reg", 1, &prop_32);
		prop = prop_32;
	}

	if (!ret)
		phb_id = (int)(prop & (MAX_PHBS - 1));