Skip to contentSkip to conversation

dra7xx pci driver broken on dra7xx-evm

PATCH New Richard Cochran 5 participants 13 messages Jan 6, 2016 – Jan 11, 2016 PCI

lore
Share & tools
lore
#0 lore raw

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

#1 lore raw

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() 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?

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

#2 lore raw
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

#3 lore raw

PATCH 1/1 arm: pci: mark the dra7xx driver as broken

In reply to Kishon Vijay Abraham I

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.

---
 drivers/pci/host/Kconfig | 1 +
 1 file changed, 1 insertion(+)
drivers/pci/host/Kconfig +1 -0
index d5e58ba..d83e8f0 100644
@@ -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
#4 lore raw

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.

---
 drivers/pci/host/Kconfig | 1 +
 1 file changed, 1 insertion(+)
drivers/pci/host/Kconfig +0 -0
index d5e58ba..d83e8f0 100644

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 -0
 	help
 	 Enables support for the PCIe controller in the DRA7xx SoC.  There
 	 are two instances of PCIe controller in DRA7xx.  This controller can
#5 lore raw

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.dtsi and when that reset piece is added enable it back in dra7-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

maintainer
#6 lore raw

PATCH 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.dtsi and when that reset piece is added enable it back in dra7-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

#7 lore raw

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.dtsi and when that reset piece is added enable it back in dra7-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

#8 lore raw
In reply to Kishon Vijay Abraham I
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() 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.

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

[1] -> https://patches.linaro.org/33797/

[2] http://marc.info/?l=linux-omap&m=144310496514782&w=2

#9 lore raw
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() in dra7xx_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_iommu and wkup_m3_rproc) following this approach.

Sounds like doing reset with platform data is the way to go until the reset controller works.

Regards,

Tony

#10 lore raw

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() 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.

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_iommu and wkup_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

#11 lore raw
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

#12 lore raw

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