xref: /qemu/include/hw/irq.h (revision f173d57a4cd3bb2a8362fe376cd9fd776b2f57d5)
187ecb68bSpbrook #ifndef QEMU_IRQ_H
287ecb68bSpbrook #define QEMU_IRQ_H
387ecb68bSpbrook 
4d537cf6cSpbrook /* Generic IRQ/GPIO pin infrastructure.  */
5d537cf6cSpbrook 
65202ef94SIgor Mammedov typedef struct IRQState *qemu_irq;
75202ef94SIgor Mammedov 
8d537cf6cSpbrook typedef void (*qemu_irq_handler)(void *opaque, int n, int level);
9d537cf6cSpbrook 
10d537cf6cSpbrook void qemu_set_irq(qemu_irq irq, int level);
11d537cf6cSpbrook 
12d537cf6cSpbrook static inline void qemu_irq_raise(qemu_irq irq)
13d537cf6cSpbrook {
14d537cf6cSpbrook     qemu_set_irq(irq, 1);
15d537cf6cSpbrook }
16d537cf6cSpbrook 
17d537cf6cSpbrook static inline void qemu_irq_lower(qemu_irq irq)
18d537cf6cSpbrook {
19d537cf6cSpbrook     qemu_set_irq(irq, 0);
20d537cf6cSpbrook }
21d537cf6cSpbrook 
22106627d0Sbalrog static inline void qemu_irq_pulse(qemu_irq irq)
23106627d0Sbalrog {
24106627d0Sbalrog     qemu_set_irq(irq, 1);
25106627d0Sbalrog     qemu_set_irq(irq, 0);
26106627d0Sbalrog }
27106627d0Sbalrog 
281e5b31e6SPeter A. G. Crosthwaite /* Returns an array of N IRQs. Each IRQ is assigned the argument handler and
291e5b31e6SPeter A. G. Crosthwaite  * opaque data.
301e5b31e6SPeter A. G. Crosthwaite  */
31d537cf6cSpbrook qemu_irq *qemu_allocate_irqs(qemu_irq_handler handler, void *opaque, int n);
321e5b31e6SPeter A. G. Crosthwaite 
33a8a9d30bSMarcel Apfelbaum /*
34a8a9d30bSMarcel Apfelbaum  * Allocates a single IRQ. The irq is assigned with a handler, an opaque
35a8a9d30bSMarcel Apfelbaum  * data and the interrupt number.
36a8a9d30bSMarcel Apfelbaum  */
37a8a9d30bSMarcel Apfelbaum qemu_irq qemu_allocate_irq(qemu_irq_handler handler, void *opaque, int n);
38a8a9d30bSMarcel Apfelbaum 
391e5b31e6SPeter A. G. Crosthwaite /* Extends an Array of IRQs. Old IRQs have their handlers and opaque data
401e5b31e6SPeter A. G. Crosthwaite  * preserved. New IRQs are assigned the argument handler and opaque data.
411e5b31e6SPeter A. G. Crosthwaite  */
421e5b31e6SPeter A. G. Crosthwaite qemu_irq *qemu_extend_irqs(qemu_irq *old, int n_old, qemu_irq_handler handler,
431e5b31e6SPeter A. G. Crosthwaite                                 void *opaque, int n);
441e5b31e6SPeter A. G. Crosthwaite 
45*f173d57aSPeter Crosthwaite void qemu_free_irqs(qemu_irq *s, int n);
46a8a9d30bSMarcel Apfelbaum void qemu_free_irq(qemu_irq irq);
47d537cf6cSpbrook 
48b50a6563Sbalrog /* Returns a new IRQ with opposite polarity.  */
49b50a6563Sbalrog qemu_irq qemu_irq_invert(qemu_irq irq);
5087ecb68bSpbrook 
519793212bSPeter Maydell /* Returns a new IRQ which feeds into both the passed IRQs */
529793212bSPeter Maydell qemu_irq qemu_irq_split(qemu_irq irq1, qemu_irq irq2);
539793212bSPeter Maydell 
5422ec3283SAvi Kivity /* Returns a new IRQ set which connects 1:1 to another IRQ set, which
5522ec3283SAvi Kivity  * may be set later.
5622ec3283SAvi Kivity  */
5722ec3283SAvi Kivity qemu_irq *qemu_irq_proxy(qemu_irq **target, int n);
5822ec3283SAvi Kivity 
5920288345SPaolo Bonzini /* For internal use in qtest.  Similar to qemu_irq_split, but operating
6020288345SPaolo Bonzini    on an existing vector of qemu_irq.  */
6120288345SPaolo Bonzini void qemu_irq_intercept_in(qemu_irq *gpio_in, qemu_irq_handler handler, int n);
6220288345SPaolo Bonzini void qemu_irq_intercept_out(qemu_irq **gpio_out, qemu_irq_handler handler, int n);
6320288345SPaolo Bonzini 
6487ecb68bSpbrook #endif
65