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