From patchwork Fri Oct 27 19:29:27 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Manikanta Maddireddy X-Patchwork-Id: 10030499 X-Patchwork-Delegate: bhelgaas@google.com Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id C5B876022E for ; Fri, 27 Oct 2017 19:31:27 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id A818028FDF for ; Fri, 27 Oct 2017 19:31:27 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 9A2E528FE8; Fri, 27 Oct 2017 19:31:27 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.9 required=2.0 tests=BAYES_00,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 0AAC128FFF for ; Fri, 27 Oct 2017 19:31:27 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932394AbdJ0Tb0 (ORCPT ); Fri, 27 Oct 2017 15:31:26 -0400 Received: from hqemgate14.nvidia.com ([216.228.121.143]:19705 "EHLO hqemgate14.nvidia.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932176AbdJ0TbZ (ORCPT ); Fri, 27 Oct 2017 15:31:25 -0400 Received: from hqpgpgate101.nvidia.com (Not Verified[216.228.121.13]) by hqemgate14.nvidia.com id ; Fri, 27 Oct 2017 12:31:17 -0700 Received: from HQMAIL103.nvidia.com ([172.20.161.6]) by hqpgpgate101.nvidia.com (PGP Universal service); Fri, 27 Oct 2017 12:31:17 -0700 X-PGP-Universal: processed; by hqpgpgate101.nvidia.com on Fri, 27 Oct 2017 12:31:17 -0700 Received: from HQMAIL103.nvidia.com (172.20.187.11) by HQMAIL103.nvidia.com (172.20.187.11) with Microsoft SMTP Server (TLS) id 15.0.1293.2; Fri, 27 Oct 2017 19:30:51 +0000 Received: from hqnvemgw02.nvidia.com (172.16.227.111) by HQMAIL103.nvidia.com (172.20.187.11) with Microsoft SMTP Server id 15.0.1293.2 via Frontend Transport; Fri, 27 Oct 2017 19:30:51 +0000 Received: from manikanta-pc.nvidia.com (Not Verified[10.19.65.28]) by hqnvemgw02.nvidia.com with Trustwave SEG (v7, 5, 8, 10121) id ; Fri, 27 Oct 2017 12:30:51 -0700 From: Manikanta Maddireddy To: , , CC: , , , , Manikanta Maddireddy Subject: [PATCH 10/12] PCI: tegra: Add SW fixup for RAW violations Date: Sat, 28 Oct 2017 00:59:27 +0530 Message-ID: <1509132569-9398-11-git-send-email-mmaddireddy@nvidia.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1509132569-9398-1-git-send-email-mmaddireddy@nvidia.com> References: <1509132569-9398-1-git-send-email-mmaddireddy@nvidia.com> X-NVConfidentiality: public MIME-Version: 1.0 Sender: linux-pci-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pci@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP The logic which blocks read requests till AFI gets ACK for all outstanding MC writes does not behave correctly when number of outstanding write becomes more than 32. SW fixup to prevent this issue is to limit outstanding posted writes and tweak updateFC timer threshold. Signed-off-by: Manikanta Maddireddy --- drivers/pci/host/pci-tegra.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/drivers/pci/host/pci-tegra.c b/drivers/pci/host/pci-tegra.c index 8fbc5950785a..9680bf7d0a95 100644 --- a/drivers/pci/host/pci-tegra.c +++ b/drivers/pci/host/pci-tegra.c @@ -185,6 +185,13 @@ #define AFI_PEXBIAS_CTRL_0 0x168 +#define RP_PRIV_XP_DL 0x494 +#define RP_PRIV_XP_DL_GEN2_UPD_FC_TSHOLD (0x1ff << 1) + +#define RP_RX_HDR_LIMIT 0xe00 +#define RP_RX_HDR_LIMIT_PW_MASK (0xff << 8) +#define RP_RX_HDR_LIMIT_PW (0x0e << 8) + #define RP_ECTL_2_R1 0xe84 #define RP_ECTL_2_R1_RX_CTLE_1C_MASK 0xffff @@ -213,6 +220,7 @@ #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_XP_UPDATE_FC_THRESHOLD_MASK (0xff << 18) #define RP_VEND_CTL1 0xf48 #define RP_VEND_CTL1_ERPT (1 << 13) @@ -307,6 +315,7 @@ struct tegra_pcie_soc { bool program_uphy; bool program_ectl_settings; bool update_clamp_threshold; + bool RAW_violation_fixup; }; static inline struct tegra_msi *to_tegra_msi(struct msi_controller *chip) @@ -2189,6 +2198,22 @@ static void tegra_pcie_apply_sw_fixup(struct tegra_pcie_port *port) RP_PRIV_MISC_TMS_CLK_CLAMP_THRESHOLD); } writel(value, port->base + RP_PRIV_MISC); + + /* Fixup for read after write violation in T124 & T132 platforms */ + 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; + writel(value, port->base + RP_VEND_XP); + } } /* * FIXME: If there are no PCIe cards attached, then calling this function @@ -2326,6 +2351,7 @@ static const struct tegra_pcie_soc tegra20_pcie = { .program_uphy = true, .program_ectl_settings = false, .update_clamp_threshold = false, + .RAW_violation_fixup = false, }; static const struct tegra_pcie_soc tegra30_pcie = { @@ -2344,6 +2370,7 @@ static const struct tegra_pcie_soc tegra30_pcie = { .program_uphy = true, .program_ectl_settings = false, .update_clamp_threshold = false, + .RAW_violation_fixup = false, }; static const struct tegra_pcie_soc tegra124_pcie = { @@ -2361,6 +2388,7 @@ static const struct tegra_pcie_soc tegra124_pcie = { .program_uphy = true, .program_ectl_settings = false, .update_clamp_threshold = true, + .RAW_violation_fixup = true, }; static const struct tegra_pcie_soc tegra210_pcie = { @@ -2386,6 +2414,7 @@ static const struct tegra_pcie_soc tegra210_pcie = { .program_uphy = true, .program_ectl_settings = true, .update_clamp_threshold = true, + .RAW_violation_fixup = false, }; static const struct tegra_pcie_soc tegra186_pcie = { @@ -2404,6 +2433,7 @@ static const struct tegra_pcie_soc tegra186_pcie = { .program_uphy = false, .program_ectl_settings = false, .update_clamp_threshold = false, + .RAW_violation_fixup = false, }; static const struct of_device_id tegra_pcie_of_match[] = {