diff mbox series

PCI: endpoint: Add prefetch bar support

Message ID PH7PR19MB5562C967A2480E2EE980289CA0599@PH7PR19MB5562.namprd19.prod.outlook.com
State New
Headers show
Series PCI: endpoint: Add prefetch bar support | expand

Commit Message

Li Chen Jan. 19, 2022, 10:39 a.m. UTC
Before this commit, epf cannot set bar to be prefetchable.
Prefetchable bar can also help epf device to use bridge's
prefetch memory window.

Signed-off-by: Li Chen <lchen@ambarella.com>
Change-Id: I1691a946d715cc161711d6eef56e7a74678a3578
---
 drivers/pci/endpoint/functions/pci-epf-test.c | 4 ++++
 include/linux/pci-epc.h                       | 2 ++
 2 files changed, 6 insertions(+)

Comments

Bjorn Helgaas Jan. 19, 2022, 8:33 p.m. UTC | #1
On Wed, Jan 19, 2022 at 10:39:49AM +0000, Li Chen wrote:
> Before this commit, epf cannot set bar to be prefetchable.
> Prefetchable bar can also help epf device to use bridge's
> prefetch memory window.

Please capitalize "BAR" in subject and commit log (as you did in
comment below) so we know it's an acronym.

> Signed-off-by: Li Chen <lchen@ambarella.com>
> Change-Id: I1691a946d715cc161711d6eef56e7a74678a3578

Drop the Change-Id since it is not useful upstream.

> ---
>  drivers/pci/endpoint/functions/pci-epf-test.c | 4 ++++
>  include/linux/pci-epc.h                       | 2 ++
>  2 files changed, 6 insertions(+)
> 
> diff --git a/drivers/pci/endpoint/functions/pci-epf-test.c b/drivers/pci/endpoint/functions/pci-epf-test.c
> index 90d84d3bc868..96489cfdf58d 100644
> --- a/drivers/pci/endpoint/functions/pci-epf-test.c
> +++ b/drivers/pci/endpoint/functions/pci-epf-test.c
> @@ -817,15 +817,19 @@ static void pci_epf_configure_bar(struct pci_epf *epf,
>  {
>  	struct pci_epf_bar *epf_bar;
>  	bool bar_fixed_64bit;
> +	bool bar_prefetch;
>  	int i;
>  
>  	for (i = 0; i < PCI_STD_NUM_BARS; i++) {
>  		epf_bar = &epf->bar[i];
>  		bar_fixed_64bit = !!(epc_features->bar_fixed_64bit & (1 << i));
> +		bar_prefetch = !!(epc_features->bar_prefetch & (1 << i));
>  		if (bar_fixed_64bit)
>  			epf_bar->flags |= PCI_BASE_ADDRESS_MEM_TYPE_64;
>  		if (epc_features->bar_fixed_size[i])
>  			bar_size[i] = epc_features->bar_fixed_size[i];
> +		if (bar_prefetch)
> +			epf_bar->flags |= PCI_BASE_ADDRESS_MEM_PREFETCH;
>  	}
>  }
>  
> diff --git a/include/linux/pci-epc.h b/include/linux/pci-epc.h
> index a48778e1a4ee..825632d581d0 100644
> --- a/include/linux/pci-epc.h
> +++ b/include/linux/pci-epc.h
> @@ -161,6 +161,7 @@ struct pci_epc {
>   * @msix_capable: indicate if the endpoint function has MSI-X capability
>   * @reserved_bar: bitmap to indicate reserved BAR unavailable to function driver
>   * @bar_fixed_64bit: bitmap to indicate fixed 64bit BARs
> + * @bar_prefetch: bitmap to indicate prefetchable BARs
>   * @bar_fixed_size: Array specifying the size supported by each BAR
>   * @align: alignment size required for BAR buffer allocation
>   */
> @@ -171,6 +172,7 @@ struct pci_epc_features {
>  	unsigned int	msix_capable : 1;
>  	u8	reserved_bar;
>  	u8	bar_fixed_64bit;
> +	u8	bar_prefetch;
>  	u64	bar_fixed_size[PCI_STD_NUM_BARS];
>  	size_t	align;
>  };
> -- 
> 2.34.1
> 
> Regards,
> Li
> 
> **********************************************************************
> This email and attachments contain Ambarella Proprietary and/or Confidential Information and is intended solely for the use of the individual(s) to whom it is addressed. Any unauthorized review, use, disclosure, distribute, copy, or print is prohibited. If you are not an intended recipient, please contact the sender by reply email and destroy all copies of the original message. Thank you.
diff mbox series

Patch

diff --git a/drivers/pci/endpoint/functions/pci-epf-test.c b/drivers/pci/endpoint/functions/pci-epf-test.c
index 90d84d3bc868..96489cfdf58d 100644
--- a/drivers/pci/endpoint/functions/pci-epf-test.c
+++ b/drivers/pci/endpoint/functions/pci-epf-test.c
@@ -817,15 +817,19 @@  static void pci_epf_configure_bar(struct pci_epf *epf,
 {
 	struct pci_epf_bar *epf_bar;
 	bool bar_fixed_64bit;
+	bool bar_prefetch;
 	int i;
 
 	for (i = 0; i < PCI_STD_NUM_BARS; i++) {
 		epf_bar = &epf->bar[i];
 		bar_fixed_64bit = !!(epc_features->bar_fixed_64bit & (1 << i));
+		bar_prefetch = !!(epc_features->bar_prefetch & (1 << i));
 		if (bar_fixed_64bit)
 			epf_bar->flags |= PCI_BASE_ADDRESS_MEM_TYPE_64;
 		if (epc_features->bar_fixed_size[i])
 			bar_size[i] = epc_features->bar_fixed_size[i];
+		if (bar_prefetch)
+			epf_bar->flags |= PCI_BASE_ADDRESS_MEM_PREFETCH;
 	}
 }
 
diff --git a/include/linux/pci-epc.h b/include/linux/pci-epc.h
index a48778e1a4ee..825632d581d0 100644
--- a/include/linux/pci-epc.h
+++ b/include/linux/pci-epc.h
@@ -161,6 +161,7 @@  struct pci_epc {
  * @msix_capable: indicate if the endpoint function has MSI-X capability
  * @reserved_bar: bitmap to indicate reserved BAR unavailable to function driver
  * @bar_fixed_64bit: bitmap to indicate fixed 64bit BARs
+ * @bar_prefetch: bitmap to indicate prefetchable BARs
  * @bar_fixed_size: Array specifying the size supported by each BAR
  * @align: alignment size required for BAR buffer allocation
  */
@@ -171,6 +172,7 @@  struct pci_epc_features {
 	unsigned int	msix_capable : 1;
 	u8	reserved_bar;
 	u8	bar_fixed_64bit;
+	u8	bar_prefetch;
 	u64	bar_fixed_size[PCI_STD_NUM_BARS];
 	size_t	align;
 };