[Skiboot] [PATCH 3/3] pci: Wait for CRS and switch link when restoring bus numbers
Russell Currey
ruscur at russell.cc
Fri Aug 18 11:08:27 AEST 2017
On Thu, 2017-08-17 at 18:26 +1000, Andrew Donnellan wrote:
> On 17/08/17 16:04, Russell Currey wrote:
> > When a complete reset occurs, after the PHB recovers it propagates a
> > reset down the wire to every device. At the same time, skiboot talks to
> > every device in order to restore the state of devices to what they were
> > before the reset.
> >
> > In some situations, such as devices that recovered slowly and/or were
> > behind a switch, skiboot attempted to access config space of the device
> > before the link was up and the device could respond.
> >
> > Fix this by retrying CRS until the device responds correctly, and for
> > devices behind a switch, making sure the switch has its link up first.
> >
> > Signed-off-by: Benjamin Herrenschmidt <benh at kernel.crashing.org>
> > Signed-off-by: Russell Currey <ruscur at russell.cc>
>
> This looks fairly sensible to me.
>
> Reviewed-by: Andrew Donnellan <andrew.donnellan at au1.ibm.com>
>
> > @@ -1835,14 +1848,26 @@ static int __pci_restore_bridge_buses(struct phb
> > *phb,
> > struct pci_device *pd,
> > void *data __unused)
> > {
> > - if (!pd->is_bridge) {
> > - uint32_t vdid;
> > + uint32_t vdid;
> > +
> > + /* If the device is behind a switch, wait for the switch */
> > + if (!pd->is_vf && !(pd->bdfn & 7) && pd->parent != NULL &&
> > + pd->parent->dev_type == PCIE_TYPE_SWITCH_DNPORT) {
> > + if (!pci_bridge_wait_link(phb, pd->parent, true)) {
> > + PCIERR(phb, pd->bdfn, "Timeout waiting for
> > switch\n");
> > + return -1;
> > + }
> > + }
> > +
> > + /* Wait for config space to stop returning CRS */
> > + if (!pci_wait_crs(phb, pd->bdfn, &vdid))
> > + return -1;
>
> What does returning -1 do - it looks to me that this stops the
> pci_walk_dev() from descending any further, which seems correct, but I
> haven't used pci_walk_dev() very much...
>
Yes, that's what it does.
More information about the Skiboot
mailing list