1 // SPDX-License-Identifier: GPL-2.0+ 2 /* 3 * Rockchip AXI PCIe host controller driver 4 * 5 * Copyright (c) 2016 Rockchip, Inc. 6 * 7 * Author: Shawn Lin <shawn.lin@rock-chips.com> 8 * Wenrui Li <wenrui.li@rock-chips.com> 9 * 10 * Bits taken from Synopsys DesignWare Host controller driver and 11 * ARM PCI Host generic driver. 12 */ 13 14 #include <linux/bitrev.h> 15 #include <linux/clk.h> 16 #include <linux/delay.h> 17 #include <linux/gpio/consumer.h> 18 #include <linux/init.h> 19 #include <linux/interrupt.h> 20 #include <linux/iopoll.h> 21 #include <linux/irq.h> 22 #include <linux/irqchip/chained_irq.h> 23 #include <linux/irqdomain.h> 24 #include <linux/kernel.h> 25 #include <linux/mfd/syscon.h> 26 #include <linux/module.h> 27 #include <linux/of_address.h> 28 #include <linux/of_device.h> 29 #include <linux/of_pci.h> 30 #include <linux/of_platform.h> 31 #include <linux/pci.h> 32 #include <linux/pci_ids.h> 33 #include <linux/phy/phy.h> 34 #include <linux/platform_device.h> 35 #include <linux/reset.h> 36 #include <linux/regmap.h> 37 38 #include "../pci.h" 39 #include "pcie-rockchip.h" 40 41 static void rockchip_pcie_enable_bw_int(struct rockchip_pcie *rockchip) 42 { 43 u32 status; 44 45 status = rockchip_pcie_read(rockchip, PCIE_RC_CONFIG_LCS); 46 status |= (PCI_EXP_LNKCTL_LBMIE | PCI_EXP_LNKCTL_LABIE); 47 rockchip_pcie_write(rockchip, status, PCIE_RC_CONFIG_LCS); 48 } 49 50 static void rockchip_pcie_clr_bw_int(struct rockchip_pcie *rockchip) 51 { 52 u32 status; 53 54 status = rockchip_pcie_read(rockchip, PCIE_RC_CONFIG_LCS); 55 status |= (PCI_EXP_LNKSTA_LBMS | PCI_EXP_LNKSTA_LABS) << 16; 56 rockchip_pcie_write(rockchip, status, PCIE_RC_CONFIG_LCS); 57 } 58 59 static void rockchip_pcie_update_txcredit_mui(struct rockchip_pcie *rockchip) 60 { 61 u32 val; 62 63 /* Update Tx credit maximum update interval */ 64 val = rockchip_pcie_read(rockchip, PCIE_CORE_TXCREDIT_CFG1); 65 val &= ~PCIE_CORE_TXCREDIT_CFG1_MUI_MASK; 66 val |= PCIE_CORE_TXCREDIT_CFG1_MUI_ENCODE(24000); /* ns */ 67 rockchip_pcie_write(rockchip, val, PCIE_CORE_TXCREDIT_CFG1); 68 } 69 70 static int rockchip_pcie_valid_device(struct rockchip_pcie *rockchip, 71 struct pci_bus *bus, int dev) 72 { 73 /* 74 * Access only one slot on each root port. 75 * Do not read more than one device on the bus directly attached 76 * to RC's downstream side. 77 */ 78 if (pci_is_root_bus(bus) || pci_is_root_bus(bus->parent)) 79 return dev == 0; 80 81 return 1; 82 } 83 84 static u8 rockchip_pcie_lane_map(struct rockchip_pcie *rockchip) 85 { 86 u32 val; 87 u8 map; 88 89 if (rockchip->legacy_phy) 90 return GENMASK(MAX_LANE_NUM - 1, 0); 91 92 val = rockchip_pcie_read(rockchip, PCIE_CORE_LANE_MAP); 93 map = val & PCIE_CORE_LANE_MAP_MASK; 94 95 /* The link may be using a reverse-indexed mapping. */ 96 if (val & PCIE_CORE_LANE_MAP_REVERSE) 97 map = bitrev8(map) >> 4; 98 99 return map; 100 } 101 102 static int rockchip_pcie_rd_own_conf(struct rockchip_pcie *rockchip, 103 int where, int size, u32 *val) 104 { 105 void __iomem *addr; 106 107 addr = rockchip->apb_base + PCIE_RC_CONFIG_NORMAL_BASE + where; 108 109 if (!IS_ALIGNED((uintptr_t)addr, size)) { 110 *val = 0; 111 return PCIBIOS_BAD_REGISTER_NUMBER; 112 } 113 114 if (size == 4) { 115 *val = readl(addr); 116 } else if (size == 2) { 117 *val = readw(addr); 118 } else if (size == 1) { 119 *val = readb(addr); 120 } else { 121 *val = 0; 122 return PCIBIOS_BAD_REGISTER_NUMBER; 123 } 124 return PCIBIOS_SUCCESSFUL; 125 } 126 127 static int rockchip_pcie_wr_own_conf(struct rockchip_pcie *rockchip, 128 int where, int size, u32 val) 129 { 130 u32 mask, tmp, offset; 131 void __iomem *addr; 132 133 offset = where & ~0x3; 134 addr = rockchip->apb_base + PCIE_RC_CONFIG_NORMAL_BASE + offset; 135 136 if (size == 4) { 137 writel(val, addr); 138 return PCIBIOS_SUCCESSFUL; 139 } 140 141 mask = ~(((1 << (size * 8)) - 1) << ((where & 0x3) * 8)); 142 143 /* 144 * N.B. This read/modify/write isn't safe in general because it can 145 * corrupt RW1C bits in adjacent registers. But the hardware 146 * doesn't support smaller writes. 147 */ 148 tmp = readl(addr) & mask; 149 tmp |= val << ((where & 0x3) * 8); 150 writel(tmp, addr); 151 152 return PCIBIOS_SUCCESSFUL; 153 } 154 155 static int rockchip_pcie_rd_other_conf(struct rockchip_pcie *rockchip, 156 struct pci_bus *bus, u32 devfn, 157 int where, int size, u32 *val) 158 { 159 void __iomem *addr; 160 161 addr = rockchip->reg_base + PCIE_ECAM_OFFSET(bus->number, devfn, where); 162 163 if (!IS_ALIGNED((uintptr_t)addr, size)) { 164 *val = 0; 165 return PCIBIOS_BAD_REGISTER_NUMBER; 166 } 167 168 if (pci_is_root_bus(bus->parent)) 169 rockchip_pcie_cfg_configuration_accesses(rockchip, 170 AXI_WRAPPER_TYPE0_CFG); 171 else 172 rockchip_pcie_cfg_configuration_accesses(rockchip, 173 AXI_WRAPPER_TYPE1_CFG); 174 175 if (size == 4) { 176 *val = readl(addr); 177 } else if (size == 2) { 178 *val = readw(addr); 179 } else if (size == 1) { 180 *val = readb(addr); 181 } else { 182 *val = 0; 183 return PCIBIOS_BAD_REGISTER_NUMBER; 184 } 185 return PCIBIOS_SUCCESSFUL; 186 } 187 188 static int rockchip_pcie_wr_other_conf(struct rockchip_pcie *rockchip, 189 struct pci_bus *bus, u32 devfn, 190 int where, int size, u32 val) 191 { 192 void __iomem *addr; 193 194 addr = rockchip->reg_base + PCIE_ECAM_OFFSET(bus->number, devfn, where); 195 196 if (!IS_ALIGNED((uintptr_t)addr, size)) 197 return PCIBIOS_BAD_REGISTER_NUMBER; 198 199 if (pci_is_root_bus(bus->parent)) 200 rockchip_pcie_cfg_configuration_accesses(rockchip, 201 AXI_WRAPPER_TYPE0_CFG); 202 else 203 rockchip_pcie_cfg_configuration_accesses(rockchip, 204 AXI_WRAPPER_TYPE1_CFG); 205 206 if (size == 4) 207 writel(val, addr); 208 else if (size == 2) 209 writew(val, addr); 210 else if (size == 1) 211 writeb(val, addr); 212 else 213 return PCIBIOS_BAD_REGISTER_NUMBER; 214 215 return PCIBIOS_SUCCESSFUL; 216 } 217 218 static int rockchip_pcie_rd_conf(struct pci_bus *bus, u32 devfn, int where, 219 int size, u32 *val) 220 { 221 struct rockchip_pcie *rockchip = bus->sysdata; 222 223 if (!rockchip_pcie_valid_device(rockchip, bus, PCI_SLOT(devfn))) 224 return PCIBIOS_DEVICE_NOT_FOUND; 225 226 if (pci_is_root_bus(bus)) 227 return rockchip_pcie_rd_own_conf(rockchip, where, size, val); 228 229 return rockchip_pcie_rd_other_conf(rockchip, bus, devfn, where, size, 230 val); 231 } 232 233 static int rockchip_pcie_wr_conf(struct pci_bus *bus, u32 devfn, 234 int where, int size, u32 val) 235 { 236 struct rockchip_pcie *rockchip = bus->sysdata; 237 238 if (!rockchip_pcie_valid_device(rockchip, bus, PCI_SLOT(devfn))) 239 return PCIBIOS_DEVICE_NOT_FOUND; 240 241 if (pci_is_root_bus(bus)) 242 return rockchip_pcie_wr_own_conf(rockchip, where, size, val); 243 244 return rockchip_pcie_wr_other_conf(rockchip, bus, devfn, where, size, 245 val); 246 } 247 248 static struct pci_ops rockchip_pcie_ops = { 249 .read = rockchip_pcie_rd_conf, 250 .write = rockchip_pcie_wr_conf, 251 }; 252 253 static void rockchip_pcie_set_power_limit(struct rockchip_pcie *rockchip) 254 { 255 int curr; 256 u32 status, scale, power; 257 258 if (IS_ERR(rockchip->vpcie3v3)) 259 return; 260 261 /* 262 * Set RC's captured slot power limit and scale if 263 * vpcie3v3 available. The default values are both zero 264 * which means the software should set these two according 265 * to the actual power supply. 266 */ 267 curr = regulator_get_current_limit(rockchip->vpcie3v3); 268 if (curr <= 0) 269 return; 270 271 scale = 3; /* 0.001x */ 272 curr = curr / 1000; /* convert to mA */ 273 power = (curr * 3300) / 1000; /* milliwatt */ 274 while (power > PCIE_RC_CONFIG_DCR_CSPL_LIMIT) { 275 if (!scale) { 276 dev_warn(rockchip->dev, "invalid power supply\n"); 277 return; 278 } 279 scale--; 280 power = power / 10; 281 } 282 283 status = rockchip_pcie_read(rockchip, PCIE_RC_CONFIG_DCR); 284 status |= (power << PCIE_RC_CONFIG_DCR_CSPL_SHIFT) | 285 (scale << PCIE_RC_CONFIG_DCR_CPLS_SHIFT); 286 rockchip_pcie_write(rockchip, status, PCIE_RC_CONFIG_DCR); 287 } 288 289 /** 290 * rockchip_pcie_host_init_port - Initialize hardware 291 * @rockchip: PCIe port information 292 */ 293 static int rockchip_pcie_host_init_port(struct rockchip_pcie *rockchip) 294 { 295 struct device *dev = rockchip->dev; 296 int err, i = MAX_LANE_NUM; 297 u32 status; 298 299 gpiod_set_value_cansleep(rockchip->ep_gpio, 0); 300 301 err = rockchip_pcie_init_port(rockchip); 302 if (err) 303 return err; 304 305 /* Fix the transmitted FTS count desired to exit from L0s. */ 306 status = rockchip_pcie_read(rockchip, PCIE_CORE_CTRL_PLC1); 307 status = (status & ~PCIE_CORE_CTRL_PLC1_FTS_MASK) | 308 (PCIE_CORE_CTRL_PLC1_FTS_CNT << PCIE_CORE_CTRL_PLC1_FTS_SHIFT); 309 rockchip_pcie_write(rockchip, status, PCIE_CORE_CTRL_PLC1); 310 311 rockchip_pcie_set_power_limit(rockchip); 312 313 /* Set RC's clock architecture as common clock */ 314 status = rockchip_pcie_read(rockchip, PCIE_RC_CONFIG_LCS); 315 status |= PCI_EXP_LNKSTA_SLC << 16; 316 rockchip_pcie_write(rockchip, status, PCIE_RC_CONFIG_LCS); 317 318 /* Set RC's RCB to 128 */ 319 status = rockchip_pcie_read(rockchip, PCIE_RC_CONFIG_LCS); 320 status |= PCI_EXP_LNKCTL_RCB; 321 rockchip_pcie_write(rockchip, status, PCIE_RC_CONFIG_LCS); 322 323 /* Enable Gen1 training */ 324 rockchip_pcie_write(rockchip, PCIE_CLIENT_LINK_TRAIN_ENABLE, 325 PCIE_CLIENT_CONFIG); 326 327 gpiod_set_value_cansleep(rockchip->ep_gpio, 1); 328 329 /* 500ms timeout value should be enough for Gen1/2 training */ 330 err = readl_poll_timeout(rockchip->apb_base + PCIE_CLIENT_BASIC_STATUS1, 331 status, PCIE_LINK_UP(status), 20, 332 500 * USEC_PER_MSEC); 333 if (err) { 334 dev_err(dev, "PCIe link training gen1 timeout!\n"); 335 goto err_power_off_phy; 336 } 337 338 if (rockchip->link_gen == 2) { 339 /* 340 * Enable retrain for gen2. This should be configured only after 341 * gen1 finished. 342 */ 343 status = rockchip_pcie_read(rockchip, PCIE_RC_CONFIG_LCS); 344 status |= PCI_EXP_LNKCTL_RL; 345 rockchip_pcie_write(rockchip, status, PCIE_RC_CONFIG_LCS); 346 347 err = readl_poll_timeout(rockchip->apb_base + PCIE_CORE_CTRL, 348 status, PCIE_LINK_IS_GEN2(status), 20, 349 500 * USEC_PER_MSEC); 350 if (err) 351 dev_dbg(dev, "PCIe link training gen2 timeout, fall back to gen1!\n"); 352 } 353 354 /* Check the final link width from negotiated lane counter from MGMT */ 355 status = rockchip_pcie_read(rockchip, PCIE_CORE_CTRL); 356 status = 0x1 << ((status & PCIE_CORE_PL_CONF_LANE_MASK) >> 357 PCIE_CORE_PL_CONF_LANE_SHIFT); 358 dev_dbg(dev, "current link width is x%d\n", status); 359 360 /* Power off unused lane(s) */ 361 rockchip->lanes_map = rockchip_pcie_lane_map(rockchip); 362 for (i = 0; i < MAX_LANE_NUM; i++) { 363 if (!(rockchip->lanes_map & BIT(i))) { 364 dev_dbg(dev, "idling lane %d\n", i); 365 phy_power_off(rockchip->phys[i]); 366 } 367 } 368 369 rockchip_pcie_write(rockchip, ROCKCHIP_VENDOR_ID, 370 PCIE_CORE_CONFIG_VENDOR); 371 rockchip_pcie_write(rockchip, 372 PCI_CLASS_BRIDGE_PCI_NORMAL << 8, 373 PCIE_RC_CONFIG_RID_CCR); 374 375 /* Clear THP cap's next cap pointer to remove L1 substate cap */ 376 status = rockchip_pcie_read(rockchip, PCIE_RC_CONFIG_THP_CAP); 377 status &= ~PCIE_RC_CONFIG_THP_CAP_NEXT_MASK; 378 rockchip_pcie_write(rockchip, status, PCIE_RC_CONFIG_THP_CAP); 379 380 /* Clear L0s from RC's link cap */ 381 if (of_property_read_bool(dev->of_node, "aspm-no-l0s")) { 382 status = rockchip_pcie_read(rockchip, PCIE_RC_CONFIG_LINK_CAP); 383 status &= ~PCIE_RC_CONFIG_LINK_CAP_L0S; 384 rockchip_pcie_write(rockchip, status, PCIE_RC_CONFIG_LINK_CAP); 385 } 386 387 status = rockchip_pcie_read(rockchip, PCIE_RC_CONFIG_DCSR); 388 status &= ~PCIE_RC_CONFIG_DCSR_MPS_MASK; 389 status |= PCIE_RC_CONFIG_DCSR_MPS_256; 390 rockchip_pcie_write(rockchip, status, PCIE_RC_CONFIG_DCSR); 391 392 return 0; 393 err_power_off_phy: 394 while (i--) 395 phy_power_off(rockchip->phys[i]); 396 i = MAX_LANE_NUM; 397 while (i--) 398 phy_exit(rockchip->phys[i]); 399 return err; 400 } 401 402 static irqreturn_t rockchip_pcie_subsys_irq_handler(int irq, void *arg) 403 { 404 struct rockchip_pcie *rockchip = arg; 405 struct device *dev = rockchip->dev; 406 u32 reg; 407 u32 sub_reg; 408 409 reg = rockchip_pcie_read(rockchip, PCIE_CLIENT_INT_STATUS); 410 if (reg & PCIE_CLIENT_INT_LOCAL) { 411 dev_dbg(dev, "local interrupt received\n"); 412 sub_reg = rockchip_pcie_read(rockchip, PCIE_CORE_INT_STATUS); 413 if (sub_reg & PCIE_CORE_INT_PRFPE) 414 dev_dbg(dev, "parity error detected while reading from the PNP receive FIFO RAM\n"); 415 416 if (sub_reg & PCIE_CORE_INT_CRFPE) 417 dev_dbg(dev, "parity error detected while reading from the Completion Receive FIFO RAM\n"); 418 419 if (sub_reg & PCIE_CORE_INT_RRPE) 420 dev_dbg(dev, "parity error detected while reading from replay buffer RAM\n"); 421 422 if (sub_reg & PCIE_CORE_INT_PRFO) 423 dev_dbg(dev, "overflow occurred in the PNP receive FIFO\n"); 424 425 if (sub_reg & PCIE_CORE_INT_CRFO) 426 dev_dbg(dev, "overflow occurred in the completion receive FIFO\n"); 427 428 if (sub_reg & PCIE_CORE_INT_RT) 429 dev_dbg(dev, "replay timer timed out\n"); 430 431 if (sub_reg & PCIE_CORE_INT_RTR) 432 dev_dbg(dev, "replay timer rolled over after 4 transmissions of the same TLP\n"); 433 434 if (sub_reg & PCIE_CORE_INT_PE) 435 dev_dbg(dev, "phy error detected on receive side\n"); 436 437 if (sub_reg & PCIE_CORE_INT_MTR) 438 dev_dbg(dev, "malformed TLP received from the link\n"); 439 440 if (sub_reg & PCIE_CORE_INT_UCR) 441 dev_dbg(dev, "malformed TLP received from the link\n"); 442 443 if (sub_reg & PCIE_CORE_INT_FCE) 444 dev_dbg(dev, "an error was observed in the flow control advertisements from the other side\n"); 445 446 if (sub_reg & PCIE_CORE_INT_CT) 447 dev_dbg(dev, "a request timed out waiting for completion\n"); 448 449 if (sub_reg & PCIE_CORE_INT_UTC) 450 dev_dbg(dev, "unmapped TC error\n"); 451 452 if (sub_reg & PCIE_CORE_INT_MMVC) 453 dev_dbg(dev, "MSI mask register changes\n"); 454 455 rockchip_pcie_write(rockchip, sub_reg, PCIE_CORE_INT_STATUS); 456 } else if (reg & PCIE_CLIENT_INT_PHY) { 457 dev_dbg(dev, "phy link changes\n"); 458 rockchip_pcie_update_txcredit_mui(rockchip); 459 rockchip_pcie_clr_bw_int(rockchip); 460 } 461 462 rockchip_pcie_write(rockchip, reg & PCIE_CLIENT_INT_LOCAL, 463 PCIE_CLIENT_INT_STATUS); 464 465 return IRQ_HANDLED; 466 } 467 468 static irqreturn_t rockchip_pcie_client_irq_handler(int irq, void *arg) 469 { 470 struct rockchip_pcie *rockchip = arg; 471 struct device *dev = rockchip->dev; 472 u32 reg; 473 474 reg = rockchip_pcie_read(rockchip, PCIE_CLIENT_INT_STATUS); 475 if (reg & PCIE_CLIENT_INT_LEGACY_DONE) 476 dev_dbg(dev, "legacy done interrupt received\n"); 477 478 if (reg & PCIE_CLIENT_INT_MSG) 479 dev_dbg(dev, "message done interrupt received\n"); 480 481 if (reg & PCIE_CLIENT_INT_HOT_RST) 482 dev_dbg(dev, "hot reset interrupt received\n"); 483 484 if (reg & PCIE_CLIENT_INT_DPA) 485 dev_dbg(dev, "dpa interrupt received\n"); 486 487 if (reg & PCIE_CLIENT_INT_FATAL_ERR) 488 dev_dbg(dev, "fatal error interrupt received\n"); 489 490 if (reg & PCIE_CLIENT_INT_NFATAL_ERR) 491 dev_dbg(dev, "no fatal error interrupt received\n"); 492 493 if (reg & PCIE_CLIENT_INT_CORR_ERR) 494 dev_dbg(dev, "correctable error interrupt received\n"); 495 496 if (reg & PCIE_CLIENT_INT_PHY) 497 dev_dbg(dev, "phy interrupt received\n"); 498 499 rockchip_pcie_write(rockchip, reg & (PCIE_CLIENT_INT_LEGACY_DONE | 500 PCIE_CLIENT_INT_MSG | PCIE_CLIENT_INT_HOT_RST | 501 PCIE_CLIENT_INT_DPA | PCIE_CLIENT_INT_FATAL_ERR | 502 PCIE_CLIENT_INT_NFATAL_ERR | 503 PCIE_CLIENT_INT_CORR_ERR | 504 PCIE_CLIENT_INT_PHY), 505 PCIE_CLIENT_INT_STATUS); 506 507 return IRQ_HANDLED; 508 } 509 510 static void rockchip_pcie_legacy_int_handler(struct irq_desc *desc) 511 { 512 struct irq_chip *chip = irq_desc_get_chip(desc); 513 struct rockchip_pcie *rockchip = irq_desc_get_handler_data(desc); 514 struct device *dev = rockchip->dev; 515 u32 reg; 516 u32 hwirq; 517 int ret; 518 519 chained_irq_enter(chip, desc); 520 521 reg = rockchip_pcie_read(rockchip, PCIE_CLIENT_INT_STATUS); 522 reg = (reg & PCIE_CLIENT_INTR_MASK) >> PCIE_CLIENT_INTR_SHIFT; 523 524 while (reg) { 525 hwirq = ffs(reg) - 1; 526 reg &= ~BIT(hwirq); 527 528 ret = generic_handle_domain_irq(rockchip->irq_domain, hwirq); 529 if (ret) 530 dev_err(dev, "unexpected IRQ, INT%d\n", hwirq); 531 } 532 533 chained_irq_exit(chip, desc); 534 } 535 536 static int rockchip_pcie_setup_irq(struct rockchip_pcie *rockchip) 537 { 538 int irq, err; 539 struct device *dev = rockchip->dev; 540 struct platform_device *pdev = to_platform_device(dev); 541 542 irq = platform_get_irq_byname(pdev, "sys"); 543 if (irq < 0) 544 return irq; 545 546 err = devm_request_irq(dev, irq, rockchip_pcie_subsys_irq_handler, 547 IRQF_SHARED, "pcie-sys", rockchip); 548 if (err) { 549 dev_err(dev, "failed to request PCIe subsystem IRQ\n"); 550 return err; 551 } 552 553 irq = platform_get_irq_byname(pdev, "legacy"); 554 if (irq < 0) 555 return irq; 556 557 irq_set_chained_handler_and_data(irq, 558 rockchip_pcie_legacy_int_handler, 559 rockchip); 560 561 irq = platform_get_irq_byname(pdev, "client"); 562 if (irq < 0) 563 return irq; 564 565 err = devm_request_irq(dev, irq, rockchip_pcie_client_irq_handler, 566 IRQF_SHARED, "pcie-client", rockchip); 567 if (err) { 568 dev_err(dev, "failed to request PCIe client IRQ\n"); 569 return err; 570 } 571 572 return 0; 573 } 574 575 /** 576 * rockchip_pcie_parse_host_dt - Parse Device Tree 577 * @rockchip: PCIe port information 578 * 579 * Return: '0' on success and error value on failure 580 */ 581 static int rockchip_pcie_parse_host_dt(struct rockchip_pcie *rockchip) 582 { 583 struct device *dev = rockchip->dev; 584 int err; 585 586 err = rockchip_pcie_parse_dt(rockchip); 587 if (err) 588 return err; 589 590 rockchip->vpcie12v = devm_regulator_get_optional(dev, "vpcie12v"); 591 if (IS_ERR(rockchip->vpcie12v)) { 592 if (PTR_ERR(rockchip->vpcie12v) != -ENODEV) 593 return PTR_ERR(rockchip->vpcie12v); 594 dev_info(dev, "no vpcie12v regulator found\n"); 595 } 596 597 rockchip->vpcie3v3 = devm_regulator_get_optional(dev, "vpcie3v3"); 598 if (IS_ERR(rockchip->vpcie3v3)) { 599 if (PTR_ERR(rockchip->vpcie3v3) != -ENODEV) 600 return PTR_ERR(rockchip->vpcie3v3); 601 dev_info(dev, "no vpcie3v3 regulator found\n"); 602 } 603 604 rockchip->vpcie1v8 = devm_regulator_get(dev, "vpcie1v8"); 605 if (IS_ERR(rockchip->vpcie1v8)) 606 return PTR_ERR(rockchip->vpcie1v8); 607 608 rockchip->vpcie0v9 = devm_regulator_get(dev, "vpcie0v9"); 609 if (IS_ERR(rockchip->vpcie0v9)) 610 return PTR_ERR(rockchip->vpcie0v9); 611 612 return 0; 613 } 614 615 static int rockchip_pcie_set_vpcie(struct rockchip_pcie *rockchip) 616 { 617 struct device *dev = rockchip->dev; 618 int err; 619 620 if (!IS_ERR(rockchip->vpcie12v)) { 621 err = regulator_enable(rockchip->vpcie12v); 622 if (err) { 623 dev_err(dev, "fail to enable vpcie12v regulator\n"); 624 goto err_out; 625 } 626 } 627 628 if (!IS_ERR(rockchip->vpcie3v3)) { 629 err = regulator_enable(rockchip->vpcie3v3); 630 if (err) { 631 dev_err(dev, "fail to enable vpcie3v3 regulator\n"); 632 goto err_disable_12v; 633 } 634 } 635 636 err = regulator_enable(rockchip->vpcie1v8); 637 if (err) { 638 dev_err(dev, "fail to enable vpcie1v8 regulator\n"); 639 goto err_disable_3v3; 640 } 641 642 err = regulator_enable(rockchip->vpcie0v9); 643 if (err) { 644 dev_err(dev, "fail to enable vpcie0v9 regulator\n"); 645 goto err_disable_1v8; 646 } 647 648 return 0; 649 650 err_disable_1v8: 651 regulator_disable(rockchip->vpcie1v8); 652 err_disable_3v3: 653 if (!IS_ERR(rockchip->vpcie3v3)) 654 regulator_disable(rockchip->vpcie3v3); 655 err_disable_12v: 656 if (!IS_ERR(rockchip->vpcie12v)) 657 regulator_disable(rockchip->vpcie12v); 658 err_out: 659 return err; 660 } 661 662 static void rockchip_pcie_enable_interrupts(struct rockchip_pcie *rockchip) 663 { 664 rockchip_pcie_write(rockchip, (PCIE_CLIENT_INT_CLI << 16) & 665 (~PCIE_CLIENT_INT_CLI), PCIE_CLIENT_INT_MASK); 666 rockchip_pcie_write(rockchip, (u32)(~PCIE_CORE_INT), 667 PCIE_CORE_INT_MASK); 668 669 rockchip_pcie_enable_bw_int(rockchip); 670 } 671 672 static int rockchip_pcie_intx_map(struct irq_domain *domain, unsigned int irq, 673 irq_hw_number_t hwirq) 674 { 675 irq_set_chip_and_handler(irq, &dummy_irq_chip, handle_simple_irq); 676 irq_set_chip_data(irq, domain->host_data); 677 678 return 0; 679 } 680 681 static const struct irq_domain_ops intx_domain_ops = { 682 .map = rockchip_pcie_intx_map, 683 }; 684 685 static int rockchip_pcie_init_irq_domain(struct rockchip_pcie *rockchip) 686 { 687 struct device *dev = rockchip->dev; 688 struct device_node *intc = of_get_next_child(dev->of_node, NULL); 689 690 if (!intc) { 691 dev_err(dev, "missing child interrupt-controller node\n"); 692 return -EINVAL; 693 } 694 695 rockchip->irq_domain = irq_domain_add_linear(intc, PCI_NUM_INTX, 696 &intx_domain_ops, rockchip); 697 of_node_put(intc); 698 if (!rockchip->irq_domain) { 699 dev_err(dev, "failed to get a INTx IRQ domain\n"); 700 return -EINVAL; 701 } 702 703 return 0; 704 } 705 706 static int rockchip_pcie_prog_ob_atu(struct rockchip_pcie *rockchip, 707 int region_no, int type, u8 num_pass_bits, 708 u32 lower_addr, u32 upper_addr) 709 { 710 u32 ob_addr_0; 711 u32 ob_addr_1; 712 u32 ob_desc_0; 713 u32 aw_offset; 714 715 if (region_no >= MAX_AXI_WRAPPER_REGION_NUM) 716 return -EINVAL; 717 if (num_pass_bits + 1 < 8) 718 return -EINVAL; 719 if (num_pass_bits > 63) 720 return -EINVAL; 721 if (region_no == 0) { 722 if (AXI_REGION_0_SIZE < (2ULL << num_pass_bits)) 723 return -EINVAL; 724 } 725 if (region_no != 0) { 726 if (AXI_REGION_SIZE < (2ULL << num_pass_bits)) 727 return -EINVAL; 728 } 729 730 aw_offset = (region_no << OB_REG_SIZE_SHIFT); 731 732 ob_addr_0 = num_pass_bits & PCIE_CORE_OB_REGION_ADDR0_NUM_BITS; 733 ob_addr_0 |= lower_addr & PCIE_CORE_OB_REGION_ADDR0_LO_ADDR; 734 ob_addr_1 = upper_addr; 735 ob_desc_0 = (1 << 23 | type); 736 737 rockchip_pcie_write(rockchip, ob_addr_0, 738 PCIE_CORE_OB_REGION_ADDR0 + aw_offset); 739 rockchip_pcie_write(rockchip, ob_addr_1, 740 PCIE_CORE_OB_REGION_ADDR1 + aw_offset); 741 rockchip_pcie_write(rockchip, ob_desc_0, 742 PCIE_CORE_OB_REGION_DESC0 + aw_offset); 743 rockchip_pcie_write(rockchip, 0, 744 PCIE_CORE_OB_REGION_DESC1 + aw_offset); 745 746 return 0; 747 } 748 749 static int rockchip_pcie_prog_ib_atu(struct rockchip_pcie *rockchip, 750 int region_no, u8 num_pass_bits, 751 u32 lower_addr, u32 upper_addr) 752 { 753 u32 ib_addr_0; 754 u32 ib_addr_1; 755 u32 aw_offset; 756 757 if (region_no > MAX_AXI_IB_ROOTPORT_REGION_NUM) 758 return -EINVAL; 759 if (num_pass_bits + 1 < MIN_AXI_ADDR_BITS_PASSED) 760 return -EINVAL; 761 if (num_pass_bits > 63) 762 return -EINVAL; 763 764 aw_offset = (region_no << IB_ROOT_PORT_REG_SIZE_SHIFT); 765 766 ib_addr_0 = num_pass_bits & PCIE_CORE_IB_REGION_ADDR0_NUM_BITS; 767 ib_addr_0 |= (lower_addr << 8) & PCIE_CORE_IB_REGION_ADDR0_LO_ADDR; 768 ib_addr_1 = upper_addr; 769 770 rockchip_pcie_write(rockchip, ib_addr_0, PCIE_RP_IB_ADDR0 + aw_offset); 771 rockchip_pcie_write(rockchip, ib_addr_1, PCIE_RP_IB_ADDR1 + aw_offset); 772 773 return 0; 774 } 775 776 static int rockchip_pcie_cfg_atu(struct rockchip_pcie *rockchip) 777 { 778 struct device *dev = rockchip->dev; 779 struct pci_host_bridge *bridge = pci_host_bridge_from_priv(rockchip); 780 struct resource_entry *entry; 781 u64 pci_addr, size; 782 int offset; 783 int err; 784 int reg_no; 785 786 rockchip_pcie_cfg_configuration_accesses(rockchip, 787 AXI_WRAPPER_TYPE0_CFG); 788 entry = resource_list_first_type(&bridge->windows, IORESOURCE_MEM); 789 if (!entry) 790 return -ENODEV; 791 792 size = resource_size(entry->res); 793 pci_addr = entry->res->start - entry->offset; 794 rockchip->msg_bus_addr = pci_addr; 795 796 for (reg_no = 0; reg_no < (size >> 20); reg_no++) { 797 err = rockchip_pcie_prog_ob_atu(rockchip, reg_no + 1, 798 AXI_WRAPPER_MEM_WRITE, 799 20 - 1, 800 pci_addr + (reg_no << 20), 801 0); 802 if (err) { 803 dev_err(dev, "program RC mem outbound ATU failed\n"); 804 return err; 805 } 806 } 807 808 err = rockchip_pcie_prog_ib_atu(rockchip, 2, 32 - 1, 0x0, 0); 809 if (err) { 810 dev_err(dev, "program RC mem inbound ATU failed\n"); 811 return err; 812 } 813 814 entry = resource_list_first_type(&bridge->windows, IORESOURCE_IO); 815 if (!entry) 816 return -ENODEV; 817 818 /* store the register number offset to program RC io outbound ATU */ 819 offset = size >> 20; 820 821 size = resource_size(entry->res); 822 pci_addr = entry->res->start - entry->offset; 823 824 for (reg_no = 0; reg_no < (size >> 20); reg_no++) { 825 err = rockchip_pcie_prog_ob_atu(rockchip, 826 reg_no + 1 + offset, 827 AXI_WRAPPER_IO_WRITE, 828 20 - 1, 829 pci_addr + (reg_no << 20), 830 0); 831 if (err) { 832 dev_err(dev, "program RC io outbound ATU failed\n"); 833 return err; 834 } 835 } 836 837 /* assign message regions */ 838 rockchip_pcie_prog_ob_atu(rockchip, reg_no + 1 + offset, 839 AXI_WRAPPER_NOR_MSG, 840 20 - 1, 0, 0); 841 842 rockchip->msg_bus_addr += ((reg_no + offset) << 20); 843 return err; 844 } 845 846 static int rockchip_pcie_wait_l2(struct rockchip_pcie *rockchip) 847 { 848 u32 value; 849 int err; 850 851 /* send PME_TURN_OFF message */ 852 writel(0x0, rockchip->msg_region + PCIE_RC_SEND_PME_OFF); 853 854 /* read LTSSM and wait for falling into L2 link state */ 855 err = readl_poll_timeout(rockchip->apb_base + PCIE_CLIENT_DEBUG_OUT_0, 856 value, PCIE_LINK_IS_L2(value), 20, 857 jiffies_to_usecs(5 * HZ)); 858 if (err) { 859 dev_err(rockchip->dev, "PCIe link enter L2 timeout!\n"); 860 return err; 861 } 862 863 return 0; 864 } 865 866 static int rockchip_pcie_suspend_noirq(struct device *dev) 867 { 868 struct rockchip_pcie *rockchip = dev_get_drvdata(dev); 869 int ret; 870 871 /* disable core and cli int since we don't need to ack PME_ACK */ 872 rockchip_pcie_write(rockchip, (PCIE_CLIENT_INT_CLI << 16) | 873 PCIE_CLIENT_INT_CLI, PCIE_CLIENT_INT_MASK); 874 rockchip_pcie_write(rockchip, (u32)PCIE_CORE_INT, PCIE_CORE_INT_MASK); 875 876 ret = rockchip_pcie_wait_l2(rockchip); 877 if (ret) { 878 rockchip_pcie_enable_interrupts(rockchip); 879 return ret; 880 } 881 882 rockchip_pcie_deinit_phys(rockchip); 883 884 rockchip_pcie_disable_clocks(rockchip); 885 886 regulator_disable(rockchip->vpcie0v9); 887 888 return ret; 889 } 890 891 static int rockchip_pcie_resume_noirq(struct device *dev) 892 { 893 struct rockchip_pcie *rockchip = dev_get_drvdata(dev); 894 int err; 895 896 err = regulator_enable(rockchip->vpcie0v9); 897 if (err) { 898 dev_err(dev, "fail to enable vpcie0v9 regulator\n"); 899 return err; 900 } 901 902 err = rockchip_pcie_enable_clocks(rockchip); 903 if (err) 904 goto err_disable_0v9; 905 906 err = rockchip_pcie_host_init_port(rockchip); 907 if (err) 908 goto err_pcie_resume; 909 910 err = rockchip_pcie_cfg_atu(rockchip); 911 if (err) 912 goto err_err_deinit_port; 913 914 /* Need this to enter L1 again */ 915 rockchip_pcie_update_txcredit_mui(rockchip); 916 rockchip_pcie_enable_interrupts(rockchip); 917 918 return 0; 919 920 err_err_deinit_port: 921 rockchip_pcie_deinit_phys(rockchip); 922 err_pcie_resume: 923 rockchip_pcie_disable_clocks(rockchip); 924 err_disable_0v9: 925 regulator_disable(rockchip->vpcie0v9); 926 return err; 927 } 928 929 static int rockchip_pcie_probe(struct platform_device *pdev) 930 { 931 struct rockchip_pcie *rockchip; 932 struct device *dev = &pdev->dev; 933 struct pci_host_bridge *bridge; 934 int err; 935 936 if (!dev->of_node) 937 return -ENODEV; 938 939 bridge = devm_pci_alloc_host_bridge(dev, sizeof(*rockchip)); 940 if (!bridge) 941 return -ENOMEM; 942 943 rockchip = pci_host_bridge_priv(bridge); 944 945 platform_set_drvdata(pdev, rockchip); 946 rockchip->dev = dev; 947 rockchip->is_rc = true; 948 949 err = rockchip_pcie_parse_host_dt(rockchip); 950 if (err) 951 return err; 952 953 err = rockchip_pcie_enable_clocks(rockchip); 954 if (err) 955 return err; 956 957 err = rockchip_pcie_set_vpcie(rockchip); 958 if (err) { 959 dev_err(dev, "failed to set vpcie regulator\n"); 960 goto err_set_vpcie; 961 } 962 963 err = rockchip_pcie_host_init_port(rockchip); 964 if (err) 965 goto err_vpcie; 966 967 err = rockchip_pcie_init_irq_domain(rockchip); 968 if (err < 0) 969 goto err_deinit_port; 970 971 err = rockchip_pcie_cfg_atu(rockchip); 972 if (err) 973 goto err_remove_irq_domain; 974 975 rockchip->msg_region = devm_ioremap(dev, rockchip->msg_bus_addr, SZ_1M); 976 if (!rockchip->msg_region) { 977 err = -ENOMEM; 978 goto err_remove_irq_domain; 979 } 980 981 bridge->sysdata = rockchip; 982 bridge->ops = &rockchip_pcie_ops; 983 984 err = rockchip_pcie_setup_irq(rockchip); 985 if (err) 986 goto err_remove_irq_domain; 987 988 rockchip_pcie_enable_interrupts(rockchip); 989 990 err = pci_host_probe(bridge); 991 if (err < 0) 992 goto err_remove_irq_domain; 993 994 return 0; 995 996 err_remove_irq_domain: 997 irq_domain_remove(rockchip->irq_domain); 998 err_deinit_port: 999 rockchip_pcie_deinit_phys(rockchip); 1000 err_vpcie: 1001 if (!IS_ERR(rockchip->vpcie12v)) 1002 regulator_disable(rockchip->vpcie12v); 1003 if (!IS_ERR(rockchip->vpcie3v3)) 1004 regulator_disable(rockchip->vpcie3v3); 1005 regulator_disable(rockchip->vpcie1v8); 1006 regulator_disable(rockchip->vpcie0v9); 1007 err_set_vpcie: 1008 rockchip_pcie_disable_clocks(rockchip); 1009 return err; 1010 } 1011 1012 static void rockchip_pcie_remove(struct platform_device *pdev) 1013 { 1014 struct device *dev = &pdev->dev; 1015 struct rockchip_pcie *rockchip = dev_get_drvdata(dev); 1016 struct pci_host_bridge *bridge = pci_host_bridge_from_priv(rockchip); 1017 1018 pci_stop_root_bus(bridge->bus); 1019 pci_remove_root_bus(bridge->bus); 1020 irq_domain_remove(rockchip->irq_domain); 1021 1022 rockchip_pcie_deinit_phys(rockchip); 1023 1024 rockchip_pcie_disable_clocks(rockchip); 1025 1026 if (!IS_ERR(rockchip->vpcie12v)) 1027 regulator_disable(rockchip->vpcie12v); 1028 if (!IS_ERR(rockchip->vpcie3v3)) 1029 regulator_disable(rockchip->vpcie3v3); 1030 regulator_disable(rockchip->vpcie1v8); 1031 regulator_disable(rockchip->vpcie0v9); 1032 } 1033 1034 static const struct dev_pm_ops rockchip_pcie_pm_ops = { 1035 NOIRQ_SYSTEM_SLEEP_PM_OPS(rockchip_pcie_suspend_noirq, 1036 rockchip_pcie_resume_noirq) 1037 }; 1038 1039 static const struct of_device_id rockchip_pcie_of_match[] = { 1040 { .compatible = "rockchip,rk3399-pcie", }, 1041 {} 1042 }; 1043 MODULE_DEVICE_TABLE(of, rockchip_pcie_of_match); 1044 1045 static struct platform_driver rockchip_pcie_driver = { 1046 .driver = { 1047 .name = "rockchip-pcie", 1048 .of_match_table = rockchip_pcie_of_match, 1049 .pm = &rockchip_pcie_pm_ops, 1050 }, 1051 .probe = rockchip_pcie_probe, 1052 .remove_new = rockchip_pcie_remove, 1053 }; 1054 module_platform_driver(rockchip_pcie_driver); 1055 1056 MODULE_AUTHOR("Rockchip Inc"); 1057 MODULE_DESCRIPTION("Rockchip AXI PCIe driver"); 1058 MODULE_LICENSE("GPL v2"); 1059