Lines Matching +full:aspm +full:- +full:no +full:- +full:l0s
1 // SPDX-License-Identifier: GPL-2.0+
7 * Author: Shawn Lin <shawn.lin@rock-chips.com>
8 * Wenrui Li <wenrui.li@rock-chips.com>
40 #include "pcie-rockchip.h"
41 #include "rockchip-pcie-dma.h"
45 struct rockchip_pcie *rockchip = dev_get_drvdata(obj->dev); in rk_pcie_start_dma_rk3399()
47 int chn = tbl->chn; in rk_pcie_start_dma_rk3399()
49 rockchip_pcie_write(rockchip, (u32)(tbl->phys_descs & 0xffffffff), in rk_pcie_start_dma_rk3399()
51 rockchip_pcie_write(rockchip, (u32)(tbl->phys_descs >> 32), in rk_pcie_start_dma_rk3399()
53 rockchip_pcie_write(rockchip, BIT(0) | (tbl->dir << 1), in rk_pcie_start_dma_rk3399()
59 u32 *desc = table->descs; in rk_pcie_config_dma_rk3399()
61 *(desc + 0) = (u32)(table->local & 0xffffffff); in rk_pcie_config_dma_rk3399()
62 *(desc + 1) = (u32)(table->local >> 32); in rk_pcie_config_dma_rk3399()
63 *(desc + 2) = (u32)(table->bus & 0xffffffff); in rk_pcie_config_dma_rk3399()
64 *(desc + 3) = (u32)(table->bus >> 32); in rk_pcie_config_dma_rk3399()
67 *(desc + 6) = table->buf_size; in rk_pcie_config_dma_rk3399()
110 if (pci_is_root_bus(bus) || pci_is_root_bus(bus->parent)) in rockchip_pcie_valid_device()
121 if (rockchip->legacy_phy) in rockchip_pcie_lane_map()
122 return GENMASK(MAX_LANE_NUM - 1, 0); in rockchip_pcie_lane_map()
127 /* The link may be using a reverse-indexed mapping. */ in rockchip_pcie_lane_map()
139 addr = rockchip->apb_base + PCIE_RC_CONFIG_NORMAL_BASE + where; in rockchip_pcie_rd_own_conf()
166 addr = rockchip->apb_base + PCIE_RC_CONFIG_NORMAL_BASE + offset; in rockchip_pcie_wr_own_conf()
173 mask = ~(((1 << (size * 8)) - 1) << ((where & 0x3) * 8)); in rockchip_pcie_wr_own_conf()
193 if (rockchip->in_remove) in rockchip_pcie_rd_other_conf()
196 busdev = PCIE_ECAM_ADDR(bus->number, PCI_SLOT(devfn), in rockchip_pcie_rd_other_conf()
204 if (pci_is_root_bus(bus->parent)) in rockchip_pcie_rd_other_conf()
212 *val = readl(rockchip->reg_base + busdev); in rockchip_pcie_rd_other_conf()
214 *val = readw(rockchip->reg_base + busdev); in rockchip_pcie_rd_other_conf()
216 *val = readb(rockchip->reg_base + busdev); in rockchip_pcie_rd_other_conf()
230 if (rockchip->in_remove) in rockchip_pcie_wr_other_conf()
233 busdev = PCIE_ECAM_ADDR(bus->number, PCI_SLOT(devfn), in rockchip_pcie_wr_other_conf()
238 if (pci_is_root_bus(bus->parent)) in rockchip_pcie_wr_other_conf()
246 writel(val, rockchip->reg_base + busdev); in rockchip_pcie_wr_other_conf()
248 writew(val, rockchip->reg_base + busdev); in rockchip_pcie_wr_other_conf()
250 writeb(val, rockchip->reg_base + busdev); in rockchip_pcie_wr_other_conf()
260 struct rockchip_pcie *rockchip = bus->sysdata; in rockchip_pcie_rd_conf()
277 struct rockchip_pcie *rockchip = bus->sysdata; in rockchip_pcie_wr_conf()
299 if (IS_ERR(rockchip->vpcie3v3)) in rockchip_pcie_set_power_limit()
308 curr = regulator_get_current_limit(rockchip->vpcie3v3); in rockchip_pcie_set_power_limit()
317 dev_warn(rockchip->dev, "invalid power supply\n"); in rockchip_pcie_set_power_limit()
320 scale--; in rockchip_pcie_set_power_limit()
331 * rockchip_pcie_host_init_port - Initialize hardware
336 struct device *dev = rockchip->dev; in rockchip_pcie_host_init_port()
341 gpiod_set_value_cansleep(rockchip->ep_gpio, 0); in rockchip_pcie_host_init_port()
347 /* Fix the transmitted FTS count desired to exit from L0s. */ in rockchip_pcie_host_init_port()
369 gpiod_set_value_cansleep(rockchip->ep_gpio, 1); in rockchip_pcie_host_init_port()
371 if (rockchip->wait_ep) in rockchip_pcie_host_init_port()
375 err = readl_poll_timeout(rockchip->apb_base + PCIE_CLIENT_BASIC_STATUS1, in rockchip_pcie_host_init_port()
383 err = readl_poll_timeout(rockchip->apb_base + PCIE_CLIENT_DEBUG_OUT_0, in rockchip_pcie_host_init_port()
388 return -ETIMEDOUT; in rockchip_pcie_host_init_port()
391 if (rockchip->link_gen == 2) { in rockchip_pcie_host_init_port()
400 err = readl_poll_timeout(rockchip->apb_base + PCIE_CORE_CTRL, in rockchip_pcie_host_init_port()
414 rockchip->lanes_map = rockchip_pcie_lane_map(rockchip); in rockchip_pcie_host_init_port()
416 if (!(rockchip->lanes_map & BIT(i))) { in rockchip_pcie_host_init_port()
418 phy_power_off(rockchip->phys[i]); in rockchip_pcie_host_init_port()
423 if (rockchip->dma_trx_enabled) in rockchip_pcie_host_init_port()
438 /* Clear L0s from RC's link cap */ in rockchip_pcie_host_init_port()
439 if (of_property_read_bool(dev->of_node, "aspm-no-l0s")) { in rockchip_pcie_host_init_port()
452 while (i--) in rockchip_pcie_host_init_port()
453 phy_power_off(rockchip->phys[i]); in rockchip_pcie_host_init_port()
455 while (i--) in rockchip_pcie_host_init_port()
456 phy_exit(rockchip->phys[i]); in rockchip_pcie_host_init_port()
464 struct dma_trx_obj *obj = rockchip->dma_obj; in rockchip_pcie_handle_dma_interrupt()
476 obj->irq_num++; in rockchip_pcie_handle_dma_interrupt()
477 obj->dma_free = true; in rockchip_pcie_handle_dma_interrupt()
480 if (list_empty(&obj->tbl_list)) { in rockchip_pcie_handle_dma_interrupt()
481 if (obj->dma_free && in rockchip_pcie_handle_dma_interrupt()
482 obj->loop_count >= obj->loop_count_threshold) in rockchip_pcie_handle_dma_interrupt()
483 complete(&obj->done); in rockchip_pcie_handle_dma_interrupt()
490 struct device *dev = rockchip->dev; in rockchip_pcie_subsys_irq_handler()
563 struct device *dev = rockchip->dev; in rockchip_pcie_client_irq_handler()
583 dev_dbg(dev, "no fatal error interrupt received\n"); in rockchip_pcie_client_irq_handler()
606 struct device *dev = rockchip->dev; in rockchip_pcie_legacy_int_handler()
617 hwirq = ffs(reg) - 1; in rockchip_pcie_legacy_int_handler()
620 virq = irq_find_mapping(rockchip->irq_domain, hwirq); in rockchip_pcie_legacy_int_handler()
633 struct device *dev = rockchip->dev; in rockchip_pcie_setup_irq()
641 IRQF_SHARED, "pcie-sys", rockchip); in rockchip_pcie_setup_irq()
660 IRQF_SHARED, "pcie-client", rockchip); in rockchip_pcie_setup_irq()
670 * rockchip_pcie_parse_host_dt - Parse Device Tree
677 struct device *dev = rockchip->dev; in rockchip_pcie_parse_host_dt()
684 rockchip->vpcie12v = devm_regulator_get_optional(dev, "vpcie12v"); in rockchip_pcie_parse_host_dt()
685 if (IS_ERR(rockchip->vpcie12v)) { in rockchip_pcie_parse_host_dt()
686 if (PTR_ERR(rockchip->vpcie12v) != -ENODEV) in rockchip_pcie_parse_host_dt()
687 return PTR_ERR(rockchip->vpcie12v); in rockchip_pcie_parse_host_dt()
688 dev_info(dev, "no vpcie12v regulator found\n"); in rockchip_pcie_parse_host_dt()
691 rockchip->vpcie3v3 = devm_regulator_get_optional(dev, "vpcie3v3"); in rockchip_pcie_parse_host_dt()
692 if (IS_ERR(rockchip->vpcie3v3)) { in rockchip_pcie_parse_host_dt()
693 if (PTR_ERR(rockchip->vpcie3v3) != -ENODEV) in rockchip_pcie_parse_host_dt()
694 return PTR_ERR(rockchip->vpcie3v3); in rockchip_pcie_parse_host_dt()
695 dev_info(dev, "no vpcie3v3 regulator found\n"); in rockchip_pcie_parse_host_dt()
698 rockchip->vpcie1v8 = devm_regulator_get(dev, "vpcie1v8"); in rockchip_pcie_parse_host_dt()
699 if (IS_ERR(rockchip->vpcie1v8)) in rockchip_pcie_parse_host_dt()
700 return PTR_ERR(rockchip->vpcie1v8); in rockchip_pcie_parse_host_dt()
702 rockchip->vpcie0v9 = devm_regulator_get(dev, "vpcie0v9"); in rockchip_pcie_parse_host_dt()
703 if (IS_ERR(rockchip->vpcie0v9)) in rockchip_pcie_parse_host_dt()
704 return PTR_ERR(rockchip->vpcie0v9); in rockchip_pcie_parse_host_dt()
711 struct device *dev = rockchip->dev; in rockchip_pcie_set_vpcie()
714 if (!IS_ERR(rockchip->vpcie12v)) { in rockchip_pcie_set_vpcie()
715 err = regulator_enable(rockchip->vpcie12v); in rockchip_pcie_set_vpcie()
722 if (!IS_ERR(rockchip->vpcie3v3)) { in rockchip_pcie_set_vpcie()
723 err = regulator_enable(rockchip->vpcie3v3); in rockchip_pcie_set_vpcie()
730 err = regulator_enable(rockchip->vpcie1v8); in rockchip_pcie_set_vpcie()
736 err = regulator_enable(rockchip->vpcie0v9); in rockchip_pcie_set_vpcie()
745 regulator_disable(rockchip->vpcie1v8); in rockchip_pcie_set_vpcie()
747 if (!IS_ERR(rockchip->vpcie3v3)) in rockchip_pcie_set_vpcie()
748 regulator_disable(rockchip->vpcie3v3); in rockchip_pcie_set_vpcie()
750 if (!IS_ERR(rockchip->vpcie12v)) in rockchip_pcie_set_vpcie()
751 regulator_disable(rockchip->vpcie12v); in rockchip_pcie_set_vpcie()
772 irq_set_chip_data(irq, domain->host_data); in rockchip_pcie_intx_map()
783 struct device *dev = rockchip->dev; in rockchip_pcie_init_irq_domain()
784 struct device_node *intc = of_get_next_child(dev->of_node, NULL); in rockchip_pcie_init_irq_domain()
787 dev_err(dev, "missing child interrupt-controller node\n"); in rockchip_pcie_init_irq_domain()
788 return -EINVAL; in rockchip_pcie_init_irq_domain()
791 rockchip->irq_domain = irq_domain_add_linear(intc, PCI_NUM_INTX, in rockchip_pcie_init_irq_domain()
794 if (!rockchip->irq_domain) { in rockchip_pcie_init_irq_domain()
796 return -EINVAL; in rockchip_pcie_init_irq_domain()
812 return -EINVAL; in rockchip_pcie_prog_ob_atu()
814 return -EINVAL; in rockchip_pcie_prog_ob_atu()
816 return -EINVAL; in rockchip_pcie_prog_ob_atu()
819 return -EINVAL; in rockchip_pcie_prog_ob_atu()
823 return -EINVAL; in rockchip_pcie_prog_ob_atu()
854 return -EINVAL; in rockchip_pcie_prog_ib_atu()
856 return -EINVAL; in rockchip_pcie_prog_ib_atu()
858 return -EINVAL; in rockchip_pcie_prog_ib_atu()
874 struct device *dev = rockchip->dev; in rockchip_pcie_cfg_atu()
884 entry = resource_list_first_type(&bridge->windows, IORESOURCE_MEM); in rockchip_pcie_cfg_atu()
886 return -ENODEV; in rockchip_pcie_cfg_atu()
888 size = resource_size(entry->res); in rockchip_pcie_cfg_atu()
889 pci_addr = entry->res->start - entry->offset; in rockchip_pcie_cfg_atu()
890 rockchip->msg_bus_addr = pci_addr; in rockchip_pcie_cfg_atu()
895 20 - 1, in rockchip_pcie_cfg_atu()
905 if (rockchip->dma_trx_enabled) { in rockchip_pcie_cfg_atu()
907 32 - 1, rockchip->mem_reserve_start, 0x0); in rockchip_pcie_cfg_atu()
910 err = rockchip_pcie_prog_ib_atu(rockchip, 2, 32 - 1, 0x0, 0); in rockchip_pcie_cfg_atu()
916 entry = resource_list_first_type(&bridge->windows, IORESOURCE_IO); in rockchip_pcie_cfg_atu()
918 return -ENODEV; in rockchip_pcie_cfg_atu()
923 size = resource_size(entry->res); in rockchip_pcie_cfg_atu()
924 pci_addr = entry->res->start - entry->offset; in rockchip_pcie_cfg_atu()
930 20 - 1, in rockchip_pcie_cfg_atu()
942 20 - 1, 0, 0); in rockchip_pcie_cfg_atu()
944 rockchip->msg_bus_addr += ((reg_no + offset) << 20); in rockchip_pcie_cfg_atu()
945 rockchip->msg_region = devm_ioremap(dev, rockchip->msg_bus_addr, SZ_1M); in rockchip_pcie_cfg_atu()
946 if (!rockchip->msg_region) in rockchip_pcie_cfg_atu()
947 err = -ENOMEM; in rockchip_pcie_cfg_atu()
956 /* Don't enter L2 state when no ep connected */ in rockchip_pcie_wait_l2()
957 if (rockchip->dma_trx_enabled == 1) in rockchip_pcie_wait_l2()
961 writel(0x0, rockchip->msg_region + PCIE_RC_SEND_PME_OFF); in rockchip_pcie_wait_l2()
964 err = readl_poll_timeout(rockchip->apb_base + PCIE_CLIENT_DEBUG_OUT_0, in rockchip_pcie_wait_l2()
968 dev_err(rockchip->dev, "PCIe link enter L2 timeout!\n"); in rockchip_pcie_wait_l2()
1025 if (!rockchip->dma_trx_enabled) in rockchip_pcie_suspend_noirq()
1030 regulator_disable(rockchip->vpcie0v9); in rockchip_pcie_suspend_noirq()
1040 err = regulator_enable(rockchip->vpcie0v9); in rockchip_pcie_resume_noirq()
1050 if (!rockchip->dma_trx_enabled) in rockchip_pcie_resume_noirq()
1060 regulator_disable(rockchip->vpcie0v9); in rockchip_pcie_resume_noirq()
1083 rockchip->bridge->sysdata = rockchip; in rockchip_pcie_really_probe()
1084 rockchip->bridge->ops = &rockchip_pcie_ops; in rockchip_pcie_really_probe()
1086 device_init_wakeup(rockchip->dev, true); in rockchip_pcie_really_probe()
1088 return pci_host_probe(rockchip->bridge); in rockchip_pcie_really_probe()
1104 rockchip->wait_ep = 1; in pcie_deferred_store()
1107 return -EINVAL; in pcie_deferred_store()
1120 struct dma_trx_obj *obj = rockchip->dma_obj; in pcie_reset_ep_store()
1122 dev_info(dev, "loop_cout = %d\n", obj->loop_count); in pcie_reset_ep_store()
1129 rockchip_pcie_suspend_for_user(rockchip->dev); in pcie_reset_ep_store()
1131 rockchip_pcie_resume_for_user(rockchip->dev); in pcie_reset_ep_store()
1133 return -EINVAL; in pcie_reset_ep_store()
1154 struct device *dev = &pdev->dev; in rockchip_pcie_probe()
1158 if (!dev->of_node) in rockchip_pcie_probe()
1159 return -ENODEV; in rockchip_pcie_probe()
1163 return -ENOMEM; in rockchip_pcie_probe()
1167 rockchip->bridge = bridge; in rockchip_pcie_probe()
1170 rockchip->dev = dev; in rockchip_pcie_probe()
1171 rockchip->is_rc = true; in rockchip_pcie_probe()
1191 if (rockchip->deferred) { in rockchip_pcie_probe()
1192 err = sysfs_create_group(&pdev->dev.kobj, &pcie_attr_group); in rockchip_pcie_probe()
1194 dev_err(&pdev->dev, "SysFS group creation failed\n"); in rockchip_pcie_probe()
1200 dev_err(&pdev->dev, "deferred probe failed\n"); in rockchip_pcie_probe()
1205 if (rockchip->dma_trx_enabled == 0) in rockchip_pcie_probe()
1208 rockchip->dma_obj = rk_pcie_dma_obj_probe(dev); in rockchip_pcie_probe()
1209 if (IS_ERR(rockchip->dma_obj)) { in rockchip_pcie_probe()
1211 err = -EINVAL; in rockchip_pcie_probe()
1215 if (rockchip->dma_obj) { in rockchip_pcie_probe()
1216 rockchip->dma_obj->start_dma_func = rk_pcie_start_dma_rk3399; in rockchip_pcie_probe()
1217 rockchip->dma_obj->config_dma_func = rk_pcie_config_dma_rk3399; in rockchip_pcie_probe()
1224 if (rockchip->deferred) in rockchip_pcie_probe()
1225 sysfs_remove_group(&pdev->dev.kobj, &pcie_attr_group); in rockchip_pcie_probe()
1227 irq_domain_remove(rockchip->irq_domain); in rockchip_pcie_probe()
1229 if (!IS_ERR(rockchip->vpcie12v)) in rockchip_pcie_probe()
1230 regulator_disable(rockchip->vpcie12v); in rockchip_pcie_probe()
1231 if (!IS_ERR(rockchip->vpcie3v3)) in rockchip_pcie_probe()
1232 regulator_disable(rockchip->vpcie3v3); in rockchip_pcie_probe()
1233 regulator_disable(rockchip->vpcie1v8); in rockchip_pcie_probe()
1234 regulator_disable(rockchip->vpcie0v9); in rockchip_pcie_probe()
1242 struct device *dev = &pdev->dev; in rockchip_pcie_remove()
1252 rockchip->in_remove = 1; in rockchip_pcie_remove()
1254 pci_stop_root_bus(bridge->bus); in rockchip_pcie_remove()
1255 pci_remove_root_bus(bridge->bus); in rockchip_pcie_remove()
1256 irq_domain_remove(rockchip->irq_domain); in rockchip_pcie_remove()
1273 if (rockchip->dma_trx_enabled) in rockchip_pcie_remove()
1274 rk_pcie_dma_obj_remove(rockchip->dma_obj); in rockchip_pcie_remove()
1276 if (rockchip->deferred) in rockchip_pcie_remove()
1277 sysfs_remove_group(&pdev->dev.kobj, &pcie_attr_group); in rockchip_pcie_remove()
1279 if (!IS_ERR(rockchip->vpcie12v)) in rockchip_pcie_remove()
1280 regulator_disable(rockchip->vpcie12v); in rockchip_pcie_remove()
1281 if (!IS_ERR(rockchip->vpcie3v3)) in rockchip_pcie_remove()
1282 regulator_disable(rockchip->vpcie3v3); in rockchip_pcie_remove()
1283 regulator_disable(rockchip->vpcie1v8); in rockchip_pcie_remove()
1284 regulator_disable(rockchip->vpcie0v9); in rockchip_pcie_remove()
1286 device_init_wakeup(rockchip->dev, false); in rockchip_pcie_remove()
1297 { .compatible = "rockchip,rk3399-pcie", },
1304 .name = "rockchip-pcie",