https://github.com/torvalds/linux
Revision 275e88b06a277ccf89d9c471a777e9b4f8c552b0 authored by Rob Herring on 18 December 2020, 14:39:05 UTC, committed by Bjorn Helgaas on 26 December 2020, 03:58:36 UTC
Commit b9ac0f9dc8ea ("PCI: dwc: Move dw_pcie_setup_rc() to DWC common
code") broke enumeration of downstream devices on Tegra:

In non-working case (next-20201211):

  0001:00:00.0 PCI bridge: NVIDIA Corporation Device 1ad2 (rev a1)
  0001:01:00.0 SATA controller: Marvell Technology Group Ltd. Device 9171 (rev 13)
  0005:00:00.0 PCI bridge: NVIDIA Corporation Device 1ad0 (rev a1)

In working case (v5.10-rc7):

  0001:00:00.0 PCI bridge: Molex Incorporated Device 1ad2 (rev a1)
  0001:01:00.0 SATA controller: Marvell Technology Group Ltd. Device 9171 (rev 13)
  0005:00:00.0 PCI bridge: Molex Incorporated Device 1ad0 (rev a1)
  0005:01:00.0 PCI bridge: PLX Technology, Inc. Device 3380 (rev ab)
  0005:02:02.0 PCI bridge: PLX Technology, Inc. Device 3380 (rev ab)
  0005:03:00.0 USB controller: PLX Technology, Inc. Device 3380 (rev ab)

The problem seems to be dw_pcie_setup_rc() is now called twice before and
after the link up handling. The fix is to move Tegra's link up handling to
.start_link() function like other DWC drivers. Tegra is a bit more
complicated than others as it re-inits the whole DWC controller to retry
the link. With this, the initialization ordering is restored to match the
prior sequence.

Fixes: b9ac0f9dc8ea ("PCI: dwc: Move dw_pcie_setup_rc() to DWC common code")
Link: https://lore.kernel.org/r/20201218143905.1614098-1-robh@kernel.org
Reported-by: Mian Yousaf Kaukab <ykaukab@suse.de>
Tested-by: Mian Yousaf Kaukab <ykaukab@suse.de>
Signed-off-by: Rob Herring <robh@kernel.org>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Cc: Thierry Reding <thierry.reding@gmail.com>
Cc: Jonathan Hunter <jonathanh@nvidia.com>
Cc: Vidya Sagar <vidyas@nvidia.com>
1 parent 255b2d5
Raw File
Tip revision: 275e88b06a277ccf89d9c471a777e9b4f8c552b0 authored by Rob Herring on 18 December 2020, 14:39:05 UTC
PCI: tegra: Fix host link initialization
Tip revision: 275e88b
Kconfig
# SPDX-License-Identifier: GPL-2.0-only
menuconfig RAS
	bool "Reliability, Availability and Serviceability (RAS) features"
	help
	  Reliability, availability and serviceability (RAS) is a computer
	  hardware engineering term. Computers designed with higher levels
	  of RAS have a multitude of features that protect data integrity
	  and help them stay available for long periods of time without
	  failure.

	  Reliability can be defined as the probability that the system will
	  produce correct outputs up to some given time. Reliability is
	  enhanced by features that help to avoid, detect and repair hardware
	  faults.

	  Availability is the probability a system is operational at a given
	  time, i.e. the amount of time a device is actually operating as the
	  percentage of total time it should be operating.

	  Serviceability or maintainability is the simplicity and speed with
	  which a system can be repaired or maintained; if the time to repair
	  a failed system increases, then availability will decrease.

	  Note that Reliability and Availability are distinct concepts:
	  Reliability is a measure of the ability of a system to function
	  correctly, including avoiding data corruption, whereas Availability
	  measures how often it is available for use, even though it may not
	  be functioning correctly. For example, a server may run forever and
	  so have ideal availability, but may be unreliable, with frequent
	  data corruption.

if RAS

source "arch/x86/ras/Kconfig"

endif
back to top