blob: f4e42266eaa758535b18eba2af5a987be1b87dd5 [file] [log] [blame]
Ryder Lee637cfaca2017-05-21 11:42:24 +08001/*
2 * MediaTek PCIe host controller driver.
3 *
4 * Copyright (c) 2017 MediaTek Inc.
5 * Author: Ryder Lee <ryder.lee@mediatek.com>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 */
16
17#include <linux/clk.h>
18#include <linux/delay.h>
Ryder Leee10b7a12017-08-10 14:34:54 +080019#include <linux/iopoll.h>
Ryder Lee637cfaca2017-05-21 11:42:24 +080020#include <linux/kernel.h>
21#include <linux/of_address.h>
22#include <linux/of_pci.h>
23#include <linux/of_platform.h>
24#include <linux/pci.h>
25#include <linux/phy/phy.h>
26#include <linux/platform_device.h>
27#include <linux/pm_runtime.h>
28#include <linux/reset.h>
29
30/* PCIe shared registers */
31#define PCIE_SYS_CFG 0x00
32#define PCIE_INT_ENABLE 0x0c
33#define PCIE_CFG_ADDR 0x20
34#define PCIE_CFG_DATA 0x24
35
36/* PCIe per port registers */
37#define PCIE_BAR0_SETUP 0x10
38#define PCIE_CLASS 0x34
39#define PCIE_LINK_STATUS 0x50
40
41#define PCIE_PORT_INT_EN(x) BIT(20 + (x))
42#define PCIE_PORT_PERST(x) BIT(1 + (x))
43#define PCIE_PORT_LINKUP BIT(0)
44#define PCIE_BAR_MAP_MAX GENMASK(31, 16)
45
46#define PCIE_BAR_ENABLE BIT(0)
47#define PCIE_REVISION_ID BIT(0)
48#define PCIE_CLASS_CODE (0x60400 << 8)
49#define PCIE_CONF_REG(regn) (((regn) & GENMASK(7, 2)) | \
50 ((((regn) >> 8) & GENMASK(3, 0)) << 24))
51#define PCIE_CONF_FUN(fun) (((fun) << 8) & GENMASK(10, 8))
52#define PCIE_CONF_DEV(dev) (((dev) << 11) & GENMASK(15, 11))
53#define PCIE_CONF_BUS(bus) (((bus) << 16) & GENMASK(23, 16))
54#define PCIE_CONF_ADDR(regn, fun, dev, bus) \
55 (PCIE_CONF_REG(regn) | PCIE_CONF_FUN(fun) | \
56 PCIE_CONF_DEV(dev) | PCIE_CONF_BUS(bus))
57
58/* MediaTek specific configuration registers */
59#define PCIE_FTS_NUM 0x70c
60#define PCIE_FTS_NUM_MASK GENMASK(15, 8)
61#define PCIE_FTS_NUM_L0(x) ((x) & 0xff << 8)
62
63#define PCIE_FC_CREDIT 0x73c
64#define PCIE_FC_CREDIT_MASK (GENMASK(31, 31) | GENMASK(28, 16))
65#define PCIE_FC_CREDIT_VAL(x) ((x) << 16)
66
67/**
68 * struct mtk_pcie_port - PCIe port information
69 * @base: IO mapped register base
70 * @list: port list
71 * @pcie: pointer to PCIe host info
72 * @reset: pointer to port reset control
73 * @sys_ck: pointer to bus clock
74 * @phy: pointer to phy control block
75 * @lane: lane count
76 * @index: port index
77 */
78struct mtk_pcie_port {
79 void __iomem *base;
80 struct list_head list;
81 struct mtk_pcie *pcie;
82 struct reset_control *reset;
83 struct clk *sys_ck;
84 struct phy *phy;
85 u32 lane;
86 u32 index;
87};
88
89/**
90 * struct mtk_pcie - PCIe host information
91 * @dev: pointer to PCIe device
92 * @base: IO mapped register base
93 * @free_ck: free-run reference clock
94 * @io: IO resource
95 * @pio: PIO resource
96 * @mem: non-prefetchable memory resource
97 * @busn: bus range
98 * @offset: IO / Memory offset
99 * @ports: pointer to PCIe port information
100 */
101struct mtk_pcie {
102 struct device *dev;
103 void __iomem *base;
104 struct clk *free_ck;
105
106 struct resource io;
107 struct resource pio;
108 struct resource mem;
109 struct resource busn;
110 struct {
111 resource_size_t mem;
112 resource_size_t io;
113 } offset;
114 struct list_head ports;
115};
116
Ryder Lee637cfaca2017-05-21 11:42:24 +0800117static void mtk_pcie_subsys_powerdown(struct mtk_pcie *pcie)
118{
119 struct device *dev = pcie->dev;
120
121 clk_disable_unprepare(pcie->free_ck);
122
123 if (dev->pm_domain) {
124 pm_runtime_put_sync(dev);
125 pm_runtime_disable(dev);
126 }
127}
128
129static void mtk_pcie_port_free(struct mtk_pcie_port *port)
130{
131 struct mtk_pcie *pcie = port->pcie;
132 struct device *dev = pcie->dev;
133
134 devm_iounmap(dev, port->base);
135 list_del(&port->list);
136 devm_kfree(dev, port);
137}
138
139static void mtk_pcie_put_resources(struct mtk_pcie *pcie)
140{
141 struct mtk_pcie_port *port, *tmp;
142
143 list_for_each_entry_safe(port, tmp, &pcie->ports, list) {
144 phy_power_off(port->phy);
145 clk_disable_unprepare(port->sys_ck);
146 mtk_pcie_port_free(port);
147 }
148
149 mtk_pcie_subsys_powerdown(pcie);
150}
151
152static void __iomem *mtk_pcie_map_bus(struct pci_bus *bus,
153 unsigned int devfn, int where)
154{
155 struct pci_host_bridge *host = pci_find_host_bridge(bus);
156 struct mtk_pcie *pcie = pci_host_bridge_priv(host);
157
158 writel(PCIE_CONF_ADDR(where, PCI_FUNC(devfn), PCI_SLOT(devfn),
159 bus->number), pcie->base + PCIE_CFG_ADDR);
160
161 return pcie->base + PCIE_CFG_DATA + (where & 3);
162}
163
164static struct pci_ops mtk_pcie_ops = {
165 .map_bus = mtk_pcie_map_bus,
166 .read = pci_generic_config_read,
167 .write = pci_generic_config_write,
168};
169
Ryder Leee10b7a12017-08-10 14:34:54 +0800170static int mtk_pcie_startup_port(struct mtk_pcie_port *port)
Ryder Lee637cfaca2017-05-21 11:42:24 +0800171{
172 struct mtk_pcie *pcie = port->pcie;
173 u32 func = PCI_FUNC(port->index << 3);
174 u32 slot = PCI_SLOT(port->index << 3);
175 u32 val;
Ryder Leee10b7a12017-08-10 14:34:54 +0800176 int err;
177
178 /* assert port PERST_N */
179 val = readl(pcie->base + PCIE_SYS_CFG);
180 val |= PCIE_PORT_PERST(port->index);
181 writel(val, pcie->base + PCIE_SYS_CFG);
182
183 /* de-assert port PERST_N */
184 val = readl(pcie->base + PCIE_SYS_CFG);
185 val &= ~PCIE_PORT_PERST(port->index);
186 writel(val, pcie->base + PCIE_SYS_CFG);
187
188 /* 100ms timeout value should be enough for Gen1/2 training */
189 err = readl_poll_timeout(port->base + PCIE_LINK_STATUS, val,
190 !!(val & PCIE_PORT_LINKUP), 20,
191 100 * USEC_PER_MSEC);
192 if (err)
193 return -ETIMEDOUT;
Ryder Lee637cfaca2017-05-21 11:42:24 +0800194
195 /* enable interrupt */
196 val = readl(pcie->base + PCIE_INT_ENABLE);
197 val |= PCIE_PORT_INT_EN(port->index);
198 writel(val, pcie->base + PCIE_INT_ENABLE);
199
200 /* map to all DDR region. We need to set it before cfg operation. */
201 writel(PCIE_BAR_MAP_MAX | PCIE_BAR_ENABLE,
202 port->base + PCIE_BAR0_SETUP);
203
204 /* configure class code and revision ID */
205 writel(PCIE_CLASS_CODE | PCIE_REVISION_ID, port->base + PCIE_CLASS);
206
207 /* configure FC credit */
208 writel(PCIE_CONF_ADDR(PCIE_FC_CREDIT, func, slot, 0),
209 pcie->base + PCIE_CFG_ADDR);
210 val = readl(pcie->base + PCIE_CFG_DATA);
211 val &= ~PCIE_FC_CREDIT_MASK;
212 val |= PCIE_FC_CREDIT_VAL(0x806c);
213 writel(PCIE_CONF_ADDR(PCIE_FC_CREDIT, func, slot, 0),
214 pcie->base + PCIE_CFG_ADDR);
215 writel(val, pcie->base + PCIE_CFG_DATA);
216
217 /* configure RC FTS number to 250 when it leaves L0s */
218 writel(PCIE_CONF_ADDR(PCIE_FTS_NUM, func, slot, 0),
219 pcie->base + PCIE_CFG_ADDR);
220 val = readl(pcie->base + PCIE_CFG_DATA);
221 val &= ~PCIE_FTS_NUM_MASK;
222 val |= PCIE_FTS_NUM_L0(0x50);
223 writel(PCIE_CONF_ADDR(PCIE_FTS_NUM, func, slot, 0),
224 pcie->base + PCIE_CFG_ADDR);
225 writel(val, pcie->base + PCIE_CFG_DATA);
Ryder Lee637cfaca2017-05-21 11:42:24 +0800226
Ryder Leee10b7a12017-08-10 14:34:54 +0800227 return 0;
Ryder Lee637cfaca2017-05-21 11:42:24 +0800228}
229
230static void mtk_pcie_enable_ports(struct mtk_pcie_port *port)
231{
232 struct device *dev = port->pcie->dev;
233 int err;
234
235 err = clk_prepare_enable(port->sys_ck);
236 if (err) {
237 dev_err(dev, "failed to enable port%d clock\n", port->index);
238 goto err_sys_clk;
239 }
240
241 reset_control_assert(port->reset);
242 reset_control_deassert(port->reset);
243
244 err = phy_power_on(port->phy);
245 if (err) {
246 dev_err(dev, "failed to power on port%d phy\n", port->index);
247 goto err_phy_on;
248 }
249
Ryder Leee10b7a12017-08-10 14:34:54 +0800250 if (!mtk_pcie_startup_port(port))
Ryder Lee637cfaca2017-05-21 11:42:24 +0800251 return;
Ryder Lee637cfaca2017-05-21 11:42:24 +0800252
253 dev_info(dev, "Port%d link down\n", port->index);
254
255 phy_power_off(port->phy);
256err_phy_on:
257 clk_disable_unprepare(port->sys_ck);
258err_sys_clk:
259 mtk_pcie_port_free(port);
260}
261
262static int mtk_pcie_parse_ports(struct mtk_pcie *pcie,
263 struct device_node *node,
264 int index)
265{
266 struct mtk_pcie_port *port;
267 struct resource *regs;
268 struct device *dev = pcie->dev;
269 struct platform_device *pdev = to_platform_device(dev);
270 char name[10];
271 int err;
272
273 port = devm_kzalloc(dev, sizeof(*port), GFP_KERNEL);
274 if (!port)
275 return -ENOMEM;
276
277 err = of_property_read_u32(node, "num-lanes", &port->lane);
278 if (err) {
279 dev_err(dev, "missing num-lanes property\n");
280 return err;
281 }
282
283 regs = platform_get_resource(pdev, IORESOURCE_MEM, index + 1);
284 port->base = devm_ioremap_resource(dev, regs);
285 if (IS_ERR(port->base)) {
286 dev_err(dev, "failed to map port%d base\n", index);
287 return PTR_ERR(port->base);
288 }
289
290 snprintf(name, sizeof(name), "sys_ck%d", index);
291 port->sys_ck = devm_clk_get(dev, name);
292 if (IS_ERR(port->sys_ck)) {
293 dev_err(dev, "failed to get port%d clock\n", index);
294 return PTR_ERR(port->sys_ck);
295 }
296
297 snprintf(name, sizeof(name), "pcie-rst%d", index);
Philipp Zabel608fcac2017-07-19 17:26:00 +0200298 port->reset = devm_reset_control_get_optional_exclusive(dev, name);
Ryder Lee637cfaca2017-05-21 11:42:24 +0800299 if (PTR_ERR(port->reset) == -EPROBE_DEFER)
300 return PTR_ERR(port->reset);
301
302 /* some platforms may use default PHY setting */
303 snprintf(name, sizeof(name), "pcie-phy%d", index);
304 port->phy = devm_phy_optional_get(dev, name);
305 if (IS_ERR(port->phy))
306 return PTR_ERR(port->phy);
307
308 port->index = index;
309 port->pcie = pcie;
310
311 INIT_LIST_HEAD(&port->list);
312 list_add_tail(&port->list, &pcie->ports);
313
314 return 0;
315}
316
317static int mtk_pcie_subsys_powerup(struct mtk_pcie *pcie)
318{
319 struct device *dev = pcie->dev;
320 struct platform_device *pdev = to_platform_device(dev);
321 struct resource *regs;
322 int err;
323
324 /* get shared registers */
325 regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
326 pcie->base = devm_ioremap_resource(dev, regs);
327 if (IS_ERR(pcie->base)) {
328 dev_err(dev, "failed to map shared register\n");
329 return PTR_ERR(pcie->base);
330 }
331
332 pcie->free_ck = devm_clk_get(dev, "free_ck");
333 if (IS_ERR(pcie->free_ck)) {
334 if (PTR_ERR(pcie->free_ck) == -EPROBE_DEFER)
335 return -EPROBE_DEFER;
336
337 pcie->free_ck = NULL;
338 }
339
340 if (dev->pm_domain) {
341 pm_runtime_enable(dev);
342 pm_runtime_get_sync(dev);
343 }
344
345 /* enable top level clock */
346 err = clk_prepare_enable(pcie->free_ck);
347 if (err) {
348 dev_err(dev, "failed to enable free_ck\n");
349 goto err_free_ck;
350 }
351
352 return 0;
353
354err_free_ck:
355 if (dev->pm_domain) {
356 pm_runtime_put_sync(dev);
357 pm_runtime_disable(dev);
358 }
359
360 return err;
361}
362
363static int mtk_pcie_setup(struct mtk_pcie *pcie)
364{
365 struct device *dev = pcie->dev;
366 struct device_node *node = dev->of_node, *child;
367 struct of_pci_range_parser parser;
368 struct of_pci_range range;
369 struct resource res;
370 struct mtk_pcie_port *port, *tmp;
371 int err;
372
373 if (of_pci_range_parser_init(&parser, node)) {
374 dev_err(dev, "missing \"ranges\" property\n");
375 return -EINVAL;
376 }
377
378 for_each_of_pci_range(&parser, &range) {
379 err = of_pci_range_to_resource(&range, node, &res);
380 if (err < 0)
381 return err;
382
383 switch (res.flags & IORESOURCE_TYPE_BITS) {
384 case IORESOURCE_IO:
385 pcie->offset.io = res.start - range.pci_addr;
386
387 memcpy(&pcie->pio, &res, sizeof(res));
388 pcie->pio.name = node->full_name;
389
390 pcie->io.start = range.cpu_addr;
391 pcie->io.end = range.cpu_addr + range.size - 1;
392 pcie->io.flags = IORESOURCE_MEM;
393 pcie->io.name = "I/O";
394
395 memcpy(&res, &pcie->io, sizeof(res));
396 break;
397
398 case IORESOURCE_MEM:
399 pcie->offset.mem = res.start - range.pci_addr;
400
401 memcpy(&pcie->mem, &res, sizeof(res));
402 pcie->mem.name = "non-prefetchable";
403 break;
404 }
405 }
406
407 err = of_pci_parse_bus_range(node, &pcie->busn);
408 if (err < 0) {
409 dev_err(dev, "failed to parse bus ranges property: %d\n", err);
410 pcie->busn.name = node->name;
411 pcie->busn.start = 0;
412 pcie->busn.end = 0xff;
413 pcie->busn.flags = IORESOURCE_BUS;
414 }
415
416 for_each_available_child_of_node(node, child) {
417 int index;
418
419 err = of_pci_get_devfn(child);
420 if (err < 0) {
421 dev_err(dev, "failed to parse devfn: %d\n", err);
422 return err;
423 }
424
425 index = PCI_SLOT(err);
426
427 err = mtk_pcie_parse_ports(pcie, child, index);
428 if (err)
429 return err;
430 }
431
432 err = mtk_pcie_subsys_powerup(pcie);
433 if (err)
434 return err;
435
436 /* enable each port, and then check link status */
437 list_for_each_entry_safe(port, tmp, &pcie->ports, list)
438 mtk_pcie_enable_ports(port);
439
440 /* power down PCIe subsys if slots are all empty (link down) */
441 if (list_empty(&pcie->ports))
442 mtk_pcie_subsys_powerdown(pcie);
443
444 return 0;
445}
446
447static int mtk_pcie_request_resources(struct mtk_pcie *pcie)
448{
449 struct pci_host_bridge *host = pci_host_bridge_from_priv(pcie);
450 struct list_head *windows = &host->windows;
451 struct device *dev = pcie->dev;
452 int err;
453
454 pci_add_resource_offset(windows, &pcie->pio, pcie->offset.io);
455 pci_add_resource_offset(windows, &pcie->mem, pcie->offset.mem);
456 pci_add_resource(windows, &pcie->busn);
457
458 err = devm_request_pci_bus_resources(dev, windows);
459 if (err < 0)
460 return err;
461
462 pci_remap_iospace(&pcie->pio, pcie->io.start);
463
464 return 0;
465}
466
467static int mtk_pcie_register_host(struct pci_host_bridge *host)
468{
469 struct mtk_pcie *pcie = pci_host_bridge_priv(host);
470 struct pci_bus *child;
471 int err;
472
473 host->busnr = pcie->busn.start;
474 host->dev.parent = pcie->dev;
475 host->ops = &mtk_pcie_ops;
476 host->map_irq = of_irq_parse_and_map_pci;
477 host->swizzle_irq = pci_common_swizzle;
478
479 err = pci_scan_root_bus_bridge(host);
480 if (err < 0)
481 return err;
482
483 pci_bus_size_bridges(host->bus);
484 pci_bus_assign_resources(host->bus);
485
486 list_for_each_entry(child, &host->bus->children, node)
487 pcie_bus_configure_settings(child);
488
489 pci_bus_add_devices(host->bus);
490
491 return 0;
492}
493
494static int mtk_pcie_probe(struct platform_device *pdev)
495{
496 struct device *dev = &pdev->dev;
497 struct mtk_pcie *pcie;
498 struct pci_host_bridge *host;
499 int err;
500
501 host = devm_pci_alloc_host_bridge(dev, sizeof(*pcie));
502 if (!host)
503 return -ENOMEM;
504
505 pcie = pci_host_bridge_priv(host);
506
507 pcie->dev = dev;
508 platform_set_drvdata(pdev, pcie);
509 INIT_LIST_HEAD(&pcie->ports);
510
511 err = mtk_pcie_setup(pcie);
512 if (err)
513 return err;
514
515 err = mtk_pcie_request_resources(pcie);
516 if (err)
517 goto put_resources;
518
519 err = mtk_pcie_register_host(host);
520 if (err)
521 goto put_resources;
522
523 return 0;
524
525put_resources:
526 if (!list_empty(&pcie->ports))
527 mtk_pcie_put_resources(pcie);
528
529 return err;
530}
531
532static const struct of_device_id mtk_pcie_ids[] = {
533 { .compatible = "mediatek,mt7623-pcie"},
534 { .compatible = "mediatek,mt2701-pcie"},
535 {},
536};
537
538static struct platform_driver mtk_pcie_driver = {
539 .probe = mtk_pcie_probe,
540 .driver = {
541 .name = "mtk-pcie",
542 .of_match_table = mtk_pcie_ids,
543 .suppress_bind_attrs = true,
544 },
545};
546builtin_platform_driver(mtk_pcie_driver);