Lines Matching full:msi
19 #include <linux/msi.h>
153 /* MSI target addresses */
240 int nr; /* No. of MSI available, depends on chip */
254 struct brcm_msi *msi; member
440 .name = "BRCM STB PCIe MSI",
447 /* Multi MSI is supported by the controller, but not by this driver */
456 struct brcm_msi *msi; in brcm_pcie_msi_isr() local
461 msi = irq_desc_get_handler_data(desc); in brcm_pcie_msi_isr()
462 dev = msi->dev; in brcm_pcie_msi_isr()
464 status = readl(msi->intr_base + MSI_INT_STATUS); in brcm_pcie_msi_isr()
465 status >>= msi->legacy_shift; in brcm_pcie_msi_isr()
467 for_each_set_bit(bit, &status, msi->nr) { in brcm_pcie_msi_isr()
469 ret = generic_handle_domain_irq(msi->inner_domain, bit); in brcm_pcie_msi_isr()
471 dev_dbg(dev, "unexpected MSI\n"); in brcm_pcie_msi_isr()
479 struct brcm_msi *msi = irq_data_get_irq_chip_data(data); in brcm_msi_compose_msi_msg() local
481 msg->address_lo = lower_32_bits(msi->target_addr); in brcm_msi_compose_msi_msg()
482 msg->address_hi = upper_32_bits(msi->target_addr); in brcm_msi_compose_msi_msg()
494 struct brcm_msi *msi = irq_data_get_irq_chip_data(data); in brcm_msi_ack_irq() local
495 const int shift_amt = data->hwirq + msi->legacy_shift; in brcm_msi_ack_irq()
497 writel(1 << shift_amt, msi->intr_base + MSI_INT_CLR); in brcm_msi_ack_irq()
502 .name = "BRCM STB MSI",
508 static int brcm_msi_alloc(struct brcm_msi *msi) in brcm_msi_alloc() argument
512 mutex_lock(&msi->lock); in brcm_msi_alloc()
513 hwirq = bitmap_find_free_region(msi->used, msi->nr, 0); in brcm_msi_alloc()
514 mutex_unlock(&msi->lock); in brcm_msi_alloc()
519 static void brcm_msi_free(struct brcm_msi *msi, unsigned long hwirq) in brcm_msi_free() argument
521 mutex_lock(&msi->lock); in brcm_msi_free()
522 bitmap_release_region(msi->used, hwirq, 0); in brcm_msi_free()
523 mutex_unlock(&msi->lock); in brcm_msi_free()
529 struct brcm_msi *msi = domain->host_data; in brcm_irq_domain_alloc() local
532 hwirq = brcm_msi_alloc(msi); in brcm_irq_domain_alloc()
547 struct brcm_msi *msi = irq_data_get_irq_chip_data(d); in brcm_irq_domain_free() local
549 brcm_msi_free(msi, d->hwirq); in brcm_irq_domain_free()
557 static int brcm_allocate_domains(struct brcm_msi *msi) in brcm_allocate_domains() argument
559 struct fwnode_handle *fwnode = of_node_to_fwnode(msi->np); in brcm_allocate_domains()
560 struct device *dev = msi->dev; in brcm_allocate_domains()
562 msi->inner_domain = irq_domain_add_linear(NULL, msi->nr, &msi_domain_ops, msi); in brcm_allocate_domains()
563 if (!msi->inner_domain) { in brcm_allocate_domains()
568 msi->msi_domain = pci_msi_create_irq_domain(fwnode, in brcm_allocate_domains()
570 msi->inner_domain); in brcm_allocate_domains()
571 if (!msi->msi_domain) { in brcm_allocate_domains()
572 dev_err(dev, "failed to create MSI domain\n"); in brcm_allocate_domains()
573 irq_domain_remove(msi->inner_domain); in brcm_allocate_domains()
580 static void brcm_free_domains(struct brcm_msi *msi) in brcm_free_domains() argument
582 irq_domain_remove(msi->msi_domain); in brcm_free_domains()
583 irq_domain_remove(msi->inner_domain); in brcm_free_domains()
588 struct brcm_msi *msi = pcie->msi; in brcm_msi_remove() local
590 if (!msi) in brcm_msi_remove()
592 irq_set_chained_handler_and_data(msi->irq, NULL, NULL); in brcm_msi_remove()
593 brcm_free_domains(msi); in brcm_msi_remove()
596 static void brcm_msi_set_regs(struct brcm_msi *msi) in brcm_msi_set_regs() argument
598 u32 val = msi->legacy ? BRCM_INT_PCI_MSI_LEGACY_MASK : in brcm_msi_set_regs()
601 writel(val, msi->intr_base + MSI_INT_MASK_CLR); in brcm_msi_set_regs()
602 writel(val, msi->intr_base + MSI_INT_CLR); in brcm_msi_set_regs()
605 * The 0 bit of PCIE_MISC_MSI_BAR_CONFIG_LO is repurposed to MSI in brcm_msi_set_regs()
608 writel(lower_32_bits(msi->target_addr) | 0x1, in brcm_msi_set_regs()
609 msi->base + PCIE_MISC_MSI_BAR_CONFIG_LO); in brcm_msi_set_regs()
610 writel(upper_32_bits(msi->target_addr), in brcm_msi_set_regs()
611 msi->base + PCIE_MISC_MSI_BAR_CONFIG_HI); in brcm_msi_set_regs()
613 val = msi->legacy ? PCIE_MISC_MSI_DATA_CONFIG_VAL_8 : PCIE_MISC_MSI_DATA_CONFIG_VAL_32; in brcm_msi_set_regs()
614 writel(val, msi->base + PCIE_MISC_MSI_DATA_CONFIG); in brcm_msi_set_regs()
619 struct brcm_msi *msi; in brcm_pcie_enable_msi() local
625 dev_err(dev, "cannot map MSI interrupt\n"); in brcm_pcie_enable_msi()
629 msi = devm_kzalloc(dev, sizeof(struct brcm_msi), GFP_KERNEL); in brcm_pcie_enable_msi()
630 if (!msi) in brcm_pcie_enable_msi()
633 mutex_init(&msi->lock); in brcm_pcie_enable_msi()
634 msi->dev = dev; in brcm_pcie_enable_msi()
635 msi->base = pcie->base; in brcm_pcie_enable_msi()
636 msi->np = pcie->np; in brcm_pcie_enable_msi()
637 msi->target_addr = pcie->msi_target_addr; in brcm_pcie_enable_msi()
638 msi->irq = irq; in brcm_pcie_enable_msi()
639 msi->legacy = pcie->hw_rev < BRCM_PCIE_HW_REV_33; in brcm_pcie_enable_msi()
647 if (msi->legacy) { in brcm_pcie_enable_msi()
648 msi->intr_base = msi->base + PCIE_INTR2_CPU_BASE; in brcm_pcie_enable_msi()
649 msi->nr = BRCM_INT_PCI_MSI_LEGACY_NR; in brcm_pcie_enable_msi()
650 msi->legacy_shift = 24; in brcm_pcie_enable_msi()
652 msi->intr_base = msi->base + PCIE_MSI_INTR2_BASE; in brcm_pcie_enable_msi()
653 msi->nr = BRCM_INT_PCI_MSI_NR; in brcm_pcie_enable_msi()
654 msi->legacy_shift = 0; in brcm_pcie_enable_msi()
657 ret = brcm_allocate_domains(msi); in brcm_pcie_enable_msi()
661 irq_set_chained_handler_and_data(msi->irq, brcm_pcie_msi_isr, msi); in brcm_pcie_enable_msi()
663 brcm_msi_set_regs(msi); in brcm_pcie_enable_msi()
664 pcie->msi = msi; in brcm_pcie_enable_msi()
848 * only address 32bits. We would also like to put the MSI under 4GB in brcm_pcie_get_rc_bar2_size_and_offset()
849 * as well, since some devices require a 32bit MSI target address. in brcm_pcie_get_rc_bar2_size_and_offset()
939 * We ideally want the MSI target address to be located in the 32bit in brcm_pcie_setup()
1362 if (pcie->msi) in brcm_pcie_resume_noirq()
1363 brcm_msi_set_regs(pcie->msi); in brcm_pcie_resume_noirq()
1565 msi_np = of_parse_phandle(pcie->np, "msi-parent", 0); in brcm_pcie_probe()
1569 dev_err(pcie->dev, "probe of internal MSI failed"); in brcm_pcie_probe()