dra7xx pci driver broken on dra7xx-evm
The dra7xx-evm box freezes hard at the very first PCI bus access, the call to in dra7xx_pcie_readl() in dra7xx_pcie_probe().
The out-of-tree 3.14.53 TI driver performs a reset via platform data, calling omap_device_assert_hardreset() by hook and crook.
Adding the reset into the mainline driver cures the freeze.
Question: How on earth is this driver supposed to work?
Thanks,
Richard
Hi,
Quoted 10 lines · Richard Cochran
The dra7xx-evm box freezes hard at the very first PCI bus access, the call to in
dra7xx_pcie_readl()indra7xx_pcie_probe().The out-of-tree 3.14.53 TI driver performs a reset via platform data, calling
omap_device_assert_hardreset()by hook and crook.Adding the reset into the mainline driver cures the freeze.
Question: How on earth is this driver supposed to work?
It doesn't work out of the box in mainline. (Every time I post a PCI patch, I add the pdata-quirks mechanism to test it). The pdata-quirks mechanism used in TI tree is not an upstream-able solution. Something like this [1] was done for performing reset. Not sure the latest state of that. Dan? Suman?
Thanks
Kishon
[1] -> https://patches.linaro.org/33797/
Quoted 4 lines
Thanks,
Richard
Quoted 1 line · Kishon Vijay Abraham I
It doesn't work out of the box in mainline.
This driver was added in v3.17. So once again, TI people have merged non-functioning drivers into mainline. Super. Thanks for wasting my time.
Disappointed, annoyed, but not surprised,
Richard
PATCH 1/1 arm: pci: mark the dra7xx driver as broken
In reply to Kishon Vijay Abraham IThis patch marks the dra7xx pci host driver as broken. This driver was first merged in v3.17 and has never worked. Although the driver compiles just fine, it is missing an essential device reset. If the driver is included, the kernel locks up hard shortly after booting, before any console output appears.
--- drivers/pci/host/Kconfig | 1 + 1 file changed, 1 insertion(+)
drivers/pci/host/Kconfig +1 -0
@@ -5,6 +5,7 @@ config PCI_DRA7XX bool "TI DRA7xx PCIe controller" select PCIE_DW depends on OF && HAS_IOMEM && TI_PIPE3 + depends on BROKEN help Enables support for the PCIe controller in the DRA7xx SoC. There are two instances of PCIe controller in DRA7xx. This controller can
PATCH 1/1 arm: pci: mark the dra7xx driver as broken
Hi Richard,
Quoted 17 lines · Richard Cochran
This patch marks the dra7xx pci host driver as broken. This driver was first merged in v3.17 and has never worked. Although the driver compiles just fine, it is missing an essential device reset. If the driver is included, the kernel locks up hard shortly after booting, before any console output appears.
Signed-off-by Richard Cochran <[email protected]>--- drivers/pci/host/Kconfig | 1 + 1 file changed, 1 insertion(+)drivers/pci/host/Kconfig +0
-0
drivers/pci/host/Kconfig config PCI_DRA7XX · line 8
Quoted 4 lines
drivers/pci/host/Kconfig +1
-0@@ -5,6 +5,7 @@ config PCI_DRA7XX bool "TI DRA7xx PCIe controller" select PCIE_DW depends on OF && HAS_IOMEM && TI_PIPE3 + depends on BROKEN
In my point of view the driver is not broken as such but an independent piece (reset) which is missing, since this driver compiles and works fine if that reset piece is added. You are right in that this shouldn't have been probed since it's known that the reset piece is missing. Maybe we should just set "status = disabled" in dra7.dtsi and when that reset piece is added enable it back in dra7-evm.dts?
Thanks
Kishon
Quoted 4 lines
drivers/pci/host/Kconfig +0
-0help Enables support for the PCIe controller in the DRA7xx SoC. There are two instances of PCIe controller in DRA7xx. This controller can
PATCH 1/1 arm: pci: mark the dra7xx driver as broken
Quoted 6 lines · Kishon Vijay Abraham I
In my point of view the driver is not broken as such but an independent piece (reset) which is missing, since this driver compiles and works fine if that reset piece is added. You are right in that this shouldn't have been probed since it's known that the reset piece is missing. Maybe we should just set "status = disabled" in
dra7.dtsiand when that reset piece is added enable it back indra7-evm.dts?
That isn't strong enough, IMHO, since status=disabled is the default for most every DTS item. Maybe you could comment the PCI block out or remove it and put a comment in about the missing piece and the lock up behavior. It is really a nasty bug to have the machine freeze up with no output at all. It took me some time to figure out what was going on, and it would be a shame if someone else sets status=okay in their board file and has to repeat the whole exercise.
Thanks,
Richard
Bjorn Helgaas
maintainerPATCH 1/1 arm: pci: mark the dra7xx driver as broken
Quoted 8 lines · Richard Cochran
Quoted 6 lines · Kishon Vijay Abraham I
In my point of view the driver is not broken as such but an independent piece (reset) which is missing, since this driver compiles and works fine if that reset piece is added. You are right in that this shouldn't have been probed since it's known that the reset piece is missing. Maybe we should just set "status = disabled" in
dra7.dtsiand when that reset piece is added enable it back indra7-evm.dts?
Quoted 7 lines
That isn't strong enough, IMHO, since status=disabled is the default for most every DTS item. Maybe you could comment the PCI block out or remove it and put a comment in about the missing piece and the lock up behavior. It is really a nasty bug to have the machine freeze up with no output at all. It took me some time to figure out what was going on, and it would be a shame if someone else sets status=okay in their board file and has to repeat the whole exercise.
It sounds like dra7xx is missing a piece of essential functionality. If that's the case, what is the benefit of having it in the kernel at all? It makes work for everybody else (adapting to changes outside the driver), but it sounds like nobody gets any benefit.
If somebody posts a patch to remove the driver entirely to linux-pci at vger.kernel.org, we can discuss whether that's the right thing to do.
Bjorn
PATCH 1/1 arm: pci: mark the dra7xx driver as broken
Hi Bjorn,
Quoted 18 lines · Bjorn Helgaas
Quoted 8 lines · Richard Cochran
Quoted 6 lines · Kishon Vijay Abraham I
In my point of view the driver is not broken as such but an independent piece (reset) which is missing, since this driver compiles and works fine if that reset piece is added. You are right in that this shouldn't have been probed since it's known that the reset piece is missing. Maybe we should just set "status = disabled" in
dra7.dtsiand when that reset piece is added enable it back indra7-evm.dts?Quoted 7 lines
That isn't strong enough, IMHO, since status=disabled is the default for most every DTS item. Maybe you could comment the PCI block out or remove it and put a comment in about the missing piece and the lock up behavior. It is really a nasty bug to have the machine freeze up with no output at all. It took me some time to figure out what was going on, and it would be a shame if someone else sets status=okay in their board file and has to repeat the whole exercise.
Quoted 4 lines
It sounds like dra7xx is missing a piece of essential functionality. If that's the case, what is the benefit of having it in the kernel at all? It makes work for everybody else (adapting to changes outside the driver), but it sounds like nobody gets any benefit.
During the time pci-dra7xx driver was merged, the reset controller driver was already being discussed in the list. And I didn't think it'll take this long for it to be merged. And I didn't want pci driver development to be hampered by these external pieces. That's why I sent the pci-dra7xx patches for merging.
IMHO merging pci-dra7xx helped to keep active development of the driver, though I agree we should have kept mechanisms to keep the driver disabled either from dt or in Kconfig and a way to tell that reset piece is missing if someone has to enable the driver.
Quoted 4 lines
If somebody posts a patch to remove the driver entirely to linux-pci at vger.kernel.org, we can discuss whether that's the right thing to do.
I think that's not required now since Tony agreed to have pdata approach to perform reset till reset controller is merged. I'll be posting patch for it soon.
Thanks
Kishon
Quoted 1 line · Kishon Vijay Abraham I
Hi,
+ Tero, Tony and linux-omap
Quoted 8 lines · Richard Cochran
Quoted 6 lines
The dra7xx-evm box freezes hard at the very first PCI bus access, the call to in
dra7xx_pcie_readl()indra7xx_pcie_probe().The out-of-tree 3.14.53 TI driver performs a reset via platform data, calling
omap_device_assert_hardreset()by hook and crook.
Yeah, this is the only feasible way and not break multi-arch atm until a reset framework is in place. We have couple of drivers (omap_iommu and wkup_m3_rproc) following this approach.
Quoted 11 lines
Quoted 6 lines
Adding the reset into the mainline driver cures the freeze.
Question: How on earth is this driver supposed to work?
It doesn't work out of the box in mainline. (Every time I post a PCI patch, I add the pdata-quirks mechanism to test it). The pdata-quirks mechanism used in TI tree is not an upstream-able solution. Something like this [1] was done for performing reset. Not sure the latest state of that. Dan? Suman?
Yeah, [1] is very old, and it doesn't deal with the hwmod integration for pm_runtime API usage. Tero has posted another revamped series [2] with hwmod integration, and it needs to be refreshed with few additional patches and fixes. It will probably take couple of releases before it hits mainline. So, I guess it is then a question of picking up the pdata quirks solution for interim to get the driver functional until the reset framework hits mainline, or mark the driver as broken.
regards
Suman
Quoted 2 lines
Quoted 11 lines · Suman Anna
Quoted 1 line · Kishon Vijay Abraham I
Hi,
+ Tero, Tony and linux-omap
Quoted 6 lines · Richard Cochran
Quoted 4 lines
The dra7xx-evm box freezes hard at the very first PCI bus access, the call to in
dra7xx_pcie_readl()indra7xx_pcie_probe().
Quoted 6 lines
Quoted 2 lines
Quoted 2 lines
The out-of-tree 3.14.53 TI driver performs a reset via platform data, calling
omap_device_assert_hardreset()by hook and crook.Yeah, this is the only feasible way and not break multi-arch atm until a reset framework is in place. We have couple of drivers (
omap_iommuandwkup_m3_rproc) following this approach.
Sounds like doing reset with platform data is the way to go until the reset controller works.
Regards,
Tony
Hi,
Quoted 15 lines · Tony Lindgren
Quoted 14 lines · Suman Anna
Quoted 1 line · Kishon Vijay Abraham I
Hi,
+ Tero, Tony and linux-omap
Quoted 8 lines · Richard Cochran
Quoted 6 lines
The dra7xx-evm box freezes hard at the very first PCI bus access, the call to in
dra7xx_pcie_readl()indra7xx_pcie_probe().The out-of-tree 3.14.53 TI driver performs a reset via platform data, calling
omap_device_assert_hardreset()by hook and crook.
Quoted 6 lines
Quoted 3 lines
Yeah, this is the only feasible way and not break multi-arch atm until a reset framework is in place. We have couple of drivers (
omap_iommuandwkup_m3_rproc) following this approach.Sounds like doing reset with platform data is the way to go until the reset controller works.
All right. I'll post the patch to do reset using platform data.
Thanks
Kishon
Quoted 1 line · Kishon Vijay Abraham I
All right. I'll post the patch to do reset using platform data.
Thanks for taking care of this.
BTW, I am trying to get a new board working. Are there any *other* dra7xx peripherals I should know about, or is the mainline stuff all working?
Thanks,
Richard
Hi,
Quoted 8 lines · Richard Cochran
Quoted 1 line · Kishon Vijay Abraham I
All right. I'll post the patch to do reset using platform data.
Thanks for taking care of this.
BTW, I am trying to get a new board working. Are there any *other* dra7xx peripherals I should know about, or is the mainline stuff all working?
Nothing that I'm aware of. I've tested Ethernet, USB, SATA, MMC and PCIe (with reset changes) myself. PCI was the only device that needed out of tree patches.
Thanks
Kishon