Lines Matching full:pcie
3 * Qualcomm PCIe root complex driver
32 #include "pcie-designware.h"
183 int (*get_resources)(struct qcom_pcie *pcie);
184 int (*init)(struct qcom_pcie *pcie);
185 int (*post_init)(struct qcom_pcie *pcie);
186 void (*deinit)(struct qcom_pcie *pcie);
187 void (*post_deinit)(struct qcom_pcie *pcie);
188 void (*ltssm_enable)(struct qcom_pcie *pcie);
189 int (*config_sid)(struct qcom_pcie *pcie);
204 static void qcom_ep_reset_assert(struct qcom_pcie *pcie) in qcom_ep_reset_assert() argument
206 gpiod_set_value_cansleep(pcie->reset, 1); in qcom_ep_reset_assert()
210 static void qcom_ep_reset_deassert(struct qcom_pcie *pcie) in qcom_ep_reset_deassert() argument
214 gpiod_set_value_cansleep(pcie->reset, 0); in qcom_ep_reset_deassert()
220 struct qcom_pcie *pcie = to_qcom_pcie(pci); in qcom_pcie_start_link() local
223 if (pcie->ops->ltssm_enable) in qcom_pcie_start_link()
224 pcie->ops->ltssm_enable(pcie); in qcom_pcie_start_link()
229 static void qcom_pcie_2_1_0_ltssm_enable(struct qcom_pcie *pcie) in qcom_pcie_2_1_0_ltssm_enable() argument
234 val = readl(pcie->elbi + PCIE20_ELBI_SYS_CTRL); in qcom_pcie_2_1_0_ltssm_enable()
236 writel(val, pcie->elbi + PCIE20_ELBI_SYS_CTRL); in qcom_pcie_2_1_0_ltssm_enable()
239 static int qcom_pcie_get_resources_2_1_0(struct qcom_pcie *pcie) in qcom_pcie_get_resources_2_1_0() argument
241 struct qcom_pcie_resources_2_1_0 *res = &pcie->res.v2_1_0; in qcom_pcie_get_resources_2_1_0()
242 struct dw_pcie *pci = pcie->pci; in qcom_pcie_get_resources_2_1_0()
294 static void qcom_pcie_deinit_2_1_0(struct qcom_pcie *pcie) in qcom_pcie_deinit_2_1_0() argument
296 struct qcom_pcie_resources_2_1_0 *res = &pcie->res.v2_1_0; in qcom_pcie_deinit_2_1_0()
306 writel(1, pcie->parf + PCIE20_PARF_PHY_CTRL); in qcom_pcie_deinit_2_1_0()
311 static int qcom_pcie_init_2_1_0(struct qcom_pcie *pcie) in qcom_pcie_init_2_1_0() argument
313 struct qcom_pcie_resources_2_1_0 *res = &pcie->res.v2_1_0; in qcom_pcie_init_2_1_0()
314 struct dw_pcie *pci = pcie->pci; in qcom_pcie_init_2_1_0()
320 /* reset the PCIe interface as uboot can leave it undefined state */ in qcom_pcie_init_2_1_0()
328 writel(1, pcie->parf + PCIE20_PARF_PHY_CTRL); in qcom_pcie_init_2_1_0()
376 /* enable PCIe clocks and resets */ in qcom_pcie_init_2_1_0()
377 val = readl(pcie->parf + PCIE20_PARF_PHY_CTRL); in qcom_pcie_init_2_1_0()
379 writel(val, pcie->parf + PCIE20_PARF_PHY_CTRL); in qcom_pcie_init_2_1_0()
381 if (of_device_is_compatible(node, "qcom,pcie-ipq8064") || in qcom_pcie_init_2_1_0()
382 of_device_is_compatible(node, "qcom,pcie-ipq8064-v2")) { in qcom_pcie_init_2_1_0()
386 pcie->parf + PCIE20_PARF_PCS_DEEMPH); in qcom_pcie_init_2_1_0()
389 pcie->parf + PCIE20_PARF_PCS_SWING); in qcom_pcie_init_2_1_0()
390 writel(PHY_RX0_EQ(4), pcie->parf + PCIE20_PARF_CONFIG_BITS); in qcom_pcie_init_2_1_0()
393 if (of_device_is_compatible(node, "qcom,pcie-ipq8064")) { in qcom_pcie_init_2_1_0()
395 val = readl(pcie->parf + PCIE20_PARF_PHY_CTRL); in qcom_pcie_init_2_1_0()
398 writel(val, pcie->parf + PCIE20_PARF_PHY_CTRL); in qcom_pcie_init_2_1_0()
402 val = readl(pcie->parf + PCIE20_PARF_PHY_REFCLK); in qcom_pcie_init_2_1_0()
404 if (!of_device_is_compatible(node, "qcom,pcie-apq8064")) in qcom_pcie_init_2_1_0()
407 writel(val, pcie->parf + PCIE20_PARF_PHY_REFCLK); in qcom_pcie_init_2_1_0()
438 static int qcom_pcie_get_resources_1_0_0(struct qcom_pcie *pcie) in qcom_pcie_get_resources_1_0_0() argument
440 struct qcom_pcie_resources_1_0_0 *res = &pcie->res.v1_0_0; in qcom_pcie_get_resources_1_0_0()
441 struct dw_pcie *pci = pcie->pci; in qcom_pcie_get_resources_1_0_0()
468 static void qcom_pcie_deinit_1_0_0(struct qcom_pcie *pcie) in qcom_pcie_deinit_1_0_0() argument
470 struct qcom_pcie_resources_1_0_0 *res = &pcie->res.v1_0_0; in qcom_pcie_deinit_1_0_0()
480 static int qcom_pcie_init_1_0_0(struct qcom_pcie *pcie) in qcom_pcie_init_1_0_0() argument
482 struct qcom_pcie_resources_1_0_0 *res = &pcie->res.v1_0_0; in qcom_pcie_init_1_0_0()
483 struct dw_pcie *pci = pcie->pci; in qcom_pcie_init_1_0_0()
524 writel(0, pcie->parf + PCIE20_PARF_DBI_BASE_ADDR); in qcom_pcie_init_1_0_0()
527 u32 val = readl(pcie->parf + PCIE20_PARF_AXI_MSTR_WR_ADDR_HALT); in qcom_pcie_init_1_0_0()
530 writel(val, pcie->parf + PCIE20_PARF_AXI_MSTR_WR_ADDR_HALT); in qcom_pcie_init_1_0_0()
548 static void qcom_pcie_2_3_2_ltssm_enable(struct qcom_pcie *pcie) in qcom_pcie_2_3_2_ltssm_enable() argument
553 val = readl(pcie->parf + PCIE20_PARF_LTSSM); in qcom_pcie_2_3_2_ltssm_enable()
555 writel(val, pcie->parf + PCIE20_PARF_LTSSM); in qcom_pcie_2_3_2_ltssm_enable()
558 static int qcom_pcie_get_resources_2_3_2(struct qcom_pcie *pcie) in qcom_pcie_get_resources_2_3_2() argument
560 struct qcom_pcie_resources_2_3_2 *res = &pcie->res.v2_3_2; in qcom_pcie_get_resources_2_3_2()
561 struct dw_pcie *pci = pcie->pci; in qcom_pcie_get_resources_2_3_2()
592 static void qcom_pcie_deinit_2_3_2(struct qcom_pcie *pcie) in qcom_pcie_deinit_2_3_2() argument
594 struct qcom_pcie_resources_2_3_2 *res = &pcie->res.v2_3_2; in qcom_pcie_deinit_2_3_2()
604 static void qcom_pcie_post_deinit_2_3_2(struct qcom_pcie *pcie) in qcom_pcie_post_deinit_2_3_2() argument
606 struct qcom_pcie_resources_2_3_2 *res = &pcie->res.v2_3_2; in qcom_pcie_post_deinit_2_3_2()
611 static int qcom_pcie_init_2_3_2(struct qcom_pcie *pcie) in qcom_pcie_init_2_3_2() argument
613 struct qcom_pcie_resources_2_3_2 *res = &pcie->res.v2_3_2; in qcom_pcie_init_2_3_2()
614 struct dw_pcie *pci = pcie->pci; in qcom_pcie_init_2_3_2()
649 /* enable PCIe clocks and resets */ in qcom_pcie_init_2_3_2()
650 val = readl(pcie->parf + PCIE20_PARF_PHY_CTRL); in qcom_pcie_init_2_3_2()
652 writel(val, pcie->parf + PCIE20_PARF_PHY_CTRL); in qcom_pcie_init_2_3_2()
655 writel(0, pcie->parf + PCIE20_PARF_DBI_BASE_ADDR); in qcom_pcie_init_2_3_2()
658 val = readl(pcie->parf + PCIE20_PARF_SYS_CTRL); in qcom_pcie_init_2_3_2()
660 writel(val, pcie->parf + PCIE20_PARF_SYS_CTRL); in qcom_pcie_init_2_3_2()
662 val = readl(pcie->parf + PCIE20_PARF_MHI_CLOCK_RESET_CTRL); in qcom_pcie_init_2_3_2()
664 writel(val, pcie->parf + PCIE20_PARF_MHI_CLOCK_RESET_CTRL); in qcom_pcie_init_2_3_2()
666 val = readl(pcie->parf + PCIE20_PARF_AXI_MSTR_WR_ADDR_HALT_V2); in qcom_pcie_init_2_3_2()
668 writel(val, pcie->parf + PCIE20_PARF_AXI_MSTR_WR_ADDR_HALT_V2); in qcom_pcie_init_2_3_2()
685 static int qcom_pcie_post_init_2_3_2(struct qcom_pcie *pcie) in qcom_pcie_post_init_2_3_2() argument
687 struct qcom_pcie_resources_2_3_2 *res = &pcie->res.v2_3_2; in qcom_pcie_post_init_2_3_2()
688 struct dw_pcie *pci = pcie->pci; in qcom_pcie_post_init_2_3_2()
701 static int qcom_pcie_get_resources_2_4_0(struct qcom_pcie *pcie) in qcom_pcie_get_resources_2_4_0() argument
703 struct qcom_pcie_resources_2_4_0 *res = &pcie->res.v2_4_0; in qcom_pcie_get_resources_2_4_0()
704 struct dw_pcie *pci = pcie->pci; in qcom_pcie_get_resources_2_4_0()
706 bool is_ipq = of_device_is_compatible(dev->of_node, "qcom,pcie-ipq4019"); in qcom_pcie_get_resources_2_4_0()
714 /* qcom,pcie-ipq4019 is defined without "iface" */ in qcom_pcie_get_resources_2_4_0()
784 static void qcom_pcie_deinit_2_4_0(struct qcom_pcie *pcie) in qcom_pcie_deinit_2_4_0() argument
786 struct qcom_pcie_resources_2_4_0 *res = &pcie->res.v2_4_0; in qcom_pcie_deinit_2_4_0()
800 static int qcom_pcie_init_2_4_0(struct qcom_pcie *pcie) in qcom_pcie_init_2_4_0() argument
802 struct qcom_pcie_resources_2_4_0 *res = &pcie->res.v2_4_0; in qcom_pcie_init_2_4_0()
803 struct dw_pcie *pci = pcie->pci; in qcom_pcie_init_2_4_0()
930 /* enable PCIe clocks and resets */ in qcom_pcie_init_2_4_0()
931 val = readl(pcie->parf + PCIE20_PARF_PHY_CTRL); in qcom_pcie_init_2_4_0()
933 writel(val, pcie->parf + PCIE20_PARF_PHY_CTRL); in qcom_pcie_init_2_4_0()
936 writel(0, pcie->parf + PCIE20_PARF_DBI_BASE_ADDR); in qcom_pcie_init_2_4_0()
939 val = readl(pcie->parf + PCIE20_PARF_SYS_CTRL); in qcom_pcie_init_2_4_0()
941 writel(val, pcie->parf + PCIE20_PARF_SYS_CTRL); in qcom_pcie_init_2_4_0()
943 val = readl(pcie->parf + PCIE20_PARF_MHI_CLOCK_RESET_CTRL); in qcom_pcie_init_2_4_0()
945 writel(val, pcie->parf + PCIE20_PARF_MHI_CLOCK_RESET_CTRL); in qcom_pcie_init_2_4_0()
947 val = readl(pcie->parf + PCIE20_PARF_AXI_MSTR_WR_ADDR_HALT_V2); in qcom_pcie_init_2_4_0()
949 writel(val, pcie->parf + PCIE20_PARF_AXI_MSTR_WR_ADDR_HALT_V2); in qcom_pcie_init_2_4_0()
974 static int qcom_pcie_get_resources_2_3_3(struct qcom_pcie *pcie) in qcom_pcie_get_resources_2_3_3() argument
976 struct qcom_pcie_resources_2_3_3 *res = &pcie->res.v2_3_3; in qcom_pcie_get_resources_2_3_3()
977 struct dw_pcie *pci = pcie->pci; in qcom_pcie_get_resources_2_3_3()
1013 static void qcom_pcie_deinit_2_3_3(struct qcom_pcie *pcie) in qcom_pcie_deinit_2_3_3() argument
1015 struct qcom_pcie_resources_2_3_3 *res = &pcie->res.v2_3_3; in qcom_pcie_deinit_2_3_3()
1024 static int qcom_pcie_init_2_3_3(struct qcom_pcie *pcie) in qcom_pcie_init_2_3_3() argument
1026 struct qcom_pcie_resources_2_3_3 *res = &pcie->res.v2_3_3; in qcom_pcie_init_2_3_3()
1027 struct dw_pcie *pci = pcie->pci; in qcom_pcie_init_2_3_3()
1089 pcie->parf + PCIE20_v3_PARF_SLV_ADDR_SPACE_SIZE); in qcom_pcie_init_2_3_3()
1091 val = readl(pcie->parf + PCIE20_PARF_PHY_CTRL); in qcom_pcie_init_2_3_3()
1093 writel(val, pcie->parf + PCIE20_PARF_PHY_CTRL); in qcom_pcie_init_2_3_3()
1095 writel(0, pcie->parf + PCIE20_PARF_DBI_BASE_ADDR); in qcom_pcie_init_2_3_3()
1100 pcie->parf + PCIE20_PARF_SYS_CTRL); in qcom_pcie_init_2_3_3()
1101 writel(0, pcie->parf + PCIE20_PARF_Q2A_FLUSH); in qcom_pcie_init_2_3_3()
1135 static int qcom_pcie_get_resources_2_7_0(struct qcom_pcie *pcie) in qcom_pcie_get_resources_2_7_0() argument
1137 struct qcom_pcie_resources_2_7_0 *res = &pcie->res.v2_7_0; in qcom_pcie_get_resources_2_7_0()
1138 struct dw_pcie *pci = pcie->pci; in qcom_pcie_get_resources_2_7_0()
1159 if (of_device_is_compatible(dev->of_node, "qcom,pcie-sm8250")) { in qcom_pcie_get_resources_2_7_0()
1174 static int qcom_pcie_init_2_7_0(struct qcom_pcie *pcie) in qcom_pcie_init_2_7_0() argument
1176 struct qcom_pcie_resources_2_7_0 *res = &pcie->res.v2_7_0; in qcom_pcie_init_2_7_0()
1177 struct dw_pcie *pci = pcie->pci; in qcom_pcie_init_2_7_0()
1212 /* configure PCIe to RC mode */ in qcom_pcie_init_2_7_0()
1213 writel(DEVICE_TYPE_RC, pcie->parf + PCIE20_PARF_DEVICE_TYPE); in qcom_pcie_init_2_7_0()
1215 /* enable PCIe clocks and resets */ in qcom_pcie_init_2_7_0()
1216 val = readl(pcie->parf + PCIE20_PARF_PHY_CTRL); in qcom_pcie_init_2_7_0()
1218 writel(val, pcie->parf + PCIE20_PARF_PHY_CTRL); in qcom_pcie_init_2_7_0()
1221 writel(0, pcie->parf + PCIE20_PARF_DBI_BASE_ADDR); in qcom_pcie_init_2_7_0()
1224 val = readl(pcie->parf + PCIE20_PARF_SYS_CTRL); in qcom_pcie_init_2_7_0()
1226 writel(val, pcie->parf + PCIE20_PARF_SYS_CTRL); in qcom_pcie_init_2_7_0()
1228 val = readl(pcie->parf + PCIE20_PARF_MHI_CLOCK_RESET_CTRL); in qcom_pcie_init_2_7_0()
1230 writel(val, pcie->parf + PCIE20_PARF_MHI_CLOCK_RESET_CTRL); in qcom_pcie_init_2_7_0()
1233 val = readl(pcie->parf + PCIE20_PARF_AXI_MSTR_WR_ADDR_HALT); in qcom_pcie_init_2_7_0()
1235 writel(val, pcie->parf + PCIE20_PARF_AXI_MSTR_WR_ADDR_HALT); in qcom_pcie_init_2_7_0()
1247 static void qcom_pcie_deinit_2_7_0(struct qcom_pcie *pcie) in qcom_pcie_deinit_2_7_0() argument
1249 struct qcom_pcie_resources_2_7_0 *res = &pcie->res.v2_7_0; in qcom_pcie_deinit_2_7_0()
1255 static int qcom_pcie_post_init_2_7_0(struct qcom_pcie *pcie) in qcom_pcie_post_init_2_7_0() argument
1257 struct qcom_pcie_resources_2_7_0 *res = &pcie->res.v2_7_0; in qcom_pcie_post_init_2_7_0()
1262 static void qcom_pcie_post_deinit_2_7_0(struct qcom_pcie *pcie) in qcom_pcie_post_deinit_2_7_0() argument
1264 struct qcom_pcie_resources_2_7_0 *res = &pcie->res.v2_7_0; in qcom_pcie_post_deinit_2_7_0()
1277 static int qcom_pcie_config_sid_sm8250(struct qcom_pcie *pcie) in qcom_pcie_config_sid_sm8250() argument
1286 void __iomem *bdf_to_sid_base = pcie->parf + PCIE20_PARF_BDF_TO_SID_TABLE_N; in qcom_pcie_config_sid_sm8250()
1287 struct device *dev = pcie->pci->dev; in qcom_pcie_config_sid_sm8250()
1351 struct qcom_pcie *pcie = to_qcom_pcie(pci); in qcom_pcie_host_init() local
1354 qcom_ep_reset_assert(pcie); in qcom_pcie_host_init()
1356 ret = pcie->ops->init(pcie); in qcom_pcie_host_init()
1360 ret = phy_power_on(pcie->phy); in qcom_pcie_host_init()
1364 if (pcie->ops->post_init) { in qcom_pcie_host_init()
1365 ret = pcie->ops->post_init(pcie); in qcom_pcie_host_init()
1370 qcom_ep_reset_deassert(pcie); in qcom_pcie_host_init()
1372 if (pcie->ops->config_sid) { in qcom_pcie_host_init()
1373 ret = pcie->ops->config_sid(pcie); in qcom_pcie_host_init()
1381 qcom_ep_reset_assert(pcie); in qcom_pcie_host_init()
1382 if (pcie->ops->post_deinit) in qcom_pcie_host_init()
1383 pcie->ops->post_deinit(pcie); in qcom_pcie_host_init()
1385 phy_power_off(pcie->phy); in qcom_pcie_host_init()
1387 pcie->ops->deinit(pcie); in qcom_pcie_host_init()
1469 struct qcom_pcie *pcie; in qcom_pcie_probe() local
1472 pcie = devm_kzalloc(dev, sizeof(*pcie), GFP_KERNEL); in qcom_pcie_probe()
1473 if (!pcie) in qcom_pcie_probe()
1489 pcie->pci = pci; in qcom_pcie_probe()
1491 pcie->ops = of_device_get_match_data(dev); in qcom_pcie_probe()
1493 pcie->reset = devm_gpiod_get_optional(dev, "perst", GPIOD_OUT_HIGH); in qcom_pcie_probe()
1494 if (IS_ERR(pcie->reset)) { in qcom_pcie_probe()
1495 ret = PTR_ERR(pcie->reset); in qcom_pcie_probe()
1499 pcie->parf = devm_platform_ioremap_resource_byname(pdev, "parf"); in qcom_pcie_probe()
1500 if (IS_ERR(pcie->parf)) { in qcom_pcie_probe()
1501 ret = PTR_ERR(pcie->parf); in qcom_pcie_probe()
1505 pcie->elbi = devm_platform_ioremap_resource_byname(pdev, "elbi"); in qcom_pcie_probe()
1506 if (IS_ERR(pcie->elbi)) { in qcom_pcie_probe()
1507 ret = PTR_ERR(pcie->elbi); in qcom_pcie_probe()
1511 pcie->phy = devm_phy_optional_get(dev, "pciephy"); in qcom_pcie_probe()
1512 if (IS_ERR(pcie->phy)) { in qcom_pcie_probe()
1513 ret = PTR_ERR(pcie->phy); in qcom_pcie_probe()
1517 ret = pcie->ops->get_resources(pcie); in qcom_pcie_probe()
1523 ret = phy_init(pcie->phy); in qcom_pcie_probe()
1529 platform_set_drvdata(pdev, pcie); in qcom_pcie_probe()
1548 { .compatible = "qcom,pcie-apq8084", .data = &ops_1_0_0 },
1549 { .compatible = "qcom,pcie-ipq8064", .data = &ops_2_1_0 },
1550 { .compatible = "qcom,pcie-ipq8064-v2", .data = &ops_2_1_0 },
1551 { .compatible = "qcom,pcie-apq8064", .data = &ops_2_1_0 },
1552 { .compatible = "qcom,pcie-msm8996", .data = &ops_2_3_2 },
1553 { .compatible = "qcom,pcie-ipq8074", .data = &ops_2_3_3 },
1554 { .compatible = "qcom,pcie-ipq4019", .data = &ops_2_4_0 },
1555 { .compatible = "qcom,pcie-qcs404", .data = &ops_2_4_0 },
1556 { .compatible = "qcom,pcie-sdm845", .data = &ops_2_7_0 },
1557 { .compatible = "qcom,pcie-sm8250", .data = &ops_1_9_0 },
1576 .name = "qcom-pcie",