2022-01-21 19:10:25

by Li Chen

[permalink] [raw]
Subject: [PATCH] PCI: endpoint: Add prefetch bar support

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 <[email protected]>
Change-Id: I1691a946d715cc161711d6eef56e7a74678a3578
---
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.


2022-01-21 20:03:57

by Bjorn Helgaas

[permalink] [raw]
Subject: Re: [PATCH] PCI: endpoint: Add prefetch bar support

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 <[email protected]>
> 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.