xref: /openbmc/qemu/include/hw/irq.h (revision 764a6ee9)
1 #ifndef QEMU_IRQ_H
2 #define QEMU_IRQ_H
3 
4 #include "qom/object.h"
5 
6 /* Generic IRQ/GPIO pin infrastructure.  */
7 
8 #define TYPE_IRQ "irq"
9 OBJECT_DECLARE_SIMPLE_TYPE(IRQState, IRQ)
10 
11 struct IRQState {
12     Object parent_obj;
13 
14     qemu_irq_handler handler;
15     void *opaque;
16     int n;
17 };
18 
19 void qemu_set_irq(qemu_irq irq, int level);
20 
21 static inline void qemu_irq_raise(qemu_irq irq)
22 {
23     qemu_set_irq(irq, 1);
24 }
25 
26 static inline void qemu_irq_lower(qemu_irq irq)
27 {
28     qemu_set_irq(irq, 0);
29 }
30 
31 static inline void qemu_irq_pulse(qemu_irq irq)
32 {
33     qemu_set_irq(irq, 1);
34     qemu_set_irq(irq, 0);
35 }
36 
37 /*
38  * Init a single IRQ. The irq is assigned with a handler, an opaque data
39  * and the interrupt number.
40  */
41 void qemu_init_irq(IRQState *irq, qemu_irq_handler handler, void *opaque,
42                    int n);
43 
44 /* Returns an array of N IRQs. Each IRQ is assigned the argument handler and
45  * opaque data.
46  */
47 qemu_irq *qemu_allocate_irqs(qemu_irq_handler handler, void *opaque, int n);
48 
49 /*
50  * Allocates a single IRQ. The irq is assigned with a handler, an opaque
51  * data and the interrupt number.
52  */
53 qemu_irq qemu_allocate_irq(qemu_irq_handler handler, void *opaque, int n);
54 
55 /* Extends an Array of IRQs. Old IRQs have their handlers and opaque data
56  * preserved. New IRQs are assigned the argument handler and opaque data.
57  */
58 qemu_irq *qemu_extend_irqs(qemu_irq *old, int n_old, qemu_irq_handler handler,
59                                 void *opaque, int n);
60 
61 void qemu_free_irqs(qemu_irq *s, int n);
62 void qemu_free_irq(qemu_irq irq);
63 
64 /* Returns a new IRQ with opposite polarity.  */
65 qemu_irq qemu_irq_invert(qemu_irq irq);
66 
67 /* For internal use in qtest.  Similar to qemu_irq_split, but operating
68    on an existing vector of qemu_irq.  */
69 void qemu_irq_intercept_in(qemu_irq *gpio_in, qemu_irq_handler handler, int n);
70 
71 /**
72  * qemu_irq_is_connected: Return true if IRQ line is wired up
73  *
74  * If a qemu_irq has a device on the other (receiving) end of it,
75  * return true; otherwise return false.
76  *
77  * Usually device models don't need to care whether the machine model
78  * has wired up their outbound qemu_irq lines, because functions like
79  * qemu_set_irq() silently do nothing if there is nothing on the other
80  * end of the line. However occasionally a device model will want to
81  * provide default behaviour if its output is left floating, and
82  * it can use this function to identify when that is the case.
83  */
84 static inline bool qemu_irq_is_connected(qemu_irq irq)
85 {
86     return irq != NULL;
87 }
88 
89 #endif
90