Lines Matching full:rockchip
3 * Rockchip AXI PCIe host controller driver
5 * Copyright (c) 2016 Rockchip, Inc.
37 #include "pcie-rockchip.h"
39 static void rockchip_pcie_enable_bw_int(struct rockchip_pcie *rockchip) in rockchip_pcie_enable_bw_int() argument
43 status = rockchip_pcie_read(rockchip, PCIE_RC_CONFIG_LCS); in rockchip_pcie_enable_bw_int()
45 rockchip_pcie_write(rockchip, status, PCIE_RC_CONFIG_LCS); in rockchip_pcie_enable_bw_int()
48 static void rockchip_pcie_clr_bw_int(struct rockchip_pcie *rockchip) in rockchip_pcie_clr_bw_int() argument
52 status = rockchip_pcie_read(rockchip, PCIE_RC_CONFIG_LCS); in rockchip_pcie_clr_bw_int()
54 rockchip_pcie_write(rockchip, status, PCIE_RC_CONFIG_LCS); in rockchip_pcie_clr_bw_int()
57 static void rockchip_pcie_update_txcredit_mui(struct rockchip_pcie *rockchip) in rockchip_pcie_update_txcredit_mui() argument
62 val = rockchip_pcie_read(rockchip, PCIE_CORE_TXCREDIT_CFG1); in rockchip_pcie_update_txcredit_mui()
65 rockchip_pcie_write(rockchip, val, PCIE_CORE_TXCREDIT_CFG1); in rockchip_pcie_update_txcredit_mui()
68 static int rockchip_pcie_valid_device(struct rockchip_pcie *rockchip, in rockchip_pcie_valid_device() argument
82 static u8 rockchip_pcie_lane_map(struct rockchip_pcie *rockchip) in rockchip_pcie_lane_map() argument
87 if (rockchip->legacy_phy) in rockchip_pcie_lane_map()
90 val = rockchip_pcie_read(rockchip, PCIE_CORE_LANE_MAP); in rockchip_pcie_lane_map()
100 static int rockchip_pcie_rd_own_conf(struct rockchip_pcie *rockchip, in rockchip_pcie_rd_own_conf() argument
105 addr = rockchip->apb_base + PCIE_RC_CONFIG_NORMAL_BASE + where; in rockchip_pcie_rd_own_conf()
125 static int rockchip_pcie_wr_own_conf(struct rockchip_pcie *rockchip, in rockchip_pcie_wr_own_conf() argument
132 addr = rockchip->apb_base + PCIE_RC_CONFIG_NORMAL_BASE + offset; in rockchip_pcie_wr_own_conf()
153 static int rockchip_pcie_rd_other_conf(struct rockchip_pcie *rockchip, in rockchip_pcie_rd_other_conf() argument
159 addr = rockchip->reg_base + PCIE_ECAM_OFFSET(bus->number, devfn, where); in rockchip_pcie_rd_other_conf()
167 rockchip_pcie_cfg_configuration_accesses(rockchip, in rockchip_pcie_rd_other_conf()
170 rockchip_pcie_cfg_configuration_accesses(rockchip, in rockchip_pcie_rd_other_conf()
186 static int rockchip_pcie_wr_other_conf(struct rockchip_pcie *rockchip, in rockchip_pcie_wr_other_conf() argument
192 addr = rockchip->reg_base + PCIE_ECAM_OFFSET(bus->number, devfn, where); in rockchip_pcie_wr_other_conf()
198 rockchip_pcie_cfg_configuration_accesses(rockchip, in rockchip_pcie_wr_other_conf()
201 rockchip_pcie_cfg_configuration_accesses(rockchip, in rockchip_pcie_wr_other_conf()
219 struct rockchip_pcie *rockchip = bus->sysdata; in rockchip_pcie_rd_conf() local
221 if (!rockchip_pcie_valid_device(rockchip, bus, PCI_SLOT(devfn))) in rockchip_pcie_rd_conf()
225 return rockchip_pcie_rd_own_conf(rockchip, where, size, val); in rockchip_pcie_rd_conf()
227 return rockchip_pcie_rd_other_conf(rockchip, bus, devfn, where, size, in rockchip_pcie_rd_conf()
234 struct rockchip_pcie *rockchip = bus->sysdata; in rockchip_pcie_wr_conf() local
236 if (!rockchip_pcie_valid_device(rockchip, bus, PCI_SLOT(devfn))) in rockchip_pcie_wr_conf()
240 return rockchip_pcie_wr_own_conf(rockchip, where, size, val); in rockchip_pcie_wr_conf()
242 return rockchip_pcie_wr_other_conf(rockchip, bus, devfn, where, size, in rockchip_pcie_wr_conf()
251 static void rockchip_pcie_set_power_limit(struct rockchip_pcie *rockchip) in rockchip_pcie_set_power_limit() argument
256 if (IS_ERR(rockchip->vpcie3v3)) in rockchip_pcie_set_power_limit()
265 curr = regulator_get_current_limit(rockchip->vpcie3v3); in rockchip_pcie_set_power_limit()
274 dev_warn(rockchip->dev, "invalid power supply\n"); in rockchip_pcie_set_power_limit()
281 status = rockchip_pcie_read(rockchip, PCIE_RC_CONFIG_DCR); in rockchip_pcie_set_power_limit()
284 rockchip_pcie_write(rockchip, status, PCIE_RC_CONFIG_DCR); in rockchip_pcie_set_power_limit()
289 * @rockchip: PCIe port information
291 static int rockchip_pcie_host_init_port(struct rockchip_pcie *rockchip) in rockchip_pcie_host_init_port() argument
293 struct device *dev = rockchip->dev; in rockchip_pcie_host_init_port()
297 gpiod_set_value_cansleep(rockchip->ep_gpio, 0); in rockchip_pcie_host_init_port()
299 err = rockchip_pcie_init_port(rockchip); in rockchip_pcie_host_init_port()
304 status = rockchip_pcie_read(rockchip, PCIE_CORE_CTRL_PLC1); in rockchip_pcie_host_init_port()
307 rockchip_pcie_write(rockchip, status, PCIE_CORE_CTRL_PLC1); in rockchip_pcie_host_init_port()
309 rockchip_pcie_set_power_limit(rockchip); in rockchip_pcie_host_init_port()
312 status = rockchip_pcie_read(rockchip, PCIE_RC_CONFIG_LCS); in rockchip_pcie_host_init_port()
314 rockchip_pcie_write(rockchip, status, PCIE_RC_CONFIG_LCS); in rockchip_pcie_host_init_port()
317 status = rockchip_pcie_read(rockchip, PCIE_RC_CONFIG_LCS); in rockchip_pcie_host_init_port()
319 rockchip_pcie_write(rockchip, status, PCIE_RC_CONFIG_LCS); in rockchip_pcie_host_init_port()
322 rockchip_pcie_write(rockchip, PCIE_CLIENT_LINK_TRAIN_ENABLE, in rockchip_pcie_host_init_port()
325 gpiod_set_value_cansleep(rockchip->ep_gpio, 1); in rockchip_pcie_host_init_port()
328 err = readl_poll_timeout(rockchip->apb_base + PCIE_CLIENT_BASIC_STATUS1, in rockchip_pcie_host_init_port()
336 if (rockchip->link_gen == 2) { in rockchip_pcie_host_init_port()
341 status = rockchip_pcie_read(rockchip, PCIE_RC_CONFIG_LCS); in rockchip_pcie_host_init_port()
343 rockchip_pcie_write(rockchip, status, PCIE_RC_CONFIG_LCS); in rockchip_pcie_host_init_port()
345 err = readl_poll_timeout(rockchip->apb_base + PCIE_CORE_CTRL, in rockchip_pcie_host_init_port()
353 status = rockchip_pcie_read(rockchip, PCIE_CORE_CTRL); in rockchip_pcie_host_init_port()
359 rockchip->lanes_map = rockchip_pcie_lane_map(rockchip); in rockchip_pcie_host_init_port()
361 if (!(rockchip->lanes_map & BIT(i))) { in rockchip_pcie_host_init_port()
363 phy_power_off(rockchip->phys[i]); in rockchip_pcie_host_init_port()
367 rockchip_pcie_write(rockchip, ROCKCHIP_VENDOR_ID, in rockchip_pcie_host_init_port()
369 rockchip_pcie_write(rockchip, in rockchip_pcie_host_init_port()
374 status = rockchip_pcie_read(rockchip, PCIE_RC_CONFIG_THP_CAP); in rockchip_pcie_host_init_port()
376 rockchip_pcie_write(rockchip, status, PCIE_RC_CONFIG_THP_CAP); in rockchip_pcie_host_init_port()
380 status = rockchip_pcie_read(rockchip, PCIE_RC_CONFIG_LINK_CAP); in rockchip_pcie_host_init_port()
382 rockchip_pcie_write(rockchip, status, PCIE_RC_CONFIG_LINK_CAP); in rockchip_pcie_host_init_port()
385 status = rockchip_pcie_read(rockchip, PCIE_RC_CONFIG_DCSR); in rockchip_pcie_host_init_port()
388 rockchip_pcie_write(rockchip, status, PCIE_RC_CONFIG_DCSR); in rockchip_pcie_host_init_port()
393 phy_power_off(rockchip->phys[i]); in rockchip_pcie_host_init_port()
396 phy_exit(rockchip->phys[i]); in rockchip_pcie_host_init_port()
402 struct rockchip_pcie *rockchip = arg; in rockchip_pcie_subsys_irq_handler() local
403 struct device *dev = rockchip->dev; in rockchip_pcie_subsys_irq_handler()
407 reg = rockchip_pcie_read(rockchip, PCIE_CLIENT_INT_STATUS); in rockchip_pcie_subsys_irq_handler()
410 sub_reg = rockchip_pcie_read(rockchip, PCIE_CORE_INT_STATUS); in rockchip_pcie_subsys_irq_handler()
453 rockchip_pcie_write(rockchip, sub_reg, PCIE_CORE_INT_STATUS); in rockchip_pcie_subsys_irq_handler()
456 rockchip_pcie_update_txcredit_mui(rockchip); in rockchip_pcie_subsys_irq_handler()
457 rockchip_pcie_clr_bw_int(rockchip); in rockchip_pcie_subsys_irq_handler()
460 rockchip_pcie_write(rockchip, reg & PCIE_CLIENT_INT_LOCAL, in rockchip_pcie_subsys_irq_handler()
468 struct rockchip_pcie *rockchip = arg; in rockchip_pcie_client_irq_handler() local
469 struct device *dev = rockchip->dev; in rockchip_pcie_client_irq_handler()
472 reg = rockchip_pcie_read(rockchip, PCIE_CLIENT_INT_STATUS); in rockchip_pcie_client_irq_handler()
497 rockchip_pcie_write(rockchip, reg & (PCIE_CLIENT_INT_LEGACY_DONE | in rockchip_pcie_client_irq_handler()
511 struct rockchip_pcie *rockchip = irq_desc_get_handler_data(desc); in rockchip_pcie_intx_handler() local
512 struct device *dev = rockchip->dev; in rockchip_pcie_intx_handler()
519 reg = rockchip_pcie_read(rockchip, PCIE_CLIENT_INT_STATUS); in rockchip_pcie_intx_handler()
526 ret = generic_handle_domain_irq(rockchip->irq_domain, hwirq); in rockchip_pcie_intx_handler()
534 static int rockchip_pcie_setup_irq(struct rockchip_pcie *rockchip) in rockchip_pcie_setup_irq() argument
537 struct device *dev = rockchip->dev; in rockchip_pcie_setup_irq()
545 IRQF_SHARED, "pcie-sys", rockchip); in rockchip_pcie_setup_irq()
557 rockchip); in rockchip_pcie_setup_irq()
564 IRQF_SHARED, "pcie-client", rockchip); in rockchip_pcie_setup_irq()
575 * @rockchip: PCIe port information
579 static int rockchip_pcie_parse_host_dt(struct rockchip_pcie *rockchip) in rockchip_pcie_parse_host_dt() argument
581 struct device *dev = rockchip->dev; in rockchip_pcie_parse_host_dt()
584 err = rockchip_pcie_parse_dt(rockchip); in rockchip_pcie_parse_host_dt()
588 rockchip->vpcie12v = devm_regulator_get_optional(dev, "vpcie12v"); in rockchip_pcie_parse_host_dt()
589 if (IS_ERR(rockchip->vpcie12v)) { in rockchip_pcie_parse_host_dt()
590 if (PTR_ERR(rockchip->vpcie12v) != -ENODEV) in rockchip_pcie_parse_host_dt()
591 return PTR_ERR(rockchip->vpcie12v); in rockchip_pcie_parse_host_dt()
595 rockchip->vpcie3v3 = devm_regulator_get_optional(dev, "vpcie3v3"); in rockchip_pcie_parse_host_dt()
596 if (IS_ERR(rockchip->vpcie3v3)) { in rockchip_pcie_parse_host_dt()
597 if (PTR_ERR(rockchip->vpcie3v3) != -ENODEV) in rockchip_pcie_parse_host_dt()
598 return PTR_ERR(rockchip->vpcie3v3); in rockchip_pcie_parse_host_dt()
602 rockchip->vpcie1v8 = devm_regulator_get(dev, "vpcie1v8"); in rockchip_pcie_parse_host_dt()
603 if (IS_ERR(rockchip->vpcie1v8)) in rockchip_pcie_parse_host_dt()
604 return PTR_ERR(rockchip->vpcie1v8); in rockchip_pcie_parse_host_dt()
606 rockchip->vpcie0v9 = devm_regulator_get(dev, "vpcie0v9"); in rockchip_pcie_parse_host_dt()
607 if (IS_ERR(rockchip->vpcie0v9)) in rockchip_pcie_parse_host_dt()
608 return PTR_ERR(rockchip->vpcie0v9); in rockchip_pcie_parse_host_dt()
613 static int rockchip_pcie_set_vpcie(struct rockchip_pcie *rockchip) in rockchip_pcie_set_vpcie() argument
615 struct device *dev = rockchip->dev; in rockchip_pcie_set_vpcie()
618 if (!IS_ERR(rockchip->vpcie12v)) { in rockchip_pcie_set_vpcie()
619 err = regulator_enable(rockchip->vpcie12v); in rockchip_pcie_set_vpcie()
626 if (!IS_ERR(rockchip->vpcie3v3)) { in rockchip_pcie_set_vpcie()
627 err = regulator_enable(rockchip->vpcie3v3); in rockchip_pcie_set_vpcie()
634 err = regulator_enable(rockchip->vpcie1v8); in rockchip_pcie_set_vpcie()
640 err = regulator_enable(rockchip->vpcie0v9); in rockchip_pcie_set_vpcie()
649 regulator_disable(rockchip->vpcie1v8); in rockchip_pcie_set_vpcie()
651 if (!IS_ERR(rockchip->vpcie3v3)) in rockchip_pcie_set_vpcie()
652 regulator_disable(rockchip->vpcie3v3); in rockchip_pcie_set_vpcie()
654 if (!IS_ERR(rockchip->vpcie12v)) in rockchip_pcie_set_vpcie()
655 regulator_disable(rockchip->vpcie12v); in rockchip_pcie_set_vpcie()
660 static void rockchip_pcie_enable_interrupts(struct rockchip_pcie *rockchip) in rockchip_pcie_enable_interrupts() argument
662 rockchip_pcie_write(rockchip, (PCIE_CLIENT_INT_CLI << 16) & in rockchip_pcie_enable_interrupts()
664 rockchip_pcie_write(rockchip, (u32)(~PCIE_CORE_INT), in rockchip_pcie_enable_interrupts()
667 rockchip_pcie_enable_bw_int(rockchip); in rockchip_pcie_enable_interrupts()
683 static int rockchip_pcie_init_irq_domain(struct rockchip_pcie *rockchip) in rockchip_pcie_init_irq_domain() argument
685 struct device *dev = rockchip->dev; in rockchip_pcie_init_irq_domain()
693 rockchip->irq_domain = irq_domain_add_linear(intc, PCI_NUM_INTX, in rockchip_pcie_init_irq_domain()
694 &intx_domain_ops, rockchip); in rockchip_pcie_init_irq_domain()
696 if (!rockchip->irq_domain) { in rockchip_pcie_init_irq_domain()
704 static int rockchip_pcie_prog_ob_atu(struct rockchip_pcie *rockchip, in rockchip_pcie_prog_ob_atu() argument
735 rockchip_pcie_write(rockchip, ob_addr_0, in rockchip_pcie_prog_ob_atu()
737 rockchip_pcie_write(rockchip, ob_addr_1, in rockchip_pcie_prog_ob_atu()
739 rockchip_pcie_write(rockchip, ob_desc_0, in rockchip_pcie_prog_ob_atu()
741 rockchip_pcie_write(rockchip, 0, in rockchip_pcie_prog_ob_atu()
747 static int rockchip_pcie_prog_ib_atu(struct rockchip_pcie *rockchip, in rockchip_pcie_prog_ib_atu() argument
768 rockchip_pcie_write(rockchip, ib_addr_0, PCIE_RP_IB_ADDR0 + aw_offset); in rockchip_pcie_prog_ib_atu()
769 rockchip_pcie_write(rockchip, ib_addr_1, PCIE_RP_IB_ADDR1 + aw_offset); in rockchip_pcie_prog_ib_atu()
774 static int rockchip_pcie_cfg_atu(struct rockchip_pcie *rockchip) in rockchip_pcie_cfg_atu() argument
776 struct device *dev = rockchip->dev; in rockchip_pcie_cfg_atu()
777 struct pci_host_bridge *bridge = pci_host_bridge_from_priv(rockchip); in rockchip_pcie_cfg_atu()
784 rockchip_pcie_cfg_configuration_accesses(rockchip, in rockchip_pcie_cfg_atu()
792 rockchip->msg_bus_addr = pci_addr; in rockchip_pcie_cfg_atu()
795 err = rockchip_pcie_prog_ob_atu(rockchip, reg_no + 1, in rockchip_pcie_cfg_atu()
806 err = rockchip_pcie_prog_ib_atu(rockchip, 2, 32 - 1, 0x0, 0); in rockchip_pcie_cfg_atu()
823 err = rockchip_pcie_prog_ob_atu(rockchip, in rockchip_pcie_cfg_atu()
836 rockchip_pcie_prog_ob_atu(rockchip, reg_no + 1 + offset, in rockchip_pcie_cfg_atu()
840 rockchip->msg_bus_addr += ((reg_no + offset) << 20); in rockchip_pcie_cfg_atu()
844 static int rockchip_pcie_wait_l2(struct rockchip_pcie *rockchip) in rockchip_pcie_wait_l2() argument
850 writel(0x0, rockchip->msg_region + PCIE_RC_SEND_PME_OFF); in rockchip_pcie_wait_l2()
853 err = readl_poll_timeout(rockchip->apb_base + PCIE_CLIENT_DEBUG_OUT_0, in rockchip_pcie_wait_l2()
857 dev_err(rockchip->dev, "PCIe link enter L2 timeout!\n"); in rockchip_pcie_wait_l2()
866 struct rockchip_pcie *rockchip = dev_get_drvdata(dev); in rockchip_pcie_suspend_noirq() local
870 rockchip_pcie_write(rockchip, (PCIE_CLIENT_INT_CLI << 16) | in rockchip_pcie_suspend_noirq()
872 rockchip_pcie_write(rockchip, (u32)PCIE_CORE_INT, PCIE_CORE_INT_MASK); in rockchip_pcie_suspend_noirq()
874 ret = rockchip_pcie_wait_l2(rockchip); in rockchip_pcie_suspend_noirq()
876 rockchip_pcie_enable_interrupts(rockchip); in rockchip_pcie_suspend_noirq()
880 rockchip_pcie_deinit_phys(rockchip); in rockchip_pcie_suspend_noirq()
882 rockchip_pcie_disable_clocks(rockchip); in rockchip_pcie_suspend_noirq()
884 regulator_disable(rockchip->vpcie0v9); in rockchip_pcie_suspend_noirq()
891 struct rockchip_pcie *rockchip = dev_get_drvdata(dev); in rockchip_pcie_resume_noirq() local
894 err = regulator_enable(rockchip->vpcie0v9); in rockchip_pcie_resume_noirq()
900 err = rockchip_pcie_enable_clocks(rockchip); in rockchip_pcie_resume_noirq()
904 err = rockchip_pcie_host_init_port(rockchip); in rockchip_pcie_resume_noirq()
908 err = rockchip_pcie_cfg_atu(rockchip); in rockchip_pcie_resume_noirq()
913 rockchip_pcie_update_txcredit_mui(rockchip); in rockchip_pcie_resume_noirq()
914 rockchip_pcie_enable_interrupts(rockchip); in rockchip_pcie_resume_noirq()
919 rockchip_pcie_deinit_phys(rockchip); in rockchip_pcie_resume_noirq()
921 rockchip_pcie_disable_clocks(rockchip); in rockchip_pcie_resume_noirq()
923 regulator_disable(rockchip->vpcie0v9); in rockchip_pcie_resume_noirq()
929 struct rockchip_pcie *rockchip; in rockchip_pcie_probe() local
937 bridge = devm_pci_alloc_host_bridge(dev, sizeof(*rockchip)); in rockchip_pcie_probe()
941 rockchip = pci_host_bridge_priv(bridge); in rockchip_pcie_probe()
943 platform_set_drvdata(pdev, rockchip); in rockchip_pcie_probe()
944 rockchip->dev = dev; in rockchip_pcie_probe()
945 rockchip->is_rc = true; in rockchip_pcie_probe()
947 err = rockchip_pcie_parse_host_dt(rockchip); in rockchip_pcie_probe()
951 err = rockchip_pcie_enable_clocks(rockchip); in rockchip_pcie_probe()
955 err = rockchip_pcie_set_vpcie(rockchip); in rockchip_pcie_probe()
961 err = rockchip_pcie_host_init_port(rockchip); in rockchip_pcie_probe()
965 err = rockchip_pcie_init_irq_domain(rockchip); in rockchip_pcie_probe()
969 err = rockchip_pcie_cfg_atu(rockchip); in rockchip_pcie_probe()
973 rockchip->msg_region = devm_ioremap(dev, rockchip->msg_bus_addr, SZ_1M); in rockchip_pcie_probe()
974 if (!rockchip->msg_region) { in rockchip_pcie_probe()
979 bridge->sysdata = rockchip; in rockchip_pcie_probe()
982 err = rockchip_pcie_setup_irq(rockchip); in rockchip_pcie_probe()
986 rockchip_pcie_enable_interrupts(rockchip); in rockchip_pcie_probe()
995 irq_domain_remove(rockchip->irq_domain); in rockchip_pcie_probe()
997 rockchip_pcie_deinit_phys(rockchip); in rockchip_pcie_probe()
999 if (!IS_ERR(rockchip->vpcie12v)) in rockchip_pcie_probe()
1000 regulator_disable(rockchip->vpcie12v); in rockchip_pcie_probe()
1001 if (!IS_ERR(rockchip->vpcie3v3)) in rockchip_pcie_probe()
1002 regulator_disable(rockchip->vpcie3v3); in rockchip_pcie_probe()
1003 regulator_disable(rockchip->vpcie1v8); in rockchip_pcie_probe()
1004 regulator_disable(rockchip->vpcie0v9); in rockchip_pcie_probe()
1006 rockchip_pcie_disable_clocks(rockchip); in rockchip_pcie_probe()
1013 struct rockchip_pcie *rockchip = dev_get_drvdata(dev); in rockchip_pcie_remove() local
1014 struct pci_host_bridge *bridge = pci_host_bridge_from_priv(rockchip); in rockchip_pcie_remove()
1018 irq_domain_remove(rockchip->irq_domain); in rockchip_pcie_remove()
1020 rockchip_pcie_deinit_phys(rockchip); in rockchip_pcie_remove()
1022 rockchip_pcie_disable_clocks(rockchip); in rockchip_pcie_remove()
1024 if (!IS_ERR(rockchip->vpcie12v)) in rockchip_pcie_remove()
1025 regulator_disable(rockchip->vpcie12v); in rockchip_pcie_remove()
1026 if (!IS_ERR(rockchip->vpcie3v3)) in rockchip_pcie_remove()
1027 regulator_disable(rockchip->vpcie3v3); in rockchip_pcie_remove()
1028 regulator_disable(rockchip->vpcie1v8); in rockchip_pcie_remove()
1029 regulator_disable(rockchip->vpcie0v9); in rockchip_pcie_remove()
1038 { .compatible = "rockchip,rk3399-pcie", },
1045 .name = "rockchip-pcie",
1054 MODULE_AUTHOR("Rockchip Inc");
1055 MODULE_DESCRIPTION("Rockchip AXI PCIe driver");