Lines Matching full:msi
11 #include <linux/msi.h>
35 #define msi_hwirq(msi, msir_index, intr_index) \ argument
36 ((msir_index) << (msi)->srs_shift | \
37 ((intr_index) << (msi)->ibs_shift))
59 * in the cascade interrupt. So, this MSI interrupt has been acked
74 seq_printf(p, " fsl-msi-%d", cascade_virq); in fsl_msi_print_chip()
151 /* If the msi-address-64 property exists, then use it */ in fsl_compose_msi_msg()
152 reg = of_get_property(hose->dn, "msi-address-64", &len); in fsl_compose_msi_msg()
163 * that neither MSI nor MSI-X can work fine. in fsl_compose_msi_msg()
164 * This is a workaround to allow MSI-X to function in fsl_compose_msi_msg()
165 * properly. It only works for MSI-X, we prevent in fsl_compose_msi_msg()
166 * MSI on buggy chips in fsl_setup_msi_irqs(). in fsl_compose_msi_msg()
191 * MPIC version 2.0 has erratum PIC1. For now MSI in fsl_setup_msi_irqs()
192 * could not work. So check to prevent MSI from in fsl_setup_msi_irqs()
201 * If the PCI node has an fsl,msi property, then we need to use it in fsl_setup_msi_irqs()
202 * to find the specific MSI. in fsl_setup_msi_irqs()
204 np = of_parse_phandle(hose->dn, "fsl,msi", 0); in fsl_setup_msi_irqs()
206 if (of_device_is_compatible(np, "fsl,mpic-msi") || in fsl_setup_msi_irqs()
207 of_device_is_compatible(np, "fsl,vmpic-msi") || in fsl_setup_msi_irqs()
208 of_device_is_compatible(np, "fsl,vmpic-msi-v4.3")) in fsl_setup_msi_irqs()
212 "node %pOF has an invalid fsl,msi phandle %u\n", in fsl_setup_msi_irqs()
222 * Loop over all the MSI devices until we find one that has an in fsl_setup_msi_irqs()
227 * If the PCI node has an fsl,msi property, then we in fsl_setup_msi_irqs()
228 * restrict our search to the corresponding MSI node. in fsl_setup_msi_irqs()
229 * The simplest way is to skip over MSI nodes with the in fsl_setup_msi_irqs()
231 * has the additional benefit of skipping over MSI in fsl_setup_msi_irqs()
244 dev_err(&pdev->dev, "could not allocate MSI interrupt\n"); in fsl_setup_msi_irqs()
300 pr_err("fsl-msi: fh_vmpic_get_msir() failed for " in fsl_msi_cascade()
328 struct fsl_msi *msi = platform_get_drvdata(ofdev); in fsl_of_msi_remove() local
331 if (msi->list.prev != NULL) in fsl_of_msi_remove()
332 list_del(&msi->list); in fsl_of_msi_remove()
334 if (msi->cascade_array[i]) { in fsl_of_msi_remove()
335 virq = msi->cascade_array[i]->virq; in fsl_of_msi_remove()
339 free_irq(virq, msi->cascade_array[i]); in fsl_of_msi_remove()
340 kfree(msi->cascade_array[i]); in fsl_of_msi_remove()
344 if (msi->bitmap.bitmap) in fsl_of_msi_remove()
345 msi_bitmap_free(&msi->bitmap); in fsl_of_msi_remove()
346 if ((msi->feature & FSL_PIC_IP_MASK) != FSL_PIC_IP_VMPIC) in fsl_of_msi_remove()
347 iounmap(msi->msi_regs); in fsl_of_msi_remove()
348 kfree(msi); in fsl_of_msi_remove()
356 static int fsl_msi_setup_hwirq(struct fsl_msi *msi, struct platform_device *dev, in fsl_msi_setup_hwirq() argument
371 dev_err(&dev->dev, "No memory for MSI cascade data\n"); in fsl_msi_setup_hwirq()
377 cascade_data->msi_data = msi; in fsl_msi_setup_hwirq()
379 msi->cascade_array[irq_index] = cascade_data; in fsl_msi_setup_hwirq()
382 "fsl-msi-cascade", cascade_data); in fsl_msi_setup_hwirq()
389 /* Release the hwirqs corresponding to this MSI register */ in fsl_msi_setup_hwirq()
391 msi_bitmap_free_hwirqs(&msi->bitmap, in fsl_msi_setup_hwirq()
392 msi_hwirq(msi, offset, i), 1); in fsl_msi_setup_hwirq()
401 struct fsl_msi *msi; in fsl_of_msi_probe() local
415 printk(KERN_DEBUG "Setting up Freescale MSI support\n"); in fsl_of_msi_probe()
417 msi = kzalloc(sizeof(struct fsl_msi), GFP_KERNEL); in fsl_of_msi_probe()
418 if (!msi) { in fsl_of_msi_probe()
419 dev_err(&dev->dev, "No memory for MSI structure\n"); in fsl_of_msi_probe()
422 platform_set_drvdata(dev, msi); in fsl_of_msi_probe()
424 msi->irqhost = irq_domain_add_linear(dev->dev.of_node, in fsl_of_msi_probe()
425 NR_MSI_IRQS_MAX, &fsl_msi_host_ops, msi); in fsl_of_msi_probe()
427 if (msi->irqhost == NULL) { in fsl_of_msi_probe()
428 dev_err(&dev->dev, "No memory for MSI irqhost\n"); in fsl_of_msi_probe()
434 * Under the Freescale hypervisor, the msi nodes don't have a 'reg' in fsl_of_msi_probe()
435 * property. Instead, we use hypercalls to access the MSI. in fsl_of_msi_probe()
445 msi->msi_regs = ioremap(res.start, resource_size(&res)); in fsl_of_msi_probe()
446 if (!msi->msi_regs) { in fsl_of_msi_probe()
452 msi->msiir_offset = in fsl_of_msi_probe()
460 msi->msiir_offset = features->msiir_offset + in fsl_of_msi_probe()
463 msi->msiir_offset = msiir.start & MSIIR_OFFSET_MASK; in fsl_of_msi_probe()
466 msi->feature = features->fsl_pic_ip; in fsl_of_msi_probe()
471 msi->feature |= MSI_HW_ERRATA_ENDIAN; in fsl_of_msi_probe()
475 * that have an "fsl,msi" property. in fsl_of_msi_probe()
477 msi->phandle = dev->dev.of_node->phandle; in fsl_of_msi_probe()
479 err = fsl_msi_init_allocator(msi); in fsl_of_msi_probe()
481 dev_err(&dev->dev, "Error allocating MSI bitmap\n"); in fsl_of_msi_probe()
485 p = of_get_property(dev->dev.of_node, "msi-available-ranges", &len); in fsl_of_msi_probe()
487 if (of_device_is_compatible(dev->dev.of_node, "fsl,mpic-msi-v4.3") || in fsl_of_msi_probe()
488 of_device_is_compatible(dev->dev.of_node, "fsl,vmpic-msi-v4.3")) { in fsl_of_msi_probe()
489 msi->srs_shift = MSIIR1_SRS_SHIFT; in fsl_of_msi_probe()
490 msi->ibs_shift = MSIIR1_IBS_SHIFT; in fsl_of_msi_probe()
492 dev_warn(&dev->dev, "%s: dose not support msi-available-ranges property\n", in fsl_of_msi_probe()
497 err = fsl_msi_setup_hwirq(msi, dev, in fsl_of_msi_probe()
506 msi->srs_shift = MSIIR_SRS_SHIFT; in fsl_of_msi_probe()
507 msi->ibs_shift = MSIIR_IBS_SHIFT; in fsl_of_msi_probe()
510 dev_err(&dev->dev, "%s: Malformed msi-available-ranges property\n", in fsl_of_msi_probe()
524 pr_warn("%s: %pOF: msi available range of %u at %u is not IRQ-aligned\n", in fsl_of_msi_probe()
535 err = fsl_msi_setup_hwirq(msi, dev, offset + j, in fsl_of_msi_probe()
543 list_add_tail(&msi->list, &msi_head); in fsl_of_msi_probe()
546 * Apply the MSI ops to all the controllers. in fsl_of_msi_probe()
548 * but bail out if we find another MSI driver. in fsl_of_msi_probe()
555 dev_err(&dev->dev, "Different MSI driver already installed!\n"); in fsl_of_msi_probe()
583 .compatible = "fsl,mpic-msi",
587 .compatible = "fsl,mpic-msi-v4.3",
591 .compatible = "fsl,ipic-msi",
596 .compatible = "fsl,vmpic-msi",
600 .compatible = "fsl,vmpic-msi-v4.3",
609 .name = "fsl-msi",