@@ -698,6 +698,9 @@ static int pci_epf_test_set_bar(struct pci_epf *epf)
if (!epf_test->reg[bar])
continue;
+ if (epf_test->epc_features->bar[bar].fixed_addr)
+ continue;
+
ret = pci_epc_set_bar(epc, epf->func_no, epf->vfunc_no,
&epf->bar[bar]);
if (ret) {
@@ -722,6 +725,9 @@ static void pci_epf_test_clear_bar(struct pci_epf *epf)
if (!epf_test->reg[bar])
continue;
+ if (epf_test->epc_features->bar[bar].fixed_addr)
+ continue;
+
pci_epc_clear_bar(epc, epf->func_no, epf->vfunc_no,
&epf->bar[bar]);
}
@@ -829,6 +835,7 @@ static int pci_epf_test_alloc_space(struct pci_epf *epf)
enum pci_barno bar;
const struct pci_epc_features *epc_features = epf_test->epc_features;
size_t test_reg_size;
+ int ret;
test_reg_bar_size = ALIGN(sizeof(struct pci_epf_test_reg), 128);
@@ -840,8 +847,19 @@ static int pci_epf_test_alloc_space(struct pci_epf *epf)
}
test_reg_size = test_reg_bar_size + msix_table_size + pba_size;
- base = pci_epf_alloc_space(epf, test_reg_size, test_reg_bar,
- epc_features, PRIMARY_INTERFACE);
+ if (!epc_features->bar[test_reg_bar].fixed_addr)
+ base = pci_epf_alloc_space(epf, test_reg_size, test_reg_bar,
+ epc_features, PRIMARY_INTERFACE);
+ else {
+ ret = pci_epc_get_bar(epf->epc, epf->func_no, epf->vfunc_no,
+ test_reg_bar, &epf->bar[test_reg_bar]);
+ if (ret < 0) {
+ dev_err(dev, "Failed to get fixed address BAR\n");
+ return ret;
+ }
+ base = epf->bar[test_reg_bar].addr;
+ }
+
if (!base) {
dev_err(dev, "Failed to allocated register space\n");
return -ENOMEM;
@@ -856,8 +874,20 @@ static int pci_epf_test_alloc_space(struct pci_epf *epf)
if (bar == test_reg_bar)
continue;
- base = pci_epf_alloc_space(epf, bar_size[bar], bar,
- epc_features, PRIMARY_INTERFACE);
+ if (!epc_features->bar[bar].fixed_addr)
+ base = pci_epf_alloc_space(epf, bar_size[bar], bar,
+ epc_features,
+ PRIMARY_INTERFACE);
+ else {
+ ret = pci_epc_get_bar(epf->epc, epf->func_no,
+ epf->vfunc_no, bar,
+ &epf->bar[bar]);
+ if (ret < 0)
+ base = NULL;
+ else
+ base = epf->bar[bar].addr;
+ }
+
if (!base)
dev_err(dev, "Failed to allocate space for BAR%d\n",
bar);
This patch demonstates how the new 'get_bar' API for fixed address PCI BARs is used alongside the previous 'pci_epf_alloa_space' and 'set_bar'. Signed-off-by: Rick Wertenbroek <rick.wertenbroek@gmail.com> --- drivers/pci/endpoint/functions/pci-epf-test.c | 38 +++++++++++++++++-- 1 file changed, 34 insertions(+), 4 deletions(-)