Skip to content

Commit f889102

Browse files
committed
Merge branch 'pci/endpoint'
- Simplify pci_epf_test_alloc_space() by using pci_epc_get_next_free_bar() as other similar iterators do (Niklas Cassel) - Configure endpoint BARs as 64-bit if that's all the hardware supports, in addition to doing it if the BAR size is larger than 2GB (Niklas Cassel) - Remove superfluous pci_epf_configure_bar(), since pci_epf_alloc_space() now contains that functionality (Niklas Cassel) - Simplify pci_epf_test_set_bar() (Niklas Cassel) - Clean up pci_epf_test_unbind() to reduce indentation level (Niklas Cassel) * pci/endpoint: PCI: endpoint: pci-epf-test: Clean up pci_epf_test_unbind() PCI: endpoint: pci-epf-test: Simplify pci_epf_test_set_bar() loop PCI: endpoint: pci-epf-test: Remove superfluous code PCI: endpoint: Allocate a 64-bit BAR if that is the only option PCI: endpoint: pci-epf-test: Simplify pci_epf_test_alloc_space() loop
2 parents 24ffb8c + 597ac0f commit f889102

File tree

2 files changed

+21
-50
lines changed

2 files changed

+21
-50
lines changed

drivers/pci/endpoint/functions/pci-epf-test.c

Lines changed: 15 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -690,50 +690,35 @@ static void pci_epf_test_unbind(struct pci_epf *epf)
690690
{
691691
struct pci_epf_test *epf_test = epf_get_drvdata(epf);
692692
struct pci_epc *epc = epf->epc;
693-
struct pci_epf_bar *epf_bar;
694693
int bar;
695694

696695
cancel_delayed_work(&epf_test->cmd_handler);
697696
pci_epf_test_clean_dma_chan(epf_test);
698697
for (bar = 0; bar < PCI_STD_NUM_BARS; bar++) {
699-
epf_bar = &epf->bar[bar];
698+
if (!epf_test->reg[bar])
699+
continue;
700700

701-
if (epf_test->reg[bar]) {
702-
pci_epc_clear_bar(epc, epf->func_no, epf->vfunc_no,
703-
epf_bar);
704-
pci_epf_free_space(epf, epf_test->reg[bar], bar,
705-
PRIMARY_INTERFACE);
706-
}
701+
pci_epc_clear_bar(epc, epf->func_no, epf->vfunc_no,
702+
&epf->bar[bar]);
703+
pci_epf_free_space(epf, epf_test->reg[bar], bar,
704+
PRIMARY_INTERFACE);
707705
}
708706
}
709707

