1 // SPDX-License-Identifier: GPL-2.0
2 /*
3 * Synopsys DesignWare PCIe Endpoint controller driver
4 *
5 * Copyright (C) 2017 Texas Instruments
6 * Author: Kishon Vijay Abraham I <kishon@ti.com>
7 */
8
9 #include <linux/align.h>
10 #include <linux/bitfield.h>
11 #include <linux/of.h>
12 #include <linux/platform_device.h>
13
14 #include "pcie-designware.h"
15 #include <linux/pci-epc.h>
16 #include <linux/pci-epf.h>
17
18 /**
19 * dw_pcie_ep_get_func_from_ep - Get the struct dw_pcie_ep_func corresponding to
20 * the endpoint function
21 * @ep: DWC EP device
22 * @func_no: Function number of the endpoint device
23 *
24 * Return: struct dw_pcie_ep_func if success, NULL otherwise.
25 */
26 struct dw_pcie_ep_func *
dw_pcie_ep_get_func_from_ep(struct dw_pcie_ep * ep,u8 func_no)27 dw_pcie_ep_get_func_from_ep(struct dw_pcie_ep *ep, u8 func_no)
28 {
29 struct dw_pcie_ep_func *ep_func;
30
31 list_for_each_entry(ep_func, &ep->func_list, list) {
32 if (ep_func->func_no == func_no)
33 return ep_func;
34 }
35
36 return NULL;
37 }
38
__dw_pcie_ep_reset_bar(struct dw_pcie * pci,u8 func_no,enum pci_barno bar,int flags)39 static void __dw_pcie_ep_reset_bar(struct dw_pcie *pci, u8 func_no,
40 enum pci_barno bar, int flags)
41 {
42 struct dw_pcie_ep *ep = &pci->ep;
43 u32 reg;
44
45 reg = PCI_BASE_ADDRESS_0 + (4 * bar);
46 dw_pcie_dbi_ro_wr_en(pci);
47 dw_pcie_ep_writel_dbi2(ep, func_no, reg, 0x0);
48 dw_pcie_ep_writel_dbi(ep, func_no, reg, 0x0);
49 if (flags & PCI_BASE_ADDRESS_MEM_TYPE_64) {
50 dw_pcie_ep_writel_dbi2(ep, func_no, reg + 4, 0x0);
51 dw_pcie_ep_writel_dbi(ep, func_no, reg + 4, 0x0);
52 }
53 dw_pcie_dbi_ro_wr_dis(pci);
54 }
55
56 /**
57 * dw_pcie_ep_reset_bar - Reset endpoint BAR
58 * @pci: DWC PCI device
59 * @bar: BAR number of the endpoint
60 */
dw_pcie_ep_reset_bar(struct dw_pcie * pci,enum pci_barno bar)61 void dw_pcie_ep_reset_bar(struct dw_pcie *pci, enum pci_barno bar)
62 {
63 u8 func_no, funcs;
64
65 funcs = pci->ep.epc->max_functions;
66
67 for (func_no = 0; func_no < funcs; func_no++)
68 __dw_pcie_ep_reset_bar(pci, func_no, bar, 0);
69 }
70 EXPORT_SYMBOL_GPL(dw_pcie_ep_reset_bar);
71
__dw_pcie_ep_find_next_cap(struct dw_pcie_ep * ep,u8 func_no,u8 cap_ptr,u8 cap)72 static u8 __dw_pcie_ep_find_next_cap(struct dw_pcie_ep *ep, u8 func_no,
73 u8 cap_ptr, u8 cap)
74 {
75 u8 cap_id, next_cap_ptr;
76 u16 reg;
77
78 if (!cap_ptr)
79 return 0;
80
81 reg = dw_pcie_ep_readw_dbi(ep, func_no, cap_ptr);
82 cap_id = (reg & 0x00ff);
83
84 if (cap_id > PCI_CAP_ID_MAX)
85 return 0;
86
87 if (cap_id == cap)
88 return cap_ptr;
89
90 next_cap_ptr = (reg & 0xff00) >> 8;
91 return __dw_pcie_ep_find_next_cap(ep, func_no, next_cap_ptr, cap);
92 }
93
dw_pcie_ep_find_capability(struct dw_pcie_ep * ep,u8 func_no,u8 cap)94 static u8 dw_pcie_ep_find_capability(struct dw_pcie_ep *ep, u8 func_no, u8 cap)
95 {
96 u8 next_cap_ptr;
97 u16 reg;
98
99 reg = dw_pcie_ep_readw_dbi(ep, func_no, PCI_CAPABILITY_LIST);
100 next_cap_ptr = (reg & 0x00ff);
101
102 return __dw_pcie_ep_find_next_cap(ep, func_no, next_cap_ptr, cap);
103 }
104
dw_pcie_ep_write_header(struct pci_epc * epc,u8 func_no,u8 vfunc_no,struct pci_epf_header * hdr)105 static int dw_pcie_ep_write_header(struct pci_epc *epc, u8 func_no, u8 vfunc_no,
106 struct pci_epf_header *hdr)
107 {
108 struct dw_pcie_ep *ep = epc_get_drvdata(epc);
109 struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
110
111 dw_pcie_dbi_ro_wr_en(pci);
112 dw_pcie_ep_writew_dbi(ep, func_no, PCI_VENDOR_ID, hdr->vendorid);
113 dw_pcie_ep_writew_dbi(ep, func_no, PCI_DEVICE_ID, hdr->deviceid);
114 dw_pcie_ep_writeb_dbi(ep, func_no, PCI_REVISION_ID, hdr->revid);
115 dw_pcie_ep_writeb_dbi(ep, func_no, PCI_CLASS_PROG, hdr->progif_code);
116 dw_pcie_ep_writew_dbi(ep, func_no, PCI_CLASS_DEVICE,
117 hdr->subclass_code | hdr->baseclass_code << 8);
118 dw_pcie_ep_writeb_dbi(ep, func_no, PCI_CACHE_LINE_SIZE,
119 hdr->cache_line_size);
120 dw_pcie_ep_writew_dbi(ep, func_no, PCI_SUBSYSTEM_VENDOR_ID,
121 hdr->subsys_vendor_id);
122 dw_pcie_ep_writew_dbi(ep, func_no, PCI_SUBSYSTEM_ID, hdr->subsys_id);
123 dw_pcie_ep_writeb_dbi(ep, func_no, PCI_INTERRUPT_PIN,
124 hdr->interrupt_pin);
125 dw_pcie_dbi_ro_wr_dis(pci);
126
127 return 0;
128 }
129
dw_pcie_ep_inbound_atu(struct dw_pcie_ep * ep,u8 func_no,int type,dma_addr_t cpu_addr,enum pci_barno bar)130 static int dw_pcie_ep_inbound_atu(struct dw_pcie_ep *ep, u8 func_no, int type,
131 dma_addr_t cpu_addr, enum pci_barno bar)
132 {
133 int ret;
134 u32 free_win;
135 struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
136
137 if (!ep->bar_to_atu[bar])
138 free_win = find_first_zero_bit(ep->ib_window_map, pci->num_ib_windows);
139 else
140 free_win = ep->bar_to_atu[bar] - 1;
141
142 if (free_win >= pci->num_ib_windows) {
143 dev_err(pci->dev, "No free inbound window\n");
144 return -EINVAL;
145 }
146
147 ret = dw_pcie_prog_ep_inbound_atu(pci, func_no, free_win, type,
148 cpu_addr, bar);
149 if (ret < 0) {
150 dev_err(pci->dev, "Failed to program IB window\n");
151 return ret;
152 }
153
154 /*
155 * Always increment free_win before assignment, since value 0 is used to identify
156 * unallocated mapping.
157 */
158 ep->bar_to_atu[bar] = free_win + 1;
159 set_bit(free_win, ep->ib_window_map);
160
161 return 0;
162 }
163
dw_pcie_ep_outbound_atu(struct dw_pcie_ep * ep,struct dw_pcie_ob_atu_cfg * atu)164 static int dw_pcie_ep_outbound_atu(struct dw_pcie_ep *ep,
165 struct dw_pcie_ob_atu_cfg *atu)
166 {
167 struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
168 u32 free_win;
169 int ret;
170
171 free_win = find_first_zero_bit(ep->ob_window_map, pci->num_ob_windows);
172 if (free_win >= pci->num_ob_windows) {
173 dev_err(pci->dev, "No free outbound window\n");
174 return -EINVAL;
175 }
176
177 atu->index = free_win;
178 ret = dw_pcie_prog_outbound_atu(pci, atu);
179 if (ret)
180 return ret;
181
182 set_bit(free_win, ep->ob_window_map);
183 ep->outbound_addr[free_win] = atu->cpu_addr;
184
185 return 0;
186 }
187
dw_pcie_ep_clear_bar(struct pci_epc * epc,u8 func_no,u8 vfunc_no,struct pci_epf_bar * epf_bar)188 static void dw_pcie_ep_clear_bar(struct pci_epc *epc, u8 func_no, u8 vfunc_no,
189 struct pci_epf_bar *epf_bar)
190 {
191 struct dw_pcie_ep *ep = epc_get_drvdata(epc);
192 struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
193 enum pci_barno bar = epf_bar->barno;
194 u32 atu_index = ep->bar_to_atu[bar] - 1;
195
196 if (!ep->bar_to_atu[bar])
197 return;
198
199 __dw_pcie_ep_reset_bar(pci, func_no, bar, epf_bar->flags);
200
201 dw_pcie_disable_atu(pci, PCIE_ATU_REGION_DIR_IB, atu_index);
202 clear_bit(atu_index, ep->ib_window_map);
203 ep->epf_bar[bar] = NULL;
204 ep->bar_to_atu[bar] = 0;
205 }
206
dw_pcie_ep_set_bar(struct pci_epc * epc,u8 func_no,u8 vfunc_no,struct pci_epf_bar * epf_bar)207 static int dw_pcie_ep_set_bar(struct pci_epc *epc, u8 func_no, u8 vfunc_no,
208 struct pci_epf_bar *epf_bar)
209 {
210 struct dw_pcie_ep *ep = epc_get_drvdata(epc);
211 struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
212 enum pci_barno bar = epf_bar->barno;
213 size_t size = epf_bar->size;
214 int flags = epf_bar->flags;
215 int ret, type;
216 u32 reg;
217
218 /*
219 * DWC does not allow BAR pairs to overlap, e.g. you cannot combine BARs
220 * 1 and 2 to form a 64-bit BAR.
221 */
222 if ((flags & PCI_BASE_ADDRESS_MEM_TYPE_64) && (bar & 1))
223 return -EINVAL;
224
225 reg = PCI_BASE_ADDRESS_0 + (4 * bar);
226
227 if (!(flags & PCI_BASE_ADDRESS_SPACE))
228 type = PCIE_ATU_TYPE_MEM;
229 else
230 type = PCIE_ATU_TYPE_IO;
231
232 ret = dw_pcie_ep_inbound_atu(ep, func_no, type, epf_bar->phys_addr, bar);
233 if (ret)
234 return ret;
235
236 if (ep->epf_bar[bar])
237 return 0;
238
239 dw_pcie_dbi_ro_wr_en(pci);
240
241 dw_pcie_ep_writel_dbi2(ep, func_no, reg, lower_32_bits(size - 1));
242 dw_pcie_ep_writel_dbi(ep, func_no, reg, flags);
243
244 if (flags & PCI_BASE_ADDRESS_MEM_TYPE_64) {
245 dw_pcie_ep_writel_dbi2(ep, func_no, reg + 4, upper_32_bits(size - 1));
246 dw_pcie_ep_writel_dbi(ep, func_no, reg + 4, 0);
247 }
248
249 ep->epf_bar[bar] = epf_bar;
250 dw_pcie_dbi_ro_wr_dis(pci);
251
252 return 0;
253 }
254
dw_pcie_find_index(struct dw_pcie_ep * ep,phys_addr_t addr,u32 * atu_index)255 static int dw_pcie_find_index(struct dw_pcie_ep *ep, phys_addr_t addr,
256 u32 *atu_index)
257 {
258 u32 index;
259 struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
260
261 for (index = 0; index < pci->num_ob_windows; index++) {
262 if (ep->outbound_addr[index] != addr)
263 continue;
264 *atu_index = index;
265 return 0;
266 }
267
268 return -EINVAL;
269 }
270
dw_pcie_ep_unmap_addr(struct pci_epc * epc,u8 func_no,u8 vfunc_no,phys_addr_t addr)271 static void dw_pcie_ep_unmap_addr(struct pci_epc *epc, u8 func_no, u8 vfunc_no,
272 phys_addr_t addr)
273 {
274 int ret;
275 u32 atu_index;
276 struct dw_pcie_ep *ep = epc_get_drvdata(epc);
277 struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
278
279 ret = dw_pcie_find_index(ep, addr, &atu_index);
280 if (ret < 0)
281 return;
282
283 dw_pcie_disable_atu(pci, PCIE_ATU_REGION_DIR_OB, atu_index);
284 clear_bit(atu_index, ep->ob_window_map);
285 }
286
dw_pcie_ep_map_addr(struct pci_epc * epc,u8 func_no,u8 vfunc_no,phys_addr_t addr,u64 pci_addr,size_t size)287 static int dw_pcie_ep_map_addr(struct pci_epc *epc, u8 func_no, u8 vfunc_no,
288 phys_addr_t addr, u64 pci_addr, size_t size)
289 {
290 int ret;
291 struct dw_pcie_ep *ep = epc_get_drvdata(epc);
292 struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
293 struct dw_pcie_ob_atu_cfg atu = { 0 };
294
295 atu.func_no = func_no;
296 atu.type = PCIE_ATU_TYPE_MEM;
297 atu.cpu_addr = addr;
298 atu.pci_addr = pci_addr;
299 atu.size = size;
300 ret = dw_pcie_ep_outbound_atu(ep, &atu);
301 if (ret) {
302 dev_err(pci->dev, "Failed to enable address\n");
303 return ret;
304 }
305
306 return 0;
307 }
308
dw_pcie_ep_get_msi(struct pci_epc * epc,u8 func_no,u8 vfunc_no)309 static int dw_pcie_ep_get_msi(struct pci_epc *epc, u8 func_no, u8 vfunc_no)
310 {
311 struct dw_pcie_ep *ep = epc_get_drvdata(epc);
312 struct dw_pcie_ep_func *ep_func;
313 u32 val, reg;
314
315 ep_func = dw_pcie_ep_get_func_from_ep(ep, func_no);
316 if (!ep_func || !ep_func->msi_cap)
317 return -EINVAL;
318
319 reg = ep_func->msi_cap + PCI_MSI_FLAGS;
320 val = dw_pcie_ep_readw_dbi(ep, func_no, reg);
321 if (!(val & PCI_MSI_FLAGS_ENABLE))
322 return -EINVAL;
323
324 val = FIELD_GET(PCI_MSI_FLAGS_QSIZE, val);
325
326 return val;
327 }
328
dw_pcie_ep_set_msi(struct pci_epc * epc,u8 func_no,u8 vfunc_no,u8 interrupts)329 static int dw_pcie_ep_set_msi(struct pci_epc *epc, u8 func_no, u8 vfunc_no,
330 u8 interrupts)
331 {
332 struct dw_pcie_ep *ep = epc_get_drvdata(epc);
333 struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
334 struct dw_pcie_ep_func *ep_func;
335 u32 val, reg;
336
337 ep_func = dw_pcie_ep_get_func_from_ep(ep, func_no);
338 if (!ep_func || !ep_func->msi_cap)
339 return -EINVAL;
340
341 reg = ep_func->msi_cap + PCI_MSI_FLAGS;
342 val = dw_pcie_ep_readw_dbi(ep, func_no, reg);
343 val &= ~PCI_MSI_FLAGS_QMASK;
344 val |= FIELD_PREP(PCI_MSI_FLAGS_QMASK, interrupts);
345 dw_pcie_dbi_ro_wr_en(pci);
346 dw_pcie_ep_writew_dbi(ep, func_no, reg, val);
347 dw_pcie_dbi_ro_wr_dis(pci);
348
349 return 0;
350 }
351
dw_pcie_ep_get_msix(struct pci_epc * epc,u8 func_no,u8 vfunc_no)352 static int dw_pcie_ep_get_msix(struct pci_epc *epc, u8 func_no, u8 vfunc_no)
353 {
354 struct dw_pcie_ep *ep = epc_get_drvdata(epc);
355 struct dw_pcie_ep_func *ep_func;
356 u32 val, reg;
357
358 ep_func = dw_pcie_ep_get_func_from_ep(ep, func_no);
359 if (!ep_func || !ep_func->msix_cap)
360 return -EINVAL;
361
362 reg = ep_func->msix_cap + PCI_MSIX_FLAGS;
363 val = dw_pcie_ep_readw_dbi(ep, func_no, reg);
364 if (!(val & PCI_MSIX_FLAGS_ENABLE))
365 return -EINVAL;
366
367 val &= PCI_MSIX_FLAGS_QSIZE;
368
369 return val;
370 }
371
dw_pcie_ep_set_msix(struct pci_epc * epc,u8 func_no,u8 vfunc_no,u16 interrupts,enum pci_barno bir,u32 offset)372 static int dw_pcie_ep_set_msix(struct pci_epc *epc, u8 func_no, u8 vfunc_no,
373 u16 interrupts, enum pci_barno bir, u32 offset)
374 {
375 struct dw_pcie_ep *ep = epc_get_drvdata(epc);
376 struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
377 struct dw_pcie_ep_func *ep_func;
378 u32 val, reg;
379
380 ep_func = dw_pcie_ep_get_func_from_ep(ep, func_no);
381 if (!ep_func || !ep_func->msix_cap)
382 return -EINVAL;
383
384 dw_pcie_dbi_ro_wr_en(pci);
385
386 reg = ep_func->msix_cap + PCI_MSIX_FLAGS;
387 val = dw_pcie_ep_readw_dbi(ep, func_no, reg);
388 val &= ~PCI_MSIX_FLAGS_QSIZE;
389 val |= interrupts;
390 dw_pcie_writew_dbi(pci, reg, val);
391
392 reg = ep_func->msix_cap + PCI_MSIX_TABLE;
393 val = offset | bir;
394 dw_pcie_ep_writel_dbi(ep, func_no, reg, val);
395
396 reg = ep_func->msix_cap + PCI_MSIX_PBA;
397 val = (offset + (interrupts * PCI_MSIX_ENTRY_SIZE)) | bir;
398 dw_pcie_ep_writel_dbi(ep, func_no, reg, val);
399
400 dw_pcie_dbi_ro_wr_dis(pci);
401
402 return 0;
403 }
404
dw_pcie_ep_raise_irq(struct pci_epc * epc,u8 func_no,u8 vfunc_no,unsigned int type,u16 interrupt_num)405 static int dw_pcie_ep_raise_irq(struct pci_epc *epc, u8 func_no, u8 vfunc_no,
406 unsigned int type, u16 interrupt_num)
407 {
408 struct dw_pcie_ep *ep = epc_get_drvdata(epc);
409
410 if (!ep->ops->raise_irq)
411 return -EINVAL;
412
413 return ep->ops->raise_irq(ep, func_no, type, interrupt_num);
414 }
415
dw_pcie_ep_stop(struct pci_epc * epc)416 static void dw_pcie_ep_stop(struct pci_epc *epc)
417 {
418 struct dw_pcie_ep *ep = epc_get_drvdata(epc);
419 struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
420
421 dw_pcie_stop_link(pci);
422 }
423
dw_pcie_ep_start(struct pci_epc * epc)424 static int dw_pcie_ep_start(struct pci_epc *epc)
425 {
426 struct dw_pcie_ep *ep = epc_get_drvdata(epc);
427 struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
428
429 return dw_pcie_start_link(pci);
430 }
431
432 static const struct pci_epc_features*
dw_pcie_ep_get_features(struct pci_epc * epc,u8 func_no,u8 vfunc_no)433 dw_pcie_ep_get_features(struct pci_epc *epc, u8 func_no, u8 vfunc_no)
434 {
435 struct dw_pcie_ep *ep = epc_get_drvdata(epc);
436
437 if (!ep->ops->get_features)
438 return NULL;
439
440 return ep->ops->get_features(ep);
441 }
442
443 static const struct pci_epc_ops epc_ops = {
444 .write_header = dw_pcie_ep_write_header,
445 .set_bar = dw_pcie_ep_set_bar,
446 .clear_bar = dw_pcie_ep_clear_bar,
447 .map_addr = dw_pcie_ep_map_addr,
448 .unmap_addr = dw_pcie_ep_unmap_addr,
449 .set_msi = dw_pcie_ep_set_msi,
450 .get_msi = dw_pcie_ep_get_msi,
451 .set_msix = dw_pcie_ep_set_msix,
452 .get_msix = dw_pcie_ep_get_msix,
453 .raise_irq = dw_pcie_ep_raise_irq,
454 .start = dw_pcie_ep_start,
455 .stop = dw_pcie_ep_stop,
456 .get_features = dw_pcie_ep_get_features,
457 };
458
459 /**
460 * dw_pcie_ep_raise_intx_irq - Raise INTx IRQ to the host
461 * @ep: DWC EP device
462 * @func_no: Function number of the endpoint
463 *
464 * Return: 0 if success, errono otherwise.
465 */
dw_pcie_ep_raise_intx_irq(struct dw_pcie_ep * ep,u8 func_no)466 int dw_pcie_ep_raise_intx_irq(struct dw_pcie_ep *ep, u8 func_no)
467 {
468 struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
469 struct device *dev = pci->dev;
470
471 dev_err(dev, "EP cannot raise INTX IRQs\n");
472
473 return -EINVAL;
474 }
475 EXPORT_SYMBOL_GPL(dw_pcie_ep_raise_intx_irq);
476
477 /**
478 * dw_pcie_ep_raise_msi_irq - Raise MSI IRQ to the host
479 * @ep: DWC EP device
480 * @func_no: Function number of the endpoint
481 * @interrupt_num: Interrupt number to be raised
482 *
483 * Return: 0 if success, errono otherwise.
484 */
dw_pcie_ep_raise_msi_irq(struct dw_pcie_ep * ep,u8 func_no,u8 interrupt_num)485 int dw_pcie_ep_raise_msi_irq(struct dw_pcie_ep *ep, u8 func_no,
486 u8 interrupt_num)
487 {
488 u32 msg_addr_lower, msg_addr_upper, reg;
489 struct dw_pcie_ep_func *ep_func;
490 struct pci_epc *epc = ep->epc;
491 unsigned int aligned_offset;
492 u16 msg_ctrl, msg_data;
493 bool has_upper;
494 u64 msg_addr;
495 int ret;
496
497 ep_func = dw_pcie_ep_get_func_from_ep(ep, func_no);
498 if (!ep_func || !ep_func->msi_cap)
499 return -EINVAL;
500
501 /* Raise MSI per the PCI Local Bus Specification Revision 3.0, 6.8.1. */
502 reg = ep_func->msi_cap + PCI_MSI_FLAGS;
503 msg_ctrl = dw_pcie_ep_readw_dbi(ep, func_no, reg);
504 has_upper = !!(msg_ctrl & PCI_MSI_FLAGS_64BIT);
505 reg = ep_func->msi_cap + PCI_MSI_ADDRESS_LO;
506 msg_addr_lower = dw_pcie_ep_readl_dbi(ep, func_no, reg);
507 if (has_upper) {
508 reg = ep_func->msi_cap + PCI_MSI_ADDRESS_HI;
509 msg_addr_upper = dw_pcie_ep_readl_dbi(ep, func_no, reg);
510 reg = ep_func->msi_cap + PCI_MSI_DATA_64;
511 msg_data = dw_pcie_ep_readw_dbi(ep, func_no, reg);
512 } else {
513 msg_addr_upper = 0;
514 reg = ep_func->msi_cap + PCI_MSI_DATA_32;
515 msg_data = dw_pcie_ep_readw_dbi(ep, func_no, reg);
516 }
517 msg_addr = ((u64)msg_addr_upper) << 32 | msg_addr_lower;
518
519 aligned_offset = msg_addr & (epc->mem->window.page_size - 1);
520 msg_addr = ALIGN_DOWN(msg_addr, epc->mem->window.page_size);
521 ret = dw_pcie_ep_map_addr(epc, func_no, 0, ep->msi_mem_phys, msg_addr,
522 epc->mem->window.page_size);
523 if (ret)
524 return ret;
525
526 writel(msg_data | (interrupt_num - 1), ep->msi_mem + aligned_offset);
527
528 dw_pcie_ep_unmap_addr(epc, func_no, 0, ep->msi_mem_phys);
529
530 return 0;
531 }
532 EXPORT_SYMBOL_GPL(dw_pcie_ep_raise_msi_irq);
533
534 /**
535 * dw_pcie_ep_raise_msix_irq_doorbell - Raise MSI-X to the host using Doorbell
536 * method
537 * @ep: DWC EP device
538 * @func_no: Function number of the endpoint device
539 * @interrupt_num: Interrupt number to be raised
540 *
541 * Return: 0 if success, errno otherwise.
542 */
dw_pcie_ep_raise_msix_irq_doorbell(struct dw_pcie_ep * ep,u8 func_no,u16 interrupt_num)543 int dw_pcie_ep_raise_msix_irq_doorbell(struct dw_pcie_ep *ep, u8 func_no,
544 u16 interrupt_num)
545 {
546 struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
547 struct dw_pcie_ep_func *ep_func;
548 u32 msg_data;
549
550 ep_func = dw_pcie_ep_get_func_from_ep(ep, func_no);
551 if (!ep_func || !ep_func->msix_cap)
552 return -EINVAL;
553
554 msg_data = (func_no << PCIE_MSIX_DOORBELL_PF_SHIFT) |
555 (interrupt_num - 1);
556
557 dw_pcie_writel_dbi(pci, PCIE_MSIX_DOORBELL, msg_data);
558
559 return 0;
560 }
561
562 /**
563 * dw_pcie_ep_raise_msix_irq - Raise MSI-X to the host
564 * @ep: DWC EP device
565 * @func_no: Function number of the endpoint device
566 * @interrupt_num: Interrupt number to be raised
567 *
568 * Return: 0 if success, errno otherwise.
569 */
dw_pcie_ep_raise_msix_irq(struct dw_pcie_ep * ep,u8 func_no,u16 interrupt_num)570 int dw_pcie_ep_raise_msix_irq(struct dw_pcie_ep *ep, u8 func_no,
571 u16 interrupt_num)
572 {
573 struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
574 struct pci_epf_msix_tbl *msix_tbl;
575 struct dw_pcie_ep_func *ep_func;
576 struct pci_epc *epc = ep->epc;
577 u32 reg, msg_data, vec_ctrl;
578 unsigned int aligned_offset;
579 u32 tbl_offset;
580 u64 msg_addr;
581 int ret;
582 u8 bir;
583
584 ep_func = dw_pcie_ep_get_func_from_ep(ep, func_no);
585 if (!ep_func || !ep_func->msix_cap)
586 return -EINVAL;
587
588 reg = ep_func->msix_cap + PCI_MSIX_TABLE;
589 tbl_offset = dw_pcie_ep_readl_dbi(ep, func_no, reg);
590 bir = FIELD_GET(PCI_MSIX_TABLE_BIR, tbl_offset);
591 tbl_offset &= PCI_MSIX_TABLE_OFFSET;
592
593 msix_tbl = ep->epf_bar[bir]->addr + tbl_offset;
594 msg_addr = msix_tbl[(interrupt_num - 1)].msg_addr;
595 msg_data = msix_tbl[(interrupt_num - 1)].msg_data;
596 vec_ctrl = msix_tbl[(interrupt_num - 1)].vector_ctrl;
597
598 if (vec_ctrl & PCI_MSIX_ENTRY_CTRL_MASKBIT) {
599 dev_dbg(pci->dev, "MSI-X entry ctrl set\n");
600 return -EPERM;
601 }
602
603 aligned_offset = msg_addr & (epc->mem->window.page_size - 1);
604 msg_addr = ALIGN_DOWN(msg_addr, epc->mem->window.page_size);
605 ret = dw_pcie_ep_map_addr(epc, func_no, 0, ep->msi_mem_phys, msg_addr,
606 epc->mem->window.page_size);
607 if (ret)
608 return ret;
609
610 writel(msg_data, ep->msi_mem + aligned_offset);
611
612 dw_pcie_ep_unmap_addr(epc, func_no, 0, ep->msi_mem_phys);
613
614 return 0;
615 }
616
617 /**
618 * dw_pcie_ep_cleanup - Cleanup DWC EP resources after fundamental reset
619 * @ep: DWC EP device
620 *
621 * Cleans up the DWC EP specific resources like eDMA etc... after fundamental
622 * reset like PERST#. Note that this API is only applicable for drivers
623 * supporting PERST# or any other methods of fundamental reset.
624 */
dw_pcie_ep_cleanup(struct dw_pcie_ep * ep)625 void dw_pcie_ep_cleanup(struct dw_pcie_ep *ep)
626 {
627 struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
628
629 dw_pcie_edma_remove(pci);
630 }
631 EXPORT_SYMBOL_GPL(dw_pcie_ep_cleanup);
632
633 /**
634 * dw_pcie_ep_deinit - Deinitialize the endpoint device
635 * @ep: DWC EP device
636 *
637 * Deinitialize the endpoint device. EPC device is not destroyed since that will
638 * be taken care by Devres.
639 */
dw_pcie_ep_deinit(struct dw_pcie_ep * ep)640 void dw_pcie_ep_deinit(struct dw_pcie_ep *ep)
641 {
642 struct pci_epc *epc = ep->epc;
643
644 dw_pcie_ep_cleanup(ep);
645
646 pci_epc_mem_free_addr(epc, ep->msi_mem_phys, ep->msi_mem,
647 epc->mem->window.page_size);
648
649 pci_epc_mem_exit(epc);
650 }
651 EXPORT_SYMBOL_GPL(dw_pcie_ep_deinit);
652
dw_pcie_ep_find_ext_capability(struct dw_pcie * pci,int cap)653 static unsigned int dw_pcie_ep_find_ext_capability(struct dw_pcie *pci, int cap)
654 {
655 u32 header;
656 int pos = PCI_CFG_SPACE_SIZE;
657
658 while (pos) {
659 header = dw_pcie_readl_dbi(pci, pos);
660 if (PCI_EXT_CAP_ID(header) == cap)
661 return pos;
662
663 pos = PCI_EXT_CAP_NEXT(header);
664 if (!pos)
665 break;
666 }
667
668 return 0;
669 }
670
dw_pcie_ep_init_non_sticky_registers(struct dw_pcie * pci)671 static void dw_pcie_ep_init_non_sticky_registers(struct dw_pcie *pci)
672 {
673 unsigned int offset;
674 unsigned int nbars;
675 u32 reg, i;
676
677 offset = dw_pcie_ep_find_ext_capability(pci, PCI_EXT_CAP_ID_REBAR);
678
679 dw_pcie_dbi_ro_wr_en(pci);
680
681 if (offset) {
682 reg = dw_pcie_readl_dbi(pci, offset + PCI_REBAR_CTRL);
683 nbars = (reg & PCI_REBAR_CTRL_NBAR_MASK) >>
684 PCI_REBAR_CTRL_NBAR_SHIFT;
685
686 /*
687 * PCIe r6.0, sec 7.8.6.2 require us to support at least one
688 * size in the range from 1 MB to 512 GB. Advertise support
689 * for 1 MB BAR size only.
690 */
691 for (i = 0; i < nbars; i++, offset += PCI_REBAR_CTRL)
692 dw_pcie_writel_dbi(pci, offset + PCI_REBAR_CAP, 0x0);
693 }
694
695 dw_pcie_setup(pci);
696 dw_pcie_dbi_ro_wr_dis(pci);
697 }
698
699 /**
700 * dw_pcie_ep_init_registers - Initialize DWC EP specific registers
701 * @ep: DWC EP device
702 *
703 * Initialize the registers (CSRs) specific to DWC EP. This API should be called
704 * only when the endpoint receives an active refclk (either from host or
705 * generated locally).
706 */
dw_pcie_ep_init_registers(struct dw_pcie_ep * ep)707 int dw_pcie_ep_init_registers(struct dw_pcie_ep *ep)
708 {
709 struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
710 struct dw_pcie_ep_func *ep_func;
711 struct device *dev = pci->dev;
712 struct pci_epc *epc = ep->epc;
713 u32 ptm_cap_base, reg;
714 u8 hdr_type;
715 u8 func_no;
716 void *addr;
717 int ret;
718
719 hdr_type = dw_pcie_readb_dbi(pci, PCI_HEADER_TYPE) &
720 PCI_HEADER_TYPE_MASK;
721 if (hdr_type != PCI_HEADER_TYPE_NORMAL) {
722 dev_err(pci->dev,
723 "PCIe controller is not set to EP mode (hdr_type:0x%x)!\n",
724 hdr_type);
725 return -EIO;
726 }
727
728 dw_pcie_version_detect(pci);
729
730 dw_pcie_iatu_detect(pci);
731
732 ret = dw_pcie_edma_detect(pci);
733 if (ret)
734 return ret;
735
736 if (!ep->ib_window_map) {
737 ep->ib_window_map = devm_bitmap_zalloc(dev, pci->num_ib_windows,
738 GFP_KERNEL);
739 if (!ep->ib_window_map)
740 goto err_remove_edma;
741 }
742
743 if (!ep->ob_window_map) {
744 ep->ob_window_map = devm_bitmap_zalloc(dev, pci->num_ob_windows,
745 GFP_KERNEL);
746 if (!ep->ob_window_map)
747 goto err_remove_edma;
748 }
749
750 if (!ep->outbound_addr) {
751 addr = devm_kcalloc(dev, pci->num_ob_windows, sizeof(phys_addr_t),
752 GFP_KERNEL);
753 if (!addr)
754 goto err_remove_edma;
755 ep->outbound_addr = addr;
756 }
757
758 for (func_no = 0; func_no < epc->max_functions; func_no++) {
759
760 ep_func = dw_pcie_ep_get_func_from_ep(ep, func_no);
761 if (ep_func)
762 continue;
763
764 ep_func = devm_kzalloc(dev, sizeof(*ep_func), GFP_KERNEL);
765 if (!ep_func)
766 goto err_remove_edma;
767
768 ep_func->func_no = func_no;
769 ep_func->msi_cap = dw_pcie_ep_find_capability(ep, func_no,
770 PCI_CAP_ID_MSI);
771 ep_func->msix_cap = dw_pcie_ep_find_capability(ep, func_no,
772 PCI_CAP_ID_MSIX);
773
774 list_add_tail(&ep_func->list, &ep->func_list);
775 }
776
777 if (ep->ops->init)
778 ep->ops->init(ep);
779
780 ptm_cap_base = dw_pcie_ep_find_ext_capability(pci, PCI_EXT_CAP_ID_PTM);
781
782 /*
783 * PTM responder capability can be disabled only after disabling
784 * PTM root capability.
785 */
786 if (ptm_cap_base) {
787 dw_pcie_dbi_ro_wr_en(pci);
788 reg = dw_pcie_readl_dbi(pci, ptm_cap_base + PCI_PTM_CAP);
789 reg &= ~PCI_PTM_CAP_ROOT;
790 dw_pcie_writel_dbi(pci, ptm_cap_base + PCI_PTM_CAP, reg);
791
792 reg = dw_pcie_readl_dbi(pci, ptm_cap_base + PCI_PTM_CAP);
793 reg &= ~(PCI_PTM_CAP_RES | PCI_PTM_GRANULARITY_MASK);
794 dw_pcie_writel_dbi(pci, ptm_cap_base + PCI_PTM_CAP, reg);
795 dw_pcie_dbi_ro_wr_dis(pci);
796 }
797
798 dw_pcie_ep_init_non_sticky_registers(pci);
799
800 return 0;
801
802 err_remove_edma:
803 dw_pcie_edma_remove(pci);
804
805 return ret;
806 }
807 EXPORT_SYMBOL_GPL(dw_pcie_ep_init_registers);
808
809 /**
810 * dw_pcie_ep_linkup - Notify EPF drivers about Link Up event
811 * @ep: DWC EP device
812 */
dw_pcie_ep_linkup(struct dw_pcie_ep * ep)813 void dw_pcie_ep_linkup(struct dw_pcie_ep *ep)
814 {
815 struct pci_epc *epc = ep->epc;
816
817 pci_epc_linkup(epc);
818 }
819 EXPORT_SYMBOL_GPL(dw_pcie_ep_linkup);
820
821 /**
822 * dw_pcie_ep_linkdown - Notify EPF drivers about Link Down event
823 * @ep: DWC EP device
824 *
825 * Non-sticky registers are also initialized before sending the notification to
826 * the EPF drivers. This is needed since the registers need to be initialized
827 * before the link comes back again.
828 */
dw_pcie_ep_linkdown(struct dw_pcie_ep * ep)829 void dw_pcie_ep_linkdown(struct dw_pcie_ep *ep)
830 {
831 struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
832 struct pci_epc *epc = ep->epc;
833
834 /*
835 * Initialize the non-sticky DWC registers as they would've reset post
836 * Link Down. This is specifically needed for drivers not supporting
837 * PERST# as they have no way to reinitialize the registers before the
838 * link comes back again.
839 */
840 dw_pcie_ep_init_non_sticky_registers(pci);
841
842 pci_epc_linkdown(epc);
843 }
844 EXPORT_SYMBOL_GPL(dw_pcie_ep_linkdown);
845
846 /**
847 * dw_pcie_ep_init - Initialize the endpoint device
848 * @ep: DWC EP device
849 *
850 * Initialize the endpoint device. Allocate resources and create the EPC
851 * device with the endpoint framework.
852 *
853 * Return: 0 if success, errno otherwise.
854 */
dw_pcie_ep_init(struct dw_pcie_ep * ep)855 int dw_pcie_ep_init(struct dw_pcie_ep *ep)
856 {
857 int ret;
858 struct resource *res;
859 struct pci_epc *epc;
860 struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
861 struct device *dev = pci->dev;
862 struct platform_device *pdev = to_platform_device(dev);
863 struct device_node *np = dev->of_node;
864
865 INIT_LIST_HEAD(&ep->func_list);
866
867 ret = dw_pcie_get_resources(pci);
868 if (ret)
869 return ret;
870
871 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "addr_space");
872 if (!res)
873 return -EINVAL;
874
875 ep->phys_base = res->start;
876 ep->addr_size = resource_size(res);
877
878 if (ep->ops->pre_init)
879 ep->ops->pre_init(ep);
880
881 epc = devm_pci_epc_create(dev, &epc_ops);
882 if (IS_ERR(epc)) {
883 dev_err(dev, "Failed to create epc device\n");
884 return PTR_ERR(epc);
885 }
886
887 ep->epc = epc;
888 epc_set_drvdata(epc, ep);
889
890 ret = of_property_read_u8(np, "max-functions", &epc->max_functions);
891 if (ret < 0)
892 epc->max_functions = 1;
893
894 ret = pci_epc_mem_init(epc, ep->phys_base, ep->addr_size,
895 ep->page_size);
896 if (ret < 0) {
897 dev_err(dev, "Failed to initialize address space\n");
898 return ret;
899 }
900
901 ep->msi_mem = pci_epc_mem_alloc_addr(epc, &ep->msi_mem_phys,
902 epc->mem->window.page_size);
903 if (!ep->msi_mem) {
904 ret = -ENOMEM;
905 dev_err(dev, "Failed to reserve memory for MSI/MSI-X\n");
906 goto err_exit_epc_mem;
907 }
908
909 return 0;
910
911 err_exit_epc_mem:
912 pci_epc_mem_exit(epc);
913
914 return ret;
915 }
916 EXPORT_SYMBOL_GPL(dw_pcie_ep_init);
917