pci: mvebu: Use PCI_CONF1_EXT_ADDRESS() macro
[platform/kernel/u-boot.git] / drivers / pci / pci_mvebu.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * PCIe driver for Marvell MVEBU SoCs
4  *
5  * Based on Barebox drivers/pci/pci-mvebu.c
6  *
7  * Ported to U-Boot by:
8  * Anton Schubert <anton.schubert@gmx.de>
9  * Stefan Roese <sr@denx.de>
10  * Pali Rohár <pali@kernel.org>
11  */
12
13 #include <common.h>
14 #include <dm.h>
15 #include <log.h>
16 #include <malloc.h>
17 #include <dm/device-internal.h>
18 #include <dm/lists.h>
19 #include <dm/of_access.h>
20 #include <pci.h>
21 #include <asm/io.h>
22 #include <asm/arch/cpu.h>
23 #include <asm/arch/soc.h>
24 #include <linux/bitops.h>
25 #include <linux/errno.h>
26 #include <linux/ioport.h>
27 #include <linux/mbus.h>
28
29 /* PCIe unit register offsets */
30 #define SELECT(x, n)                    ((x >> n) & 1UL)
31
32 #define PCIE_DEV_ID_OFF                 0x0000
33 #define PCIE_CMD_OFF                    0x0004
34 #define PCIE_DEV_REV_OFF                0x0008
35 #define  PCIE_BAR_LO_OFF(n)             (0x0010 + ((n) << 3))
36 #define  PCIE_BAR_HI_OFF(n)             (0x0014 + ((n) << 3))
37 #define PCIE_EXP_ROM_BAR_OFF            0x0030
38 #define PCIE_CAPAB_OFF                  0x0060
39 #define PCIE_CTRL_STAT_OFF              0x0068
40 #define PCIE_HEADER_LOG_4_OFF           0x0128
41 #define  PCIE_BAR_CTRL_OFF(n)           (0x1804 + (((n) - 1) * 4))
42 #define  PCIE_WIN04_CTRL_OFF(n)         (0x1820 + ((n) << 4))
43 #define  PCIE_WIN04_BASE_OFF(n)         (0x1824 + ((n) << 4))
44 #define  PCIE_WIN04_REMAP_OFF(n)        (0x182c + ((n) << 4))
45 #define PCIE_WIN5_CTRL_OFF              0x1880
46 #define PCIE_WIN5_BASE_OFF              0x1884
47 #define PCIE_WIN5_REMAP_OFF             0x188c
48 #define PCIE_CONF_ADDR_OFF              0x18f8
49 #define PCIE_CONF_DATA_OFF              0x18fc
50 #define PCIE_MASK_OFF                   0x1910
51 #define  PCIE_MASK_ENABLE_INTS          (0xf << 24)
52 #define PCIE_CTRL_OFF                   0x1a00
53 #define  PCIE_CTRL_X1_MODE              BIT(0)
54 #define  PCIE_CTRL_RC_MODE              BIT(1)
55 #define PCIE_STAT_OFF                   0x1a04
56 #define  PCIE_STAT_BUS                  (0xff << 8)
57 #define  PCIE_STAT_DEV                  (0x1f << 16)
58 #define  PCIE_STAT_LINK_DOWN            BIT(0)
59 #define PCIE_DEBUG_CTRL                 0x1a60
60 #define  PCIE_DEBUG_SOFT_RESET          BIT(20)
61
62 struct mvebu_pcie {
63         struct pci_controller hose;
64         void __iomem *base;
65         void __iomem *membase;
66         struct resource mem;
67         void __iomem *iobase;
68         struct resource io;
69         u32 port;
70         u32 lane;
71         int devfn;
72         u32 lane_mask;
73         int first_busno;
74         int sec_busno;
75         char name[16];
76         unsigned int mem_target;
77         unsigned int mem_attr;
78         unsigned int io_target;
79         unsigned int io_attr;
80         u32 cfgcache[(0x3c - 0x10) / 4];
81 };
82
83 /*
84  * MVEBU PCIe controller needs MEMORY and I/O BARs to be mapped
85  * into SoCs address space. Each controller will map 128M of MEM
86  * and 64K of I/O space when registered.
87  */
88 static void __iomem *mvebu_pcie_membase = (void __iomem *)MBUS_PCI_MEM_BASE;
89 static void __iomem *mvebu_pcie_iobase = (void __iomem *)MBUS_PCI_IO_BASE;
90
91 static inline bool mvebu_pcie_link_up(struct mvebu_pcie *pcie)
92 {
93         u32 val;
94         val = readl(pcie->base + PCIE_STAT_OFF);
95         return !(val & PCIE_STAT_LINK_DOWN);
96 }
97
98 static void mvebu_pcie_set_local_bus_nr(struct mvebu_pcie *pcie, int busno)
99 {
100         u32 stat;
101
102         stat = readl(pcie->base + PCIE_STAT_OFF);
103         stat &= ~PCIE_STAT_BUS;
104         stat |= busno << 8;
105         writel(stat, pcie->base + PCIE_STAT_OFF);
106 }
107
108 static void mvebu_pcie_set_local_dev_nr(struct mvebu_pcie *pcie, int devno)
109 {
110         u32 stat;
111
112         stat = readl(pcie->base + PCIE_STAT_OFF);
113         stat &= ~PCIE_STAT_DEV;
114         stat |= devno << 16;
115         writel(stat, pcie->base + PCIE_STAT_OFF);
116 }
117
118 static inline struct mvebu_pcie *hose_to_pcie(struct pci_controller *hose)
119 {
120         return container_of(hose, struct mvebu_pcie, hose);
121 }
122
123 static bool mvebu_pcie_valid_addr(struct mvebu_pcie *pcie,
124                                   int busno, int dev, int func)
125 {
126         /* On primary bus is only one PCI Bridge */
127         if (busno == pcie->first_busno && (dev != 0 || func != 0))
128                 return false;
129
130         /* Access to other buses is possible when link is up */
131         if (busno != pcie->first_busno && !mvebu_pcie_link_up(pcie))
132                 return false;
133
134         /* On secondary bus can be only one PCIe device */
135         if (busno == pcie->sec_busno && dev != 0)
136                 return false;
137
138         return true;
139 }
140
141 static int mvebu_pcie_read_config(const struct udevice *bus, pci_dev_t bdf,
142                                   uint offset, ulong *valuep,
143                                   enum pci_size_t size)
144 {
145         struct mvebu_pcie *pcie = dev_get_plat(bus);
146         int busno = PCI_BUS(bdf) - dev_seq(bus);
147         u32 addr, data;
148
149         debug("PCIE CFG read: (b,d,f)=(%2d,%2d,%2d) ",
150               PCI_BUS(bdf), PCI_DEV(bdf), PCI_FUNC(bdf));
151
152         if (!mvebu_pcie_valid_addr(pcie, busno, PCI_DEV(bdf), PCI_FUNC(bdf))) {
153                 debug("- out of range\n");
154                 *valuep = pci_get_ff(size);
155                 return 0;
156         }
157
158         /*
159          * The configuration space of the PCI Bridge on primary (first) bus is
160          * of Type 0 but the BAR registers (including ROM BAR) don't have the
161          * same meaning as in the PCIe specification. Therefore do not access
162          * BAR registers and non-common registers (those which have different
163          * meaning for Type 0 and Type 1 config space) of the PCI Bridge and
164          * instead read their content from driver virtual cfgcache[].
165          */
166         if (busno == pcie->first_busno && ((offset >= 0x10 && offset < 0x34) ||
167                                            (offset >= 0x38 && offset < 0x3c))) {
168                 data = pcie->cfgcache[(offset - 0x10) / 4];
169                 debug("(addr,size,val)=(0x%04x, %d, 0x%08x) from cfgcache\n",
170                       offset, size, data);
171                 *valuep = pci_conv_32_to_size(data, offset, size);
172                 return 0;
173         }
174
175         /*
176          * PCI bridge is device 0 at primary bus but mvebu has it mapped on
177          * secondary bus with device number 1.
178          */
179         if (busno == pcie->first_busno)
180                 addr = PCI_CONF1_EXT_ADDRESS(pcie->sec_busno, 1, 0, offset);
181         else
182                 addr = PCI_CONF1_EXT_ADDRESS(busno, PCI_DEV(bdf), PCI_FUNC(bdf), offset);
183
184         /* write address */
185         writel(addr, pcie->base + PCIE_CONF_ADDR_OFF);
186
187         /* read data */
188         switch (size) {
189         case PCI_SIZE_8:
190                 data = readb(pcie->base + PCIE_CONF_DATA_OFF + (offset & 3));
191                 break;
192         case PCI_SIZE_16:
193                 data = readw(pcie->base + PCIE_CONF_DATA_OFF + (offset & 2));
194                 break;
195         case PCI_SIZE_32:
196                 data = readl(pcie->base + PCIE_CONF_DATA_OFF);
197                 break;
198         default:
199                 return -EINVAL;
200         }
201
202         if (busno == pcie->first_busno &&
203             (offset & ~3) == (PCI_HEADER_TYPE & ~3)) {
204                 /*
205                  * Change Header Type of PCI Bridge device to Type 1
206                  * (0x01, used by PCI Bridges) because mvebu reports
207                  * Type 0 (0x00, used by Upstream and Endpoint devices).
208                  */
209                 data = pci_conv_size_to_32(data, 0, offset, size);
210                 data &= ~0x007f0000;
211                 data |= PCI_HEADER_TYPE_BRIDGE << 16;
212                 data = pci_conv_32_to_size(data, offset, size);
213         }
214
215         debug("(addr,size,val)=(0x%04x, %d, 0x%08x)\n", offset, size, data);
216         *valuep = data;
217
218         return 0;
219 }
220
221 static int mvebu_pcie_write_config(struct udevice *bus, pci_dev_t bdf,
222                                    uint offset, ulong value,
223                                    enum pci_size_t size)
224 {
225         struct mvebu_pcie *pcie = dev_get_plat(bus);
226         int busno = PCI_BUS(bdf) - dev_seq(bus);
227         u32 addr, data;
228
229         debug("PCIE CFG write: (b,d,f)=(%2d,%2d,%2d) ",
230               PCI_BUS(bdf), PCI_DEV(bdf), PCI_FUNC(bdf));
231         debug("(addr,size,val)=(0x%04x, %d, 0x%08lx)\n", offset, size, value);
232
233         if (!mvebu_pcie_valid_addr(pcie, busno, PCI_DEV(bdf), PCI_FUNC(bdf))) {
234                 debug("- out of range\n");
235                 return 0;
236         }
237
238         /*
239          * As explained in mvebu_pcie_read_config(), PCI Bridge Type 1 specific
240          * config registers are not available, so we write their content only
241          * into driver virtual cfgcache[].
242          * And as explained in mvebu_pcie_probe(), mvebu has its own specific
243          * way for configuring primary and secondary bus numbers.
244          */
245         if (busno == pcie->first_busno && ((offset >= 0x10 && offset < 0x34) ||
246                                            (offset >= 0x38 && offset < 0x3c))) {
247                 debug("Writing to cfgcache only\n");
248                 data = pcie->cfgcache[(offset - 0x10) / 4];
249                 data = pci_conv_size_to_32(data, value, offset, size);
250                 /* mvebu PCI bridge does not have configurable bars */
251                 if ((offset & ~3) == PCI_BASE_ADDRESS_0 ||
252                     (offset & ~3) == PCI_BASE_ADDRESS_1 ||
253                     (offset & ~3) == PCI_ROM_ADDRESS1)
254                         data = 0x0;
255                 pcie->cfgcache[(offset - 0x10) / 4] = data;
256                 /* mvebu has its own way how to set PCI primary bus number */
257                 if (offset == PCI_PRIMARY_BUS) {
258                         pcie->first_busno = data & 0xff;
259                         debug("Primary bus number was changed to %d\n",
260                               pcie->first_busno);
261                 }
262                 /* mvebu has its own way how to set PCI secondary bus number */
263                 if (offset == PCI_SECONDARY_BUS ||
264                     (offset == PCI_PRIMARY_BUS && size != PCI_SIZE_8)) {
265                         pcie->sec_busno = (data >> 8) & 0xff;
266                         mvebu_pcie_set_local_bus_nr(pcie, pcie->sec_busno);
267                         debug("Secondary bus number was changed to %d\n",
268                               pcie->sec_busno);
269                 }
270                 return 0;
271         }
272
273         /*
274          * PCI bridge is device 0 at primary bus but mvebu has it mapped on
275          * secondary bus with device number 1.
276          */
277         if (busno == pcie->first_busno)
278                 addr = PCI_CONF1_EXT_ADDRESS(pcie->sec_busno, 1, 0, offset);
279         else
280                 addr = PCI_CONF1_EXT_ADDRESS(busno, PCI_DEV(bdf), PCI_FUNC(bdf), offset);
281
282         /* write address */
283         writel(addr, pcie->base + PCIE_CONF_ADDR_OFF);
284
285         /* write data */
286         switch (size) {
287         case PCI_SIZE_8:
288                 writeb(value, pcie->base + PCIE_CONF_DATA_OFF + (offset & 3));
289                 break;
290         case PCI_SIZE_16:
291                 writew(value, pcie->base + PCIE_CONF_DATA_OFF + (offset & 2));
292                 break;
293         case PCI_SIZE_32:
294                 writel(value, pcie->base + PCIE_CONF_DATA_OFF);
295                 break;
296         default:
297                 return -EINVAL;
298         }
299
300         return 0;
301 }
302
303 /*
304  * Setup PCIE BARs and Address Decode Wins:
305  * BAR[0] -> internal registers
306  * BAR[1] -> covers all DRAM banks
307  * BAR[2] -> disabled
308  * WIN[0-3] -> DRAM bank[0-3]
309  */
310 static void mvebu_pcie_setup_wins(struct mvebu_pcie *pcie)
311 {
312         const struct mbus_dram_target_info *dram = mvebu_mbus_dram_info();
313         u32 size;
314         int i;
315
316         /* First, disable and clear BARs and windows. */
317         for (i = 1; i < 3; i++) {
318                 writel(0, pcie->base + PCIE_BAR_CTRL_OFF(i));
319                 writel(0, pcie->base + PCIE_BAR_LO_OFF(i));
320                 writel(0, pcie->base + PCIE_BAR_HI_OFF(i));
321         }
322
323         for (i = 0; i < 5; i++) {
324                 writel(0, pcie->base + PCIE_WIN04_CTRL_OFF(i));
325                 writel(0, pcie->base + PCIE_WIN04_BASE_OFF(i));
326                 writel(0, pcie->base + PCIE_WIN04_REMAP_OFF(i));
327         }
328
329         writel(0, pcie->base + PCIE_WIN5_CTRL_OFF);
330         writel(0, pcie->base + PCIE_WIN5_BASE_OFF);
331         writel(0, pcie->base + PCIE_WIN5_REMAP_OFF);
332
333         /* Setup windows for DDR banks. Count total DDR size on the fly. */
334         size = 0;
335         for (i = 0; i < dram->num_cs; i++) {
336                 const struct mbus_dram_window *cs = dram->cs + i;
337
338                 writel(cs->base & 0xffff0000,
339                        pcie->base + PCIE_WIN04_BASE_OFF(i));
340                 writel(0, pcie->base + PCIE_WIN04_REMAP_OFF(i));
341                 writel(((cs->size - 1) & 0xffff0000) |
342                        (cs->mbus_attr << 8) |
343                        (dram->mbus_dram_target_id << 4) | 1,
344                        pcie->base + PCIE_WIN04_CTRL_OFF(i));
345
346                 size += cs->size;
347         }
348
349         /* Round up 'size' to the nearest power of two. */
350         if ((size & (size - 1)) != 0)
351                 size = 1 << fls(size);
352
353         /* Setup BAR[1] to all DRAM banks. */
354         writel(dram->cs[0].base | 0xc, pcie->base + PCIE_BAR_LO_OFF(1));
355         writel(0, pcie->base + PCIE_BAR_HI_OFF(1));
356         writel(((size - 1) & 0xffff0000) | 0x1,
357                pcie->base + PCIE_BAR_CTRL_OFF(1));
358
359         /* Setup BAR[0] to internal registers. */
360         writel(SOC_REGS_PHY_BASE, pcie->base + PCIE_BAR_LO_OFF(0));
361         writel(0, pcie->base + PCIE_BAR_HI_OFF(0));
362 }
363
364 static int mvebu_pcie_probe(struct udevice *dev)
365 {
366         struct mvebu_pcie *pcie = dev_get_plat(dev);
367         struct udevice *ctlr = pci_get_controller(dev);
368         struct pci_controller *hose = dev_get_uclass_priv(ctlr);
369         u32 reg;
370
371         /* Setup PCIe controller to Root Complex mode */
372         reg = readl(pcie->base + PCIE_CTRL_OFF);
373         reg |= PCIE_CTRL_RC_MODE;
374         writel(reg, pcie->base + PCIE_CTRL_OFF);
375
376         /*
377          * Change Class Code of PCI Bridge device to PCI Bridge (0x600400)
378          * because default value is Memory controller (0x508000) which
379          * U-Boot cannot recognize as P2P Bridge.
380          *
381          * Note that this mvebu PCI Bridge does not have compliant Type 1
382          * Configuration Space. Header Type is reported as Type 0 and it
383          * has format of Type 0 config space.
384          *
385          * Moreover Type 0 BAR registers (ranges 0x10 - 0x28 and 0x30 - 0x34)
386          * have the same format in Marvell's specification as in PCIe
387          * specification, but their meaning is totally different and they do
388          * different things: they are aliased into internal mvebu registers
389          * (e.g. PCIE_BAR_LO_OFF) and these should not be changed or
390          * reconfigured by pci device drivers.
391          *
392          * So our driver converts Type 0 config space to Type 1 and reports
393          * Header Type as Type 1. Access to BAR registers and to non-existent
394          * Type 1 registers is redirected to the virtual cfgcache[] buffer,
395          * which avoids changing unrelated registers.
396          */
397         reg = readl(pcie->base + PCIE_DEV_REV_OFF);
398         reg &= ~0xffffff00;
399         reg |= (PCI_CLASS_BRIDGE_PCI << 8) << 8;
400         writel(reg, pcie->base + PCIE_DEV_REV_OFF);
401
402         /*
403          * mvebu uses local bus number and local device number to determinate
404          * type of config request. Type 0 is used if target bus number equals
405          * local bus number and target device number differs from local device
406          * number. Type 1 is used if target bus number differs from local bus
407          * number. And when target bus number equals local bus number and
408          * target device equals local device number then request is routed to
409          * PCI Bridge which represent local PCIe Root Port.
410          *
411          * It means that PCI primary and secondary buses shares one bus number
412          * which is configured via local bus number. Determination if config
413          * request should go to primary or secondary bus is done based on local
414          * device number.
415          *
416          * PCIe is point-to-point bus, so at secondary bus is always exactly one
417          * device with number 0. So set local device number to 1, it would not
418          * conflict with any device on secondary bus number and will ensure that
419          * accessing secondary bus and all buses behind secondary would work
420          * automatically and correctly. Therefore this configuration of local
421          * device number implies that setting of local bus number configures
422          * secondary bus number. Set it to 0 as U-Boot CONFIG_PCI_PNP code will
423          * later configure it via config write requests to the correct value.
424          * mvebu_pcie_write_config() catches config write requests which tries
425          * to change primary/secondary bus number and correctly updates local
426          * bus number based on new secondary bus number.
427          *
428          * With this configuration is PCI Bridge available at secondary bus as
429          * device number 1. But it must be available at primary bus as device
430          * number 0. So in mvebu_pcie_read_config() and mvebu_pcie_write_config()
431          * functions rewrite address to the real one when accessing primary bus.
432          */
433         mvebu_pcie_set_local_bus_nr(pcie, 0);
434         mvebu_pcie_set_local_dev_nr(pcie, 1);
435
436         pcie->mem.start = (u32)mvebu_pcie_membase;
437         pcie->mem.end = pcie->mem.start + MBUS_PCI_MEM_SIZE - 1;
438         mvebu_pcie_membase += MBUS_PCI_MEM_SIZE;
439
440         if (mvebu_mbus_add_window_by_id(pcie->mem_target, pcie->mem_attr,
441                                         (phys_addr_t)pcie->mem.start,
442                                         resource_size(&pcie->mem))) {
443                 printf("PCIe unable to add mbus window for mem at %08x+%08x\n",
444                        (u32)pcie->mem.start, (unsigned)resource_size(&pcie->mem));
445         }
446
447         pcie->io.start = (u32)mvebu_pcie_iobase;
448         pcie->io.end = pcie->io.start + MBUS_PCI_IO_SIZE - 1;
449         mvebu_pcie_iobase += MBUS_PCI_IO_SIZE;
450
451         if (mvebu_mbus_add_window_by_id(pcie->io_target, pcie->io_attr,
452                                         (phys_addr_t)pcie->io.start,
453                                         resource_size(&pcie->io))) {
454                 printf("PCIe unable to add mbus window for IO at %08x+%08x\n",
455                        (u32)pcie->io.start, (unsigned)resource_size(&pcie->io));
456         }
457
458         /* Setup windows and configure host bridge */
459         mvebu_pcie_setup_wins(pcie);
460
461         /* PCI memory space */
462         pci_set_region(hose->regions + 0, pcie->mem.start,
463                        pcie->mem.start, resource_size(&pcie->mem), PCI_REGION_MEM);
464         pci_set_region(hose->regions + 1,
465                        0, 0,
466                        gd->ram_size,
467                        PCI_REGION_MEM | PCI_REGION_SYS_MEMORY);
468         pci_set_region(hose->regions + 2, pcie->io.start,
469                        pcie->io.start, resource_size(&pcie->io), PCI_REGION_IO);
470         hose->region_count = 3;
471
472         /* PCI Bridge support 32-bit I/O and 64-bit prefetch mem addressing */
473         pcie->cfgcache[(PCI_IO_BASE - 0x10) / 4] =
474                 PCI_IO_RANGE_TYPE_32 | (PCI_IO_RANGE_TYPE_32 << 8);
475         pcie->cfgcache[(PCI_PREF_MEMORY_BASE - 0x10) / 4] =
476                 PCI_PREF_RANGE_TYPE_64 | (PCI_PREF_RANGE_TYPE_64 << 16);
477
478         return 0;
479 }
480
481 static int mvebu_pcie_port_parse_dt(ofnode node, struct mvebu_pcie *pcie)
482 {
483         const u32 *addr;
484         int len;
485
486         addr = ofnode_get_property(node, "assigned-addresses", &len);
487         if (!addr) {
488                 pr_err("property \"assigned-addresses\" not found");
489                 return -FDT_ERR_NOTFOUND;
490         }
491
492         pcie->base = (void *)(fdt32_to_cpu(addr[2]) + SOC_REGS_PHY_BASE);
493
494         return 0;
495 }
496
497 #define DT_FLAGS_TO_TYPE(flags)       (((flags) >> 24) & 0x03)
498 #define    DT_TYPE_IO                 0x1
499 #define    DT_TYPE_MEM32              0x2
500 #define DT_CPUADDR_TO_TARGET(cpuaddr) (((cpuaddr) >> 56) & 0xFF)
501 #define DT_CPUADDR_TO_ATTR(cpuaddr)   (((cpuaddr) >> 48) & 0xFF)
502
503 static int mvebu_get_tgt_attr(ofnode node, int devfn,
504                               unsigned long type,
505                               unsigned int *tgt,
506                               unsigned int *attr)
507 {
508         const int na = 3, ns = 2;
509         const __be32 *range;
510         int rlen, nranges, rangesz, pna, i;
511
512         *tgt = -1;
513         *attr = -1;
514
515         range = ofnode_get_property(node, "ranges", &rlen);
516         if (!range)
517                 return -EINVAL;
518
519         /*
520          * Linux uses of_n_addr_cells() to get the number of address cells
521          * here. Currently this function is only available in U-Boot when
522          * CONFIG_OF_LIVE is enabled. Until this is enabled for MVEBU in
523          * general, lets't hardcode the "pna" value in the U-Boot code.
524          */
525         pna = 2; /* hardcoded for now because of lack of of_n_addr_cells() */
526         rangesz = pna + na + ns;
527         nranges = rlen / sizeof(__be32) / rangesz;
528
529         for (i = 0; i < nranges; i++, range += rangesz) {
530                 u32 flags = of_read_number(range, 1);
531                 u32 slot = of_read_number(range + 1, 1);
532                 u64 cpuaddr = of_read_number(range + na, pna);
533                 unsigned long rtype;
534
535                 if (DT_FLAGS_TO_TYPE(flags) == DT_TYPE_IO)
536                         rtype = IORESOURCE_IO;
537                 else if (DT_FLAGS_TO_TYPE(flags) == DT_TYPE_MEM32)
538                         rtype = IORESOURCE_MEM;
539                 else
540                         continue;
541
542                 /*
543                  * The Linux code used PCI_SLOT() here, which expects devfn
544                  * in bits 7..0. PCI_DEV() in U-Boot is similar to PCI_SLOT(),
545                  * only expects devfn in 15..8, where its saved in this driver.
546                  */
547                 if (slot == PCI_DEV(devfn) && type == rtype) {
548                         *tgt = DT_CPUADDR_TO_TARGET(cpuaddr);
549                         *attr = DT_CPUADDR_TO_ATTR(cpuaddr);
550                         return 0;
551                 }
552         }
553
554         return -ENOENT;
555 }
556
557 static int mvebu_pcie_of_to_plat(struct udevice *dev)
558 {
559         struct mvebu_pcie *pcie = dev_get_plat(dev);
560         int ret = 0;
561
562         /* Get port number, lane number and memory target / attr */
563         if (ofnode_read_u32(dev_ofnode(dev), "marvell,pcie-port",
564                             &pcie->port)) {
565                 ret = -ENODEV;
566                 goto err;
567         }
568
569         if (ofnode_read_u32(dev_ofnode(dev), "marvell,pcie-lane", &pcie->lane))
570                 pcie->lane = 0;
571
572         sprintf(pcie->name, "pcie%d.%d", pcie->port, pcie->lane);
573
574         /* pci_get_devfn() returns devfn in bits 15..8, see PCI_DEV usage */
575         pcie->devfn = pci_get_devfn(dev);
576         if (pcie->devfn < 0) {
577                 ret = -ENODEV;
578                 goto err;
579         }
580
581         ret = mvebu_get_tgt_attr(dev_ofnode(dev->parent), pcie->devfn,
582                                  IORESOURCE_MEM,
583                                  &pcie->mem_target, &pcie->mem_attr);
584         if (ret < 0) {
585                 printf("%s: cannot get tgt/attr for mem window\n", pcie->name);
586                 goto err;
587         }
588
589         ret = mvebu_get_tgt_attr(dev_ofnode(dev->parent), pcie->devfn,
590                                  IORESOURCE_IO,
591                                  &pcie->io_target, &pcie->io_attr);
592         if (ret < 0) {
593                 printf("%s: cannot get tgt/attr for IO window\n", pcie->name);
594                 goto err;
595         }
596
597         /* Parse PCIe controller register base from DT */
598         ret = mvebu_pcie_port_parse_dt(dev_ofnode(dev), pcie);
599         if (ret < 0)
600                 goto err;
601
602         return 0;
603
604 err:
605         return ret;
606 }
607
608 static const struct dm_pci_ops mvebu_pcie_ops = {
609         .read_config    = mvebu_pcie_read_config,
610         .write_config   = mvebu_pcie_write_config,
611 };
612
613 static struct driver pcie_mvebu_drv = {
614         .name                   = "pcie_mvebu",
615         .id                     = UCLASS_PCI,
616         .ops                    = &mvebu_pcie_ops,
617         .probe                  = mvebu_pcie_probe,
618         .of_to_plat     = mvebu_pcie_of_to_plat,
619         .plat_auto      = sizeof(struct mvebu_pcie),
620 };
621
622 /*
623  * Use a MISC device to bind the n instances (child nodes) of the
624  * PCIe base controller in UCLASS_PCI.
625  */
626 static int mvebu_pcie_bind(struct udevice *parent)
627 {
628         struct mvebu_pcie *pcie;
629         struct uclass_driver *drv;
630         struct udevice *dev;
631         ofnode subnode;
632
633         /* Lookup pci driver */
634         drv = lists_uclass_lookup(UCLASS_PCI);
635         if (!drv) {
636                 puts("Cannot find PCI driver\n");
637                 return -ENOENT;
638         }
639
640         ofnode_for_each_subnode(subnode, dev_ofnode(parent)) {
641                 if (!ofnode_is_available(subnode))
642                         continue;
643
644                 pcie = calloc(1, sizeof(*pcie));
645                 if (!pcie)
646                         return -ENOMEM;
647
648                 /* Create child device UCLASS_PCI and bind it */
649                 device_bind(parent, &pcie_mvebu_drv, pcie->name, pcie, subnode,
650                             &dev);
651         }
652
653         return 0;
654 }
655
656 static const struct udevice_id mvebu_pcie_ids[] = {
657         { .compatible = "marvell,armada-xp-pcie" },
658         { .compatible = "marvell,armada-370-pcie" },
659         { }
660 };
661
662 U_BOOT_DRIVER(pcie_mvebu_base) = {
663         .name                   = "pcie_mvebu_base",
664         .id                     = UCLASS_MISC,
665         .of_match               = mvebu_pcie_ids,
666         .bind                   = mvebu_pcie_bind,
667 };