Prepare v2023.10
[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 <reset.h>
22 #include <asm/io.h>
23 #include <asm/arch/cpu.h>
24 #include <asm/arch/soc.h>
25 #include <asm/gpio.h>
26 #include <linux/bitops.h>
27 #include <linux/delay.h>
28 #include <linux/errno.h>
29 #include <linux/ioport.h>
30 #include <linux/mbus.h>
31 #include <linux/sizes.h>
32
33 /* PCIe unit register offsets */
34 #define MVPCIE_ROOT_PORT_PCI_CFG_OFF    0x0000
35 #define MVPCIE_ROOT_PORT_PCI_EXP_OFF    0x0060
36 #define MVPCIE_BAR_LO_OFF(n)            (0x0010 + ((n) << 3))
37 #define MVPCIE_BAR_HI_OFF(n)            (0x0014 + ((n) << 3))
38 #define MVPCIE_BAR_CTRL_OFF(n)          (0x1804 + (((n) - 1) * 4))
39 #define MVPCIE_WIN04_CTRL_OFF(n)        (0x1820 + ((n) << 4))
40 #define MVPCIE_WIN04_BASE_OFF(n)        (0x1824 + ((n) << 4))
41 #define MVPCIE_WIN04_REMAP_OFF(n)       (0x182c + ((n) << 4))
42 #define MVPCIE_WIN5_CTRL_OFF            0x1880
43 #define MVPCIE_WIN5_BASE_OFF            0x1884
44 #define MVPCIE_WIN5_REMAP_OFF           0x188c
45 #define MVPCIE_CONF_ADDR_OFF            0x18f8
46 #define MVPCIE_CONF_DATA_OFF            0x18fc
47 #define MVPCIE_CTRL_OFF                 0x1a00
48 #define  MVPCIE_CTRL_RC_MODE            BIT(1)
49 #define MVPCIE_STAT_OFF                 0x1a04
50 #define  MVPCIE_STAT_BUS                (0xff << 8)
51 #define  MVPCIE_STAT_DEV                (0x1f << 16)
52 #define  MVPCIE_STAT_LINK_DOWN          BIT(0)
53
54 #define LINK_WAIT_RETRIES       100
55 #define LINK_WAIT_TIMEOUT       1000
56
57 struct mvebu_pcie {
58         struct pci_controller hose;
59         void __iomem *base;
60         void __iomem *membase;
61         struct resource mem;
62         void __iomem *iobase;
63         struct resource io;
64         struct gpio_desc reset_gpio;
65         u32 intregs;
66         u32 port;
67         u32 lane;
68         bool is_x4;
69         int devfn;
70         int sec_busno;
71         char name[16];
72         unsigned int mem_target;
73         unsigned int mem_attr;
74         unsigned int io_target;
75         unsigned int io_attr;
76         u32 cfgcache[(0x3c - 0x10) / 4];
77 };
78
79 static inline bool mvebu_pcie_link_up(struct mvebu_pcie *pcie)
80 {
81         u32 val;
82         val = readl(pcie->base + MVPCIE_STAT_OFF);
83         return !(val & MVPCIE_STAT_LINK_DOWN);
84 }
85
86 static void mvebu_pcie_wait_for_link(struct mvebu_pcie *pcie)
87 {
88         int retries;
89
90         /* check if the link is up or not */
91         for (retries = 0; retries < LINK_WAIT_RETRIES; retries++) {
92                 if (mvebu_pcie_link_up(pcie)) {
93                         printf("%s: Link up\n", pcie->name);
94                         return;
95                 }
96
97                 udelay(LINK_WAIT_TIMEOUT);
98         }
99
100         printf("%s: Link down\n", pcie->name);
101 }
102
103 static void mvebu_pcie_set_local_bus_nr(struct mvebu_pcie *pcie, int busno)
104 {
105         u32 stat;
106
107         stat = readl(pcie->base + MVPCIE_STAT_OFF);
108         stat &= ~MVPCIE_STAT_BUS;
109         stat |= busno << 8;
110         writel(stat, pcie->base + MVPCIE_STAT_OFF);
111 }
112
113 static void mvebu_pcie_set_local_dev_nr(struct mvebu_pcie *pcie, int devno)
114 {
115         u32 stat;
116
117         stat = readl(pcie->base + MVPCIE_STAT_OFF);
118         stat &= ~MVPCIE_STAT_DEV;
119         stat |= devno << 16;
120         writel(stat, pcie->base + MVPCIE_STAT_OFF);
121 }
122
123 static inline struct mvebu_pcie *hose_to_pcie(struct pci_controller *hose)
124 {
125         return container_of(hose, struct mvebu_pcie, hose);
126 }
127
128 static bool mvebu_pcie_valid_addr(struct mvebu_pcie *pcie,
129                                   int busno, int dev, int func)
130 {
131         /* On the root bus is only one PCI Bridge */
132         if (busno == 0 && (dev != 0 || func != 0))
133                 return false;
134
135         /* Access to other buses is possible when link is up */
136         if (busno != 0 && !mvebu_pcie_link_up(pcie))
137                 return false;
138
139         /* On secondary bus can be only one PCIe device */
140         if (busno == pcie->sec_busno && dev != 0)
141                 return false;
142
143         return true;
144 }
145
146 static int mvebu_pcie_read_config(const struct udevice *bus, pci_dev_t bdf,
147                                   uint offset, ulong *valuep,
148                                   enum pci_size_t size)
149 {
150         struct mvebu_pcie *pcie = dev_get_plat(bus);
151         int busno = PCI_BUS(bdf) - dev_seq(bus);
152         u32 addr, data;
153
154         debug("PCIE CFG read: (b,d,f)=(%2d,%2d,%2d) ",
155               PCI_BUS(bdf), PCI_DEV(bdf), PCI_FUNC(bdf));
156
157         if (!mvebu_pcie_valid_addr(pcie, busno, PCI_DEV(bdf), PCI_FUNC(bdf))) {
158                 debug("- out of range\n");
159                 *valuep = pci_get_ff(size);
160                 return 0;
161         }
162
163         /*
164          * The configuration space of the PCI Bridge on the root bus (zero) is
165          * of Type 0 but the BAR registers (including ROM BAR) don't have the
166          * same meaning as in the PCIe specification. Therefore do not access
167          * BAR registers and non-common registers (those which have different
168          * meaning for Type 0 and Type 1 config space) of the PCI Bridge and
169          * instead read their content from driver virtual cfgcache[].
170          */
171         if (busno == 0 && ((offset >= 0x10 && offset < 0x34) ||
172                            (offset >= 0x38 && offset < 0x3c))) {
173                 data = pcie->cfgcache[(offset - 0x10) / 4];
174                 debug("(addr,size,val)=(0x%04x, %d, 0x%08x) from cfgcache\n",
175                       offset, size, data);
176                 *valuep = pci_conv_32_to_size(data, offset, size);
177                 return 0;
178         }
179
180         /*
181          * PCI bridge is device 0 at the root bus (zero) but mvebu has it
182          * mapped on secondary bus with device number 1.
183          */
184         if (busno == 0)
185                 addr = PCI_CONF1_EXT_ADDRESS(pcie->sec_busno, 1, 0, offset);
186         else
187                 addr = PCI_CONF1_EXT_ADDRESS(busno, PCI_DEV(bdf), PCI_FUNC(bdf), offset);
188
189         /* write address */
190         writel(addr, pcie->base + MVPCIE_CONF_ADDR_OFF);
191
192         /* read data */
193         switch (size) {
194         case PCI_SIZE_8:
195                 data = readb(pcie->base + MVPCIE_CONF_DATA_OFF + (offset & 3));
196                 break;
197         case PCI_SIZE_16:
198                 data = readw(pcie->base + MVPCIE_CONF_DATA_OFF + (offset & 2));
199                 break;
200         case PCI_SIZE_32:
201                 data = readl(pcie->base + MVPCIE_CONF_DATA_OFF);
202                 break;
203         default:
204                 return -EINVAL;
205         }
206
207         if (busno == 0 && (offset & ~3) == (PCI_HEADER_TYPE & ~3)) {
208                 /*
209                  * Change Header Type of PCI Bridge device to Type 1
210                  * (0x01, used by PCI Bridges) because mvebu reports
211                  * Type 0 (0x00, used by Upstream and Endpoint devices).
212                  */
213                 data = pci_conv_size_to_32(data, 0, offset, size);
214                 data &= ~0x007f0000;
215                 data |= PCI_HEADER_TYPE_BRIDGE << 16;
216                 data = pci_conv_32_to_size(data, offset, size);
217         }
218
219         debug("(addr,size,val)=(0x%04x, %d, 0x%08x)\n", offset, size, data);
220         *valuep = data;
221
222         return 0;
223 }
224
225 static int mvebu_pcie_write_config(struct udevice *bus, pci_dev_t bdf,
226                                    uint offset, ulong value,
227                                    enum pci_size_t size)
228 {
229         struct mvebu_pcie *pcie = dev_get_plat(bus);
230         int busno = PCI_BUS(bdf) - dev_seq(bus);
231         u32 addr, data;
232
233         debug("PCIE CFG write: (b,d,f)=(%2d,%2d,%2d) ",
234               PCI_BUS(bdf), PCI_DEV(bdf), PCI_FUNC(bdf));
235         debug("(addr,size,val)=(0x%04x, %d, 0x%08lx)\n", offset, size, value);
236
237         if (!mvebu_pcie_valid_addr(pcie, busno, PCI_DEV(bdf), PCI_FUNC(bdf))) {
238                 debug("- out of range\n");
239                 return 0;
240         }
241
242         /*
243          * As explained in mvebu_pcie_read_config(), PCI Bridge Type 1 specific
244          * config registers are not available, so we write their content only
245          * into driver virtual cfgcache[].
246          * And as explained in mvebu_pcie_probe(), mvebu has its own specific
247          * way for configuring secondary bus number.
248          */
249         if (busno == 0 && ((offset >= 0x10 && offset < 0x34) ||
250                            (offset >= 0x38 && offset < 0x3c))) {
251                 debug("Writing to cfgcache only\n");
252                 data = pcie->cfgcache[(offset - 0x10) / 4];
253                 data = pci_conv_size_to_32(data, value, offset, size);
254                 /* mvebu PCI bridge does not have configurable bars */
255                 if ((offset & ~3) == PCI_BASE_ADDRESS_0 ||
256                     (offset & ~3) == PCI_BASE_ADDRESS_1 ||
257                     (offset & ~3) == PCI_ROM_ADDRESS1)
258                         data = 0x0;
259                 pcie->cfgcache[(offset - 0x10) / 4] = data;
260                 /* mvebu has its own way how to set PCI secondary bus number */
261                 if (offset == PCI_SECONDARY_BUS ||
262                     (offset == PCI_PRIMARY_BUS && size != PCI_SIZE_8)) {
263                         pcie->sec_busno = (data >> 8) & 0xff;
264                         mvebu_pcie_set_local_bus_nr(pcie, pcie->sec_busno);
265                         debug("Secondary bus number was changed to %d\n",
266                               pcie->sec_busno);
267                 }
268                 return 0;
269         }
270
271         /*
272          * PCI bridge is device 0 at the root bus (zero) but mvebu has it
273          * mapped on secondary bus with device number 1.
274          */
275         if (busno == 0)
276                 addr = PCI_CONF1_EXT_ADDRESS(pcie->sec_busno, 1, 0, offset);
277         else
278                 addr = PCI_CONF1_EXT_ADDRESS(busno, PCI_DEV(bdf), PCI_FUNC(bdf), offset);
279
280         /* write address */
281         writel(addr, pcie->base + MVPCIE_CONF_ADDR_OFF);
282
283         /* write data */
284         switch (size) {
285         case PCI_SIZE_8:
286                 writeb(value, pcie->base + MVPCIE_CONF_DATA_OFF + (offset & 3));
287                 break;
288         case PCI_SIZE_16:
289                 writew(value, pcie->base + MVPCIE_CONF_DATA_OFF + (offset & 2));
290                 break;
291         case PCI_SIZE_32:
292                 writel(value, pcie->base + MVPCIE_CONF_DATA_OFF);
293                 break;
294         default:
295                 return -EINVAL;
296         }
297
298         return 0;
299 }
300
301 /*
302  * Setup PCIE BARs and Address Decode Wins:
303  * BAR[0] -> internal registers
304  * BAR[1] -> covers all DRAM banks
305  * BAR[2] -> disabled
306  * WIN[0-3] -> DRAM bank[0-3]
307  */
308 static void mvebu_pcie_setup_wins(struct mvebu_pcie *pcie)
309 {
310         const struct mbus_dram_target_info *dram = mvebu_mbus_dram_info();
311         u32 size;
312         int i;
313
314         /* First, disable and clear BARs and windows. */
315         for (i = 1; i < 3; i++) {
316                 writel(0, pcie->base + MVPCIE_BAR_CTRL_OFF(i));
317                 writel(0, pcie->base + MVPCIE_BAR_LO_OFF(i));
318                 writel(0, pcie->base + MVPCIE_BAR_HI_OFF(i));
319         }
320
321         for (i = 0; i < 5; i++) {
322                 writel(0, pcie->base + MVPCIE_WIN04_CTRL_OFF(i));
323                 writel(0, pcie->base + MVPCIE_WIN04_BASE_OFF(i));
324                 writel(0, pcie->base + MVPCIE_WIN04_REMAP_OFF(i));
325         }
326
327         writel(0, pcie->base + MVPCIE_WIN5_CTRL_OFF);
328         writel(0, pcie->base + MVPCIE_WIN5_BASE_OFF);
329         writel(0, pcie->base + MVPCIE_WIN5_REMAP_OFF);
330
331         /* Setup windows for DDR banks. Count total DDR size on the fly. */
332         size = 0;
333         for (i = 0; i < dram->num_cs; i++) {
334                 const struct mbus_dram_window *cs = dram->cs + i;
335
336                 writel(cs->base & 0xffff0000,
337                        pcie->base + MVPCIE_WIN04_BASE_OFF(i));
338                 writel(0, pcie->base + MVPCIE_WIN04_REMAP_OFF(i));
339                 writel(((cs->size - 1) & 0xffff0000) |
340                        (cs->mbus_attr << 8) |
341                        (dram->mbus_dram_target_id << 4) | 1,
342                        pcie->base + MVPCIE_WIN04_CTRL_OFF(i));
343
344                 size += cs->size;
345         }
346
347         /* Round up 'size' to the nearest power of two. */
348         if ((size & (size - 1)) != 0)
349                 size = 1 << fls(size);
350
351         /* Setup BAR[1] to all DRAM banks. */
352         writel(dram->cs[0].base | 0xc, pcie->base + MVPCIE_BAR_LO_OFF(1));
353         writel(0, pcie->base + MVPCIE_BAR_HI_OFF(1));
354         writel(((size - 1) & 0xffff0000) | 0x1,
355                pcie->base + MVPCIE_BAR_CTRL_OFF(1));
356
357         /* Setup BAR[0] to internal registers. */
358         writel(pcie->intregs, pcie->base + MVPCIE_BAR_LO_OFF(0));
359         writel(0, pcie->base + MVPCIE_BAR_HI_OFF(0));
360 }
361
362 /* Only enable PCIe link, do not setup it */
363 static int mvebu_pcie_enable_link(struct mvebu_pcie *pcie, ofnode node)
364 {
365         struct reset_ctl rst;
366         int ret;
367
368         ret = reset_get_by_index_nodev(node, 0, &rst);
369         if (ret == -ENOENT) {
370                 return 0;
371         } else if (ret < 0) {
372                 printf("%s: cannot get reset controller: %d\n", pcie->name, ret);
373                 return ret;
374         }
375
376         ret = reset_request(&rst);
377         if (ret) {
378                 printf("%s: cannot request reset controller: %d\n", pcie->name, ret);
379                 return ret;
380         }
381
382         ret = reset_deassert(&rst);
383         reset_free(&rst);
384         if (ret) {
385                 printf("%s: cannot enable PCIe port: %d\n", pcie->name, ret);
386                 return ret;
387         }
388
389         return 0;
390 }
391
392 /* Setup PCIe link but do not enable it */
393 static void mvebu_pcie_setup_link(struct mvebu_pcie *pcie)
394 {
395         u32 reg;
396
397         /* Setup PCIe controller to Root Complex mode */
398         reg = readl(pcie->base + MVPCIE_CTRL_OFF);
399         reg |= MVPCIE_CTRL_RC_MODE;
400         writel(reg, pcie->base + MVPCIE_CTRL_OFF);
401
402         /*
403          * Set Maximum Link Width to X1 or X4 in Root Port's PCIe Link
404          * Capability register. This register is defined by PCIe specification
405          * as read-only but this mvebu controller has it as read-write and must
406          * be set to number of SerDes PCIe lanes (1 or 4). If this register is
407          * not set correctly then link with endpoint card is not established.
408          */
409         reg = readl(pcie->base + MVPCIE_ROOT_PORT_PCI_EXP_OFF + PCI_EXP_LNKCAP);
410         reg &= ~PCI_EXP_LNKCAP_MLW;
411         reg |= (pcie->is_x4 ? 4 : 1) << 4;
412         writel(reg, pcie->base + MVPCIE_ROOT_PORT_PCI_EXP_OFF + PCI_EXP_LNKCAP);
413 }
414
415 static int mvebu_pcie_probe(struct udevice *dev)
416 {
417         struct mvebu_pcie *pcie = dev_get_plat(dev);
418         struct udevice *ctlr = pci_get_controller(dev);
419         struct pci_controller *hose = dev_get_uclass_priv(ctlr);
420         u32 reg;
421         int ret;
422
423         /* Request for optional PERST# GPIO */
424         ret = gpio_request_by_name(dev, "reset-gpios", 0, &pcie->reset_gpio, GPIOD_IS_OUT);
425         if (ret && ret != -ENOENT) {
426                 printf("%s: unable to request reset-gpios: %d\n", pcie->name, ret);
427                 return ret;
428         }
429
430         /*
431          * Change Class Code of PCI Bridge device to PCI Bridge (0x600400)
432          * because default value is Memory controller (0x508000) which
433          * U-Boot cannot recognize as P2P Bridge.
434          *
435          * Note that this mvebu PCI Bridge does not have compliant Type 1
436          * Configuration Space. Header Type is reported as Type 0 and it
437          * has format of Type 0 config space.
438          *
439          * Moreover Type 0 BAR registers (ranges 0x10 - 0x28 and 0x30 - 0x34)
440          * have the same format in Marvell's specification as in PCIe
441          * specification, but their meaning is totally different and they do
442          * different things: they are aliased into internal mvebu registers
443          * (e.g. MVPCIE_BAR_LO_OFF) and these should not be changed or
444          * reconfigured by pci device drivers.
445          *
446          * So our driver converts Type 0 config space to Type 1 and reports
447          * Header Type as Type 1. Access to BAR registers and to non-existent
448          * Type 1 registers is redirected to the virtual cfgcache[] buffer,
449          * which avoids changing unrelated registers.
450          */
451         reg = readl(pcie->base + MVPCIE_ROOT_PORT_PCI_CFG_OFF + PCI_CLASS_REVISION);
452         reg &= ~0xffffff00;
453         reg |= PCI_CLASS_BRIDGE_PCI_NORMAL << 8;
454         writel(reg, pcie->base + MVPCIE_ROOT_PORT_PCI_CFG_OFF + PCI_CLASS_REVISION);
455
456         /*
457          * mvebu uses local bus number and local device number to determinate
458          * type of config request. Type 0 is used if target bus number equals
459          * local bus number and target device number differs from local device
460          * number. Type 1 is used if target bus number differs from local bus
461          * number. And when target bus number equals local bus number and
462          * target device equals local device number then request is routed to
463          * PCI Bridge which represent local PCIe Root Port.
464          *
465          * It means that PCI root and secondary buses shares one bus number
466          * which is configured via local bus number. Determination if config
467          * request should go to root or secondary bus is done based on local
468          * device number.
469          *
470          * PCIe is point-to-point bus, so at secondary bus is always exactly one
471          * device with number 0. So set local device number to 1, it would not
472          * conflict with any device on secondary bus number and will ensure that
473          * accessing secondary bus and all buses behind secondary would work
474          * automatically and correctly. Therefore this configuration of local
475          * device number implies that setting of local bus number configures
476          * secondary bus number. Set it to 0 as U-Boot CONFIG_PCI_PNP code will
477          * later configure it via config write requests to the correct value.
478          * mvebu_pcie_write_config() catches config write requests which tries
479          * to change secondary bus number and correctly updates local bus number
480          * based on new secondary bus number.
481          *
482          * With this configuration is PCI Bridge available at secondary bus as
483          * device number 1. But it must be available at root bus (zero) as device
484          * number 0. So in mvebu_pcie_read_config() and mvebu_pcie_write_config()
485          * functions rewrite address to the real one when accessing the root bus.
486          */
487         mvebu_pcie_set_local_bus_nr(pcie, 0);
488         mvebu_pcie_set_local_dev_nr(pcie, 1);
489
490         /*
491          * Kirkwood arch code already maps mbus windows for PCIe IO and MEM.
492          * So skip calling mvebu_mbus_add_window_by_id() function as it would
493          * fail on error "conflicts with another window" which means conflict
494          * with existing PCIe window mappings.
495          */
496 #ifndef CONFIG_ARCH_KIRKWOOD
497         if (resource_size(&pcie->mem) &&
498             mvebu_mbus_add_window_by_id(pcie->mem_target, pcie->mem_attr,
499                                         (phys_addr_t)pcie->mem.start,
500                                         resource_size(&pcie->mem))) {
501                 printf("%s: unable to add mbus window for mem at %08x+%08x\n",
502                        pcie->name,
503                        (u32)pcie->mem.start, (unsigned)resource_size(&pcie->mem));
504                 pcie->mem.start = 0;
505                 pcie->mem.end = -1;
506         }
507
508         if (resource_size(&pcie->io) &&
509             mvebu_mbus_add_window_by_id(pcie->io_target, pcie->io_attr,
510                                         (phys_addr_t)pcie->io.start,
511                                         resource_size(&pcie->io))) {
512                 printf("%s: unable to add mbus window for IO at %08x+%08x\n",
513                        pcie->name,
514                        (u32)pcie->io.start, (unsigned)resource_size(&pcie->io));
515                 pcie->io.start = 0;
516                 pcie->io.end = -1;
517         }
518 #endif
519
520         /* Setup windows and configure host bridge */
521         mvebu_pcie_setup_wins(pcie);
522
523         /* PCI memory space */
524         pci_set_region(hose->regions + 0, pcie->mem.start,
525                        pcie->mem.start, resource_size(&pcie->mem), PCI_REGION_MEM);
526         hose->region_count = 1;
527
528         if (resource_size(&pcie->mem)) {
529                 pci_set_region(hose->regions + hose->region_count,
530                                pcie->mem.start, pcie->mem.start,
531                                resource_size(&pcie->mem),
532                                PCI_REGION_MEM);
533                 hose->region_count++;
534         }
535
536         if (resource_size(&pcie->io)) {
537                 pci_set_region(hose->regions + hose->region_count,
538                                pcie->io.start, pcie->io.start,
539                                resource_size(&pcie->io),
540                                PCI_REGION_IO);
541                 hose->region_count++;
542         }
543
544         /* PCI Bridge support 32-bit I/O and 64-bit prefetch mem addressing */
545         pcie->cfgcache[(PCI_IO_BASE - 0x10) / 4] =
546                 PCI_IO_RANGE_TYPE_32 | (PCI_IO_RANGE_TYPE_32 << 8);
547         pcie->cfgcache[(PCI_PREF_MEMORY_BASE - 0x10) / 4] =
548                 PCI_PREF_RANGE_TYPE_64 | (PCI_PREF_RANGE_TYPE_64 << 16);
549
550         /* Release PERST# via GPIO when it was defined */
551         if (dm_gpio_is_valid(&pcie->reset_gpio))
552                 dm_gpio_set_value(&pcie->reset_gpio, 0);
553
554         mvebu_pcie_wait_for_link(pcie);
555
556         return 0;
557 }
558
559 #define DT_FLAGS_TO_TYPE(flags)       (((flags) >> 24) & 0x03)
560 #define    DT_TYPE_IO                 0x1
561 #define    DT_TYPE_MEM32              0x2
562 #define DT_CPUADDR_TO_TARGET(cpuaddr) (((cpuaddr) >> 56) & 0xFF)
563 #define DT_CPUADDR_TO_ATTR(cpuaddr)   (((cpuaddr) >> 48) & 0xFF)
564
565 static int mvebu_get_tgt_attr(ofnode node, int devfn,
566                               unsigned long type,
567                               unsigned int *tgt,
568                               unsigned int *attr)
569 {
570         const int na = 3, ns = 2;
571         const __be32 *range;
572         int rlen, nranges, rangesz, pna, i;
573
574         *tgt = -1;
575         *attr = -1;
576
577         range = ofnode_get_property(node, "ranges", &rlen);
578         if (!range)
579                 return -EINVAL;
580
581         /*
582          * Linux uses of_n_addr_cells() to get the number of address cells
583          * here. Currently this function is only available in U-Boot when
584          * CONFIG_OF_LIVE is enabled. Until this is enabled for MVEBU in
585          * general, lets't hardcode the "pna" value in the U-Boot code.
586          */
587         pna = 2; /* hardcoded for now because of lack of of_n_addr_cells() */
588         rangesz = pna + na + ns;
589         nranges = rlen / sizeof(__be32) / rangesz;
590
591         for (i = 0; i < nranges; i++, range += rangesz) {
592                 u32 flags = of_read_number(range, 1);
593                 u32 slot = of_read_number(range + 1, 1);
594                 u64 cpuaddr = of_read_number(range + na, pna);
595                 unsigned long rtype;
596
597                 if (DT_FLAGS_TO_TYPE(flags) == DT_TYPE_IO)
598                         rtype = IORESOURCE_IO;
599                 else if (DT_FLAGS_TO_TYPE(flags) == DT_TYPE_MEM32)
600                         rtype = IORESOURCE_MEM;
601                 else
602                         continue;
603
604                 /*
605                  * The Linux code used PCI_SLOT() here, which expects devfn
606                  * in bits 7..0. PCI_DEV() in U-Boot is similar to PCI_SLOT(),
607                  * only expects devfn in 15..8, where its saved in this driver.
608                  */
609                 if (slot == PCI_DEV(devfn) && type == rtype) {
610                         *tgt = DT_CPUADDR_TO_TARGET(cpuaddr);
611                         *attr = DT_CPUADDR_TO_ATTR(cpuaddr);
612                         return 0;
613                 }
614         }
615
616         return -ENOENT;
617 }
618
619 static int mvebu_pcie_port_parse_dt(ofnode node, ofnode parent, struct mvebu_pcie *pcie)
620 {
621         struct fdt_pci_addr pci_addr;
622         const u32 *addr;
623         u32 num_lanes;
624         int ret = 0;
625         int len;
626
627         /* Get port number, lane number and memory target / attr */
628         if (ofnode_read_u32(node, "marvell,pcie-port",
629                             &pcie->port)) {
630                 ret = -ENODEV;
631                 goto err;
632         }
633
634         if (ofnode_read_u32(node, "marvell,pcie-lane", &pcie->lane))
635                 pcie->lane = 0;
636
637         sprintf(pcie->name, "pcie%d.%d", pcie->port, pcie->lane);
638
639         if (!ofnode_read_u32(node, "num-lanes", &num_lanes) && num_lanes == 4)
640                 pcie->is_x4 = true;
641
642         /* devfn is in bits [15:8], see PCI_DEV usage */
643         ret = ofnode_read_pci_addr(node, FDT_PCI_SPACE_CONFIG, "reg", &pci_addr);
644         if (ret < 0) {
645                 printf("%s: property \"reg\" is invalid\n", pcie->name);
646                 goto err;
647         }
648         pcie->devfn = pci_addr.phys_hi & 0xff00;
649
650         ret = mvebu_get_tgt_attr(parent, pcie->devfn,
651                                  IORESOURCE_MEM,
652                                  &pcie->mem_target, &pcie->mem_attr);
653         if (ret < 0) {
654                 printf("%s: cannot get tgt/attr for mem window\n", pcie->name);
655                 goto err;
656         }
657
658         ret = mvebu_get_tgt_attr(parent, pcie->devfn,
659                                  IORESOURCE_IO,
660                                  &pcie->io_target, &pcie->io_attr);
661         if (ret < 0) {
662                 printf("%s: cannot get tgt/attr for IO window\n", pcie->name);
663                 goto err;
664         }
665
666         /* Parse PCIe controller register base from DT */
667         addr = ofnode_get_property(node, "assigned-addresses", &len);
668         if (!addr) {
669                 printf("%s: property \"assigned-addresses\" not found\n", pcie->name);
670                 ret = -FDT_ERR_NOTFOUND;
671                 goto err;
672         }
673
674         pcie->base = (void *)(u32)ofnode_translate_address(node, addr);
675         pcie->intregs = (u32)pcie->base - fdt32_to_cpu(addr[2]);
676
677         return 0;
678
679 err:
680         return ret;
681 }
682
683 static const struct dm_pci_ops mvebu_pcie_ops = {
684         .read_config    = mvebu_pcie_read_config,
685         .write_config   = mvebu_pcie_write_config,
686 };
687
688 static struct driver pcie_mvebu_drv = {
689         .name                   = "pcie_mvebu",
690         .id                     = UCLASS_PCI,
691         .ops                    = &mvebu_pcie_ops,
692         .probe                  = mvebu_pcie_probe,
693         .plat_auto      = sizeof(struct mvebu_pcie),
694 };
695
696 /*
697  * Use a MISC device to bind the n instances (child nodes) of the
698  * PCIe base controller in UCLASS_PCI.
699  */
700 static int mvebu_pcie_bind(struct udevice *parent)
701 {
702         struct mvebu_pcie **ports_pcie;
703         struct mvebu_pcie *pcie;
704         struct uclass_driver *drv;
705         struct udevice *dev;
706         struct resource mem;
707         struct resource io;
708         int ports_count, i;
709         ofnode *ports_nodes;
710         ofnode subnode;
711
712         /* Lookup pci driver */
713         drv = lists_uclass_lookup(UCLASS_PCI);
714         if (!drv) {
715                 puts("Cannot find PCI driver\n");
716                 return -ENOENT;
717         }
718
719         ports_count = ofnode_get_child_count(dev_ofnode(parent));
720         ports_pcie = calloc(ports_count, sizeof(*ports_pcie));
721         ports_nodes = calloc(ports_count, sizeof(*ports_nodes));
722         if (!ports_pcie || !ports_nodes) {
723                 free(ports_pcie);
724                 free(ports_nodes);
725                 return -ENOMEM;
726         }
727         ports_count = 0;
728
729 #ifdef CONFIG_ARCH_KIRKWOOD
730         mem.start = KW_DEFADR_PCI_MEM;
731         mem.end = KW_DEFADR_PCI_MEM + KW_DEFADR_PCI_MEM_SIZE - 1;
732         io.start = KW_DEFADR_PCI_IO;
733         io.end = KW_DEFADR_PCI_IO + KW_DEFADR_PCI_IO_SIZE - 1;
734 #else
735         mem.start = MBUS_PCI_MEM_BASE;
736         mem.end = MBUS_PCI_MEM_BASE + MBUS_PCI_MEM_SIZE - 1;
737         io.start = MBUS_PCI_IO_BASE;
738         io.end = MBUS_PCI_IO_BASE + MBUS_PCI_IO_SIZE - 1;
739 #endif
740
741         /* First phase: Fill mvebu_pcie struct for each port */
742         ofnode_for_each_subnode(subnode, dev_ofnode(parent)) {
743                 if (!ofnode_is_enabled(subnode))
744                         continue;
745
746                 pcie = calloc(1, sizeof(*pcie));
747                 if (!pcie)
748                         continue;
749
750                 if (mvebu_pcie_port_parse_dt(subnode, dev_ofnode(parent), pcie) < 0) {
751                         free(pcie);
752                         continue;
753                 }
754
755                 /*
756                  * MVEBU PCIe controller needs MEMORY and I/O BARs to be mapped
757                  * into SoCs address space. Each controller will map 128M of MEM
758                  * and 64K of I/O space when registered.
759                  */
760
761                 if (resource_size(&mem) >= SZ_128M) {
762                         pcie->mem.start = mem.start;
763                         pcie->mem.end = mem.start + SZ_128M - 1;
764                         mem.start += SZ_128M;
765                 } else {
766                         printf("%s: unable to assign mbus window for mem\n", pcie->name);
767                         pcie->mem.start = 0;
768                         pcie->mem.end = -1;
769                 }
770
771                 if (resource_size(&io) >= SZ_64K) {
772                         pcie->io.start = io.start;
773                         pcie->io.end = io.start + SZ_64K - 1;
774                         io.start += SZ_64K;
775                 } else {
776                         printf("%s: unable to assign mbus window for io\n", pcie->name);
777                         pcie->io.start = 0;
778                         pcie->io.end = -1;
779                 }
780
781                 ports_pcie[ports_count] = pcie;
782                 ports_nodes[ports_count] = subnode;
783                 ports_count++;
784         }
785
786         /* Second phase: Setup all PCIe links (do not enable them yet) */
787         for (i = 0; i < ports_count; i++)
788                 mvebu_pcie_setup_link(ports_pcie[i]);
789
790         /* Third phase: Enable all PCIe links and create for each UCLASS_PCI device */
791         for (i = 0; i < ports_count; i++) {
792                 pcie = ports_pcie[i];
793                 subnode = ports_nodes[i];
794
795                 /*
796                  * PCIe link can be enabled only after all PCIe links were
797                  * properly configured. This is because more PCIe links shares
798                  * one enable bit and some PCIe links cannot be enabled
799                  * individually.
800                  */
801                 if (mvebu_pcie_enable_link(pcie, subnode) < 0) {
802                         free(pcie);
803                         continue;
804                 }
805
806                 /* Create child device UCLASS_PCI and bind it */
807                 device_bind(parent, &pcie_mvebu_drv, pcie->name, pcie, subnode,
808                             &dev);
809         }
810
811         free(ports_pcie);
812         free(ports_nodes);
813
814         return 0;
815 }
816
817 static const struct udevice_id mvebu_pcie_ids[] = {
818         { .compatible = "marvell,armada-xp-pcie" },
819         { .compatible = "marvell,armada-370-pcie" },
820         { .compatible = "marvell,kirkwood-pcie" },
821         { }
822 };
823
824 U_BOOT_DRIVER(pcie_mvebu_base) = {
825         .name                   = "pcie_mvebu_base",
826         .id                     = UCLASS_MISC,
827         .of_match               = mvebu_pcie_ids,
828         .bind                   = mvebu_pcie_bind,
829 };