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