]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
PCI: dwc: Ensure all outbound ATU windows are reset
authorRob Herring <robh@kernel.org>
Thu, 5 Nov 2020 21:11:48 +0000 (15:11 -0600)
committerLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Thu, 19 Nov 2020 10:51:41 +0000 (10:51 +0000)
The Layerscape driver clears the ATU registers which may have been
configured by the bootloader. Any driver could have the same issue
and doing it for all drivers doesn't hurt, so let's move it into the
common DWC code.

Link: https://lore.kernel.org/r/20201105211159.1814485-6-robh@kernel.org
Tested-by: Marek Szyprowski <m.szyprowski@samsung.com>
Signed-off-by: Rob Herring <robh@kernel.org>
Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Acked-by: Jingoo Han <jingoohan1@gmail.com>
Cc: Minghuan Lian <minghuan.Lian@nxp.com>
Cc: Mingkai Hu <mingkai.hu@nxp.com>
Cc: Roy Zang <roy.zang@nxp.com>
Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Cc: Bjorn Helgaas <bhelgaas@google.com>
Cc: Jingoo Han <jingoohan1@gmail.com>
Cc: Gustavo Pimentel <gustavo.pimentel@synopsys.com>
Cc: linuxppc-dev@lists.ozlabs.org
drivers/pci/controller/dwc/pci-layerscape.c
drivers/pci/controller/dwc/pcie-designware-host.c

index f24f79a70d9a8dfede7bcdf3af716dccd1b19931..53e56d54c482382eb29591bd1e1dc57ad95a9bda 100644 (file)
@@ -83,14 +83,6 @@ static void ls_pcie_drop_msg_tlp(struct ls_pcie *pcie)
        iowrite32(val, pci->dbi_base + PCIE_STRFMR1);
 }
 
-static void ls_pcie_disable_outbound_atus(struct ls_pcie *pcie)
-{
-       int i;
-
-       for (i = 0; i < PCIE_IATU_NUM; i++)
-               dw_pcie_disable_atu(pcie->pci, i, DW_PCIE_REGION_OUTBOUND);
-}
-
 static int ls1021_pcie_link_up(struct dw_pcie *pci)
 {
        u32 state;
@@ -136,12 +128,6 @@ static int ls_pcie_host_init(struct pcie_port *pp)
        struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
        struct ls_pcie *pcie = to_ls_pcie(pci);
 
-       /*
-        * Disable outbound windows configured by the bootloader to avoid
-        * one transaction hitting multiple outbound windows.
-        * dw_pcie_setup_rc() will reconfigure the outbound windows.
-        */
-       ls_pcie_disable_outbound_atus(pcie);
        ls_pcie_fix_error_response(pcie);
 
        dw_pcie_dbi_ro_wr_en(pci);
index cde45b2076eea1b3edb3b8e75b725a5f0882a113..265a48f1a0aec5c6b83444a25fd56b98ec72d9ac 100644 (file)
@@ -534,6 +534,7 @@ static struct pci_ops dw_pcie_ops = {
 
 void dw_pcie_setup_rc(struct pcie_port *pp)
 {
+       int i;
        u32 val, ctrl, num_ctrls;
        struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
 
@@ -583,6 +584,10 @@ void dw_pcie_setup_rc(struct pcie_port *pp)
                PCI_COMMAND_MASTER | PCI_COMMAND_SERR;
        dw_pcie_writel_dbi(pci, PCI_COMMAND, val);
 
+       /* Ensure all outbound windows are disabled so there are multiple matches */
+       for (i = 0; i < pci->num_viewport; i++)
+               dw_pcie_disable_atu(pci, i, DW_PCIE_REGION_OUTBOUND);
+
        /*
         * If the platform provides its own child bus config accesses, it means
         * the platform uses its own address translation component rather than