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