diff options
Diffstat (limited to 'drivers/pci/endpoint/functions/pci-epf-test.c')
| -rw-r--r-- | drivers/pci/endpoint/functions/pci-epf-test.c | 80 | 
1 files changed, 20 insertions, 60 deletions
diff --git a/drivers/pci/endpoint/functions/pci-epf-test.c b/drivers/pci/endpoint/functions/pci-epf-test.c index cd4ffb39dcdc..977fb79c1567 100644 --- a/drivers/pci/endpoint/functions/pci-epf-test.c +++ b/drivers/pci/endpoint/functions/pci-epf-test.c @@ -690,50 +690,35 @@ static void pci_epf_test_unbind(struct pci_epf *epf)  {  	struct pci_epf_test *epf_test = epf_get_drvdata(epf);  	struct pci_epc *epc = epf->epc; -	struct pci_epf_bar *epf_bar;  	int bar;  	cancel_delayed_work(&epf_test->cmd_handler);  	pci_epf_test_clean_dma_chan(epf_test);  	for (bar = 0; bar < PCI_STD_NUM_BARS; bar++) { -		epf_bar = &epf->bar[bar]; +		if (!epf_test->reg[bar]) +			continue; -		if (epf_test->reg[bar]) { -			pci_epc_clear_bar(epc, epf->func_no, epf->vfunc_no, -					  epf_bar); -			pci_epf_free_space(epf, epf_test->reg[bar], bar, -					   PRIMARY_INTERFACE); -		} +		pci_epc_clear_bar(epc, epf->func_no, epf->vfunc_no, +				  &epf->bar[bar]); +		pci_epf_free_space(epf, epf_test->reg[bar], bar, +				   PRIMARY_INTERFACE);  	}  }  static int pci_epf_test_set_bar(struct pci_epf *epf)  { -	int bar, add; -	int ret; -	struct pci_epf_bar *epf_bar; +	int bar, ret;  	struct pci_epc *epc = epf->epc;  	struct device *dev = &epf->dev;  	struct pci_epf_test *epf_test = epf_get_drvdata(epf);  	enum pci_barno test_reg_bar = epf_test->test_reg_bar; -	const struct pci_epc_features *epc_features; - -	epc_features = epf_test->epc_features; -	for (bar = 0; bar < PCI_STD_NUM_BARS; bar += add) { -		epf_bar = &epf->bar[bar]; -		/* -		 * pci_epc_set_bar() sets PCI_BASE_ADDRESS_MEM_TYPE_64 -		 * if the specific implementation required a 64-bit BAR, -		 * even if we only requested a 32-bit BAR. -		 */ -		add = (epf_bar->flags & PCI_BASE_ADDRESS_MEM_TYPE_64) ? 2 : 1; - -		if (epc_features->bar[bar].type == BAR_RESERVED) +	for (bar = 0; bar < PCI_STD_NUM_BARS; bar++) { +		if (!epf_test->reg[bar])  			continue;  		ret = pci_epc_set_bar(epc, epf->func_no, epf->vfunc_no, -				      epf_bar); +				      &epf->bar[bar]);  		if (ret) {  			pci_epf_free_space(epf, epf_test->reg[bar], bar,  					   PRIMARY_INTERFACE); @@ -753,6 +738,7 @@ static int pci_epf_test_core_init(struct pci_epf *epf)  	const struct pci_epc_features *epc_features;  	struct pci_epc *epc = epf->epc;  	struct device *dev = &epf->dev; +	bool linkup_notifier = false;  	bool msix_capable = false;  	bool msi_capable = true;  	int ret; @@ -795,6 +781,10 @@ static int pci_epf_test_core_init(struct pci_epf *epf)  		}  	} +	linkup_notifier = epc_features->linkup_notifier; +	if (!linkup_notifier) +		queue_work(kpcitest_workqueue, &epf_test->cmd_handler.work); +  	return 0;  } @@ -817,14 +807,13 @@ static int pci_epf_test_alloc_space(struct pci_epf *epf)  {  	struct pci_epf_test *epf_test = epf_get_drvdata(epf);  	struct device *dev = &epf->dev; -	struct pci_epf_bar *epf_bar;  	size_t msix_table_size = 0;  	size_t test_reg_bar_size;  	size_t pba_size = 0;  	bool msix_capable;  	void *base; -	int bar, add;  	enum pci_barno test_reg_bar = epf_test->test_reg_bar; +	enum pci_barno bar;  	const struct pci_epc_features *epc_features;  	size_t test_reg_size; @@ -849,16 +838,14 @@ static int pci_epf_test_alloc_space(struct pci_epf *epf)  	}  	epf_test->reg[test_reg_bar] = base; -	for (bar = 0; bar < PCI_STD_NUM_BARS; bar += add) { -		epf_bar = &epf->bar[bar]; -		add = (epf_bar->flags & PCI_BASE_ADDRESS_MEM_TYPE_64) ? 2 : 1; +	for (bar = BAR_0; bar < PCI_STD_NUM_BARS; bar++) { +		bar = pci_epc_get_next_free_bar(epc_features, bar); +		if (bar == NO_BAR) +			break;  		if (bar == test_reg_bar)  			continue; -		if (epc_features->bar[bar].type == BAR_RESERVED) -			continue; -  		base = pci_epf_alloc_space(epf, bar_size[bar], bar,  					   epc_features, PRIMARY_INTERFACE);  		if (!base) @@ -870,19 +857,6 @@ static int pci_epf_test_alloc_space(struct pci_epf *epf)  	return 0;  } -static void pci_epf_configure_bar(struct pci_epf *epf, -				  const struct pci_epc_features *epc_features) -{ -	struct pci_epf_bar *epf_bar; -	int i; - -	for (i = 0; i < PCI_STD_NUM_BARS; i++) { -		epf_bar = &epf->bar[i]; -		if (epc_features->bar[i].only_64bit) -			epf_bar->flags |= PCI_BASE_ADDRESS_MEM_TYPE_64; -	} -} -  static int pci_epf_test_bind(struct pci_epf *epf)  {  	int ret; @@ -890,8 +864,6 @@ static int pci_epf_test_bind(struct pci_epf *epf)  	const struct pci_epc_features *epc_features;  	enum pci_barno test_reg_bar = BAR_0;  	struct pci_epc *epc = epf->epc; -	bool linkup_notifier = false; -	bool core_init_notifier = false;  	if (WARN_ON_ONCE(!epc))  		return -EINVAL; @@ -902,12 +874,9 @@ static int pci_epf_test_bind(struct pci_epf *epf)  		return -EOPNOTSUPP;  	} -	linkup_notifier = epc_features->linkup_notifier; -	core_init_notifier = epc_features->core_init_notifier;  	test_reg_bar = pci_epc_get_first_free_bar(epc_features);  	if (test_reg_bar < 0)  		return -EINVAL; -	pci_epf_configure_bar(epf, epc_features);  	epf_test->test_reg_bar = test_reg_bar;  	epf_test->epc_features = epc_features; @@ -916,21 +885,12 @@ static int pci_epf_test_bind(struct pci_epf *epf)  	if (ret)  		return ret; -	if (!core_init_notifier) { -		ret = pci_epf_test_core_init(epf); -		if (ret) -			return ret; -	} -  	epf_test->dma_supported = true;  	ret = pci_epf_test_init_dma_chan(epf_test);  	if (ret)  		epf_test->dma_supported = false; -	if (!linkup_notifier && !core_init_notifier) -		queue_work(kpcitest_workqueue, &epf_test->cmd_handler.work); -  	return 0;  }  |