PCI: endpoint: Allocate a 64-bit BAR if that is the only option
authorNiklas Cassel <cassel@kernel.org>
Wed, 20 Mar 2024 11:31:49 +0000 (12:31 +0100)
committerKrzysztof Wilczyński <kwilczynski@kernel.org>
Wed, 10 Apr 2024 18:00:52 +0000 (18:00 +0000)
pci_epf_alloc_space() already sets the 64-bit flag if the BAR size is
larger than 2GB, even if the caller did not explicitly request a 64-bit
BAR.

Thus, let pci_epf_alloc_space() also set the 64-bit flag if the hardware
description says that the specific BAR can only be 64-bit.

Link: https://lore.kernel.org/linux-pci/20240320113157.322695-3-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/endpoint/pci-epf-core.c

index 0a28a0b0911b1989dc2a265e0115282db00bc8a3..323f2a60ab16b345ca29f598cc21219d892bfade 100644 (file)
@@ -255,6 +255,8 @@ EXPORT_SYMBOL_GPL(pci_epf_free_space);
  * @type: Identifies if the allocation is for primary EPC or secondary EPC
  *
  * Invoke to allocate memory for the PCI EPF register space.
+ * Flag PCI_BASE_ADDRESS_MEM_TYPE_64 will automatically get set if the BAR
+ * can only be a 64-bit BAR, or if the requested size is larger than 2 GB.
  */
 void *pci_epf_alloc_space(struct pci_epf *epf, size_t size, enum pci_barno bar,
                          const struct pci_epc_features *epc_features,
@@ -304,9 +306,10 @@ void *pci_epf_alloc_space(struct pci_epf *epf, size_t size, enum pci_barno bar,
        epf_bar[bar].addr = space;
        epf_bar[bar].size = size;
        epf_bar[bar].barno = bar;
-       epf_bar[bar].flags |= upper_32_bits(size) ?
-                               PCI_BASE_ADDRESS_MEM_TYPE_64 :
-                               PCI_BASE_ADDRESS_MEM_TYPE_32;
+       if (upper_32_bits(size) || epc_features->bar[bar].only_64bit)
+               epf_bar[bar].flags |= PCI_BASE_ADDRESS_MEM_TYPE_64;
+       else
+               epf_bar[bar].flags |= PCI_BASE_ADDRESS_MEM_TYPE_32;
 
        return space;
 }