Skip to content

Commit df69e17

Browse files
Mani-Sadhasivamkwilczynski
authored andcommitted
PCI: dwc: ep: Call dw_pcie_ep_init_registers() API directly from all glue drivers
Currently, dw_pcie_ep_init_registers() API is directly called by the glue drivers requiring active refclk from host. But for the other drivers, it is getting called implicitly by dw_pcie_ep_init(). This is due to the fact that this API initializes DWC EP specific registers and that requires an active refclk (either from host or generated locally by endpoint itsef). But, this causes a discrepancy among the glue drivers. So to avoid this confusion, let's call this API directly from all glue drivers irrespective of refclk dependency. Only difference here is that the drivers requiring refclk from host will call this API only after the refclk is received and other drivers without refclk dependency will call this API right after dw_pcie_ep_init(). With this change, the check for 'core_init_notifier' flag can now be dropped from dw_pcie_ep_init() API. This will also allow us to remove the 'core_init_notifier' flag completely in the later commits. Link: https://lore.kernel.org/linux-pci/[email protected] Signed-off-by: Manivannan Sadhasivam <[email protected]> Signed-off-by: Krzysztof Wilczyński <[email protected]> Reviewed-by: Frank Li <[email protected]> Reviewed-by: Niklas Cassel <[email protected]> Reviewed-by: Yoshihiro Shimoda <[email protected]>
1 parent 7d6e64c commit df69e17

File tree

10 files changed

+90
-26
lines changed

10 files changed

+90
-26
lines changed

drivers/pci/controller/dwc/pci-dra7xx.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -467,6 +467,13 @@ static int dra7xx_add_pcie_ep(struct dra7xx_pcie *dra7xx,
467467
return ret;
468468
}
469469

470+
ret = dw_pcie_ep_init_registers(ep);
471+
if (ret) {
472+
dev_err(dev, "Failed to initialize DWC endpoint registers\n");
473+
dw_pcie_ep_deinit(ep);
474+
return ret;
475+
}
476+
470477
return 0;
471478
}
472479

drivers/pci/controller/dwc/pci-imx6.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1123,6 +1123,14 @@ static int imx6_add_pcie_ep(struct imx6_pcie *imx6_pcie,
11231123
dev_err(dev, "failed to initialize endpoint\n");
11241124
return ret;
11251125
}
1126+
1127+
ret = dw_pcie_ep_init_registers(ep);
1128+
if (ret) {
1129+
dev_err(dev, "Failed to initialize DWC endpoint registers\n");
1130+
dw_pcie_ep_deinit(ep);
1131+
return ret;
1132+
}
1133+
11261134
/* Start LTSSM. */
11271135
imx6_pcie_ltssm_enable(dev);
11281136

drivers/pci/controller/dwc/pci-keystone.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1286,6 +1286,13 @@ static int ks_pcie_probe(struct platform_device *pdev)
12861286
ret = dw_pcie_ep_init(&pci->ep);
12871287
if (ret < 0)
12881288
goto err_get_sync;
1289+
1290+
ret = dw_pcie_ep_init_registers(&pci->ep);
1291+
if (ret) {
1292+
dev_err(dev, "Failed to initialize DWC endpoint registers\n");
1293+
goto err_ep_init;
1294+
}
1295+
12891296
break;
12901297
default:
12911298
dev_err(dev, "INVALID device type %d\n", mode);
@@ -1295,6 +1302,8 @@ static int ks_pcie_probe(struct platform_device *pdev)
12951302

12961303
return 0;
12971304

1305+
err_ep_init:
1306+
dw_pcie_ep_deinit(&pci->ep);
12981307
err_get_sync:
12991308
pm_runtime_put(dev);
13001309
pm_runtime_disable(dev);

drivers/pci/controller/dwc/pci-layerscape-ep.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,13 @@ static int __init ls_pcie_ep_probe(struct platform_device *pdev)
279279
if (ret)
280280
return ret;
281281

282+
ret = dw_pcie_ep_init_registers(&pci->ep);
283+
if (ret) {
284+
dev_err(dev, "Failed to initialize DWC endpoint registers\n");
285+
dw_pcie_ep_deinit(&pci->ep);
286+
return ret;
287+
}
288+
282289
return ls_pcie_ep_interrupt_init(pcie, pdev);
283290
}
284291

drivers/pci/controller/dwc/pcie-artpec6.c

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -441,7 +441,18 @@ static int artpec6_pcie_probe(struct platform_device *pdev)
441441

442442
pci->ep.ops = &pcie_ep_ops;
443443

444-
return dw_pcie_ep_init(&pci->ep);
444+
ret = dw_pcie_ep_init(&pci->ep);
445+
if (ret)
446+
return ret;
447+
448+
ret = dw_pcie_ep_init_registers(&pci->ep);
449+
if (ret) {
450+
dev_err(dev, "Failed to initialize DWC endpoint registers\n");
451+
dw_pcie_ep_deinit(&pci->ep);
452+
return ret;
453+
}
454+
455+
break;
445456
default:
446457
dev_err(dev, "INVALID device type %d\n", artpec6_pcie->mode);
447458
}

drivers/pci/controller/dwc/pcie-designware-ep.c

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -821,7 +821,6 @@ int dw_pcie_ep_init(struct dw_pcie_ep *ep)
821821
struct device *dev = pci->dev;
822822
struct platform_device *pdev = to_platform_device(dev);
823823
struct device_node *np = dev->of_node;
824-
const struct pci_epc_features *epc_features;
825824

