Lines Matching refs:irq

85 static bool (*pirq_needs_eoi)(unsigned irq);
119 static int set_evtchn_to_irq(unsigned evtchn, unsigned irq) in set_evtchn_to_irq() argument
132 if (irq == -1) in set_evtchn_to_irq()
142 evtchn_to_irq[EVTCHN_ROW(evtchn)][EVTCHN_COL(evtchn)] = irq; in set_evtchn_to_irq()
156 struct irq_info *info_for_irq(unsigned irq) in info_for_irq() argument
158 return irq_get_handler_data(irq); in info_for_irq()
163 unsigned irq, in xen_irq_info_common_setup() argument
173 info->irq = irq; in xen_irq_info_common_setup()
177 ret = set_evtchn_to_irq(evtchn, irq); in xen_irq_info_common_setup()
181 irq_clear_status_flags(irq, IRQ_NOREQUEST|IRQ_NOAUTOEN); in xen_irq_info_common_setup()
186 static int xen_irq_info_evtchn_setup(unsigned irq, in xen_irq_info_evtchn_setup() argument
189 struct irq_info *info = info_for_irq(irq); in xen_irq_info_evtchn_setup()
191 return xen_irq_info_common_setup(info, irq, IRQT_EVTCHN, evtchn, 0); in xen_irq_info_evtchn_setup()
195 unsigned irq, in xen_irq_info_ipi_setup() argument
199 struct irq_info *info = info_for_irq(irq); in xen_irq_info_ipi_setup()
203 per_cpu(ipi_to_irq, cpu)[ipi] = irq; in xen_irq_info_ipi_setup()
205 return xen_irq_info_common_setup(info, irq, IRQT_IPI, evtchn, 0); in xen_irq_info_ipi_setup()
209 unsigned irq, in xen_irq_info_virq_setup() argument
213 struct irq_info *info = info_for_irq(irq); in xen_irq_info_virq_setup()
217 per_cpu(virq_to_irq, cpu)[virq] = irq; in xen_irq_info_virq_setup()
219 return xen_irq_info_common_setup(info, irq, IRQT_VIRQ, evtchn, 0); in xen_irq_info_virq_setup()
222 static int xen_irq_info_pirq_setup(unsigned irq, in xen_irq_info_pirq_setup() argument
229 struct irq_info *info = info_for_irq(irq); in xen_irq_info_pirq_setup()
236 return xen_irq_info_common_setup(info, irq, IRQT_PIRQ, evtchn, 0); in xen_irq_info_pirq_setup()
248 unsigned int evtchn_from_irq(unsigned irq) in evtchn_from_irq() argument
250 if (unlikely(WARN(irq >= nr_irqs, "Invalid irq %d!\n", irq))) in evtchn_from_irq()
253 return info_for_irq(irq)->evtchn; in evtchn_from_irq()
267 static enum ipi_vector ipi_from_irq(unsigned irq) in ipi_from_irq() argument
269 struct irq_info *info = info_for_irq(irq); in ipi_from_irq()
277 static unsigned virq_from_irq(unsigned irq) in virq_from_irq() argument
279 struct irq_info *info = info_for_irq(irq); in virq_from_irq()
287 static unsigned pirq_from_irq(unsigned irq) in pirq_from_irq() argument
289 struct irq_info *info = info_for_irq(irq); in pirq_from_irq()
297 static enum xen_irq_type type_from_irq(unsigned irq) in type_from_irq() argument
299 return info_for_irq(irq)->type; in type_from_irq()
302 unsigned cpu_from_irq(unsigned irq) in cpu_from_irq() argument
304 return info_for_irq(irq)->cpu; in cpu_from_irq()
309 int irq = get_evtchn_to_irq(evtchn); in cpu_from_evtchn() local
312 if (irq != -1) in cpu_from_evtchn()
313 ret = cpu_from_irq(irq); in cpu_from_evtchn()
319 static bool pirq_check_eoi_map(unsigned irq) in pirq_check_eoi_map() argument
321 return test_bit(pirq_from_irq(irq), pirq_eoi_map); in pirq_check_eoi_map()
325 static bool pirq_needs_eoi_flag(unsigned irq) in pirq_needs_eoi_flag() argument
327 struct irq_info *info = info_for_irq(irq); in pirq_needs_eoi_flag()
335 int irq = get_evtchn_to_irq(chn); in bind_evtchn_to_cpu() local
336 struct irq_info *info = info_for_irq(irq); in bind_evtchn_to_cpu()
338 BUG_ON(irq == -1); in bind_evtchn_to_cpu()
340 cpumask_copy(irq_get_affinity_mask(irq), cpumask_of(cpu)); in bind_evtchn_to_cpu()
363 void notify_remote_via_irq(int irq) in notify_remote_via_irq() argument
365 int evtchn = evtchn_from_irq(irq); in notify_remote_via_irq()
372 static void xen_irq_init(unsigned irq) in xen_irq_init() argument
377 cpumask_copy(irq_get_affinity_mask(irq), cpumask_of(0)); in xen_irq_init()
382 panic("Unable to allocate metadata for IRQ%d\n", irq); in xen_irq_init()
387 irq_set_handler_data(irq, info); in xen_irq_init()
394 int i, irq = irq_alloc_descs(-1, 0, nvec, -1); in xen_allocate_irqs_dynamic() local
396 if (irq >= 0) { in xen_allocate_irqs_dynamic()
398 xen_irq_init(irq + i); in xen_allocate_irqs_dynamic()
401 return irq; in xen_allocate_irqs_dynamic()
412 int irq; in xen_allocate_irq_gsi() local
425 irq = gsi; in xen_allocate_irq_gsi()
427 irq = irq_alloc_desc_at(gsi, -1); in xen_allocate_irq_gsi()
429 xen_irq_init(irq); in xen_allocate_irq_gsi()
431 return irq; in xen_allocate_irq_gsi()
434 static void xen_free_irq(unsigned irq) in xen_free_irq() argument
436 struct irq_info *info = irq_get_handler_data(irq); in xen_free_irq()
443 irq_set_handler_data(irq, NULL); in xen_free_irq()
450 if (irq < nr_legacy_irqs()) in xen_free_irq()
453 irq_free_desc(irq); in xen_free_irq()
465 static void pirq_query_unmask(int irq) in pirq_query_unmask() argument
468 struct irq_info *info = info_for_irq(irq); in pirq_query_unmask()
472 irq_status.irq = pirq_from_irq(irq); in pirq_query_unmask()
483 int evtchn = evtchn_from_irq(data->irq); in eoi_pirq()
484 struct physdev_eoi eoi = { .irq = pirq_from_irq(data->irq) }; in eoi_pirq()
503 if (pirq_needs_eoi(data->irq)) { in eoi_pirq()
515 static unsigned int __startup_pirq(unsigned int irq) in __startup_pirq() argument
518 struct irq_info *info = info_for_irq(irq); in __startup_pirq()
519 int evtchn = evtchn_from_irq(irq); in __startup_pirq()
527 bind_pirq.pirq = pirq_from_irq(irq); in __startup_pirq()
533 pr_warn("Failed to obtain physical IRQ %d\n", irq); in __startup_pirq()
538 pirq_query_unmask(irq); in __startup_pirq()
540 rc = set_evtchn_to_irq(evtchn, irq); in __startup_pirq()
553 eoi_pirq(irq_get_irq_data(irq)); in __startup_pirq()
558 pr_err("irq%d: Failed to set port to irq mapping (%d)\n", irq, rc); in __startup_pirq()
565 return __startup_pirq(data->irq); in startup_pirq()
570 unsigned int irq = data->irq; in shutdown_pirq() local
571 struct irq_info *info = info_for_irq(irq); in shutdown_pirq()
572 unsigned evtchn = evtchn_from_irq(irq); in shutdown_pirq()
603 return info->irq; in xen_irq_from_gsi()
610 static void __unbind_from_irq(unsigned int irq) in __unbind_from_irq() argument
612 int evtchn = evtchn_from_irq(irq); in __unbind_from_irq()
613 struct irq_info *info = irq_get_handler_data(irq); in __unbind_from_irq()
622 unsigned int cpu = cpu_from_irq(irq); in __unbind_from_irq()
626 switch (type_from_irq(irq)) { in __unbind_from_irq()
628 per_cpu(virq_to_irq, cpu)[virq_from_irq(irq)] = -1; in __unbind_from_irq()
631 per_cpu(ipi_to_irq, cpu)[ipi_from_irq(irq)] = -1; in __unbind_from_irq()
640 BUG_ON(info_for_irq(irq)->type == IRQT_UNBOUND); in __unbind_from_irq()
642 xen_free_irq(irq); in __unbind_from_irq()
658 int irq = -1; in xen_bind_pirq_gsi_to_irq() local
664 irq = xen_irq_from_gsi(gsi); in xen_bind_pirq_gsi_to_irq()
665 if (irq != -1) { in xen_bind_pirq_gsi_to_irq()
667 __func__, irq, gsi); in xen_bind_pirq_gsi_to_irq()
671 irq = xen_allocate_irq_gsi(gsi); in xen_bind_pirq_gsi_to_irq()
672 if (irq < 0) in xen_bind_pirq_gsi_to_irq()
675 irq_op.irq = irq; in xen_bind_pirq_gsi_to_irq()
683 xen_free_irq(irq); in xen_bind_pirq_gsi_to_irq()
684 irq = -ENOSPC; in xen_bind_pirq_gsi_to_irq()
688 ret = xen_irq_info_pirq_setup(irq, 0, pirq, gsi, DOMID_SELF, in xen_bind_pirq_gsi_to_irq()
691 __unbind_from_irq(irq); in xen_bind_pirq_gsi_to_irq()
692 irq = ret; in xen_bind_pirq_gsi_to_irq()
696 pirq_query_unmask(irq); in xen_bind_pirq_gsi_to_irq()
713 irq_set_chip_and_handler_name(irq, &xen_pirq_chip, in xen_bind_pirq_gsi_to_irq()
716 irq_set_chip_and_handler_name(irq, &xen_pirq_chip, in xen_bind_pirq_gsi_to_irq()
722 return irq; in xen_bind_pirq_gsi_to_irq()
743 int i, irq, ret; in xen_bind_pirq_msi_to_irq() local
747 irq = xen_allocate_irqs_dynamic(nvec); in xen_bind_pirq_msi_to_irq()
748 if (irq < 0) in xen_bind_pirq_msi_to_irq()
752 irq_set_chip_and_handler_name(irq + i, &xen_pirq_chip, handle_edge_irq, name); in xen_bind_pirq_msi_to_irq()
754 ret = xen_irq_info_pirq_setup(irq + i, 0, pirq + i, 0, domid, in xen_bind_pirq_msi_to_irq()
760 ret = irq_set_msi_desc(irq, msidesc); in xen_bind_pirq_msi_to_irq()
765 return irq; in xen_bind_pirq_msi_to_irq()
768 __unbind_from_irq(irq + i); in xen_bind_pirq_msi_to_irq()
774 int xen_destroy_irq(int irq) in xen_destroy_irq() argument
777 struct irq_info *info = info_for_irq(irq); in xen_destroy_irq()
804 xen_free_irq(irq); in xen_destroy_irq()
813 int irq; in xen_irq_from_pirq() local
822 irq = info->irq; in xen_irq_from_pirq()
826 irq = -1; in xen_irq_from_pirq()
830 return irq; in xen_irq_from_pirq()
834 int xen_pirq_from_irq(unsigned irq) in xen_pirq_from_irq() argument
836 return pirq_from_irq(irq); in xen_pirq_from_irq()
842 int irq; in bind_evtchn_to_irq() local
850 irq = get_evtchn_to_irq(evtchn); in bind_evtchn_to_irq()
852 if (irq == -1) { in bind_evtchn_to_irq()
853 irq = xen_allocate_irq_dynamic(); in bind_evtchn_to_irq()
854 if (irq < 0) in bind_evtchn_to_irq()
857 irq_set_chip_and_handler_name(irq, &xen_dynamic_chip, in bind_evtchn_to_irq()
860 ret = xen_irq_info_evtchn_setup(irq, evtchn); in bind_evtchn_to_irq()
862 __unbind_from_irq(irq); in bind_evtchn_to_irq()
863 irq = ret; in bind_evtchn_to_irq()
869 struct irq_info *info = info_for_irq(irq); in bind_evtchn_to_irq()
876 return irq; in bind_evtchn_to_irq()
883 int evtchn, irq; in bind_ipi_to_irq() local
888 irq = per_cpu(ipi_to_irq, cpu)[ipi]; in bind_ipi_to_irq()
890 if (irq == -1) { in bind_ipi_to_irq()
891 irq = xen_allocate_irq_dynamic(); in bind_ipi_to_irq()
892 if (irq < 0) in bind_ipi_to_irq()
895 irq_set_chip_and_handler_name(irq, &xen_percpu_chip, in bind_ipi_to_irq()
904 ret = xen_irq_info_ipi_setup(cpu, irq, evtchn, ipi); in bind_ipi_to_irq()
906 __unbind_from_irq(irq); in bind_ipi_to_irq()
907 irq = ret; in bind_ipi_to_irq()
912 struct irq_info *info = info_for_irq(irq); in bind_ipi_to_irq()
918 return irq; in bind_ipi_to_irq()
975 int evtchn, irq, ret; in bind_virq_to_irq() local
979 irq = per_cpu(virq_to_irq, cpu)[virq]; in bind_virq_to_irq()
981 if (irq == -1) { in bind_virq_to_irq()
982 irq = xen_allocate_irq_dynamic(); in bind_virq_to_irq()
983 if (irq < 0) in bind_virq_to_irq()
987 irq_set_chip_and_handler_name(irq, &xen_percpu_chip, in bind_virq_to_irq()
990 irq_set_chip_and_handler_name(irq, &xen_dynamic_chip, in bind_virq_to_irq()
1006 ret = xen_irq_info_virq_setup(cpu, irq, evtchn, virq); in bind_virq_to_irq()
1008 __unbind_from_irq(irq); in bind_virq_to_irq()
1009 irq = ret; in bind_virq_to_irq()
1015 struct irq_info *info = info_for_irq(irq); in bind_virq_to_irq()
1022 return irq; in bind_virq_to_irq()
1025 static void unbind_from_irq(unsigned int irq) in unbind_from_irq() argument
1028 __unbind_from_irq(irq); in unbind_from_irq()
1037 int irq, retval; in bind_evtchn_to_irqhandler() local
1039 irq = bind_evtchn_to_irq(evtchn); in bind_evtchn_to_irqhandler()
1040 if (irq < 0) in bind_evtchn_to_irqhandler()
1041 return irq; in bind_evtchn_to_irqhandler()
1042 retval = request_irq(irq, handler, irqflags, devname, dev_id); in bind_evtchn_to_irqhandler()
1044 unbind_from_irq(irq); in bind_evtchn_to_irqhandler()
1048 return irq; in bind_evtchn_to_irqhandler()
1059 int irq, retval; in bind_interdomain_evtchn_to_irqhandler() local
1061 irq = bind_interdomain_evtchn_to_irq(remote_domain, remote_port); in bind_interdomain_evtchn_to_irqhandler()
1062 if (irq < 0) in bind_interdomain_evtchn_to_irqhandler()
1063 return irq; in bind_interdomain_evtchn_to_irqhandler()
1065 retval = request_irq(irq, handler, irqflags, devname, dev_id); in bind_interdomain_evtchn_to_irqhandler()
1067 unbind_from_irq(irq); in bind_interdomain_evtchn_to_irqhandler()
1071 return irq; in bind_interdomain_evtchn_to_irqhandler()
1079 int irq, retval; in bind_virq_to_irqhandler() local
1081 irq = bind_virq_to_irq(virq, cpu, irqflags & IRQF_PERCPU); in bind_virq_to_irqhandler()
1082 if (irq < 0) in bind_virq_to_irqhandler()
1083 return irq; in bind_virq_to_irqhandler()
1084 retval = request_irq(irq, handler, irqflags, devname, dev_id); in bind_virq_to_irqhandler()
1086 unbind_from_irq(irq); in bind_virq_to_irqhandler()
1090 return irq; in bind_virq_to_irqhandler()
1101 int irq, retval; in bind_ipi_to_irqhandler() local
1103 irq = bind_ipi_to_irq(ipi, cpu); in bind_ipi_to_irqhandler()
1104 if (irq < 0) in bind_ipi_to_irqhandler()
1105 return irq; in bind_ipi_to_irqhandler()
1108 retval = request_irq(irq, handler, irqflags, devname, dev_id); in bind_ipi_to_irqhandler()
1110 unbind_from_irq(irq); in bind_ipi_to_irqhandler()
1114 return irq; in bind_ipi_to_irqhandler()
1117 void unbind_from_irqhandler(unsigned int irq, void *dev_id) in unbind_from_irqhandler() argument
1119 struct irq_info *info = irq_get_handler_data(irq); in unbind_from_irqhandler()
1123 free_irq(irq, dev_id); in unbind_from_irqhandler()
1124 unbind_from_irq(irq); in unbind_from_irqhandler()
1133 int xen_set_irq_priority(unsigned irq, unsigned priority) in xen_set_irq_priority() argument
1137 set_priority.port = evtchn_from_irq(irq); in xen_set_irq_priority()
1147 int irq = get_evtchn_to_irq(evtchn); in evtchn_make_refcounted() local
1150 if (irq == -1) in evtchn_make_refcounted()
1153 info = irq_get_handler_data(irq); in evtchn_make_refcounted()
1168 int irq; in evtchn_get() local
1177 irq = get_evtchn_to_irq(evtchn); in evtchn_get()
1178 if (irq == -1) in evtchn_get()
1181 info = irq_get_handler_data(irq); in evtchn_get()
1201 int irq = get_evtchn_to_irq(evtchn); in evtchn_put() local
1202 if (WARN_ON(irq == -1)) in evtchn_put()
1204 unbind_from_irq(irq); in evtchn_put()
1210 int irq; in xen_send_IPI_one() local
1220 irq = per_cpu(ipi_to_irq, cpu)[vector]; in xen_send_IPI_one()
1221 BUG_ON(irq < 0); in xen_send_IPI_one()
1222 notify_remote_via_irq(irq); in xen_send_IPI_one()
1275 void rebind_evtchn_irq(int evtchn, int irq) in rebind_evtchn_irq() argument
1277 struct irq_info *info = info_for_irq(irq); in rebind_evtchn_irq()
1284 disable_irq(irq); in rebind_evtchn_irq()
1294 (void)xen_irq_info_evtchn_setup(irq, evtchn); in rebind_evtchn_irq()
1300 irq_set_affinity(irq, cpumask_of(info->cpu)); in rebind_evtchn_irq()
1303 enable_irq(irq); in rebind_evtchn_irq()
1307 static int rebind_irq_to_cpu(unsigned irq, unsigned tcpu) in rebind_irq_to_cpu() argument
1310 int evtchn = evtchn_from_irq(irq); in rebind_irq_to_cpu()
1348 return rebind_irq_to_cpu(data->irq, tcpu); in set_affinity_irq()
1353 int evtchn = evtchn_from_irq(data->irq); in enable_dynirq()
1361 int evtchn = evtchn_from_irq(data->irq); in disable_dynirq()
1369 int evtchn = evtchn_from_irq(data->irq); in ack_dynirq()
1396 unsigned int evtchn = evtchn_from_irq(data->irq); in retrigger_dynirq()
1412 int pirq, rc, irq, gsi; in restore_pirqs() local
1422 irq = info->irq; in restore_pirqs()
1437 gsi, irq, pirq, rc); in restore_pirqs()
1438 xen_free_irq(irq); in restore_pirqs()
1442 printk(KERN_DEBUG "xen: --> irq=%d, pirq=%d\n", irq, map_irq.pirq); in restore_pirqs()
1444 __startup_pirq(irq); in restore_pirqs()
1451 int virq, irq, evtchn; in restore_cpu_virqs() local
1454 if ((irq = per_cpu(virq_to_irq, cpu)[virq]) == -1) in restore_cpu_virqs()
1457 BUG_ON(virq_from_irq(irq) != virq); in restore_cpu_virqs()
1468 (void)xen_irq_info_virq_setup(cpu, irq, evtchn, virq); in restore_cpu_virqs()
1476 int ipi, irq, evtchn; in restore_cpu_ipis() local
1479 if ((irq = per_cpu(ipi_to_irq, cpu)[ipi]) == -1) in restore_cpu_ipis()
1482 BUG_ON(ipi_from_irq(irq) != ipi); in restore_cpu_ipis()
1492 (void)xen_irq_info_ipi_setup(cpu, irq, evtchn, ipi); in restore_cpu_ipis()
1498 void xen_clear_irq_pending(int irq) in xen_clear_irq_pending() argument
1500 int evtchn = evtchn_from_irq(irq); in xen_clear_irq_pending()
1506 void xen_set_irq_pending(int irq) in xen_set_irq_pending() argument
1508 int evtchn = evtchn_from_irq(irq); in xen_set_irq_pending()
1514 bool xen_test_irq_pending(int irq) in xen_test_irq_pending() argument
1516 int evtchn = evtchn_from_irq(irq); in xen_test_irq_pending()
1527 void xen_poll_irq_timeout(int irq, u64 timeout) in xen_poll_irq_timeout() argument
1529 evtchn_port_t evtchn = evtchn_from_irq(irq); in xen_poll_irq_timeout()
1545 void xen_poll_irq(int irq) in xen_poll_irq() argument
1547 xen_poll_irq_timeout(irq, 0 /* no timeout */); in xen_poll_irq()
1551 int xen_test_irq_shared(int irq) in xen_test_irq_shared() argument
1553 struct irq_info *info = info_for_irq(irq); in xen_test_irq_shared()
1559 irq_status.irq = info->u.pirq.pirq; in xen_test_irq_shared()