* Fixing PCIe issues on Armada XP @ 2014-04-10 16:19 Thomas Petazzoni 2014-04-10 16:57 ` Jason Gunthorpe ` (3 more replies) 0 siblings, 4 replies; 25+ messages in thread From: Thomas Petazzoni @ 2014-04-10 16:19 UTC (permalink / raw) To: linux-arm-kernel Hello all, This is an e-mail that attempts to summarize the situation in terms of Armada XP PCIe issues. At https://github.com/MISL-EBU-System-SW/mainline-public/commits/3.14/pci-debug, I've pushed a branch based on top of v3.14 that contains: * 2 backports for the igb driver, needed to get the igb driver to work in situations where MSI-X support is not available. These patches are already in mainline (post v3.14), and I've sent a mail to the maintainers and the netdev@ mailing list to ask for these patches to be pushed to 3.14 stable. * 3 backports of patches that use the 0xf1000000 internal register address for Armada XP development boards. These are needed for me because I have a recent Marvell bootloader. You may or may not want to apply these patches depending on which Marvell board you're using, and which version of the bootloader you have. * 3 patches on the irq-armada-370-xp driver, to fix the MSI support. One from Neil Greatorex, two from me. * 2 patches on the mvebu-mbus driver. One from Jason Gunthorpe which adds loud warnings when a non power-of-two window size is requested, and one from me to allow the creation of several windows having the same target and attribute values, which is needed if we want to create multiple windows to describe a single PCI BAR. * 2 patches on the pci-mvebu driver. One from Willy Tarreau to fix the off by one on the sizes. And another one from me which splits the PCI BAR into power-of-two sized chunks, in order to create valid MBus windows. I've tested this with my IGB card which needs a 9 MB BAR (so 8 MB + 1 MB needed), and I've also faked the code to code to simulate a 11.5 MB BAR (so 8 + 2 + 1 + 0.5 MB), and it worked. I also checked that if we have an error when creating one of the windows, then all the previous windows needed for the current BAR are properly removed. Can you test this stack of patches on your system and configuration, and let me know if that works for you? Of course, please do not include any other PCI related fix: the goal is to be aware of *all* the issues, and fix them in mainline. Gerlando: I remember you also had a power-of-two related issues, that you reported a while ago. This patch series should fix it. Would it be possible for you to test this patch series? Remaining issues: * The link up problem. Unfortunately, I tried to reproduce it today, and didn't manage to. It's weird, because I'm sure I was able to produce it in the past, but I'm no longer able to, I don't know. Therefore, it's not easy for me to work on this topic. Neil, Jason, do you think this is a topic you could potentially handle? * On my Armada XP DB board, if I plug 5 PCIe cards, the IGB card for some reason isn't able to read data from its non-volatile memory. So the window points to something, but it doesn't seem to patch what the igb driver expects. I've double checked the MBus windows, and they look correct. I haven't tested this PCIe configuration with the Marvell LSP though, so maybe I'm hitting an unrelated hardware problem or something. Thanks a lot for your feedback and participation around these PCIe issues! Thomas -- Thomas Petazzoni, CTO, Free Electrons Embedded Linux, Kernel and Android engineering http://free-electrons.com ^ permalink raw reply [flat|nested] 25+ messages in thread
* Fixing PCIe issues on Armada XP 2014-04-10 16:19 Fixing PCIe issues on Armada XP Thomas Petazzoni @ 2014-04-10 16:57 ` Jason Gunthorpe 2014-04-10 18:01 ` Thomas Petazzoni 2014-04-10 17:10 ` Willy Tarreau ` (2 subsequent siblings) 3 siblings, 1 reply; 25+ messages in thread From: Jason Gunthorpe @ 2014-04-10 16:57 UTC (permalink / raw) To: linux-arm-kernel On Thu, Apr 10, 2014 at 06:19:53PM +0200, Thomas Petazzoni wrote: > This is an e-mail that attempts to summarize the situation in terms of > Armada XP PCIe issues. > > At > https://github.com/MISL-EBU-System-SW/mainline-public/commits/3.14/pci-debug, > I've pushed a branch based on top of v3.14 that contains: mvebu_pcie_del_windows / mvebu_pcie_add_windows I wonder if these functions should be dropped into the mbus driver.. They are pretty generic. 'bus: mvebu-mbus: Avoid setting an undefined window size' and 'pci: mvebu: fix off-by-one in the computed size of the mbus windows' need to be swapped in order to maintain bisect-ability. > Can you test this stack of patches on your system and configuration, and > let me know if that works for you? Continues to work as expected here, and I see the new error message: mvebu_mbus: cannot add window '4:e8', conflicts with another window mvebu-pcie pex.1: Could not create MBus window at 0xe0000000, size 0x100000: -22 (this is due to the PEX window being in the DT mbus ranges already) Tested-By: Jason Gunthorpe <jgunthorpe@obsidianresearch.com> > > * The link up problem. Unfortunately, I tried to reproduce it today, > and didn't manage to. It's weird, because I'm sure I was able to > produce it in the past, but I'm no longer able to, I don't know. > Therefore, it's not easy for me to work on this topic. Neil, Jason, > do you think this is a topic you could potentially handle? You said you had a system that sometimes required the udelay? Can you run Neil's patch and see if your system behaves the same? Specifically that the link eventually goes down after mvebu_pcie_set_local_dev_nr ? I couldn't find any case where the BDF leaks below the TLP layer, and the spec is very clear that the assigned BDF can change at run time, so I don't have an explanation for why the link reset is happening. Do you have a contact at Marvell that might shed some light on that behavior? > * On my Armada XP DB board, if I plug 5 PCIe cards, the IGB card for > some reason isn't able to read data from its non-volatile memory. So > the window points to something, but it doesn't seem to patch what > the igb driver expects. I've double checked the MBus windows, and > they look correct. I haven't tested this PCIe configuration with the > Marvell LSP though, so maybe I'm hitting an unrelated hardware > problem or something. Certainly troubling.. And the IGB works if it is the only card in the system? That does sound like more mbus troubles. Regrads, Jason ^ permalink raw reply [flat|nested] 25+ messages in thread
* Fixing PCIe issues on Armada XP 2014-04-10 16:57 ` Jason Gunthorpe @ 2014-04-10 18:01 ` Thomas Petazzoni 2014-04-10 20:12 ` Jason Gunthorpe 0 siblings, 1 reply; 25+ messages in thread From: Thomas Petazzoni @ 2014-04-10 18:01 UTC (permalink / raw) To: linux-arm-kernel Dear Jason Gunthorpe, On Thu, 10 Apr 2014 10:57:33 -0600, Jason Gunthorpe wrote: > > At > > https://github.com/MISL-EBU-System-SW/mainline-public/commits/3.14/pci-debug, > > I've pushed a branch based on top of v3.14 that contains: > > mvebu_pcie_del_windows / mvebu_pcie_add_windows I wonder if these > functions should be dropped into the mbus driver.. They are pretty > generic. Yes. I must say I hesitated quite a bit of time between having them in pci-mvebu or in mvebu-mbus. I settled on pci-mvebu because PCI is so far the only user of this functionality. But this is not a strong opinion. > 'bus: mvebu-mbus: Avoid setting an undefined window size' and > 'pci: mvebu: fix off-by-one in the computed size of the mbus windows' > need to be swapped in order to maintain bisect-ability. They could, indeed, but on the other hand, PCI and bus are handled by different maintainers, so they will flow through distinct branches, so I'm not sure it's going to be easy to guarantee the bisectability here. Unless we get the Acks from both maintainers, so that Jason Cooper can carry the patches and maintain the right order. I'll reorder them when posting the patch series anyway. > > Can you test this stack of patches on your system and configuration, and > > let me know if that works for you? > > Continues to work as expected here, and I see the new error message: > > mvebu_mbus: cannot add window '4:e8', conflicts with another window > mvebu-pcie pex.1: Could not create MBus window at 0xe0000000, size 0x100000: -22 > > (this is due to the PEX window being in the DT mbus ranges already) I'm not sure to understand here: you have hardcoded in your DT the necessary PEX window? If so, then yes, it's expected. > Tested-By: Jason Gunthorpe <jgunthorpe@obsidianresearch.com> Thanks! > > * The link up problem. Unfortunately, I tried to reproduce it today, > > and didn't manage to. It's weird, because I'm sure I was able to > > produce it in the past, but I'm no longer able to, I don't know. > > Therefore, it's not easy for me to work on this topic. Neil, Jason, > > do you think this is a topic you could potentially handle? > > You said you had a system that sometimes required the udelay? Yes, and I tried to reproduce it today, and I didn't manage to reproduce the problem, even on this platform, in the same conditions. I'll try again tomorrow. > Can you > run Neil's patch and see if your system behaves the same? Specifically > that the link eventually goes down after mvebu_pcie_set_local_dev_nr ? > > I couldn't find any case where the BDF leaks below the TLP layer, and > the spec is very clear that the assigned BDF can change at run time, > so I don't have an explanation for why the link reset is happening. > Do you have a contact at Marvell that might shed some light on that > behavior? There was a potential explanation about the mvebu-soc-id driver that enables the clock and then disables it, before the pci-mvebu driver. This is different that what was happening before, where the pci-mvebu driver was the only one to enable the clock, which was already enabled by the bootloader. So if the clock takes some time to stabilize, the introduction of mvebu-soc-id may lead to problems. But I'm not entirely convinced by this, because in my testing, I saw: * Enable the clock * Values in the PCI configuration space are correct (like vendor/product ID) * mvebu_pcie_set_local_dev_nr() * Values in the PCI configuration space are no longer correct, unless you wait a little bit. > > * On my Armada XP DB board, if I plug 5 PCIe cards, the IGB card for > > some reason isn't able to read data from its non-volatile memory. So > > the window points to something, but it doesn't seem to patch what > > the igb driver expects. I've double checked the MBus windows, and > > they look correct. I haven't tested this PCIe configuration with the > > Marvell LSP though, so maybe I'm hitting an unrelated hardware > > problem or something. > > Certainly troubling.. And the IGB works if it is the only card in the > system? Yes, the IGB card works fine when plugged as the only card. It also works when plugged with 3 other PCIe cards. But when I plug the five PCIe cards I have, the IGB stops working. However, note that some interfaces are x1, some other x4, and maybe there was a mismatch/incompatibility with the PCIe cards I was plugging in the board. > That does sound like more mbus troubles. Interestingly, the problem occurred when I was plugging a SATA PCIe card. And regardless of whether the SATA PCIe card is present or not, the MBus mappings for the IGB are exactly the same. Here is a dump of the MBus windows with 4 PCIe cards (including the IGB one) : [00] 00000000ffe30000 - 00000000ffe40000 : 0004:00f0 (remap 0000000000030000) [01] disabled [02] disabled [03] disabled [04] disabled [05] disabled [06] disabled [07] disabled [08] 00000000fff00000 - 0000000100000000 : 0001:001d -> bootrom [09] 00000000f0000000 - 00000000f1000000 : 0001:002f -> NOR flash [10] 00000000f8000000 - 00000000f8100000 : 0004:00e8 -> some other PCIe card [11] 00000000f8800000 - 00000000f9000000 : 0004:00f8 -> this is the IGB [12] 00000000f9000000 - 00000000f9100000 : 0004:00f8 -> this is the IGB [13] disabled [14] disabled [15] disabled [16] disabled [17] disabled [18] disabled [19] disabled And now, with the SATA card plugged in: [00] 00000000ffe40000 - 00000000ffe50000 : 0008:00f0 (remap 0000000000040000) [01] 00000000ffe30000 - 00000000ffe40000 : 0004:00f0 (remap 0000000000030000) [02] disabled [03] disabled [04] disabled [05] disabled [06] disabled [07] disabled [08] 00000000fff00000 - 0000000100000000 : 0001:001d => bootrom [09] 00000000f0000000 - 00000000f1000000 : 0001:002f => NOR flash [10] 00000000f8000000 - 00000000f8100000 : 0004:00e8 => port 0.0 mem [11] 00000000f8400000 - 00000000f8600000 : 0008:00f8 => port 3.0 mem (SATA) [12] 00000000f8800000 - 00000000f9000000 : 0004:00f8 => port 2.0 mem (igb) [13] 00000000f9000000 - 00000000f9100000 : 0004:00f8 => port 2.0 mem (igb) [14] disabled [15] disabled [16] disabled [17] disabled [18] disabled [19] disabled Thomas -- Thomas Petazzoni, CTO, Free Electrons Embedded Linux, Kernel and Android engineering http://free-electrons.com ^ permalink raw reply [flat|nested] 25+ messages in thread
* Fixing PCIe issues on Armada XP 2014-04-10 18:01 ` Thomas Petazzoni @ 2014-04-10 20:12 ` Jason Gunthorpe 2014-04-10 21:04 ` Thomas Petazzoni 2014-04-10 21:56 ` Neil Greatorex 0 siblings, 2 replies; 25+ messages in thread From: Jason Gunthorpe @ 2014-04-10 20:12 UTC (permalink / raw) To: linux-arm-kernel On Thu, Apr 10, 2014 at 08:01:53PM +0200, Thomas Petazzoni wrote: > > Can you run Neil's patch and see if your system behaves the same? > > Specifically that the link eventually goes down after > > mvebu_pcie_set_local_dev_nr ? > > > > I couldn't find any case where the BDF leaks below the TLP layer, and > > the spec is very clear that the assigned BDF can change at run time, > > so I don't have an explanation for why the link reset is happening. > > Do you have a contact at Marvell that might shed some light on that > > behavior? > > There was a potential explanation about the mvebu-soc-id driver that > enables the clock and then disables it, before the pci-mvebu driver. > This is different that what was happening before, where the pci-mvebu > driver was the only one to enable the clock, which was already enabled > by the bootloader. So if the clock takes some time to stabilize, the > introduction of mvebu-soc-id may lead to problems. Oh, that certainly sounds like a potential problem. Disabling the clock will certainly cause 'interesting' effects on the PEX, depending on exactly what it does it could confuse the link partner (trigger a timeout based retrain?). Gating the clock without disabling the Phy first does sound like a bad idea.. Neil, does this do anything for you? diff --git a/arch/arm/mach-mvebu/mvebu-soc-id.c b/arch/arm/mach-mvebu/mvebu-soc-id.c index f3b325f..e0a032f 100644 --- a/arch/arm/mach-mvebu/mvebu-soc-id.c +++ b/arch/arm/mach-mvebu/mvebu-soc-id.c @@ -107,7 +107,7 @@ static int __init mvebu_soc_id_init(void) iounmap(pci_base); res_ioremap: - clk_disable_unprepare(clk); +// clk_disable_unprepare(clk); clk_err: of_node_put(child); > But I'm not entirely convinced by this, because in my testing, I saw: > > * Enable the clock > * Values in the PCI configuration space are correct (like > vendor/product ID) > * mvebu_pcie_set_local_dev_nr() > * Values in the PCI configuration space are no longer correct, unless > you wait a little bit. Were you reading the configuation space through the MMIO mapping or through the configuration indirection? In any event, turning on the clock should almost certainly be accompanied by a phy reset sequence to get both link ends on the same page. Attached is a rough, untested patch along those lines. > > That does sound like more mbus troubles. > > Interestingly, the problem occurred when I was plugging a SATA PCIe > card. And regardless of whether the SATA PCIe card is present or not, > the MBus mappings for the IGB are exactly the same. Maybe something wrong with mbus window index 13? Any change if you use other windows? --- a/drivers/bus/mvebu-mbus.c +++ b/drivers/bus/mvebu-mbus.c @@ -299,7 +299,7 @@ static int mvebu_mbus_alloc_window(struct mvebu_mbus_state *mbus, int win; if (remap == MVEBU_MBUS_NO_REMAP) { - for (win = mbus->soc->num_remappable_wins; + for (win = 0; win < mbus->soc->num_wins; win++) if (mvebu_mbus_window_is_free(mbus, win)) return mvebu_mbus_setup_window(mbus, win, base, Jason -------------- next part -------------- A non-text attachment was scrubbed... Name: pex-reset.diff Type: text/x-diff Size: 1897 bytes Desc: not available URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20140410/e9227692/attachment.bin> ^ permalink raw reply related [flat|nested] 25+ messages in thread
* Fixing PCIe issues on Armada XP 2014-04-10 20:12 ` Jason Gunthorpe @ 2014-04-10 21:04 ` Thomas Petazzoni 2014-04-10 21:56 ` Neil Greatorex 1 sibling, 0 replies; 25+ messages in thread From: Thomas Petazzoni @ 2014-04-10 21:04 UTC (permalink / raw) To: linux-arm-kernel Dear Jason Gunthorpe, On Thu, 10 Apr 2014 14:12:01 -0600, Jason Gunthorpe wrote: > > But I'm not entirely convinced by this, because in my testing, I saw: > > > > * Enable the clock > > * Values in the PCI configuration space are correct (like > > vendor/product ID) > > * mvebu_pcie_set_local_dev_nr() > > * Values in the PCI configuration space are no longer correct, unless > > you wait a little bit. > > Were you reading the configuation space through the MMIO mapping or > through the configuration indirection? I was simply calling the mvebu_pcie_hw_rd_conf() function, so I guess it goes through what you call the "configuration indirection". > In any event, turning on the clock should almost certainly be > accompanied by a phy reset sequence to get both link ends on the same > page. > > Attached is a rough, untested patch along those lines. I'll try tomorrow, if I manage to reproduce the initial bug to start with. > > > That does sound like more mbus troubles. > > > > Interestingly, the problem occurred when I was plugging a SATA PCIe > > card. And regardless of whether the SATA PCIe card is present or not, > > the MBus mappings for the IGB are exactly the same. > > Maybe something wrong with mbus window index 13? > > Any change if you use other windows? Don't know, will try tomorrow and report back :-) Thanks for the suggestions! Thomas -- Thomas Petazzoni, CTO, Free Electrons Embedded Linux, Kernel and Android engineering http://free-electrons.com ^ permalink raw reply [flat|nested] 25+ messages in thread
* Fixing PCIe issues on Armada XP 2014-04-10 20:12 ` Jason Gunthorpe 2014-04-10 21:04 ` Thomas Petazzoni @ 2014-04-10 21:56 ` Neil Greatorex 2014-04-10 22:06 ` Jason Gunthorpe ` (2 more replies) 1 sibling, 3 replies; 25+ messages in thread From: Neil Greatorex @ 2014-04-10 21:56 UTC (permalink / raw) To: linux-arm-kernel Jason, On Thu, 10 Apr 2014, Jason Gunthorpe wrote: > Gating the clock without disabling the Phy first does sound like a > bad idea.. > > Neil, does this do anything for you? > > diff --git a/arch/arm/mach-mvebu/mvebu-soc-id.c b/arch/arm/mach-mvebu/mvebu-soc-id.c > index f3b325f..e0a032f 100644 > --- a/arch/arm/mach-mvebu/mvebu-soc-id.c > +++ b/arch/arm/mach-mvebu/mvebu-soc-id.c > @@ -107,7 +107,7 @@ static int __init mvebu_soc_id_init(void) > iounmap(pci_base); > > res_ioremap: > - clk_disable_unprepare(clk); > +// clk_disable_unprepare(clk); > > clk_err: > of_node_put(child); > That patch has fixed it for me. The PCIe card seems to be now be always properly detected. > In any event, turning on the clock should almost certainly be > accompanied by a phy reset sequence to get both link ends on the same > page. > > Attached is a rough, untested patch along those lines. > I took your attached patch and extended it a bit to print out how long it took. The delays also need to be much longer for me. I also fixed a small typo you made where the bit wasn't being set again to bring the link back up. I've attached the diff to your patch, as well as the combined patch (hope that makes sense). With the attached patch I get the following output: mirabox ~ # dmesg | grep PCIe0.0 [ 0.135947] mvebu-pcie pcie-controller.3: PCIe0.0: performing link reset [ 0.161989] mvebu-pcie pcie-controller.3: PCIe0.0: link went down after 26 tries [ 0.173984] mvebu-pcie pcie-controller.3: PCIe0.0: link came back up after 12 tries mirabox ~ # lspci 00:01.0 PCI bridge: Marvell Technology Group Ltd. Device 6710 (rev 01) 00:02.0 PCI bridge: Marvell Technology Group Ltd. Device 6710 (rev 01) 01:00.0 Ethernet controller: Intel Corporation I350 Gigabit Network Connection (rev 01) 01:00.1 Ethernet controller: Intel Corporation I350 Gigabit Network Connection (rev 01) 03:00.0 USB controller: Fresco Logic FL1009 USB 3.0 Host Controller (rev 02) So that seems to also work. I will leave it to you and Thomas to decide which approach is better! Cheers, Neil -------------- next part -------------- A non-text attachment was scrubbed... Name: pex-combined.diff Type: text/x-diff Size: 2236 bytes Desc: Combined patch URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20140410/c4f61db5/attachment.bin> -------------- next part -------------- A non-text attachment was scrubbed... Name: pex-diff-to-jasons-patch.diff Type: text/x-diff Size: 1179 bytes Desc: Diff to Jason's patch URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20140410/c4f61db5/attachment-0001.bin> ^ permalink raw reply [flat|nested] 25+ messages in thread
* Fixing PCIe issues on Armada XP 2014-04-10 21:56 ` Neil Greatorex @ 2014-04-10 22:06 ` Jason Gunthorpe 2014-04-10 22:15 ` Neil Greatorex 2014-04-11 10:23 ` Thomas Petazzoni 2014-04-18 12:58 ` Thomas Petazzoni 2 siblings, 1 reply; 25+ messages in thread From: Jason Gunthorpe @ 2014-04-10 22:06 UTC (permalink / raw) To: linux-arm-kernel On Thu, Apr 10, 2014 at 10:56:00PM +0100, Neil Greatorex wrote: > >diff --git a/arch/arm/mach-mvebu/mvebu-soc-id.c b/arch/arm/mach-mvebu/mvebu-soc-id.c > >index f3b325f..e0a032f 100644 > >+++ b/arch/arm/mach-mvebu/mvebu-soc-id.c > >@@ -107,7 +107,7 @@ static int __init mvebu_soc_id_init(void) > > iounmap(pci_base); > > > >res_ioremap: > >- clk_disable_unprepare(clk); > >+// clk_disable_unprepare(clk); > > > >clk_err: > > of_node_put(child); > > > > That patch has fixed it for me. The PCIe card seems to be now be > always properly detected. Okay, that makes lots of sense to me at least. Gregory: I have this vauge recollection it was discussed when you wrote the mvebu_soc_id_init patch to use a __clk_is_enabled but got shot down? Clearly this needs to be fixed. > >In any event, turning on the clock should almost certainly be > >accompanied by a phy reset sequence to get both link ends on the same > >page. > > > >Attached is a rough, untested patch along those lines. > > > > I took your attached patch and extended it a bit to print out how > long it took. The delays also need to be much longer for me. I also > fixed a small typo you made where the bit wasn't being set again to > bring the link back up. I've attached the diff to your patch, as > well as the combined patch (hope that makes sense). Just to be clear you tried this alone without the above? Thanks for fixing the patch, I think it also confirms the theory. IMHO, both approaches are required. The first prevents messing up the PEX as was left by the bootloader The second allows the driver to startup a PEX that wasn't enabled by the bootloader, and recover from clock gating in the kernel (eg the modular case) Both seem valuable.. Ideally I'd like to see the clk driver turn off the PEX PHY when it gates the clock, but I have no great idea how to accomplish that sort of cross register space adventure... Thomas, if we can figure out how to properly do __clk_is_enabled I can probably send a proper patch? Thanks, Jason ^ permalink raw reply [flat|nested] 25+ messages in thread
* Fixing PCIe issues on Armada XP 2014-04-10 22:06 ` Jason Gunthorpe @ 2014-04-10 22:15 ` Neil Greatorex 0 siblings, 0 replies; 25+ messages in thread From: Neil Greatorex @ 2014-04-10 22:15 UTC (permalink / raw) To: linux-arm-kernel Jason, On Thu, 10 Apr 2014, Jason Gunthorpe wrote: >> I took your attached patch and extended it a bit to print out how >> long it took. The delays also need to be much longer for me. I also >> fixed a small typo you made where the bit wasn't being set again to >> bring the link back up. I've attached the diff to your patch, as >> well as the combined patch (hope that makes sense). > > Just to be clear you tried this alone without the above? Yes I did. > > Thanks for fixing the patch, I think it also confirms the theory. > No problem! > IMHO, both approaches are required. > > The first prevents messing up the PEX as was left by the bootloader > > The second allows the driver to startup a PEX that wasn't enabled by > the bootloader, and recover from clock gating in the kernel (eg the > modular case) > > Both seem valuable.. > > Ideally I'd like to see the clk driver turn off the PEX PHY when it > gates the clock, but I have no great idea how to accomplish that sort > of cross register space adventure... > > Thomas, if we can figure out how to properly do __clk_is_enabled I > can probably send a proper patch? Let me know when you do and I will test it and add my Tested-by. > > Thanks, > Jason > Cheers, Neil ^ permalink raw reply [flat|nested] 25+ messages in thread
* Fixing PCIe issues on Armada XP 2014-04-10 21:56 ` Neil Greatorex 2014-04-10 22:06 ` Jason Gunthorpe @ 2014-04-11 10:23 ` Thomas Petazzoni 2014-04-11 16:31 ` Jason Gunthorpe 2014-04-18 12:58 ` Thomas Petazzoni 2 siblings, 1 reply; 25+ messages in thread From: Thomas Petazzoni @ 2014-04-11 10:23 UTC (permalink / raw) To: linux-arm-kernel Dear Neil Greatorex, On Thu, 10 Apr 2014 22:56:00 +0100 (BST), Neil Greatorex wrote: > > In any event, turning on the clock should almost certainly be > > accompanied by a phy reset sequence to get both link ends on the same > > page. > > > > Attached is a rough, untested patch along those lines. > > > > I took your attached patch and extended it a bit to print out how long it > took. The delays also need to be much longer for me. I also fixed a small > typo you made where the bit wasn't being set again to bring the link back > up. I've attached the diff to your patch, as well as the combined patch > (hope that makes sense). I managed to reproduce the problem of the PCIe device not being detected on Mirabox when earlyprintk is disabled. However, the proposed patch doesn't seem to work: mvebu-pcie pcie-controller.3: PCIe0.0: performing link reset mvebu-pcie pcie-controller.3: PCIe0.0: link went down after 100 tries mvebu-pcie pcie-controller.3: PCIe0.0: link came back up after 0 tries It waits hundred times for the link to go down, but it never goes down, and then it doesn't wait at all to go up... because it never went down. Moreover, I am not entirely convinced that a PHY reset is needed here. In my tests, doing just a wait after setting the local dev number was sufficient. The fact is works with earlyprintk also indicates that we don't need to do any specific action with the PHY, just to wait a bit of time. I am worried that resetting the PHY might actually take more time than what is needed, and may have other consequences that we don't necessarily understand at this point. Thomas -- Thomas Petazzoni, CTO, Free Electrons Embedded Linux, Kernel and Android engineering http://free-electrons.com ^ permalink raw reply [flat|nested] 25+ messages in thread
* Fixing PCIe issues on Armada XP 2014-04-11 10:23 ` Thomas Petazzoni @ 2014-04-11 16:31 ` Jason Gunthorpe 2014-04-11 17:21 ` Matthew Minter 2014-04-18 13:02 ` Thomas Petazzoni 0 siblings, 2 replies; 25+ messages in thread From: Jason Gunthorpe @ 2014-04-11 16:31 UTC (permalink / raw) To: linux-arm-kernel On Fri, Apr 11, 2014 at 12:23:14PM +0200, Thomas Petazzoni wrote: > On Thu, 10 Apr 2014 22:56:00 +0100 (BST), Neil Greatorex wrote: > > > In any event, turning on the clock should almost certainly be > > > accompanied by a phy reset sequence to get both link ends on the same > > > page. > > > > > > Attached is a rough, untested patch along those lines. > > > > > > > I took your attached patch and extended it a bit to print out how long it > > took. The delays also need to be much longer for me. I also fixed a small > > typo you made where the bit wasn't being set again to bring the link back > > up. I've attached the diff to your patch, as well as the combined patch > > (hope that makes sense). > > I managed to reproduce the problem of the PCIe device not being > detected on Mirabox when earlyprintk is disabled. > > However, the proposed patch doesn't seem to work: > > mvebu-pcie pcie-controller.3: PCIe0.0: performing link reset > mvebu-pcie pcie-controller.3: PCIe0.0: link went down after 100 tries > mvebu-pcie pcie-controller.3: PCIe0.0: link came back up after 0 tries > > It waits hundred times for the link to go down, but it never goes down, > and then it doesn't wait at all to go up... because it never went down. I wonder if bit 30 only disables link training, but doesn't force the link down. There may be another bit that is required here. Alternatively, are you seeing a different problem? If you apply the hack to the socid does your symptom go away as well? > Moreover, I am not entirely convinced that a PHY reset is needed here. > In my tests, doing just a wait after setting the local dev number was > sufficient. The fact is works with earlyprintk also indicates that we > don't need to do any specific action with the PHY, just to wait a bit > of time. I am worried that resetting the PHY might actually take more > time than what is needed, and may have other consequences that we don't > necessarily understand at this point. I really disagree - clearly the fundamental problem is suspending one side of the PEX link while the other remains operating. That isn't specified to work and really shouldn't work. If you suspend one side of the PEX you *MUST* reset the link. Absolutely. No Doubt In My Mind. Remember, PCI-E is a serial shared state protocol. The two sides must remain in sync or a link reset is required to recover the shared state. Halting one side obviously destroys this invariant. I think in many cases the reset happens autonomously. The remote side will force it to happen. This is what the debugging from Neil shows - the link just resets at some inconvenient point. Now we know why. The timing sensitivity also makes sense, if you suspend for a very short time window the other side might not notice. If you suspend for longer the other side will reset the link autonomously and your local side will quickly notice the reset once it comes back. If you suspend for a little bit the link might not retrain immediately but the shared state can become corrupted (eg sequence number mismatch) this will eventually trigger a reset, after the local PEX has been operating again. The LinkUp bit after resume is also clearly a lie - most likely the PEX takes some time to detect the change in remote state to trigger a link down. After all, it was suspended while the remote was busy trying to recover. The fundamental problem here is the clock driver. It should not be gating PEX clocks so naively. A PEX suspend needs to be sequenced to ensure the link is cleanly brought down before the PEX is put to sleep. That way it can cleanly and unambiguously be started up when it resumes. No risk of glitching/corrupting the far side with some kind of crap on the serial bus. In any event, the most important required patch here is one that fixes socid. It must not turn off the PEX clock. Then we can talk about how to fix pci-mvebu to work as a module... Jason ^ permalink raw reply [flat|nested] 25+ messages in thread
* Fixing PCIe issues on Armada XP 2014-04-11 16:31 ` Jason Gunthorpe @ 2014-04-11 17:21 ` Matthew Minter 2014-04-11 17:29 ` Jason Gunthorpe 2014-04-18 13:02 ` Thomas Petazzoni 1 sibling, 1 reply; 25+ messages in thread From: Matthew Minter @ 2014-04-11 17:21 UTC (permalink / raw) To: linux-arm-kernel Hi Guys, I just wanted to confirm that both V1 and V2 of the patch set fixes my problems, I still have an odd bug where a certain peripheral causes the link to drop down from x4 to x1 but I think that is far more likely a hardware issue with the device as it does not happen with any other peripheral. So to confirm you can put my "tested by" on the patches if you like. I would also like to note, my board uses an external clock for the PCI ports, thus it is unlikely to be effected by any issues relating to clock drivers. Please keep me up to date if there are any new revisions of the set and I will try and test them. Many thanks, Matt On 11 April 2014 17:31, Jason Gunthorpe <jgunthorpe@obsidianresearch.com> wrote: > On Fri, Apr 11, 2014 at 12:23:14PM +0200, Thomas Petazzoni wrote: > >> On Thu, 10 Apr 2014 22:56:00 +0100 (BST), Neil Greatorex wrote: >> > > In any event, turning on the clock should almost certainly be >> > > accompanied by a phy reset sequence to get both link ends on the same >> > > page. >> > > >> > > Attached is a rough, untested patch along those lines. >> > > >> > >> > I took your attached patch and extended it a bit to print out how long it >> > took. The delays also need to be much longer for me. I also fixed a small >> > typo you made where the bit wasn't being set again to bring the link back >> > up. I've attached the diff to your patch, as well as the combined patch >> > (hope that makes sense). >> >> I managed to reproduce the problem of the PCIe device not being >> detected on Mirabox when earlyprintk is disabled. >> >> However, the proposed patch doesn't seem to work: >> >> mvebu-pcie pcie-controller.3: PCIe0.0: performing link reset >> mvebu-pcie pcie-controller.3: PCIe0.0: link went down after 100 tries >> mvebu-pcie pcie-controller.3: PCIe0.0: link came back up after 0 tries >> >> It waits hundred times for the link to go down, but it never goes down, >> and then it doesn't wait at all to go up... because it never went down. > > I wonder if bit 30 only disables link training, but doesn't force the > link down. There may be another bit that is required here. > > Alternatively, are you seeing a different problem? If you apply the > hack to the socid does your symptom go away as well? > >> Moreover, I am not entirely convinced that a PHY reset is needed here. >> In my tests, doing just a wait after setting the local dev number was >> sufficient. The fact is works with earlyprintk also indicates that we >> don't need to do any specific action with the PHY, just to wait a bit >> of time. I am worried that resetting the PHY might actually take more >> time than what is needed, and may have other consequences that we don't >> necessarily understand at this point. > > I really disagree - clearly the fundamental problem is suspending one > side of the PEX link while the other remains operating. That isn't > specified to work and really shouldn't work. > > If you suspend one side of the PEX you *MUST* reset the > link. Absolutely. No Doubt In My Mind. > > Remember, PCI-E is a serial shared state protocol. The two sides must > remain in sync or a link reset is required to recover the shared > state. Halting one side obviously destroys this invariant. > > I think in many cases the reset happens autonomously. The remote side > will force it to happen. This is what the debugging from Neil shows - > the link just resets at some inconvenient point. Now we know why. > > The timing sensitivity also makes sense, if you suspend for a very > short time window the other side might not notice. If you suspend for > longer the other side will reset the link autonomously and your local > side will quickly notice the reset once it comes back. > > If you suspend for a little bit the link might not retrain immediately > but the shared state can become corrupted (eg sequence number > mismatch) this will eventually trigger a reset, after the local PEX > has been operating again. > > The LinkUp bit after resume is also clearly a lie - most likely the > PEX takes some time to detect the change in remote state to trigger a > link down. After all, it was suspended while the remote was busy > trying to recover. > > The fundamental problem here is the clock driver. It should not be > gating PEX clocks so naively. A PEX suspend needs to be sequenced to > ensure the link is cleanly brought down before the PEX is put to > sleep. That way it can cleanly and unambiguously be started up when it > resumes. No risk of glitching/corrupting the far side with some kind > of crap on the serial bus. > > In any event, the most important required patch here is one that fixes > socid. It must not turn off the PEX clock. Then we can talk about how > to fix pci-mvebu to work as a module... > > Jason -- ------------------------------ For additional information including the registered office and the treatment of Xyratex confidential information please visit www.xyratex.com ------------------------------ ^ permalink raw reply [flat|nested] 25+ messages in thread
* Fixing PCIe issues on Armada XP 2014-04-11 17:21 ` Matthew Minter @ 2014-04-11 17:29 ` Jason Gunthorpe 0 siblings, 0 replies; 25+ messages in thread From: Jason Gunthorpe @ 2014-04-11 17:29 UTC (permalink / raw) To: linux-arm-kernel On Fri, Apr 11, 2014 at 06:21:08PM +0100, Matthew Minter wrote: > I would also like to note, my board uses an external clock for the > PCI ports, thus it is unlikely to be effected by any issues relating > to clock drivers. It doesn't matter, the clock in question is the internal divided CPU synchronous clock that drives the PEX TLP logic. Externally sourcing the PHY clock won't change the synchronous side. Jason ^ permalink raw reply [flat|nested] 25+ messages in thread
* Fixing PCIe issues on Armada XP 2014-04-11 16:31 ` Jason Gunthorpe 2014-04-11 17:21 ` Matthew Minter @ 2014-04-18 13:02 ` Thomas Petazzoni 2014-04-22 17:34 ` Jason Gunthorpe 1 sibling, 1 reply; 25+ messages in thread From: Thomas Petazzoni @ 2014-04-18 13:02 UTC (permalink / raw) To: linux-arm-kernel Dear Jason Gunthorpe, On Fri, 11 Apr 2014 10:31:29 -0600, Jason Gunthorpe wrote: > > Moreover, I am not entirely convinced that a PHY reset is needed here. > > In my tests, doing just a wait after setting the local dev number was > > sufficient. The fact is works with earlyprintk also indicates that we > > don't need to do any specific action with the PHY, just to wait a bit > > of time. I am worried that resetting the PHY might actually take more > > time than what is needed, and may have other consequences that we don't > > necessarily understand at this point. > > I really disagree - clearly the fundamental problem is suspending one > side of the PEX link while the other remains operating. That isn't > specified to work and really shouldn't work. > > If you suspend one side of the PEX you *MUST* reset the > link. Absolutely. No Doubt In My Mind. > > Remember, PCI-E is a serial shared state protocol. The two sides must > remain in sync or a link reset is required to recover the shared > state. Halting one side obviously destroys this invariant. > > I think in many cases the reset happens autonomously. The remote side > will force it to happen. This is what the debugging from Neil shows - > the link just resets at some inconvenient point. Now we know why. > > The timing sensitivity also makes sense, if you suspend for a very > short time window the other side might not notice. If you suspend for > longer the other side will reset the link autonomously and your local > side will quickly notice the reset once it comes back. > > If you suspend for a little bit the link might not retrain immediately > but the shared state can become corrupted (eg sequence number > mismatch) this will eventually trigger a reset, after the local PEX > has been operating again. > > The LinkUp bit after resume is also clearly a lie - most likely the > PEX takes some time to detect the change in remote state to trigger a > link down. After all, it was suspended while the remote was busy > trying to recover. Ok, fair enough. However, Neil's patch (which is basically your patch with longer delays) isn't working here, as I just reported in a separate e-mail. So we don't have a solution right now. Do you have another proposal to try ? > The fundamental problem here is the clock driver. It should not be > gating PEX clocks so naively. A PEX suspend needs to be sequenced to > ensure the link is cleanly brought down before the PEX is put to > sleep. That way it can cleanly and unambiguously be started up when it > resumes. No risk of glitching/corrupting the far side with some kind > of crap on the serial bus. > > In any event, the most important required patch here is one that fixes > socid. It must not turn off the PEX clock. Then we can talk about how > to fix pci-mvebu to work as a module... I don't really understand this: all clocks are gated at boot time, so regardless of mvebu-soc-id behavior, the PCIe driver should take care of doing all the necessary initialization without making the assumptions that the clocks were left turned on from the bootloader time. This is needed if we want to support pci-mvebu as a module, so I don't see why hacking mvebu-soc-id is going to solve this. Thomas -- Thomas Petazzoni, CTO, Free Electrons Embedded Linux, Kernel and Android engineering http://free-electrons.com ^ permalink raw reply [flat|nested] 25+ messages in thread
* Fixing PCIe issues on Armada XP 2014-04-18 13:02 ` Thomas Petazzoni @ 2014-04-22 17:34 ` Jason Gunthorpe 0 siblings, 0 replies; 25+ messages in thread From: Jason Gunthorpe @ 2014-04-22 17:34 UTC (permalink / raw) To: linux-arm-kernel On Fri, Apr 18, 2014 at 03:02:44PM +0200, Thomas Petazzoni wrote: > > The LinkUp bit after resume is also clearly a lie - most likely the > > PEX takes some time to detect the change in remote state to trigger a > > link down. After all, it was suspended while the remote was busy > > trying to recover. > > Ok, fair enough. However, Neil's patch (which is basically your patch > with longer delays) isn't working here, as I just reported in a > separate e-mail. > > So we don't have a solution right now. Do you have another proposal to > try ? Do you have time to see if we can isolate the difference on your system? > > The fundamental problem here is the clock driver. It should not be > > gating PEX clocks so naively. A PEX suspend needs to be sequenced to > > ensure the link is cleanly brought down before the PEX is put to > > sleep. That way it can cleanly and unambiguously be started up when it > > resumes. No risk of glitching/corrupting the far side with some kind > > of crap on the serial bus. > > > > In any event, the most important required patch here is one that fixes > > socid. It must not turn off the PEX clock. Then we can talk about how > > to fix pci-mvebu to work as a module... > I don't really understand this: all clocks are gated at boot time, so > regardless of mvebu-soc-id behavior, the PCIe driver should take care > of doing all the necessary initialization without making the > assumptions that the clocks were left turned on from the bootloader The current mvebu-soc-id makes it impossible to do a clean hand off of the boot loader PEX setup to the PEX driver. I think that is a problem. Certainly if we fix it non-modular PEX will start working reliably. Keep in mind the current driver cannot startup a PEX without bootloader support. It does not clear the set-at-reset Conf_TrainingDisable bit, and it doesn't wait for a link to come up after doing so. > time. This is needed if we want to support pci-mvebu as a module, so I > don't see why hacking mvebu-soc-id is going to solve this. I agree we should try to figure the modular case out, but it looks to me that suspending the PEX is a bigger job that just gating the clock.. The automatic gating of the PEX clocks should be more clever. If there are no DT elements that reference the clock it can be disabled, otherwise we should probably leave it enabled and rely on the PEX driver to do power management once it gets loaded. So broadly, my thinking is the following largely orthogonal items: 1) PEX's that are setup by the bootloader must be cleanly handed off to the driver. The clocks must never gate. 2) The driver should learn to turn on a PEX from either the Conf_TrainingDisable=1 state or the clock gated state 3) PEX clocks that are never used in DT can be safely shutoff, otherwise they must remain on 4) The PEX driver can learn to properly suspend the PEX for power savings, via the normal Linux power management stuff. What do you think? Jason ^ permalink raw reply [flat|nested] 25+ messages in thread
* Fixing PCIe issues on Armada XP 2014-04-10 21:56 ` Neil Greatorex 2014-04-10 22:06 ` Jason Gunthorpe 2014-04-11 10:23 ` Thomas Petazzoni @ 2014-04-18 12:58 ` Thomas Petazzoni 2014-04-22 17:56 ` Jason Gunthorpe 2 siblings, 1 reply; 25+ messages in thread From: Thomas Petazzoni @ 2014-04-18 12:58 UTC (permalink / raw) To: linux-arm-kernel Neil, Jason, On Thu, 10 Apr 2014 22:56:00 +0100 (BST), Neil Greatorex wrote: > I took your attached patch and extended it a bit to print out how long it > took. The delays also need to be much longer for me. I also fixed a small > typo you made where the bit wasn't being set again to bring the link back > up. I've attached the diff to your patch, as well as the combined patch > (hope that makes sense). Unfortunately here your patch doesn't work (and neither does the patch from Jason Gunthorpe). On Armada 370 DB, without the patch, the e1000e NIC is detected when earlyprintk is enabled, and not detected when earlyprintk is disabled. With the patch applied, the e1000e is no longer detected *at all*, even if earlyprintk is enabled. Extract from a boot log: Linux version 3.15.0-rc1-00007-gedf643a-dirty (thomas at skate) (gcc version 4.8.1 (Ubuntu/Linaro 4.8.1-10ubuntu7) ) #317 SMP Fri Apr 18 14:54:13 CEST 2014 [...] Kernel command line: console=ttyS0,115200 earlyprintk loglevel=8 root=/dev/nfs nfsroot=192.168.1.22:/home/thomas/nfsroot ip=192.168.1.142:192.168.1.22:192.168.1.1:255.255.255.0:devboard:eth0:on [...] mvebu-pcie pcie-controller.2: PCIe0.0: performing link reset mvebu-pcie pcie-controller.2: PCIe0.0: link went down after 20 tries mvebu-pcie pcie-controller.2: PCIe0.0: link came back up after 100 tries mvebu-pcie pcie-controller.2: PCI host bridge to bus 0000:00 pci_bus 0000:00: root bus resource [io 0x1000-0xfffff] pci_bus 0000:00: root bus resource [mem 0xf8000000-0xffdfffff] pci_bus 0000:00: root bus resource [bus 00-ff] pci 0000:00:01.0: [11ab:6710] type 01 class 0x060400 pci 0000:00:02.0: [11ab:6710] type 01 class 0x060400 PCI: bus0: Fast back to back transfers disabled pci 0000:00:01.0: bridge configuration invalid ([bus 00-00]), reconfiguring pci 0000:00:02.0: bridge configuration invalid ([bus 00-00]), reconfiguring PCI: bus1: Fast back to back transfers enabled pci_bus 0000:01: busn_res: [bus 01-ff] end is updated to 01 PCI: bus2: Fast back to back transfers enabled pci_bus 0000:02: busn_res: [bus 02-ff] end is updated to 02 pci 0000:00:01.0: PCI bridge to [bus 01] pci 0000:00:02.0: PCI bridge to [bus 02] [...] # /usr/sbin/lspci 00:01.0 PCI bridge: Marvell Technology Group Ltd. Device 6710 00:02.0 PCI bridge: Marvell Technology Group Ltd. Device 6710 # Any idea? Thomas -- Thomas Petazzoni, CTO, Free Electrons Embedded Linux, Kernel and Android engineering http://free-electrons.com ^ permalink raw reply [flat|nested] 25+ messages in thread
* Fixing PCIe issues on Armada XP 2014-04-18 12:58 ` Thomas Petazzoni @ 2014-04-22 17:56 ` Jason Gunthorpe 0 siblings, 0 replies; 25+ messages in thread From: Jason Gunthorpe @ 2014-04-22 17:56 UTC (permalink / raw) To: linux-arm-kernel > mvebu-pcie pcie-controller.2: PCIe0.0: performing link reset > mvebu-pcie pcie-controller.2: PCIe0.0: link went down after 20 tries > mvebu-pcie pcie-controller.2: PCIe0.0: link came back up after 100 tries So the '100' here says the timeout expired. My first stab would be to set the timeout longer.. Maybe your chip takes longer to train the link. You also mentioned that setting Conf_TrainingDisable doesn't cause the link to go down? That would be useful to verify (in a clean environment without clock gating weirdness..) > # /usr/sbin/lspci > 00:01.0 PCI bridge: Marvell Technology Group Ltd. Device 6710 > 00:02.0 PCI bridge: Marvell Technology Group Ltd. Device 6710 I'm guessing: echo 1 > /sys/bus/pci/rescan Will make it appear? Jason ^ permalink raw reply [flat|nested] 25+ messages in thread
* Fixing PCIe issues on Armada XP 2014-04-10 16:19 Fixing PCIe issues on Armada XP Thomas Petazzoni 2014-04-10 16:57 ` Jason Gunthorpe @ 2014-04-10 17:10 ` Willy Tarreau 2014-04-10 18:02 ` Thomas Petazzoni 2014-04-10 18:20 ` Neil Greatorex 2014-04-11 14:32 ` Thomas Petazzoni 3 siblings, 1 reply; 25+ messages in thread From: Willy Tarreau @ 2014-04-10 17:10 UTC (permalink / raw) To: linux-arm-kernel Hi Thomas, On Thu, Apr 10, 2014 at 06:19:53PM +0200, Thomas Petazzoni wrote: > Hello all, > > This is an e-mail that attempts to summarize the situation in terms of > Armada XP PCIe issues. > > At > https://github.com/MISL-EBU-System-SW/mainline-public/commits/3.14/pci-debug, > I've pushed a branch based on top of v3.14 that contains: Thanks for putting all this online. I have a minor comment below : > * 2 patches on the pci-mvebu driver. One from Willy Tarreau to fix the > off by one on the sizes. And another one from me which splits the > PCI BAR into power-of-two sized chunks, in order to create valid > MBus windows. As suggested by Jason, this one should be merged before his that's just before, to ensure that it will not cause a regression. > I've tested this with my IGB card which needs a 9 MB > BAR (so 8 MB + 1 MB needed), and I've also faked the code to code to > simulate a 11.5 MB BAR (so 8 + 2 + 1 + 0.5 MB), and it worked. I > also checked that if we have an error when creating one of the > windows, then all the previous windows needed for the current BAR > are properly removed. Really cool, I'm going to test that on a few PCIe cards and will report the results here. How can we check the number of mbus windows in use ? Thanks, Willy ^ permalink raw reply [flat|nested] 25+ messages in thread
* Fixing PCIe issues on Armada XP 2014-04-10 17:10 ` Willy Tarreau @ 2014-04-10 18:02 ` Thomas Petazzoni 2014-04-10 23:13 ` Willy Tarreau 0 siblings, 1 reply; 25+ messages in thread From: Thomas Petazzoni @ 2014-04-10 18:02 UTC (permalink / raw) To: linux-arm-kernel Dear Willy Tarreau, On Thu, 10 Apr 2014 19:10:00 +0200, Willy Tarreau wrote: > Thanks for putting all this online. > > I have a minor comment below : > > > * 2 patches on the pci-mvebu driver. One from Willy Tarreau to fix the > > off by one on the sizes. And another one from me which splits the > > PCI BAR into power-of-two sized chunks, in order to create valid > > MBus windows. > > As suggested by Jason, this one should be merged before his that's just > before, to ensure that it will not cause a regression. Ok, will change this, thanks. > > I've tested this with my IGB card which needs a 9 MB > > BAR (so 8 MB + 1 MB needed), and I've also faked the code to code to > > simulate a 11.5 MB BAR (so 8 + 2 + 1 + 0.5 MB), and it worked. I > > also checked that if we have an error when creating one of the > > windows, then all the previous windows needed for the current BAR > > are properly removed. > > Really cool, I'm going to test that on a few PCIe cards and will report > the results here. How can we check the number of mbus windows in use ? # cat /sys/kernel/debug/mvebu-mbus/devices Thomas -- Thomas Petazzoni, CTO, Free Electrons Embedded Linux, Kernel and Android engineering http://free-electrons.com ^ permalink raw reply [flat|nested] 25+ messages in thread
* Fixing PCIe issues on Armada XP 2014-04-10 18:02 ` Thomas Petazzoni @ 2014-04-10 23:13 ` Willy Tarreau 2014-04-10 23:40 ` Jason Gunthorpe 0 siblings, 1 reply; 25+ messages in thread From: Willy Tarreau @ 2014-04-10 23:13 UTC (permalink / raw) To: linux-arm-kernel Hi Thomas, On Thu, Apr 10, 2014 at 08:02:22PM +0200, Thomas Petazzoni wrote: > > Really cool, I'm going to test that on a few PCIe cards and will report > > the results here. How can we check the number of mbus windows in use ? > > # cat /sys/kernel/debug/mvebu-mbus/devices Thanks, so here we go : XP-GP with igb, works perfectly : root at xpgp:~# dmesg|grep igb igb: Intel(R) Gigabit Ethernet Network Driver - version 5.0.5-k igb: Copyright (c) 2007-2013 Intel Corporation. igb 0000:02:00.0: added PHC on eth4 igb 0000:02:00.0: Intel(R) Gigabit Ethernet Network Connection igb 0000:02:00.0: eth4: (PCIe:5.0Gb/s:Width x1) 00:30:18:a6:6c:6a igb 0000:02:00.0: eth4: PBA No: FFFFFF-0FF igb 0000:02:00.0: Using MSI interrupts. 1 rx queue(s), 1 tx queue(s) igb 0000:02:00.1: added PHC on eth5 igb 0000:02:00.1: Intel(R) Gigabit Ethernet Network Connection igb 0000:02:00.1: eth5: (PCIe:5.0Gb/s:Width x1) 00:30:18:a6:6c:6b igb 0000:02:00.1: eth5: PBA No: FFFFFF-0FF igb 0000:02:00.1: Using MSI interrupts. 1 rx queue(s), 1 tx queue(s) root at xpgp:~# lspci -v -s 02:00 | egrep -i '^0|Memory' 02:00.0 Ethernet controller: Intel Corporation Device 1521 (rev 01) Memory at e0000000 (32-bit, non-prefetchable) [size=512K] Memory at e0200000 (32-bit, non-prefetchable) [size=16K] 02:00.1 Ethernet controller: Intel Corporation Device 1521 (rev 01) Memory at e0100000 (32-bit, non-prefetchable) [size=512K] Memory at e0204000 (32-bit, non-prefetchable) [size=16K] root at xpgp:~# grep -v disabled /sys/kernel/debug/mvebu-mbus/devices [00] 00000000e8010000 - 00000000e8020000 : 0004:00f0 (remap 0000000000010000) [08] 00000000fff00000 - 0000000100000000 : 0001:001d [09] 00000000f0000000 - 00000000f1000000 : 0001:002f [10] 00000000e0000000 - 00000000e0200000 : 0004:00f8 [11] 00000000e0200000 - 00000000e0300000 : 0004:00f8 So the areas are well covered, though #11 seems larger than needed but I seem to remember that they're all rounded up by 1 MB anyway, then if so, that's OK. Now with igb + myricom : root at xpgp:~# lspci -v -s 02:00 | egrep -i '^0|Memory' 02:00.0 Ethernet controller: Intel Corporation Device 1521 (rev 01) Memory at e1800000 (32-bit, non-prefetchable) [disabled] [size=512K] Memory at e1a00000 (32-bit, non-prefetchable) [disabled] [size=16K] 02:00.1 Ethernet controller: Intel Corporation Device 1521 (rev 01) Memory at e1900000 (32-bit, non-prefetchable) [disabled] [size=512K] Memory at e1a04000 (32-bit, non-prefetchable) [disabled] [size=16K] root at xpgp:~# lspci -v -s 03:00 | egrep -i '^0|Memory' 03:00.0 Ethernet controller: MYRICOM Inc. Myri-10G Dual-Protocol NIC Memory at e0000000 (64-bit, prefetchable) [size=16M] Memory at e1000000 (64-bit, non-prefetchable) [size=1M] root at xpgp:~# modprobe igb igb: Intel(R) Gigabit Ethernet Network Driver - version 5.0.5-k igb: Copyright (c) 2007-2013 Intel Corporation. PCI: enabling device 0000:00:09.0 (0140 -> 0143) PCI: enabling device 0000:02:00.0 (0140 -> 0142) igb 0000:02:00.0: added PHC on eth4 igb 0000:02:00.0: Intel(R) Gigabit Ethernet Network Connection igb 0000:02:00.0: eth4: (PCIe:5.0Gb/s:Width x1) 00:30:18:a6:6c:6a igb 0000:02:00.0: eth4: PBA No: FFFFFF-0FF igb 0000:02:00.0: Using MSI interrupts. 1 rx queue(s), 1 tx queue(s) PCI: enabling device 0000:02:00.1 (0140 -> 0142) igb 0000:02:00.1: added PHC on eth5 igb 0000:02:00.1: Intel(R) Gigabit Ethernet Network Connection igb 0000:02:00.1: eth5: (PCIe:5.0Gb/s:Width x1) 00:30:18:a6:6c:6b igb 0000:02:00.1: eth5: PBA No: FFFFFF-0FF igb 0000:02:00.1: Using MSI interrupts. 1 rx queue(s), 1 tx queue(s) root at xpgp:~# modprobe myri10ge myri10ge: Version 1.5.3-1.534 PCI: enabling device 0000:00:0a.0 (0140 -> 0143) myri10ge 0000:03:00.0: PCIE x4 Link myri10ge 0000:03:00.0: Direct firmware load failed with error -2 myri10ge 0000:03:00.0: Falling back to user helper myri10ge 0000:03:00.0: Unable to load myri10ge_eth_z8e.dat firmware image via hotplug myri10ge 0000:03:00.0: hotplug firmware loading failed myri10ge 0000:03:00.0: Successfully adopted running firmware myri10ge 0000:03:00.0: Using firmware currently running on NIC. For optimal myri10ge 0000:03:00.0: performance consider loading optimized firmware myri10ge 0000:03:00.0: via hotplug myri10ge 0000:03:00.0: MSI IRQ 113, tx bndry 2048, fw adopted, WC Disabled root at xpgp:~# grep -v disabled /sys/kernel/debug/mvebu-mbus/devices [00] 00000000e8010000 - 00000000e8020000 : 0004:00f0 (remap 0000000000010000) [08] 00000000fff00000 - 0000000100000000 : 0001:001d [09] 00000000f0000000 - 00000000f1000000 : 0001:002f [10] 00000000e1800000 - 00000000e1a00000 : 0004:00f8 [11] 00000000e1a00000 - 00000000e1b00000 : 0004:00f8 [12] 00000000e0000000 - 00000000e1000000 : 0008:00f8 [13] 00000000e1000000 - 00000000e1800000 : 0008:00f8 I noticed above that both igb ports share the same window #11. So I tried to rmmod igb, remove both PCI devices, check mbus again (which did not change), rescan PCI and modprobe igb again, and everything is still operational with the same windows. I don't know if it is normal that they're not unregistered when the device goes away (maybe there's no refcount) ? If we have to keep them forever, then maybe a further improvement will consist in merging adjacent windows which sum up as a power of two (eg: #10 and #11 may be merged). I tried to add a 3rd NIC in the mix (broadcom tg3), which caused the myri10ge to fail to load for an obscure reason after loading igb properly : root at xpgp:~# dmesg tg3.c:v3.134 (Sep 16, 2013) PCI: enabling device 0000:00:01.0 (0140 -> 0143) tg3 0000:01:00.0 eth4: Tigon3 [partno(BCM95721A211) rev 4001] (PCI Express) MAC address 00:07:11:04:3e:e6 tg3 0000:01:00.0 eth4: attached PHY is 5750 (10/100/1000Base-T Ethernet) (WireSpeed[1], EEE[0]) tg3 0000:01:00.0 eth4: RXcsums[1] LinkChgREG[0] MIirq[0] ASF[0] TSOcap[1] tg3 0000:01:00.0 eth4: dma_rwctrl[76180000] dma_mask[64-bit] igb: Intel(R) Gigabit Ethernet Network Driver - version 5.0.5-k igb: Copyright (c) 2007-2013 Intel Corporation. PCI: enabling device 0000:00:09.0 (0140 -> 0143) PCI: enabling device 0000:02:00.0 (0140 -> 0142) igb 0000:02:00.0: added PHC on eth5 igb 0000:02:00.0: Intel(R) Gigabit Ethernet Network Connection igb 0000:02:00.0: eth5: (PCIe:5.0Gb/s:Width x1) 00:30:18:a6:6c:6a igb 0000:02:00.0: eth5: PBA No: FFFFFF-0FF igb 0000:02:00.0: Using MSI interrupts. 1 rx queue(s), 1 tx queue(s) PCI: enabling device 0000:02:00.1 (0140 -> 0142) igb 0000:02:00.1: added PHC on eth6 igb 0000:02:00.1: Intel(R) Gigabit Ethernet Network Connection igb 0000:02:00.1: eth6: (PCIe:5.0Gb/s:Width x1) 00:30:18:a6:6c:6b igb 0000:02:00.1: eth6: PBA No: FFFFFF-0FF igb 0000:02:00.1: Using MSI interrupts. 1 rx queue(s), 1 tx queue(s) myri10ge: Version 1.5.3-1.534 PCI: enabling device 0000:00:0a.0 (0140 -> 0143) myri10ge 0000:03:00.0: invalid sram_size -1B or board span 16777216B root at xpgp:~# root at xpgp:~# lspci -v -s 01:00 | egrep -i '^0| at ' 01:00.0 Ethernet controller: Broadcom Corporation NetXtreme BCM5721 Gigabit Ethernet PCI Express (rev 01) Memory at e1800000 (64-bit, non-prefetchable) [size=64K] Expansion ROM at e1810000 [disabled] [size=64K] root at xpgp:~# lspci -v -s 02:00 | egrep -i '^0| at ' 02:00.0 Ethernet controller: Intel Corporation Device 1521 (rev 01) Memory at e1a00000 (32-bit, non-prefetchable) [size=512K] I/O ports at 10000 [disabled] [size=32] Memory at e1c00000 (32-bit, non-prefetchable) [size=16K] [virtual] Expansion ROM at e1a80000 [disabled] [size=512K] 02:00.1 Ethernet controller: Intel Corporation Device 1521 (rev 01) Memory at e1b00000 (32-bit, non-prefetchable) [size=512K] I/O ports at 10020 [disabled] [size=32] Memory at e1c04000 (32-bit, non-prefetchable) [size=16K] [virtual] Expansion ROM at e1b80000 [disabled] [size=512K] root at xpgp:~# lspci -v -s 03:00 | egrep -i '^0| at ' 03:00.0 Ethernet controller: MYRICOM Inc. Myri-10G Dual-Protocol NIC Memory at e0000000 (64-bit, prefetchable) [size=16M] Memory at e1000000 (64-bit, non-prefetchable) [size=1M] [virtual] Expansion ROM at e1100000 [disabled] [size=512K] root at xpgp:~# root at xpgp:~# grep -v disabled /sys/kernel/debug/mvebu-mbus/devices [00] 00000000e8010000 - 00000000e8020000 : 0004:00f0 (remap 0000000000010000) [08] 00000000fff00000 - 0000000100000000 : 0001:001d [09] 00000000f0000000 - 00000000f1000000 : 0001:002f [10] 00000000e1800000 - 00000000e1900000 : 0004:00e8 [11] 00000000e1a00000 - 00000000e1c00000 : 0004:00f8 [12] 00000000e1c00000 - 00000000e1d00000 : 0004:00f8 [13] 00000000e0000000 - 00000000e1000000 : 0008:00f8 [14] 00000000e1000000 - 00000000e1800000 : 0008:00f8 At least nothing seems wrong anywhere, so for now we should probably ignore it, unless someone has a good idea about something to look at. Now I'm using a Realtek instead of TG3, so I have this : root at xpgp:~# lspci -v -s 01:00 | egrep -i '^0| at ' 01:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168B PCI Express Gigabit Ethernet controller (rev 02) I/O ports at 10000 [disabled] [size=256] Memory at e1820000 (64-bit, non-prefetchable) [size=4K] Memory at e1800000 (64-bit, prefetchable) [size=64K] Expansion ROM at e1810000 [size=64K] root at xpgp:~# lspci -v -s 02:00 | egrep -i '^0| at ' 02:00.0 Ethernet controller: Intel Corporation Device 1521 (rev 01) Memory at e1a00000 (32-bit, non-prefetchable) [disabled] [size=512K] I/O ports at 20000 [disabled] [size=32] Memory at e1c00000 (32-bit, non-prefetchable) [disabled] [size=16K] [virtual] Expansion ROM at e1a80000 [disabled] [size=512K] 02:00.1 Ethernet controller: Intel Corporation Device 1521 (rev 01) Memory at e1b00000 (32-bit, non-prefetchable) [disabled] [size=512K] I/O ports at 20020 [disabled] [size=32] Memory at e1c04000 (32-bit, non-prefetchable) [disabled] [size=16K] [virtual] Expansion ROM at e1b80000 [disabled] [size=512K] root at xpgp:~# lspci -v -s 03:00 | egrep -i '^0| at ' 03:00.0 Ethernet controller: MYRICOM Inc. Myri-10G Dual-Protocol NIC Memory at e0000000 (64-bit, prefetchable) [size=16M] Memory at e1000000 (64-bit, non-prefetchable) [size=1M] [virtual] Expansion ROM at e1100000 [disabled] [size=512K] I get similar results : root at xpgp:~# dmesg r8169 Gigabit Ethernet driver 2.3LK-NAPI loaded PCI: enabling device 0000:00:01.0 (0140 -> 0143) PCI: enabling device 0000:01:00.0 (0146 -> 0147) r8169 0000:01:00.0 eth4: RTL8168c/8111c at 0xf0346000, 00:e0:4c:81:20:79, XID 1c4000c0 IRQ 119 r8169 0000:01:00.0 eth4: jumbo features [frames: 6128 bytes, tx checksumming: ko] igb: Intel(R) Gigabit Ethernet Network Driver - version 5.0.5-k igb: Copyright (c) 2007-2013 Intel Corporation. PCI: enabling device 0000:00:09.0 (0140 -> 0143) PCI: enabling device 0000:02:00.0 (0140 -> 0142) igb 0000:02:00.0: added PHC on eth5 igb 0000:02:00.0: Intel(R) Gigabit Ethernet Network Connection igb 0000:02:00.0: eth5: (PCIe:5.0Gb/s:Width x1) 00:30:18:a6:6c:6a igb 0000:02:00.0: eth5: PBA No: FFFFFF-0FF igb 0000:02:00.0: Using MSI interrupts. 1 rx queue(s), 1 tx queue(s) PCI: enabling device 0000:02:00.1 (0140 -> 0142) igb 0000:02:00.1: added PHC on eth6 igb 0000:02:00.1: Intel(R) Gigabit Ethernet Network Connection igb 0000:02:00.1: eth6: (PCIe:5.0Gb/s:Width x1) 00:30:18:a6:6c:6b igb 0000:02:00.1: eth6: PBA No: FFFFFF-0FF igb 0000:02:00.1: Using MSI interrupts. 1 rx queue(s), 1 tx queue(s) myri10ge: Version 1.5.3-1.534 PCI: enabling device 0000:00:0a.0 (0140 -> 0143) myri10ge 0000:03:00.0: invalid sram_size -1B or board span 16777216B root at xpgp:~# grep -v disabled /sys/kernel/debug/mvebu-mbus/devices [00] 00000000e8010000 - 00000000e8020000 : 0004:00e0 (remap 0000000000010000) [01] 00000000e8020000 - 00000000e8030000 : 0004:00f0 (remap 0000000000020000) [08] 00000000fff00000 - 0000000100000000 : 0001:001d [09] 00000000f0000000 - 00000000f1000000 : 0001:002f [10] 00000000e1800000 - 00000000e1900000 : 0004:00e8 [11] 00000000e1a00000 - 00000000e1c00000 : 0004:00f8 [12] 00000000e1c00000 - 00000000e1d00000 : 0004:00f8 [13] 00000000e0000000 - 00000000e1000000 : 0008:00f8 [14] 00000000e1000000 - 00000000e1800000 : 0008:00f8 root at xpgp:~# Ah, interestingly if I load the NICs in the opposite order, they all load properly (myri10ge, igb, r8169) : root at xpgp:~# dmesg myri10ge: Version 1.5.3-1.534 PCI: enabling device 0000:00:0a.0 (0140 -> 0143) myri10ge 0000:03:00.0: PCIE x4 Link myri10ge 0000:03:00.0: Direct firmware load failed with error -2 myri10ge 0000:03:00.0: Falling back to user helper myri10ge 0000:03:00.0: Unable to load myri10ge_eth_z8e.dat firmware image via hotplug myri10ge 0000:03:00.0: hotplug firmware loading failed myri10ge 0000:03:00.0: Successfully adopted running firmware myri10ge 0000:03:00.0: Using firmware currently running on NIC. For optimal myri10ge 0000:03:00.0: performance consider loading optimized firmware myri10ge 0000:03:00.0: via hotplug myri10ge 0000:03:00.0: MSI IRQ 114, tx bndry 2048, fw adopted, WC Disabled igb: Intel(R) Gigabit Ethernet Network Driver - version 5.0.5-k igb: Copyright (c) 2007-2013 Intel Corporation. PCI: enabling device 0000:00:09.0 (0140 -> 0143) PCI: enabling device 0000:02:00.0 (0140 -> 0142) igb 0000:02:00.0: added PHC on eth5 igb 0000:02:00.0: Intel(R) Gigabit Ethernet Network Connection igb 0000:02:00.0: eth5: (PCIe:5.0Gb/s:Width x1) 00:30:18:a6:6c:6a igb 0000:02:00.0: eth5: PBA No: FFFFFF-0FF igb 0000:02:00.0: Using MSI interrupts. 1 rx queue(s), 1 tx queue(s) PCI: enabling device 0000:02:00.1 (0140 -> 0142) igb 0000:02:00.1: added PHC on eth6 igb 0000:02:00.1: Intel(R) Gigabit Ethernet Network Connection igb 0000:02:00.1: eth6: (PCIe:5.0Gb/s:Width x1) 00:30:18:a6:6c:6b igb 0000:02:00.1: eth6: PBA No: FFFFFF-0FF igb 0000:02:00.1: Using MSI interrupts. 1 rx queue(s), 1 tx queue(s) r8169 Gigabit Ethernet driver 2.3LK-NAPI loaded PCI: enabling device 0000:00:01.0 (0140 -> 0143) PCI: enabling device 0000:01:00.0 (0146 -> 0147) r8169 0000:01:00.0 eth7: RTL8168c/8111c at 0xf037e000, 00:e0:4c:81:20:79, XID 1c4000c0 IRQ 121 r8169 0000:01:00.0 eth7: jumbo features [frames: 6128 bytes, tx checksumming: ko] root at xpgp:~# grep -v disabled /sys/kernel/debug/mvebu-mbus/devices [00] 00000000e8020000 - 00000000e8030000 : 0004:00f0 (remap 0000000000020000) [01] 00000000e8010000 - 00000000e8020000 : 0004:00e0 (remap 0000000000010000) [08] 00000000fff00000 - 0000000100000000 : 0001:001d [09] 00000000f0000000 - 00000000f1000000 : 0001:002f [10] 00000000e0000000 - 00000000e1000000 : 0008:00f8 [11] 00000000e1000000 - 00000000e1800000 : 0008:00f8 [12] 00000000e1a00000 - 00000000e1c00000 : 0004:00f8 [13] 00000000e1c00000 - 00000000e1d00000 : 0004:00f8 [14] 00000000e1800000 - 00000000e1900000 : 0004:00e8 On the Mirabox, I don't see the igb NIC on lspci, but it's late and I start to think slowly so I'll have to dig this out tomorrow. Hmmm I'm seeing it after a rescan, it looks like the same issue that Neil initially reported about the link up delay. All the devices are detected now (including the USB3 controller) : root at mirabox:~# lspci -v | egrep -i '^0| at ' 00:01.0 PCI bridge: Marvell Technology Group Ltd. Device 6710 (rev 01) (prog-if 00 [Normal decode]) 00:02.0 PCI bridge: Marvell Technology Group Ltd. Device 6710 (rev 01) (prog-if 00 [Normal decode]) 01:00.0 Ethernet controller: Intel Corporation Device 1521 (rev 01) Memory at e0200000 (32-bit, non-prefetchable) [size=512K] I/O ports at 10000 [disabled] [size=32] Memory at e0400000 (32-bit, non-prefetchable) [size=16K] [virtual] Expansion ROM at e0280000 [disabled] [size=512K] 01:00.1 Ethernet controller: Intel Corporation Device 1521 (rev 01) Memory at e0300000 (32-bit, non-prefetchable) [size=512K] I/O ports at 10020 [disabled] [size=32] Memory at e0404000 (32-bit, non-prefetchable) [size=16K] [virtual] Expansion ROM at e0380000 [disabled] [size=512K] 02:00.0 USB Controller: Device 1b73:1009 (rev 02) (prog-if 30) Memory at e0000000 (64-bit, non-prefetchable) [size=64K] Memory at e0010000 (64-bit, non-prefetchable) [size=4K] Memory at e0011000 (64-bit, non-prefetchable) [size=4K] The nic properly loads : root at mirabox:~# dmesg igb: Intel(R) Gigabit Ethernet Network Driver - version 5.0.5-k igb: Copyright (c) 2007-2013 Intel Corporation. PCI: enabling device 0000:00:01.0 (0140 -> 0143) PCI: enabling device 0000:01:00.0 (0000 -> 0002) igb 0000:01:00.0: added PHC on eth2 igb 0000:01:00.0: Intel(R) Gigabit Ethernet Network Connection igb 0000:01:00.0: eth2: (PCIe:2.5Gb/s:Width x1) 00:30:18:a6:6c:6a igb 0000:01:00.0: eth2: PBA No: FFFFFF-0FF igb 0000:01:00.0: Using MSI interrupts. 1 rx queue(s), 1 tx queue(s) PCI: enabling device 0000:01:00.1 (0000 -> 0002) igb 0000:01:00.1: added PHC on eth3 igb 0000:01:00.1: Intel(R) Gigabit Ethernet Network Connection igb 0000:01:00.1: eth3: (PCIe:2.5Gb/s:Width x1) 00:30:18:a6:6c:6b igb 0000:01:00.1: eth3: PBA No: FFFFFF-0FF igb 0000:01:00.1: Using MSI interrupts. 1 rx queue(s), 1 tx queue(s) root at mirabox:~# And the mbus windows match expectations : root at mirabox:~# grep -v disabled /sys/kernel/debug/mvebu-mbus/devices [00] 00000000e8010000 - 00000000e8020000 : 0004:00e0 (remap 0000000000010000) [08] 00000000fff00000 - 0000000100000000 : 0001:00e0 [09] 00000000e0000000 - 00000000e0100000 : 0008:00e8 [10] 00000000e0200000 - 00000000e0400000 : 0004:00e8 [11] 00000000e0400000 - 00000000e0500000 : 0004:00e8 So overall, it's a big Ack from my side considering the huge improvements, let's retry tomorrow with the link up workaround/fix to see if the detection issue is related. Great work! Best regards, Willy ^ permalink raw reply [flat|nested] 25+ messages in thread
* Fixing PCIe issues on Armada XP 2014-04-10 23:13 ` Willy Tarreau @ 2014-04-10 23:40 ` Jason Gunthorpe 2014-04-11 6:23 ` Willy Tarreau 0 siblings, 1 reply; 25+ messages in thread From: Jason Gunthorpe @ 2014-04-10 23:40 UTC (permalink / raw) To: linux-arm-kernel On Fri, Apr 11, 2014 at 01:13:36AM +0200, Willy Tarreau wrote: > So the areas are well covered, though #11 seems larger than needed > but I seem to remember that they're all rounded up by 1 MB anyway, > then if so, that's OK. Right, PCI bridge windows are 1MB aligned > root at xpgp:~# grep -v disabled /sys/kernel/debug/mvebu-mbus/devices > [00] 00000000e8010000 - 00000000e8020000 : 0004:00f0 (remap 0000000000010000) > [08] 00000000fff00000 - 0000000100000000 : 0001:001d > [09] 00000000f0000000 - 00000000f1000000 : 0001:002f > [10] 00000000e1800000 - 00000000e1a00000 : 0004:00f8 > [11] 00000000e1a00000 - 00000000e1b00000 : 0004:00f8 > [12] 00000000e0000000 - 00000000e1000000 : 0008:00f8 > [13] 00000000e1000000 - 00000000e1800000 : 0008:00f8 > > I noticed above that both igb ports share the same window #11. So I > tried to rmmod igb, remove both PCI devices, check mbus again (which > did not change), rescan PCI and modprobe igb again, and everything is > still operational with the same windows. I don't know if it is normal > that they're not unregistered when the device goes away (maybe there's > no refcount) ? The windows are tied to the PCI core, not to the using driver module. So they will only changed based on rescan an dynamic resource assignment in the PCI core. PCI rescan has a 'memory' of the last bridge windows and won't make dramtic changes, so expect the windows to fairly sticky. > If we have to keep them forever, then maybe a further improvement > will consist in merging adjacent windows which sum up as a power of > two (eg: #10 and #11 may be merged). 0x1b00000 - 0x1800000 = 0x300000 which is not a power of two.. > I tried to add a 3rd NIC in the mix (broadcom tg3), which caused the > myri10ge to fail to load for an obscure reason after loading igb > properly : Oh, this looks a lot like what Thomas reported with his 5 NICs. I really wonder what could be going on here..... > Ah, interestingly if I load the NICs in the opposite order, they all load > properly (myri10ge, igb, r8169) : Load the NICs means insmod the driver ? That is repeatable? Certainly spooky, and suggests a kernel bug..... It would be interesting to see what register values the driver is getting back, is it all 0xF? I wonder if something is going wrong with the config write to enable the memory decoder. That is triggered by the driver... > So overall, it's a big Ack from my side considering the huge > improvements, let's retry tomorrow with the link up workaround/fix > to see if the detection issue is related. Great work! Seems very likely to me, if the modified patch from Neil fixes it for you too then we need to get that into mergable shape too! Regards, Jason ^ permalink raw reply [flat|nested] 25+ messages in thread
* Fixing PCIe issues on Armada XP 2014-04-10 23:40 ` Jason Gunthorpe @ 2014-04-11 6:23 ` Willy Tarreau 0 siblings, 0 replies; 25+ messages in thread From: Willy Tarreau @ 2014-04-11 6:23 UTC (permalink / raw) To: linux-arm-kernel Hi Jason, On Thu, Apr 10, 2014 at 05:40:00PM -0600, Jason Gunthorpe wrote: > The windows are tied to the PCI core, not to the using driver > module. So they will only changed based on rescan an dynamic resource > assignment in the PCI core. PCI rescan has a 'memory' of the last > bridge windows and won't make dramtic changes, so expect the windows > to fairly sticky. OK. > > If we have to keep them forever, then maybe a further improvement > > will consist in merging adjacent windows which sum up as a power of > > two (eg: #10 and #11 may be merged). > > 0x1b00000 - 0x1800000 = 0x300000 which is not a power of two.. Of course you're right. It was late last night, and I was having a hard time thinking the addresses were not inclusive so in my mind it was 0x18..0x1b inclusive, thus 4MB... Never mind. > > I tried to add a 3rd NIC in the mix (broadcom tg3), which caused the > > myri10ge to fail to load for an obscure reason after loading igb > > properly : > > Oh, this looks a lot like what Thomas reported with his 5 NICs. > > I really wonder what could be going on here..... I don't know but I have the hardware to easily reproduce it, if we want to add printks again. > > Ah, interestingly if I load the NICs in the opposite order, they all load > > properly (myri10ge, igb, r8169) : > > Load the NICs means insmod the driver ? Yes. > That is repeatable? Yes, 100% it seems. > Certainly spooky, and suggests a kernel bug..... > > It would be interesting to see what register values the driver is > getting back, is it all 0xF? That's what I suspected from the -1, but since the driver says "or 16MB" and one of the windows is 16MB, I'm still confused, I need to add some printk there. > I wonder if something is going wrong with the config write to enable > the memory decoder. That is triggered by the driver... Thomas told me that the mbus driver is able to suggest a different start address for the PCI windows. Maybe we fall in this case and the driver doesn't expect this and uses a different register for the start address. > > So overall, it's a big Ack from my side considering the huge > > improvements, let's retry tomorrow with the link up workaround/fix > > to see if the detection issue is related. Great work! > > Seems very likely to me, if the modified patch from Neil fixes it for > you too then we need to get that into mergable shape too! I can confirm that simply commenting out clk_disable_unprepare(clk) fixes this problem, so yes it's the same issue. Just tried Neil's modified patch and it works fine as well. So yes, we're making a lot of progress. Just in case anyone is interested, this is the NIC I'm using, both on the mirabox and on the XP-GP ; it was worth an acquisition considering how many corner cases it triggers in the kernel code : http://www.jetway.com.tw/jw/ipcboard_view.asp?productid=873&proname=ADMPEIDLA Cheers, Willy ^ permalink raw reply [flat|nested] 25+ messages in thread
* Fixing PCIe issues on Armada XP 2014-04-10 16:19 Fixing PCIe issues on Armada XP Thomas Petazzoni 2014-04-10 16:57 ` Jason Gunthorpe 2014-04-10 17:10 ` Willy Tarreau @ 2014-04-10 18:20 ` Neil Greatorex 2014-04-10 21:07 ` Thomas Petazzoni 2014-04-11 14:32 ` Thomas Petazzoni 3 siblings, 1 reply; 25+ messages in thread From: Neil Greatorex @ 2014-04-10 18:20 UTC (permalink / raw) To: linux-arm-kernel Thomas, On Thu, 10 Apr 2014, Thomas Petazzoni wrote: > Can you test this stack of patches on your system and configuration, and > let me know if that works for you? Of course, please do not include any > other PCI related fix: the goal is to be aware of *all* the issues, and > fix them in mainline. I have tested this branch on my Mirabox. I still get the link up problem but if I work around that (see below) the igb driver works flawlessly. Tested-by: Neil Greatorex <neil@fatboyfat.co.uk> > Remaining issues: > > * The link up problem. Unfortunately, I tried to reproduce it today, > and didn't manage to. It's weird, because I'm sure I was able to > produce it in the past, but I'm no longer able to, I don't know. > Therefore, it's not easy for me to work on this topic. Neil, Jason, > do you think this is a topic you could potentially handle? Do you have earlyprintk enabled? I've found that if I have earlyprintk in my bootargs / command line then I don't get the issue. I assume that is because of timing, but it could be something else? Cheers, Neil ^ permalink raw reply [flat|nested] 25+ messages in thread
* Fixing PCIe issues on Armada XP 2014-04-10 18:20 ` Neil Greatorex @ 2014-04-10 21:07 ` Thomas Petazzoni 0 siblings, 0 replies; 25+ messages in thread From: Thomas Petazzoni @ 2014-04-10 21:07 UTC (permalink / raw) To: linux-arm-kernel Dear Neil Greatorex, On Thu, 10 Apr 2014 19:20:37 +0100 (BST), Neil Greatorex wrote: > I have tested this branch on my Mirabox. I still get the link up problem > but if I work around that (see below) the igb driver works flawlessly. > > Tested-by: Neil Greatorex <neil@fatboyfat.co.uk> Good, thanks, we're making progress! > > Remaining issues: > > > > * The link up problem. Unfortunately, I tried to reproduce it today, > > and didn't manage to. It's weird, because I'm sure I was able to > > produce it in the past, but I'm no longer able to, I don't know. > > Therefore, it's not easy for me to work on this topic. Neil, Jason, > > do you think this is a topic you could potentially handle? > > Do you have earlyprintk enabled? I've found that if I have earlyprintk in > my bootargs / command line then I don't get the issue. I assume that is > because of timing, but it could be something else? I have indeed disabled earlyprintk. Initially by removing it from the command line, and then even by disabling CONFIG_DEBUG_LL. In fact the original bug report I had came from my colleague Gregory Clement, who precisely reported to me that a PCIe card was properly detected on his Armada 385 board when earlyprintk was enabled, but the PCIe card was not detected when earlyprintk was disabled. At the time, I was able to reproduce the problem as well on my Armada 385, and debugged it to find that the mvebu_pcie_set_local_dev_nr(). Best regards, Thomas -- Thomas Petazzoni, CTO, Free Electrons Embedded Linux, Kernel and Android engineering http://free-electrons.com ^ permalink raw reply [flat|nested] 25+ messages in thread
* Fixing PCIe issues on Armada XP 2014-04-10 16:19 Fixing PCIe issues on Armada XP Thomas Petazzoni ` (2 preceding siblings ...) 2014-04-10 18:20 ` Neil Greatorex @ 2014-04-11 14:32 ` Thomas Petazzoni 2014-04-11 15:57 ` Neil Greatorex 3 siblings, 1 reply; 25+ messages in thread From: Thomas Petazzoni @ 2014-04-11 14:32 UTC (permalink / raw) To: linux-arm-kernel Hello all, On Thu, 10 Apr 2014 18:19:53 +0200, Thomas Petazzoni wrote: > This is an e-mail that attempts to summarize the situation in terms of > Armada XP PCIe issues. Attached is a v2 of the patches to fix the various pci-mvebu issues. Changes since the version posted yesterday: * Include a fix for the timing issue of the PCIe interface that gets its clock disabled. I've chosen a different approach than the one suggested by Jason Gunthorpe, which does not involve resetting the PHY. I've tested my fix on the Mirabox, and the Armada 385 DB board on which Gregory originally reported the problem (I finally managed to reproduce the problem, it was due to the fact that only one of the PCIe interfaces is actually affected by the problem, because only the clock of the first PCIe interface is used by the mvebu-soc-id stuff). * Invert the order of Willy's and Jason's patches around MBus addresses. I've also: * Pushed the patches at https://github.com/MISL-EBU-System-SW/mainline-public/tree/3.14/pci-debug * Included a single combined patch, because I know one of you needs that to test easily. Can everybody test these patches, and confirm that they solve all the outstanding problems? Thanks! Thomas -- Thomas Petazzoni, CTO, Free Electrons Embedded Linux, Kernel and Android engineering http://free-electrons.com -------------- next part -------------- A non-text attachment was scrubbed... Name: 0001-igb-Fix-Null-pointer-dereference-in-igb_reset_q_vect.patch Type: text/x-patch Size: 1808 bytes Desc: not available URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20140411/1b58ef39/attachment-0014.bin> -------------- next part -------------- A non-text attachment was scrubbed... Name: 0002-igb-Unset-IGB_FLAG_HAS_MSIX-flag-when-falling-back-t.patch Type: text/x-patch Size: 5116 bytes Desc: not available URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20140411/1b58ef39/attachment-0015.bin> -------------- next part -------------- A non-text attachment was scrubbed... Name: 0003-ARM-mvebu-change-the-default-PCIe-apertures-for-Arma.patch Type: text/x-patch Size: 2556 bytes Desc: not available URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20140411/1b58ef39/attachment-0016.bin> -------------- next part -------------- A non-text attachment was scrubbed... Name: 0004-ARM-mvebu-switch-the-Armada-XP-DB-to-use-internal-re.patch Type: text/x-patch Size: 2498 bytes Desc: not available URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20140411/1b58ef39/attachment-0017.bin> -------------- next part -------------- A non-text attachment was scrubbed... Name: 0005-ARM-mvebu-switch-the-Armada-XP-GP-to-use-internal-re.patch Type: text/x-patch Size: 3574 bytes Desc: not available URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20140411/1b58ef39/attachment-0018.bin> -------------- next part -------------- A non-text attachment was scrubbed... Name: 0006-irqchip-armada-370-xp-fix-invalid-cast-of-signed-val.patch Type: text/x-patch Size: 1377 bytes Desc: not available URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20140411/1b58ef39/attachment-0019.bin> -------------- next part -------------- A non-text attachment was scrubbed... Name: 0007-irqchip-armada-370-xp-implement-the-check_device-msi.patch Type: text/x-patch Size: 1700 bytes Desc: not available URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20140411/1b58ef39/attachment-0020.bin> -------------- next part -------------- A non-text attachment was scrubbed... Name: 0008-irqchip-armada-370-xp-Fix-releasing-of-MSIs.patch Type: text/x-patch Size: 1273 bytes Desc: not available URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20140411/1b58ef39/attachment-0021.bin> -------------- next part -------------- A non-text attachment was scrubbed... Name: 0009-pci-mvebu-fix-off-by-one-in-the-computed-size-of-the.patch Type: text/x-patch Size: 1860 bytes Desc: not available URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20140411/1b58ef39/attachment-0022.bin> -------------- next part -------------- A non-text attachment was scrubbed... Name: 0010-bus-mvebu-mbus-Avoid-setting-an-undefined-window-siz.patch Type: text/x-patch Size: 2238 bytes Desc: not available URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20140411/1b58ef39/attachment-0023.bin> -------------- next part -------------- A non-text attachment was scrubbed... Name: 0011-bus-mvebu-mbus-allow-several-windows-with-the-same-t.patch Type: text/x-patch Size: 1136 bytes Desc: not available URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20140411/1b58ef39/attachment-0024.bin> -------------- next part -------------- A non-text attachment was scrubbed... Name: 0012-pci-pci-mvebu-split-PCIe-BARs-into-multiple-MBus-win.patch Type: text/x-patch Size: 6126 bytes Desc: not available URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20140411/1b58ef39/attachment-0025.bin> -------------- next part -------------- A non-text attachment was scrubbed... Name: 0013-pci-pci-mvebu-wait-for-a-device-to-appear-to-fix-clo.patch Type: text/x-patch Size: 3592 bytes Desc: not available URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20140411/1b58ef39/attachment-0026.bin> -------------- next part -------------- A non-text attachment was scrubbed... Name: combined.patch Type: text/x-patch Size: 15073 bytes Desc: not available URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20140411/1b58ef39/attachment-0027.bin> ^ permalink raw reply [flat|nested] 25+ messages in thread
* Fixing PCIe issues on Armada XP 2014-04-11 14:32 ` Thomas Petazzoni @ 2014-04-11 15:57 ` Neil Greatorex 0 siblings, 0 replies; 25+ messages in thread From: Neil Greatorex @ 2014-04-11 15:57 UTC (permalink / raw) To: linux-arm-kernel Thomas, On Fri, 11 Apr 2014, Thomas Petazzoni wrote: > Can everybody test these patches, and confirm that they solve all the > outstanding problems? PCIe now works well for me on my Mirabox / i350 combination with this patch set. Thanks! Tested-by: Neil Greatorex <neil@fatboyfat.co.uk> Cheers, Neil ^ permalink raw reply [flat|nested] 25+ messages in thread
end of thread, other threads:[~2014-04-22 17:56 UTC | newest] Thread overview: 25+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2014-04-10 16:19 Fixing PCIe issues on Armada XP Thomas Petazzoni 2014-04-10 16:57 ` Jason Gunthorpe 2014-04-10 18:01 ` Thomas Petazzoni 2014-04-10 20:12 ` Jason Gunthorpe 2014-04-10 21:04 ` Thomas Petazzoni 2014-04-10 21:56 ` Neil Greatorex 2014-04-10 22:06 ` Jason Gunthorpe 2014-04-10 22:15 ` Neil Greatorex 2014-04-11 10:23 ` Thomas Petazzoni 2014-04-11 16:31 ` Jason Gunthorpe 2014-04-11 17:21 ` Matthew Minter 2014-04-11 17:29 ` Jason Gunthorpe 2014-04-18 13:02 ` Thomas Petazzoni 2014-04-22 17:34 ` Jason Gunthorpe 2014-04-18 12:58 ` Thomas Petazzoni 2014-04-22 17:56 ` Jason Gunthorpe 2014-04-10 17:10 ` Willy Tarreau 2014-04-10 18:02 ` Thomas Petazzoni 2014-04-10 23:13 ` Willy Tarreau 2014-04-10 23:40 ` Jason Gunthorpe 2014-04-11 6:23 ` Willy Tarreau 2014-04-10 18:20 ` Neil Greatorex 2014-04-10 21:07 ` Thomas Petazzoni 2014-04-11 14:32 ` Thomas Petazzoni 2014-04-11 15:57 ` Neil Greatorex
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).