826825
INIT_LIST_HEAD(&ep->func_list);
827826

@@ -867,29 +866,8 @@ int dw_pcie_ep_init(struct dw_pcie_ep *ep)
867866
goto err_exit_epc_mem;
868867
}
869868

870-
if (ep->ops->get_features) {
871-
epc_features = ep->ops->get_features(ep);
872-
if (epc_features->core_init_notifier)
873-
return 0;
874-
}
875-
876-
/*
877-
* NOTE:- Avoid accessing the hardware (Ex:- DBI space) before this
878-
* step as platforms that implement 'core_init_notifier' feature may
879-
* not have the hardware ready (i.e. core initialized) for access
880-
* (Ex: tegra194). Any hardware access on such platforms result
881-
* in system hang.
882-
*/
883-
ret = dw_pcie_ep_init_registers(ep);
884-
if (ret)
885-
goto err_free_epc_mem;
886-
887869
return 0;
888870

889-
err_free_epc_mem:
890-
pci_epc_mem_free_addr(epc, ep->msi_mem_phys, ep->msi_mem,
891-
epc->mem->window.page_size);
892-
893871
err_exit_epc_mem:
894872
pci_epc_mem_exit(epc);
895873

drivers/pci/controller/dwc/pcie-designware-plat.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,15 @@ static int dw_plat_pcie_probe(struct platform_device *pdev)
145145

146146
pci->ep.ops = &pcie_ep_ops;
147147
ret = dw_pcie_ep_init(&pci->ep);
148+
if (ret)
149+
return ret;
150+
151+
ret = dw_pcie_ep_init_registers(&pci->ep);
152+
if (ret) {
153+
dev_err(dev, "Failed to initialize DWC endpoint registers\n");
154+
dw_pcie_ep_deinit(&pci->ep);
155+
}
156+
148157
break;
149158
default:
150159
dev_err(dev, "INVALID device type %d\n", dw_plat_pcie->mode);

drivers/pci/controller/dwc/pcie-keembay.c

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -396,6 +396,7 @@ static int keembay_pcie_probe(struct platform_device *pdev)
396396
struct keembay_pcie *pcie;
397397
struct dw_pcie *pci;
398398
enum dw_pcie_device_mode mode;
399+
int ret;
399400

400401
data = device_get_match_data(dev);
401402
if (!data)
@@ -430,11 +431,24 @@ static int keembay_pcie_probe(struct platform_device *pdev)
430431
return -ENODEV;
431432

432433
pci->ep.ops = &keembay_pcie_ep_ops;
433-
return dw_pcie_ep_init(&pci->ep);
434+
ret = dw_pcie_ep_init(&pci->ep);
435+
if (ret)
436+
return ret;
437+
438+
ret = dw_pcie_ep_init_registers(&pci->ep);
439+
if (ret) {
440+
dev_err(dev, "Failed to initialize DWC endpoint registers\n");
441+
dw_pcie_ep_deinit(&pci->ep);
442+
return ret;
443+
}
444+
445+
break;
434446
default:
435447
dev_err(dev, "Invalid device type %d\n", pcie->mode);
436448
return -ENODEV;
437449
}
450+
451+
return 0;
438452
}
439453

440454
static const struct keembay_pcie_of_data keembay_pcie_rc_of_data = {

drivers/pci/controller/dwc/pcie-rcar-gen4.c

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -416,6 +416,7 @@ static const struct dw_pcie_ep_ops pcie_ep_ops = {
416416
static int rcar_gen4_add_dw_pcie_ep(struct rcar_gen4_pcie *rcar)
417417
{
418418
struct dw_pcie_ep *ep = &rcar->dw.ep;
419+
struct device *dev = rcar->dw.dev;
419420
int ret;
420421

421422
if (!IS_ENABLED(CONFIG_PCIE_RCAR_GEN4_EP))
@@ -424,8 +425,17 @@ static int rcar_gen4_add_dw_pcie_ep(struct rcar_gen4_pcie *rcar)
424425
ep->ops = &pcie_ep_ops;
425426

426427
ret = dw_pcie_ep_init(ep);
427-
if (ret)
428+
if (ret) {
428429
rcar_gen4_pcie_ep_deinit(rcar);
430+
return ret;
431+
}
432+
433+
ret = dw_pcie_ep_init_registers(ep);
434+
if (ret) {
435+
dev_err(dev, "Failed to initialize DWC endpoint registers\n");
436+
dw_pcie_ep_deinit(ep);
437+
rcar_gen4_pcie_ep_deinit(rcar);
438+
}
429439

430440
return ret;
431441
}

drivers/pci/controller/dwc/pcie-uniphier-ep.c

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -399,7 +399,18 @@ static int uniphier_pcie_ep_probe(struct platform_device *pdev)
399399
return ret;
400400

401401
priv->pci.ep.ops = &uniphier_pcie_ep_ops;
402-
return dw_pcie_ep_init(&priv->pci.ep);
402+
ret = dw_pcie_ep_init(&priv->pci.ep);
403+
if (ret)
404+
return ret;
405+
406+
ret = dw_pcie_ep_init_registers(&priv->pci.ep);
407+
if (ret) {
408+
dev_err(dev, "Failed to initialize DWC endpoint registers\n");
409+
dw_pcie_ep_deinit(&priv->pci.ep);
410+
return ret;
411+
}
412+
413+
return 0;
403414
}
404415

405416
static const struct uniphier_pcie_ep_soc_data uniphier_pro5_data = {

0 commit comments

Comments
 (0)