Lines Matching full:pp
58 irqreturn_t dw_handle_msi_irq(struct dw_pcie_rp *pp) in dw_handle_msi_irq() argument
64 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_handle_msi_irq()
66 num_ctrls = pp->num_vectors / MAX_MSI_IRQS_PER_CTRL; in dw_handle_msi_irq()
79 generic_handle_domain_irq(pp->irq_domain, in dw_handle_msi_irq()
93 struct dw_pcie_rp *pp; in dw_chained_msi_isr() local
97 pp = irq_desc_get_handler_data(desc); in dw_chained_msi_isr()
98 dw_handle_msi_irq(pp); in dw_chained_msi_isr()
105 struct dw_pcie_rp *pp = irq_data_get_irq_chip_data(d); in dw_pci_setup_msi_msg() local
106 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pci_setup_msi_msg()
109 msi_target = (u64)pp->msi_data; in dw_pci_setup_msi_msg()
122 struct dw_pcie_rp *pp = irq_data_get_irq_chip_data(d); in dw_pci_bottom_mask() local
123 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pci_bottom_mask()
127 raw_spin_lock_irqsave(&pp->lock, flags); in dw_pci_bottom_mask()
133 pp->irq_mask[ctrl] |= BIT(bit); in dw_pci_bottom_mask()
134 dw_pcie_writel_dbi(pci, PCIE_MSI_INTR0_MASK + res, pp->irq_mask[ctrl]); in dw_pci_bottom_mask()
136 raw_spin_unlock_irqrestore(&pp->lock, flags); in dw_pci_bottom_mask()
141 struct dw_pcie_rp *pp = irq_data_get_irq_chip_data(d); in dw_pci_bottom_unmask() local
142 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pci_bottom_unmask()
146 raw_spin_lock_irqsave(&pp->lock, flags); in dw_pci_bottom_unmask()
152 pp->irq_mask[ctrl] &= ~BIT(bit); in dw_pci_bottom_unmask()
153 dw_pcie_writel_dbi(pci, PCIE_MSI_INTR0_MASK + res, pp->irq_mask[ctrl]); in dw_pci_bottom_unmask()
155 raw_spin_unlock_irqrestore(&pp->lock, flags); in dw_pci_bottom_unmask()
160 struct dw_pcie_rp *pp = irq_data_get_irq_chip_data(d); in dw_pci_bottom_ack() local
161 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pci_bottom_ack()
183 struct dw_pcie_rp *pp = domain->host_data; in dw_pcie_irq_domain_alloc() local
188 raw_spin_lock_irqsave(&pp->lock, flags); in dw_pcie_irq_domain_alloc()
190 bit = bitmap_find_free_region(pp->msi_irq_in_use, pp->num_vectors, in dw_pcie_irq_domain_alloc()
193 raw_spin_unlock_irqrestore(&pp->lock, flags); in dw_pcie_irq_domain_alloc()
200 pp->msi_irq_chip, in dw_pcie_irq_domain_alloc()
201 pp, handle_edge_irq, in dw_pcie_irq_domain_alloc()
211 struct dw_pcie_rp *pp = domain->host_data; in dw_pcie_irq_domain_free() local
214 raw_spin_lock_irqsave(&pp->lock, flags); in dw_pcie_irq_domain_free()
216 bitmap_release_region(pp->msi_irq_in_use, d->hwirq, in dw_pcie_irq_domain_free()
219 raw_spin_unlock_irqrestore(&pp->lock, flags); in dw_pcie_irq_domain_free()
227 int dw_pcie_allocate_domains(struct dw_pcie_rp *pp) in dw_pcie_allocate_domains() argument
229 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pcie_allocate_domains()
232 pp->irq_domain = irq_domain_create_linear(fwnode, pp->num_vectors, in dw_pcie_allocate_domains()
233 &dw_pcie_msi_domain_ops, pp); in dw_pcie_allocate_domains()
234 if (!pp->irq_domain) { in dw_pcie_allocate_domains()
239 irq_domain_update_bus_token(pp->irq_domain, DOMAIN_BUS_NEXUS); in dw_pcie_allocate_domains()
241 pp->msi_domain = pci_msi_create_irq_domain(fwnode, in dw_pcie_allocate_domains()
243 pp->irq_domain); in dw_pcie_allocate_domains()
244 if (!pp->msi_domain) { in dw_pcie_allocate_domains()
246 irq_domain_remove(pp->irq_domain); in dw_pcie_allocate_domains()
253 static void dw_pcie_free_msi(struct dw_pcie_rp *pp) in dw_pcie_free_msi() argument
258 if (pp->msi_irq[ctrl] > 0) in dw_pcie_free_msi()
259 irq_set_chained_handler_and_data(pp->msi_irq[ctrl], in dw_pcie_free_msi()
263 irq_domain_remove(pp->msi_domain); in dw_pcie_free_msi()
264 irq_domain_remove(pp->irq_domain); in dw_pcie_free_msi()
267 static void dw_pcie_msi_init(struct dw_pcie_rp *pp) in dw_pcie_msi_init() argument
269 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pcie_msi_init()
270 u64 msi_target = (u64)pp->msi_data; in dw_pcie_msi_init()
272 if (!pci_msi_enabled() || !pp->has_msi_ctrl) in dw_pcie_msi_init()
280 static int dw_pcie_parse_split_msi_irq(struct dw_pcie_rp *pp) in dw_pcie_parse_split_msi_irq() argument
282 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pcie_parse_split_msi_irq()
301 pp->msi_irq[ctrl] = irq; in dw_pcie_parse_split_msi_irq()
309 if (pp->num_vectors > max_vectors) { in dw_pcie_parse_split_msi_irq()
312 pp->num_vectors = max_vectors; in dw_pcie_parse_split_msi_irq()
314 if (!pp->num_vectors) in dw_pcie_parse_split_msi_irq()
315 pp->num_vectors = max_vectors; in dw_pcie_parse_split_msi_irq()
320 static int dw_pcie_msi_host_init(struct dw_pcie_rp *pp) in dw_pcie_msi_host_init() argument
322 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pcie_msi_host_init()
330 pp->irq_mask[ctrl] = ~0; in dw_pcie_msi_host_init()
332 if (!pp->msi_irq[0]) { in dw_pcie_msi_host_init()
333 ret = dw_pcie_parse_split_msi_irq(pp); in dw_pcie_msi_host_init()
338 if (!pp->num_vectors) in dw_pcie_msi_host_init()
339 pp->num_vectors = MSI_DEF_NUM_VECTORS; in dw_pcie_msi_host_init()
340 num_ctrls = pp->num_vectors / MAX_MSI_IRQS_PER_CTRL; in dw_pcie_msi_host_init()
342 if (!pp->msi_irq[0]) { in dw_pcie_msi_host_init()
343 pp->msi_irq[0] = platform_get_irq_byname_optional(pdev, "msi"); in dw_pcie_msi_host_init()
344 if (pp->msi_irq[0] < 0) { in dw_pcie_msi_host_init()
345 pp->msi_irq[0] = platform_get_irq(pdev, 0); in dw_pcie_msi_host_init()
346 if (pp->msi_irq[0] < 0) in dw_pcie_msi_host_init()
347 return pp->msi_irq[0]; in dw_pcie_msi_host_init()
351 dev_dbg(dev, "Using %d MSI vectors\n", pp->num_vectors); in dw_pcie_msi_host_init()
353 pp->msi_irq_chip = &dw_pci_msi_bottom_irq_chip; in dw_pcie_msi_host_init()
355 ret = dw_pcie_allocate_domains(pp); in dw_pcie_msi_host_init()
360 if (pp->msi_irq[ctrl] > 0) in dw_pcie_msi_host_init()
361 irq_set_chained_handler_and_data(pp->msi_irq[ctrl], in dw_pcie_msi_host_init()
362 dw_chained_msi_isr, pp); in dw_pcie_msi_host_init()
377 msi_vaddr = dmam_alloc_coherent(dev, sizeof(u64), &pp->msi_data, in dw_pcie_msi_host_init()
383 msi_vaddr = dmam_alloc_coherent(dev, sizeof(u64), &pp->msi_data, in dw_pcie_msi_host_init()
387 dw_pcie_free_msi(pp); in dw_pcie_msi_host_init()
395 static void dw_pcie_host_request_msg_tlp_res(struct dw_pcie_rp *pp) in dw_pcie_host_request_msg_tlp_res() argument
397 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pcie_host_request_msg_tlp_res()
401 win = resource_list_first_type(&pp->bridge->windows, IORESOURCE_MEM); in dw_pcie_host_request_msg_tlp_res()
417 pp->msg_res = res; in dw_pcie_host_request_msg_tlp_res()
421 int dw_pcie_host_init(struct dw_pcie_rp *pp) in dw_pcie_host_init() argument
423 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pcie_host_init()
432 raw_spin_lock_init(&pp->lock); in dw_pcie_host_init()
444 pp->cfg0_size = resource_size(res); in dw_pcie_host_init()
445 pp->cfg0_base = res->start; in dw_pcie_host_init()
447 pp->va_cfg0_base = devm_pci_remap_cfg_resource(dev, res); in dw_pcie_host_init()
448 if (IS_ERR(pp->va_cfg0_base)) in dw_pcie_host_init()
449 return PTR_ERR(pp->va_cfg0_base); in dw_pcie_host_init()
455 pp->bridge = bridge; in dw_pcie_host_init()
460 pp->io_size = resource_size(win->res); in dw_pcie_host_init()
461 pp->io_bus_addr = win->res->start - win->offset; in dw_pcie_host_init()
462 pp->io_base = pci_pio_to_address(win->res->start); in dw_pcie_host_init()
469 if (pp->ops->init) { in dw_pcie_host_init()
470 ret = pp->ops->init(pp); in dw_pcie_host_init()
476 pp->has_msi_ctrl = !(pp->ops->msi_init || in dw_pcie_host_init()
484 if (!pp->has_msi_ctrl && !pp->num_vectors) { in dw_pcie_host_init()
485 pp->num_vectors = MSI_DEF_NUM_VECTORS; in dw_pcie_host_init()
486 } else if (pp->num_vectors > MAX_MSI_IRQS) { in dw_pcie_host_init()
492 if (pp->ops->msi_init) { in dw_pcie_host_init()
493 ret = pp->ops->msi_init(pp); in dw_pcie_host_init()
496 } else if (pp->has_msi_ctrl) { in dw_pcie_host_init()
497 ret = dw_pcie_msi_host_init(pp); in dw_pcie_host_init()
516 if (pp->use_atu_msg) in dw_pcie_host_init()
517 dw_pcie_host_request_msg_tlp_res(pp); in dw_pcie_host_init()
523 ret = dw_pcie_setup_rc(pp); in dw_pcie_host_init()
538 if (!pp->use_linkup_irq) in dw_pcie_host_init()
542 bridge->sysdata = pp; in dw_pcie_host_init()
548 if (pp->ops->post_init) in dw_pcie_host_init()
549 pp->ops->post_init(pp); in dw_pcie_host_init()
560 if (pp->has_msi_ctrl) in dw_pcie_host_init()
561 dw_pcie_free_msi(pp); in dw_pcie_host_init()
564 if (pp->ops->deinit) in dw_pcie_host_init()
565 pp->ops->deinit(pp); in dw_pcie_host_init()
571 void dw_pcie_host_deinit(struct dw_pcie_rp *pp) in dw_pcie_host_deinit() argument
573 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pcie_host_deinit()
575 pci_stop_root_bus(pp->bridge->bus); in dw_pcie_host_deinit()
576 pci_remove_root_bus(pp->bridge->bus); in dw_pcie_host_deinit()
582 if (pp->has_msi_ctrl) in dw_pcie_host_deinit()
583 dw_pcie_free_msi(pp); in dw_pcie_host_deinit()
585 if (pp->ops->deinit) in dw_pcie_host_deinit()
586 pp->ops->deinit(pp); in dw_pcie_host_deinit()
593 struct dw_pcie_rp *pp = bus->sysdata; in dw_pcie_other_conf_map_bus() local
594 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pcie_other_conf_map_bus()
619 atu.cpu_addr = pp->cfg0_base; in dw_pcie_other_conf_map_bus()
621 atu.size = pp->cfg0_size; in dw_pcie_other_conf_map_bus()
627 return pp->va_cfg0_base + where; in dw_pcie_other_conf_map_bus()
633 struct dw_pcie_rp *pp = bus->sysdata; in dw_pcie_rd_other_conf() local
634 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pcie_rd_other_conf()
642 if (pp->cfg0_io_shared) { in dw_pcie_rd_other_conf()
644 atu.cpu_addr = pp->io_base; in dw_pcie_rd_other_conf()
645 atu.pci_addr = pp->io_bus_addr; in dw_pcie_rd_other_conf()
646 atu.size = pp->io_size; in dw_pcie_rd_other_conf()
659 struct dw_pcie_rp *pp = bus->sysdata; in dw_pcie_wr_other_conf() local
660 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pcie_wr_other_conf()
668 if (pp->cfg0_io_shared) { in dw_pcie_wr_other_conf()
670 atu.cpu_addr = pp->io_base; in dw_pcie_wr_other_conf()
671 atu.pci_addr = pp->io_bus_addr; in dw_pcie_wr_other_conf()
672 atu.size = pp->io_size; in dw_pcie_wr_other_conf()
690 struct dw_pcie_rp *pp = bus->sysdata; in dw_pcie_own_conf_map_bus() local
691 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pcie_own_conf_map_bus()
706 static int dw_pcie_iatu_setup(struct dw_pcie_rp *pp) in dw_pcie_iatu_setup() argument
708 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pcie_iatu_setup()
730 resource_list_for_each_entry(entry, &pp->bridge->windows) { in dw_pcie_iatu_setup()
743 if (pp->msg_res && pp->msg_res->parent == entry->res) in dw_pcie_iatu_setup()
745 resource_size(pp->msg_res); in dw_pcie_iatu_setup()
757 if (pp->io_size) { in dw_pcie_iatu_setup()
761 atu.cpu_addr = pp->io_base; in dw_pcie_iatu_setup()
762 atu.pci_addr = pp->io_bus_addr; in dw_pcie_iatu_setup()
763 atu.size = pp->io_size; in dw_pcie_iatu_setup()
772 pp->cfg0_io_shared = true; in dw_pcie_iatu_setup()
780 pp->msg_atu_index = i; in dw_pcie_iatu_setup()
783 resource_list_for_each_entry(entry, &pp->bridge->dma_ranges) { in dw_pcie_iatu_setup()
808 int dw_pcie_setup_rc(struct dw_pcie_rp *pp) in dw_pcie_setup_rc() argument
810 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pcie_setup_rc()
822 if (pp->has_msi_ctrl) { in dw_pcie_setup_rc()
823 num_ctrls = pp->num_vectors / MAX_MSI_IRQS_PER_CTRL; in dw_pcie_setup_rc()
829 pp->irq_mask[ctrl]); in dw_pcie_setup_rc()
836 dw_pcie_msi_init(pp); in dw_pcie_setup_rc()
866 if (pp->bridge->child_ops == &dw_child_pcie_ops) { in dw_pcie_setup_rc()
867 ret = dw_pcie_iatu_setup(pp); in dw_pcie_setup_rc()
893 if (pci->num_ob_windows <= pci->pp.msg_atu_index) in dw_pcie_pme_turn_off()
896 if (!pci->pp.msg_res) in dw_pcie_pme_turn_off()
902 atu.size = resource_size(pci->pp.msg_res); in dw_pcie_pme_turn_off()
903 atu.index = pci->pp.msg_atu_index; in dw_pcie_pme_turn_off()
905 atu.cpu_addr = pci->pp.msg_res->start; in dw_pcie_pme_turn_off()
936 if (pci->pp.ops->pme_turn_off) { in dw_pcie_suspend_noirq()
937 pci->pp.ops->pme_turn_off(&pci->pp); in dw_pcie_suspend_noirq()
963 if (pci->pp.ops->deinit) in dw_pcie_suspend_noirq()
964 pci->pp.ops->deinit(&pci->pp); in dw_pcie_suspend_noirq()
981 if (pci->pp.ops->init) { in dw_pcie_resume_noirq()
982 ret = pci->pp.ops->init(&pci->pp); in dw_pcie_resume_noirq()
989 dw_pcie_setup_rc(&pci->pp); in dw_pcie_resume_noirq()