Lines Matching refs:msi

93 #define	INTEL_ADDR(msi)							\
94 (MSI_INTEL_ADDR_BASE | (msi)->msi_cpu << 12 | \
96 #define INTEL_DATA(msi) \
97 (MSI_INTEL_DATA_TRGREDG | MSI_INTEL_DATA_DELFIXED | (msi)->msi_vector)
99 static MALLOC_DEFINE(M_MSI, "msi", "PCI MSI");
204 struct msi_intsrc *msi = (struct msi_intsrc *)isrc;
206 apic_enable_vector(msi->msi_cpu, msi->msi_vector);
212 struct msi_intsrc *msi = (struct msi_intsrc *)isrc;
214 apic_disable_vector(msi->msi_cpu, msi->msi_vector);
220 struct msi_intsrc *msi = (struct msi_intsrc *)isrc;
222 return (msi->msi_irq);
243 struct msi_intsrc *sib, *msi = (struct msi_intsrc *)isrc;
252 if (msi->msi_first != msi)
256 if (msix_disable_migration && msi->msi_msix)
261 old_vector = msi->msi_vector;
262 old_id = msi->msi_cpu;
267 if (msi->msi_count > 1) {
268 KASSERT(msi->msi_msix == 0, ("MSI-X message group"));
269 vector = apic_alloc_vectors(apic_id, msi->msi_irqs,
270 msi->msi_count, msi->msi_maxcount);
272 vector = apic_alloc_vector(apic_id, msi->msi_irq);
276 msi->msi_cpu = apic_id;
277 msi->msi_vector = vector;
278 if (msi->msi_intsrc.is_handlers > 0)
279 apic_enable_vector(msi->msi_cpu, msi->msi_vector);
281 printf("msi: Assigning %s IRQ %d to local APIC %u vector %u\n",
282 msi->msi_msix ? "MSI-X" : "MSI", msi->msi_irq,
283 msi->msi_cpu, msi->msi_vector);
284 for (i = 1; i < msi->msi_count; i++) {
285 sib = (struct msi_intsrc *)intr_lookup_source(msi->msi_irqs[i]);
292 "msi: Assigning MSI IRQ %d to local APIC %u vector %u\n",
295 BUS_REMAP_INTR(device_get_parent(msi->msi_dev), msi->msi_dev,
296 msi->msi_irq);
302 if (msi->msi_intsrc.is_handlers > 0)
304 apic_free_vector(old_id, old_vector, msi->msi_irq);
305 for (i = 1; i < msi->msi_count; i++) {
306 sib = (struct msi_intsrc *)intr_lookup_source(msi->msi_irqs[i]);
309 apic_free_vector(old_id, old_vector + i, msi->msi_irqs[i]);
350 mtx_init(&msi_lock, "msi", NULL, MTX_DEF);
356 struct msi_intsrc *msi;
368 msi = malloc(sizeof(struct msi_intsrc), M_MSI, M_WAITOK | M_ZERO);
369 msi->msi_intsrc.is_pic = &msi_pic;
370 msi->msi_irq = irq;
371 intr_register_source(&msi->msi_intsrc);
381 struct msi_intsrc *msi, *fsrc;
405 msi = (struct msi_intsrc *)intr_lookup_source(i);
408 if (msi == NULL)
412 if (msi->msi_dev == NULL) {
463 msi = (struct msi_intsrc *)intr_lookup_source(irqs[i]);
464 msi->msi_remap_cookie = cookies[i];
471 msi = (struct msi_intsrc *)intr_lookup_source(irqs[i]);
472 msi->msi_cpu = cpu;
473 msi->msi_dev = dev;
474 msi->msi_vector = vector + i;
477 "msi: routing MSI IRQ %d to local APIC %u vector %u\n",
478 msi->msi_irq, msi->msi_cpu, msi->msi_vector);
479 msi->msi_first = fsrc;
480 KASSERT(msi->msi_intsrc.is_handlers == 0,
495 struct msi_intsrc *msi, *first;
529 msi = (struct msi_intsrc *)intr_lookup_source(irqs[i]);
530 KASSERT(msi->msi_first == first, ("message not in group"));
531 KASSERT(msi->msi_dev == first->msi_dev, ("owner mismatch"));
533 iommu_unmap_msi_intr(first->msi_dev, msi->msi_remap_cookie);
535 msi->msi_first = NULL;
536 msi->msi_dev = NULL;
537 apic_free_vector(msi->msi_cpu, msi->msi_vector, msi->msi_irq);
538 msi->msi_vector = 0;
563 struct msi_intsrc *msi;
571 msi = (struct msi_intsrc *)intr_lookup_source(irq);
572 if (msi == NULL) {
578 if (msi->msi_dev == NULL) {
588 if (!msi->msi_msix) {
589 if (msi->msi_first == NULL) {
593 msi = msi->msi_first;
597 if (!msi->msi_msix) {
598 for (k = msi->msi_count - 1, i = first_msi_irq; k > 0 &&
600 if (i == msi->msi_irq)
603 if (!msi1->msi_msix && msi1->msi_first == msi) {
614 error = iommu_map_msi_intr(msi->msi_dev, msi->msi_cpu,
615 msi->msi_vector, msi->msi_remap_cookie, addr, data);
621 *addr = INTEL_ADDR(msi);
622 *data = INTEL_DATA(msi);
631 struct msi_intsrc *msi;
650 msi = (struct msi_intsrc *)intr_lookup_source(i);
653 if (msi == NULL)
657 if (msi->msi_dev == NULL)
668 if (msi == NULL) {
684 msi->msi_dev = dev;
692 msi->msi_dev = NULL;
696 msi->msi_remap_cookie = cookie;
700 printf("msi: routing MSI-X IRQ %d to local APIC %u vector %u\n",
701 msi->msi_irq, cpu, vector);
704 msi->msi_cpu = cpu;
705 msi->msi_first = msi;
706 msi->msi_vector = vector;
707 msi->msi_msix = 1;
708 msi->msi_count = 1;
709 msi->msi_maxcount = 1;
710 msi->msi_irqs = NULL;
712 KASSERT(msi->msi_intsrc.is_handlers == 0, ("dead MSI-X has handlers"));
722 struct msi_intsrc *msi;
725 msi = (struct msi_intsrc *)intr_lookup_source(irq);
726 if (msi == NULL) {
732 if (!msi->msi_msix) {
737 KASSERT(msi->msi_dev != NULL, ("unowned message"));
742 iommu_unmap_msi_intr(msi->msi_dev, msi->msi_remap_cookie);
745 msi->msi_first = NULL;
746 msi->msi_dev = NULL;
747 apic_free_vector(msi->msi_cpu, msi->msi_vector, msi->msi_irq);
748 msi->msi_vector = 0;
749 msi->msi_msix = 0;
750 msi->msi_count = 0;
751 msi->msi_maxcount = 0;