[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