PCI: cadence: Set a 64-bit BAR if requested
authorNiklas Cassel <cassel@kernel.org>
Wed, 20 Mar 2024 11:31:53 +0000 (12:31 +0100)
committerKrzysztof Wilczyński <kwilczynski@kernel.org>
Wed, 10 Apr 2024 17:31:16 +0000 (17:31 +0000)
Ever since commit f25b5fae29d4 ("PCI: endpoint: Setting a BAR size > 4 GB
is invalid if 64-bit flag is not set") it has been impossible to get the
.set_bar() callback with a BAR size > 2 GB (yes, 2GB!), if the BAR was
also not requested to be configured as a 64-bit BAR.

Thus, forcing setting the 64-bit flag for BARs larger than 2 GB in the
lower level driver is dead code and can be removed.

It is however possible that an EPF driver configures a BAR as 64-bit,
even if the requested size is < 4 GB.

Respect the requested BAR configuration, just like how it is already
respected with regards to the prefetchable bit.

Link: https://lore.kernel.org/linux-pci/20240320113157.322695-7-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>
drivers/pci/controller/cadence/pcie-cadence-ep.c

index 81c50dc64da96f4c7182e9fc3b19a22d6d04ea0d..068082a311c49c453143c39390c9218b5af6c32d 100644 (file)
@@ -99,14 +99,11 @@ static int cdns_pcie_ep_set_bar(struct pci_epc *epc, u8 fn, u8 vfn,
                ctrl = CDNS_PCIE_LM_BAR_CFG_CTRL_IO_32BITS;
        } else {
                bool is_prefetch = !!(flags & PCI_BASE_ADDRESS_MEM_PREFETCH);
-               bool is_64bits = sz > SZ_2G;
+               bool is_64bits = !!(flags & PCI_BASE_ADDRESS_MEM_TYPE_64);
 
                if (is_64bits && (bar & 1))
                        return -EINVAL;
 
-               if (is_64bits && !(flags & PCI_BASE_ADDRESS_MEM_TYPE_64))
-                       epf_bar->flags |= PCI_BASE_ADDRESS_MEM_TYPE_64;
-
                if (is_64bits && is_prefetch)
                        ctrl = CDNS_PCIE_LM_BAR_CFG_CTRL_PREFETCH_MEM_64BITS;
                else if (is_prefetch)