GNU Linux-libre 6.1.24-gnu
[releases.git] / drivers / pci / controller / pcie-altera.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Copyright Altera Corporation (C) 2013-2015. All rights reserved
4  *
5  * Author: Ley Foon Tan <lftan@altera.com>
6  * Description: Altera PCIe host controller driver
7  */
8
9 #include <linux/delay.h>
10 #include <linux/interrupt.h>
11 #include <linux/irqchip/chained_irq.h>
12 #include <linux/init.h>
13 #include <linux/module.h>
14 #include <linux/of_address.h>
15 #include <linux/of_device.h>
16 #include <linux/of_irq.h>
17 #include <linux/of_pci.h>
18 #include <linux/pci.h>
19 #include <linux/platform_device.h>
20 #include <linux/slab.h>
21
22 #include "../pci.h"
23
24 #define RP_TX_REG0                      0x2000
25 #define RP_TX_REG1                      0x2004
26 #define RP_TX_CNTRL                     0x2008
27 #define RP_TX_EOP                       0x2
28 #define RP_TX_SOP                       0x1
29 #define RP_RXCPL_STATUS                 0x2010
30 #define RP_RXCPL_EOP                    0x2
31 #define RP_RXCPL_SOP                    0x1
32 #define RP_RXCPL_REG0                   0x2014
33 #define RP_RXCPL_REG1                   0x2018
34 #define P2A_INT_STATUS                  0x3060
35 #define P2A_INT_STS_ALL                 0xf
36 #define P2A_INT_ENABLE                  0x3070
37 #define P2A_INT_ENA_ALL                 0xf
38 #define RP_LTSSM                        0x3c64
39 #define RP_LTSSM_MASK                   0x1f
40 #define LTSSM_L0                        0xf
41
42 #define S10_RP_TX_CNTRL                 0x2004
43 #define S10_RP_RXCPL_REG                0x2008
44 #define S10_RP_RXCPL_STATUS             0x200C
45 #define S10_RP_CFG_ADDR(pcie, reg)      \
46         (((pcie)->hip_base) + (reg) + (1 << 20))
47 #define S10_RP_SECONDARY(pcie)          \
48         readb(S10_RP_CFG_ADDR(pcie, PCI_SECONDARY_BUS))
49
50 /* TLP configuration type 0 and 1 */
51 #define TLP_FMTTYPE_CFGRD0              0x04    /* Configuration Read Type 0 */
52 #define TLP_FMTTYPE_CFGWR0              0x44    /* Configuration Write Type 0 */
53 #define TLP_FMTTYPE_CFGRD1              0x05    /* Configuration Read Type 1 */
54 #define TLP_FMTTYPE_CFGWR1              0x45    /* Configuration Write Type 1 */
55 #define TLP_PAYLOAD_SIZE                0x01
56 #define TLP_READ_TAG                    0x1d
57 #define TLP_WRITE_TAG                   0x10
58 #define RP_DEVFN                        0
59 #define TLP_REQ_ID(bus, devfn)          (((bus) << 8) | (devfn))
60 #define TLP_CFG_DW0(pcie, cfg)          \
61                 (((cfg) << 24) |        \
62                   TLP_PAYLOAD_SIZE)
63 #define TLP_CFG_DW1(pcie, tag, be)      \
64         (((TLP_REQ_ID(pcie->root_bus_nr,  RP_DEVFN)) << 16) | (tag << 8) | (be))
65 #define TLP_CFG_DW2(bus, devfn, offset) \
66                                 (((bus) << 24) | ((devfn) << 16) | (offset))
67 #define TLP_COMP_STATUS(s)              (((s) >> 13) & 7)
68 #define TLP_BYTE_COUNT(s)               (((s) >> 0) & 0xfff)
69 #define TLP_HDR_SIZE                    3
70 #define TLP_LOOP                        500
71
72 #define LINK_UP_TIMEOUT                 HZ
73 #define LINK_RETRAIN_TIMEOUT            HZ
74
75 #define DWORD_MASK                      3
76
77 #define S10_TLP_FMTTYPE_CFGRD0          0x05
78 #define S10_TLP_FMTTYPE_CFGRD1          0x04
79 #define S10_TLP_FMTTYPE_CFGWR0          0x45
80 #define S10_TLP_FMTTYPE_CFGWR1          0x44
81
82 enum altera_pcie_version {
83         ALTERA_PCIE_V1 = 0,
84         ALTERA_PCIE_V2,
85 };
86
87 struct altera_pcie {
88         struct platform_device  *pdev;
89         void __iomem            *cra_base;
90         void __iomem            *hip_base;
91         int                     irq;
92         u8                      root_bus_nr;
93         struct irq_domain       *irq_domain;
94         struct resource         bus_range;
95         const struct altera_pcie_data   *pcie_data;
96 };
97
98 struct altera_pcie_ops {
99         int (*tlp_read_pkt)(struct altera_pcie *pcie, u32 *value);
100         void (*tlp_write_pkt)(struct altera_pcie *pcie, u32 *headers,
101                               u32 data, bool align);
102         bool (*get_link_status)(struct altera_pcie *pcie);
103         int (*rp_read_cfg)(struct altera_pcie *pcie, int where,
104                            int size, u32 *value);
105         int (*rp_write_cfg)(struct altera_pcie *pcie, u8 busno,
106                             int where, int size, u32 value);
107 };
108
109 struct altera_pcie_data {
110         const struct altera_pcie_ops *ops;
111         enum altera_pcie_version version;
112         u32 cap_offset;         /* PCIe capability structure register offset */
113         u32 cfgrd0;
114         u32 cfgrd1;
115         u32 cfgwr0;
116         u32 cfgwr1;
117 };
118
119 struct tlp_rp_regpair_t {
120         u32 ctrl;
121         u32 reg0;
122         u32 reg1;
123 };
124
125 static inline void cra_writel(struct altera_pcie *pcie, const u32 value,
126                               const u32 reg)
127 {
128         writel_relaxed(value, pcie->cra_base + reg);
129 }
130
131 static inline u32 cra_readl(struct altera_pcie *pcie, const u32 reg)
132 {
133         return readl_relaxed(pcie->cra_base + reg);
134 }
135
136 static bool altera_pcie_link_up(struct altera_pcie *pcie)
137 {
138         return !!((cra_readl(pcie, RP_LTSSM) & RP_LTSSM_MASK) == LTSSM_L0);
139 }
140
141 static bool s10_altera_pcie_link_up(struct altera_pcie *pcie)
142 {
143         void __iomem *addr = S10_RP_CFG_ADDR(pcie,
144                                    pcie->pcie_data->cap_offset +
145                                    PCI_EXP_LNKSTA);
146
147         return !!(readw(addr) & PCI_EXP_LNKSTA_DLLLA);
148 }
149
150 /*
151  * Altera PCIe port uses BAR0 of RC's configuration space as the translation
152  * from PCI bus to native BUS.  Entire DDR region is mapped into PCIe space
153  * using these registers, so it can be reached by DMA from EP devices.
154  * This BAR0 will also access to MSI vector when receiving MSI/MSIX interrupt
155  * from EP devices, eventually trigger interrupt to GIC.  The BAR0 of bridge
156  * should be hidden during enumeration to avoid the sizing and resource
157  * allocation by PCIe core.
158  */
159 static bool altera_pcie_hide_rc_bar(struct pci_bus *bus, unsigned int  devfn,
160                                     int offset)
161 {
162         if (pci_is_root_bus(bus) && (devfn == 0) &&
163             (offset == PCI_BASE_ADDRESS_0))
164                 return true;
165
166         return false;
167 }
168
169 static void tlp_write_tx(struct altera_pcie *pcie,
170                          struct tlp_rp_regpair_t *tlp_rp_regdata)
171 {
172         cra_writel(pcie, tlp_rp_regdata->reg0, RP_TX_REG0);
173         cra_writel(pcie, tlp_rp_regdata->reg1, RP_TX_REG1);
174         cra_writel(pcie, tlp_rp_regdata->ctrl, RP_TX_CNTRL);
175 }
176
177 static void s10_tlp_write_tx(struct altera_pcie *pcie, u32 reg0, u32 ctrl)
178 {
179         cra_writel(pcie, reg0, RP_TX_REG0);
180         cra_writel(pcie, ctrl, S10_RP_TX_CNTRL);
181 }
182
183 static bool altera_pcie_valid_device(struct altera_pcie *pcie,
184                                      struct pci_bus *bus, int dev)
185 {
186         /* If there is no link, then there is no device */
187         if (bus->number != pcie->root_bus_nr) {
188                 if (!pcie->pcie_data->ops->get_link_status(pcie))
189                         return false;
190         }
191
192         /* access only one slot on each root port */
193         if (bus->number == pcie->root_bus_nr && dev > 0)
194                 return false;
195
196         return true;
197 }
198
199 static int tlp_read_packet(struct altera_pcie *pcie, u32 *value)
200 {
201         int i;
202         bool sop = false;
203         u32 ctrl;
204         u32 reg0, reg1;
205         u32 comp_status = 1;
206
207         /*
208          * Minimum 2 loops to read TLP headers and 1 loop to read data
209          * payload.
210          */
211         for (i = 0; i < TLP_LOOP; i++) {
212                 ctrl = cra_readl(pcie, RP_RXCPL_STATUS);
213                 if ((ctrl & RP_RXCPL_SOP) || (ctrl & RP_RXCPL_EOP) || sop) {
214                         reg0 = cra_readl(pcie, RP_RXCPL_REG0);
215                         reg1 = cra_readl(pcie, RP_RXCPL_REG1);
216
217                         if (ctrl & RP_RXCPL_SOP) {
218                                 sop = true;
219                                 comp_status = TLP_COMP_STATUS(reg1);
220                         }
221
222                         if (ctrl & RP_RXCPL_EOP) {
223                                 if (comp_status)
224                                         return PCIBIOS_DEVICE_NOT_FOUND;
225
226                                 if (value)
227                                         *value = reg0;
228
229                                 return PCIBIOS_SUCCESSFUL;
230                         }
231                 }
232                 udelay(5);
233         }
234
235         return PCIBIOS_DEVICE_NOT_FOUND;
236 }
237
238 static int s10_tlp_read_packet(struct altera_pcie *pcie, u32 *value)
239 {
240         u32 ctrl;
241         u32 comp_status;
242         u32 dw[4];
243         u32 count;
244         struct device *dev = &pcie->pdev->dev;
245
246         for (count = 0; count < TLP_LOOP; count++) {
247                 ctrl = cra_readl(pcie, S10_RP_RXCPL_STATUS);
248                 if (ctrl & RP_RXCPL_SOP) {
249                         /* Read first DW */
250                         dw[0] = cra_readl(pcie, S10_RP_RXCPL_REG);
251                         break;
252                 }
253
254                 udelay(5);
255         }
256
257         /* SOP detection failed, return error */
258         if (count == TLP_LOOP)
259                 return PCIBIOS_DEVICE_NOT_FOUND;
260
261         count = 1;
262
263         /* Poll for EOP */
264         while (count < ARRAY_SIZE(dw)) {
265                 ctrl = cra_readl(pcie, S10_RP_RXCPL_STATUS);
266                 dw[count++] = cra_readl(pcie, S10_RP_RXCPL_REG);
267                 if (ctrl & RP_RXCPL_EOP) {
268                         comp_status = TLP_COMP_STATUS(dw[1]);
269                         if (comp_status)
270                                 return PCIBIOS_DEVICE_NOT_FOUND;
271
272                         if (value && TLP_BYTE_COUNT(dw[1]) == sizeof(u32) &&
273                             count == 4)
274                                 *value = dw[3];
275
276                         return PCIBIOS_SUCCESSFUL;
277                 }
278         }
279
280         dev_warn(dev, "Malformed TLP packet\n");
281
282         return PCIBIOS_DEVICE_NOT_FOUND;
283 }
284
285 static void tlp_write_packet(struct altera_pcie *pcie, u32 *headers,
286                              u32 data, bool align)
287 {
288         struct tlp_rp_regpair_t tlp_rp_regdata;
289
290         tlp_rp_regdata.reg0 = headers[0];
291         tlp_rp_regdata.reg1 = headers[1];
292         tlp_rp_regdata.ctrl = RP_TX_SOP;
293         tlp_write_tx(pcie, &tlp_rp_regdata);
294
295         if (align) {
296                 tlp_rp_regdata.reg0 = headers[2];
297                 tlp_rp_regdata.reg1 = 0;
298                 tlp_rp_regdata.ctrl = 0;
299                 tlp_write_tx(pcie, &tlp_rp_regdata);
300
301                 tlp_rp_regdata.reg0 = data;
302                 tlp_rp_regdata.reg1 = 0;
303         } else {
304                 tlp_rp_regdata.reg0 = headers[2];
305                 tlp_rp_regdata.reg1 = data;
306         }
307
308         tlp_rp_regdata.ctrl = RP_TX_EOP;
309         tlp_write_tx(pcie, &tlp_rp_regdata);
310 }
311
312 static void s10_tlp_write_packet(struct altera_pcie *pcie, u32 *headers,
313                                  u32 data, bool dummy)
314 {
315         s10_tlp_write_tx(pcie, headers[0], RP_TX_SOP);
316         s10_tlp_write_tx(pcie, headers[1], 0);
317         s10_tlp_write_tx(pcie, headers[2], 0);
318         s10_tlp_write_tx(pcie, data, RP_TX_EOP);
319 }
320
321 static void get_tlp_header(struct altera_pcie *pcie, u8 bus, u32 devfn,
322                            int where, u8 byte_en, bool read, u32 *headers)
323 {
324         u8 cfg;
325         u8 cfg0 = read ? pcie->pcie_data->cfgrd0 : pcie->pcie_data->cfgwr0;
326         u8 cfg1 = read ? pcie->pcie_data->cfgrd1 : pcie->pcie_data->cfgwr1;
327         u8 tag = read ? TLP_READ_TAG : TLP_WRITE_TAG;
328
329         if (pcie->pcie_data->version == ALTERA_PCIE_V1)
330                 cfg = (bus == pcie->root_bus_nr) ? cfg0 : cfg1;
331         else
332                 cfg = (bus > S10_RP_SECONDARY(pcie)) ? cfg0 : cfg1;
333
334         headers[0] = TLP_CFG_DW0(pcie, cfg);
335         headers[1] = TLP_CFG_DW1(pcie, tag, byte_en);
336         headers[2] = TLP_CFG_DW2(bus, devfn, where);
337 }
338
339 static int tlp_cfg_dword_read(struct altera_pcie *pcie, u8 bus, u32 devfn,
340                               int where, u8 byte_en, u32 *value)
341 {
342         u32 headers[TLP_HDR_SIZE];
343
344         get_tlp_header(pcie, bus, devfn, where, byte_en, true,
345                        headers);
346
347         pcie->pcie_data->ops->tlp_write_pkt(pcie, headers, 0, false);
348
349         return pcie->pcie_data->ops->tlp_read_pkt(pcie, value);
350 }
351
352 static int tlp_cfg_dword_write(struct altera_pcie *pcie, u8 bus, u32 devfn,
353                                int where, u8 byte_en, u32 value)
354 {
355         u32 headers[TLP_HDR_SIZE];
356         int ret;
357
358         get_tlp_header(pcie, bus, devfn, where, byte_en, false,
359                        headers);
360
361         /* check alignment to Qword */
362         if ((where & 0x7) == 0)
363                 pcie->pcie_data->ops->tlp_write_pkt(pcie, headers,
364                                                     value, true);
365         else
366                 pcie->pcie_data->ops->tlp_write_pkt(pcie, headers,
367                                                     value, false);
368
369         ret = pcie->pcie_data->ops->tlp_read_pkt(pcie, NULL);
370         if (ret != PCIBIOS_SUCCESSFUL)
371                 return ret;
372
373         /*
374          * Monitor changes to PCI_PRIMARY_BUS register on root port
375          * and update local copy of root bus number accordingly.
376          */
377         if ((bus == pcie->root_bus_nr) && (where == PCI_PRIMARY_BUS))
378                 pcie->root_bus_nr = (u8)(value);
379
380         return PCIBIOS_SUCCESSFUL;
381 }
382
383 static int s10_rp_read_cfg(struct altera_pcie *pcie, int where,
384                            int size, u32 *value)
385 {
386         void __iomem *addr = S10_RP_CFG_ADDR(pcie, where);
387
388         switch (size) {
389         case 1:
390                 *value = readb(addr);
391                 break;
392         case 2:
393                 *value = readw(addr);
394                 break;
395         default:
396                 *value = readl(addr);
397                 break;
398         }
399
400         return PCIBIOS_SUCCESSFUL;
401 }
402
403 static int s10_rp_write_cfg(struct altera_pcie *pcie, u8 busno,
404                             int where, int size, u32 value)
405 {
406         void __iomem *addr = S10_RP_CFG_ADDR(pcie, where);
407
408         switch (size) {
409         case 1:
410                 writeb(value, addr);
411                 break;
412         case 2:
413                 writew(value, addr);
414                 break;
415         default:
416                 writel(value, addr);
417                 break;
418         }
419
420         /*
421          * Monitor changes to PCI_PRIMARY_BUS register on root port
422          * and update local copy of root bus number accordingly.
423          */
424         if (busno == pcie->root_bus_nr && where == PCI_PRIMARY_BUS)
425                 pcie->root_bus_nr = value & 0xff;
426
427         return PCIBIOS_SUCCESSFUL;
428 }
429
430 static int _altera_pcie_cfg_read(struct altera_pcie *pcie, u8 busno,
431                                  unsigned int devfn, int where, int size,
432                                  u32 *value)
433 {
434         int ret;
435         u32 data;
436         u8 byte_en;
437
438         if (busno == pcie->root_bus_nr && pcie->pcie_data->ops->rp_read_cfg)
439                 return pcie->pcie_data->ops->rp_read_cfg(pcie, where,
440                                                          size, value);
441
442         switch (size) {
443         case 1:
444                 byte_en = 1 << (where & 3);
445                 break;
446         case 2:
447                 byte_en = 3 << (where & 3);
448                 break;
449         default:
450                 byte_en = 0xf;
451                 break;
452         }
453
454         ret = tlp_cfg_dword_read(pcie, busno, devfn,
455                                  (where & ~DWORD_MASK), byte_en, &data);
456         if (ret != PCIBIOS_SUCCESSFUL)
457                 return ret;
458
459         switch (size) {
460         case 1:
461                 *value = (data >> (8 * (where & 0x3))) & 0xff;
462                 break;
463         case 2:
464                 *value = (data >> (8 * (where & 0x2))) & 0xffff;
465                 break;
466         default:
467                 *value = data;
468                 break;
469         }
470
471         return PCIBIOS_SUCCESSFUL;
472 }
473
474 static int _altera_pcie_cfg_write(struct altera_pcie *pcie, u8 busno,
475                                   unsigned int devfn, int where, int size,
476                                   u32 value)
477 {
478         u32 data32;
479         u32 shift = 8 * (where & 3);
480         u8 byte_en;
481
482         if (busno == pcie->root_bus_nr && pcie->pcie_data->ops->rp_write_cfg)
483                 return pcie->pcie_data->ops->rp_write_cfg(pcie, busno,
484                                                      where, size, value);
485
486         switch (size) {
487         case 1:
488                 data32 = (value & 0xff) << shift;
489                 byte_en = 1 << (where & 3);
490                 break;
491         case 2:
492                 data32 = (value & 0xffff) << shift;
493                 byte_en = 3 << (where & 3);
494                 break;
495         default:
496                 data32 = value;
497                 byte_en = 0xf;
498                 break;
499         }
500
501         return tlp_cfg_dword_write(pcie, busno, devfn, (where & ~DWORD_MASK),
502                                    byte_en, data32);
503 }
504
505 static int altera_pcie_cfg_read(struct pci_bus *bus, unsigned int devfn,
506                                 int where, int size, u32 *value)
507 {
508         struct altera_pcie *pcie = bus->sysdata;
509
510         if (altera_pcie_hide_rc_bar(bus, devfn, where))
511                 return PCIBIOS_BAD_REGISTER_NUMBER;
512
513         if (!altera_pcie_valid_device(pcie, bus, PCI_SLOT(devfn)))
514                 return PCIBIOS_DEVICE_NOT_FOUND;
515
516         return _altera_pcie_cfg_read(pcie, bus->number, devfn, where, size,
517                                      value);
518 }
519
520 static int altera_pcie_cfg_write(struct pci_bus *bus, unsigned int devfn,
521                                  int where, int size, u32 value)
522 {
523         struct altera_pcie *pcie = bus->sysdata;
524
525         if (altera_pcie_hide_rc_bar(bus, devfn, where))
526                 return PCIBIOS_BAD_REGISTER_NUMBER;
527
528         if (!altera_pcie_valid_device(pcie, bus, PCI_SLOT(devfn)))
529                 return PCIBIOS_DEVICE_NOT_FOUND;
530
531         return _altera_pcie_cfg_write(pcie, bus->number, devfn, where, size,
532                                      value);
533 }
534
535 static struct pci_ops altera_pcie_ops = {
536         .read = altera_pcie_cfg_read,
537         .write = altera_pcie_cfg_write,
538 };
539
540 static int altera_read_cap_word(struct altera_pcie *pcie, u8 busno,
541                                 unsigned int devfn, int offset, u16 *value)
542 {
543         u32 data;
544         int ret;
545
546         ret = _altera_pcie_cfg_read(pcie, busno, devfn,
547                                     pcie->pcie_data->cap_offset + offset,
548                                     sizeof(*value),
549                                     &data);
550         *value = data;
551         return ret;
552 }
553
554 static int altera_write_cap_word(struct altera_pcie *pcie, u8 busno,
555                                  unsigned int devfn, int offset, u16 value)
556 {
557         return _altera_pcie_cfg_write(pcie, busno, devfn,
558                                       pcie->pcie_data->cap_offset + offset,
559                                       sizeof(value),
560                                       value);
561 }
562
563 static void altera_wait_link_retrain(struct altera_pcie *pcie)
564 {
565         struct device *dev = &pcie->pdev->dev;
566         u16 reg16;
567         unsigned long start_jiffies;
568
569         /* Wait for link training end. */
570         start_jiffies = jiffies;
571         for (;;) {
572                 altera_read_cap_word(pcie, pcie->root_bus_nr, RP_DEVFN,
573                                      PCI_EXP_LNKSTA, &reg16);
574                 if (!(reg16 & PCI_EXP_LNKSTA_LT))
575                         break;
576
577                 if (time_after(jiffies, start_jiffies + LINK_RETRAIN_TIMEOUT)) {
578                         dev_err(dev, "link retrain timeout\n");
579                         break;
580                 }
581                 udelay(100);
582         }
583
584         /* Wait for link is up */
585         start_jiffies = jiffies;
586         for (;;) {
587                 if (pcie->pcie_data->ops->get_link_status(pcie))
588                         break;
589
590                 if (time_after(jiffies, start_jiffies + LINK_UP_TIMEOUT)) {
591                         dev_err(dev, "link up timeout\n");
592                         break;
593                 }
594                 udelay(100);
595         }
596 }
597
598 static void altera_pcie_retrain(struct altera_pcie *pcie)
599 {
600         u16 linkcap, linkstat, linkctl;
601
602         if (!pcie->pcie_data->ops->get_link_status(pcie))
603                 return;
604
605         /*
606          * Set the retrain bit if the PCIe rootport support > 2.5GB/s, but
607          * current speed is 2.5 GB/s.
608          */
609         altera_read_cap_word(pcie, pcie->root_bus_nr, RP_DEVFN, PCI_EXP_LNKCAP,
610                              &linkcap);
611         if ((linkcap & PCI_EXP_LNKCAP_SLS) <= PCI_EXP_LNKCAP_SLS_2_5GB)
612                 return;
613
614         altera_read_cap_word(pcie, pcie->root_bus_nr, RP_DEVFN, PCI_EXP_LNKSTA,
615                              &linkstat);
616         if ((linkstat & PCI_EXP_LNKSTA_CLS) == PCI_EXP_LNKSTA_CLS_2_5GB) {
617                 altera_read_cap_word(pcie, pcie->root_bus_nr, RP_DEVFN,
618                                      PCI_EXP_LNKCTL, &linkctl);
619                 linkctl |= PCI_EXP_LNKCTL_RL;
620                 altera_write_cap_word(pcie, pcie->root_bus_nr, RP_DEVFN,
621                                       PCI_EXP_LNKCTL, linkctl);
622
623                 altera_wait_link_retrain(pcie);
624         }
625 }
626
627 static int altera_pcie_intx_map(struct irq_domain *domain, unsigned int irq,
628                                 irq_hw_number_t hwirq)
629 {
630         irq_set_chip_and_handler(irq, &dummy_irq_chip, handle_simple_irq);
631         irq_set_chip_data(irq, domain->host_data);
632         return 0;
633 }
634
635 static const struct irq_domain_ops intx_domain_ops = {
636         .map = altera_pcie_intx_map,
637         .xlate = pci_irqd_intx_xlate,
638 };
639
640 static void altera_pcie_isr(struct irq_desc *desc)
641 {
642         struct irq_chip *chip = irq_desc_get_chip(desc);
643         struct altera_pcie *pcie;
644         struct device *dev;
645         unsigned long status;
646         u32 bit;
647         int ret;
648
649         chained_irq_enter(chip, desc);
650         pcie = irq_desc_get_handler_data(desc);
651         dev = &pcie->pdev->dev;
652
653         while ((status = cra_readl(pcie, P2A_INT_STATUS)
654                 & P2A_INT_STS_ALL) != 0) {
655                 for_each_set_bit(bit, &status, PCI_NUM_INTX) {
656                         /* clear interrupts */
657                         cra_writel(pcie, 1 << bit, P2A_INT_STATUS);
658
659                         ret = generic_handle_domain_irq(pcie->irq_domain, bit);
660                         if (ret)
661                                 dev_err_ratelimited(dev, "unexpected IRQ, INT%d\n", bit);
662                 }
663         }
664
665         chained_irq_exit(chip, desc);
666 }
667
668 static int altera_pcie_init_irq_domain(struct altera_pcie *pcie)
669 {
670         struct device *dev = &pcie->pdev->dev;
671         struct device_node *node = dev->of_node;
672
673         /* Setup INTx */
674         pcie->irq_domain = irq_domain_add_linear(node, PCI_NUM_INTX,
675                                         &intx_domain_ops, pcie);
676         if (!pcie->irq_domain) {
677                 dev_err(dev, "Failed to get a INTx IRQ domain\n");
678                 return -ENOMEM;
679         }
680
681         return 0;
682 }
683
684 static void altera_pcie_irq_teardown(struct altera_pcie *pcie)
685 {
686         irq_set_chained_handler_and_data(pcie->irq, NULL, NULL);
687         irq_domain_remove(pcie->irq_domain);
688         irq_dispose_mapping(pcie->irq);
689 }
690
691 static int altera_pcie_parse_dt(struct altera_pcie *pcie)
692 {
693         struct platform_device *pdev = pcie->pdev;
694
695         pcie->cra_base = devm_platform_ioremap_resource_byname(pdev, "Cra");
696         if (IS_ERR(pcie->cra_base))
697                 return PTR_ERR(pcie->cra_base);
698
699         if (pcie->pcie_data->version == ALTERA_PCIE_V2) {
700                 pcie->hip_base =
701                         devm_platform_ioremap_resource_byname(pdev, "Hip");
702                 if (IS_ERR(pcie->hip_base))
703                         return PTR_ERR(pcie->hip_base);
704         }
705
706         /* setup IRQ */
707         pcie->irq = platform_get_irq(pdev, 0);
708         if (pcie->irq < 0)
709                 return pcie->irq;
710
711         irq_set_chained_handler_and_data(pcie->irq, altera_pcie_isr, pcie);
712         return 0;
713 }
714
715 static void altera_pcie_host_init(struct altera_pcie *pcie)
716 {
717         altera_pcie_retrain(pcie);
718 }
719
720 static const struct altera_pcie_ops altera_pcie_ops_1_0 = {
721         .tlp_read_pkt = tlp_read_packet,
722         .tlp_write_pkt = tlp_write_packet,
723         .get_link_status = altera_pcie_link_up,
724 };
725
726 static const struct altera_pcie_ops altera_pcie_ops_2_0 = {
727         .tlp_read_pkt = s10_tlp_read_packet,
728         .tlp_write_pkt = s10_tlp_write_packet,
729         .get_link_status = s10_altera_pcie_link_up,
730         .rp_read_cfg = s10_rp_read_cfg,
731         .rp_write_cfg = s10_rp_write_cfg,
732 };
733
734 static const struct altera_pcie_data altera_pcie_1_0_data = {
735         .ops = &altera_pcie_ops_1_0,
736         .cap_offset = 0x80,
737         .version = ALTERA_PCIE_V1,
738         .cfgrd0 = TLP_FMTTYPE_CFGRD0,
739         .cfgrd1 = TLP_FMTTYPE_CFGRD1,
740         .cfgwr0 = TLP_FMTTYPE_CFGWR0,
741         .cfgwr1 = TLP_FMTTYPE_CFGWR1,
742 };
743
744 static const struct altera_pcie_data altera_pcie_2_0_data = {
745         .ops = &altera_pcie_ops_2_0,
746         .version = ALTERA_PCIE_V2,
747         .cap_offset = 0x70,
748         .cfgrd0 = S10_TLP_FMTTYPE_CFGRD0,
749         .cfgrd1 = S10_TLP_FMTTYPE_CFGRD1,
750         .cfgwr0 = S10_TLP_FMTTYPE_CFGWR0,
751         .cfgwr1 = S10_TLP_FMTTYPE_CFGWR1,
752 };
753
754 static const struct of_device_id altera_pcie_of_match[] = {
755         {.compatible = "altr,pcie-root-port-1.0",
756          .data = &altera_pcie_1_0_data },
757         {.compatible = "altr,pcie-root-port-2.0",
758          .data = &altera_pcie_2_0_data },
759         {},
760 };
761
762 static int altera_pcie_probe(struct platform_device *pdev)
763 {
764         struct device *dev = &pdev->dev;
765         struct altera_pcie *pcie;
766         struct pci_host_bridge *bridge;
767         int ret;
768         const struct altera_pcie_data *data;
769
770         bridge = devm_pci_alloc_host_bridge(dev, sizeof(*pcie));
771         if (!bridge)
772                 return -ENOMEM;
773
774         pcie = pci_host_bridge_priv(bridge);
775         pcie->pdev = pdev;
776         platform_set_drvdata(pdev, pcie);
777
778         data = of_device_get_match_data(&pdev->dev);
779         if (!data)
780                 return -ENODEV;
781
782         pcie->pcie_data = data;
783
784         ret = altera_pcie_parse_dt(pcie);
785         if (ret) {
786                 dev_err(dev, "Parsing DT failed\n");
787                 return ret;
788         }
789
790         ret = altera_pcie_init_irq_domain(pcie);
791         if (ret) {
792                 dev_err(dev, "Failed creating IRQ Domain\n");
793                 return ret;
794         }
795
796         /* clear all interrupts */
797         cra_writel(pcie, P2A_INT_STS_ALL, P2A_INT_STATUS);
798         /* enable all interrupts */
799         cra_writel(pcie, P2A_INT_ENA_ALL, P2A_INT_ENABLE);
800         altera_pcie_host_init(pcie);
801
802         bridge->sysdata = pcie;
803         bridge->busnr = pcie->root_bus_nr;
804         bridge->ops = &altera_pcie_ops;
805
806         return pci_host_probe(bridge);
807 }
808
809 static int altera_pcie_remove(struct platform_device *pdev)
810 {
811         struct altera_pcie *pcie = platform_get_drvdata(pdev);
812         struct pci_host_bridge *bridge = pci_host_bridge_from_priv(pcie);
813
814         pci_stop_root_bus(bridge->bus);
815         pci_remove_root_bus(bridge->bus);
816         altera_pcie_irq_teardown(pcie);
817
818         return 0;
819 }
820
821 static struct platform_driver altera_pcie_driver = {
822         .probe          = altera_pcie_probe,
823         .remove         = altera_pcie_remove,
824         .driver = {
825                 .name   = "altera-pcie",
826                 .of_match_table = altera_pcie_of_match,
827         },
828 };
829
830 MODULE_DEVICE_TABLE(of, altera_pcie_of_match);
831 module_platform_driver(altera_pcie_driver);
832 MODULE_LICENSE("GPL v2");