Lines Matching refs:irq
109 unsigned irq; member
173 static bool (*pirq_needs_eoi)(unsigned irq);
212 static int set_evtchn_to_irq(evtchn_port_t evtchn, unsigned int irq) in set_evtchn_to_irq() argument
226 if (irq == -1) in set_evtchn_to_irq()
243 WRITE_ONCE(evtchn_to_irq[row][col], irq); in set_evtchn_to_irq()
257 static struct irq_info *info_for_irq(unsigned irq) in info_for_irq() argument
259 if (irq < nr_legacy_irqs()) in info_for_irq()
260 return legacy_info_ptrs[irq]; in info_for_irq()
262 return irq_get_chip_data(irq); in info_for_irq()
265 static void set_info_for_irq(unsigned int irq, struct irq_info *info) in set_info_for_irq() argument
267 if (irq < nr_legacy_irqs()) in set_info_for_irq()
268 legacy_info_ptrs[irq] = info; in set_info_for_irq()
270 irq_set_chip_data(irq, info); in set_info_for_irq()
303 unsigned int irq = info->irq; in delayed_free_irq() local
306 set_info_for_irq(irq, NULL); in delayed_free_irq()
311 if (irq >= nr_legacy_irqs()) in delayed_free_irq()
312 irq_free_desc(irq); in delayed_free_irq()
317 unsigned irq, in xen_irq_info_common_setup() argument
327 info->irq = irq; in xen_irq_info_common_setup()
333 ret = set_evtchn_to_irq(evtchn, irq); in xen_irq_info_common_setup()
337 irq_clear_status_flags(irq, IRQ_NOREQUEST|IRQ_NOAUTOEN); in xen_irq_info_common_setup()
342 static int xen_irq_info_evtchn_setup(unsigned irq, in xen_irq_info_evtchn_setup() argument
346 struct irq_info *info = info_for_irq(irq); in xen_irq_info_evtchn_setup()
349 ret = xen_irq_info_common_setup(info, irq, IRQT_EVTCHN, evtchn, 0); in xen_irq_info_evtchn_setup()
358 unsigned irq, in xen_irq_info_ipi_setup() argument
362 struct irq_info *info = info_for_irq(irq); in xen_irq_info_ipi_setup()
366 per_cpu(ipi_to_irq, cpu)[ipi] = irq; in xen_irq_info_ipi_setup()
368 return xen_irq_info_common_setup(info, irq, IRQT_IPI, evtchn, 0); in xen_irq_info_ipi_setup()
372 unsigned irq, in xen_irq_info_virq_setup() argument
376 struct irq_info *info = info_for_irq(irq); in xen_irq_info_virq_setup()
380 per_cpu(virq_to_irq, cpu)[virq] = irq; in xen_irq_info_virq_setup()
382 return xen_irq_info_common_setup(info, irq, IRQT_VIRQ, evtchn, 0); in xen_irq_info_virq_setup()
385 static int xen_irq_info_pirq_setup(unsigned irq, in xen_irq_info_pirq_setup() argument
392 struct irq_info *info = info_for_irq(irq); in xen_irq_info_pirq_setup()
399 return xen_irq_info_common_setup(info, irq, IRQT_PIRQ, evtchn, 0); in xen_irq_info_pirq_setup()
413 evtchn_port_t evtchn_from_irq(unsigned irq) in evtchn_from_irq() argument
417 if (likely(irq < nr_irqs)) in evtchn_from_irq()
418 info = info_for_irq(irq); in evtchn_from_irq()
436 static enum ipi_vector ipi_from_irq(unsigned irq) in ipi_from_irq() argument
438 struct irq_info *info = info_for_irq(irq); in ipi_from_irq()
446 static unsigned virq_from_irq(unsigned irq) in virq_from_irq() argument
448 struct irq_info *info = info_for_irq(irq); in virq_from_irq()
456 static unsigned pirq_from_irq(unsigned irq) in pirq_from_irq() argument
458 struct irq_info *info = info_for_irq(irq); in pirq_from_irq()
466 static enum xen_irq_type type_from_irq(unsigned irq) in type_from_irq() argument
468 return info_for_irq(irq)->type; in type_from_irq()
471 static unsigned cpu_from_irq(unsigned irq) in cpu_from_irq() argument
473 return info_for_irq(irq)->cpu; in cpu_from_irq()
478 int irq = get_evtchn_to_irq(evtchn); in cpu_from_evtchn() local
481 if (irq != -1) in cpu_from_evtchn()
482 ret = cpu_from_irq(irq); in cpu_from_evtchn()
516 static bool pirq_check_eoi_map(unsigned irq) in pirq_check_eoi_map() argument
518 return test_bit(pirq_from_irq(irq), pirq_eoi_map); in pirq_check_eoi_map()
522 static bool pirq_needs_eoi_flag(unsigned irq) in pirq_needs_eoi_flag() argument
524 struct irq_info *info = info_for_irq(irq); in pirq_needs_eoi_flag()
533 int irq = get_evtchn_to_irq(evtchn); in bind_evtchn_to_cpu() local
534 struct irq_info *info = info_for_irq(irq); in bind_evtchn_to_cpu()
536 BUG_ON(irq == -1); in bind_evtchn_to_cpu()
539 struct irq_data *data = irq_get_irq_data(irq); in bind_evtchn_to_cpu()
560 void notify_remote_via_irq(int irq) in notify_remote_via_irq() argument
562 evtchn_port_t evtchn = evtchn_from_irq(irq); in notify_remote_via_irq()
720 void xen_irq_lateeoi(unsigned int irq, unsigned int eoi_flags) in xen_irq_lateeoi() argument
726 info = info_for_irq(irq); in xen_irq_lateeoi()
735 static void xen_irq_init(unsigned irq) in xen_irq_init() argument
741 panic("Unable to allocate metadata for IRQ%d\n", irq); in xen_irq_init()
747 set_info_for_irq(irq, info); in xen_irq_init()
752 irq_set_status_flags(irq, IRQ_MOVE_PCNTXT); in xen_irq_init()
760 int i, irq = irq_alloc_descs(-1, 0, nvec, -1); in xen_allocate_irqs_dynamic() local
762 if (irq >= 0) { in xen_allocate_irqs_dynamic()
764 xen_irq_init(irq + i); in xen_allocate_irqs_dynamic()
767 return irq; in xen_allocate_irqs_dynamic()
778 int irq; in xen_allocate_irq_gsi() local
791 irq = gsi; in xen_allocate_irq_gsi()
793 irq = irq_alloc_desc_at(gsi, -1); in xen_allocate_irq_gsi()
795 xen_irq_init(irq); in xen_allocate_irq_gsi()
797 return irq; in xen_allocate_irq_gsi()
800 static void xen_free_irq(unsigned irq) in xen_free_irq() argument
802 struct irq_info *info = info_for_irq(irq); in xen_free_irq()
833 static void pirq_query_unmask(int irq) in pirq_query_unmask() argument
836 struct irq_info *info = info_for_irq(irq); in pirq_query_unmask()
840 irq_status.irq = pirq_from_irq(irq); in pirq_query_unmask()
851 struct irq_info *info = info_for_irq(data->irq); in eoi_pirq()
853 struct physdev_eoi eoi = { .irq = pirq_from_irq(data->irq) }; in eoi_pirq()
861 if (pirq_needs_eoi(data->irq)) { in eoi_pirq()
873 static unsigned int __startup_pirq(unsigned int irq) in __startup_pirq() argument
876 struct irq_info *info = info_for_irq(irq); in __startup_pirq()
877 evtchn_port_t evtchn = evtchn_from_irq(irq); in __startup_pirq()
885 bind_pirq.pirq = pirq_from_irq(irq); in __startup_pirq()
891 pr_warn("Failed to obtain physical IRQ %d\n", irq); in __startup_pirq()
896 pirq_query_unmask(irq); in __startup_pirq()
898 rc = set_evtchn_to_irq(evtchn, irq); in __startup_pirq()
912 eoi_pirq(irq_get_irq_data(irq)); in __startup_pirq()
917 pr_err("irq%d: Failed to set port to irq mapping (%d)\n", irq, rc); in __startup_pirq()
924 return __startup_pirq(data->irq); in startup_pirq()
929 unsigned int irq = data->irq; in shutdown_pirq() local
930 struct irq_info *info = info_for_irq(irq); in shutdown_pirq()
931 evtchn_port_t evtchn = evtchn_from_irq(irq); in shutdown_pirq()
962 return info->irq; in xen_irq_from_gsi()
969 static void __unbind_from_irq(unsigned int irq) in __unbind_from_irq() argument
971 evtchn_port_t evtchn = evtchn_from_irq(irq); in __unbind_from_irq()
972 struct irq_info *info = info_for_irq(irq); in __unbind_from_irq()
981 unsigned int cpu = cpu_from_irq(irq); in __unbind_from_irq()
986 switch (type_from_irq(irq)) { in __unbind_from_irq()
988 per_cpu(virq_to_irq, cpu)[virq_from_irq(irq)] = -1; in __unbind_from_irq()
991 per_cpu(ipi_to_irq, cpu)[ipi_from_irq(irq)] = -1; in __unbind_from_irq()
1005 xen_free_irq(irq); in __unbind_from_irq()
1021 int irq; in xen_bind_pirq_gsi_to_irq() local
1027 irq = xen_irq_from_gsi(gsi); in xen_bind_pirq_gsi_to_irq()
1028 if (irq != -1) { in xen_bind_pirq_gsi_to_irq()
1030 __func__, irq, gsi); in xen_bind_pirq_gsi_to_irq()
1034 irq = xen_allocate_irq_gsi(gsi); in xen_bind_pirq_gsi_to_irq()
1035 if (irq < 0) in xen_bind_pirq_gsi_to_irq()
1038 irq_op.irq = irq; in xen_bind_pirq_gsi_to_irq()
1046 xen_free_irq(irq); in xen_bind_pirq_gsi_to_irq()
1047 irq = -ENOSPC; in xen_bind_pirq_gsi_to_irq()
1051 ret = xen_irq_info_pirq_setup(irq, 0, pirq, gsi, DOMID_SELF, in xen_bind_pirq_gsi_to_irq()
1054 __unbind_from_irq(irq); in xen_bind_pirq_gsi_to_irq()
1055 irq = ret; in xen_bind_pirq_gsi_to_irq()
1059 pirq_query_unmask(irq); in xen_bind_pirq_gsi_to_irq()
1076 irq_set_chip_and_handler_name(irq, &xen_pirq_chip, in xen_bind_pirq_gsi_to_irq()
1079 irq_set_chip_and_handler_name(irq, &xen_pirq_chip, in xen_bind_pirq_gsi_to_irq()
1085 return irq; in xen_bind_pirq_gsi_to_irq()
1106 int i, irq, ret; in xen_bind_pirq_msi_to_irq() local
1110 irq = xen_allocate_irqs_dynamic(nvec); in xen_bind_pirq_msi_to_irq()
1111 if (irq < 0) in xen_bind_pirq_msi_to_irq()
1115 irq_set_chip_and_handler_name(irq + i, &xen_pirq_chip, handle_edge_irq, name); in xen_bind_pirq_msi_to_irq()
1117 ret = xen_irq_info_pirq_setup(irq + i, 0, pirq + i, 0, domid, in xen_bind_pirq_msi_to_irq()
1123 ret = irq_set_msi_desc(irq, msidesc); in xen_bind_pirq_msi_to_irq()
1128 return irq; in xen_bind_pirq_msi_to_irq()
1131 __unbind_from_irq(irq + nvec); in xen_bind_pirq_msi_to_irq()
1137 int xen_destroy_irq(int irq) in xen_destroy_irq() argument
1140 struct irq_info *info = info_for_irq(irq); in xen_destroy_irq()
1167 xen_free_irq(irq); in xen_destroy_irq()
1176 int irq; in xen_irq_from_pirq() local
1185 irq = info->irq; in xen_irq_from_pirq()
1189 irq = -1; in xen_irq_from_pirq()
1193 return irq; in xen_irq_from_pirq()
1197 int xen_pirq_from_irq(unsigned irq) in xen_pirq_from_irq() argument
1199 return pirq_from_irq(irq); in xen_pirq_from_irq()
1206 int irq; in bind_evtchn_to_irq_chip() local
1214 irq = get_evtchn_to_irq(evtchn); in bind_evtchn_to_irq_chip()
1216 if (irq == -1) { in bind_evtchn_to_irq_chip()
1217 irq = xen_allocate_irq_dynamic(); in bind_evtchn_to_irq_chip()
1218 if (irq < 0) in bind_evtchn_to_irq_chip()
1221 irq_set_chip_and_handler_name(irq, chip, in bind_evtchn_to_irq_chip()
1224 ret = xen_irq_info_evtchn_setup(irq, evtchn, dev); in bind_evtchn_to_irq_chip()
1226 __unbind_from_irq(irq); in bind_evtchn_to_irq_chip()
1227 irq = ret; in bind_evtchn_to_irq_chip()
1239 struct irq_info *info = info_for_irq(irq); in bind_evtchn_to_irq_chip()
1246 return irq; in bind_evtchn_to_irq_chip()
1265 int ret, irq; in bind_ipi_to_irq() local
1269 irq = per_cpu(ipi_to_irq, cpu)[ipi]; in bind_ipi_to_irq()
1271 if (irq == -1) { in bind_ipi_to_irq()
1272 irq = xen_allocate_irq_dynamic(); in bind_ipi_to_irq()
1273 if (irq < 0) in bind_ipi_to_irq()
1276 irq_set_chip_and_handler_name(irq, &xen_percpu_chip, in bind_ipi_to_irq()
1285 ret = xen_irq_info_ipi_setup(cpu, irq, evtchn, ipi); in bind_ipi_to_irq()
1287 __unbind_from_irq(irq); in bind_ipi_to_irq()
1288 irq = ret; in bind_ipi_to_irq()
1297 struct irq_info *info = info_for_irq(irq); in bind_ipi_to_irq()
1303 return irq; in bind_ipi_to_irq()
1371 int irq, ret; in bind_virq_to_irq() local
1375 irq = per_cpu(virq_to_irq, cpu)[virq]; in bind_virq_to_irq()
1377 if (irq == -1) { in bind_virq_to_irq()
1378 irq = xen_allocate_irq_dynamic(); in bind_virq_to_irq()
1379 if (irq < 0) in bind_virq_to_irq()
1383 irq_set_chip_and_handler_name(irq, &xen_percpu_chip, in bind_virq_to_irq()
1386 irq_set_chip_and_handler_name(irq, &xen_dynamic_chip, in bind_virq_to_irq()
1401 ret = xen_irq_info_virq_setup(cpu, irq, evtchn, virq); in bind_virq_to_irq()
1403 __unbind_from_irq(irq); in bind_virq_to_irq()
1404 irq = ret; in bind_virq_to_irq()
1414 struct irq_info *info = info_for_irq(irq); in bind_virq_to_irq()
1421 return irq; in bind_virq_to_irq()
1424 static void unbind_from_irq(unsigned int irq) in unbind_from_irq() argument
1427 __unbind_from_irq(irq); in unbind_from_irq()
1437 int irq, retval; in bind_evtchn_to_irqhandler_chip() local
1439 irq = bind_evtchn_to_irq_chip(evtchn, chip, NULL); in bind_evtchn_to_irqhandler_chip()
1440 if (irq < 0) in bind_evtchn_to_irqhandler_chip()
1441 return irq; in bind_evtchn_to_irqhandler_chip()
1442 retval = request_irq(irq, handler, irqflags, devname, dev_id); in bind_evtchn_to_irqhandler_chip()
1444 unbind_from_irq(irq); in bind_evtchn_to_irqhandler_chip()
1448 return irq; in bind_evtchn_to_irqhandler_chip()
1478 int irq, retval; in bind_interdomain_evtchn_to_irqhandler_chip() local
1480 irq = bind_interdomain_evtchn_to_irq_chip(dev, remote_port, chip); in bind_interdomain_evtchn_to_irqhandler_chip()
1481 if (irq < 0) in bind_interdomain_evtchn_to_irqhandler_chip()
1482 return irq; in bind_interdomain_evtchn_to_irqhandler_chip()
1484 retval = request_irq(irq, handler, irqflags, devname, dev_id); in bind_interdomain_evtchn_to_irqhandler_chip()
1486 unbind_from_irq(irq); in bind_interdomain_evtchn_to_irqhandler_chip()
1490 return irq; in bind_interdomain_evtchn_to_irqhandler_chip()
1510 int irq, retval; in bind_virq_to_irqhandler() local
1512 irq = bind_virq_to_irq(virq, cpu, irqflags & IRQF_PERCPU); in bind_virq_to_irqhandler()
1513 if (irq < 0) in bind_virq_to_irqhandler()
1514 return irq; in bind_virq_to_irqhandler()
1515 retval = request_irq(irq, handler, irqflags, devname, dev_id); in bind_virq_to_irqhandler()
1517 unbind_from_irq(irq); in bind_virq_to_irqhandler()
1521 return irq; in bind_virq_to_irqhandler()
1532 int irq, retval; in bind_ipi_to_irqhandler() local
1534 irq = bind_ipi_to_irq(ipi, cpu); in bind_ipi_to_irqhandler()
1535 if (irq < 0) in bind_ipi_to_irqhandler()
1536 return irq; in bind_ipi_to_irqhandler()
1539 retval = request_irq(irq, handler, irqflags, devname, dev_id); in bind_ipi_to_irqhandler()
1541 unbind_from_irq(irq); in bind_ipi_to_irqhandler()
1545 return irq; in bind_ipi_to_irqhandler()
1548 void unbind_from_irqhandler(unsigned int irq, void *dev_id) in unbind_from_irqhandler() argument
1550 struct irq_info *info = info_for_irq(irq); in unbind_from_irqhandler()
1554 free_irq(irq, dev_id); in unbind_from_irqhandler()
1555 unbind_from_irq(irq); in unbind_from_irqhandler()
1564 int xen_set_irq_priority(unsigned irq, unsigned priority) in xen_set_irq_priority() argument
1568 set_priority.port = evtchn_from_irq(irq); in xen_set_irq_priority()
1578 int irq = get_evtchn_to_irq(evtchn); in evtchn_make_refcounted() local
1581 if (irq == -1) in evtchn_make_refcounted()
1584 info = info_for_irq(irq); in evtchn_make_refcounted()
1599 int irq; in evtchn_get() local
1608 irq = get_evtchn_to_irq(evtchn); in evtchn_get()
1609 if (irq == -1) in evtchn_get()
1612 info = info_for_irq(irq); in evtchn_get()
1632 int irq = get_evtchn_to_irq(evtchn); in evtchn_put() local
1633 if (WARN_ON(irq == -1)) in evtchn_put()
1635 unbind_from_irq(irq); in evtchn_put()
1641 int irq; in xen_send_IPI_one() local
1652 irq = per_cpu(ipi_to_irq, cpu)[vector]; in xen_send_IPI_one()
1653 BUG_ON(irq < 0); in xen_send_IPI_one()
1654 notify_remote_via_irq(irq); in xen_send_IPI_one()
1665 int irq; in handle_irq_for_port() local
1669 irq = get_evtchn_to_irq(port); in handle_irq_for_port()
1670 if (irq == -1) in handle_irq_for_port()
1695 info = info_for_irq(irq); in handle_irq_for_port()
1709 generic_handle_irq(irq); in handle_irq_for_port()
1767 void rebind_evtchn_irq(evtchn_port_t evtchn, int irq) in rebind_evtchn_irq() argument
1769 struct irq_info *info = info_for_irq(irq); in rebind_evtchn_irq()
1776 disable_irq(irq); in rebind_evtchn_irq()
1786 (void)xen_irq_info_evtchn_setup(irq, evtchn, NULL); in rebind_evtchn_irq()
1793 enable_irq(irq); in rebind_evtchn_irq()
1865 ret = xen_rebind_evtchn_to_cpu(info_for_irq(data->irq), tcpu); in set_affinity_irq()
1874 struct irq_info *info = info_for_irq(data->irq); in enable_dynirq()
1883 struct irq_info *info = info_for_irq(data->irq); in disable_dynirq()
1892 struct irq_info *info = info_for_irq(data->irq); in ack_dynirq()
1907 struct irq_info *info = info_for_irq(data->irq); in lateeoi_ack_dynirq()
1923 struct irq_info *info = info_for_irq(data->irq); in lateeoi_mask_ack_dynirq()
1934 struct irq_info *info = info_for_irq(data->irq); in retrigger_dynirq()
1949 int pirq, rc, irq, gsi; in restore_pirqs() local
1959 irq = info->irq; in restore_pirqs()
1974 gsi, irq, pirq, rc); in restore_pirqs()
1975 xen_free_irq(irq); in restore_pirqs()
1979 printk(KERN_DEBUG "xen: --> irq=%d, pirq=%d\n", irq, map_irq.pirq); in restore_pirqs()
1981 __startup_pirq(irq); in restore_pirqs()
1989 int virq, irq; in restore_cpu_virqs() local
1992 if ((irq = per_cpu(virq_to_irq, cpu)[virq]) == -1) in restore_cpu_virqs()
1995 BUG_ON(virq_from_irq(irq) != virq); in restore_cpu_virqs()
2006 (void)xen_irq_info_virq_setup(cpu, irq, evtchn, virq); in restore_cpu_virqs()
2016 int ipi, irq; in restore_cpu_ipis() local
2019 if ((irq = per_cpu(ipi_to_irq, cpu)[ipi]) == -1) in restore_cpu_ipis()
2022 BUG_ON(ipi_from_irq(irq) != ipi); in restore_cpu_ipis()
2032 (void)xen_irq_info_ipi_setup(cpu, irq, evtchn, ipi); in restore_cpu_ipis()
2039 void xen_clear_irq_pending(int irq) in xen_clear_irq_pending() argument
2041 struct irq_info *info = info_for_irq(irq); in xen_clear_irq_pending()
2048 void xen_set_irq_pending(int irq) in xen_set_irq_pending() argument
2050 evtchn_port_t evtchn = evtchn_from_irq(irq); in xen_set_irq_pending()
2056 bool xen_test_irq_pending(int irq) in xen_test_irq_pending() argument
2058 evtchn_port_t evtchn = evtchn_from_irq(irq); in xen_test_irq_pending()
2069 void xen_poll_irq_timeout(int irq, u64 timeout) in xen_poll_irq_timeout() argument
2071 evtchn_port_t evtchn = evtchn_from_irq(irq); in xen_poll_irq_timeout()
2087 void xen_poll_irq(int irq) in xen_poll_irq() argument
2089 xen_poll_irq_timeout(irq, 0 /* no timeout */); in xen_poll_irq()
2093 int xen_test_irq_shared(int irq) in xen_test_irq_shared() argument
2095 struct irq_info *info = info_for_irq(irq); in xen_test_irq_shared()
2101 irq_status.irq = info->u.pirq.pirq; in xen_test_irq_shared()