PCI: tegra: Revert tegra124 raw_violation_fixup
authorNicolas Chauvet <kwizart@gmail.com>
Sat, 18 Jul 2020 10:07:10 +0000 (12:07 +0200)
committerLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Mon, 20 Jul 2020 11:16:16 +0000 (12:16 +0100)
As reported in https://bugzilla.kernel.org/206217 , raw_violation_fixup
is causing more harm than good in some common use-cases.

This patch is a partial revert of commit:

191cd6fb5d2c ("PCI: tegra: Add SW fixup for RAW violations")

and fixes the following regression since then.

* Description:

When both the NIC and MMC are used one can see the following message:

  NETDEV WATCHDOG: enp1s0 (r8169): transmit queue 0 timed out

and

  pcieport 0000:00:02.0: AER: Uncorrected (Non-Fatal) error received: 0000:01:00.0
  r8169 0000:01:00.0: AER: PCIe Bus Error: severity=Uncorrected (Non-Fatal), type=Transaction Layer, (Requester ID)
  r8169 0000:01:00.0: AER:   device [10ec:8168] error status/mask=00004000/00400000
  r8169 0000:01:00.0: AER:    [14] CmpltTO                (First)
  r8169 0000:01:00.0: AER: can't recover (no error_detected callback)
  pcieport 0000:00:02.0: AER: device recovery failed

After that, the ethernet NIC is not functional anymore even after
reloading the r8169 module. After a reboot, this is reproducible by
copying a large file over the NIC to the MMC.

For some reason this is not reproducible when files are copied to a tmpfs.

* Little background on the fixup, by Manikanta Maddireddy:
  "In the internal testing with dGPU on Tegra124, CmplTO is reported by
dGPU. This happened because FIFO queue in AFI(AXI to PCIe) module
get full by upstream posted writes. Back to back upstream writes
interleaved with infrequent reads, triggers RAW violation and CmpltTO.
This is fixed by reducing the posted write credits and by changing
updateFC timer frequency. These settings are fixed after stress test.

In the current case, RTL NIC is also reporting CmplTO. These settings
seems to be aggravating the issue instead of fixing it."

Link: https://lore.kernel.org/r/20200718100710.15398-1-kwizart@gmail.com
Fixes: 191cd6fb5d2c ("PCI: tegra: Add SW fixup for RAW violations")
Signed-off-by: Nicolas Chauvet <kwizart@gmail.com>
Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Reviewed-by: Manikanta Maddireddy <mmaddireddy@nvidia.com>
Cc: stable@vger.kernel.org
drivers/pci/controller/pci-tegra.c

index 235b456..b532d50 100644 (file)
 
 #define AFI_PEXBIAS_CTRL_0             0x168
 
-#define RP_PRIV_XP_DL          0x00000494
-#define  RP_PRIV_XP_DL_GEN2_UPD_FC_TSHOLD      (0x1ff << 1)
-
-#define RP_RX_HDR_LIMIT                0x00000e00
-#define  RP_RX_HDR_LIMIT_PW_MASK       (0xff << 8)
-#define  RP_RX_HDR_LIMIT_PW            (0x0e << 8)
-
 #define RP_ECTL_2_R1   0x00000e84
 #define  RP_ECTL_2_R1_RX_CTLE_1C_MASK          0xffff
 
@@ -323,7 +316,6 @@ struct tegra_pcie_soc {
        bool program_uphy;
        bool update_clamp_threshold;
        bool program_deskew_time;
-       bool raw_violation_fixup;
        bool update_fc_timer;
        bool has_cache_bars;
        struct {
@@ -659,23 +651,6 @@ static void tegra_pcie_apply_sw_fixup(struct tegra_pcie_port *port)
                writel(value, port->base + RP_VEND_CTL0);
        }
 
-       /* Fixup for read after write violation. */
-       if (soc->raw_violation_fixup) {
-               value = readl(port->base + RP_RX_HDR_LIMIT);
-               value &= ~RP_RX_HDR_LIMIT_PW_MASK;
-               value |= RP_RX_HDR_LIMIT_PW;
-               writel(value, port->base + RP_RX_HDR_LIMIT);
-
-               value = readl(port->base + RP_PRIV_XP_DL);
-               value |= RP_PRIV_XP_DL_GEN2_UPD_FC_TSHOLD;
-               writel(value, port->base + RP_PRIV_XP_DL);
-
-               value = readl(port->base + RP_VEND_XP);
-               value &= ~RP_VEND_XP_UPDATE_FC_THRESHOLD_MASK;
-               value |= soc->update_fc_threshold;
-               writel(value, port->base + RP_VEND_XP);
-       }
-
        if (soc->update_fc_timer) {
                value = readl(port->base + RP_VEND_XP);
                value &= ~RP_VEND_XP_UPDATE_FC_THRESHOLD_MASK;
@@ -2416,7 +2391,6 @@ static const struct tegra_pcie_soc tegra20_pcie = {
        .program_uphy = true,
        .update_clamp_threshold = false,
        .program_deskew_time = false,
-       .raw_violation_fixup = false,
        .update_fc_timer = false,
        .has_cache_bars = true,
        .ectl.enable = false,
@@ -2446,7 +2420,6 @@ static const struct tegra_pcie_soc tegra30_pcie = {
        .program_uphy = true,
        .update_clamp_threshold = false,
        .program_deskew_time = false,
-       .raw_violation_fixup = false,
        .update_fc_timer = false,
        .has_cache_bars = false,
        .ectl.enable = false,
@@ -2459,8 +2432,6 @@ static const struct tegra_pcie_soc tegra124_pcie = {
        .pads_pll_ctl = PADS_PLL_CTL_TEGRA30,
        .tx_ref_sel = PADS_PLL_CTL_TXCLKREF_BUF_EN,
        .pads_refclk_cfg0 = 0x44ac44ac,
-       /* FC threshold is bit[25:18] */
-       .update_fc_threshold = 0x03fc0000,
        .has_pex_clkreq_en = true,
        .has_pex_bias_ctrl = true,
        .has_intr_prsnt_sense = true,
@@ -2470,7 +2441,6 @@ static const struct tegra_pcie_soc tegra124_pcie = {
        .program_uphy = true,
        .update_clamp_threshold = true,
        .program_deskew_time = false,
-       .raw_violation_fixup = true,
        .update_fc_timer = false,
        .has_cache_bars = false,
        .ectl.enable = false,
@@ -2494,7 +2464,6 @@ static const struct tegra_pcie_soc tegra210_pcie = {
        .program_uphy = true,
        .update_clamp_threshold = true,
        .program_deskew_time = true,
-       .raw_violation_fixup = false,
        .update_fc_timer = true,
        .has_cache_bars = false,
        .ectl = {
@@ -2536,7 +2505,6 @@ static const struct tegra_pcie_soc tegra186_pcie = {
        .program_uphy = false,
        .update_clamp_threshold = false,
        .program_deskew_time = false,
-       .raw_violation_fixup = false,
        .update_fc_timer = false,
        .has_cache_bars = false,
        .ectl.enable = false,