Lines Matching +full:max +full:- +full:outbound +full:- +full:regions
1 // SPDX-License-Identifier: GPL-2.0
20 #include <linux/pcie-dwc.h>
26 #include "pcie-designware.h"
48 [DW_PCIE_NON_STICKY_RST] = "non-sticky",
62 pci->app_clks[i].id = dw_pcie_app_clks[i]; in dw_pcie_get_clocks()
65 pci->core_clks[i].id = dw_pcie_core_clks[i]; in dw_pcie_get_clocks()
67 ret = devm_clk_bulk_get_optional(pci->dev, DW_PCIE_NUM_APP_CLKS, in dw_pcie_get_clocks()
68 pci->app_clks); in dw_pcie_get_clocks()
72 return devm_clk_bulk_get_optional(pci->dev, DW_PCIE_NUM_CORE_CLKS, in dw_pcie_get_clocks()
73 pci->core_clks); in dw_pcie_get_clocks()
81 pci->app_rsts[i].id = dw_pcie_app_rsts[i]; in dw_pcie_get_resets()
84 pci->core_rsts[i].id = dw_pcie_core_rsts[i]; in dw_pcie_get_resets()
86 ret = devm_reset_control_bulk_get_optional_shared(pci->dev, in dw_pcie_get_resets()
88 pci->app_rsts); in dw_pcie_get_resets()
92 ret = devm_reset_control_bulk_get_optional_exclusive(pci->dev, in dw_pcie_get_resets()
94 pci->core_rsts); in dw_pcie_get_resets()
98 pci->pe_rst = devm_gpiod_get_optional(pci->dev, "reset", GPIOD_OUT_HIGH); in dw_pcie_get_resets()
99 if (IS_ERR(pci->pe_rst)) in dw_pcie_get_resets()
100 return PTR_ERR(pci->pe_rst); in dw_pcie_get_resets()
107 struct platform_device *pdev = to_platform_device(pci->dev); in dw_pcie_get_resources()
108 struct device_node *np = dev_of_node(pci->dev); in dw_pcie_get_resources()
112 if (!pci->dbi_base) { in dw_pcie_get_resources()
114 pci->dbi_base = devm_pci_remap_cfg_resource(pci->dev, res); in dw_pcie_get_resources()
115 if (IS_ERR(pci->dbi_base)) in dw_pcie_get_resources()
116 return PTR_ERR(pci->dbi_base); in dw_pcie_get_resources()
117 pci->dbi_phys_addr = res->start; in dw_pcie_get_resources()
121 if (!pci->dbi_base2) { in dw_pcie_get_resources()
124 pci->dbi_base2 = devm_pci_remap_cfg_resource(pci->dev, res); in dw_pcie_get_resources()
125 if (IS_ERR(pci->dbi_base2)) in dw_pcie_get_resources()
126 return PTR_ERR(pci->dbi_base2); in dw_pcie_get_resources()
128 pci->dbi_base2 = pci->dbi_base + SZ_4K; in dw_pcie_get_resources()
132 /* For non-unrolled iATU/eDMA platforms this range will be ignored */ in dw_pcie_get_resources()
133 if (!pci->atu_base) { in dw_pcie_get_resources()
136 pci->atu_size = resource_size(res); in dw_pcie_get_resources()
137 pci->atu_base = devm_ioremap_resource(pci->dev, res); in dw_pcie_get_resources()
138 if (IS_ERR(pci->atu_base)) in dw_pcie_get_resources()
139 return PTR_ERR(pci->atu_base); in dw_pcie_get_resources()
140 pci->atu_phys_addr = res->start; in dw_pcie_get_resources()
142 pci->atu_base = pci->dbi_base + DEFAULT_DBI_ATU_OFFSET; in dw_pcie_get_resources()
147 if (!pci->atu_size) in dw_pcie_get_resources()
148 pci->atu_size = SZ_4K; in dw_pcie_get_resources()
151 if (!pci->edma.reg_base) { in dw_pcie_get_resources()
154 pci->edma.reg_base = devm_ioremap_resource(pci->dev, res); in dw_pcie_get_resources()
155 if (IS_ERR(pci->edma.reg_base)) in dw_pcie_get_resources()
156 return PTR_ERR(pci->edma.reg_base); in dw_pcie_get_resources()
157 } else if (pci->atu_size >= 2 * DEFAULT_DBI_DMA_OFFSET) { in dw_pcie_get_resources()
158 pci->edma.reg_base = pci->atu_base + DEFAULT_DBI_DMA_OFFSET; in dw_pcie_get_resources()
173 if (pci->max_link_speed < 1) in dw_pcie_get_resources()
174 pci->max_link_speed = of_pci_get_max_link_speed(np); in dw_pcie_get_resources()
176 of_property_read_u32(np, "num-lanes", &pci->num_lanes); in dw_pcie_get_resources()
178 if (of_property_read_bool(np, "snps,enable-cdm-check")) in dw_pcie_get_resources()
193 if (pci->version && pci->version != ver) in dw_pcie_version_detect()
194 dev_warn(pci->dev, "Versions don't match (%08x != %08x)\n", in dw_pcie_version_detect()
195 pci->version, ver); in dw_pcie_version_detect()
197 pci->version = ver; in dw_pcie_version_detect()
201 if (pci->type && pci->type != ver) in dw_pcie_version_detect()
202 dev_warn(pci->dev, "Types don't match (%08x != %08x)\n", in dw_pcie_version_detect()
203 pci->type, ver); in dw_pcie_version_detect()
205 pci->type = ver; in dw_pcie_version_detect()
255 ttl = (PCI_CFG_SPACE_EXP_SIZE - PCI_CFG_SPACE_SIZE) / 8; in dw_pcie_find_next_ext_capability()
268 while (ttl-- > 0) { in dw_pcie_find_next_ext_capability()
314 for (vid = vsec_ids; vid->vendor_id; vid++) { in dw_pcie_find_vsec_capability()
315 vsec = __dw_pcie_find_vsec_capability(pci, vid->vendor_id, in dw_pcie_find_vsec_capability()
316 vid->vsec_id); in dw_pcie_find_vsec_capability()
319 if (PCI_VNDR_HEADER_REV(header) == vid->vsec_rev) in dw_pcie_find_vsec_capability()
378 if (pci->ops && pci->ops->read_dbi) in dw_pcie_read_dbi()
379 return pci->ops->read_dbi(pci, pci->dbi_base, reg, size); in dw_pcie_read_dbi()
381 ret = dw_pcie_read(pci->dbi_base + reg, size, &val); in dw_pcie_read_dbi()
383 dev_err(pci->dev, "Read DBI address failed\n"); in dw_pcie_read_dbi()
393 if (pci->ops && pci->ops->write_dbi) { in dw_pcie_write_dbi()
394 pci->ops->write_dbi(pci, pci->dbi_base, reg, size, val); in dw_pcie_write_dbi()
398 ret = dw_pcie_write(pci->dbi_base + reg, size, val); in dw_pcie_write_dbi()
400 dev_err(pci->dev, "Write DBI address failed\n"); in dw_pcie_write_dbi()
408 if (pci->ops && pci->ops->write_dbi2) { in dw_pcie_write_dbi2()
409 pci->ops->write_dbi2(pci, pci->dbi_base2, reg, size, val); in dw_pcie_write_dbi2()
413 ret = dw_pcie_write(pci->dbi_base2 + reg, size, val); in dw_pcie_write_dbi2()
415 dev_err(pci->dev, "write DBI address failed\n"); in dw_pcie_write_dbi2()
423 return pci->atu_base + PCIE_ATU_UNROLL_BASE(dir, index); in dw_pcie_select_atu()
426 return pci->atu_base; in dw_pcie_select_atu()
437 if (pci->ops && pci->ops->read_dbi) in dw_pcie_readl_atu()
438 return pci->ops->read_dbi(pci, base, reg, 4); in dw_pcie_readl_atu()
442 dev_err(pci->dev, "Read ATU address failed\n"); in dw_pcie_readl_atu()
455 if (pci->ops && pci->ops->write_dbi) { in dw_pcie_writel_atu()
456 pci->ops->write_dbi(pci, base, reg, 4, val); in dw_pcie_writel_atu()
462 dev_err(pci->dev, "Write ATU address failed\n"); in dw_pcie_writel_atu()
480 * bit in the Control register-1 of the ATU outbound region acts in dw_pcie_enable_ecrc()
499 * on Root Port:- TLP Digest (DWord size) gets appended to each packet in dw_pcie_enable_ecrc()
504 * on End Point:- TLP Digest is received for some/all the packets coming in dw_pcie_enable_ecrc()
520 u64 parent_bus_addr = atu->parent_bus_addr; in dw_pcie_prog_outbound_atu()
524 limit_addr = parent_bus_addr + atu->size - 1; in dw_pcie_prog_outbound_atu()
526 if ((limit_addr & ~pci->region_limit) != (parent_bus_addr & ~pci->region_limit) || in dw_pcie_prog_outbound_atu()
527 !IS_ALIGNED(parent_bus_addr, pci->region_align) || in dw_pcie_prog_outbound_atu()
528 !IS_ALIGNED(atu->pci_addr, pci->region_align) || !atu->size) { in dw_pcie_prog_outbound_atu()
529 return -EINVAL; in dw_pcie_prog_outbound_atu()
532 dw_pcie_writel_atu_ob(pci, atu->index, PCIE_ATU_LOWER_BASE, in dw_pcie_prog_outbound_atu()
534 dw_pcie_writel_atu_ob(pci, atu->index, PCIE_ATU_UPPER_BASE, in dw_pcie_prog_outbound_atu()
537 dw_pcie_writel_atu_ob(pci, atu->index, PCIE_ATU_LIMIT, in dw_pcie_prog_outbound_atu()
540 dw_pcie_writel_atu_ob(pci, atu->index, PCIE_ATU_UPPER_LIMIT, in dw_pcie_prog_outbound_atu()
543 dw_pcie_writel_atu_ob(pci, atu->index, PCIE_ATU_LOWER_TARGET, in dw_pcie_prog_outbound_atu()
544 lower_32_bits(atu->pci_addr)); in dw_pcie_prog_outbound_atu()
545 dw_pcie_writel_atu_ob(pci, atu->index, PCIE_ATU_UPPER_TARGET, in dw_pcie_prog_outbound_atu()
546 upper_32_bits(atu->pci_addr)); in dw_pcie_prog_outbound_atu()
548 val = atu->type | atu->routing | PCIE_ATU_FUNC_NUM(atu->func_no); in dw_pcie_prog_outbound_atu()
554 dw_pcie_writel_atu_ob(pci, atu->index, PCIE_ATU_REGION_CTRL1, val); in dw_pcie_prog_outbound_atu()
557 if (atu->type == PCIE_ATU_TYPE_MSG) { in dw_pcie_prog_outbound_atu()
558 /* The data-less messages only for now */ in dw_pcie_prog_outbound_atu()
559 val |= PCIE_ATU_INHIBIT_PAYLOAD | atu->code; in dw_pcie_prog_outbound_atu()
561 dw_pcie_writel_atu_ob(pci, atu->index, PCIE_ATU_REGION_CTRL2, val); in dw_pcie_prog_outbound_atu()
568 val = dw_pcie_readl_atu_ob(pci, atu->index, PCIE_ATU_REGION_CTRL2); in dw_pcie_prog_outbound_atu()
575 dev_err(pci->dev, "Outbound iATU is not being enabled\n"); in dw_pcie_prog_outbound_atu()
577 return -ETIMEDOUT; in dw_pcie_prog_outbound_atu()
594 u64 limit_addr = pci_addr + size - 1; in dw_pcie_prog_inbound_atu()
597 if ((limit_addr & ~pci->region_limit) != (pci_addr & ~pci->region_limit) || in dw_pcie_prog_inbound_atu()
598 !IS_ALIGNED(parent_bus_addr, pci->region_align) || in dw_pcie_prog_inbound_atu()
599 !IS_ALIGNED(pci_addr, pci->region_align) || !size) { in dw_pcie_prog_inbound_atu()
600 return -EINVAL; in dw_pcie_prog_inbound_atu()
638 dev_err(pci->dev, "Inbound iATU is not being enabled\n"); in dw_pcie_prog_inbound_atu()
640 return -ETIMEDOUT; in dw_pcie_prog_inbound_atu()
648 if (!IS_ALIGNED(parent_bus_addr, pci->region_align) || in dw_pcie_prog_ep_inbound_atu()
650 return -EINVAL; in dw_pcie_prog_ep_inbound_atu()
675 dev_err(pci->dev, "Inbound iATU is not being enabled\n"); in dw_pcie_prog_ep_inbound_atu()
677 return -ETIMEDOUT; in dw_pcie_prog_ep_inbound_atu()
699 dev_info(pci->dev, "Phy link never came up\n"); in dw_pcie_wait_for_link()
700 return -ETIMEDOUT; in dw_pcie_wait_for_link()
706 dev_info(pci->dev, "PCIe Gen.%u x%u link up\n", in dw_pcie_wait_for_link()
718 if (pci->ops && pci->ops->link_up) in dw_pcie_link_up()
719 return pci->ops->link_up(pci); in dw_pcie_link_up()
749 if (pci->max_link_speed < 1) { in dw_pcie_link_set_max_speed()
750 pci->max_link_speed = FIELD_GET(PCI_EXP_LNKCAP_SLS, cap); in dw_pcie_link_set_max_speed()
757 switch (pcie_link_speed[pci->max_link_speed]) { in dw_pcie_link_set_max_speed()
818 dev_err(pci->dev, "num-lanes %u: invalid value\n", num_lanes); in dw_pcie_link_set_max_link_width()
835 u64 max; in dw_pcie_iatu_detect() local
841 max_region = min((int)pci->atu_size / 512, 256); in dw_pcie_iatu_detect()
843 pci->atu_base = pci->dbi_base + PCIE_ATU_VIEWPORT_BASE; in dw_pcie_iatu_detect()
844 pci->atu_size = PCIE_ATU_VIEWPORT_SIZE; in dw_pcie_iatu_detect()
869 dev_err(pci->dev, "No iATU regions found\n"); in dw_pcie_iatu_detect()
878 max = dw_pcie_readl_atu(pci, dir, 0, PCIE_ATU_UPPER_LIMIT); in dw_pcie_iatu_detect()
880 max = 0; in dw_pcie_iatu_detect()
883 pci->num_ob_windows = ob; in dw_pcie_iatu_detect()
884 pci->num_ib_windows = ib; in dw_pcie_iatu_detect()
885 pci->region_align = 1 << fls(min); in dw_pcie_iatu_detect()
886 pci->region_limit = (max << 32) | (SZ_4G - 1); in dw_pcie_iatu_detect()
888 dev_info(pci->dev, "iATU: unroll %s, %u ob, %u ib, align %uK, limit %lluG\n", in dw_pcie_iatu_detect()
890 pci->num_ob_windows, pci->num_ib_windows, in dw_pcie_iatu_detect()
891 pci->region_align / SZ_1K, (pci->region_limit + 1) / SZ_1G); in dw_pcie_iatu_detect()
899 if (pci->ops && pci->ops->read_dbi) in dw_pcie_readl_dma()
900 return pci->ops->read_dbi(pci, pci->edma.reg_base, reg, 4); in dw_pcie_readl_dma()
902 ret = dw_pcie_read(pci->edma.reg_base + reg, 4, &val); in dw_pcie_readl_dma()
904 dev_err(pci->dev, "Read DMA address failed\n"); in dw_pcie_readl_dma()
916 return -EINVAL; in dw_pcie_edma_irq_vector()
933 pci->edma.dev = pci->dev; in dw_pcie_edma_init_data()
935 if (!pci->edma.ops) in dw_pcie_edma_init_data()
936 pci->edma.ops = &dw_pcie_edma_ops; in dw_pcie_edma_init_data()
938 pci->edma.flags |= DW_EDMA_CHIP_LOCAL; in dw_pcie_edma_init_data()
950 if (pci->edma.mf != EDMA_MF_EDMA_LEGACY) in dw_pcie_edma_find_mf()
951 return pci->edma.reg_base ? 0 : -ENODEV; in dw_pcie_edma_find_mf()
963 if (val == 0xFFFFFFFF && pci->edma.reg_base) { in dw_pcie_edma_find_mf()
964 pci->edma.mf = EDMA_MF_EDMA_UNROLL; in dw_pcie_edma_find_mf()
966 pci->edma.mf = EDMA_MF_EDMA_LEGACY; in dw_pcie_edma_find_mf()
968 pci->edma.reg_base = pci->dbi_base + PCIE_DMA_VIEWPORT_BASE; in dw_pcie_edma_find_mf()
970 return -ENODEV; in dw_pcie_edma_find_mf()
981 * Autodetect the read/write channels count only for non-HDMA platforms. in dw_pcie_edma_find_channels()
986 if (pci->edma.mf != EDMA_MF_HDMA_NATIVE) { in dw_pcie_edma_find_channels()
989 pci->edma.ll_wr_cnt = FIELD_GET(PCIE_DMA_NUM_WR_CHAN, val); in dw_pcie_edma_find_channels()
990 pci->edma.ll_rd_cnt = FIELD_GET(PCIE_DMA_NUM_RD_CHAN, val); in dw_pcie_edma_find_channels()
994 if (!pci->edma.ll_wr_cnt || pci->edma.ll_wr_cnt > EDMA_MAX_WR_CH || in dw_pcie_edma_find_channels()
995 !pci->edma.ll_rd_cnt || pci->edma.ll_rd_cnt > EDMA_MAX_RD_CH) in dw_pcie_edma_find_channels()
996 return -EINVAL; in dw_pcie_edma_find_channels()
1016 struct platform_device *pdev = to_platform_device(pci->dev); in dw_pcie_edma_irq_verify()
1017 u16 ch_cnt = pci->edma.ll_wr_cnt + pci->edma.ll_rd_cnt; in dw_pcie_edma_irq_verify()
1021 if (pci->edma.nr_irqs == 1) in dw_pcie_edma_irq_verify()
1023 else if (pci->edma.nr_irqs > 1) in dw_pcie_edma_irq_verify()
1024 return pci->edma.nr_irqs != ch_cnt ? -EINVAL : 0; in dw_pcie_edma_irq_verify()
1028 pci->edma.nr_irqs = 1; in dw_pcie_edma_irq_verify()
1032 for (; pci->edma.nr_irqs < ch_cnt; pci->edma.nr_irqs++) { in dw_pcie_edma_irq_verify()
1033 snprintf(name, sizeof(name), "dma%d", pci->edma.nr_irqs); in dw_pcie_edma_irq_verify()
1037 return -EINVAL; in dw_pcie_edma_irq_verify()
1049 for (i = 0; i < pci->edma.ll_wr_cnt; i++) { in dw_pcie_edma_ll_alloc()
1050 ll = &pci->edma.ll_region_wr[i]; in dw_pcie_edma_ll_alloc()
1051 ll->sz = DMA_LLP_MEM_SIZE; in dw_pcie_edma_ll_alloc()
1052 ll->vaddr.mem = dmam_alloc_coherent(pci->dev, ll->sz, in dw_pcie_edma_ll_alloc()
1054 if (!ll->vaddr.mem) in dw_pcie_edma_ll_alloc()
1055 return -ENOMEM; in dw_pcie_edma_ll_alloc()
1057 ll->paddr = paddr; in dw_pcie_edma_ll_alloc()
1060 for (i = 0; i < pci->edma.ll_rd_cnt; i++) { in dw_pcie_edma_ll_alloc()
1061 ll = &pci->edma.ll_region_rd[i]; in dw_pcie_edma_ll_alloc()
1062 ll->sz = DMA_LLP_MEM_SIZE; in dw_pcie_edma_ll_alloc()
1063 ll->vaddr.mem = dmam_alloc_coherent(pci->dev, ll->sz, in dw_pcie_edma_ll_alloc()
1065 if (!ll->vaddr.mem) in dw_pcie_edma_ll_alloc()
1066 return -ENOMEM; in dw_pcie_edma_ll_alloc()
1068 ll->paddr = paddr; in dw_pcie_edma_ll_alloc()
1086 dev_err(pci->dev, "Invalid eDMA IRQs found\n"); in dw_pcie_edma_detect()
1092 dev_err(pci->dev, "Couldn't allocate LLP memory\n"); in dw_pcie_edma_detect()
1097 ret = dw_edma_probe(&pci->edma); in dw_pcie_edma_detect()
1098 if (ret && ret != -ENODEV) { in dw_pcie_edma_detect()
1099 dev_err(pci->dev, "Couldn't register eDMA device\n"); in dw_pcie_edma_detect()
1103 dev_info(pci->dev, "eDMA: unroll %s, %hu wr, %hu rd\n", in dw_pcie_edma_detect()
1104 pci->edma.mf == EDMA_MF_EDMA_UNROLL ? "T" : "F", in dw_pcie_edma_detect()
1105 pci->edma.ll_wr_cnt, pci->edma.ll_rd_cnt); in dw_pcie_edma_detect()
1112 dw_edma_remove(&pci->edma); in dw_pcie_edma_remove()
1122 if (pci->n_fts[0]) { in dw_pcie_setup()
1125 val |= PORT_AFR_N_FTS(pci->n_fts[0]); in dw_pcie_setup()
1126 val |= PORT_AFR_CC_N_FTS(pci->n_fts[0]); in dw_pcie_setup()
1131 if (pci->n_fts[1]) { in dw_pcie_setup()
1134 val |= pci->n_fts[1]; in dw_pcie_setup()
1150 dw_pcie_link_set_max_link_width(pci, pci->num_lanes); in dw_pcie_setup()
1157 struct device *dev = pci->dev; in dw_pcie_parent_bus_offset()
1158 struct device_node *np = dev->of_node; in dw_pcie_parent_bus_offset()
1164 index = of_property_match_string(np, "reg-names", reg_name); in dw_pcie_parent_bus_offset()
1173 fixup = pci->ops ? pci->ops->cpu_addr_fixup : NULL; in dw_pcie_parent_bus_offset()
1187 return cpu_phys_addr - reg_addr; in dw_pcie_parent_bus_offset()
1190 if (pci->use_parent_dt_ranges) { in dw_pcie_parent_bus_offset()
1210 return cpu_phys_addr - reg_addr; in dw_pcie_parent_bus_offset()