[SLOF] [PATCH] pci: walk through the PCI DT in reverse order
Greg Kurz
gkurz at linux.vnet.ibm.com
Fri Nov 27 19:37:42 AEDT 2015
On Thu, 26 Nov 2015 20:26:50 +0100
Thomas Huth <thuth at redhat.com> wrote:
> On 26/11/15 17:34, Greg Kurz wrote:
> > With the same set of devices, if QEMU does not do the PCI Enumeration (old
> > QEMU that doesn't set the qemu,phb-enumerated property), we get:
> >
> > Populating /pci at 800000020000000
> > Adapters on 0800000020000000
> > 00 0800 (D) : 1af4 1000 virtio [ net ]
> > 00 1000 (D) : 106b 003f serial bus [ usb-ohci ]
> > 00 1800 (D) : 1af4 1003 communication-controller*
> > 00 2000 (D) : 1af4 1001 virtio [ block ]
> > 00 2800 (D) : 1af4 1001 virtio [ block ]
> > 00 3000 (D) : 1af4 1001 virtio [ block ]
> > 00 3800 (D) : 1af4 1002 unknown-legacy-device*
> >
> > but in the case of a newer QEMU, when SLOF walks through the DT, we get:
> >
> > Populating /pci at 800000020000000
> > 00 3800 (D) : 1af4 1002 unknown-legacy-device*
> > 00 3000 (D) : 1af4 1001 virtio [ block ]
> > 00 2800 (D) : 1af4 1001 virtio [ block ]
> > 00 2000 (D) : 1af4 1001 virtio [ block ]
> > 00 1800 (D) : 1af4 1003 communication-controller*
> > 00 1000 (D) : 106b 003f serial bus [ usb-ohci ]
> > 00 0800 (D) : 1af4 1000 virtio [ net ]
> >
> > This is a confusing behaviour change for users. This patch fixes that: we
> > push all the child nodes to the stack and configure them in reverse order.
>
> With your patch, the output during boot is in the right order, but the
> nodes in the device tree are still ordered wrong (type "dev /" and then
> "ls" at the SLOF prompt).
Yeah, I was focusing on the boot order only but you're right, it is a
change in the DT.
> Where does the wrong order come from? Is it QEMU who's doing this wrong
> already? Then it should maybe be rather fixed there?
>
> Thomas
>
As David mentioned in another mail, the root cause is fdt_add_subnode() inserting
to the front rather than adding to the end of the list... Since libfdt doesn't
make it possible, it would be up to QEMU to loop through PCI devices with a
pci_for_each_device_reverse() function... makes sense ?
--
Greg
More information about the SLOF
mailing list