Lines Matching full:pp
57 irqreturn_t dw_handle_msi_irq(struct dw_pcie_rp *pp) in dw_handle_msi_irq() argument
63 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_handle_msi_irq()
65 num_ctrls = pp->num_vectors / MAX_MSI_IRQS_PER_CTRL; in dw_handle_msi_irq()
78 generic_handle_domain_irq(pp->irq_domain, in dw_handle_msi_irq()
92 struct dw_pcie_rp *pp; in dw_chained_msi_isr() local
96 pp = irq_desc_get_handler_data(desc); in dw_chained_msi_isr()
97 dw_handle_msi_irq(pp); in dw_chained_msi_isr()
104 struct dw_pcie_rp *pp = irq_data_get_irq_chip_data(d); in dw_pci_setup_msi_msg() local
105 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pci_setup_msi_msg()
108 msi_target = (u64)pp->msi_data; in dw_pci_setup_msi_msg()
127 struct dw_pcie_rp *pp = irq_data_get_irq_chip_data(d); in dw_pci_bottom_mask() local
128 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pci_bottom_mask()
132 raw_spin_lock_irqsave(&pp->lock, flags); in dw_pci_bottom_mask()
138 pp->irq_mask[ctrl] |= BIT(bit); in dw_pci_bottom_mask()
139 dw_pcie_writel_dbi(pci, PCIE_MSI_INTR0_MASK + res, pp->irq_mask[ctrl]); in dw_pci_bottom_mask()
141 raw_spin_unlock_irqrestore(&pp->lock, flags); in dw_pci_bottom_mask()
146 struct dw_pcie_rp *pp = irq_data_get_irq_chip_data(d); in dw_pci_bottom_unmask() local
147 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pci_bottom_unmask()
151 raw_spin_lock_irqsave(&pp->lock, flags); in dw_pci_bottom_unmask()
157 pp->irq_mask[ctrl] &= ~BIT(bit); in dw_pci_bottom_unmask()
158 dw_pcie_writel_dbi(pci, PCIE_MSI_INTR0_MASK + res, pp->irq_mask[ctrl]); in dw_pci_bottom_unmask()
160 raw_spin_unlock_irqrestore(&pp->lock, flags); in dw_pci_bottom_unmask()
165 struct dw_pcie_rp *pp = irq_data_get_irq_chip_data(d); in dw_pci_bottom_ack() local
166 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pci_bottom_ack()
189 struct dw_pcie_rp *pp = domain->host_data; in dw_pcie_irq_domain_alloc() local
194 raw_spin_lock_irqsave(&pp->lock, flags); in dw_pcie_irq_domain_alloc()
196 bit = bitmap_find_free_region(pp->msi_irq_in_use, pp->num_vectors, in dw_pcie_irq_domain_alloc()
199 raw_spin_unlock_irqrestore(&pp->lock, flags); in dw_pcie_irq_domain_alloc()
206 pp->msi_irq_chip, in dw_pcie_irq_domain_alloc()
207 pp, handle_edge_irq, in dw_pcie_irq_domain_alloc()
217 struct dw_pcie_rp *pp = domain->host_data; in dw_pcie_irq_domain_free() local
220 raw_spin_lock_irqsave(&pp->lock, flags); in dw_pcie_irq_domain_free()
222 bitmap_release_region(pp->msi_irq_in_use, d->hwirq, in dw_pcie_irq_domain_free()
225 raw_spin_unlock_irqrestore(&pp->lock, flags); in dw_pcie_irq_domain_free()
233 int dw_pcie_allocate_domains(struct dw_pcie_rp *pp) in dw_pcie_allocate_domains() argument
235 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pcie_allocate_domains()
238 pp->irq_domain = irq_domain_create_linear(fwnode, pp->num_vectors, in dw_pcie_allocate_domains()
239 &dw_pcie_msi_domain_ops, pp); in dw_pcie_allocate_domains()
240 if (!pp->irq_domain) { in dw_pcie_allocate_domains()
245 irq_domain_update_bus_token(pp->irq_domain, DOMAIN_BUS_NEXUS); in dw_pcie_allocate_domains()
247 pp->msi_domain = pci_msi_create_irq_domain(fwnode, in dw_pcie_allocate_domains()
249 pp->irq_domain); in dw_pcie_allocate_domains()
250 if (!pp->msi_domain) { in dw_pcie_allocate_domains()
252 irq_domain_remove(pp->irq_domain); in dw_pcie_allocate_domains()
259 static void dw_pcie_free_msi(struct dw_pcie_rp *pp) in dw_pcie_free_msi() argument
264 if (pp->msi_irq[ctrl] > 0) in dw_pcie_free_msi()
265 irq_set_chained_handler_and_data(pp->msi_irq[ctrl], in dw_pcie_free_msi()
269 irq_domain_remove(pp->msi_domain); in dw_pcie_free_msi()
270 irq_domain_remove(pp->irq_domain); in dw_pcie_free_msi()
273 static void dw_pcie_msi_init(struct dw_pcie_rp *pp) in dw_pcie_msi_init() argument
275 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pcie_msi_init()
276 u64 msi_target = (u64)pp->msi_data; in dw_pcie_msi_init()
278 if (!pci_msi_enabled() || !pp->has_msi_ctrl) in dw_pcie_msi_init()
286 static int dw_pcie_parse_split_msi_irq(struct dw_pcie_rp *pp) in dw_pcie_parse_split_msi_irq() argument
288 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pcie_parse_split_msi_irq()
307 pp->msi_irq[ctrl] = irq; in dw_pcie_parse_split_msi_irq()
315 if (pp->num_vectors > max_vectors) { in dw_pcie_parse_split_msi_irq()
318 pp->num_vectors = max_vectors; in dw_pcie_parse_split_msi_irq()
320 if (!pp->num_vectors) in dw_pcie_parse_split_msi_irq()
321 pp->num_vectors = max_vectors; in dw_pcie_parse_split_msi_irq()
326 static int dw_pcie_msi_host_init(struct dw_pcie_rp *pp) in dw_pcie_msi_host_init() argument
328 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pcie_msi_host_init()
336 pp->irq_mask[ctrl] = ~0; in dw_pcie_msi_host_init()
338 if (!pp->msi_irq[0]) { in dw_pcie_msi_host_init()
339 ret = dw_pcie_parse_split_msi_irq(pp); in dw_pcie_msi_host_init()
344 if (!pp->num_vectors) in dw_pcie_msi_host_init()
345 pp->num_vectors = MSI_DEF_NUM_VECTORS; in dw_pcie_msi_host_init()
346 num_ctrls = pp->num_vectors / MAX_MSI_IRQS_PER_CTRL; in dw_pcie_msi_host_init()
348 if (!pp->msi_irq[0]) { in dw_pcie_msi_host_init()
349 pp->msi_irq[0] = platform_get_irq_byname_optional(pdev, "msi"); in dw_pcie_msi_host_init()
350 if (pp->msi_irq[0] < 0) { in dw_pcie_msi_host_init()
351 pp->msi_irq[0] = platform_get_irq(pdev, 0); in dw_pcie_msi_host_init()
352 if (pp->msi_irq[0] < 0) in dw_pcie_msi_host_init()
353 return pp->msi_irq[0]; in dw_pcie_msi_host_init()
357 dev_dbg(dev, "Using %d MSI vectors\n", pp->num_vectors); in dw_pcie_msi_host_init()
359 pp->msi_irq_chip = &dw_pci_msi_bottom_irq_chip; in dw_pcie_msi_host_init()
361 ret = dw_pcie_allocate_domains(pp); in dw_pcie_msi_host_init()
366 if (pp->msi_irq[ctrl] > 0) in dw_pcie_msi_host_init()
367 irq_set_chained_handler_and_data(pp->msi_irq[ctrl], in dw_pcie_msi_host_init()
368 dw_chained_msi_isr, pp); in dw_pcie_msi_host_init()
385 msi_vaddr = dmam_alloc_coherent(dev, sizeof(u64), &pp->msi_data, in dw_pcie_msi_host_init()
389 dw_pcie_free_msi(pp); in dw_pcie_msi_host_init()
396 int dw_pcie_host_init(struct dw_pcie_rp *pp) in dw_pcie_host_init() argument
398 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pcie_host_init()
407 raw_spin_lock_init(&pp->lock); in dw_pcie_host_init()
415 pp->cfg0_size = resource_size(res); in dw_pcie_host_init()
416 pp->cfg0_base = res->start; in dw_pcie_host_init()
418 pp->va_cfg0_base = devm_pci_remap_cfg_resource(dev, res); in dw_pcie_host_init()
419 if (IS_ERR(pp->va_cfg0_base)) in dw_pcie_host_init()
420 return PTR_ERR(pp->va_cfg0_base); in dw_pcie_host_init()
430 pp->bridge = bridge; in dw_pcie_host_init()
435 pp->io_size = resource_size(win->res); in dw_pcie_host_init()
436 pp->io_bus_addr = win->res->start - win->offset; in dw_pcie_host_init()
437 pp->io_base = pci_pio_to_address(win->res->start); in dw_pcie_host_init()
444 if (pp->ops->host_init) { in dw_pcie_host_init()
445 ret = pp->ops->host_init(pp); in dw_pcie_host_init()
451 pp->has_msi_ctrl = !(pp->ops->msi_host_init || in dw_pcie_host_init()
459 if (!pp->has_msi_ctrl && !pp->num_vectors) { in dw_pcie_host_init()
460 pp->num_vectors = MSI_DEF_NUM_VECTORS; in dw_pcie_host_init()
461 } else if (pp->num_vectors > MAX_MSI_IRQS) { in dw_pcie_host_init()
467 if (pp->ops->msi_host_init) { in dw_pcie_host_init()
468 ret = pp->ops->msi_host_init(pp); in dw_pcie_host_init()
471 } else if (pp->has_msi_ctrl) { in dw_pcie_host_init()
472 ret = dw_pcie_msi_host_init(pp); in dw_pcie_host_init()
486 ret = dw_pcie_setup_rc(pp); in dw_pcie_host_init()
499 bridge->sysdata = pp; in dw_pcie_host_init()
514 if (pp->has_msi_ctrl) in dw_pcie_host_init()
515 dw_pcie_free_msi(pp); in dw_pcie_host_init()
518 if (pp->ops->host_deinit) in dw_pcie_host_init()
519 pp->ops->host_deinit(pp); in dw_pcie_host_init()
525 void dw_pcie_host_deinit(struct dw_pcie_rp *pp) in dw_pcie_host_deinit() argument
527 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pcie_host_deinit()
529 pci_stop_root_bus(pp->bridge->bus); in dw_pcie_host_deinit()
530 pci_remove_root_bus(pp->bridge->bus); in dw_pcie_host_deinit()
536 if (pp->has_msi_ctrl) in dw_pcie_host_deinit()
537 dw_pcie_free_msi(pp); in dw_pcie_host_deinit()
539 if (pp->ops->host_deinit) in dw_pcie_host_deinit()
540 pp->ops->host_deinit(pp); in dw_pcie_host_deinit()
547 struct dw_pcie_rp *pp = bus->sysdata; in dw_pcie_other_conf_map_bus() local
548 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pcie_other_conf_map_bus()
571 ret = dw_pcie_prog_outbound_atu(pci, 0, type, pp->cfg0_base, busdev, in dw_pcie_other_conf_map_bus()
572 pp->cfg0_size); in dw_pcie_other_conf_map_bus()
576 return pp->va_cfg0_base + where; in dw_pcie_other_conf_map_bus()
582 struct dw_pcie_rp *pp = bus->sysdata; in dw_pcie_rd_other_conf() local
583 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pcie_rd_other_conf()
590 if (pp->cfg0_io_shared) { in dw_pcie_rd_other_conf()
592 pp->io_base, pp->io_bus_addr, in dw_pcie_rd_other_conf()
593 pp->io_size); in dw_pcie_rd_other_conf()
604 struct dw_pcie_rp *pp = bus->sysdata; in dw_pcie_wr_other_conf() local
605 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pcie_wr_other_conf()
612 if (pp->cfg0_io_shared) { in dw_pcie_wr_other_conf()
614 pp->io_base, pp->io_bus_addr, in dw_pcie_wr_other_conf()
615 pp->io_size); in dw_pcie_wr_other_conf()
631 struct dw_pcie_rp *pp = bus->sysdata; in dw_pcie_own_conf_map_bus() local
632 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pcie_own_conf_map_bus()
647 static int dw_pcie_iatu_setup(struct dw_pcie_rp *pp) in dw_pcie_iatu_setup() argument
649 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pcie_iatu_setup()
670 resource_list_for_each_entry(entry, &pp->bridge->windows) { in dw_pcie_iatu_setup()
688 if (pp->io_size) { in dw_pcie_iatu_setup()
691 pp->io_base, in dw_pcie_iatu_setup()
692 pp->io_bus_addr, in dw_pcie_iatu_setup()
693 pp->io_size); in dw_pcie_iatu_setup()
700 pp->cfg0_io_shared = true; in dw_pcie_iatu_setup()
709 resource_list_for_each_entry(entry, &pp->bridge->dma_ranges) { in dw_pcie_iatu_setup()
734 int dw_pcie_setup_rc(struct dw_pcie_rp *pp) in dw_pcie_setup_rc() argument
736 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dw_pcie_setup_rc()
748 if (pp->has_msi_ctrl) { in dw_pcie_setup_rc()
749 num_ctrls = pp->num_vectors / MAX_MSI_IRQS_PER_CTRL; in dw_pcie_setup_rc()
755 pp->irq_mask[ctrl]); in dw_pcie_setup_rc()
762 dw_pcie_msi_init(pp); in dw_pcie_setup_rc()
792 if (pp->bridge->child_ops == &dw_child_pcie_ops) { in dw_pcie_setup_rc()
793 ret = dw_pcie_iatu_setup(pp); in dw_pcie_setup_rc()
829 if (!pci->pp.ops->pme_turn_off) in dw_pcie_suspend_noirq()
832 pci->pp.ops->pme_turn_off(&pci->pp); in dw_pcie_suspend_noirq()
842 if (pci->pp.ops->host_deinit) in dw_pcie_suspend_noirq()
843 pci->pp.ops->host_deinit(&pci->pp); in dw_pcie_suspend_noirq()
860 if (pci->pp.ops->host_init) { in dw_pcie_resume_noirq()
861 ret = pci->pp.ops->host_init(&pci->pp); in dw_pcie_resume_noirq()
868 dw_pcie_setup_rc(&pci->pp); in dw_pcie_resume_noirq()