xref: /qemu/include/hw/irq.h (revision faf7c6de34fb8eaa566726cc658ba5ad81fb32af)
187ecb68bSpbrook #ifndef QEMU_IRQ_H
287ecb68bSpbrook #define QEMU_IRQ_H
387ecb68bSpbrook 
4d537cf6cSpbrook /* Generic IRQ/GPIO pin infrastructure.  */
5d537cf6cSpbrook 
6615c4895SAndreas Färber #define TYPE_IRQ "irq"
7615c4895SAndreas Färber 
8d537cf6cSpbrook void qemu_set_irq(qemu_irq irq, int level);
9d537cf6cSpbrook 
10d537cf6cSpbrook static inline void qemu_irq_raise(qemu_irq irq)
11d537cf6cSpbrook {
12d537cf6cSpbrook     qemu_set_irq(irq, 1);
13d537cf6cSpbrook }
14d537cf6cSpbrook 
15d537cf6cSpbrook static inline void qemu_irq_lower(qemu_irq irq)
16d537cf6cSpbrook {
17d537cf6cSpbrook     qemu_set_irq(irq, 0);
18d537cf6cSpbrook }
19d537cf6cSpbrook 
20106627d0Sbalrog static inline void qemu_irq_pulse(qemu_irq irq)
21106627d0Sbalrog {
22106627d0Sbalrog     qemu_set_irq(irq, 1);
23106627d0Sbalrog     qemu_set_irq(irq, 0);
24106627d0Sbalrog }
25106627d0Sbalrog 
261e5b31e6SPeter A. G. Crosthwaite /* Returns an array of N IRQs. Each IRQ is assigned the argument handler and
271e5b31e6SPeter A. G. Crosthwaite  * opaque data.
281e5b31e6SPeter A. G. Crosthwaite  */
29d537cf6cSpbrook qemu_irq *qemu_allocate_irqs(qemu_irq_handler handler, void *opaque, int n);
301e5b31e6SPeter A. G. Crosthwaite 
31a8a9d30bSMarcel Apfelbaum /*
32a8a9d30bSMarcel Apfelbaum  * Allocates a single IRQ. The irq is assigned with a handler, an opaque
33a8a9d30bSMarcel Apfelbaum  * data and the interrupt number.
34a8a9d30bSMarcel Apfelbaum  */
35a8a9d30bSMarcel Apfelbaum qemu_irq qemu_allocate_irq(qemu_irq_handler handler, void *opaque, int n);
36a8a9d30bSMarcel Apfelbaum 
371e5b31e6SPeter A. G. Crosthwaite /* Extends an Array of IRQs. Old IRQs have their handlers and opaque data
381e5b31e6SPeter A. G. Crosthwaite  * preserved. New IRQs are assigned the argument handler and opaque data.
391e5b31e6SPeter A. G. Crosthwaite  */
401e5b31e6SPeter A. G. Crosthwaite qemu_irq *qemu_extend_irqs(qemu_irq *old, int n_old, qemu_irq_handler handler,
411e5b31e6SPeter A. G. Crosthwaite                                 void *opaque, int n);
421e5b31e6SPeter A. G. Crosthwaite 
43f173d57aSPeter Crosthwaite void qemu_free_irqs(qemu_irq *s, int n);
44a8a9d30bSMarcel Apfelbaum void qemu_free_irq(qemu_irq irq);
45d537cf6cSpbrook 
46b50a6563Sbalrog /* Returns a new IRQ with opposite polarity.  */
47b50a6563Sbalrog qemu_irq qemu_irq_invert(qemu_irq irq);
4887ecb68bSpbrook 
495edb1b3fSPeter Maydell /* Returns a new IRQ which feeds into both the passed IRQs.
505edb1b3fSPeter Maydell  * It's probably better to use the TYPE_SPLIT_IRQ device instead.
515edb1b3fSPeter Maydell  */
529793212bSPeter Maydell qemu_irq qemu_irq_split(qemu_irq irq1, qemu_irq irq2);
539793212bSPeter Maydell 
5420288345SPaolo Bonzini /* For internal use in qtest.  Similar to qemu_irq_split, but operating
5520288345SPaolo Bonzini    on an existing vector of qemu_irq.  */
5620288345SPaolo Bonzini void qemu_irq_intercept_in(qemu_irq *gpio_in, qemu_irq_handler handler, int n);
5720288345SPaolo Bonzini 
58*faf7c6deSPeter Maydell /**
59*faf7c6deSPeter Maydell  * qemu_irq_is_connected: Return true if IRQ line is wired up
60*faf7c6deSPeter Maydell  *
61*faf7c6deSPeter Maydell  * If a qemu_irq has a device on the other (receiving) end of it,
62*faf7c6deSPeter Maydell  * return true; otherwise return false.
63*faf7c6deSPeter Maydell  *
64*faf7c6deSPeter Maydell  * Usually device models don't need to care whether the machine model
65*faf7c6deSPeter Maydell  * has wired up their outbound qemu_irq lines, because functions like
66*faf7c6deSPeter Maydell  * qemu_set_irq() silently do nothing if there is nothing on the other
67*faf7c6deSPeter Maydell  * end of the line. However occasionally a device model will want to
68*faf7c6deSPeter Maydell  * provide default behaviour if its output is left floating, and
69*faf7c6deSPeter Maydell  * it can use this function to identify when that is the case.
70*faf7c6deSPeter Maydell  */
71*faf7c6deSPeter Maydell static inline bool qemu_irq_is_connected(qemu_irq irq)
72*faf7c6deSPeter Maydell {
73*faf7c6deSPeter Maydell     return irq != NULL;
74*faf7c6deSPeter Maydell }
75*faf7c6deSPeter Maydell 
7687ecb68bSpbrook #endif
77