pbrook | 87ecb68 | 2007-11-17 17:14:51 +0000 | [diff] [blame] | 1 | #ifndef QEMU_IRQ_H |
| 2 | #define QEMU_IRQ_H |
| 3 | |
pbrook | d537cf6 | 2007-04-07 18:14:41 +0000 | [diff] [blame] | 4 | /* Generic IRQ/GPIO pin infrastructure. */ |
| 5 | |
Andreas Färber | 615c489 | 2014-06-18 00:57:08 -0700 | [diff] [blame] | 6 | #define TYPE_IRQ "irq" |
| 7 | |
pbrook | d537cf6 | 2007-04-07 18:14:41 +0000 | [diff] [blame] | 8 | void qemu_set_irq(qemu_irq irq, int level); |
| 9 | |
| 10 | static inline void qemu_irq_raise(qemu_irq irq) |
| 11 | { |
| 12 | qemu_set_irq(irq, 1); |
| 13 | } |
| 14 | |
| 15 | static inline void qemu_irq_lower(qemu_irq irq) |
| 16 | { |
| 17 | qemu_set_irq(irq, 0); |
| 18 | } |
| 19 | |
balrog | 106627d | 2007-12-05 03:23:39 +0000 | [diff] [blame] | 20 | static inline void qemu_irq_pulse(qemu_irq irq) |
| 21 | { |
| 22 | qemu_set_irq(irq, 1); |
| 23 | qemu_set_irq(irq, 0); |
| 24 | } |
| 25 | |
Peter A. G. Crosthwaite | 1e5b31e | 2012-07-31 12:24:06 +1000 | [diff] [blame] | 26 | /* Returns an array of N IRQs. Each IRQ is assigned the argument handler and |
| 27 | * opaque data. |
| 28 | */ |
pbrook | d537cf6 | 2007-04-07 18:14:41 +0000 | [diff] [blame] | 29 | qemu_irq *qemu_allocate_irqs(qemu_irq_handler handler, void *opaque, int n); |
Peter A. G. Crosthwaite | 1e5b31e | 2012-07-31 12:24:06 +1000 | [diff] [blame] | 30 | |
Marcel Apfelbaum | a8a9d30 | 2013-10-07 10:36:34 +0300 | [diff] [blame] | 31 | /* |
| 32 | * Allocates a single IRQ. The irq is assigned with a handler, an opaque |
| 33 | * data and the interrupt number. |
| 34 | */ |
| 35 | qemu_irq qemu_allocate_irq(qemu_irq_handler handler, void *opaque, int n); |
| 36 | |
Peter A. G. Crosthwaite | 1e5b31e | 2012-07-31 12:24:06 +1000 | [diff] [blame] | 37 | /* Extends an Array of IRQs. Old IRQs have their handlers and opaque data |
| 38 | * preserved. New IRQs are assigned the argument handler and opaque data. |
| 39 | */ |
| 40 | qemu_irq *qemu_extend_irqs(qemu_irq *old, int n_old, qemu_irq_handler handler, |
| 41 | void *opaque, int n); |
| 42 | |
Peter Crosthwaite | f173d57 | 2014-06-18 00:56:31 -0700 | [diff] [blame] | 43 | void qemu_free_irqs(qemu_irq *s, int n); |
Marcel Apfelbaum | a8a9d30 | 2013-10-07 10:36:34 +0300 | [diff] [blame] | 44 | void qemu_free_irq(qemu_irq irq); |
pbrook | d537cf6 | 2007-04-07 18:14:41 +0000 | [diff] [blame] | 45 | |
balrog | b50a656 | 2007-10-29 10:59:29 +0000 | [diff] [blame] | 46 | /* Returns a new IRQ with opposite polarity. */ |
| 47 | qemu_irq qemu_irq_invert(qemu_irq irq); |
pbrook | 87ecb68 | 2007-11-17 17:14:51 +0000 | [diff] [blame] | 48 | |
Paolo Bonzini | 2028834 | 2012-03-28 15:42:03 +0200 | [diff] [blame] | 49 | /* For internal use in qtest. Similar to qemu_irq_split, but operating |
| 50 | on an existing vector of qemu_irq. */ |
| 51 | void qemu_irq_intercept_in(qemu_irq *gpio_in, qemu_irq_handler handler, int n); |
Paolo Bonzini | 2028834 | 2012-03-28 15:42:03 +0200 | [diff] [blame] | 52 | |
Peter Maydell | faf7c6d | 2020-08-03 17:55:03 +0100 | [diff] [blame] | 53 | /** |
| 54 | * qemu_irq_is_connected: Return true if IRQ line is wired up |
| 55 | * |
| 56 | * If a qemu_irq has a device on the other (receiving) end of it, |
| 57 | * return true; otherwise return false. |
| 58 | * |
| 59 | * Usually device models don't need to care whether the machine model |
| 60 | * has wired up their outbound qemu_irq lines, because functions like |
| 61 | * qemu_set_irq() silently do nothing if there is nothing on the other |
| 62 | * end of the line. However occasionally a device model will want to |
| 63 | * provide default behaviour if its output is left floating, and |
| 64 | * it can use this function to identify when that is the case. |
| 65 | */ |
| 66 | static inline bool qemu_irq_is_connected(qemu_irq irq) |
| 67 | { |
| 68 | return irq != NULL; |
| 69 | } |
| 70 | |
pbrook | 87ecb68 | 2007-11-17 17:14:51 +0000 | [diff] [blame] | 71 | #endif |