Takashi Iwai 6a9585
From d60a2e281e9de2b2f67343b2e39417ca0f4fd54e Mon Sep 17 00:00:00 2001
Takashi Iwai 6a9585
From: Serge Semin <Sergey.Semin@baikalelectronics.ru>
Takashi Iwai 6a9585
Date: Fri, 24 Jun 2022 17:34:13 +0300
Takashi Iwai 6a9585
Subject: [PATCH] PCI: dwc: Disable outbound windows only for controllers using iATU
Takashi Iwai 6a9585
Git-commit: d60a2e281e9de2b2f67343b2e39417ca0f4fd54e
Takashi Iwai 6a9585
Patch-mainline: v6.0-rc1
Takashi Iwai 6a9585
References: git-fixes
Takashi Iwai 6a9585
Takashi Iwai 6a9585
Some DWC-based controllers (e.g., pcie-al.c and pci-keystone.c, identified
Takashi Iwai 6a9585
by the fact that they override the default dw_child_pcie_ops) use their own
Takashi Iwai 6a9585
address translation approach instead of the DWC internal ATU (iATU).  For
Takashi Iwai 6a9585
those controllers, skip disabling the iATU outbound windows.
Takashi Iwai 6a9585
Takashi Iwai 6a9585
[bhelgaas: commit log, update multiple window comment]
Takashi Iwai 6a9585
Fixes: 458ad06c4cdd ("PCI: dwc: Ensure all outbound ATU windows are reset")
Takashi Iwai 6a9585
Link: https://lore.kernel.org/r/20220624143428.8334-4-Sergey.Semin@baikalelectronics.ru
Takashi Iwai 6a9585
Tested-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
Takashi Iwai 6a9585
Signed-off-by: Serge Semin <Sergey.Semin@baikalelectronics.ru>
Takashi Iwai 6a9585
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Takashi Iwai 6a9585
Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
Takashi Iwai 6a9585
Reviewed-by: Rob Herring <robh@kernel.org>
Takashi Iwai 6a9585
Acked-by: Takashi Iwai <tiwai@suse.de>
Takashi Iwai 6a9585
Takashi Iwai 6a9585
---
Takashi Iwai 6a9585
 drivers/pci/controller/dwc/pcie-designware-host.c | 14 ++++++++------
Takashi Iwai 6a9585
 1 file changed, 8 insertions(+), 6 deletions(-)
Takashi Iwai 6a9585
Takashi Iwai 6a9585
diff --git a/drivers/pci/controller/dwc/pcie-designware-host.c b/drivers/pci/controller/dwc/pcie-designware-host.c
Takashi Iwai 6a9585
index bc9a7df130ef..d0d768f22ac3 100644
Takashi Iwai 6a9585
--- a/drivers/pci/controller/dwc/pcie-designware-host.c
Takashi Iwai 6a9585
+++ b/drivers/pci/controller/dwc/pcie-designware-host.c
Takashi Iwai 6a9585
@@ -543,7 +543,6 @@ static struct pci_ops dw_pcie_ops = {
Takashi Iwai 6a9585
 
Takashi Iwai 6a9585
 void dw_pcie_setup_rc(struct pcie_port *pp)
Takashi Iwai 6a9585
 {
Takashi Iwai 6a9585
-	int i;
Takashi Iwai 6a9585
 	u32 val, ctrl, num_ctrls;
Takashi Iwai 6a9585
 	struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
Takashi Iwai 6a9585
 
Takashi Iwai 6a9585
@@ -594,19 +593,22 @@ void dw_pcie_setup_rc(struct pcie_port *pp)
Takashi Iwai 6a9585
 		PCI_COMMAND_MASTER | PCI_COMMAND_SERR;
Takashi Iwai 6a9585
 	dw_pcie_writel_dbi(pci, PCI_COMMAND, val);
Takashi Iwai 6a9585
 
Takashi Iwai 6a9585
-	/* Ensure all outbound windows are disabled so there are multiple matches */
Takashi Iwai 6a9585
-	for (i = 0; i < pci->num_ob_windows; i++)
Takashi Iwai 6a9585
-		dw_pcie_disable_atu(pci, i, DW_PCIE_REGION_OUTBOUND);
Takashi Iwai 6a9585
-
Takashi Iwai 6a9585
 	/*
Takashi Iwai 6a9585
 	 * If the platform provides its own child bus config accesses, it means
Takashi Iwai 6a9585
 	 * the platform uses its own address translation component rather than
Takashi Iwai 6a9585
 	 * ATU, so we should not program the ATU here.
Takashi Iwai 6a9585
 	 */
Takashi Iwai 6a9585
 	if (pp->bridge->child_ops == &dw_child_pcie_ops) {
Takashi Iwai 6a9585
-		int atu_idx = 0;
Takashi Iwai 6a9585
+		int i, atu_idx = 0;
Takashi Iwai 6a9585
 		struct resource_entry *entry;
Takashi Iwai 6a9585
 
Takashi Iwai 6a9585
+		/*
Takashi Iwai 6a9585
+		 * Disable all outbound windows to make sure a transaction
Takashi Iwai 6a9585
+		 * can't match multiple windows.
Takashi Iwai 6a9585
+		 */
Takashi Iwai 6a9585
+		for (i = 0; i < pci->num_ob_windows; i++)
Takashi Iwai 6a9585
+			dw_pcie_disable_atu(pci, i, DW_PCIE_REGION_OUTBOUND);
Takashi Iwai 6a9585
+
Takashi Iwai 6a9585
 		/* Get last memory resource entry */
Takashi Iwai 6a9585
 		resource_list_for_each_entry(entry, &pp->bridge->windows) {
Takashi Iwai 6a9585
 			if (resource_type(entry->res) != IORESOURCE_MEM)
Takashi Iwai 6a9585
-- 
Takashi Iwai 6a9585
2.35.3
Takashi Iwai 6a9585