Re: [PATCH V13 3/6] PCI: loongson: Don't access unexisting devices

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi, Bjorn,

On Wed, Jun 1, 2022 at 7:14 AM Bjorn Helgaas <helgaas@xxxxxxxxxx> wrote:
>
> On Sat, Apr 30, 2022 at 04:48:43PM +0800, Huacai Chen wrote:
> > On LS2K/LS7A, some unexisting devices don't return 0xffffffff when
> > scanning. This is a hardware flaw but we can only avoid it by software
> > now.
>
> s/unexisting/non-existant/ (many occurrences: subject line, commit
> log, comments below)
OK, thanks.

>
> What happens in other situations that normally cause Unsupported
> Request or similar errors?  For example, memory reads/writes to a
> device in D3hot should cause an Unsupported Request error.  I'm
> wondering whether other error handling assumptions might be broken
> on LS2K/LS7A.
Hardware engineers told me that the problem is due to pin
multiplexing, under some configurations, a PCI device is unusable but
the read request doesn't return 0xffffffff.

>
> > Signed-off-by: Huacai Chen <chenhuacai@xxxxxxxxxxx>
> > ---
> >  drivers/pci/controller/pci-loongson.c | 11 +++++++++--
> >  1 file changed, 9 insertions(+), 2 deletions(-)
> >
> > diff --git a/drivers/pci/controller/pci-loongson.c b/drivers/pci/controller/pci-loongson.c
> > index adbfa4a2330f..48316daa1f23 100644
> > --- a/drivers/pci/controller/pci-loongson.c
> > +++ b/drivers/pci/controller/pci-loongson.c
> > @@ -138,6 +138,8 @@ static void __iomem *pci_loongson_map_bus(struct pci_bus *bus, unsigned int devf
> >                              int where)
> >  {
> >       unsigned char busnum = bus->number;
> > +     unsigned int device = PCI_SLOT(devfn);
> > +     unsigned int function = PCI_FUNC(devfn);
> >       struct loongson_pci *priv = pci_bus_to_loongson_pci(bus);
> >
> >       if (pci_is_root_bus(bus))
> > @@ -147,8 +149,13 @@ static void __iomem *pci_loongson_map_bus(struct pci_bus *bus, unsigned int devf
> >        * Do not read more than one device on the bus other than
> >        * the host bus. For our hardware the root bus is always bus 0.
> >        */
> > -     if (priv->data->flags & FLAG_DEV_FIX &&
> > -                     !pci_is_root_bus(bus) && PCI_SLOT(devfn) > 0)
> > +     if ((priv->data->flags & FLAG_DEV_FIX) && bus->self) {
> > +             if (!pci_is_root_bus(bus) && (device > 0))
> > +                     return NULL;
> > +     }
> > +
> > +     /* Don't access unexisting devices */
> > +     if (pci_is_root_bus(bus) && (device >= 9 && device <= 20 && function > 0))
>
> Yuck.  This is pretty nasty magic.  If this is something that might be
> fixed in future versions of the hardware, maybe you should factor this
> out into a function pointer in loongson_pci_data or something.
OK, seems providing a pdev_is_existant() is better.

Huacai
>
> >               return NULL;
> >
> >       /* CFG0 can only access standard space */
> > --
> > 2.27.0
> >



[Index of Archives]     [DMA Engine]     [Linux Coverity]     [Linux USB]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Greybus]

  Powered by Linux