hc
2023-11-06 e3e12f52b214121840b44c91de5b3e5af5d3eb84
kernel/drivers/pci/controller/dwc/pcie-dw-rockchip.c
....@@ -34,6 +34,7 @@
3434 #include <linux/regmap.h>
3535 #include <linux/reset.h>
3636 #include <linux/resource.h>
37
+#include <linux/rfkill-wlan.h>
3738 #include <linux/signal.h>
3839 #include <linux/types.h>
3940 #include <linux/uaccess.h>
....@@ -53,6 +54,8 @@
5354 const char *id;
5455 struct reset_control *rst;
5556 };
57
+
58
+#define RK_PCIE_DBG 0
5659
5760 #define PCIE_DMA_OFFSET 0x380000
5861
....@@ -120,7 +123,6 @@
120123 #define PCIE_CLIENT_DBG_FIFO_STATUS 0x350
121124 #define PCIE_CLIENT_DBG_TRANSITION_DATA 0xffff0000
122125 #define PCIE_CLIENT_DBF_EN 0xffff0003
123
-#define RK_PCIE_DBG 0
124126
125127 #define PCIE_PHY_LINKUP BIT(0)
126128 #define PCIE_DATA_LINKUP BIT(1)
....@@ -147,6 +149,7 @@
147149 unsigned int clk_cnt;
148150 struct reset_bulk_data *rsts;
149151 struct gpio_desc *rst_gpio;
152
+ struct gpio_desc *prsnt_gpio;
150153 phys_addr_t mem_start;
151154 size_t mem_size;
152155 struct pcie_port pp;
....@@ -154,6 +157,7 @@
154157 struct regmap *pmu_grf;
155158 struct dma_trx_obj *dma_obj;
156159 bool in_suspend;
160
+ bool skip_scan_in_resume;
157161 bool is_rk1808;
158162 bool is_signal_test;
159163 bool bifurcation;
....@@ -161,10 +165,12 @@
161165 struct irq_domain *irq_domain;
162166 raw_spinlock_t intx_lock;
163167 struct dentry *debugfs;
168
+ u32 msi_vector_num;
164169 };
165170
166171 struct rk_pcie_of_data {
167172 enum rk_pcie_device_mode mode;
173
+ u32 msi_vector_num;
168174 };
169175
170176 #define to_rk_pcie(x) dev_get_drvdata((x)->dev)
....@@ -410,8 +416,7 @@
410416 return 1;
411417 } else {
412418 val = rk_pcie_readl_apb(rk_pcie, PCIE_CLIENT_LTSSM_STATUS);
413
- if ((val & (RDLH_LINKUP | SMLH_LINKUP)) == 0x30000 &&
414
- (val & GENMASK(5, 0)) == 0x11)
419
+ if ((val & (RDLH_LINKUP | SMLH_LINKUP)) == 0x30000)
415420 return 1;
416421 }
417422
....@@ -453,10 +458,16 @@
453458
454459 static int rk_pcie_establish_link(struct dw_pcie *pci)
455460 {
456
- int retries;
461
+ int retries, power;
457462 struct rk_pcie *rk_pcie = to_rk_pcie(pci);
463
+ bool std_rc = rk_pcie->mode == RK_PCIE_RC_TYPE && !rk_pcie->dma_obj;
458464
459
- if (dw_pcie_link_up(pci)) {
465
+ /*
466
+ * For standard RC, even if the link has been setup by firmware,
467
+ * we still need to reset link as we need to remove all resource info
468
+ * from devices, for instance BAR, as it wasn't assigned by kernel.
469
+ */
470
+ if (dw_pcie_link_up(pci) && !std_rc) {
460471 dev_err(pci->dev, "link is already up\n");
461472 return 0;
462473 }
....@@ -472,6 +483,21 @@
472483 rk_pcie_enable_ltssm(rk_pcie);
473484
474485 /*
486
+ * In resume routine, function devices' resume function must be late after
487
+ * controllers'. Some devices, such as Wi-Fi, need special IO setting before
488
+ * finishing training. So there must be timeout here. These kinds of devices
489
+ * need rescan devices by its driver when used. So no need to waste time waiting
490
+ * for training pass.
491
+ */
492
+ if (rk_pcie->in_suspend && rk_pcie->skip_scan_in_resume) {
493
+ rfkill_get_wifi_power_state(&power);
494
+ if (!power) {
495
+ gpiod_set_value_cansleep(rk_pcie->rst_gpio, 1);
496
+ return 0;
497
+ }
498
+ }
499
+
500
+ /*
475501 * PCIe requires the refclk to be stable for 100µs prior to releasing
476502 * PERST and T_PVPERL (Power stable to PERST# inactive) should be a
477503 * minimum of 100ms. See table 2-4 in section 2.6.2 AC, the PCI Express
....@@ -480,6 +506,12 @@
480506 */
481507 msleep(1000);
482508 gpiod_set_value_cansleep(rk_pcie->rst_gpio, 1);
509
+
510
+ /*
511
+ * Add this 1ms delay because we observe link is always up stably after it and
512
+ * could help us save 20ms for scanning devices.
513
+ */
514
+ usleep_range(1000, 1100);
483515
484516 for (retries = 0; retries < 10; retries++) {
485517 if (dw_pcie_link_up(pci)) {
....@@ -516,7 +548,7 @@
516548 return -EINVAL;
517549 }
518550
519
- rk_pcie->dma_obj = pcie_dw_dmatest_register(rk_pcie->pci, true);
551
+ rk_pcie->dma_obj = pcie_dw_dmatest_register(rk_pcie->pci->dev, true);
520552 if (IS_ERR(rk_pcie->dma_obj)) {
521553 dev_err(rk_pcie->pci->dev, "failed to prepare dmatest\n");
522554 return -EINVAL;
....@@ -675,6 +707,14 @@
675707 return 0;
676708 }
677709
710
+static void rk_pcie_msi_set_num_vectors(struct pcie_port *pp)
711
+{
712
+ struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
713
+ struct rk_pcie *rk_pcie = to_rk_pcie(pci);
714
+
715
+ pp->num_vectors = rk_pcie->msi_vector_num;
716
+}
717
+
678718 static int rk_pcie_host_init(struct pcie_port *pp)
679719 {
680720 int ret;
....@@ -707,6 +747,9 @@
707747 if (pp->msi_irq < 0) {
708748 dev_info(dev, "use outband MSI support");
709749 rk_pcie_host_ops.msi_host_init = rk_pcie_msi_host_init;
750
+ } else {
751
+ dev_info(dev, "max MSI vector is %d\n", rk_pcie->msi_vector_num);
752
+ rk_pcie_host_ops.set_num_vectors = rk_pcie_msi_set_num_vectors;
710753 }
711754 }
712755
....@@ -864,6 +907,10 @@
864907 dev_err(&pdev->dev, "invalid reset-gpios property in node\n");
865908 return PTR_ERR(rk_pcie->rst_gpio);
866909 }
910
+
911
+ rk_pcie->prsnt_gpio = devm_gpiod_get_optional(&pdev->dev, "prsnt", GPIOD_IN);
912
+ if (IS_ERR_OR_NULL(rk_pcie->prsnt_gpio))
913
+ dev_info(&pdev->dev, "invalid prsnt-gpios property in node\n");
867914
868915 return 0;
869916 }
....@@ -1149,6 +1196,11 @@
11491196 .mode = RK_PCIE_EP_TYPE,
11501197 };
11511198
1199
+static const struct rk_pcie_of_data rk3528_pcie_rc_of_data = {
1200
+ .mode = RK_PCIE_RC_TYPE,
1201
+ .msi_vector_num = 8,
1202
+};
1203
+
11521204 static const struct of_device_id rk_pcie_of_match[] = {
11531205 {
11541206 .compatible = "rockchip,rk1808-pcie",
....@@ -1157,6 +1209,10 @@
11571209 {
11581210 .compatible = "rockchip,rk1808-pcie-ep",
11591211 .data = &rk_pcie_ep_of_data,
1212
+ },
1213
+ {
1214
+ .compatible = "rockchip,rk3528-pcie",
1215
+ .data = &rk3528_pcie_rc_of_data,
11601216 },
11611217 {
11621218 .compatible = "rockchip,rk3568-pcie",
....@@ -1529,28 +1585,35 @@
15291585 enum rk_pcie_device_mode mode;
15301586 struct device_node *np = pdev->dev.of_node;
15311587 struct platform_driver *drv = to_platform_driver(dev->driver);
1532
- u32 val;
1588
+ u32 val = 0;
15331589 int irq;
15341590
15351591 match = of_match_device(rk_pcie_of_match, dev);
1536
- if (!match)
1537
- return -EINVAL;
1592
+ if (!match) {
1593
+ ret = -EINVAL;
1594
+ goto release_driver;
1595
+ }
15381596
15391597 data = (struct rk_pcie_of_data *)match->data;
15401598 mode = (enum rk_pcie_device_mode)data->mode;
15411599
15421600 rk_pcie = devm_kzalloc(dev, sizeof(*rk_pcie), GFP_KERNEL);
1543
- if (!rk_pcie)
1544
- return -ENOMEM;
1601
+ if (!rk_pcie) {
1602
+ ret = -ENOMEM;
1603
+ goto release_driver;
1604
+ }
15451605
15461606 pci = devm_kzalloc(dev, sizeof(*pci), GFP_KERNEL);
1547
- if (!pci)
1548
- return -ENOMEM;
1607
+ if (!pci) {
1608
+ ret = -ENOMEM;
1609
+ goto release_driver;
1610
+ }
15491611
15501612 pci->dev = dev;
15511613 pci->ops = &dw_pcie_ops;
15521614
15531615 rk_pcie->mode = mode;
1616
+ rk_pcie->msi_vector_num = data->msi_vector_num;
15541617 rk_pcie->pci = pci;
15551618
15561619 if (of_device_is_compatible(np, "rockchip,rk1808-pcie") ||
....@@ -1565,20 +1628,38 @@
15651628 ret = rk_pcie_resource_get(pdev, rk_pcie);
15661629 if (ret) {
15671630 dev_err(dev, "resource init failed\n");
1568
- return ret;
1631
+ goto release_driver;
15691632 }
15701633
1634
+ if (!IS_ERR_OR_NULL(rk_pcie->prsnt_gpio)) {
1635
+ if (!gpiod_get_value(rk_pcie->prsnt_gpio)) {
1636
+ ret = -ENODEV;
1637
+ goto release_driver;
1638
+ }
1639
+ }
1640
+
1641
+retry_regulator:
15711642 /* DON'T MOVE ME: must be enable before phy init */
15721643 rk_pcie->vpcie3v3 = devm_regulator_get_optional(dev, "vpcie3v3");
15731644 if (IS_ERR(rk_pcie->vpcie3v3)) {
1574
- if (PTR_ERR(rk_pcie->vpcie3v3) != -ENODEV)
1575
- return PTR_ERR(rk_pcie->vpcie3v3);
1645
+ if (PTR_ERR(rk_pcie->vpcie3v3) != -ENODEV) {
1646
+ if (IS_ENABLED(CONFIG_PCIE_RK_THREADED_INIT)) {
1647
+ /* Deferred but in threaded context for most 10s */
1648
+ msleep(20);
1649
+ if (++val < 500)
1650
+ goto retry_regulator;
1651
+ }
1652
+
1653
+ ret = PTR_ERR(rk_pcie->vpcie3v3);
1654
+ goto release_driver;
1655
+ }
1656
+
15761657 dev_info(dev, "no vpcie3v3 regulator found\n");
15771658 }
15781659
15791660 ret = rk_pcie_enable_power(rk_pcie);
15801661 if (ret)
1581
- return ret;
1662
+ goto release_driver;
15821663
15831664 ret = rk_pcie_phy_init(rk_pcie);
15841665 if (ret) {
....@@ -1589,13 +1670,13 @@
15891670 ret = rk_pcie_reset_control_release(rk_pcie);
15901671 if (ret) {
15911672 dev_err(dev, "reset control init failed\n");
1592
- goto disable_vpcie3v3;
1673
+ goto disable_phy;
15931674 }
15941675
15951676 ret = rk_pcie_request_sys_irq(rk_pcie, pdev);
15961677 if (ret) {
15971678 dev_err(dev, "pcie irq init failed\n");
1598
- goto disable_vpcie3v3;
1679
+ goto disable_phy;
15991680 }
16001681
16011682 platform_set_drvdata(pdev, rk_pcie);
....@@ -1603,7 +1684,7 @@
16031684 ret = rk_pcie_clk_init(rk_pcie);
16041685 if (ret) {
16051686 dev_err(dev, "clock init failed\n");
1606
- goto disable_vpcie3v3;
1687
+ goto disable_phy;
16071688 }
16081689
16091690 dw_pcie_dbi_ro_wr_en(pci);
....@@ -1626,9 +1707,9 @@
16261707 /* Unmask all legacy interrupt from INTA~INTD */
16271708 rk_pcie_writel_apb(rk_pcie, PCIE_CLIENT_INTR_MASK_LEGACY,
16281709 UNMASK_ALL_LEGACY_INT);
1710
+ } else {
1711
+ dev_info(dev, "missing legacy IRQ resource\n");
16291712 }
1630
-
1631
- dev_info(dev, "missing legacy IRQ resource\n");
16321713 }
16331714
16341715 /* Set PCIe mode */
....@@ -1649,6 +1730,10 @@
16491730 dw_pcie_writel_dbi(pci, PCIE_CAP_LINK_CONTROL2_LINK_STATUS, val);
16501731 rk_pcie->is_signal_test = true;
16511732 }
1733
+
1734
+ /* Skip waiting for training to pass in system PM routine */
1735
+ if (device_property_read_bool(dev, "rockchip,skip-scan-in-resume"))
1736
+ rk_pcie->skip_scan_in_resume = true;
16521737
16531738 switch (rk_pcie->mode) {
16541739 case RK_PCIE_RC_TYPE:
....@@ -1709,24 +1794,36 @@
17091794 remove_irq_domain:
17101795 if (rk_pcie->irq_domain)
17111796 irq_domain_remove(rk_pcie->irq_domain);
1797
+disable_phy:
1798
+ phy_power_off(rk_pcie->phy);
1799
+ phy_exit(rk_pcie->phy);
17121800 deinit_clk:
17131801 rk_pcie_clk_deinit(rk_pcie);
17141802 disable_vpcie3v3:
17151803 rk_pcie_disable_power(rk_pcie);
1804
+
1805
+release_driver:
1806
+ if (IS_ENABLED(CONFIG_PCIE_RK_THREADED_INIT))
1807
+ device_release_driver(dev);
17161808
17171809 return ret;
17181810 }
17191811
17201812 static int rk_pcie_probe(struct platform_device *pdev)
17211813 {
1722
- struct task_struct *tsk;
1814
+ if (IS_ENABLED(CONFIG_PCIE_RK_THREADED_INIT)) {
1815
+ struct task_struct *tsk;
17231816
1724
- tsk = kthread_run(rk_pcie_really_probe, pdev, "rk-pcie");
1725
- if (IS_ERR(tsk)) {
1726
- dev_err(&pdev->dev, "start rk-pcie thread failed\n");
1727
- return PTR_ERR(tsk);
1817
+ tsk = kthread_run(rk_pcie_really_probe, pdev, "rk-pcie");
1818
+ if (IS_ERR(tsk)) {
1819
+ dev_err(&pdev->dev, "start rk-pcie thread failed\n");
1820
+ return PTR_ERR(tsk);
1821
+ }
1822
+
1823
+ return 0;
17281824 }
1729
- return 0;
1825
+
1826
+ return rk_pcie_really_probe(pdev);
17301827 }
17311828
17321829 static int __maybe_unused rockchip_dw_pcie_suspend(struct device *dev)
....@@ -1749,9 +1846,6 @@
17491846
17501847 gpiod_set_value_cansleep(rk_pcie->rst_gpio, 0);
17511848 ret = rk_pcie_disable_power(rk_pcie);
1752
-
1753
- if (rk_pcie->pci->pp.msi_irq > 0)
1754
- dw_pcie_free_msi(&rk_pcie->pci->pp);
17551849
17561850 return ret;
17571851 }
....@@ -1811,9 +1905,6 @@
18111905 goto err;
18121906 }
18131907
1814
- if (rk_pcie->pci->pp.msi_irq > 0)
1815
- dw_pcie_msi_init(&rk_pcie->pci->pp);
1816
-
18171908 if (std_rc)
18181909 goto std_rc_done;
18191910
....@@ -1836,6 +1927,9 @@
18361927 goto err;
18371928 }
18381929
1930
+ if (rk_pcie->pci->pp.msi_irq > 0)
1931
+ dw_pcie_msi_init(&rk_pcie->pci->pp);
1932
+
18391933 return 0;
18401934 err:
18411935 rk_pcie_disable_power(rk_pcie);