Re: legacy PCI device behind a bridge not getting a valid IRQ on imx host controller

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

 



On Thu, Sep 12, 2024 at 4:28 PM Tim Harvey <tharvey@xxxxxxxxxxxxx> wrote:
>
> On Tue, Sep 10, 2024 at 4:04 PM Bjorn Helgaas <helgaas@xxxxxxxxxx> wrote:
> >
> > On Tue, Sep 10, 2024 at 09:50:02AM -0700, Tim Harvey wrote:
> > > On Fri, Sep 6, 2024 at 12:58 PM Bjorn Helgaas <helgaas@xxxxxxxxxx> wrote:
> > > > On Fri, Sep 06, 2024 at 12:37:42PM -0700, Tim Harvey wrote:
> > > > > ...
> > > >
> > > > > I have the hardware in hand now as well as the out-of-tree driver
> > > > > that's being used. I can say there is nothing wrong here with legacy
> > > > > PCI interrupt mapping, if I write a skeleton driver that uses
> > > > > pci_resister_driver(struct pci_driver) its probe is called with an
> > > > > interrupt and request_irq on that interrupt succeeds just fine.
> > > > >
> > > > > The issue here is with the vendor's out-of-tree driver which instead
> > > > > is using pci_get_device() to scan the bus which returns a struct
> > > > > pci_dev * that doesn't have an irq assigned (like what is described
> > > > > in
> > > > > https://www.kernel.org/doc/html/v5.5/PCI/pci.html#how-to-find-pci-devices-manually).
> > > > > When using pci_get_device() when/how does pci_assign_irq() get
> > > > > called to assign the irq to the device?
> > > >
> > > > Hmmm.  pci_get_device() is strongly discouraged because it subverts
> > > > the driver model (it skips the usual driver probe/claim model so it
> > > > allows multiple drivers to operate the device simultaneously which can
> > > > obviously cause conflicts), and it doesn't play well with hotplug
> > > > (hotplug events automatically cause driver .probe() methods to be
> > > > called, but users of pci_get_device() have to roll their own way of
> > > > doing this).
> > > >
> > > > So I'm not aware of a documented/supported way to set up the INTx
> > > > interrupts in the pci_get_device() case.
> > >
> > > Makes sense to me. Perhaps some changes to Documentation/PCI/pci.rst
> > > could explain this.
> >
> > Yeah, that would be a good idea.
> >
> > > Thanks for the help here, glad to find there is nothing broken here. I
> > > think there could have been some confusion by the user here because
> > > they were used to x86 assigning irq's without using
> > > pci_resister_driver() but they were also using a kernel param of
> > > pci=routeirq which looks like its an x86 only temporary workaround
> > > that may have made this work on that architecture.
> >
> > I wondered about "pci=routirq", but I lost the trail and couldn't
> > figure out how that would lead to pci_assign_irq() or something
> > functionally equivalent.
> >
>
> Hi Bjorn and Frank,
>
> While switching to pci_resister_driver() resolves the request_irq
> issue I find that legacy IRQ's fire on the imx8mm/imx8mp only when the
> device is not behind a bridge:
>
> Again this specific device is a DDK BU-69092S1 which has a TI XIO2001
> PCIe-to-PCI bridge with a PCI device behind it.
>
> Here is an example of a GW72xx (which has a PI7C9X2G404E 4-port PCIe
> switch) with an imx8mm:
> root@noble-venice:~# uname -r
> 6.6.8-gc6ef8b5e47a0
> root@noble-venice:~# lspci -n
> 00:00.0 0604: 16c3:abcd (rev 01)
> 01:00.0 0604: 12d8:b404 (rev 01)
> 02:01.0 0604: 12d8:b404 (rev 01)
> 02:02.0 0604: 12d8:b404 (rev 01)
> 02:03.0 0604: 12d8:b404 (rev 01)
> 04:00.0 0604: 104c:8240
> 05:00.0 0780: 4ddc:1a00 (rev 10)
> 05:01.0 0780: 4ddc:1a00 (rev 10)
> 06:00.0 0200: 1055:7430 (rev 11)
> root@noble-venice:~# lspci -s 05:00 -vvv | grep Interrupt
>         Interrupt: pin A routed to IRQ 206
> root@noble-venice:~# grep 206 /proc/interrupts
> 206:          0          0          0          0     GICv3 157 Level
>   PCIe PME
> ^^^ makes sense... driver has probed and requested the IRQ but nothing
> has made it fire yet
> root@noble-venice:~# ./tester
> Testing.....Registers Passed test.
> Testing.....Ram Passed 1234 test.
> Testing.....Ram Passed aaaa test.
> Testing.....Ram Passed aa55 test.
> Testing.....Ram Passed 55aa test.
> Testing.....Ram Passed 5555 test.
> Testing.....Ram Passed ffff test.
> Testing.....Ram Passed 1111 test.
> Testing.....Ram Passed 8888 test.
> Testing.....Ram Passed 0000 test.
> Testing.....Interrupt Test Failure,  NO IRQ!!!
> Testing.....Protocol Test RTL Function Failure-> Function not supported.
> Testing.....Vector Test RTL Function Failure-> Function not supported.
> EXIT: tester
> ^^^ this app causes the device to fire an IRQ and verifies its been
> caught; fails due to no irq firing
> root@noble-venice:~# grep 206 /proc/interrupts
> 206:          0          0          0          0     GICv3 157 Level
>   PCIe PME
> ^^^ 0 interrupts
>
> Here is an example of the same device on a GW71xx (which has no
> switch) with an imx8mm:
> root@noble-venice:~# uname -r
> 6.6.8-gc6ef8b5e47a0
> root@noble-venice:~# lspci -n
> 00:00.0 0604: 16c3:abcd (rev 01)
> 01:00.0 0604: 104c:8240
> 02:00.0 0780: 4ddc:1a00 (rev 10)
> 02:01.0 0780: 4ddc:1a00 (rev 10)
> root@noble-venice:~# lspci -s 02:00 -vvv | grep Interrupt
>         Interrupt: pin A routed to IRQ 204
> root@noble-venice:~# grep 204 /proc/interrupts
> 204:          0          0          0          0     GICv3 157 Level
>   PCIe PME
> root@noble-venice:~# ./tester
> Testing.....Registers Passed test.
> Testing.....Ram Passed 1234 test.
> Testing.....Ram Passed aaaa test.
> Testing.....Ram Passed aa55 test.
> Testing.....Ram Passed 55aa test.
> Testing.....Ram Passed 5555 test.
> Testing.....Ram Passed ffff test.
> Testing.....Ram Passed 1111 test.
> Testing.....Ram Passed 8888 test.
> Testing.....Ram Passed 0000 test.
> Testing.....Interrupt Occurred, Passed test.
> Testing.....Protocol Test RTL Function Failure-> Function not supported.
> Testing.....Vector Test RTL Function Failure-> Function not supported.
> EXIT: tester
> root@noble-venice:~# grep 204 /proc/interrupts
> 204:          1          0          0          0     GICv3 157 Level
>   PCIe PME
>
> I believe this issue is likely the same thing I enquired about over a
> year ago [1] showing with an ath9k device which uses legacy IRQ's
> which I've also never resolved.
>
> Any ideas here?
>

Bjorn and Frank, any ideas here?

I neglected to point to the other email which referenced what I
believe to be the same issue:
https://www.spinics.net/lists/linux-wireless/msg233763.html

I believe that legacy interrupts do not work on imx8m{m,p} when behind
a bridge. I believe the interrupts are getting swizzled when they
should not as it's a PCIe bridge (Int A/B/C/D should be mapped based
on dt and thus should not change depending on downstream slot).

Best Regards,

Tim





[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