Lines Matching full:msi

19 #include <linux/msi.h>
148 /* MSI target adresses */
269 /* used indicates which MSI interrupts have been alloc'd */
274 int nr; /* No. of MSI available, depends on chip */
288 struct brcm_msi *msi; member
464 .name = "BRCM STB PCIe MSI",
471 /* Multi MSI is supported by the controller, but not by this driver */
480 struct brcm_msi *msi; in brcm_pcie_msi_isr() local
485 msi = irq_desc_get_handler_data(desc); in brcm_pcie_msi_isr()
486 dev = msi->dev; in brcm_pcie_msi_isr()
488 status = readl(msi->intr_base + MSI_INT_STATUS); in brcm_pcie_msi_isr()
489 status >>= msi->legacy_shift; in brcm_pcie_msi_isr()
491 for_each_set_bit(bit, &status, msi->nr) { in brcm_pcie_msi_isr()
493 ret = generic_handle_domain_irq(msi->inner_domain, bit); in brcm_pcie_msi_isr()
495 dev_dbg(dev, "unexpected MSI\n"); in brcm_pcie_msi_isr()
503 struct brcm_msi *msi = irq_data_get_irq_chip_data(data); in brcm_msi_compose_msi_msg() local
505 msg->address_lo = lower_32_bits(msi->target_addr); in brcm_msi_compose_msi_msg()
506 msg->address_hi = upper_32_bits(msi->target_addr); in brcm_msi_compose_msi_msg()
518 struct brcm_msi *msi = irq_data_get_irq_chip_data(data); in brcm_msi_ack_irq() local
519 const int shift_amt = data->hwirq + msi->legacy_shift; in brcm_msi_ack_irq()
521 writel(1 << shift_amt, msi->intr_base + MSI_INT_CLR); in brcm_msi_ack_irq()
526 .name = "BRCM STB MSI",
532 static int brcm_msi_alloc(struct brcm_msi *msi) in brcm_msi_alloc() argument
536 mutex_lock(&msi->lock); in brcm_msi_alloc()
537 hwirq = bitmap_find_free_region(&msi->used, msi->nr, 0); in brcm_msi_alloc()
538 mutex_unlock(&msi->lock); in brcm_msi_alloc()
543 static void brcm_msi_free(struct brcm_msi *msi, unsigned long hwirq) in brcm_msi_free() argument
545 mutex_lock(&msi->lock); in brcm_msi_free()
546 bitmap_release_region(&msi->used, hwirq, 0); in brcm_msi_free()
547 mutex_unlock(&msi->lock); in brcm_msi_free()
553 struct brcm_msi *msi = domain->host_data; in brcm_irq_domain_alloc() local
556 hwirq = brcm_msi_alloc(msi); in brcm_irq_domain_alloc()
571 struct brcm_msi *msi = irq_data_get_irq_chip_data(d); in brcm_irq_domain_free() local
573 brcm_msi_free(msi, d->hwirq); in brcm_irq_domain_free()
581 static int brcm_allocate_domains(struct brcm_msi *msi) in brcm_allocate_domains() argument
583 struct fwnode_handle *fwnode = of_node_to_fwnode(msi->np); in brcm_allocate_domains()
584 struct device *dev = msi->dev; in brcm_allocate_domains()
586 msi->inner_domain = irq_domain_add_linear(NULL, msi->nr, &msi_domain_ops, msi); in brcm_allocate_domains()
587 if (!msi->inner_domain) { in brcm_allocate_domains()
592 msi->msi_domain = pci_msi_create_irq_domain(fwnode, in brcm_allocate_domains()
594 msi->inner_domain); in brcm_allocate_domains()
595 if (!msi->msi_domain) { in brcm_allocate_domains()
596 dev_err(dev, "failed to create MSI domain\n"); in brcm_allocate_domains()
597 irq_domain_remove(msi->inner_domain); in brcm_allocate_domains()
604 static void brcm_free_domains(struct brcm_msi *msi) in brcm_free_domains() argument
606 irq_domain_remove(msi->msi_domain); in brcm_free_domains()
607 irq_domain_remove(msi->inner_domain); in brcm_free_domains()
612 struct brcm_msi *msi = pcie->msi; in brcm_msi_remove() local
614 if (!msi) in brcm_msi_remove()
616 irq_set_chained_handler_and_data(msi->irq, NULL, NULL); in brcm_msi_remove()
617 brcm_free_domains(msi); in brcm_msi_remove()
620 static void brcm_msi_set_regs(struct brcm_msi *msi) in brcm_msi_set_regs() argument
622 u32 val = __GENMASK(31, msi->legacy_shift); in brcm_msi_set_regs()
624 writel(val, msi->intr_base + MSI_INT_MASK_CLR); in brcm_msi_set_regs()
625 writel(val, msi->intr_base + MSI_INT_CLR); in brcm_msi_set_regs()
628 * The 0 bit of PCIE_MISC_MSI_BAR_CONFIG_LO is repurposed to MSI in brcm_msi_set_regs()
631 writel(lower_32_bits(msi->target_addr) | 0x1, in brcm_msi_set_regs()
632 msi->base + PCIE_MISC_MSI_BAR_CONFIG_LO); in brcm_msi_set_regs()
633 writel(upper_32_bits(msi->target_addr), in brcm_msi_set_regs()
634 msi->base + PCIE_MISC_MSI_BAR_CONFIG_HI); in brcm_msi_set_regs()
636 val = msi->legacy ? PCIE_MISC_MSI_DATA_CONFIG_VAL_8 : PCIE_MISC_MSI_DATA_CONFIG_VAL_32; in brcm_msi_set_regs()
637 writel(val, msi->base + PCIE_MISC_MSI_DATA_CONFIG); in brcm_msi_set_regs()
642 struct brcm_msi *msi; in brcm_pcie_enable_msi() local
648 dev_err(dev, "cannot map MSI interrupt\n"); in brcm_pcie_enable_msi()
652 msi = devm_kzalloc(dev, sizeof(struct brcm_msi), GFP_KERNEL); in brcm_pcie_enable_msi()
653 if (!msi) in brcm_pcie_enable_msi()
656 mutex_init(&msi->lock); in brcm_pcie_enable_msi()
657 msi->dev = dev; in brcm_pcie_enable_msi()
658 msi->base = pcie->base; in brcm_pcie_enable_msi()
659 msi->np = pcie->np; in brcm_pcie_enable_msi()
660 msi->target_addr = pcie->msi_target_addr; in brcm_pcie_enable_msi()
661 msi->irq = irq; in brcm_pcie_enable_msi()
662 msi->legacy = pcie->hw_rev < BRCM_PCIE_HW_REV_33; in brcm_pcie_enable_msi()
664 if (msi->legacy) { in brcm_pcie_enable_msi()
665 msi->intr_base = msi->base + PCIE_INTR2_CPU_BASE; in brcm_pcie_enable_msi()
666 msi->nr = BRCM_INT_PCI_MSI_LEGACY_NR; in brcm_pcie_enable_msi()
667 msi->legacy_shift = 24; in brcm_pcie_enable_msi()
669 msi->intr_base = msi->base + PCIE_MSI_INTR2_BASE; in brcm_pcie_enable_msi()
670 msi->nr = BRCM_INT_PCI_MSI_NR; in brcm_pcie_enable_msi()
671 msi->legacy_shift = 0; in brcm_pcie_enable_msi()
674 ret = brcm_allocate_domains(msi); in brcm_pcie_enable_msi()
678 irq_set_chained_handler_and_data(msi->irq, brcm_pcie_msi_isr, msi); in brcm_pcie_enable_msi()
680 brcm_msi_set_regs(msi); in brcm_pcie_enable_msi()
681 pcie->msi = msi; in brcm_pcie_enable_msi()
846 * only address 32bits. We would also like to put the MSI under 4GB in brcm_pcie_get_rc_bar2_size_and_offset()
847 * as well, since some devices require a 32bit MSI target address. in brcm_pcie_get_rc_bar2_size_and_offset()
936 * We ideally want the MSI target address to be located in the 32bit in brcm_pcie_setup()
1189 if (pcie->msi) in brcm_pcie_resume()
1190 brcm_msi_set_regs(pcie->msi); in brcm_pcie_resume()
1309 msi_np = of_parse_phandle(pcie->np, "msi-parent", 0); in brcm_pcie_probe()
1313 dev_err(pcie->dev, "probe of internal MSI failed"); in brcm_pcie_probe()