b48c70e8c7c9a6820e9c2b77c6db7771567e865a
[sfrench/cifs-2.6.git] / drivers / pci / controller / dwc / pcie-designware-ep.c
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/of.h>
10
11 #include "pcie-designware.h"
12 #include <linux/pci-epc.h>
13 #include <linux/pci-epf.h>
14
15 void dw_pcie_ep_linkup(struct dw_pcie_ep *ep)
16 {
17         struct pci_epc *epc = ep->epc;
18
19         pci_epc_linkup(epc);
20 }
21 EXPORT_SYMBOL_GPL(dw_pcie_ep_linkup);
22
23 void dw_pcie_ep_init_notify(struct dw_pcie_ep *ep)
24 {
25         struct pci_epc *epc = ep->epc;
26
27         pci_epc_init_notify(epc);
28 }
29 EXPORT_SYMBOL_GPL(dw_pcie_ep_init_notify);
30
31 static void __dw_pcie_ep_reset_bar(struct dw_pcie *pci, enum pci_barno bar,
32                                    int flags)
33 {
34         u32 reg;
35
36         reg = PCI_BASE_ADDRESS_0 + (4 * bar);
37         dw_pcie_dbi_ro_wr_en(pci);
38         dw_pcie_writel_dbi2(pci, reg, 0x0);
39         dw_pcie_writel_dbi(pci, reg, 0x0);
40         if (flags & PCI_BASE_ADDRESS_MEM_TYPE_64) {
41                 dw_pcie_writel_dbi2(pci, reg + 4, 0x0);
42                 dw_pcie_writel_dbi(pci, reg + 4, 0x0);
43         }
44         dw_pcie_dbi_ro_wr_dis(pci);
45 }
46
47 void dw_pcie_ep_reset_bar(struct dw_pcie *pci, enum pci_barno bar)
48 {
49         __dw_pcie_ep_reset_bar(pci, bar, 0);
50 }
51
52 static int dw_pcie_ep_write_header(struct pci_epc *epc, u8 func_no,
53                                    struct pci_epf_header *hdr)
54 {
55         struct dw_pcie_ep *ep = epc_get_drvdata(epc);
56         struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
57
58         dw_pcie_dbi_ro_wr_en(pci);
59         dw_pcie_writew_dbi(pci, PCI_VENDOR_ID, hdr->vendorid);
60         dw_pcie_writew_dbi(pci, PCI_DEVICE_ID, hdr->deviceid);
61         dw_pcie_writeb_dbi(pci, PCI_REVISION_ID, hdr->revid);
62         dw_pcie_writeb_dbi(pci, PCI_CLASS_PROG, hdr->progif_code);
63         dw_pcie_writew_dbi(pci, PCI_CLASS_DEVICE,
64                            hdr->subclass_code | hdr->baseclass_code << 8);
65         dw_pcie_writeb_dbi(pci, PCI_CACHE_LINE_SIZE,
66                            hdr->cache_line_size);
67         dw_pcie_writew_dbi(pci, PCI_SUBSYSTEM_VENDOR_ID,
68                            hdr->subsys_vendor_id);
69         dw_pcie_writew_dbi(pci, PCI_SUBSYSTEM_ID, hdr->subsys_id);
70         dw_pcie_writeb_dbi(pci, PCI_INTERRUPT_PIN,
71                            hdr->interrupt_pin);
72         dw_pcie_dbi_ro_wr_dis(pci);
73
74         return 0;
75 }
76
77 static int dw_pcie_ep_inbound_atu(struct dw_pcie_ep *ep, enum pci_barno bar,
78                                   dma_addr_t cpu_addr,
79                                   enum dw_pcie_as_type as_type)
80 {
81         int ret;
82         u32 free_win;
83         struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
84
85         free_win = find_first_zero_bit(ep->ib_window_map, ep->num_ib_windows);
86         if (free_win >= ep->num_ib_windows) {
87                 dev_err(pci->dev, "No free inbound window\n");
88                 return -EINVAL;
89         }
90
91         ret = dw_pcie_prog_inbound_atu(pci, free_win, bar, cpu_addr,
92                                        as_type);
93         if (ret < 0) {
94                 dev_err(pci->dev, "Failed to program IB window\n");
95                 return ret;
96         }
97
98         ep->bar_to_atu[bar] = free_win;
99         set_bit(free_win, ep->ib_window_map);
100
101         return 0;
102 }
103
104 static int dw_pcie_ep_outbound_atu(struct dw_pcie_ep *ep, phys_addr_t phys_addr,
105                                    u64 pci_addr, size_t size)
106 {
107         u32 free_win;
108         struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
109
110         free_win = find_first_zero_bit(ep->ob_window_map, ep->num_ob_windows);
111         if (free_win >= ep->num_ob_windows) {
112                 dev_err(pci->dev, "No free outbound window\n");
113                 return -EINVAL;
114         }
115
116         dw_pcie_prog_outbound_atu(pci, free_win, PCIE_ATU_TYPE_MEM,
117                                   phys_addr, pci_addr, size);
118
119         set_bit(free_win, ep->ob_window_map);
120         ep->outbound_addr[free_win] = phys_addr;
121
122         return 0;
123 }
124
125 static void dw_pcie_ep_clear_bar(struct pci_epc *epc, u8 func_no,
126                                  struct pci_epf_bar *epf_bar)
127 {
128         struct dw_pcie_ep *ep = epc_get_drvdata(epc);
129         struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
130         enum pci_barno bar = epf_bar->barno;
131         u32 atu_index = ep->bar_to_atu[bar];
132
133         __dw_pcie_ep_reset_bar(pci, bar, epf_bar->flags);
134
135         dw_pcie_disable_atu(pci, atu_index, DW_PCIE_REGION_INBOUND);
136         clear_bit(atu_index, ep->ib_window_map);
137 }
138
139 static int dw_pcie_ep_set_bar(struct pci_epc *epc, u8 func_no,
140                               struct pci_epf_bar *epf_bar)
141 {
142         int ret;
143         struct dw_pcie_ep *ep = epc_get_drvdata(epc);
144         struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
145         enum pci_barno bar = epf_bar->barno;
146         size_t size = epf_bar->size;
147         int flags = epf_bar->flags;
148         enum dw_pcie_as_type as_type;
149         u32 reg = PCI_BASE_ADDRESS_0 + (4 * bar);
150
151         if (!(flags & PCI_BASE_ADDRESS_SPACE))
152                 as_type = DW_PCIE_AS_MEM;
153         else
154                 as_type = DW_PCIE_AS_IO;
155
156         ret = dw_pcie_ep_inbound_atu(ep, bar, epf_bar->phys_addr, as_type);
157         if (ret)
158                 return ret;
159
160         dw_pcie_dbi_ro_wr_en(pci);
161
162         dw_pcie_writel_dbi2(pci, reg, lower_32_bits(size - 1));
163         dw_pcie_writel_dbi(pci, reg, flags);
164
165         if (flags & PCI_BASE_ADDRESS_MEM_TYPE_64) {
166                 dw_pcie_writel_dbi2(pci, reg + 4, upper_32_bits(size - 1));
167                 dw_pcie_writel_dbi(pci, reg + 4, 0);
168         }
169
170         dw_pcie_dbi_ro_wr_dis(pci);
171
172         return 0;
173 }
174
175 static int dw_pcie_find_index(struct dw_pcie_ep *ep, phys_addr_t addr,
176                               u32 *atu_index)
177 {
178         u32 index;
179
180         for (index = 0; index < ep->num_ob_windows; index++) {
181                 if (ep->outbound_addr[index] != addr)
182                         continue;
183                 *atu_index = index;
184                 return 0;
185         }
186
187         return -EINVAL;
188 }
189
190 static void dw_pcie_ep_unmap_addr(struct pci_epc *epc, u8 func_no,
191                                   phys_addr_t addr)
192 {
193         int ret;
194         u32 atu_index;
195         struct dw_pcie_ep *ep = epc_get_drvdata(epc);
196         struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
197
198         ret = dw_pcie_find_index(ep, addr, &atu_index);
199         if (ret < 0)
200                 return;
201
202         dw_pcie_disable_atu(pci, atu_index, DW_PCIE_REGION_OUTBOUND);
203         clear_bit(atu_index, ep->ob_window_map);
204 }
205
206 static int dw_pcie_ep_map_addr(struct pci_epc *epc, u8 func_no,
207                                phys_addr_t addr,
208                                u64 pci_addr, size_t size)
209 {
210         int ret;
211         struct dw_pcie_ep *ep = epc_get_drvdata(epc);
212         struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
213
214         ret = dw_pcie_ep_outbound_atu(ep, addr, pci_addr, size);
215         if (ret) {
216                 dev_err(pci->dev, "Failed to enable address\n");
217                 return ret;
218         }
219
220         return 0;
221 }
222
223 static int dw_pcie_ep_get_msi(struct pci_epc *epc, u8 func_no)
224 {
225         struct dw_pcie_ep *ep = epc_get_drvdata(epc);
226         struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
227         u32 val, reg;
228
229         if (!ep->msi_cap)
230                 return -EINVAL;
231
232         reg = ep->msi_cap + PCI_MSI_FLAGS;
233         val = dw_pcie_readw_dbi(pci, reg);
234         if (!(val & PCI_MSI_FLAGS_ENABLE))
235                 return -EINVAL;
236
237         val = (val & PCI_MSI_FLAGS_QSIZE) >> 4;
238
239         return val;
240 }
241
242 static int dw_pcie_ep_set_msi(struct pci_epc *epc, u8 func_no, u8 interrupts)
243 {
244         struct dw_pcie_ep *ep = epc_get_drvdata(epc);
245         struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
246         u32 val, reg;
247
248         if (!ep->msi_cap)
249                 return -EINVAL;
250
251         reg = ep->msi_cap + PCI_MSI_FLAGS;
252         val = dw_pcie_readw_dbi(pci, reg);
253         val &= ~PCI_MSI_FLAGS_QMASK;
254         val |= (interrupts << 1) & PCI_MSI_FLAGS_QMASK;
255         dw_pcie_dbi_ro_wr_en(pci);
256         dw_pcie_writew_dbi(pci, reg, val);
257         dw_pcie_dbi_ro_wr_dis(pci);
258
259         return 0;
260 }
261
262 static int dw_pcie_ep_get_msix(struct pci_epc *epc, u8 func_no)
263 {
264         struct dw_pcie_ep *ep = epc_get_drvdata(epc);
265         struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
266         u32 val, reg;
267
268         if (!ep->msix_cap)
269                 return -EINVAL;
270
271         reg = ep->msix_cap + PCI_MSIX_FLAGS;
272         val = dw_pcie_readw_dbi(pci, reg);
273         if (!(val & PCI_MSIX_FLAGS_ENABLE))
274                 return -EINVAL;
275
276         val &= PCI_MSIX_FLAGS_QSIZE;
277
278         return val;
279 }
280
281 static int dw_pcie_ep_set_msix(struct pci_epc *epc, u8 func_no, u16 interrupts,
282                                enum pci_barno bir, u32 offset)
283 {
284         struct dw_pcie_ep *ep = epc_get_drvdata(epc);
285         struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
286         u32 val, reg;
287
288         if (!ep->msix_cap)
289                 return -EINVAL;
290
291         dw_pcie_dbi_ro_wr_en(pci);
292
293         reg = ep->msix_cap + PCI_MSIX_FLAGS;
294         val = dw_pcie_readw_dbi(pci, reg);
295         val &= ~PCI_MSIX_FLAGS_QSIZE;
296         val |= interrupts;
297         dw_pcie_writew_dbi(pci, reg, val);
298
299         reg = ep->msix_cap + PCI_MSIX_TABLE;
300         val = offset | bir;
301         dw_pcie_writel_dbi(pci, reg, val);
302
303         reg = ep->msix_cap + PCI_MSIX_PBA;
304         val = (offset + (interrupts * PCI_MSIX_ENTRY_SIZE)) | bir;
305         dw_pcie_writel_dbi(pci, reg, val);
306
307         dw_pcie_dbi_ro_wr_dis(pci);
308
309         return 0;
310 }
311
312 static int dw_pcie_ep_raise_irq(struct pci_epc *epc, u8 func_no,
313                                 enum pci_epc_irq_type type, u16 interrupt_num)
314 {
315         struct dw_pcie_ep *ep = epc_get_drvdata(epc);
316
317         if (!ep->ops->raise_irq)
318                 return -EINVAL;
319
320         return ep->ops->raise_irq(ep, func_no, type, interrupt_num);
321 }
322
323 static void dw_pcie_ep_stop(struct pci_epc *epc)
324 {
325         struct dw_pcie_ep *ep = epc_get_drvdata(epc);
326         struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
327
328         if (!pci->ops->stop_link)
329                 return;
330
331         pci->ops->stop_link(pci);
332 }
333
334 static int dw_pcie_ep_start(struct pci_epc *epc)
335 {
336         struct dw_pcie_ep *ep = epc_get_drvdata(epc);
337         struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
338
339         if (!pci->ops->start_link)
340                 return -EINVAL;
341
342         return pci->ops->start_link(pci);
343 }
344
345 static const struct pci_epc_features*
346 dw_pcie_ep_get_features(struct pci_epc *epc, u8 func_no)
347 {
348         struct dw_pcie_ep *ep = epc_get_drvdata(epc);
349
350         if (!ep->ops->get_features)
351                 return NULL;
352
353         return ep->ops->get_features(ep);
354 }
355
356 static const struct pci_epc_ops epc_ops = {
357         .write_header           = dw_pcie_ep_write_header,
358         .set_bar                = dw_pcie_ep_set_bar,
359         .clear_bar              = dw_pcie_ep_clear_bar,
360         .map_addr               = dw_pcie_ep_map_addr,
361         .unmap_addr             = dw_pcie_ep_unmap_addr,
362         .set_msi                = dw_pcie_ep_set_msi,
363         .get_msi                = dw_pcie_ep_get_msi,
364         .set_msix               = dw_pcie_ep_set_msix,
365         .get_msix               = dw_pcie_ep_get_msix,
366         .raise_irq              = dw_pcie_ep_raise_irq,
367         .start                  = dw_pcie_ep_start,
368         .stop                   = dw_pcie_ep_stop,
369         .get_features           = dw_pcie_ep_get_features,
370 };
371
372 int dw_pcie_ep_raise_legacy_irq(struct dw_pcie_ep *ep, u8 func_no)
373 {
374         struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
375         struct device *dev = pci->dev;
376
377         dev_err(dev, "EP cannot trigger legacy IRQs\n");
378
379         return -EINVAL;
380 }
381
382 int dw_pcie_ep_raise_msi_irq(struct dw_pcie_ep *ep, u8 func_no,
383                              u8 interrupt_num)
384 {
385         struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
386         struct pci_epc *epc = ep->epc;
387         unsigned int aligned_offset;
388         u16 msg_ctrl, msg_data;
389         u32 msg_addr_lower, msg_addr_upper, reg;
390         u64 msg_addr;
391         bool has_upper;
392         int ret;
393
394         if (!ep->msi_cap)
395                 return -EINVAL;
396
397         /* Raise MSI per the PCI Local Bus Specification Revision 3.0, 6.8.1. */
398         reg = ep->msi_cap + PCI_MSI_FLAGS;
399         msg_ctrl = dw_pcie_readw_dbi(pci, reg);
400         has_upper = !!(msg_ctrl & PCI_MSI_FLAGS_64BIT);
401         reg = ep->msi_cap + PCI_MSI_ADDRESS_LO;
402         msg_addr_lower = dw_pcie_readl_dbi(pci, reg);
403         if (has_upper) {
404                 reg = ep->msi_cap + PCI_MSI_ADDRESS_HI;
405                 msg_addr_upper = dw_pcie_readl_dbi(pci, reg);
406                 reg = ep->msi_cap + PCI_MSI_DATA_64;
407                 msg_data = dw_pcie_readw_dbi(pci, reg);
408         } else {
409                 msg_addr_upper = 0;
410                 reg = ep->msi_cap + PCI_MSI_DATA_32;
411                 msg_data = dw_pcie_readw_dbi(pci, reg);
412         }
413         aligned_offset = msg_addr_lower & (epc->mem->page_size - 1);
414         msg_addr = ((u64)msg_addr_upper) << 32 |
415                         (msg_addr_lower & ~aligned_offset);
416         ret = dw_pcie_ep_map_addr(epc, func_no, ep->msi_mem_phys, msg_addr,
417                                   epc->mem->page_size);
418         if (ret)
419                 return ret;
420
421         writel(msg_data | (interrupt_num - 1), ep->msi_mem + aligned_offset);
422
423         dw_pcie_ep_unmap_addr(epc, func_no, ep->msi_mem_phys);
424
425         return 0;
426 }
427
428 int dw_pcie_ep_raise_msix_irq(struct dw_pcie_ep *ep, u8 func_no,
429                              u16 interrupt_num)
430 {
431         struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
432         struct pci_epc *epc = ep->epc;
433         u16 tbl_offset, bir;
434         u32 bar_addr_upper, bar_addr_lower;
435         u32 msg_addr_upper, msg_addr_lower;
436         u32 reg, msg_data, vec_ctrl;
437         u64 tbl_addr, msg_addr, reg_u64;
438         void __iomem *msix_tbl;
439         int ret;
440
441         reg = ep->msix_cap + PCI_MSIX_TABLE;
442         tbl_offset = dw_pcie_readl_dbi(pci, reg);
443         bir = (tbl_offset & PCI_MSIX_TABLE_BIR);
444         tbl_offset &= PCI_MSIX_TABLE_OFFSET;
445
446         reg = PCI_BASE_ADDRESS_0 + (4 * bir);
447         bar_addr_upper = 0;
448         bar_addr_lower = dw_pcie_readl_dbi(pci, reg);
449         reg_u64 = (bar_addr_lower & PCI_BASE_ADDRESS_MEM_TYPE_MASK);
450         if (reg_u64 == PCI_BASE_ADDRESS_MEM_TYPE_64)
451                 bar_addr_upper = dw_pcie_readl_dbi(pci, reg + 4);
452
453         tbl_addr = ((u64) bar_addr_upper) << 32 | bar_addr_lower;
454         tbl_addr += (tbl_offset + ((interrupt_num - 1) * PCI_MSIX_ENTRY_SIZE));
455         tbl_addr &= PCI_BASE_ADDRESS_MEM_MASK;
456
457         msix_tbl = ioremap(ep->phys_base + tbl_addr,
458                                    PCI_MSIX_ENTRY_SIZE);
459         if (!msix_tbl)
460                 return -EINVAL;
461
462         msg_addr_lower = readl(msix_tbl + PCI_MSIX_ENTRY_LOWER_ADDR);
463         msg_addr_upper = readl(msix_tbl + PCI_MSIX_ENTRY_UPPER_ADDR);
464         msg_addr = ((u64) msg_addr_upper) << 32 | msg_addr_lower;
465         msg_data = readl(msix_tbl + PCI_MSIX_ENTRY_DATA);
466         vec_ctrl = readl(msix_tbl + PCI_MSIX_ENTRY_VECTOR_CTRL);
467
468         iounmap(msix_tbl);
469
470         if (vec_ctrl & PCI_MSIX_ENTRY_CTRL_MASKBIT) {
471                 dev_dbg(pci->dev, "MSI-X entry ctrl set\n");
472                 return -EPERM;
473         }
474
475         ret = dw_pcie_ep_map_addr(epc, func_no, ep->msi_mem_phys, msg_addr,
476                                   epc->mem->page_size);
477         if (ret)
478                 return ret;
479
480         writel(msg_data, ep->msi_mem);
481
482         dw_pcie_ep_unmap_addr(epc, func_no, ep->msi_mem_phys);
483
484         return 0;
485 }
486
487 void dw_pcie_ep_exit(struct dw_pcie_ep *ep)
488 {
489         struct pci_epc *epc = ep->epc;
490
491         pci_epc_mem_free_addr(epc, ep->msi_mem_phys, ep->msi_mem,
492                               epc->mem->page_size);
493
494         pci_epc_mem_exit(epc);
495 }
496
497 static unsigned int dw_pcie_ep_find_ext_capability(struct dw_pcie *pci, int cap)
498 {
499         u32 header;
500         int pos = PCI_CFG_SPACE_SIZE;
501
502         while (pos) {
503                 header = dw_pcie_readl_dbi(pci, pos);
504                 if (PCI_EXT_CAP_ID(header) == cap)
505                         return pos;
506
507                 pos = PCI_EXT_CAP_NEXT(header);
508                 if (!pos)
509                         break;
510         }
511
512         return 0;
513 }
514
515 int dw_pcie_ep_init_complete(struct dw_pcie_ep *ep)
516 {
517         struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
518         unsigned int offset;
519         unsigned int nbars;
520         u8 hdr_type;
521         u32 reg;
522         int i;
523
524         hdr_type = dw_pcie_readb_dbi(pci, PCI_HEADER_TYPE);
525         if (hdr_type != PCI_HEADER_TYPE_NORMAL) {
526                 dev_err(pci->dev,
527                         "PCIe controller is not set to EP mode (hdr_type:0x%x)!\n",
528                         hdr_type);
529                 return -EIO;
530         }
531
532         ep->msi_cap = dw_pcie_find_capability(pci, PCI_CAP_ID_MSI);
533
534         ep->msix_cap = dw_pcie_find_capability(pci, PCI_CAP_ID_MSIX);
535
536         offset = dw_pcie_ep_find_ext_capability(pci, PCI_EXT_CAP_ID_REBAR);
537         if (offset) {
538                 reg = dw_pcie_readl_dbi(pci, offset + PCI_REBAR_CTRL);
539                 nbars = (reg & PCI_REBAR_CTRL_NBAR_MASK) >>
540                         PCI_REBAR_CTRL_NBAR_SHIFT;
541
542                 dw_pcie_dbi_ro_wr_en(pci);
543                 for (i = 0; i < nbars; i++, offset += PCI_REBAR_CTRL)
544                         dw_pcie_writel_dbi(pci, offset + PCI_REBAR_CAP, 0x0);
545                 dw_pcie_dbi_ro_wr_dis(pci);
546         }
547
548         dw_pcie_setup(pci);
549
550         return 0;
551 }
552 EXPORT_SYMBOL_GPL(dw_pcie_ep_init_complete);
553
554 int dw_pcie_ep_init(struct dw_pcie_ep *ep)
555 {
556         int ret;
557         void *addr;
558         struct pci_epc *epc;
559         struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
560         struct device *dev = pci->dev;
561         struct device_node *np = dev->of_node;
562         const struct pci_epc_features *epc_features;
563
564         if (!pci->dbi_base || !pci->dbi_base2) {
565                 dev_err(dev, "dbi_base/dbi_base2 is not populated\n");
566                 return -EINVAL;
567         }
568
569         ret = of_property_read_u32(np, "num-ib-windows", &ep->num_ib_windows);
570         if (ret < 0) {
571                 dev_err(dev, "Unable to read *num-ib-windows* property\n");
572                 return ret;
573         }
574         if (ep->num_ib_windows > MAX_IATU_IN) {
575                 dev_err(dev, "Invalid *num-ib-windows*\n");
576                 return -EINVAL;
577         }
578
579         ret = of_property_read_u32(np, "num-ob-windows", &ep->num_ob_windows);
580         if (ret < 0) {
581                 dev_err(dev, "Unable to read *num-ob-windows* property\n");
582                 return ret;
583         }
584         if (ep->num_ob_windows > MAX_IATU_OUT) {
585                 dev_err(dev, "Invalid *num-ob-windows*\n");
586                 return -EINVAL;
587         }
588
589         ep->ib_window_map = devm_kcalloc(dev,
590                                          BITS_TO_LONGS(ep->num_ib_windows),
591                                          sizeof(long),
592                                          GFP_KERNEL);
593         if (!ep->ib_window_map)
594                 return -ENOMEM;
595
596         ep->ob_window_map = devm_kcalloc(dev,
597                                          BITS_TO_LONGS(ep->num_ob_windows),
598                                          sizeof(long),
599                                          GFP_KERNEL);
600         if (!ep->ob_window_map)
601                 return -ENOMEM;
602
603         addr = devm_kcalloc(dev, ep->num_ob_windows, sizeof(phys_addr_t),
604                             GFP_KERNEL);
605         if (!addr)
606                 return -ENOMEM;
607         ep->outbound_addr = addr;
608
609         epc = devm_pci_epc_create(dev, &epc_ops);
610         if (IS_ERR(epc)) {
611                 dev_err(dev, "Failed to create epc device\n");
612                 return PTR_ERR(epc);
613         }
614
615         ep->epc = epc;
616         epc_set_drvdata(epc, ep);
617
618         if (ep->ops->ep_init)
619                 ep->ops->ep_init(ep);
620
621         ret = of_property_read_u8(np, "max-functions", &epc->max_functions);
622         if (ret < 0)
623                 epc->max_functions = 1;
624
625         ret = __pci_epc_mem_init(epc, ep->phys_base, ep->addr_size,
626                                  ep->page_size);
627         if (ret < 0) {
628                 dev_err(dev, "Failed to initialize address space\n");
629                 return ret;
630         }
631
632         ep->msi_mem = pci_epc_mem_alloc_addr(epc, &ep->msi_mem_phys,
633                                              epc->mem->page_size);
634         if (!ep->msi_mem) {
635                 dev_err(dev, "Failed to reserve memory for MSI/MSI-X\n");
636                 return -ENOMEM;
637         }
638
639         if (ep->ops->get_features) {
640                 epc_features = ep->ops->get_features(ep);
641                 if (epc_features->core_init_notifier)
642                         return 0;
643         }
644
645         return dw_pcie_ep_init_complete(ep);
646 }
647 EXPORT_SYMBOL_GPL(dw_pcie_ep_init);