1 // SPDX-License-Identifier: GPL-2.0+ 2 /* 3 * Rockchip DesignWare based PCIe host controller driver 4 * 5 * Copyright (c) 2021 Rockchip, Inc. 6 */ 7 8 #include <common.h> 9 #include <clk.h> 10 #include <dm.h> 11 #include <generic-phy.h> 12 #include <pci.h> 13 #include <power-domain.h> 14 #include <power/regulator.h> 15 #include <reset.h> 16 #include <syscon.h> 17 #include <asm/io.h> 18 #include <asm-generic/gpio.h> 19 #include <asm/arch-rockchip/clock.h> 20 #include <linux/iopoll.h> 21 22 DECLARE_GLOBAL_DATA_PTR; 23 24 struct rk_pcie { 25 struct udevice *dev; 26 struct udevice *vpcie3v3; 27 void *dbi_base; 28 void *apb_base; 29 void *cfg_base; 30 fdt_size_t cfg_size; 31 struct phy phy; 32 struct clk_bulk clks; 33 int first_busno; 34 struct reset_ctl_bulk rsts; 35 struct gpio_desc rst_gpio; 36 struct pci_region io; 37 struct pci_region mem; 38 bool is_bifurcation; 39 }; 40 41 enum { 42 PCIBIOS_SUCCESSFUL = 0x0000, 43 PCIBIOS_UNSUPPORTED = -ENODEV, 44 PCIBIOS_NODEV = -ENODEV, 45 }; 46 47 #define msleep(a) udelay((a) * 1000) 48 49 /* Parameters for the waiting for iATU enabled routine */ 50 #define PCIE_CLIENT_GENERAL_DEBUG 0x104 51 #define PCIE_CLIENT_HOT_RESET_CTRL 0x180 52 #define PCIE_LTSSM_ENABLE_ENHANCE BIT(4) 53 #define PCIE_CLIENT_LTSSM_STATUS 0x300 54 #define SMLH_LINKUP BIT(16) 55 #define RDLH_LINKUP BIT(17) 56 #define PCIE_CLIENT_DBG_FIFO_MODE_CON 0x310 57 #define PCIE_CLIENT_DBG_FIFO_PTN_HIT_D0 0x320 58 #define PCIE_CLIENT_DBG_FIFO_PTN_HIT_D1 0x324 59 #define PCIE_CLIENT_DBG_FIFO_TRN_HIT_D0 0x328 60 #define PCIE_CLIENT_DBG_FIFO_TRN_HIT_D1 0x32c 61 #define PCIE_CLIENT_DBG_FIFO_STATUS 0x350 62 #define PCIE_CLIENT_DBG_TRANSITION_DATA 0xffff0000 63 #define PCIE_CLIENT_DBF_EN 0xffff0003 64 #define RK_PCIE_DBG 0 65 66 /* PCI DBICS registers */ 67 #define PCIE_LINK_STATUS_REG 0x80 68 #define PCIE_LINK_STATUS_SPEED_OFF 16 69 #define PCIE_LINK_STATUS_SPEED_MASK (0xf << PCIE_LINK_STATUS_SPEED_OFF) 70 #define PCIE_LINK_STATUS_WIDTH_OFF 20 71 #define PCIE_LINK_STATUS_WIDTH_MASK (0xf << PCIE_LINK_STATUS_WIDTH_OFF) 72 73 #define PCIE_LINK_CAPABILITY 0x7c 74 #define PCIE_LINK_CTL_2 0xa0 75 #define TARGET_LINK_SPEED_MASK 0xf 76 #define LINK_SPEED_GEN_1 0x1 77 #define LINK_SPEED_GEN_2 0x2 78 #define LINK_SPEED_GEN_3 0x3 79 80 #define PCIE_MISC_CONTROL_1_OFF 0x8bc 81 #define PCIE_DBI_RO_WR_EN BIT(0) 82 83 #define PCIE_LINK_WIDTH_SPEED_CONTROL 0x80c 84 #define PORT_LOGIC_SPEED_CHANGE BIT(17) 85 86 /* 87 * iATU Unroll-specific register definitions 88 * From 4.80 core version the address translation will be made by unroll. 89 * The registers are offset from atu_base 90 */ 91 #define PCIE_ATU_UNR_REGION_CTRL1 0x00 92 #define PCIE_ATU_UNR_REGION_CTRL2 0x04 93 #define PCIE_ATU_UNR_LOWER_BASE 0x08 94 #define PCIE_ATU_UNR_UPPER_BASE 0x0c 95 #define PCIE_ATU_UNR_LIMIT 0x10 96 #define PCIE_ATU_UNR_LOWER_TARGET 0x14 97 #define PCIE_ATU_UNR_UPPER_TARGET 0x18 98 99 #define PCIE_ATU_REGION_INDEX1 (0x1 << 0) 100 #define PCIE_ATU_REGION_INDEX0 (0x0 << 0) 101 #define PCIE_ATU_TYPE_MEM (0x0 << 0) 102 #define PCIE_ATU_TYPE_IO (0x2 << 0) 103 #define PCIE_ATU_TYPE_CFG0 (0x4 << 0) 104 #define PCIE_ATU_TYPE_CFG1 (0x5 << 0) 105 #define PCIE_ATU_ENABLE (0x1 << 31) 106 #define PCIE_ATU_BAR_MODE_ENABLE (0x1 << 30) 107 #define PCIE_ATU_BUS(x) (((x) & 0xff) << 24) 108 #define PCIE_ATU_DEV(x) (((x) & 0x1f) << 19) 109 #define PCIE_ATU_FUNC(x) (((x) & 0x7) << 16) 110 111 /* Register address builder */ 112 #define PCIE_GET_ATU_OUTB_UNR_REG_OFFSET(region) \ 113 ((0x3 << 20) | ((region) << 9)) 114 #define PCIE_GET_ATU_INB_UNR_REG_OFFSET(region) \ 115 ((0x3 << 20) | ((region) << 9) | (0x1 << 8)) 116 117 /* Parameters for the waiting for iATU enabled routine */ 118 #define LINK_WAIT_MAX_IATU_RETRIES 5 119 #define LINK_WAIT_IATU 10000 120 121 static int rk_pcie_read(void __iomem *addr, int size, u32 *val) 122 { 123 if ((uintptr_t)addr & (size - 1)) { 124 *val = 0; 125 return PCIBIOS_UNSUPPORTED; 126 } 127 128 if (size == 4) { 129 *val = readl(addr); 130 } else if (size == 2) { 131 *val = readw(addr); 132 } else if (size == 1) { 133 *val = readb(addr); 134 } else { 135 *val = 0; 136 return PCIBIOS_NODEV; 137 } 138 139 return PCIBIOS_SUCCESSFUL; 140 } 141 142 static int rk_pcie_write(void __iomem *addr, int size, u32 val) 143 { 144 if ((uintptr_t)addr & (size - 1)) 145 return PCIBIOS_UNSUPPORTED; 146 147 if (size == 4) 148 writel(val, addr); 149 else if (size == 2) 150 writew(val, addr); 151 else if (size == 1) 152 writeb(val, addr); 153 else 154 return PCIBIOS_NODEV; 155 156 return PCIBIOS_SUCCESSFUL; 157 } 158 159 static u32 __rk_pcie_read_apb(struct rk_pcie *rk_pcie, void __iomem *base, 160 u32 reg, size_t size) 161 { 162 int ret; 163 u32 val; 164 165 ret = rk_pcie_read(base + reg, size, &val); 166 if (ret) 167 dev_err(rk_pcie->pci->dev, "Read APB address failed\n"); 168 169 return val; 170 } 171 172 static void __rk_pcie_write_apb(struct rk_pcie *rk_pcie, void __iomem *base, 173 u32 reg, size_t size, u32 val) 174 { 175 int ret; 176 177 ret = rk_pcie_write(base + reg, size, val); 178 if (ret) 179 dev_err(rk_pcie->pci->dev, "Write APB address failed\n"); 180 } 181 182 static inline u32 rk_pcie_readl_apb(struct rk_pcie *rk_pcie, u32 reg) 183 { 184 return __rk_pcie_read_apb(rk_pcie, rk_pcie->apb_base, reg, 0x4); 185 } 186 187 static inline void rk_pcie_writel_apb(struct rk_pcie *rk_pcie, u32 reg, 188 u32 val) 189 { 190 __rk_pcie_write_apb(rk_pcie, rk_pcie->apb_base, reg, 0x4, val); 191 } 192 193 static int rk_pcie_get_link_speed(struct rk_pcie *rk_pcie) 194 { 195 return (readl(rk_pcie->dbi_base + PCIE_LINK_STATUS_REG) & 196 PCIE_LINK_STATUS_SPEED_MASK) >> PCIE_LINK_STATUS_SPEED_OFF; 197 } 198 199 static int rk_pcie_get_link_width(struct rk_pcie *rk_pcie) 200 { 201 return (readl(rk_pcie->dbi_base + PCIE_LINK_STATUS_REG) & 202 PCIE_LINK_STATUS_WIDTH_MASK) >> PCIE_LINK_STATUS_WIDTH_OFF; 203 } 204 205 static void rk_pcie_writel_ob_unroll(struct rk_pcie *rk_pcie, u32 index, 206 u32 reg, u32 val) 207 { 208 u32 offset = PCIE_GET_ATU_OUTB_UNR_REG_OFFSET(index); 209 void __iomem *base = rk_pcie->dbi_base; 210 211 writel(val, base + offset + reg); 212 } 213 214 static u32 rk_pcie_readl_ob_unroll(struct rk_pcie *rk_pcie, u32 index, u32 reg) 215 { 216 u32 offset = PCIE_GET_ATU_OUTB_UNR_REG_OFFSET(index); 217 void __iomem *base = rk_pcie->dbi_base; 218 219 return readl(base + offset + reg); 220 } 221 222 static inline void rk_pcie_dbi_write_enable(struct rk_pcie *rk_pcie, bool en) 223 { 224 u32 val; 225 226 val = readl(rk_pcie->dbi_base + PCIE_MISC_CONTROL_1_OFF); 227 228 if (en) 229 val |= PCIE_DBI_RO_WR_EN; 230 else 231 val &= ~PCIE_DBI_RO_WR_EN; 232 writel(val, rk_pcie->dbi_base + PCIE_MISC_CONTROL_1_OFF); 233 } 234 235 static void rk_pcie_setup_host(struct rk_pcie *rk_pcie) 236 { 237 u32 val; 238 239 rk_pcie_dbi_write_enable(rk_pcie, true); 240 241 /* setup RC BARs */ 242 writel(PCI_BASE_ADDRESS_MEM_TYPE_64, 243 rk_pcie->dbi_base + PCI_BASE_ADDRESS_0); 244 writel(0x0, rk_pcie->dbi_base + PCI_BASE_ADDRESS_1); 245 246 /* setup interrupt pins */ 247 val = readl(rk_pcie->dbi_base + PCI_INTERRUPT_LINE); 248 val &= 0xffff00ff; 249 val |= 0x00000100; 250 writel(val, rk_pcie->dbi_base + PCI_INTERRUPT_LINE); 251 252 /* setup bus numbers */ 253 val = readl(rk_pcie->dbi_base + PCI_PRIMARY_BUS); 254 val &= 0xff000000; 255 val |= 0x00ff0100; 256 writel(val, rk_pcie->dbi_base + PCI_PRIMARY_BUS); 257 258 val = readl(rk_pcie->dbi_base + PCI_PRIMARY_BUS); 259 260 /* setup command register */ 261 val = readl(rk_pcie->dbi_base + PCI_COMMAND); 262 val &= 0xffff0000; 263 val |= PCI_COMMAND_IO | PCI_COMMAND_MEMORY | 264 PCI_COMMAND_MASTER | PCI_COMMAND_SERR; 265 writel(val, rk_pcie->dbi_base + PCI_COMMAND); 266 267 /* program correct class for RC */ 268 writew(PCI_CLASS_BRIDGE_PCI, rk_pcie->dbi_base + PCI_CLASS_DEVICE); 269 /* Better disable write permission right after the update */ 270 271 val = readl(rk_pcie->dbi_base + PCIE_LINK_WIDTH_SPEED_CONTROL); 272 val |= PORT_LOGIC_SPEED_CHANGE; 273 writel(val, rk_pcie->dbi_base + PCIE_LINK_WIDTH_SPEED_CONTROL); 274 275 rk_pcie_dbi_write_enable(rk_pcie, false); 276 } 277 278 static void rk_pcie_configure(struct rk_pcie *pci, u32 cap_speed) 279 { 280 u32 val; 281 282 rk_pcie_dbi_write_enable(pci, true); 283 284 val = readl(pci->dbi_base + PCIE_LINK_CAPABILITY); 285 val &= ~TARGET_LINK_SPEED_MASK; 286 val |= cap_speed; 287 writel(val, pci->dbi_base + PCIE_LINK_CAPABILITY); 288 289 val = readl(pci->dbi_base + PCIE_LINK_CTL_2); 290 val &= ~TARGET_LINK_SPEED_MASK; 291 val |= cap_speed; 292 writel(val, pci->dbi_base + PCIE_LINK_CTL_2); 293 294 rk_pcie_dbi_write_enable(pci, false); 295 } 296 297 static void rk_pcie_prog_outbound_atu_unroll(struct rk_pcie *pci, int index, 298 int type, u64 cpu_addr, 299 u64 pci_addr, u32 size) 300 { 301 u32 retries, val; 302 303 dev_dbg(pci->dev, "ATU programmed with: index: %d, type: %d, cpu addr: %8llx, pci addr: %8llx, size: %8x\n", 304 index, type, cpu_addr, pci_addr, size); 305 306 rk_pcie_writel_ob_unroll(pci, index, PCIE_ATU_UNR_LOWER_BASE, 307 lower_32_bits(cpu_addr)); 308 rk_pcie_writel_ob_unroll(pci, index, PCIE_ATU_UNR_UPPER_BASE, 309 upper_32_bits(cpu_addr)); 310 rk_pcie_writel_ob_unroll(pci, index, PCIE_ATU_UNR_LIMIT, 311 lower_32_bits(cpu_addr + size - 1)); 312 rk_pcie_writel_ob_unroll(pci, index, PCIE_ATU_UNR_LOWER_TARGET, 313 lower_32_bits(pci_addr)); 314 rk_pcie_writel_ob_unroll(pci, index, PCIE_ATU_UNR_UPPER_TARGET, 315 upper_32_bits(pci_addr)); 316 rk_pcie_writel_ob_unroll(pci, index, PCIE_ATU_UNR_REGION_CTRL1, 317 type); 318 rk_pcie_writel_ob_unroll(pci, index, PCIE_ATU_UNR_REGION_CTRL2, 319 PCIE_ATU_ENABLE); 320 321 /* 322 * Make sure ATU enable takes effect before any subsequent config 323 * and I/O accesses. 324 */ 325 for (retries = 0; retries < LINK_WAIT_MAX_IATU_RETRIES; retries++) { 326 val = rk_pcie_readl_ob_unroll(pci, index, 327 PCIE_ATU_UNR_REGION_CTRL2); 328 if (val & PCIE_ATU_ENABLE) 329 return; 330 331 udelay(LINK_WAIT_IATU); 332 } 333 dev_err(pci->dev, "outbound iATU is not being enabled\n"); 334 } 335 336 static int rk_pcie_addr_valid(pci_dev_t d, int first_busno) 337 { 338 if ((PCI_BUS(d) == first_busno) && (PCI_DEV(d) > 0)) 339 return 0; 340 if ((PCI_BUS(d) == first_busno + 1) && (PCI_DEV(d) > 0)) 341 return 0; 342 343 return 1; 344 } 345 346 static uintptr_t set_cfg_address(struct rk_pcie *pcie, 347 pci_dev_t d, uint where) 348 { 349 int bus = PCI_BUS(d) - pcie->first_busno; 350 uintptr_t va_address; 351 u32 atu_type; 352 353 /* Use dbi_base for own configuration read and write */ 354 if (!bus) { 355 va_address = (uintptr_t)pcie->dbi_base; 356 goto out; 357 } 358 359 if (bus == 1) 360 /* 361 * For local bus whose primary bus number is root bridge, 362 * change TLP Type field to 4. 363 */ 364 atu_type = PCIE_ATU_TYPE_CFG0; 365 else 366 /* Otherwise, change TLP Type field to 5. */ 367 atu_type = PCIE_ATU_TYPE_CFG1; 368 369 /* 370 * Not accessing root port configuration space? 371 * Region #0 is used for Outbound CFG space access. 372 * Direction = Outbound 373 * Region Index = 0 374 */ 375 d = PCI_MASK_BUS(d); 376 d = PCI_ADD_BUS(bus, d); 377 rk_pcie_prog_outbound_atu_unroll(pcie, PCIE_ATU_REGION_INDEX1, 378 atu_type, (u64)pcie->cfg_base, 379 d << 8, pcie->cfg_size); 380 381 va_address = (uintptr_t)pcie->cfg_base; 382 383 out: 384 va_address += where & ~0x3; 385 386 return va_address; 387 } 388 389 static int rockchip_pcie_rd_conf(struct udevice *bus, pci_dev_t bdf, 390 uint offset, ulong *valuep, 391 enum pci_size_t size) 392 { 393 struct rk_pcie *pcie = dev_get_priv(bus); 394 uintptr_t va_address; 395 ulong value; 396 397 debug("PCIE CFG read: bdf=%2x:%2x:%2x\n", 398 PCI_BUS(bdf), PCI_DEV(bdf), PCI_FUNC(bdf)); 399 400 if (!rk_pcie_addr_valid(bdf, pcie->first_busno)) { 401 debug("- out of range\n"); 402 *valuep = pci_get_ff(size); 403 return 0; 404 } 405 406 va_address = set_cfg_address(pcie, bdf, offset); 407 408 value = readl(va_address); 409 410 debug("(addr,val)=(0x%04x, 0x%08lx)\n", offset, value); 411 *valuep = pci_conv_32_to_size(value, offset, size); 412 413 rk_pcie_prog_outbound_atu_unroll(pcie, PCIE_ATU_REGION_INDEX1, 414 PCIE_ATU_TYPE_IO, pcie->io.phys_start, 415 pcie->io.bus_start, pcie->io.size); 416 417 return 0; 418 } 419 420 static int rockchip_pcie_wr_conf(struct udevice *bus, pci_dev_t bdf, 421 uint offset, ulong value, 422 enum pci_size_t size) 423 { 424 struct rk_pcie *pcie = dev_get_priv(bus); 425 uintptr_t va_address; 426 ulong old; 427 428 debug("PCIE CFG write: (b,d,f)=(%2d,%2d,%2d)\n", 429 PCI_BUS(bdf), PCI_DEV(bdf), PCI_FUNC(bdf)); 430 debug("(addr,val)=(0x%04x, 0x%08lx)\n", offset, value); 431 432 if (!rk_pcie_addr_valid(bdf, pcie->first_busno)) { 433 debug("- out of range\n"); 434 return 0; 435 } 436 437 va_address = set_cfg_address(pcie, bdf, offset); 438 439 old = readl(va_address); 440 value = pci_conv_size_to_32(old, value, offset, size); 441 writel(value, va_address); 442 443 rk_pcie_prog_outbound_atu_unroll(pcie, PCIE_ATU_REGION_INDEX1, 444 PCIE_ATU_TYPE_IO, pcie->io.phys_start, 445 pcie->io.bus_start, pcie->io.size); 446 447 return 0; 448 } 449 450 static void rk_pcie_enable_debug(struct rk_pcie *rk_pcie) 451 { 452 #if RK_PCIE_DBG 453 rk_pcie_writel_apb(rk_pcie, PCIE_CLIENT_DBG_FIFO_PTN_HIT_D0, 454 PCIE_CLIENT_DBG_TRANSITION_DATA); 455 rk_pcie_writel_apb(rk_pcie, PCIE_CLIENT_DBG_FIFO_PTN_HIT_D1, 456 PCIE_CLIENT_DBG_TRANSITION_DATA); 457 rk_pcie_writel_apb(rk_pcie, PCIE_CLIENT_DBG_FIFO_TRN_HIT_D0, 458 PCIE_CLIENT_DBG_TRANSITION_DATA); 459 rk_pcie_writel_apb(rk_pcie, PCIE_CLIENT_DBG_FIFO_TRN_HIT_D1, 460 PCIE_CLIENT_DBG_TRANSITION_DATA); 461 rk_pcie_writel_apb(rk_pcie, PCIE_CLIENT_DBG_FIFO_MODE_CON, 462 PCIE_CLIENT_DBF_EN); 463 #endif 464 } 465 466 static void rk_pcie_debug_dump(struct rk_pcie *rk_pcie) 467 { 468 #if RK_PCIE_DBG 469 u32 loop; 470 471 dev_info(rk_pcie->dev, "ltssm = 0x%x\n", 472 rk_pcie_readl_apb(rk_pcie, PCIE_CLIENT_LTSSM_STATUS)); 473 for (loop = 0; loop < 64; loop++) 474 dev_info(rk_pcie->dev, "fifo_status = 0x%x\n", 475 rk_pcie_readl_apb(rk_pcie, PCIE_CLIENT_DBG_FIFO_STATUS)); 476 #endif 477 } 478 479 static inline void rk_pcie_link_status_clear(struct rk_pcie *rk_pcie) 480 { 481 rk_pcie_writel_apb(rk_pcie, PCIE_CLIENT_GENERAL_DEBUG, 0x0); 482 } 483 484 static inline void rk_pcie_disable_ltssm(struct rk_pcie *rk_pcie) 485 { 486 rk_pcie_writel_apb(rk_pcie, 0x0, 0xc0008); 487 } 488 489 static inline void rk_pcie_enable_ltssm(struct rk_pcie *rk_pcie) 490 { 491 rk_pcie_writel_apb(rk_pcie, 0x0, 0xc000c); 492 } 493 494 static int is_link_up(struct rk_pcie *priv) 495 { 496 u32 val; 497 498 val = rk_pcie_readl_apb(priv, PCIE_CLIENT_LTSSM_STATUS); 499 if ((val & (RDLH_LINKUP | SMLH_LINKUP)) == 0x30000 && 500 (val & GENMASK(5, 0)) == 0x11) 501 return 1; 502 503 return 0; 504 } 505 506 static int rk_pcie_link_up(struct rk_pcie *priv, u32 cap_speed) 507 { 508 int retries; 509 510 if (is_link_up(priv)) { 511 printf("PCI Link already up before configuration!\n"); 512 return 1; 513 } 514 515 /* DW pre link configurations */ 516 rk_pcie_configure(priv, cap_speed); 517 518 /* Rest the device */ 519 if (dm_gpio_is_valid(&priv->rst_gpio)) { 520 dm_gpio_set_value(&priv->rst_gpio, 0); 521 msleep(1000); 522 dm_gpio_set_value(&priv->rst_gpio, 1); 523 } 524 525 rk_pcie_disable_ltssm(priv); 526 rk_pcie_link_status_clear(priv); 527 rk_pcie_enable_debug(priv); 528 529 /* Enable LTSSM */ 530 rk_pcie_enable_ltssm(priv); 531 532 for (retries = 0; retries < 50; retries++) { 533 if (is_link_up(priv)) { 534 dev_info(priv->dev, "PCIe Link up, LTSSM is 0x%x\n", 535 rk_pcie_readl_apb(priv, PCIE_CLIENT_LTSSM_STATUS)); 536 rk_pcie_debug_dump(priv); 537 return 0; 538 } 539 540 dev_info(priv->dev, "PCIe Linking... LTSSM is 0x%x\n", 541 rk_pcie_readl_apb(priv, PCIE_CLIENT_LTSSM_STATUS)); 542 rk_pcie_debug_dump(priv); 543 msleep(100); 544 } 545 546 dev_err(priv->dev, "PCIe-%d Link Fail\n", priv->dev->seq); 547 /* Link maybe in Gen switch recovery but we need to wait more 1s */ 548 msleep(1000); 549 return -EINVAL; 550 } 551 552 static int rockchip_pcie_init_port(struct udevice *dev) 553 { 554 int ret; 555 u32 val; 556 struct rk_pcie *priv = dev_get_priv(dev); 557 union phy_configure_opts phy_cfg; 558 559 /* Set power and maybe external ref clk input */ 560 if (priv->vpcie3v3) { 561 ret = regulator_set_value(priv->vpcie3v3, 3300000); 562 if (ret) { 563 dev_err(priv->dev, "failed to enable vpcie3v3 (ret=%d)\n", 564 ret); 565 return ret; 566 } 567 } 568 569 msleep(1000); 570 571 if (priv->is_bifurcation) { 572 phy_cfg.pcie.is_bifurcation = true; 573 ret = generic_phy_configure(&priv->phy, &phy_cfg); 574 if (ret) 575 dev_err(dev, "failed to set bifurcation for phy (ret=%d)\n", ret); 576 } 577 578 ret = generic_phy_init(&priv->phy); 579 if (ret) { 580 dev_err(dev, "failed to init phy (ret=%d)\n", ret); 581 return ret; 582 } 583 584 ret = generic_phy_power_on(&priv->phy); 585 if (ret) { 586 dev_err(dev, "failed to power on phy (ret=%d)\n", ret); 587 goto err_exit_phy; 588 } 589 590 ret = reset_deassert_bulk(&priv->rsts); 591 if (ret) { 592 dev_err(dev, "failed to deassert resets (ret=%d)\n", ret); 593 goto err_power_off_phy; 594 } 595 596 ret = clk_enable_bulk(&priv->clks); 597 if (ret) { 598 dev_err(dev, "failed to enable clks (ret=%d)\n", ret); 599 goto err_deassert_bulk; 600 } 601 602 /* LTSSM EN ctrl mode */ 603 val = rk_pcie_readl_apb(priv, PCIE_CLIENT_HOT_RESET_CTRL); 604 val |= PCIE_LTSSM_ENABLE_ENHANCE | (PCIE_LTSSM_ENABLE_ENHANCE << 16); 605 rk_pcie_writel_apb(priv, PCIE_CLIENT_HOT_RESET_CTRL, val); 606 607 /* Set RC mode */ 608 rk_pcie_writel_apb(priv, 0x0, 0xf00040); 609 rk_pcie_setup_host(priv); 610 611 ret = rk_pcie_link_up(priv, LINK_SPEED_GEN_3); 612 if (ret < 0) 613 goto err_link_up; 614 615 return 0; 616 err_link_up: 617 clk_disable_bulk(&priv->clks); 618 err_deassert_bulk: 619 reset_assert_bulk(&priv->rsts); 620 err_power_off_phy: 621 generic_phy_power_off(&priv->phy); 622 err_exit_phy: 623 generic_phy_exit(&priv->phy); 624 return ret; 625 } 626 627 static int rockchip_pcie_parse_dt(struct udevice *dev) 628 { 629 struct rk_pcie *priv = dev_get_priv(dev); 630 int ret; 631 632 priv->dbi_base = (void *)dev_read_addr_index(dev, 0); 633 if (!priv->dbi_base) 634 return -ENODEV; 635 636 dev_dbg(dev, "DBI address is 0x%p\n", priv->dbi_base); 637 638 priv->apb_base = (void *)dev_read_addr_index(dev, 1); 639 if (!priv->apb_base) 640 return -ENODEV; 641 642 dev_dbg(dev, "APB address is 0x%p\n", priv->apb_base); 643 644 ret = gpio_request_by_name(dev, "reset-gpios", 0, 645 &priv->rst_gpio, GPIOD_IS_OUT); 646 if (ret) { 647 dev_err(dev, "failed to find reset-gpios property\n"); 648 return ret; 649 } 650 651 ret = reset_get_bulk(dev, &priv->rsts); 652 if (ret) { 653 dev_err(dev, "Can't get reset: %d\n", ret); 654 return ret; 655 } 656 657 ret = clk_get_bulk(dev, &priv->clks); 658 if (ret) { 659 dev_err(dev, "Can't get clock: %d\n", ret); 660 return ret; 661 } 662 663 ret = device_get_supply_regulator(dev, "vpcie3v3-supply", 664 &priv->vpcie3v3); 665 if (ret && ret != -ENOENT) { 666 dev_err(dev, "failed to get vpcie3v3 supply (ret=%d)\n", ret); 667 return ret; 668 } 669 670 ret = generic_phy_get_by_index(dev, 0, &priv->phy); 671 if (ret) { 672 dev_err(dev, "failed to get pcie phy (ret=%d)\n", ret); 673 return ret; 674 } 675 676 if (dev_read_bool(dev, "rockchip,bifurcation")) 677 priv->is_bifurcation = true; 678 679 return 0; 680 } 681 682 static int rockchip_pcie_probe(struct udevice *dev) 683 { 684 struct rk_pcie *priv = dev_get_priv(dev); 685 struct udevice *ctlr = pci_get_controller(dev); 686 struct pci_controller *hose = dev_get_uclass_priv(ctlr); 687 int ret; 688 689 priv->first_busno = dev->seq; 690 priv->dev = dev; 691 692 ret = rockchip_pcie_parse_dt(dev); 693 if (ret) 694 return ret; 695 696 ret = rockchip_pcie_init_port(dev); 697 if (ret) 698 return ret; 699 700 dev_info(dev, "PCIE-%d: Link up (Gen%d-x%d, Bus%d)\n", 701 dev->seq, rk_pcie_get_link_speed(priv), 702 rk_pcie_get_link_width(priv), 703 hose->first_busno); 704 705 for (ret = 0; ret < hose->region_count; ret++) { 706 if (hose->regions[ret].flags == PCI_REGION_IO) { 707 priv->io.phys_start = hose->regions[ret].phys_start; /* IO base */ 708 priv->io.bus_start = hose->regions[ret].bus_start; /* IO_bus_addr */ 709 priv->io.size = hose->regions[ret].size; /* IO size */ 710 } else if (hose->regions[ret].flags == PCI_REGION_MEM) { 711 priv->mem.phys_start = hose->regions[ret].phys_start; /* MEM base */ 712 priv->mem.bus_start = hose->regions[ret].bus_start; /* MEM_bus_addr */ 713 priv->mem.size = hose->regions[ret].size; /* MEM size */ 714 } else if (hose->regions[ret].flags == PCI_REGION_SYS_MEMORY) { 715 priv->cfg_base = (void *)(priv->io.phys_start - priv->io.size); 716 priv->cfg_size = priv->io.size; 717 } else { 718 dev_err(dev, "invalid flags type!\n"); 719 } 720 } 721 722 dev_dbg(dev, "Config space: [0x%p - 0x%p, size 0x%llx]\n", 723 priv->cfg_base, priv->cfg_base + priv->cfg_size, 724 priv->cfg_size); 725 726 dev_dbg(dev, "IO space: [0x%llx - 0x%llx, size 0x%x]\n", 727 priv->io.phys_start, priv->io.phys_start + priv->io.size, 728 priv->io.size); 729 730 dev_dbg(dev, "IO bus: [0x%x - 0x%x, size 0x%x]\n", 731 priv->io.bus_start, priv->io.bus_start + priv->io.size, 732 priv->io.size); 733 734 dev_dbg(dev, "MEM space: [0x%llx - 0x%llx, size 0x%x]\n", 735 priv->mem.phys_start, priv->mem.phys_start + priv->mem.size, 736 priv->mem.size); 737 738 dev_dbg(dev, "MEM bus: [0x%x - 0x%x, size 0x%x]\n", 739 priv->mem.bus_start, priv->mem.bus_start + priv->mem.size, 740 priv->mem.size); 741 742 rk_pcie_prog_outbound_atu_unroll(priv, PCIE_ATU_REGION_INDEX0, 743 PCIE_ATU_TYPE_MEM, 744 priv->mem.phys_start, 745 priv->mem.bus_start, priv->mem.size); 746 return 0; 747 } 748 749 static const struct dm_pci_ops rockchip_pcie_ops = { 750 .read_config = rockchip_pcie_rd_conf, 751 .write_config = rockchip_pcie_wr_conf, 752 }; 753 754 static const struct udevice_id rockchip_pcie_ids[] = { 755 { .compatible = "rockchip,rk3568-pcie" }, 756 { } 757 }; 758 759 U_BOOT_DRIVER(rockchip_pcie) = { 760 .name = "pcie_dw_rockchip", 761 .id = UCLASS_PCI, 762 .of_match = rockchip_pcie_ids, 763 .ops = &rockchip_pcie_ops, 764 .probe = rockchip_pcie_probe, 765 .priv_auto_alloc_size = sizeof(struct rk_pcie), 766 }; 767