PCI: tegra: Enable opportunistic UpdateFC and ACK [Linux 5.3]

This Linux kernel change "PCI: tegra: Enable opportunistic UpdateFC and ACK" is included in the Linux 5.3 release. This change is authored by Manikanta Maddireddy <mmaddireddy [at] nvidia.com> on Tue Jun 18 23:31:48 2019 +0530. The commit for this change in Linux stable tree is 7763cc2 (patch).

PCI: tegra: Enable opportunistic UpdateFC and ACK

Enable opportunistic UpdateFC and ACK to allow data link layer send
pending ACKs and UpdateFC packets when link is idle instead of waiting
for timers to expire. This improves the PCIe performance due to better
utilization of PCIe bandwidth.

Signed-off-by: Manikanta Maddireddy <mmaddireddy@nvidia.com>
Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Acked-by: Thierry Reding <treding@nvidia.com>

There are 10 lines of Linux source code added/deleted in this change. Code changes to Linux kernel are as follows.

 drivers/pci/controller/pci-tegra.c | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/drivers/pci/controller/pci-tegra.c b/drivers/pci/controller/pci-tegra.c
index 2d0a23b..cd69c43 100644
--- a/drivers/pci/controller/pci-tegra.c
+++ b/drivers/pci/controller/pci-tegra.c
@@ -204,7 +204,9 @@
 #define  RP_ECTL_6_R2_RX_EQ_CTRL_H_1C_MASK 0xffffffff

 #define RP_VEND_XP 0x00000f00
-#define  RP_VEND_XP_DL_UP  (1 << 30)
+#define  RP_VEND_XP_DL_UP          (1 << 30)
+#define  RP_VEND_XP_OPPORTUNISTIC_ACK      (1 << 27)
+#define  RP_VEND_XP_OPPORTUNISTIC_UPDATEFC (1 << 28)

 #define RP_VEND_CTL1   0x00000f48
 #define  RP_VEND_CTL1_ERPT (1 << 13)
@@ -529,6 +531,12 @@ static void tegra_pcie_enable_rp_features(struct tegra_pcie_port *port)
    value = readl(port->base + RP_VEND_CTL1);
    value |= RP_VEND_CTL1_ERPT;
    writel(value, port->base + RP_VEND_CTL1);
+
+   /* Optimal settings to enhance bandwidth */
+   value = readl(port->base + RP_VEND_XP);
+   value |= RP_VEND_XP_OPPORTUNISTIC_ACK;
+   value |= RP_VEND_XP_OPPORTUNISTIC_UPDATEFC;
+   writel(value, port->base + RP_VEND_XP);
 }

 static void tegra_pcie_program_ectl_settings(struct tegra_pcie_port *port)

Leave a Reply

Your email address will not be published. Required fields are marked *