Lines Matching defs:isrc

183 static void intr_map_set_isrc(u_int res_id, struct intr_irqsrc *isrc);
198 mtx_init(&isrc_table_lock, "intr isrc table", NULL, MTX_DEF);
236 intrcnt_updatename(struct intr_irqsrc *isrc)
241 intrcnt_setname(isrc->isrc_event->ie_fullname, isrc->isrc_index);
248 isrc_increment_count(struct intr_irqsrc *isrc)
251 if (isrc->isrc_flags & INTR_ISRCF_PPI)
252 atomic_add_long(&isrc->isrc_count[0], 1);
254 isrc->isrc_count[0]++;
261 isrc_increment_straycount(struct intr_irqsrc *isrc)
264 isrc->isrc_count[1]++;
271 isrc_update_name(struct intr_irqsrc *isrc, const char *name)
278 snprintf(str, INTRNAME_LEN, "%s: %s", isrc->isrc_name, name);
279 intrcnt_setname(str, isrc->isrc_index);
280 snprintf(str, INTRNAME_LEN, "stray %s: %s", isrc->isrc_name,
282 intrcnt_setname(str, isrc->isrc_index + 1);
284 snprintf(str, INTRNAME_LEN, "%s:", isrc->isrc_name);
285 intrcnt_setname(str, isrc->isrc_index);
286 snprintf(str, INTRNAME_LEN, "stray %s:", isrc->isrc_name);
287 intrcnt_setname(str, isrc->isrc_index + 1);
295 isrc_setup_counters(struct intr_irqsrc *isrc)
308 isrc->isrc_index = index;
309 isrc->isrc_count = &intrcnt[index];
310 isrc_update_name(isrc, NULL);
317 isrc_release_counters(struct intr_irqsrc *isrc)
319 int idx = isrc->isrc_index;
390 intr_isrc_dispatch(struct intr_irqsrc *isrc, struct trapframe *tf)
393 KASSERT(isrc != NULL, ("%s: no source", __func__));
395 if ((isrc->isrc_flags & INTR_ISRCF_IPI) == 0)
396 isrc_increment_count(isrc);
399 if (isrc->isrc_filter != NULL) {
401 error = isrc->isrc_filter(isrc->isrc_arg, tf);
402 PIC_POST_FILTER(isrc->isrc_dev, isrc);
407 if (isrc->isrc_event != NULL) {
408 if (intr_event_handle(isrc->isrc_event, tf) == 0)
412 if ((isrc->isrc_flags & INTR_ISRCF_IPI) == 0)
413 isrc_increment_straycount(isrc);
428 isrc_alloc_irq(struct intr_irqsrc *isrc)
450 isrc->isrc_irq = irq;
451 irq_sources[irq] = isrc;
463 isrc_free_irq(struct intr_irqsrc *isrc)
468 if (isrc->isrc_irq >= intr_nirq)
470 if (irq_sources[isrc->isrc_irq] != isrc)
473 irq_sources[isrc->isrc_irq] = NULL;
474 isrc->isrc_irq = INTR_IRQ_INVALID; /* just to be safe */
500 intr_isrc_register(struct intr_irqsrc *isrc, device_t dev, u_int flags,
506 bzero(isrc, sizeof(struct intr_irqsrc));
507 isrc->isrc_dev = dev;
508 isrc->isrc_irq = INTR_IRQ_INVALID; /* just to be safe */
509 isrc->isrc_flags = flags;
512 vsnprintf(isrc->isrc_name, INTR_ISRC_NAMELEN, fmt, ap);
516 error = isrc_alloc_irq(isrc);
526 if ((isrc->isrc_flags & INTR_ISRCF_IPI) == 0)
527 isrc_setup_counters(isrc);
536 intr_isrc_deregister(struct intr_irqsrc *isrc)
541 if ((isrc->isrc_flags & INTR_ISRCF_IPI) == 0)
542 isrc_release_counters(isrc);
543 error = isrc_free_irq(isrc);
559 intr_isrc_init_on_cpu(struct intr_irqsrc *isrc, u_int cpu)
562 if (isrc->isrc_handlers == 0)
564 if ((isrc->isrc_flags & (INTR_ISRCF_PPI | INTR_ISRCF_IPI)) == 0)
566 if (isrc->isrc_flags & INTR_ISRCF_BOUND)
567 return (CPU_ISSET(cpu, &isrc->isrc_cpu));
569 CPU_SET(cpu, &isrc->isrc_cpu);
579 iscr_setup_filter(struct intr_irqsrc *isrc, const char *name,
591 if (isrc->isrc_filter != NULL || isrc->isrc_event != NULL) {
595 isrc->isrc_filter = filter;
596 isrc->isrc_arg = arg;
597 isrc_update_name(isrc, name);
600 *cookiep = isrc;
611 struct intr_irqsrc *isrc = arg;
613 PIC_PRE_ITHREAD(isrc->isrc_dev, isrc);
622 struct intr_irqsrc *isrc = arg;
624 PIC_POST_ITHREAD(isrc->isrc_dev, isrc);
633 struct intr_irqsrc *isrc = arg;
635 PIC_POST_FILTER(isrc->isrc_dev, isrc);
645 struct intr_irqsrc *isrc = arg;
650 CPU_ZERO(&isrc->isrc_cpu);
651 isrc->isrc_flags &= ~INTR_ISRCF_BOUND;
653 CPU_SETOF(cpu, &isrc->isrc_cpu);
654 isrc->isrc_flags |= INTR_ISRCF_BOUND;
664 error = PIC_BIND_INTR(isrc->isrc_dev, isrc);
666 CPU_ZERO(&isrc->isrc_cpu);
682 isrc_event_create(struct intr_irqsrc *isrc)
687 error = intr_event_create(&ie, isrc, 0, isrc->isrc_irq,
689 intr_isrc_assign_cpu, "%s:", isrc->isrc_name);
699 if (isrc->isrc_filter != NULL || isrc->isrc_event != NULL) {
701 if (isrc->isrc_event != NULL) {
705 return (isrc->isrc_event != NULL ? EBUSY : 0);
707 isrc->isrc_event = ie;
717 isrc_event_destroy(struct intr_irqsrc *isrc)
722 ie = isrc->isrc_event;
723 isrc->isrc_event = NULL;
734 isrc_add_handler(struct intr_irqsrc *isrc, const char *name,
740 if (isrc->isrc_event == NULL) {
741 error = isrc_event_create(isrc);
746 error = intr_event_add_handler(isrc->isrc_event, name, filter, handler,
750 intrcnt_updatename(isrc);
976 struct intr_irqsrc **isrc)
995 *isrc = msi->isrc;
1002 return (PIC_MAP_INTR(pic->pic_dev, data, isrc));
1010 struct intr_irqsrc *isrc;
1013 isrc = intr_map_get_isrc(res_id);
1015 if (isrc == NULL)
1016 panic("Attempt to get isrc for non-active resource id: %u\n",
1018 return ((isrc->isrc_flags & INTR_ISRCF_PPI) != 0);
1027 struct intr_irqsrc *isrc;
1039 error = intr_resolve_irq(map_dev, map_xref, data, &isrc);
1046 intr_map_set_isrc(res_id, isrc);
1048 return (PIC_ACTIVATE_INTR(isrc->isrc_dev, isrc, res, data));
1055 struct intr_irqsrc *isrc;
1063 isrc = intr_map_get_isrc(res_id);
1064 if (isrc == NULL)
1069 error = PIC_DEACTIVATE_INTR(isrc->isrc_dev, isrc, res, data);
1082 struct intr_irqsrc *isrc;
1090 isrc = intr_map_get_isrc(res_id);
1091 if (isrc == NULL) {
1116 error = iscr_setup_filter(isrc, name, (intr_irq_filter_t *)filt,
1118 debugf("irq %u setup filter error %d on %s\n", isrc->isrc_irq, error,
1123 error = isrc_add_handler(isrc, name, filt, hand, arg, flags,
1125 debugf("irq %u add handler error %d on %s\n", isrc->isrc_irq, error, name);
1131 error = PIC_SETUP_INTR(isrc->isrc_dev, isrc, res, data);
1133 isrc->isrc_handlers++;
1134 if (isrc->isrc_handlers == 1)
1135 PIC_ENABLE_INTR(isrc->isrc_dev, isrc);
1148 struct intr_irqsrc *isrc;
1155 isrc = intr_map_get_isrc(res_id);
1156 if (isrc == NULL || isrc->isrc_handlers == 0)
1162 if (isrc->isrc_filter != NULL) {
1163 if (isrc != cookie)
1167 isrc->isrc_filter = NULL;
1168 isrc->isrc_arg = NULL;
1169 isrc->isrc_handlers = 0;
1170 PIC_DISABLE_INTR(isrc->isrc_dev, isrc);
1171 PIC_TEARDOWN_INTR(isrc->isrc_dev, isrc, res, data);
1172 isrc_update_name(isrc, NULL);
1177 if (isrc != intr_handler_source(cookie))
1183 isrc->isrc_handlers--;
1184 if (isrc->isrc_handlers == 0)
1185 PIC_DISABLE_INTR(isrc->isrc_dev, isrc);
1186 PIC_TEARDOWN_INTR(isrc->isrc_dev, isrc, res, data);
1187 intrcnt_updatename(isrc);
1198 struct intr_irqsrc *isrc;
1205 isrc = intr_map_get_isrc(res_id);
1206 if (isrc == NULL || isrc->isrc_handlers == 0)
1209 if (isrc->isrc_filter != NULL) {
1210 if (isrc != cookie)
1214 isrc_update_name(isrc, descr);
1219 error = intr_event_describe_handler(isrc->isrc_event, cookie, descr);
1222 intrcnt_updatename(isrc);
1232 struct intr_irqsrc *isrc;
1239 isrc = intr_map_get_isrc(res_id);
1240 if (isrc == NULL || isrc->isrc_handlers == 0)
1243 if (isrc->isrc_filter != NULL)
1244 return (intr_isrc_assign_cpu(isrc, cpu));
1246 return (intr_event_bind(isrc->isrc_event, cpu));
1284 struct intr_irqsrc *isrc;
1293 isrc = irq_sources[i];
1294 if (isrc == NULL || isrc->isrc_handlers == 0 ||
1295 isrc->isrc_flags & (INTR_ISRCF_PPI | INTR_ISRCF_IPI))
1298 if (isrc->isrc_event != NULL &&
1299 isrc->isrc_flags & INTR_ISRCF_BOUND &&
1300 isrc->isrc_event->ie_cpu != CPU_FFS(&isrc->isrc_cpu) - 1)
1303 if ((isrc->isrc_flags & INTR_ISRCF_BOUND) == 0)
1304 CPU_ZERO(&isrc->isrc_cpu); /* start again */
1311 if (PIC_BIND_INTR(isrc->isrc_dev, isrc) != 0)
1312 CPU_ZERO(&isrc->isrc_cpu);
1373 struct intr_irqsrc **isrc;
1395 isrc = malloc(sizeof(*isrc) * count, M_INTRNG, M_WAITOK);
1396 err = MSI_ALLOC_MSI(pic->pic_dev, child, count, maxcount, &pdev, isrc);
1398 free(isrc, M_INTRNG);
1403 isrc[i]->isrc_iommu = domain;
1406 msi-> isrc = isrc[i];
1411 free(isrc, M_INTRNG);
1420 struct intr_irqsrc **isrc;
1433 isrc = malloc(sizeof(*isrc) * count, M_INTRNG, M_WAITOK);
1441 isrc[i] = msi->isrc;
1446 err = MSI_RELEASE_MSI(pic->pic_dev, child, count, isrc);
1449 if (isrc[i] != NULL)
1453 free(isrc, M_INTRNG);
1461 struct intr_irqsrc *isrc;
1483 err = MSI_ALLOC_MSIX(pic->pic_dev, child, &pdev, &isrc);
1487 isrc->isrc_iommu = domain;
1490 msi->isrc = isrc;
1498 struct intr_irqsrc *isrc;
1516 isrc = msi->isrc;
1517 if (isrc == NULL) {
1524 err = MSI_RELEASE_MSIX(pic->pic_dev, child, isrc);
1534 struct intr_irqsrc *isrc;
1546 isrc = intr_map_get_isrc(irq);
1547 if (isrc == NULL)
1550 err = MSI_MAP_MSI(pic->pic_dev, child, isrc, addr, data);
1553 if (isrc->isrc_iommu != NULL)
1554 iommu_translate_msi(isrc->isrc_iommu, addr);
1595 struct intr_irqsrc *isrc;
1598 isrc = irq_sources[i];
1599 if (isrc == NULL)
1602 num = isrc->isrc_count != NULL ? isrc->isrc_count[0] : 0;
1604 isrc->isrc_name, isrc->isrc_cpu.__bits[0],
1605 isrc->isrc_flags & INTR_ISRCF_BOUND ? " (bound)" : "", num);
1623 struct intr_irqsrc *isrc;
1637 struct intr_irqsrc *isrc;
1639 isrc = NULL;
1642 isrc = irq_map[res_id]->isrc;
1645 return (isrc);
1649 intr_map_set_isrc(u_int res_id, struct intr_irqsrc *isrc)
1654 irq_map[res_id]->isrc = isrc;
1725 entry->isrc = NULL;
1874 struct intr_irqsrc *isrc;
1888 error = PIC_IPI_SETUP(intr_ipi_dev, ipi, &isrc);
1892 isrc->isrc_handlers++;
1899 ii->ii_isrc = isrc;
1903 PIC_ENABLE_INTR(intr_ipi_dev, isrc);