PCI: dwc: endpoint: Fix advertised resizable BAR size
authorNiklas Cassel <cassel@kernel.org>
Thu, 7 Mar 2024 11:15:20 +0000 (12:15 +0100)
committerKrzysztof Wilczyński <kwilczynski@kernel.org>
Sun, 10 Mar 2024 18:51:01 +0000 (18:51 +0000)
The commit message in commit fc9a77040b04 ("PCI: designware-ep: Configure
Resizable BAR cap to advertise the smallest size") claims that it modifies
the Resizable BAR capability to only advertise support for 1 MB size BARs.

However, the commit writes all zeroes to PCI_REBAR_CAP (the register which
contains the possible BAR sizes that a BAR be resized to).

According to the spec, it is illegal to not have a bit set in
PCI_REBAR_CAP, and 1 MB is the smallest size allowed.

Set bit 4 in PCI_REBAR_CAP, so that we actually advertise support for a
1 MB BAR size.

Before:
        Capabilities: [2e8 v1] Physical Resizable BAR
                BAR 0: current size: 1MB
                BAR 1: current size: 1MB
                BAR 2: current size: 1MB
                BAR 3: current size: 1MB
                BAR 4: current size: 1MB
                BAR 5: current size: 1MB
After:
        Capabilities: [2e8 v1] Physical Resizable BAR
                BAR 0: current size: 1MB, supported: 1MB
                BAR 1: current size: 1MB, supported: 1MB
                BAR 2: current size: 1MB, supported: 1MB
                BAR 3: current size: 1MB, supported: 1MB
                BAR 4: current size: 1MB, supported: 1MB
                BAR 5: current size: 1MB, supported: 1MB

Fixes: fc9a77040b04 ("PCI: designware-ep: Configure Resizable BAR cap to advertise the smallest size")
Link: https://lore.kernel.org/linux-pci/20240307111520.3303774-1-cassel@kernel.org
Signed-off-by: Niklas Cassel <cassel@kernel.org>
Signed-off-by: Krzysztof Wilczyński <kwilczynski@kernel.org>
Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
Cc: <stable@vger.kernel.org> # 5.2
drivers/pci/controller/dwc/pcie-designware-ep.c

index 5befed2dc02b70bc5f4593b6e04a173e8e7ded08..389daebc4316192acb6e386af78ec8f299b2959a 100644 (file)
@@ -627,8 +627,13 @@ int dw_pcie_ep_init_complete(struct dw_pcie_ep *ep)
                nbars = (reg & PCI_REBAR_CTRL_NBAR_MASK) >>
                        PCI_REBAR_CTRL_NBAR_SHIFT;
 
+               /*
+                * PCIe r6.0, sec 7.8.6.2 require us to support at least one
+                * size in the range from 1 MB to 512 GB. Advertise support
+                * for 1 MB BAR size only.
+                */
                for (i = 0; i < nbars; i++, offset += PCI_REBAR_CTRL)
-                       dw_pcie_writel_dbi(pci, offset + PCI_REBAR_CAP, 0x0);
+                       dw_pcie_writel_dbi(pci, offset + PCI_REBAR_CAP, BIT(4));
        }
 
        /*