Lines Matching full:pp

45 irqreturn_t dw_handle_msi_irq(struct dw_pcie_rp *pp)  in dw_handle_msi_irq()  argument
51 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_handle_msi_irq()
53 num_ctrls = pp->num_vectors / MAX_MSI_IRQS_PER_CTRL; in dw_handle_msi_irq()
66 generic_handle_domain_irq(pp->irq_domain, in dw_handle_msi_irq()
80 struct dw_pcie_rp *pp; in dw_chained_msi_isr() local
84 pp = irq_desc_get_handler_data(desc); in dw_chained_msi_isr()
85 dw_handle_msi_irq(pp); in dw_chained_msi_isr()
92 struct dw_pcie_rp *pp = irq_data_get_irq_chip_data(d); in dw_pci_setup_msi_msg() local
93 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pci_setup_msi_msg()
96 msi_target = (u64)pp->msi_data; in dw_pci_setup_msi_msg()
109 struct dw_pcie_rp *pp = irq_data_get_irq_chip_data(d); in dw_pci_bottom_mask() local
110 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pci_bottom_mask()
114 raw_spin_lock_irqsave(&pp->lock, flags); in dw_pci_bottom_mask()
120 pp->irq_mask[ctrl] |= BIT(bit); in dw_pci_bottom_mask()
121 dw_pcie_writel_dbi(pci, PCIE_MSI_INTR0_MASK + res, pp->irq_mask[ctrl]); in dw_pci_bottom_mask()
123 raw_spin_unlock_irqrestore(&pp->lock, flags); in dw_pci_bottom_mask()
128 struct dw_pcie_rp *pp = irq_data_get_irq_chip_data(d); in dw_pci_bottom_unmask() local
129 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pci_bottom_unmask()
133 raw_spin_lock_irqsave(&pp->lock, flags); in dw_pci_bottom_unmask()
139 pp->irq_mask[ctrl] &= ~BIT(bit); in dw_pci_bottom_unmask()
140 dw_pcie_writel_dbi(pci, PCIE_MSI_INTR0_MASK + res, pp->irq_mask[ctrl]); in dw_pci_bottom_unmask()
142 raw_spin_unlock_irqrestore(&pp->lock, flags); in dw_pci_bottom_unmask()
147 struct dw_pcie_rp *pp = irq_data_get_irq_chip_data(d); in dw_pci_bottom_ack() local
148 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pci_bottom_ack()
170 struct dw_pcie_rp *pp = domain->host_data; in dw_pcie_irq_domain_alloc() local
175 raw_spin_lock_irqsave(&pp->lock, flags); in dw_pcie_irq_domain_alloc()
177 bit = bitmap_find_free_region(pp->msi_irq_in_use, pp->num_vectors, in dw_pcie_irq_domain_alloc()
180 raw_spin_unlock_irqrestore(&pp->lock, flags); in dw_pcie_irq_domain_alloc()
187 pp->msi_irq_chip, in dw_pcie_irq_domain_alloc()
188 pp, handle_edge_irq, in dw_pcie_irq_domain_alloc()
198 struct dw_pcie_rp *pp = domain->host_data; in dw_pcie_irq_domain_free() local
201 raw_spin_lock_irqsave(&pp->lock, flags); in dw_pcie_irq_domain_free()
203 bitmap_release_region(pp->msi_irq_in_use, d->hwirq, in dw_pcie_irq_domain_free()
206 raw_spin_unlock_irqrestore(&pp->lock, flags); in dw_pcie_irq_domain_free()
214 int dw_pcie_allocate_domains(struct dw_pcie_rp *pp) in dw_pcie_allocate_domains() argument
216 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pcie_allocate_domains()
220 .size = pp->num_vectors, in dw_pcie_allocate_domains()
221 .host_data = pp, in dw_pcie_allocate_domains()
224 pp->irq_domain = msi_create_parent_irq_domain(&info, &dw_pcie_msi_parent_ops); in dw_pcie_allocate_domains()
225 if (!pp->irq_domain) { in dw_pcie_allocate_domains()
233 void dw_pcie_free_msi(struct dw_pcie_rp *pp) in dw_pcie_free_msi() argument
238 if (pp->msi_irq[ctrl] > 0) in dw_pcie_free_msi()
239 irq_set_chained_handler_and_data(pp->msi_irq[ctrl], in dw_pcie_free_msi()
243 irq_domain_remove(pp->irq_domain); in dw_pcie_free_msi()
247 void dw_pcie_msi_init(struct dw_pcie_rp *pp) in dw_pcie_msi_init() argument
249 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pcie_msi_init()
250 u64 msi_target = (u64)pp->msi_data; in dw_pcie_msi_init()
253 if (!pci_msi_enabled() || !pp->has_msi_ctrl) in dw_pcie_msi_init()
256 num_ctrls = pp->num_vectors / MAX_MSI_IRQS_PER_CTRL; in dw_pcie_msi_init()
262 pp->irq_mask[ctrl]); in dw_pcie_msi_init()
274 static int dw_pcie_parse_split_msi_irq(struct dw_pcie_rp *pp) in dw_pcie_parse_split_msi_irq() argument
276 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pcie_parse_split_msi_irq()
295 pp->msi_irq[ctrl] = irq; in dw_pcie_parse_split_msi_irq()
303 if (pp->num_vectors > max_vectors) { in dw_pcie_parse_split_msi_irq()
306 pp->num_vectors = max_vectors; in dw_pcie_parse_split_msi_irq()
308 if (!pp->num_vectors) in dw_pcie_parse_split_msi_irq()
309 pp->num_vectors = max_vectors; in dw_pcie_parse_split_msi_irq()
314 int dw_pcie_msi_host_init(struct dw_pcie_rp *pp) in dw_pcie_msi_host_init() argument
316 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pcie_msi_host_init()
324 pp->irq_mask[ctrl] = ~0; in dw_pcie_msi_host_init()
326 if (!pp->msi_irq[0]) { in dw_pcie_msi_host_init()
327 ret = dw_pcie_parse_split_msi_irq(pp); in dw_pcie_msi_host_init()
332 if (!pp->num_vectors) in dw_pcie_msi_host_init()
333 pp->num_vectors = MSI_DEF_NUM_VECTORS; in dw_pcie_msi_host_init()
334 num_ctrls = pp->num_vectors / MAX_MSI_IRQS_PER_CTRL; in dw_pcie_msi_host_init()
336 if (!pp->msi_irq[0]) { in dw_pcie_msi_host_init()
337 pp->msi_irq[0] = platform_get_irq_byname_optional(pdev, "msi"); in dw_pcie_msi_host_init()
338 if (pp->msi_irq[0] < 0) { in dw_pcie_msi_host_init()
339 pp->msi_irq[0] = platform_get_irq(pdev, 0); in dw_pcie_msi_host_init()
340 if (pp->msi_irq[0] < 0) in dw_pcie_msi_host_init()
341 return pp->msi_irq[0]; in dw_pcie_msi_host_init()
345 dev_dbg(dev, "Using %d MSI vectors\n", pp->num_vectors); in dw_pcie_msi_host_init()
347 pp->msi_irq_chip = &dw_pci_msi_bottom_irq_chip; in dw_pcie_msi_host_init()
349 ret = dw_pcie_allocate_domains(pp); in dw_pcie_msi_host_init()
354 if (pp->msi_irq[ctrl] > 0) in dw_pcie_msi_host_init()
355 irq_set_chained_handler_and_data(pp->msi_irq[ctrl], in dw_pcie_msi_host_init()
356 dw_chained_msi_isr, pp); in dw_pcie_msi_host_init()
371 msi_vaddr = dmam_alloc_coherent(dev, sizeof(u64), &pp->msi_data, in dw_pcie_msi_host_init()
377 msi_vaddr = dmam_alloc_coherent(dev, sizeof(u64), &pp->msi_data, in dw_pcie_msi_host_init()
381 dw_pcie_free_msi(pp); in dw_pcie_msi_host_init()
390 static void dw_pcie_host_request_msg_tlp_res(struct dw_pcie_rp *pp) in dw_pcie_host_request_msg_tlp_res() argument
392 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pcie_host_request_msg_tlp_res()
396 win = resource_list_first_type(&pp->bridge->windows, IORESOURCE_MEM); in dw_pcie_host_request_msg_tlp_res()
412 pp->msg_res = res; in dw_pcie_host_request_msg_tlp_res()
416 static int dw_pcie_host_get_resources(struct dw_pcie_rp *pp) in dw_pcie_host_get_resources() argument
418 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pcie_host_get_resources()
435 pp->cfg0_size = resource_size(res); in dw_pcie_host_get_resources()
436 pp->cfg0_base = res->start; in dw_pcie_host_get_resources()
438 pp->va_cfg0_base = devm_pci_remap_cfg_resource(dev, res); in dw_pcie_host_get_resources()
439 if (IS_ERR(pp->va_cfg0_base)) in dw_pcie_host_get_resources()
440 return PTR_ERR(pp->va_cfg0_base); in dw_pcie_host_get_resources()
443 win = resource_list_first_type(&pp->bridge->windows, IORESOURCE_IO); in dw_pcie_host_get_resources()
445 pp->io_size = resource_size(win->res); in dw_pcie_host_get_resources()
446 pp->io_bus_addr = win->res->start - win->offset; in dw_pcie_host_get_resources()
447 pp->io_base = pci_pio_to_address(win->res->start); in dw_pcie_host_get_resources()
451 * visconti_pcie_cpu_addr_fixup() uses pp->io_base, so we have to in dw_pcie_host_get_resources()
452 * call dw_pcie_parent_bus_offset() after setting pp->io_base. in dw_pcie_host_get_resources()
455 pp->cfg0_base); in dw_pcie_host_get_resources()
459 int dw_pcie_host_init(struct dw_pcie_rp *pp) in dw_pcie_host_init() argument
461 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pcie_host_init()
467 raw_spin_lock_init(&pp->lock); in dw_pcie_host_init()
473 pp->bridge = bridge; in dw_pcie_host_init()
475 ret = dw_pcie_host_get_resources(pp); in dw_pcie_host_init()
483 if (pp->ops->init) { in dw_pcie_host_init()
484 ret = pp->ops->init(pp); in dw_pcie_host_init()
490 pp->has_msi_ctrl = !(pp->ops->msi_init || in dw_pcie_host_init()
498 if (!pp->has_msi_ctrl && !pp->num_vectors) { in dw_pcie_host_init()
499 pp->num_vectors = MSI_DEF_NUM_VECTORS; in dw_pcie_host_init()
500 } else if (pp->num_vectors > MAX_MSI_IRQS) { in dw_pcie_host_init()
506 if (pp->ops->msi_init) { in dw_pcie_host_init()
507 ret = pp->ops->msi_init(pp); in dw_pcie_host_init()
510 } else if (pp->has_msi_ctrl) { in dw_pcie_host_init()
511 ret = dw_pcie_msi_host_init(pp); in dw_pcie_host_init()
524 ret = of_pci_get_equalization_presets(dev, &pp->presets, pci->num_lanes); in dw_pcie_host_init()
537 if (pp->use_atu_msg) in dw_pcie_host_init()
538 dw_pcie_host_request_msg_tlp_res(pp); in dw_pcie_host_init()
544 ret = dw_pcie_setup_rc(pp); in dw_pcie_host_init()
559 if (!pp->use_linkup_irq) in dw_pcie_host_init()
563 bridge->sysdata = pp; in dw_pcie_host_init()
569 if (pp->ops->post_init) in dw_pcie_host_init()
570 pp->ops->post_init(pp); in dw_pcie_host_init()
583 if (pp->has_msi_ctrl) in dw_pcie_host_init()
584 dw_pcie_free_msi(pp); in dw_pcie_host_init()
587 if (pp->ops->deinit) in dw_pcie_host_init()
588 pp->ops->deinit(pp); in dw_pcie_host_init()
594 void dw_pcie_host_deinit(struct dw_pcie_rp *pp) in dw_pcie_host_deinit() argument
596 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pcie_host_deinit()
600 pci_stop_root_bus(pp->bridge->bus); in dw_pcie_host_deinit()
601 pci_remove_root_bus(pp->bridge->bus); in dw_pcie_host_deinit()
607 if (pp->has_msi_ctrl) in dw_pcie_host_deinit()
608 dw_pcie_free_msi(pp); in dw_pcie_host_deinit()
610 if (pp->ops->deinit) in dw_pcie_host_deinit()
611 pp->ops->deinit(pp); in dw_pcie_host_deinit()
618 struct dw_pcie_rp *pp = bus->sysdata; in dw_pcie_other_conf_map_bus() local
619 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pcie_other_conf_map_bus()
644 atu.parent_bus_addr = pp->cfg0_base - pci->parent_bus_offset; in dw_pcie_other_conf_map_bus()
646 atu.size = pp->cfg0_size; in dw_pcie_other_conf_map_bus()
652 return pp->va_cfg0_base + where; in dw_pcie_other_conf_map_bus()
658 struct dw_pcie_rp *pp = bus->sysdata; in dw_pcie_rd_other_conf() local
659 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pcie_rd_other_conf()
667 if (pp->cfg0_io_shared) { in dw_pcie_rd_other_conf()
669 atu.parent_bus_addr = pp->io_base - pci->parent_bus_offset; in dw_pcie_rd_other_conf()
670 atu.pci_addr = pp->io_bus_addr; in dw_pcie_rd_other_conf()
671 atu.size = pp->io_size; in dw_pcie_rd_other_conf()
684 struct dw_pcie_rp *pp = bus->sysdata; in dw_pcie_wr_other_conf() local
685 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pcie_wr_other_conf()
693 if (pp->cfg0_io_shared) { in dw_pcie_wr_other_conf()
695 atu.parent_bus_addr = pp->io_base - pci->parent_bus_offset; in dw_pcie_wr_other_conf()
696 atu.pci_addr = pp->io_bus_addr; in dw_pcie_wr_other_conf()
697 atu.size = pp->io_size; in dw_pcie_wr_other_conf()
715 struct dw_pcie_rp *pp = bus->sysdata; in dw_pcie_own_conf_map_bus() local
716 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pcie_own_conf_map_bus()
731 static int dw_pcie_iatu_setup(struct dw_pcie_rp *pp) in dw_pcie_iatu_setup() argument
733 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pcie_iatu_setup()
755 resource_list_for_each_entry(entry, &pp->bridge->windows) { in dw_pcie_iatu_setup()
768 if (pp->msg_res && pp->msg_res->parent == entry->res) in dw_pcie_iatu_setup()
770 resource_size(pp->msg_res); in dw_pcie_iatu_setup()
782 if (pp->io_size) { in dw_pcie_iatu_setup()
786 atu.parent_bus_addr = pp->io_base - pci->parent_bus_offset; in dw_pcie_iatu_setup()
787 atu.pci_addr = pp->io_bus_addr; in dw_pcie_iatu_setup()
788 atu.size = pp->io_size; in dw_pcie_iatu_setup()
797 pp->cfg0_io_shared = true; in dw_pcie_iatu_setup()
805 pp->msg_atu_index = i; in dw_pcie_iatu_setup()
808 resource_list_for_each_entry(entry, &pp->bridge->dma_ranges) { in dw_pcie_iatu_setup()
833 static void dw_pcie_program_presets(struct dw_pcie_rp *pp, enum pci_bus_speed speed) in dw_pcie_program_presets() argument
835 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pcie_program_presets()
842 presets = (u8 *)pp->presets.eq_presets_8gts; in dw_pcie_program_presets()
848 presets = pp->presets.eq_presets_Ngts[EQ_PRESET_TYPE_16GTS - 1]; in dw_pcie_program_presets()
853 presets = pp->presets.eq_presets_Ngts[EQ_PRESET_TYPE_32GTS - 1]; in dw_pcie_program_presets()
858 presets = pp->presets.eq_presets_Ngts[EQ_PRESET_TYPE_64GTS - 1]; in dw_pcie_program_presets()
881 static void dw_pcie_config_presets(struct dw_pcie_rp *pp) in dw_pcie_config_presets() argument
883 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pcie_config_presets()
892 dw_pcie_program_presets(pp, PCIE_SPEED_8_0GT); in dw_pcie_config_presets()
895 dw_pcie_program_presets(pp, PCIE_SPEED_16_0GT); in dw_pcie_config_presets()
898 dw_pcie_program_presets(pp, PCIE_SPEED_32_0GT); in dw_pcie_config_presets()
901 dw_pcie_program_presets(pp, PCIE_SPEED_64_0GT); in dw_pcie_config_presets()
904 int dw_pcie_setup_rc(struct dw_pcie_rp *pp) in dw_pcie_setup_rc() argument
906 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pcie_setup_rc()
918 dw_pcie_msi_init(pp); in dw_pcie_setup_rc()
943 dw_pcie_config_presets(pp); in dw_pcie_setup_rc()
949 if (pp->bridge->child_ops == &dw_child_pcie_ops) { in dw_pcie_setup_rc()
950 ret = dw_pcie_iatu_setup(pp); in dw_pcie_setup_rc()
976 if (pci->num_ob_windows <= pci->pp.msg_atu_index) in dw_pcie_pme_turn_off()
979 if (!pci->pp.msg_res) in dw_pcie_pme_turn_off()
985 atu.size = resource_size(pci->pp.msg_res); in dw_pcie_pme_turn_off()
986 atu.index = pci->pp.msg_atu_index; in dw_pcie_pme_turn_off()
988 atu.parent_bus_addr = pci->pp.msg_res->start - pci->parent_bus_offset; in dw_pcie_pme_turn_off()
994 mem = ioremap(pci->pp.msg_res->start, pci->region_align); in dw_pcie_pme_turn_off()
1019 if (pci->pp.ops->pme_turn_off) { in dw_pcie_suspend_noirq()
1020 pci->pp.ops->pme_turn_off(&pci->pp); in dw_pcie_suspend_noirq()
1046 if (pci->pp.ops->deinit) in dw_pcie_suspend_noirq()
1047 pci->pp.ops->deinit(&pci->pp); in dw_pcie_suspend_noirq()
1064 if (pci->pp.ops->init) { in dw_pcie_resume_noirq()
1065 ret = pci->pp.ops->init(&pci->pp); in dw_pcie_resume_noirq()
1072 dw_pcie_setup_rc(&pci->pp); in dw_pcie_resume_noirq()