Lines Matching +full:msi +full:- +full:map
1 // SPDX-License-Identifier: GPL-2.0-only
13 #include <linux/msi.h>
18 #include "pcie-xilinx-common.h"
46 IMR(MSI) | \
75 /* Number of MSI IRQs */
88 * struct pl_dma_pcie - PCIe port information
97 * @msi: MSI information
110 struct xilinx_msi msi; member
117 return readl(port->reg_base + reg); in pcie_read()
122 writel(val, port->reg_base + reg); in pcie_write()
136 dev_dbg(port->dev, "Requester ID %lu\n", in xilinx_pl_dma_pcie_clear_err_interrupts()
146 struct pl_dma_pcie *port = bus->sysdata; in xilinx_pl_dma_pcie_valid_device()
157 * go down between the link-up check and the PIO request. in xilinx_pl_dma_pcie_valid_device()
171 struct pl_dma_pcie *port = bus->sysdata; in xilinx_pl_dma_pcie_map_bus()
176 return port->reg_base + PCIE_ECAM_OFFSET(bus->number, devfn, where); in xilinx_pl_dma_pcie_map_bus()
190 phys_addr_t msi_addr = port->phys_reg_base; in xilinx_pl_dma_pcie_enable_msi()
202 mask = BIT(data->hwirq + XILINX_PCIE_DMA_IDRN_SHIFT); in xilinx_mask_intx_irq()
203 raw_spin_lock_irqsave(&port->lock, flags); in xilinx_mask_intx_irq()
206 raw_spin_unlock_irqrestore(&port->lock, flags); in xilinx_mask_intx_irq()
215 mask = BIT(data->hwirq + XILINX_PCIE_DMA_IDRN_SHIFT); in xilinx_unmask_intx_irq()
216 raw_spin_lock_irqsave(&port->lock, flags); in xilinx_unmask_intx_irq()
219 raw_spin_unlock_irqrestore(&port->lock, flags); in xilinx_unmask_intx_irq()
232 irq_set_chip_data(irq, domain->host_data); in xilinx_pl_dma_pcie_intx_map()
240 .map = xilinx_pl_dma_pcie_intx_map,
245 struct xilinx_msi *msi; in xilinx_pl_dma_pcie_msi_handler_high() local
250 msi = &port->msi; in xilinx_pl_dma_pcie_msi_handler_high()
256 virq = irq_find_mapping(msi->dev_domain, bit); in xilinx_pl_dma_pcie_msi_handler_high()
268 struct xilinx_msi *msi; in xilinx_pl_dma_pcie_msi_handler_low() local
272 msi = &port->msi; in xilinx_pl_dma_pcie_msi_handler_low()
277 virq = irq_find_mapping(msi->dev_domain, bit); in xilinx_pl_dma_pcie_msi_handler_low()
295 generic_handle_domain_irq(port->pldma_domain, i); in xilinx_pl_dma_pcie_event_flow()
328 struct device *dev = port->dev; in xilinx_pl_dma_pcie_intr_handler()
331 d = irq_domain_get_irq_data(port->pldma_domain, irq); in xilinx_pl_dma_pcie_intr_handler()
332 switch (d->hwirq) { in xilinx_pl_dma_pcie_intr_handler()
340 if (intr_cause[d->hwirq].str) in xilinx_pl_dma_pcie_intr_handler()
341 dev_warn(dev, "%s\n", intr_cause[d->hwirq].str); in xilinx_pl_dma_pcie_intr_handler()
343 dev_warn(dev, "Unknown IRQ %ld\n", d->hwirq); in xilinx_pl_dma_pcie_intr_handler()
350 .name = "pl_dma:PCIe MSI",
366 phys_addr_t msi_addr = pcie->phys_reg_base; in xilinx_compose_msi_msg()
368 msg->address_lo = lower_32_bits(msi_addr); in xilinx_compose_msi_msg()
369 msg->address_hi = upper_32_bits(msi_addr); in xilinx_compose_msi_msg()
370 msg->data = data->hwirq; in xilinx_compose_msi_msg()
376 return -EINVAL; in xilinx_msi_set_affinity()
380 .name = "pl_dma:MSI",
388 struct pl_dma_pcie *pcie = domain->host_data; in xilinx_irq_domain_alloc()
389 struct xilinx_msi *msi = &pcie->msi; in xilinx_irq_domain_alloc() local
392 mutex_lock(&msi->lock); in xilinx_irq_domain_alloc()
393 bit = bitmap_find_free_region(msi->bitmap, XILINX_NUM_MSI_IRQS, in xilinx_irq_domain_alloc()
396 mutex_unlock(&msi->lock); in xilinx_irq_domain_alloc()
397 return -ENOSPC; in xilinx_irq_domain_alloc()
402 domain->host_data, handle_simple_irq, in xilinx_irq_domain_alloc()
405 mutex_unlock(&msi->lock); in xilinx_irq_domain_alloc()
415 struct xilinx_msi *msi = &pcie->msi; in xilinx_irq_domain_free() local
417 mutex_lock(&msi->lock); in xilinx_irq_domain_free()
418 bitmap_release_region(msi->bitmap, data->hwirq, in xilinx_irq_domain_free()
420 mutex_unlock(&msi->lock); in xilinx_irq_domain_free()
430 struct xilinx_msi *msi = &port->msi; in xilinx_pl_dma_pcie_free_irq_domains() local
432 if (port->intx_domain) { in xilinx_pl_dma_pcie_free_irq_domains()
433 irq_domain_remove(port->intx_domain); in xilinx_pl_dma_pcie_free_irq_domains()
434 port->intx_domain = NULL; in xilinx_pl_dma_pcie_free_irq_domains()
437 if (msi->dev_domain) { in xilinx_pl_dma_pcie_free_irq_domains()
438 irq_domain_remove(msi->dev_domain); in xilinx_pl_dma_pcie_free_irq_domains()
439 msi->dev_domain = NULL; in xilinx_pl_dma_pcie_free_irq_domains()
442 if (msi->msi_domain) { in xilinx_pl_dma_pcie_free_irq_domains()
443 irq_domain_remove(msi->msi_domain); in xilinx_pl_dma_pcie_free_irq_domains()
444 msi->msi_domain = NULL; in xilinx_pl_dma_pcie_free_irq_domains()
450 struct device *dev = port->dev; in xilinx_pl_dma_pcie_init_msi_irq_domain()
451 struct xilinx_msi *msi = &port->msi; in xilinx_pl_dma_pcie_init_msi_irq_domain() local
453 struct fwnode_handle *fwnode = of_node_to_fwnode(port->dev->of_node); in xilinx_pl_dma_pcie_init_msi_irq_domain()
455 msi->dev_domain = irq_domain_add_linear(NULL, XILINX_NUM_MSI_IRQS, in xilinx_pl_dma_pcie_init_msi_irq_domain()
457 if (!msi->dev_domain) in xilinx_pl_dma_pcie_init_msi_irq_domain()
460 msi->msi_domain = pci_msi_create_irq_domain(fwnode, in xilinx_pl_dma_pcie_init_msi_irq_domain()
462 msi->dev_domain); in xilinx_pl_dma_pcie_init_msi_irq_domain()
463 if (!msi->msi_domain) in xilinx_pl_dma_pcie_init_msi_irq_domain()
466 mutex_init(&msi->lock); in xilinx_pl_dma_pcie_init_msi_irq_domain()
467 msi->bitmap = kzalloc(size, GFP_KERNEL); in xilinx_pl_dma_pcie_init_msi_irq_domain()
468 if (!msi->bitmap) in xilinx_pl_dma_pcie_init_msi_irq_domain()
471 raw_spin_lock_init(&port->lock); in xilinx_pl_dma_pcie_init_msi_irq_domain()
478 dev_err(dev, "Failed to allocate MSI IRQ domains\n"); in xilinx_pl_dma_pcie_init_msi_irq_domain()
480 return -ENOMEM; in xilinx_pl_dma_pcie_init_msi_irq_domain()
499 generic_handle_domain_irq(port->intx_domain, i); in xilinx_pl_dma_pcie_intx_flow()
508 raw_spin_lock(&port->lock); in xilinx_pl_dma_pcie_mask_event_irq()
510 val &= ~BIT(d->hwirq); in xilinx_pl_dma_pcie_mask_event_irq()
512 raw_spin_unlock(&port->lock); in xilinx_pl_dma_pcie_mask_event_irq()
520 raw_spin_lock(&port->lock); in xilinx_pl_dma_pcie_unmask_event_irq()
522 val |= BIT(d->hwirq); in xilinx_pl_dma_pcie_unmask_event_irq()
524 raw_spin_unlock(&port->lock); in xilinx_pl_dma_pcie_unmask_event_irq()
528 .name = "pl_dma:RC-Event",
538 irq_set_chip_data(irq, domain->host_data); in xilinx_pl_dma_pcie_event_map()
545 .map = xilinx_pl_dma_pcie_event_map,
549 * xilinx_pl_dma_pcie_init_irq_domain - Initialize IRQ domain
556 struct device *dev = port->dev; in xilinx_pl_dma_pcie_init_irq_domain()
557 struct device_node *node = dev->of_node; in xilinx_pl_dma_pcie_init_irq_domain()
562 pcie_intc_node = of_get_child_by_name(node, "interrupt-controller"); in xilinx_pl_dma_pcie_init_irq_domain()
565 return -EINVAL; in xilinx_pl_dma_pcie_init_irq_domain()
568 port->pldma_domain = irq_domain_add_linear(pcie_intc_node, 32, in xilinx_pl_dma_pcie_init_irq_domain()
570 if (!port->pldma_domain) in xilinx_pl_dma_pcie_init_irq_domain()
571 return -ENOMEM; in xilinx_pl_dma_pcie_init_irq_domain()
573 irq_domain_update_bus_token(port->pldma_domain, DOMAIN_BUS_NEXUS); in xilinx_pl_dma_pcie_init_irq_domain()
575 port->intx_domain = irq_domain_add_linear(pcie_intc_node, PCI_NUM_INTX, in xilinx_pl_dma_pcie_init_irq_domain()
577 if (!port->intx_domain) { in xilinx_pl_dma_pcie_init_irq_domain()
579 return -ENOMEM; in xilinx_pl_dma_pcie_init_irq_domain()
582 irq_domain_update_bus_token(port->intx_domain, DOMAIN_BUS_WIRED); in xilinx_pl_dma_pcie_init_irq_domain()
586 irq_domain_remove(port->intx_domain); in xilinx_pl_dma_pcie_init_irq_domain()
587 return -ENOMEM; in xilinx_pl_dma_pcie_init_irq_domain()
591 raw_spin_lock_init(&port->lock); in xilinx_pl_dma_pcie_init_irq_domain()
598 struct device *dev = port->dev; in xilinx_pl_dma_pcie_setup_irq()
602 port->irq = platform_get_irq(pdev, 0); in xilinx_pl_dma_pcie_setup_irq()
603 if (port->irq < 0) in xilinx_pl_dma_pcie_setup_irq()
604 return port->irq; in xilinx_pl_dma_pcie_setup_irq()
612 irq = irq_create_mapping(port->pldma_domain, i); in xilinx_pl_dma_pcie_setup_irq()
614 dev_err(dev, "Failed to map interrupt\n"); in xilinx_pl_dma_pcie_setup_irq()
615 return -ENXIO; in xilinx_pl_dma_pcie_setup_irq()
628 port->intx_irq = irq_create_mapping(port->pldma_domain, in xilinx_pl_dma_pcie_setup_irq()
630 if (!port->intx_irq) { in xilinx_pl_dma_pcie_setup_irq()
631 dev_err(dev, "Failed to map INTx interrupt\n"); in xilinx_pl_dma_pcie_setup_irq()
632 return -ENXIO; in xilinx_pl_dma_pcie_setup_irq()
635 err = devm_request_irq(dev, port->intx_irq, xilinx_pl_dma_pcie_intx_flow, in xilinx_pl_dma_pcie_setup_irq()
638 dev_err(dev, "Failed to request INTx IRQ %d\n", port->intx_irq); in xilinx_pl_dma_pcie_setup_irq()
642 err = devm_request_irq(dev, port->irq, xilinx_pl_dma_pcie_event_flow, in xilinx_pl_dma_pcie_setup_irq()
645 dev_err(dev, "Failed to request event IRQ %d\n", port->irq); in xilinx_pl_dma_pcie_setup_irq()
655 dev_info(port->dev, "PCIe Link is UP\n"); in xilinx_pl_dma_pcie_init_port()
657 dev_info(port->dev, "PCIe Link is DOWN\n"); in xilinx_pl_dma_pcie_init_port()
668 /* Needed for MSI DECODE MODE */ in xilinx_pl_dma_pcie_init_port()
682 struct device *dev = port->dev; in xilinx_request_msi_irq()
686 port->msi.irq_msi0 = platform_get_irq_byname(pdev, "msi0"); in xilinx_request_msi_irq()
687 if (port->msi.irq_msi0 <= 0) in xilinx_request_msi_irq()
688 return port->msi.irq_msi0; in xilinx_request_msi_irq()
690 ret = devm_request_irq(dev, port->msi.irq_msi0, xilinx_pl_dma_pcie_msi_handler_low, in xilinx_request_msi_irq()
691 IRQF_SHARED | IRQF_NO_THREAD, "xlnx-pcie-dma-pl", in xilinx_request_msi_irq()
698 port->msi.irq_msi1 = platform_get_irq_byname(pdev, "msi1"); in xilinx_request_msi_irq()
699 if (port->msi.irq_msi1 <= 0) in xilinx_request_msi_irq()
700 return port->msi.irq_msi1; in xilinx_request_msi_irq()
702 ret = devm_request_irq(dev, port->msi.irq_msi1, xilinx_pl_dma_pcie_msi_handler_high, in xilinx_request_msi_irq()
703 IRQF_SHARED | IRQF_NO_THREAD, "xlnx-pcie-dma-pl", in xilinx_request_msi_irq()
716 struct device *dev = port->dev; in xilinx_pl_dma_pcie_parse_dt()
724 return -ENXIO; in xilinx_pl_dma_pcie_parse_dt()
726 port->phys_reg_base = res->start; in xilinx_pl_dma_pcie_parse_dt()
728 port->cfg = pci_ecam_create(dev, res, bus_range, &xilinx_pl_dma_pcie_ops); in xilinx_pl_dma_pcie_parse_dt()
729 if (IS_ERR(port->cfg)) in xilinx_pl_dma_pcie_parse_dt()
730 return PTR_ERR(port->cfg); in xilinx_pl_dma_pcie_parse_dt()
732 port->reg_base = port->cfg->win; in xilinx_pl_dma_pcie_parse_dt()
736 pci_ecam_free(port->cfg); in xilinx_pl_dma_pcie_parse_dt()
745 struct device *dev = &pdev->dev; in xilinx_pl_dma_pcie_probe()
753 return -ENODEV; in xilinx_pl_dma_pcie_probe()
757 port->dev = dev; in xilinx_pl_dma_pcie_probe()
759 bus = resource_list_first_type(&bridge->windows, IORESOURCE_BUS); in xilinx_pl_dma_pcie_probe()
761 return -ENODEV; in xilinx_pl_dma_pcie_probe()
763 err = xilinx_pl_dma_pcie_parse_dt(port, bus->res); in xilinx_pl_dma_pcie_probe()
777 bridge->sysdata = port; in xilinx_pl_dma_pcie_probe()
778 bridge->ops = &xilinx_pl_dma_pcie_ops.pci_ops; in xilinx_pl_dma_pcie_probe()
790 pci_ecam_free(port->cfg); in xilinx_pl_dma_pcie_probe()
796 .compatible = "xlnx,xdma-host-3.00",
803 .name = "xilinx-xdma-pcie",