710708
static int pci_epf_test_set_bar(struct pci_epf *epf)
711709
{
712-
int bar, add;
713-
int ret;
714-
struct pci_epf_bar *epf_bar;
710+
int bar, ret;
715711
struct pci_epc *epc = epf->epc;
716712
struct device *dev = &epf->dev;
717713
struct pci_epf_test *epf_test = epf_get_drvdata(epf);
718714
enum pci_barno test_reg_bar = epf_test->test_reg_bar;
719-
const struct pci_epc_features *epc_features;
720-
721-
epc_features = epf_test->epc_features;
722-
723-
for (bar = 0; bar < PCI_STD_NUM_BARS; bar += add) {
724-
epf_bar = &epf->bar[bar];
725-
/*
726-
* pci_epc_set_bar() sets PCI_BASE_ADDRESS_MEM_TYPE_64
727-
* if the specific implementation required a 64-bit BAR,
728-
* even if we only requested a 32-bit BAR.
729-
*/
730-
add = (epf_bar->flags & PCI_BASE_ADDRESS_MEM_TYPE_64) ? 2 : 1;
731715

732-
if (epc_features->bar[bar].type == BAR_RESERVED)
716+
for (bar = 0; bar < PCI_STD_NUM_BARS; bar++) {
717+
if (!epf_test->reg[bar])
733718
continue;
734719

735720
ret = pci_epc_set_bar(epc, epf->func_no, epf->vfunc_no,
736-
epf_bar);
721+
&epf->bar[bar]);
737722
if (ret) {
738723
pci_epf_free_space(epf, epf_test->reg[bar], bar,
739724
PRIMARY_INTERFACE);
@@ -822,14 +807,13 @@ static int pci_epf_test_alloc_space(struct pci_epf *epf)
822807
{
823808
struct pci_epf_test *epf_test = epf_get_drvdata(epf);
824809
struct device *dev = &epf->dev;
825-
struct pci_epf_bar *epf_bar;
826810
size_t msix_table_size = 0;
827811
size_t test_reg_bar_size;
828812
size_t pba_size = 0;
829813
bool msix_capable;
830814
void *base;
831-
int bar, add;
832815
enum pci_barno test_reg_bar = epf_test->test_reg_bar;
816+
enum pci_barno bar;
833817
const struct pci_epc_features *epc_features;
834818
size_t test_reg_size;
835819

@@ -854,16 +838,14 @@ static int pci_epf_test_alloc_space(struct pci_epf *epf)
854838
}
855839
epf_test->reg[test_reg_bar] = base;
856840

857-
for (bar = 0; bar < PCI_STD_NUM_BARS; bar += add) {
858-
epf_bar = &epf->bar[bar];
859-
add = (epf_bar->flags & PCI_BASE_ADDRESS_MEM_TYPE_64) ? 2 : 1;
841+
for (bar = BAR_0; bar < PCI_STD_NUM_BARS; bar++) {
842+
bar = pci_epc_get_next_free_bar(epc_features, bar);
843+
if (bar == NO_BAR)
844+
break;
860845

861846
if (bar == test_reg_bar)
862847
continue;
863848

864-
if (epc_features->bar[bar].type == BAR_RESERVED)
865-
continue;
866-
867849
base = pci_epf_alloc_space(epf, bar_size[bar], bar,
868850
epc_features, PRIMARY_INTERFACE);
869851
if (!base)
@@ -875,19 +857,6 @@ static int pci_epf_test_alloc_space(struct pci_epf *epf)
875857
return 0;
876858
}
877859

878-
static void pci_epf_configure_bar(struct pci_epf *epf,
879-
const struct pci_epc_features *epc_features)
880-
{
881-
struct pci_epf_bar *epf_bar;
882-
int i;
883-
884-
for (i = 0; i < PCI_STD_NUM_BARS; i++) {
885-
epf_bar = &epf->bar[i];
886-
if (epc_features->bar[i].only_64bit)
887-
epf_bar->flags |= PCI_BASE_ADDRESS_MEM_TYPE_64;
888-
}
889-
}
890-
891860
static int pci_epf_test_bind(struct pci_epf *epf)
892861
{
893862
int ret;
@@ -908,7 +877,6 @@ static int pci_epf_test_bind(struct pci_epf *epf)
908877
test_reg_bar = pci_epc_get_first_free_bar(epc_features);
909878
if (test_reg_bar < 0)
910879
return -EINVAL;
911-
pci_epf_configure_bar(epf, epc_features);
912880

913881
epf_test->test_reg_bar = test_reg_bar;
914882
epf_test->epc_features = epc_features;

drivers/pci/endpoint/pci-epf-core.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,8 @@ EXPORT_SYMBOL_GPL(pci_epf_free_space);
255255
* @type: Identifies if the allocation is for primary EPC or secondary EPC
256256
*
257257
* Invoke to allocate memory for the PCI EPF register space.
258+
* Flag PCI_BASE_ADDRESS_MEM_TYPE_64 will automatically get set if the BAR
259+
* can only be a 64-bit BAR, or if the requested size is larger than 2 GB.
258260
*/
259261
void *pci_epf_alloc_space(struct pci_epf *epf, size_t size, enum pci_barno bar,
260262
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,
304306
epf_bar[bar].addr = space;
305307
epf_bar[bar].size = size;
306308
epf_bar[bar].barno = bar;
307-
epf_bar[bar].flags |= upper_32_bits(size) ?
308-
PCI_BASE_ADDRESS_MEM_TYPE_64 :
309-
PCI_BASE_ADDRESS_MEM_TYPE_32;
309+
if (upper_32_bits(size) || epc_features->bar[bar].only_64bit)
310+
epf_bar[bar].flags |= PCI_BASE_ADDRESS_MEM_TYPE_64;
311+
else
312+
epf_bar[bar].flags |= PCI_BASE_ADDRESS_MEM_TYPE_32;
310313

311314
return space;
312315
}

0 commit comments

Comments
 (0)