• Home
  • Raw
  • Download

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"
79 if (pci_is_root_bus(bus) || pci_is_root_bus(bus->parent)) in rockchip_pcie_valid_device()
90 if (rockchip->legacy_phy) in rockchip_pcie_lane_map()
91 return GENMASK(MAX_LANE_NUM - 1, 0); in rockchip_pcie_lane_map()
96 /* The link may be using a reverse-indexed mapping. */ in rockchip_pcie_lane_map()
108 addr = rockchip->apb_base + PCIE_RC_CONFIG_NORMAL_BASE + where; in rockchip_pcie_rd_own_conf()
135 addr = rockchip->apb_base + PCIE_RC_CONFIG_NORMAL_BASE + offset; in rockchip_pcie_wr_own_conf()
142 mask = ~(((1 << (size * 8)) - 1) << ((where & 0x3) * 8)); in rockchip_pcie_wr_own_conf()
162 busdev = PCIE_ECAM_ADDR(bus->number, PCI_SLOT(devfn), in rockchip_pcie_rd_other_conf()
170 if (pci_is_root_bus(bus->parent)) in rockchip_pcie_rd_other_conf()
178 *val = readl(rockchip->reg_base + busdev); in rockchip_pcie_rd_other_conf()
180 *val = readw(rockchip->reg_base + busdev); in rockchip_pcie_rd_other_conf()
182 *val = readb(rockchip->reg_base + busdev); in rockchip_pcie_rd_other_conf()
196 busdev = PCIE_ECAM_ADDR(bus->number, PCI_SLOT(devfn), in rockchip_pcie_wr_other_conf()
201 if (pci_is_root_bus(bus->parent)) in rockchip_pcie_wr_other_conf()
209 writel(val, rockchip->reg_base + busdev); in rockchip_pcie_wr_other_conf()
211 writew(val, rockchip->reg_base + busdev); in rockchip_pcie_wr_other_conf()
213 writeb(val, rockchip->reg_base + busdev); in rockchip_pcie_wr_other_conf()
223 struct rockchip_pcie *rockchip = bus->sysdata; in rockchip_pcie_rd_conf()
240 struct rockchip_pcie *rockchip = bus->sysdata; in rockchip_pcie_wr_conf()
262 if (IS_ERR(rockchip->vpcie3v3)) in rockchip_pcie_set_power_limit()
271 curr = regulator_get_current_limit(rockchip->vpcie3v3); in rockchip_pcie_set_power_limit()
280 dev_warn(rockchip->dev, "invalid power supply\n"); in rockchip_pcie_set_power_limit()
283 scale--; in rockchip_pcie_set_power_limit()
294 * rockchip_pcie_host_init_port - Initialize hardware
299 struct device *dev = rockchip->dev; in rockchip_pcie_host_init_port()
303 gpiod_set_value_cansleep(rockchip->ep_gpio, 0); in rockchip_pcie_host_init_port()
309 /* Fix the transmitted FTS count desired to exit from L0s. */ in rockchip_pcie_host_init_port()
331 gpiod_set_value_cansleep(rockchip->ep_gpio, 1); in rockchip_pcie_host_init_port()
334 err = readl_poll_timeout(rockchip->apb_base + PCIE_CLIENT_BASIC_STATUS1, in rockchip_pcie_host_init_port()
342 if (rockchip->link_gen == 2) { in rockchip_pcie_host_init_port()
351 err = readl_poll_timeout(rockchip->apb_base + PCIE_CORE_CTRL, in rockchip_pcie_host_init_port()
365 rockchip->lanes_map = rockchip_pcie_lane_map(rockchip); in rockchip_pcie_host_init_port()
367 if (!(rockchip->lanes_map & BIT(i))) { in rockchip_pcie_host_init_port()
369 phy_power_off(rockchip->phys[i]); in rockchip_pcie_host_init_port()
384 /* Clear L0s from RC's link cap */ in rockchip_pcie_host_init_port()
385 if (of_property_read_bool(dev->of_node, "aspm-no-l0s")) { in rockchip_pcie_host_init_port()
398 while (i--) in rockchip_pcie_host_init_port()
399 phy_power_off(rockchip->phys[i]); in rockchip_pcie_host_init_port()
401 while (i--) in rockchip_pcie_host_init_port()
402 phy_exit(rockchip->phys[i]); in rockchip_pcie_host_init_port()
409 struct device *dev = rockchip->dev; in rockchip_pcie_subsys_irq_handler()
475 struct device *dev = rockchip->dev; in rockchip_pcie_client_irq_handler()
495 dev_dbg(dev, "no fatal error interrupt received\n"); in rockchip_pcie_client_irq_handler()
518 struct device *dev = rockchip->dev; in rockchip_pcie_legacy_int_handler()
529 hwirq = ffs(reg) - 1; in rockchip_pcie_legacy_int_handler()
532 virq = irq_find_mapping(rockchip->irq_domain, hwirq); in rockchip_pcie_legacy_int_handler()
545 struct device *dev = rockchip->dev; in rockchip_pcie_setup_irq()
553 IRQF_SHARED, "pcie-sys", rockchip); in rockchip_pcie_setup_irq()
572 IRQF_SHARED, "pcie-client", rockchip); in rockchip_pcie_setup_irq()
582 * rockchip_pcie_parse_host_dt - Parse Device Tree
589 struct device *dev = rockchip->dev; in rockchip_pcie_parse_host_dt()
596 rockchip->vpcie12v = devm_regulator_get_optional(dev, "vpcie12v"); in rockchip_pcie_parse_host_dt()
597 if (IS_ERR(rockchip->vpcie12v)) { in rockchip_pcie_parse_host_dt()
598 if (PTR_ERR(rockchip->vpcie12v) != -ENODEV) in rockchip_pcie_parse_host_dt()
599 return PTR_ERR(rockchip->vpcie12v); in rockchip_pcie_parse_host_dt()
600 dev_info(dev, "no vpcie12v regulator found\n"); in rockchip_pcie_parse_host_dt()
603 rockchip->vpcie3v3 = devm_regulator_get_optional(dev, "vpcie3v3"); in rockchip_pcie_parse_host_dt()
604 if (IS_ERR(rockchip->vpcie3v3)) { in rockchip_pcie_parse_host_dt()
605 if (PTR_ERR(rockchip->vpcie3v3) != -ENODEV) in rockchip_pcie_parse_host_dt()
606 return PTR_ERR(rockchip->vpcie3v3); in rockchip_pcie_parse_host_dt()
607 dev_info(dev, "no vpcie3v3 regulator found\n"); in rockchip_pcie_parse_host_dt()
610 rockchip->vpcie1v8 = devm_regulator_get(dev, "vpcie1v8"); in rockchip_pcie_parse_host_dt()
611 if (IS_ERR(rockchip->vpcie1v8)) in rockchip_pcie_parse_host_dt()
612 return PTR_ERR(rockchip->vpcie1v8); in rockchip_pcie_parse_host_dt()
614 rockchip->vpcie0v9 = devm_regulator_get(dev, "vpcie0v9"); in rockchip_pcie_parse_host_dt()
615 if (IS_ERR(rockchip->vpcie0v9)) in rockchip_pcie_parse_host_dt()
616 return PTR_ERR(rockchip->vpcie0v9); in rockchip_pcie_parse_host_dt()
623 struct device *dev = rockchip->dev; in rockchip_pcie_set_vpcie()
626 if (!IS_ERR(rockchip->vpcie12v)) { in rockchip_pcie_set_vpcie()
627 err = regulator_enable(rockchip->vpcie12v); in rockchip_pcie_set_vpcie()
634 if (!IS_ERR(rockchip->vpcie3v3)) { in rockchip_pcie_set_vpcie()
635 err = regulator_enable(rockchip->vpcie3v3); in rockchip_pcie_set_vpcie()
642 err = regulator_enable(rockchip->vpcie1v8); in rockchip_pcie_set_vpcie()
648 err = regulator_enable(rockchip->vpcie0v9); in rockchip_pcie_set_vpcie()
657 regulator_disable(rockchip->vpcie1v8); in rockchip_pcie_set_vpcie()
659 if (!IS_ERR(rockchip->vpcie3v3)) in rockchip_pcie_set_vpcie()
660 regulator_disable(rockchip->vpcie3v3); in rockchip_pcie_set_vpcie()
662 if (!IS_ERR(rockchip->vpcie12v)) in rockchip_pcie_set_vpcie()
663 regulator_disable(rockchip->vpcie12v); in rockchip_pcie_set_vpcie()
682 irq_set_chip_data(irq, domain->host_data); in rockchip_pcie_intx_map()
693 struct device *dev = rockchip->dev; in rockchip_pcie_init_irq_domain()
694 struct device_node *intc = of_get_next_child(dev->of_node, NULL); in rockchip_pcie_init_irq_domain()
697 dev_err(dev, "missing child interrupt-controller node\n"); in rockchip_pcie_init_irq_domain()
698 return -EINVAL; in rockchip_pcie_init_irq_domain()
701 rockchip->irq_domain = irq_domain_add_linear(intc, PCI_NUM_INTX, in rockchip_pcie_init_irq_domain()
704 if (!rockchip->irq_domain) { in rockchip_pcie_init_irq_domain()
706 return -EINVAL; in rockchip_pcie_init_irq_domain()
722 return -EINVAL; in rockchip_pcie_prog_ob_atu()
724 return -EINVAL; in rockchip_pcie_prog_ob_atu()
726 return -EINVAL; in rockchip_pcie_prog_ob_atu()
729 return -EINVAL; in rockchip_pcie_prog_ob_atu()
733 return -EINVAL; in rockchip_pcie_prog_ob_atu()
764 return -EINVAL; in rockchip_pcie_prog_ib_atu()
766 return -EINVAL; in rockchip_pcie_prog_ib_atu()
768 return -EINVAL; in rockchip_pcie_prog_ib_atu()
784 struct device *dev = rockchip->dev; in rockchip_pcie_cfg_atu()
794 entry = resource_list_first_type(&bridge->windows, IORESOURCE_MEM); in rockchip_pcie_cfg_atu()
796 return -ENODEV; in rockchip_pcie_cfg_atu()
798 size = resource_size(entry->res); in rockchip_pcie_cfg_atu()
799 pci_addr = entry->res->start - entry->offset; in rockchip_pcie_cfg_atu()
800 rockchip->msg_bus_addr = pci_addr; in rockchip_pcie_cfg_atu()
805 20 - 1, in rockchip_pcie_cfg_atu()
814 err = rockchip_pcie_prog_ib_atu(rockchip, 2, 32 - 1, 0x0, 0); in rockchip_pcie_cfg_atu()
820 entry = resource_list_first_type(&bridge->windows, IORESOURCE_IO); in rockchip_pcie_cfg_atu()
822 return -ENODEV; in rockchip_pcie_cfg_atu()
827 size = resource_size(entry->res); in rockchip_pcie_cfg_atu()
828 pci_addr = entry->res->start - entry->offset; in rockchip_pcie_cfg_atu()
834 20 - 1, in rockchip_pcie_cfg_atu()
846 20 - 1, 0, 0); in rockchip_pcie_cfg_atu()
848 rockchip->msg_bus_addr += ((reg_no + offset) << 20); in rockchip_pcie_cfg_atu()
858 writel(0x0, rockchip->msg_region + PCIE_RC_SEND_PME_OFF); in rockchip_pcie_wait_l2()
861 err = readl_poll_timeout(rockchip->apb_base + PCIE_CLIENT_DEBUG_OUT_0, in rockchip_pcie_wait_l2()
865 dev_err(rockchip->dev, "PCIe link enter L2 timeout!\n"); in rockchip_pcie_wait_l2()
892 regulator_disable(rockchip->vpcie0v9); in rockchip_pcie_suspend_noirq()
902 err = regulator_enable(rockchip->vpcie0v9); in rockchip_pcie_resume_noirq()
931 regulator_disable(rockchip->vpcie0v9); in rockchip_pcie_resume_noirq()
938 struct device *dev = &pdev->dev; in rockchip_pcie_probe()
942 if (!dev->of_node) in rockchip_pcie_probe()
943 return -ENODEV; in rockchip_pcie_probe()
947 return -ENOMEM; in rockchip_pcie_probe()
952 rockchip->dev = dev; in rockchip_pcie_probe()
953 rockchip->is_rc = true; in rockchip_pcie_probe()
981 rockchip->msg_region = devm_ioremap(dev, rockchip->msg_bus_addr, SZ_1M); in rockchip_pcie_probe()
982 if (!rockchip->msg_region) { in rockchip_pcie_probe()
983 err = -ENOMEM; in rockchip_pcie_probe()
987 bridge->sysdata = rockchip; in rockchip_pcie_probe()
988 bridge->ops = &rockchip_pcie_ops; in rockchip_pcie_probe()
1003 irq_domain_remove(rockchip->irq_domain); in rockchip_pcie_probe()
1007 if (!IS_ERR(rockchip->vpcie12v)) in rockchip_pcie_probe()
1008 regulator_disable(rockchip->vpcie12v); in rockchip_pcie_probe()
1009 if (!IS_ERR(rockchip->vpcie3v3)) in rockchip_pcie_probe()
1010 regulator_disable(rockchip->vpcie3v3); in rockchip_pcie_probe()
1011 regulator_disable(rockchip->vpcie1v8); in rockchip_pcie_probe()
1012 regulator_disable(rockchip->vpcie0v9); in rockchip_pcie_probe()
1020 struct device *dev = &pdev->dev; in rockchip_pcie_remove()
1024 pci_stop_root_bus(bridge->bus); in rockchip_pcie_remove()
1025 pci_remove_root_bus(bridge->bus); in rockchip_pcie_remove()
1026 irq_domain_remove(rockchip->irq_domain); in rockchip_pcie_remove()
1032 if (!IS_ERR(rockchip->vpcie12v)) in rockchip_pcie_remove()
1033 regulator_disable(rockchip->vpcie12v); in rockchip_pcie_remove()
1034 if (!IS_ERR(rockchip->vpcie3v3)) in rockchip_pcie_remove()
1035 regulator_disable(rockchip->vpcie3v3); in rockchip_pcie_remove()
1036 regulator_disable(rockchip->vpcie1v8); in rockchip_pcie_remove()
1037 regulator_disable(rockchip->vpcie0v9); in rockchip_pcie_remove()
1048 { .compatible = "rockchip,rk3399-pcie", },
1055 .name = "rockchip-pcie",