hc
2023-11-06 e3e12f52b214121840b44c91de5b3e5af5d3eb84
kernel/drivers/pci/controller/dwc/pcie-dw-dmatest.c
....@@ -47,46 +47,16 @@
4747 module_param(test_dev, uint, 0644);
4848 MODULE_PARM_DESC(test_dev, "Choose dma_obj device,(default 0)");
4949
50
+static bool is_rc = true;
51
+module_param_named(is_rc, is_rc, bool, 0644);
52
+MODULE_PARM_DESC(is_rc, "Test port is rc(default true)");
53
+
5054 #define PCIE_DW_MISC_DMATEST_DEV_MAX 5
51
-
52
-#define PCIE_DMA_OFFSET 0x380000
53
-
54
-#define PCIE_DMA_CTRL_OFF 0x8
55
-#define PCIE_DMA_WR_ENB 0xc
56
-#define PCIE_DMA_WR_CTRL_LO 0x200
57
-#define PCIE_DMA_WR_CTRL_HI 0x204
58
-#define PCIE_DMA_WR_XFERSIZE 0x208
59
-#define PCIE_DMA_WR_SAR_PTR_LO 0x20c
60
-#define PCIE_DMA_WR_SAR_PTR_HI 0x210
61
-#define PCIE_DMA_WR_DAR_PTR_LO 0x214
62
-#define PCIE_DMA_WR_DAR_PTR_HI 0x218
63
-#define PCIE_DMA_WR_WEILO 0x18
64
-#define PCIE_DMA_WR_WEIHI 0x1c
65
-#define PCIE_DMA_WR_DOORBELL 0x10
66
-#define PCIE_DMA_WR_INT_STATUS 0x4c
67
-#define PCIE_DMA_WR_INT_MASK 0x54
68
-#define PCIE_DMA_WR_INT_CLEAR 0x58
69
-
70
-#define PCIE_DMA_RD_ENB 0x2c
71
-#define PCIE_DMA_RD_CTRL_LO 0x300
72
-#define PCIE_DMA_RD_CTRL_HI 0x304
73
-#define PCIE_DMA_RD_XFERSIZE 0x308
74
-#define PCIE_DMA_RD_SAR_PTR_LO 0x30c
75
-#define PCIE_DMA_RD_SAR_PTR_HI 0x310
76
-#define PCIE_DMA_RD_DAR_PTR_LO 0x314
77
-#define PCIE_DMA_RD_DAR_PTR_HI 0x318
78
-#define PCIE_DMA_RD_WEILO 0x38
79
-#define PCIE_DMA_RD_WEIHI 0x3c
80
-#define PCIE_DMA_RD_DOORBELL 0x30
81
-#define PCIE_DMA_RD_INT_STATUS 0xa0
82
-#define PCIE_DMA_RD_INT_MASK 0xa8
83
-#define PCIE_DMA_RD_INT_CLEAR 0xac
8455
8556 #define PCIE_DMA_CHANEL_MAX_NUM 2
8657
8758 struct pcie_dw_dmatest_dev {
8859 struct dma_trx_obj *obj;
89
- struct dw_pcie *pci;
9060
9161 bool irq_en;
9262 struct completion rd_done[PCIE_DMA_CHANEL_MAX_NUM];
....@@ -113,66 +83,22 @@
11383 dev_info(s_dmatest_dev[test_dev].obj->dev, " is current test_dev\n");
11484 }
11585
116
-static int rk_pcie_get_dma_status(struct dw_pcie *pci, u8 chn, enum dma_dir dir)
117
-{
118
- union int_status status;
119
- union int_clear clears;
120
- int ret = 0;
121
-
122
- dev_dbg(pci->dev, "%s %x %x\n", __func__, dw_pcie_readl_dbi(pci, PCIE_DMA_OFFSET + PCIE_DMA_WR_INT_STATUS),
123
- dw_pcie_readl_dbi(pci, PCIE_DMA_OFFSET + PCIE_DMA_RD_INT_STATUS));
124
-
125
- if (dir == DMA_TO_BUS) {
126
- status.asdword = dw_pcie_readl_dbi(pci, PCIE_DMA_OFFSET + PCIE_DMA_WR_INT_STATUS);
127
- if (status.donesta & BIT(chn)) {
128
- clears.doneclr = 0x1 << chn;
129
- dw_pcie_writel_dbi(pci, PCIE_DMA_OFFSET + PCIE_DMA_WR_INT_CLEAR, clears.asdword);
130
- ret = 1;
131
- }
132
-
133
- if (status.abortsta & BIT(chn)) {
134
- dev_err(pci->dev, "%s, write abort\n", __func__);
135
- clears.abortclr = 0x1 << chn;
136
- dw_pcie_writel_dbi(pci, PCIE_DMA_OFFSET + PCIE_DMA_WR_INT_CLEAR, clears.asdword);
137
- ret = -1;
138
- }
139
- } else {
140
- status.asdword = dw_pcie_readl_dbi(pci, PCIE_DMA_OFFSET + PCIE_DMA_RD_INT_STATUS);
141
-
142
- if (status.donesta & BIT(chn)) {
143
- clears.doneclr = 0x1 << chn;
144
- dw_pcie_writel_dbi(pci, PCIE_DMA_OFFSET + PCIE_DMA_RD_INT_CLEAR, clears.asdword);
145
- ret = 1;
146
- }
147
-
148
- if (status.abortsta & BIT(chn)) {
149
- dev_err(pci->dev, "%s, read abort %x\n", __func__, status.asdword);
150
- clears.abortclr = 0x1 << chn;
151
- dw_pcie_writel_dbi(pci, PCIE_DMA_OFFSET + PCIE_DMA_RD_INT_CLEAR, clears.asdword);
152
- ret = -1;
153
- }
154
- }
155
-
156
- return ret;
157
-}
158
-
159
-static int rk_pcie_dma_wait_for_finised(struct dma_trx_obj *obj, struct dw_pcie *pci, struct dma_table *table)
86
+static int rk_pcie_dma_wait_for_finised(struct dma_trx_obj *obj, struct dma_table *table)
16087 {
16188 int ret;
16289
16390 do {
164
- ret = rk_pcie_get_dma_status(pci, table->chn, table->dir);
91
+ ret = obj->get_dma_status(obj, table->chn, table->dir);
16592 } while (!ret);
16693
16794 return ret;
16895 }
16996
170
-static int rk_pcie_dma_frombus(struct pcie_dw_dmatest_dev *dmatest_dev, u32 chn,
171
- u32 local_paddr, u32 bus_paddr, u32 size)
97
+static int rk_pcie_ep_dma_frombus(struct pcie_dw_dmatest_dev *dmatest_dev, u32 chn,
98
+ u32 local_paddr, u32 bus_paddr, u32 size)
17299 {
173100 struct dma_table *table;
174101 struct dma_trx_obj *obj = dmatest_dev->obj;
175
- struct dw_pcie *pci = dmatest_dev->pci;
176102 int ret;
177103
178104 if (chn >= PCIE_DMA_CHANEL_MAX_NUM)
....@@ -202,7 +128,7 @@
202128 else if (ret == 0)
203129 dev_err(obj->dev, "%s timed out\n", __func__);
204130 } else {
205
- ret = rk_pcie_dma_wait_for_finised(obj, pci, table);
131
+ ret = rk_pcie_dma_wait_for_finised(obj, table);
206132 }
207133 mutex_unlock(&dmatest_dev->rd_lock[chn]);
208134
....@@ -211,12 +137,11 @@
211137 return ret;
212138 }
213139
214
-static int rk_pcie_dma_tobus(struct pcie_dw_dmatest_dev *dmatest_dev, u32 chn,
215
- u32 bus_paddr, u32 local_paddr, u32 size)
140
+static int rk_pcie_ep_dma_tobus(struct pcie_dw_dmatest_dev *dmatest_dev, u32 chn,
141
+ u32 bus_paddr, u32 local_paddr, u32 size)
216142 {
217143 struct dma_table *table;
218144 struct dma_trx_obj *obj = dmatest_dev->obj;
219
- struct dw_pcie *pci = dmatest_dev->pci;
220145 int ret;
221146
222147 if (chn >= PCIE_DMA_CHANEL_MAX_NUM)
....@@ -246,13 +171,25 @@
246171 else if (ret == 0)
247172 dev_err(obj->dev, "%s timed out\n", __func__);
248173 } else {
249
- ret = rk_pcie_dma_wait_for_finised(obj, pci, table);
174
+ ret = rk_pcie_dma_wait_for_finised(obj, table);
250175 }
251176 mutex_unlock(&dmatest_dev->wr_lock[chn]);
252177
253178 kfree(table);
254179
255180 return ret;
181
+}
182
+
183
+static int rk_pcie_rc_dma_frombus(struct pcie_dw_dmatest_dev *dmatest_dev, u32 chn,
184
+ u32 local_paddr, u32 bus_paddr, u32 size)
185
+{
186
+ return rk_pcie_ep_dma_tobus(dmatest_dev, chn, local_paddr, bus_paddr, size);
187
+}
188
+
189
+static int rk_pcie_rc_dma_tobus(struct pcie_dw_dmatest_dev *dmatest_dev, u32 chn,
190
+ u32 bus_paddr, u32 local_paddr, u32 size)
191
+{
192
+ return rk_pcie_ep_dma_frombus(dmatest_dev, chn, bus_paddr, local_paddr, size);
256193 }
257194
258195 static int rk_pcie_dma_interrupt_handler_call_back(struct dma_trx_obj *obj, u32 chn, enum dma_dir dir)
....@@ -270,23 +207,22 @@
270207 return 0;
271208 }
272209
273
-struct dma_trx_obj *pcie_dw_dmatest_register(struct dw_pcie *pci, bool irq_en)
210
+struct dma_trx_obj *pcie_dw_dmatest_register(struct device *dev, bool irq_en)
274211 {
275212 struct dma_trx_obj *obj;
276213 struct pcie_dw_dmatest_dev *dmatest_dev = &s_dmatest_dev[cur_dmatest_dev];
277214 int i;
278215
279
- obj = devm_kzalloc(pci->dev, sizeof(struct dma_trx_obj), GFP_KERNEL);
216
+ obj = devm_kzalloc(dev, sizeof(struct dma_trx_obj), GFP_KERNEL);
280217 if (!obj)
281218 return ERR_PTR(-ENOMEM);
282219
283
- obj->dev = pci->dev;
220
+ obj->dev = dev;
284221 obj->priv = dmatest_dev;
285222 obj->cb = rk_pcie_dma_interrupt_handler_call_back;
286223
287224 /* Save for dmatest */
288225 dmatest_dev->obj = obj;
289
- dmatest_dev->pci = pci;
290226 for (i = 0; i < PCIE_DMA_CHANEL_MAX_NUM; i++) {
291227 init_completion(&dmatest_dev->rd_done[i]);
292228 init_completion(&dmatest_dev->wr_done[i]);
....@@ -323,13 +259,19 @@
323259 start_time = ktime_get();
324260 for (i = 0; i < loop; i++) {
325261 if (rd_en) {
326
- rk_pcie_dma_frombus(dmatest_dev, chn, local_paddr, bus_paddr, size);
262
+ if (is_rc)
263
+ rk_pcie_rc_dma_frombus(dmatest_dev, chn, local_paddr, bus_paddr, size);
264
+ else
265
+ rk_pcie_ep_dma_frombus(dmatest_dev, chn, local_paddr, bus_paddr, size);
327266 dma_sync_single_for_cpu(obj->dev, local_paddr, size, DMA_FROM_DEVICE);
328267 }
329268
330269 if (wr_en) {
331270 dma_sync_single_for_device(obj->dev, local_paddr, size, DMA_TO_DEVICE);
332
- rk_pcie_dma_tobus(dmatest_dev, chn, bus_paddr, local_paddr, size);
271
+ if (is_rc)
272
+ rk_pcie_rc_dma_tobus(dmatest_dev, chn, bus_paddr, local_paddr, size);
273
+ else
274
+ rk_pcie_ep_dma_tobus(dmatest_dev, chn, bus_paddr, local_paddr, size);
333275 }
334276 }
335277 end_time = ktime_get();