forked from ~ljy/RK356X_SDK_RELEASE

hc
2023-12-09 b22da3d8526a935aa31e086e63f60ff3246cb61c
kernel/drivers/pci/controller/dwc/pcie-dw-ep-rockchip.c
....@@ -10,7 +10,6 @@
1010
1111 #include <linux/clk.h>
1212 #include <linux/gpio/consumer.h>
13
-#include <linux/iopoll.h>
1413 #include <linux/miscdevice.h>
1514 #include <linux/mfd/syscon.h>
1615 #include <linux/module.h>
....@@ -82,10 +81,6 @@
8281 #define PCIE_CLIENT_HOT_RESET_CTRL 0x180
8382 #define PCIE_CLIENT_LTSSM_STATUS 0x300
8483 #define PCIE_CLIENT_INTR_MASK 0x24
85
-#define PCIE_LTSSM_APP_DLY1_EN BIT(0)
86
-#define PCIE_LTSSM_APP_DLY2_EN BIT(1)
87
-#define PCIE_LTSSM_APP_DLY1_DONE BIT(2)
88
-#define PCIE_LTSSM_APP_DLY2_DONE BIT(3)
8984 #define PCIE_LTSSM_ENABLE_ENHANCE BIT(4)
9085 #define PCIE_CLIENT_MSI_GEN_CON 0x38
9186
....@@ -111,7 +106,6 @@
111106 #define PCIE_EP_OBJ_INFO_DRV_VERSION 0x00000001
112107
113108 #define PCIE_BAR_MAX_NUM 6
114
-#define PCIE_HOTRESET_TMOUT_US 10000
115109
116110 struct rockchip_pcie {
117111 struct dw_pcie pci;
....@@ -136,8 +130,6 @@
136130 phys_addr_t dbi_base_physical;
137131 struct pcie_ep_obj_info *obj_info;
138132 enum pcie_ep_mmap_resource cur_mmap_res;
139
- struct workqueue_struct *hot_rst_wq;
140
- struct work_struct hot_rst_work;
141133 };
142134
143135 struct rockchip_pcie_misc_dev {
....@@ -207,7 +199,6 @@
207199 struct device_node *np = dev->of_node;
208200 void *addr;
209201 struct resource *dbi_base;
210
- struct resource *apb_base;
211202 struct device_node *mem;
212203 struct resource reg;
213204 char name[8];
....@@ -223,17 +214,14 @@
223214 rockchip->pci.dbi_base = devm_ioremap_resource(dev, dbi_base);
224215 if (IS_ERR(rockchip->pci.dbi_base))
225216 return PTR_ERR(rockchip->pci.dbi_base);
217
+ rockchip->pci.atu_base = rockchip->pci.dbi_base + DEFAULT_DBI_ATU_OFFSET;
226218 rockchip->dbi_base_physical = dbi_base->start;
227219
228
- apb_base = platform_get_resource_byname(pdev, IORESOURCE_MEM,
229
- "pcie-apb");
230
- if (!apb_base) {
220
+ rockchip->apb_base = devm_platform_ioremap_resource_byname(pdev, "pcie-apb");
221
+ if (!rockchip->apb_base) {
231222 dev_err(dev, "get pcie-apb failed\n");
232223 return -ENODEV;
233224 }
234
- rockchip->apb_base = devm_ioremap_resource(dev, apb_base);
235
- if (IS_ERR(rockchip->apb_base))
236
- return PTR_ERR(rockchip->apb_base);
237225
238226 rockchip->rst_gpio = devm_gpiod_get_optional(dev, "reset",
239227 GPIOD_OUT_HIGH);
....@@ -580,7 +568,7 @@
580568
581569 as_type = DW_PCIE_AS_MEM;
582570
583
- ret = dw_pcie_prog_inbound_atu(pci, free_win, bar, cpu_addr, as_type);
571
+ ret = dw_pcie_prog_inbound_atu(pci, 0, free_win, bar, cpu_addr, as_type);
584572 if (ret < 0) {
585573 dev_err(pci->dev, "Failed to program IB window\n");
586574 return ret;
....@@ -598,8 +586,7 @@
598586
599587 /* LTSSM EN ctrl mode */
600588 val = rockchip_pcie_readl_apb(rockchip, PCIE_CLIENT_HOT_RESET_CTRL);
601
- val |= (PCIE_LTSSM_ENABLE_ENHANCE | PCIE_LTSSM_APP_DLY2_EN) |
602
- ((PCIE_LTSSM_ENABLE_ENHANCE | PCIE_LTSSM_APP_DLY2_EN) << 16);
589
+ val |= PCIE_LTSSM_ENABLE_ENHANCE | (PCIE_LTSSM_ENABLE_ENHANCE << 16);
603590 rockchip_pcie_writel_apb(rockchip, val, PCIE_CLIENT_HOT_RESET_CTRL);
604591 }
605592
....@@ -655,7 +642,7 @@
655642 u32 chn;
656643 union int_status wr_status, rd_status;
657644 union int_clear clears;
658
- u32 reg, mask;
645
+ u32 reg, val, mask;
659646 bool sigio = false;
660647
661648 /* ELBI helper, only check the valid bits, and discard the rest interrupts */
....@@ -726,8 +713,14 @@
726713 }
727714
728715 reg = rockchip_pcie_readl_apb(rockchip, PCIE_CLIENT_INTR_STATUS_MISC);
729
- if (reg & BIT(2))
730
- queue_work(rockchip->hot_rst_wq, &rockchip->hot_rst_work);
716
+ if (reg & BIT(2)) {
717
+ /* Setup command register */
718
+ val = dw_pcie_readl_dbi(pci, PCI_COMMAND);
719
+ val &= 0xffff0000;
720
+ val |= PCI_COMMAND_IO | PCI_COMMAND_MEMORY |
721
+ PCI_COMMAND_MASTER | PCI_COMMAND_SERR;
722
+ dw_pcie_writel_dbi(pci, PCI_COMMAND, val);
723
+ }
731724
732725 rockchip_pcie_writel_apb(rockchip, reg, PCIE_CLIENT_INTR_STATUS_MISC);
733726
....@@ -875,23 +868,6 @@
875868 table->weilo.weight0 = 0x0;
876869 table->start.stop = 0x0;
877870 table->start.chnl = table->chn;
878
-}
879
-
880
-static void rockchip_pcie_hot_rst_work(struct work_struct *work)
881
-{
882
- struct rockchip_pcie *rockchip = container_of(work, struct rockchip_pcie, hot_rst_work);
883
- u32 status;
884
- int ret;
885
-
886
- if (rockchip_pcie_readl_apb(rockchip, PCIE_CLIENT_HOT_RESET_CTRL) & PCIE_LTSSM_APP_DLY2_EN) {
887
- ret = readl_poll_timeout(rockchip->apb_base + PCIE_CLIENT_LTSSM_STATUS,
888
- status, ((status & 0x3F) == 0), 100, PCIE_HOTRESET_TMOUT_US);
889
- if (ret)
890
- dev_err(rockchip->pci.dev, "wait for detect quiet failed!\n");
891
-
892
- rockchip_pcie_writel_apb(rockchip, (PCIE_LTSSM_APP_DLY2_DONE) | ((PCIE_LTSSM_APP_DLY2_DONE) << 16),
893
- PCIE_CLIENT_HOT_RESET_CTRL);
894
- }
895871 }
896872
897873 static int rockchip_pcie_get_dma_status(struct dma_trx_obj *obj, u8 chn, enum dma_dir dir)
....@@ -1145,7 +1121,6 @@
11451121 struct rockchip_pcie *rockchip;
11461122 int ret;
11471123 int retry, i;
1148
- u32 reg;
11491124
11501125 rockchip = devm_kzalloc(dev, sizeof(*rockchip), GFP_KERNEL);
11511126 if (!rockchip)
....@@ -1206,26 +1181,6 @@
12061181
12071182 rockchip_pcie_start_link(&rockchip->pci);
12081183 rockchip_pcie_devmode_update(rockchip, RKEP_MODE_KERNEL, RKEP_SMODE_LNKRDY);
1209
-
1210
- rockchip->hot_rst_wq = create_singlethread_workqueue("rkep_hot_rst_wq");
1211
- if (!rockchip->hot_rst_wq) {
1212
- dev_err(dev, "failed to create hot_rst workqueue\n");
1213
- ret = -ENOMEM;
1214
- goto deinit_phy;
1215
- }
1216
- INIT_WORK(&rockchip->hot_rst_work, rockchip_pcie_hot_rst_work);
1217
-
1218
- reg = rockchip_pcie_readl_apb(rockchip, PCIE_CLIENT_INTR_STATUS_MISC);
1219
- if ((reg & BIT(2)) &&
1220
- (rockchip_pcie_readl_apb(rockchip, PCIE_CLIENT_HOT_RESET_CTRL) & PCIE_LTSSM_APP_DLY2_EN)) {
1221
- rockchip_pcie_writel_apb(rockchip, PCIE_LTSSM_APP_DLY2_DONE | (PCIE_LTSSM_APP_DLY2_DONE << 16),
1222
- PCIE_CLIENT_HOT_RESET_CTRL);
1223
- dev_info(dev, "hot reset ever\n");
1224
- }
1225
- rockchip_pcie_writel_apb(rockchip, reg, PCIE_CLIENT_INTR_STATUS_MISC);
1226
-
1227
- /* Enable client reset or link down interrupt */
1228
- rockchip_pcie_writel_apb(rockchip, 0x40000, PCIE_CLIENT_INTR_MASK);
12291184
12301185 for (retry = 0; retry < 10000; retry++) {
12311186 if (dw_pcie_link_up(&rockchip->pci)) {