Lines Matching refs:irq

84 static bool (*pirq_needs_eoi)(unsigned irq);
118 static int set_evtchn_to_irq(unsigned evtchn, unsigned irq) in set_evtchn_to_irq() argument
131 if (irq == -1) in set_evtchn_to_irq()
141 evtchn_to_irq[EVTCHN_ROW(evtchn)][EVTCHN_COL(evtchn)] = irq; in set_evtchn_to_irq()
155 struct irq_info *info_for_irq(unsigned irq) in info_for_irq() argument
157 return irq_get_handler_data(irq); in info_for_irq()
162 unsigned irq, in xen_irq_info_common_setup() argument
172 info->irq = irq; in xen_irq_info_common_setup()
176 ret = set_evtchn_to_irq(evtchn, irq); in xen_irq_info_common_setup()
180 irq_clear_status_flags(irq, IRQ_NOREQUEST|IRQ_NOAUTOEN); in xen_irq_info_common_setup()
185 static int xen_irq_info_evtchn_setup(unsigned irq, in xen_irq_info_evtchn_setup() argument
188 struct irq_info *info = info_for_irq(irq); in xen_irq_info_evtchn_setup()
190 return xen_irq_info_common_setup(info, irq, IRQT_EVTCHN, evtchn, 0); in xen_irq_info_evtchn_setup()
194 unsigned irq, in xen_irq_info_ipi_setup() argument
198 struct irq_info *info = info_for_irq(irq); in xen_irq_info_ipi_setup()
202 per_cpu(ipi_to_irq, cpu)[ipi] = irq; in xen_irq_info_ipi_setup()
204 return xen_irq_info_common_setup(info, irq, IRQT_IPI, evtchn, 0); in xen_irq_info_ipi_setup()
208 unsigned irq, in xen_irq_info_virq_setup() argument
212 struct irq_info *info = info_for_irq(irq); in xen_irq_info_virq_setup()
216 per_cpu(virq_to_irq, cpu)[virq] = irq; in xen_irq_info_virq_setup()
218 return xen_irq_info_common_setup(info, irq, IRQT_VIRQ, evtchn, 0); in xen_irq_info_virq_setup()
221 static int xen_irq_info_pirq_setup(unsigned irq, in xen_irq_info_pirq_setup() argument
228 struct irq_info *info = info_for_irq(irq); in xen_irq_info_pirq_setup()
235 return xen_irq_info_common_setup(info, irq, IRQT_PIRQ, evtchn, 0); in xen_irq_info_pirq_setup()
247 unsigned int evtchn_from_irq(unsigned irq) in evtchn_from_irq() argument
249 if (unlikely(WARN(irq >= nr_irqs, "Invalid irq %d!\n", irq))) in evtchn_from_irq()
252 return info_for_irq(irq)->evtchn; in evtchn_from_irq()
266 static enum ipi_vector ipi_from_irq(unsigned irq) in ipi_from_irq() argument
268 struct irq_info *info = info_for_irq(irq); in ipi_from_irq()
276 static unsigned virq_from_irq(unsigned irq) in virq_from_irq() argument
278 struct irq_info *info = info_for_irq(irq); in virq_from_irq()
286 static unsigned pirq_from_irq(unsigned irq) in pirq_from_irq() argument
288 struct irq_info *info = info_for_irq(irq); in pirq_from_irq()
296 static enum xen_irq_type type_from_irq(unsigned irq) in type_from_irq() argument
298 return info_for_irq(irq)->type; in type_from_irq()
301 unsigned cpu_from_irq(unsigned irq) in cpu_from_irq() argument
303 return info_for_irq(irq)->cpu; in cpu_from_irq()
308 int irq = get_evtchn_to_irq(evtchn); in cpu_from_evtchn() local
311 if (irq != -1) in cpu_from_evtchn()
312 ret = cpu_from_irq(irq); in cpu_from_evtchn()
318 static bool pirq_check_eoi_map(unsigned irq) in pirq_check_eoi_map() argument
320 return test_bit(pirq_from_irq(irq), pirq_eoi_map); in pirq_check_eoi_map()
324 static bool pirq_needs_eoi_flag(unsigned irq) in pirq_needs_eoi_flag() argument
326 struct irq_info *info = info_for_irq(irq); in pirq_needs_eoi_flag()
334 int irq = get_evtchn_to_irq(chn); in bind_evtchn_to_cpu() local
335 struct irq_info *info = info_for_irq(irq); in bind_evtchn_to_cpu()
337 BUG_ON(irq == -1); in bind_evtchn_to_cpu()
339 cpumask_copy(irq_get_irq_data(irq)->affinity, cpumask_of(cpu)); in bind_evtchn_to_cpu()
362 void notify_remote_via_irq(int irq) in notify_remote_via_irq() argument
364 int evtchn = evtchn_from_irq(irq); in notify_remote_via_irq()
371 static void xen_irq_init(unsigned irq) in xen_irq_init() argument
376 cpumask_copy(irq_get_irq_data(irq)->affinity, cpumask_of(0)); in xen_irq_init()
381 panic("Unable to allocate metadata for IRQ%d\n", irq); in xen_irq_init()
386 irq_set_handler_data(irq, info); in xen_irq_init()
393 int i, irq = irq_alloc_descs(-1, 0, nvec, -1); in xen_allocate_irqs_dynamic() local
395 if (irq >= 0) { in xen_allocate_irqs_dynamic()
397 xen_irq_init(irq + i); in xen_allocate_irqs_dynamic()
400 return irq; in xen_allocate_irqs_dynamic()
411 int irq; in xen_allocate_irq_gsi() local
424 irq = gsi; in xen_allocate_irq_gsi()
426 irq = irq_alloc_desc_at(gsi, -1); in xen_allocate_irq_gsi()
428 xen_irq_init(irq); in xen_allocate_irq_gsi()
430 return irq; in xen_allocate_irq_gsi()
433 static void xen_free_irq(unsigned irq) in xen_free_irq() argument
435 struct irq_info *info = irq_get_handler_data(irq); in xen_free_irq()
442 irq_set_handler_data(irq, NULL); in xen_free_irq()
449 if (irq < NR_IRQS_LEGACY) in xen_free_irq()
452 irq_free_desc(irq); in xen_free_irq()
464 static void pirq_query_unmask(int irq) in pirq_query_unmask() argument
467 struct irq_info *info = info_for_irq(irq); in pirq_query_unmask()
471 irq_status.irq = pirq_from_irq(irq); in pirq_query_unmask()
482 int evtchn = evtchn_from_irq(data->irq); in eoi_pirq()
483 struct physdev_eoi eoi = { .irq = pirq_from_irq(data->irq) }; in eoi_pirq()
502 if (pirq_needs_eoi(data->irq)) { in eoi_pirq()
514 static unsigned int __startup_pirq(unsigned int irq) in __startup_pirq() argument
517 struct irq_info *info = info_for_irq(irq); in __startup_pirq()
518 int evtchn = evtchn_from_irq(irq); in __startup_pirq()
526 bind_pirq.pirq = pirq_from_irq(irq); in __startup_pirq()
532 pr_warn("Failed to obtain physical IRQ %d\n", irq); in __startup_pirq()
537 pirq_query_unmask(irq); in __startup_pirq()
539 rc = set_evtchn_to_irq(evtchn, irq); in __startup_pirq()
552 eoi_pirq(irq_get_irq_data(irq)); in __startup_pirq()
557 pr_err("irq%d: Failed to set port to irq mapping (%d)\n", irq, rc); in __startup_pirq()
564 return __startup_pirq(data->irq); in startup_pirq()
569 unsigned int irq = data->irq; in shutdown_pirq() local
570 struct irq_info *info = info_for_irq(irq); in shutdown_pirq()
571 unsigned evtchn = evtchn_from_irq(irq); in shutdown_pirq()
602 return info->irq; in xen_irq_from_gsi()
609 static void __unbind_from_irq(unsigned int irq) in __unbind_from_irq() argument
611 int evtchn = evtchn_from_irq(irq); in __unbind_from_irq()
612 struct irq_info *info = irq_get_handler_data(irq); in __unbind_from_irq()
621 unsigned int cpu = cpu_from_irq(irq); in __unbind_from_irq()
625 switch (type_from_irq(irq)) { in __unbind_from_irq()
627 per_cpu(virq_to_irq, cpu)[virq_from_irq(irq)] = -1; in __unbind_from_irq()
630 per_cpu(ipi_to_irq, cpu)[ipi_from_irq(irq)] = -1; in __unbind_from_irq()
639 BUG_ON(info_for_irq(irq)->type == IRQT_UNBOUND); in __unbind_from_irq()
641 xen_free_irq(irq); in __unbind_from_irq()
657 int irq = -1; in xen_bind_pirq_gsi_to_irq() local
663 irq = xen_irq_from_gsi(gsi); in xen_bind_pirq_gsi_to_irq()
664 if (irq != -1) { in xen_bind_pirq_gsi_to_irq()
666 __func__, irq, gsi); in xen_bind_pirq_gsi_to_irq()
670 irq = xen_allocate_irq_gsi(gsi); in xen_bind_pirq_gsi_to_irq()
671 if (irq < 0) in xen_bind_pirq_gsi_to_irq()
674 irq_op.irq = irq; in xen_bind_pirq_gsi_to_irq()
682 xen_free_irq(irq); in xen_bind_pirq_gsi_to_irq()
683 irq = -ENOSPC; in xen_bind_pirq_gsi_to_irq()
687 ret = xen_irq_info_pirq_setup(irq, 0, pirq, gsi, DOMID_SELF, in xen_bind_pirq_gsi_to_irq()
690 __unbind_from_irq(irq); in xen_bind_pirq_gsi_to_irq()
691 irq = ret; in xen_bind_pirq_gsi_to_irq()
695 pirq_query_unmask(irq); in xen_bind_pirq_gsi_to_irq()
712 irq_set_chip_and_handler_name(irq, &xen_pirq_chip, in xen_bind_pirq_gsi_to_irq()
715 irq_set_chip_and_handler_name(irq, &xen_pirq_chip, in xen_bind_pirq_gsi_to_irq()
721 return irq; in xen_bind_pirq_gsi_to_irq()
742 int i, irq, ret; in xen_bind_pirq_msi_to_irq() local
746 irq = xen_allocate_irqs_dynamic(nvec); in xen_bind_pirq_msi_to_irq()
747 if (irq < 0) in xen_bind_pirq_msi_to_irq()
751 irq_set_chip_and_handler_name(irq + i, &xen_pirq_chip, handle_edge_irq, name); in xen_bind_pirq_msi_to_irq()
753 ret = xen_irq_info_pirq_setup(irq + i, 0, pirq + i, 0, domid, in xen_bind_pirq_msi_to_irq()
759 ret = irq_set_msi_desc(irq, msidesc); in xen_bind_pirq_msi_to_irq()
764 return irq; in xen_bind_pirq_msi_to_irq()
767 __unbind_from_irq(irq + i); in xen_bind_pirq_msi_to_irq()
773 int xen_destroy_irq(int irq) in xen_destroy_irq() argument
776 struct irq_info *info = info_for_irq(irq); in xen_destroy_irq()
803 xen_free_irq(irq); in xen_destroy_irq()
812 int irq; in xen_irq_from_pirq() local
821 irq = info->irq; in xen_irq_from_pirq()
825 irq = -1; in xen_irq_from_pirq()
829 return irq; in xen_irq_from_pirq()
833 int xen_pirq_from_irq(unsigned irq) in xen_pirq_from_irq() argument
835 return pirq_from_irq(irq); in xen_pirq_from_irq()
841 int irq; in bind_evtchn_to_irq() local
849 irq = get_evtchn_to_irq(evtchn); in bind_evtchn_to_irq()
851 if (irq == -1) { in bind_evtchn_to_irq()
852 irq = xen_allocate_irq_dynamic(); in bind_evtchn_to_irq()
853 if (irq < 0) in bind_evtchn_to_irq()
856 irq_set_chip_and_handler_name(irq, &xen_dynamic_chip, in bind_evtchn_to_irq()
859 ret = xen_irq_info_evtchn_setup(irq, evtchn); in bind_evtchn_to_irq()
861 __unbind_from_irq(irq); in bind_evtchn_to_irq()
862 irq = ret; in bind_evtchn_to_irq()
868 struct irq_info *info = info_for_irq(irq); in bind_evtchn_to_irq()
875 return irq; in bind_evtchn_to_irq()
882 int evtchn, irq; in bind_ipi_to_irq() local
887 irq = per_cpu(ipi_to_irq, cpu)[ipi]; in bind_ipi_to_irq()
889 if (irq == -1) { in bind_ipi_to_irq()
890 irq = xen_allocate_irq_dynamic(); in bind_ipi_to_irq()
891 if (irq < 0) in bind_ipi_to_irq()
894 irq_set_chip_and_handler_name(irq, &xen_percpu_chip, in bind_ipi_to_irq()
903 ret = xen_irq_info_ipi_setup(cpu, irq, evtchn, ipi); in bind_ipi_to_irq()
905 __unbind_from_irq(irq); in bind_ipi_to_irq()
906 irq = ret; in bind_ipi_to_irq()
911 struct irq_info *info = info_for_irq(irq); in bind_ipi_to_irq()
917 return irq; in bind_ipi_to_irq()
974 int evtchn, irq, ret; in bind_virq_to_irq() local
978 irq = per_cpu(virq_to_irq, cpu)[virq]; in bind_virq_to_irq()
980 if (irq == -1) { in bind_virq_to_irq()
981 irq = xen_allocate_irq_dynamic(); in bind_virq_to_irq()
982 if (irq < 0) in bind_virq_to_irq()
986 irq_set_chip_and_handler_name(irq, &xen_percpu_chip, in bind_virq_to_irq()
989 irq_set_chip_and_handler_name(irq, &xen_dynamic_chip, in bind_virq_to_irq()
1005 ret = xen_irq_info_virq_setup(cpu, irq, evtchn, virq); in bind_virq_to_irq()
1007 __unbind_from_irq(irq); in bind_virq_to_irq()
1008 irq = ret; in bind_virq_to_irq()
1014 struct irq_info *info = info_for_irq(irq); in bind_virq_to_irq()
1021 return irq; in bind_virq_to_irq()
1024 static void unbind_from_irq(unsigned int irq) in unbind_from_irq() argument
1027 __unbind_from_irq(irq); in unbind_from_irq()
1036 int irq, retval; in bind_evtchn_to_irqhandler() local
1038 irq = bind_evtchn_to_irq(evtchn); in bind_evtchn_to_irqhandler()
1039 if (irq < 0) in bind_evtchn_to_irqhandler()
1040 return irq; in bind_evtchn_to_irqhandler()
1041 retval = request_irq(irq, handler, irqflags, devname, dev_id); in bind_evtchn_to_irqhandler()
1043 unbind_from_irq(irq); in bind_evtchn_to_irqhandler()
1047 return irq; in bind_evtchn_to_irqhandler()
1058 int irq, retval; in bind_interdomain_evtchn_to_irqhandler() local
1060 irq = bind_interdomain_evtchn_to_irq(remote_domain, remote_port); in bind_interdomain_evtchn_to_irqhandler()
1061 if (irq < 0) in bind_interdomain_evtchn_to_irqhandler()
1062 return irq; in bind_interdomain_evtchn_to_irqhandler()
1064 retval = request_irq(irq, handler, irqflags, devname, dev_id); in bind_interdomain_evtchn_to_irqhandler()
1066 unbind_from_irq(irq); in bind_interdomain_evtchn_to_irqhandler()
1070 return irq; in bind_interdomain_evtchn_to_irqhandler()
1078 int irq, retval; in bind_virq_to_irqhandler() local
1080 irq = bind_virq_to_irq(virq, cpu, irqflags & IRQF_PERCPU); in bind_virq_to_irqhandler()
1081 if (irq < 0) in bind_virq_to_irqhandler()
1082 return irq; in bind_virq_to_irqhandler()
1083 retval = request_irq(irq, handler, irqflags, devname, dev_id); in bind_virq_to_irqhandler()
1085 unbind_from_irq(irq); in bind_virq_to_irqhandler()
1089 return irq; in bind_virq_to_irqhandler()
1100 int irq, retval; in bind_ipi_to_irqhandler() local
1102 irq = bind_ipi_to_irq(ipi, cpu); in bind_ipi_to_irqhandler()
1103 if (irq < 0) in bind_ipi_to_irqhandler()
1104 return irq; in bind_ipi_to_irqhandler()
1107 retval = request_irq(irq, handler, irqflags, devname, dev_id); in bind_ipi_to_irqhandler()
1109 unbind_from_irq(irq); in bind_ipi_to_irqhandler()
1113 return irq; in bind_ipi_to_irqhandler()
1116 void unbind_from_irqhandler(unsigned int irq, void *dev_id) in unbind_from_irqhandler() argument
1118 struct irq_info *info = irq_get_handler_data(irq); in unbind_from_irqhandler()
1122 free_irq(irq, dev_id); in unbind_from_irqhandler()
1123 unbind_from_irq(irq); in unbind_from_irqhandler()
1132 int xen_set_irq_priority(unsigned irq, unsigned priority) in xen_set_irq_priority() argument
1136 set_priority.port = evtchn_from_irq(irq); in xen_set_irq_priority()
1146 int irq = get_evtchn_to_irq(evtchn); in evtchn_make_refcounted() local
1149 if (irq == -1) in evtchn_make_refcounted()
1152 info = irq_get_handler_data(irq); in evtchn_make_refcounted()
1167 int irq; in evtchn_get() local
1176 irq = get_evtchn_to_irq(evtchn); in evtchn_get()
1177 if (irq == -1) in evtchn_get()
1180 info = irq_get_handler_data(irq); in evtchn_get()
1200 int irq = get_evtchn_to_irq(evtchn); in evtchn_put() local
1201 if (WARN_ON(irq == -1)) in evtchn_put()
1203 unbind_from_irq(irq); in evtchn_put()
1209 int irq; in xen_send_IPI_one() local
1219 irq = per_cpu(ipi_to_irq, cpu)[vector]; in xen_send_IPI_one()
1220 BUG_ON(irq < 0); in xen_send_IPI_one()
1221 notify_remote_via_irq(irq); in xen_send_IPI_one()
1274 void rebind_evtchn_irq(int evtchn, int irq) in rebind_evtchn_irq() argument
1276 struct irq_info *info = info_for_irq(irq); in rebind_evtchn_irq()
1283 disable_irq(irq); in rebind_evtchn_irq()
1293 (void)xen_irq_info_evtchn_setup(irq, evtchn); in rebind_evtchn_irq()
1299 irq_set_affinity(irq, cpumask_of(info->cpu)); in rebind_evtchn_irq()
1302 enable_irq(irq); in rebind_evtchn_irq()
1306 static int rebind_irq_to_cpu(unsigned irq, unsigned tcpu) in rebind_irq_to_cpu() argument
1309 int evtchn = evtchn_from_irq(irq); in rebind_irq_to_cpu()
1351 return rebind_irq_to_cpu(data->irq, tcpu); in set_affinity_irq()
1356 int evtchn = evtchn_from_irq(data->irq); in enable_dynirq()
1364 int evtchn = evtchn_from_irq(data->irq); in disable_dynirq()
1372 int evtchn = evtchn_from_irq(data->irq); in ack_dynirq()
1399 unsigned int evtchn = evtchn_from_irq(data->irq); in retrigger_dynirq()
1415 int pirq, rc, irq, gsi; in restore_pirqs() local
1425 irq = info->irq; in restore_pirqs()
1440 gsi, irq, pirq, rc); in restore_pirqs()
1441 xen_free_irq(irq); in restore_pirqs()
1445 printk(KERN_DEBUG "xen: --> irq=%d, pirq=%d\n", irq, map_irq.pirq); in restore_pirqs()
1447 __startup_pirq(irq); in restore_pirqs()
1454 int virq, irq, evtchn; in restore_cpu_virqs() local
1457 if ((irq = per_cpu(virq_to_irq, cpu)[virq]) == -1) in restore_cpu_virqs()
1460 BUG_ON(virq_from_irq(irq) != virq); in restore_cpu_virqs()
1471 (void)xen_irq_info_virq_setup(cpu, irq, evtchn, virq); in restore_cpu_virqs()
1479 int ipi, irq, evtchn; in restore_cpu_ipis() local
1482 if ((irq = per_cpu(ipi_to_irq, cpu)[ipi]) == -1) in restore_cpu_ipis()
1485 BUG_ON(ipi_from_irq(irq) != ipi); in restore_cpu_ipis()
1495 (void)xen_irq_info_ipi_setup(cpu, irq, evtchn, ipi); in restore_cpu_ipis()
1501 void xen_clear_irq_pending(int irq) in xen_clear_irq_pending() argument
1503 int evtchn = evtchn_from_irq(irq); in xen_clear_irq_pending()
1509 void xen_set_irq_pending(int irq) in xen_set_irq_pending() argument
1511 int evtchn = evtchn_from_irq(irq); in xen_set_irq_pending()
1517 bool xen_test_irq_pending(int irq) in xen_test_irq_pending() argument
1519 int evtchn = evtchn_from_irq(irq); in xen_test_irq_pending()
1530 void xen_poll_irq_timeout(int irq, u64 timeout) in xen_poll_irq_timeout() argument
1532 evtchn_port_t evtchn = evtchn_from_irq(irq); in xen_poll_irq_timeout()
1548 void xen_poll_irq(int irq) in xen_poll_irq() argument
1550 xen_poll_irq_timeout(irq, 0 /* no timeout */); in xen_poll_irq()
1554 int xen_test_irq_shared(int irq) in xen_test_irq_shared() argument
1556 struct irq_info *info = info_for_irq(irq); in xen_test_irq_shared()
1562 irq_status.irq = info->u.pirq.pirq; in xen_test_irq_shared()