]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
PCI: dwc: Apply ECRC workaround to DesignWare 5.00a as well
authorManikanta Maddireddy <mmaddireddy@nvidia.com>
Tue, 24 Mar 2026 19:07:53 +0000 (00:37 +0530)
committerBjorn Helgaas <bhelgaas@google.com>
Wed, 8 Apr 2026 22:00:23 +0000 (17:00 -0500)
The ECRC (TLP digest) workaround was originally added for DesignWare
version 4.90a. Tegra234 SoC has 5.00a DWC HW version, which has the same
ATU TD override behaviour, so apply the workaround for 5.00a too.

Fixes: a54e19073718 ("PCI: tegra194: Add Tegra234 PCIe support")
Signed-off-by: Manikanta Maddireddy <mmaddireddy@nvidia.com>
Signed-off-by: Manivannan Sadhasivam <mani@kernel.org>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Tested-by: Jon Hunter <jonathanh@nvidia.com>
Reviewed-by: Jon Hunter <jonathanh@nvidia.com>
Reviewed-by: Vidya Sagar <vidyas@nvidia.com>
Link: https://patch.msgid.link/20260324190755.1094879-13-mmaddireddy@nvidia.com
drivers/pci/controller/dwc/pcie-designware.c

index 5741c09dde7f40487c6da6dfd66f7c8d96a74259..bb4e82fbfd5c8cf85a1e6a6f360eca497ebf76a2 100644 (file)
@@ -487,13 +487,13 @@ static inline void dw_pcie_writel_atu_ob(struct dw_pcie *pci, u32 index, u32 reg
 static inline u32 dw_pcie_enable_ecrc(u32 val)
 {
        /*
-        * DesignWare core version 4.90A has a design issue where the 'TD'
-        * bit in the Control register-1 of the ATU outbound region acts
-        * like an override for the ECRC setting, i.e., the presence of TLP
-        * Digest (ECRC) in the outgoing TLPs is solely determined by this
-        * bit. This is contrary to the PCIe spec which says that the
-        * enablement of the ECRC is solely determined by the AER
-        * registers.
+        * DWC versions 0x3530302a and 0x3536322a have a design issue where
+        * the 'TD' bit in the Control register-1 of the ATU outbound
+        * region acts like an override for the ECRC setting, i.e., the
+        * presence of TLP Digest (ECRC) in the outgoing TLPs is solely
+        * determined by this bit. This is contrary to the PCIe spec which
+        * says that the enablement of the ECRC is solely determined by the
+        * AER registers.
         *
         * Because of this, even when the ECRC is enabled through AER
         * registers, the transactions going through ATU won't have TLP
@@ -563,7 +563,7 @@ int dw_pcie_prog_outbound_atu(struct dw_pcie *pci,
        if (upper_32_bits(limit_addr) > upper_32_bits(parent_bus_addr) &&
            dw_pcie_ver_is_ge(pci, 460A))
                val |= PCIE_ATU_INCREASE_REGION_SIZE;
-       if (dw_pcie_ver_is(pci, 490A))
+       if (dw_pcie_ver_is(pci, 490A) || dw_pcie_ver_is(pci, 500A))
                val = dw_pcie_enable_ecrc(val);
        dw_pcie_writel_atu_ob(pci, atu->index, PCIE_ATU_REGION_CTRL1, val);