Lines Matching full:pci

19 #include "../../pci.h"
22 void dw_pcie_version_detect(struct dw_pcie *pci) in dw_pcie_version_detect() argument
27 ver = dw_pcie_readl_dbi(pci, PCIE_VERSION_NUMBER); in dw_pcie_version_detect()
31 if (pci->version && pci->version != ver) in dw_pcie_version_detect()
32 dev_warn(pci->dev, "Versions don't match (%08x != %08x)\n", in dw_pcie_version_detect()
33 pci->version, ver); in dw_pcie_version_detect()
35 pci->version = ver; in dw_pcie_version_detect()
37 ver = dw_pcie_readl_dbi(pci, PCIE_VERSION_TYPE); in dw_pcie_version_detect()
39 if (pci->type && pci->type != ver) in dw_pcie_version_detect()
40 dev_warn(pci->dev, "Types don't match (%08x != %08x)\n", in dw_pcie_version_detect()
41 pci->type, ver); in dw_pcie_version_detect()
43 pci->type = ver; in dw_pcie_version_detect()
48 * are for configuring host controllers, which are bridges *to* PCI devices but
49 * are not PCI devices themselves.
51 static u8 __dw_pcie_find_next_cap(struct dw_pcie *pci, u8 cap_ptr, in __dw_pcie_find_next_cap() argument
60 reg = dw_pcie_readw_dbi(pci, cap_ptr); in __dw_pcie_find_next_cap()
70 return __dw_pcie_find_next_cap(pci, next_cap_ptr, cap); in __dw_pcie_find_next_cap()
73 u8 dw_pcie_find_capability(struct dw_pcie *pci, u8 cap) in dw_pcie_find_capability() argument
78 reg = dw_pcie_readw_dbi(pci, PCI_CAPABILITY_LIST); in dw_pcie_find_capability()
81 return __dw_pcie_find_next_cap(pci, next_cap_ptr, cap); in dw_pcie_find_capability()
85 static u16 dw_pcie_find_next_ext_capability(struct dw_pcie *pci, u16 start, in dw_pcie_find_next_ext_capability() argument
98 header = dw_pcie_readl_dbi(pci, pos); in dw_pcie_find_next_ext_capability()
114 header = dw_pcie_readl_dbi(pci, pos); in dw_pcie_find_next_ext_capability()
120 u16 dw_pcie_find_ext_capability(struct dw_pcie *pci, u8 cap) in dw_pcie_find_ext_capability() argument
122 return dw_pcie_find_next_ext_capability(pci, 0, cap); in dw_pcie_find_ext_capability()
166 u32 dw_pcie_read_dbi(struct dw_pcie *pci, u32 reg, size_t size) in dw_pcie_read_dbi() argument
171 if (pci->ops && pci->ops->read_dbi) in dw_pcie_read_dbi()
172 return pci->ops->read_dbi(pci, pci->dbi_base, reg, size); in dw_pcie_read_dbi()
174 ret = dw_pcie_read(pci->dbi_base + reg, size, &val); in dw_pcie_read_dbi()
176 dev_err(pci->dev, "Read DBI address failed\n"); in dw_pcie_read_dbi()
182 void dw_pcie_write_dbi(struct dw_pcie *pci, u32 reg, size_t size, u32 val) in dw_pcie_write_dbi() argument
186 if (pci->ops && pci->ops->write_dbi) { in dw_pcie_write_dbi()
187 pci->ops->write_dbi(pci, pci->dbi_base, reg, size, val); in dw_pcie_write_dbi()
191 ret = dw_pcie_write(pci->dbi_base + reg, size, val); in dw_pcie_write_dbi()
193 dev_err(pci->dev, "Write DBI address failed\n"); in dw_pcie_write_dbi()
197 void dw_pcie_write_dbi2(struct dw_pcie *pci, u32 reg, size_t size, u32 val) in dw_pcie_write_dbi2() argument
201 if (pci->ops && pci->ops->write_dbi2) { in dw_pcie_write_dbi2()
202 pci->ops->write_dbi2(pci, pci->dbi_base2, reg, size, val); in dw_pcie_write_dbi2()
206 ret = dw_pcie_write(pci->dbi_base2 + reg, size, val); in dw_pcie_write_dbi2()
208 dev_err(pci->dev, "write DBI address failed\n"); in dw_pcie_write_dbi2()
211 static inline void __iomem *dw_pcie_select_atu(struct dw_pcie *pci, u32 dir, in dw_pcie_select_atu() argument
214 if (pci->iatu_unroll_enabled) in dw_pcie_select_atu()
215 return pci->atu_base + PCIE_ATU_UNROLL_BASE(dir, index); in dw_pcie_select_atu()
217 dw_pcie_writel_dbi(pci, PCIE_ATU_VIEWPORT, dir | index); in dw_pcie_select_atu()
218 return pci->atu_base; in dw_pcie_select_atu()
221 static u32 dw_pcie_readl_atu(struct dw_pcie *pci, u32 dir, u32 index, u32 reg) in dw_pcie_readl_atu() argument
227 base = dw_pcie_select_atu(pci, dir, index); in dw_pcie_readl_atu()
229 if (pci->ops && pci->ops->read_dbi) in dw_pcie_readl_atu()
230 return pci->ops->read_dbi(pci, base, reg, 4); in dw_pcie_readl_atu()
234 dev_err(pci->dev, "Read ATU address failed\n"); in dw_pcie_readl_atu()
239 static void dw_pcie_writel_atu(struct dw_pcie *pci, u32 dir, u32 index, in dw_pcie_writel_atu() argument
245 base = dw_pcie_select_atu(pci, dir, index); in dw_pcie_writel_atu()
247 if (pci->ops && pci->ops->write_dbi) { in dw_pcie_writel_atu()
248 pci->ops->write_dbi(pci, base, reg, 4, val); in dw_pcie_writel_atu()
254 dev_err(pci->dev, "Write ATU address failed\n"); in dw_pcie_writel_atu()
257 static inline u32 dw_pcie_readl_atu_ob(struct dw_pcie *pci, u32 index, u32 reg) in dw_pcie_readl_atu_ob() argument
259 return dw_pcie_readl_atu(pci, PCIE_ATU_REGION_DIR_OB, index, reg); in dw_pcie_readl_atu_ob()
262 static inline void dw_pcie_writel_atu_ob(struct dw_pcie *pci, u32 index, u32 reg, in dw_pcie_writel_atu_ob() argument
265 dw_pcie_writel_atu(pci, PCIE_ATU_REGION_DIR_OB, index, reg, val); in dw_pcie_writel_atu_ob()
281 * Digest as there is no way the PCI core AER code could program in dw_pcie_enable_ecrc()
309 static int __dw_pcie_prog_outbound_atu(struct dw_pcie *pci, u8 func_no, in __dw_pcie_prog_outbound_atu() argument
316 if (pci->ops && pci->ops->cpu_addr_fixup) in __dw_pcie_prog_outbound_atu()
317 cpu_addr = pci->ops->cpu_addr_fixup(pci, cpu_addr); in __dw_pcie_prog_outbound_atu()
321 if ((limit_addr & ~pci->region_limit) != (cpu_addr & ~pci->region_limit) || in __dw_pcie_prog_outbound_atu()
322 !IS_ALIGNED(cpu_addr, pci->region_align) || in __dw_pcie_prog_outbound_atu()
323 !IS_ALIGNED(pci_addr, pci->region_align) || !size) { in __dw_pcie_prog_outbound_atu()
327 dw_pcie_writel_atu_ob(pci, index, PCIE_ATU_LOWER_BASE, in __dw_pcie_prog_outbound_atu()
329 dw_pcie_writel_atu_ob(pci, index, PCIE_ATU_UPPER_BASE, in __dw_pcie_prog_outbound_atu()
332 dw_pcie_writel_atu_ob(pci, index, PCIE_ATU_LIMIT, in __dw_pcie_prog_outbound_atu()
334 if (dw_pcie_ver_is_ge(pci, 460A)) in __dw_pcie_prog_outbound_atu()
335 dw_pcie_writel_atu_ob(pci, index, PCIE_ATU_UPPER_LIMIT, in __dw_pcie_prog_outbound_atu()
338 dw_pcie_writel_atu_ob(pci, index, PCIE_ATU_LOWER_TARGET, in __dw_pcie_prog_outbound_atu()
340 dw_pcie_writel_atu_ob(pci, index, PCIE_ATU_UPPER_TARGET, in __dw_pcie_prog_outbound_atu()
345 dw_pcie_ver_is_ge(pci, 460A)) in __dw_pcie_prog_outbound_atu()
347 if (dw_pcie_ver_is(pci, 490A)) in __dw_pcie_prog_outbound_atu()
349 dw_pcie_writel_atu_ob(pci, index, PCIE_ATU_REGION_CTRL1, val); in __dw_pcie_prog_outbound_atu()
351 dw_pcie_writel_atu_ob(pci, index, PCIE_ATU_REGION_CTRL2, PCIE_ATU_ENABLE); in __dw_pcie_prog_outbound_atu()
358 val = dw_pcie_readl_atu_ob(pci, index, PCIE_ATU_REGION_CTRL2); in __dw_pcie_prog_outbound_atu()
365 dev_err(pci->dev, "Outbound iATU is not being enabled\n"); in __dw_pcie_prog_outbound_atu()
370 int dw_pcie_prog_outbound_atu(struct dw_pcie *pci, int index, int type, in dw_pcie_prog_outbound_atu() argument
373 return __dw_pcie_prog_outbound_atu(pci, 0, index, type, in dw_pcie_prog_outbound_atu()
377 int dw_pcie_prog_ep_outbound_atu(struct dw_pcie *pci, u8 func_no, int index, in dw_pcie_prog_ep_outbound_atu() argument
381 return __dw_pcie_prog_outbound_atu(pci, func_no, index, type, in dw_pcie_prog_ep_outbound_atu()
385 static inline u32 dw_pcie_readl_atu_ib(struct dw_pcie *pci, u32 index, u32 reg) in dw_pcie_readl_atu_ib() argument
387 return dw_pcie_readl_atu(pci, PCIE_ATU_REGION_DIR_IB, index, reg); in dw_pcie_readl_atu_ib()
390 static inline void dw_pcie_writel_atu_ib(struct dw_pcie *pci, u32 index, u32 reg, in dw_pcie_writel_atu_ib() argument
393 dw_pcie_writel_atu(pci, PCIE_ATU_REGION_DIR_IB, index, reg, val); in dw_pcie_writel_atu_ib()
396 int dw_pcie_prog_inbound_atu(struct dw_pcie *pci, u8 func_no, int index, in dw_pcie_prog_inbound_atu() argument
401 if (!IS_ALIGNED(cpu_addr, pci->region_align)) in dw_pcie_prog_inbound_atu()
404 dw_pcie_writel_atu_ib(pci, index, PCIE_ATU_LOWER_TARGET, in dw_pcie_prog_inbound_atu()
406 dw_pcie_writel_atu_ib(pci, index, PCIE_ATU_UPPER_TARGET, in dw_pcie_prog_inbound_atu()
409 dw_pcie_writel_atu_ib(pci, index, PCIE_ATU_REGION_CTRL1, type | in dw_pcie_prog_inbound_atu()
411 dw_pcie_writel_atu_ib(pci, index, PCIE_ATU_REGION_CTRL2, in dw_pcie_prog_inbound_atu()
420 val = dw_pcie_readl_atu_ib(pci, index, PCIE_ATU_REGION_CTRL2); in dw_pcie_prog_inbound_atu()
427 dev_err(pci->dev, "Inbound iATU is not being enabled\n"); in dw_pcie_prog_inbound_atu()
432 void dw_pcie_disable_atu(struct dw_pcie *pci, u32 dir, int index) in dw_pcie_disable_atu() argument
434 dw_pcie_writel_atu(pci, dir, index, PCIE_ATU_REGION_CTRL2, 0); in dw_pcie_disable_atu()
437 int dw_pcie_wait_for_link(struct dw_pcie *pci) in dw_pcie_wait_for_link() argument
444 if (dw_pcie_link_up(pci)) in dw_pcie_wait_for_link()
451 dev_err(pci->dev, "Phy link never came up\n"); in dw_pcie_wait_for_link()
455 offset = dw_pcie_find_capability(pci, PCI_CAP_ID_EXP); in dw_pcie_wait_for_link()
456 val = dw_pcie_readw_dbi(pci, offset + PCI_EXP_LNKSTA); in dw_pcie_wait_for_link()
458 dev_info(pci->dev, "PCIe Gen.%u x%u link up\n", in dw_pcie_wait_for_link()
466 int dw_pcie_link_up(struct dw_pcie *pci) in dw_pcie_link_up() argument
470 if (pci->ops && pci->ops->link_up) in dw_pcie_link_up()
471 return pci->ops->link_up(pci); in dw_pcie_link_up()
473 val = dw_pcie_readl_dbi(pci, PCIE_PORT_DEBUG1); in dw_pcie_link_up()
479 void dw_pcie_upconfig_setup(struct dw_pcie *pci) in dw_pcie_upconfig_setup() argument
483 val = dw_pcie_readl_dbi(pci, PCIE_PORT_MULTI_LANE_CTRL); in dw_pcie_upconfig_setup()
485 dw_pcie_writel_dbi(pci, PCIE_PORT_MULTI_LANE_CTRL, val); in dw_pcie_upconfig_setup()
489 static void dw_pcie_link_set_max_speed(struct dw_pcie *pci, u32 link_gen) in dw_pcie_link_set_max_speed() argument
492 u8 offset = dw_pcie_find_capability(pci, PCI_CAP_ID_EXP); in dw_pcie_link_set_max_speed()
494 cap = dw_pcie_readl_dbi(pci, offset + PCI_EXP_LNKCAP); in dw_pcie_link_set_max_speed()
495 ctrl2 = dw_pcie_readl_dbi(pci, offset + PCI_EXP_LNKCTL2); in dw_pcie_link_set_max_speed()
518 dw_pcie_writel_dbi(pci, offset + PCI_EXP_LNKCTL2, ctrl2 | link_speed); in dw_pcie_link_set_max_speed()
521 dw_pcie_writel_dbi(pci, offset + PCI_EXP_LNKCAP, cap | link_speed); in dw_pcie_link_set_max_speed()
525 static bool dw_pcie_iatu_unroll_enabled(struct dw_pcie *pci) in dw_pcie_iatu_unroll_enabled() argument
529 val = dw_pcie_readl_dbi(pci, PCIE_ATU_VIEWPORT); in dw_pcie_iatu_unroll_enabled()
536 static void dw_pcie_iatu_detect_regions(struct dw_pcie *pci) in dw_pcie_iatu_detect_regions() argument
542 if (pci->iatu_unroll_enabled) { in dw_pcie_iatu_detect_regions()
543 max_region = min((int)pci->atu_size / 512, 256); in dw_pcie_iatu_detect_regions()
545 dw_pcie_writel_dbi(pci, PCIE_ATU_VIEWPORT, 0xFF); in dw_pcie_iatu_detect_regions()
546 max_region = dw_pcie_readl_dbi(pci, PCIE_ATU_VIEWPORT) + 1; in dw_pcie_iatu_detect_regions()
550 dw_pcie_writel_atu_ob(pci, ob, PCIE_ATU_LOWER_TARGET, 0x11110000); in dw_pcie_iatu_detect_regions()
551 val = dw_pcie_readl_atu_ob(pci, ob, PCIE_ATU_LOWER_TARGET); in dw_pcie_iatu_detect_regions()
557 dw_pcie_writel_atu_ib(pci, ib, PCIE_ATU_LOWER_TARGET, 0x11110000); in dw_pcie_iatu_detect_regions()
558 val = dw_pcie_readl_atu_ib(pci, ib, PCIE_ATU_LOWER_TARGET); in dw_pcie_iatu_detect_regions()
568 dev_err(pci->dev, "No iATU regions found\n"); in dw_pcie_iatu_detect_regions()
572 dw_pcie_writel_atu(pci, dir, 0, PCIE_ATU_LIMIT, 0x0); in dw_pcie_iatu_detect_regions()
573 min = dw_pcie_readl_atu(pci, dir, 0, PCIE_ATU_LIMIT); in dw_pcie_iatu_detect_regions()
575 if (dw_pcie_ver_is_ge(pci, 460A)) { in dw_pcie_iatu_detect_regions()
576 dw_pcie_writel_atu(pci, dir, 0, PCIE_ATU_UPPER_LIMIT, 0xFFFFFFFF); in dw_pcie_iatu_detect_regions()
577 max = dw_pcie_readl_atu(pci, dir, 0, PCIE_ATU_UPPER_LIMIT); in dw_pcie_iatu_detect_regions()
582 pci->num_ob_windows = ob; in dw_pcie_iatu_detect_regions()
583 pci->num_ib_windows = ib; in dw_pcie_iatu_detect_regions()
584 pci->region_align = 1 << fls(min); in dw_pcie_iatu_detect_regions()
585 pci->region_limit = (max << 32) | (SZ_4G - 1); in dw_pcie_iatu_detect_regions()
588 void dw_pcie_iatu_detect(struct dw_pcie *pci) in dw_pcie_iatu_detect() argument
590 struct platform_device *pdev = to_platform_device(pci->dev); in dw_pcie_iatu_detect()
592 pci->iatu_unroll_enabled = dw_pcie_iatu_unroll_enabled(pci); in dw_pcie_iatu_detect()
593 if (pci->iatu_unroll_enabled) { in dw_pcie_iatu_detect()
594 if (!pci->atu_base) { in dw_pcie_iatu_detect()
598 pci->atu_size = resource_size(res); in dw_pcie_iatu_detect()
599 pci->atu_base = devm_ioremap_resource(pci->dev, res); in dw_pcie_iatu_detect()
601 if (!pci->atu_base || IS_ERR(pci->atu_base)) in dw_pcie_iatu_detect()
602 pci->atu_base = pci->dbi_base + DEFAULT_DBI_ATU_OFFSET; in dw_pcie_iatu_detect()
605 if (!pci->atu_size) in dw_pcie_iatu_detect()
607 pci->atu_size = SZ_4K; in dw_pcie_iatu_detect()
609 pci->atu_base = pci->dbi_base + PCIE_ATU_VIEWPORT_BASE; in dw_pcie_iatu_detect()
610 pci->atu_size = PCIE_ATU_VIEWPORT_SIZE; in dw_pcie_iatu_detect()
613 dw_pcie_iatu_detect_regions(pci); in dw_pcie_iatu_detect()
615 dev_info(pci->dev, "iATU unroll: %s\n", pci->iatu_unroll_enabled ? in dw_pcie_iatu_detect()
618 dev_info(pci->dev, "iATU regions: %u ob, %u ib, align %uK, limit %lluG\n", in dw_pcie_iatu_detect()
619 pci->num_ob_windows, pci->num_ib_windows, in dw_pcie_iatu_detect()
620 pci->region_align / SZ_1K, (pci->region_limit + 1) / SZ_1G); in dw_pcie_iatu_detect()
623 void dw_pcie_setup(struct dw_pcie *pci) in dw_pcie_setup() argument
625 struct device_node *np = pci->dev->of_node; in dw_pcie_setup()
628 if (pci->link_gen > 0) in dw_pcie_setup()
629 dw_pcie_link_set_max_speed(pci, pci->link_gen); in dw_pcie_setup()
632 if (pci->n_fts[0]) { in dw_pcie_setup()
633 val = dw_pcie_readl_dbi(pci, PCIE_PORT_AFR); in dw_pcie_setup()
635 val |= PORT_AFR_N_FTS(pci->n_fts[0]); in dw_pcie_setup()
636 val |= PORT_AFR_CC_N_FTS(pci->n_fts[0]); in dw_pcie_setup()
637 dw_pcie_writel_dbi(pci, PCIE_PORT_AFR, val); in dw_pcie_setup()
641 if (pci->n_fts[1]) { in dw_pcie_setup()
642 val = dw_pcie_readl_dbi(pci, PCIE_LINK_WIDTH_SPEED_CONTROL); in dw_pcie_setup()
644 val |= pci->n_fts[pci->link_gen - 1]; in dw_pcie_setup()
645 dw_pcie_writel_dbi(pci, PCIE_LINK_WIDTH_SPEED_CONTROL, val); in dw_pcie_setup()
648 val = dw_pcie_readl_dbi(pci, PCIE_PORT_LINK_CONTROL); in dw_pcie_setup()
651 dw_pcie_writel_dbi(pci, PCIE_PORT_LINK_CONTROL, val); in dw_pcie_setup()
654 val = dw_pcie_readl_dbi(pci, PCIE_PL_CHK_REG_CONTROL_STATUS); in dw_pcie_setup()
657 dw_pcie_writel_dbi(pci, PCIE_PL_CHK_REG_CONTROL_STATUS, val); in dw_pcie_setup()
660 of_property_read_u32(np, "num-lanes", &pci->num_lanes); in dw_pcie_setup()
661 if (!pci->num_lanes) { in dw_pcie_setup()
662 dev_dbg(pci->dev, "Using h/w default number of lanes\n"); in dw_pcie_setup()
669 switch (pci->num_lanes) { in dw_pcie_setup()
683 dev_err(pci->dev, "num-lanes %u: invalid value\n", pci->num_lanes); in dw_pcie_setup()
686 dw_pcie_writel_dbi(pci, PCIE_PORT_LINK_CONTROL, val); in dw_pcie_setup()
689 val = dw_pcie_readl_dbi(pci, PCIE_LINK_WIDTH_SPEED_CONTROL); in dw_pcie_setup()
691 switch (pci->num_lanes) { in dw_pcie_setup()
705 dw_pcie_writel_dbi(pci, PCIE_LINK_WIDTH_SPEED_CONTROL, val); in dw_pcie_setup()