2007-07-06 12:20:49 +03:00
/*
* irq . h : in kernel interrupt controller related definitions
* Copyright ( c ) 2007 , Intel Corporation .
*
* This program is free software ; you can redistribute it and / or modify it
* under the terms and conditions of the GNU General Public License ,
* version 2 , as published by the Free Software Foundation .
*
* This program is distributed in the hope it will be useful , but WITHOUT
* ANY WARRANTY ; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE . See the GNU General Public License for
* more details .
*
* You should have received a copy of the GNU General Public License along with
* this program ; if not , write to the Free Software Foundation , Inc . , 59 Temple
* Place - Suite 330 , Boston , MA 02111 - 1307 USA .
* Authors :
* Yaozu ( Eddie ) Dong < Eddie . dong @ intel . com >
*
*/
# ifndef __IRQ_H
# define __IRQ_H
2007-12-03 15:30:25 -06:00
# include <linux/mm_types.h>
# include <linux/hrtimer.h>
2007-12-16 11:02:48 +02:00
# include <linux/kvm_host.h>
2008-12-21 22:48:32 +02:00
# include <linux/spinlock.h>
2007-12-17 13:59:56 +08:00
2015-03-26 14:39:29 +00:00
# include <kvm/iodev.h>
2007-12-17 13:59:56 +08:00
# include "ioapic.h"
# include "lapic.h"
2007-07-06 12:20:49 +03:00
2008-07-06 17:15:07 +03:00
# define PIC_NUM_PINS 16
2009-01-27 15:12:38 -02:00
# define SELECT_PIC(irq) \
( ( irq ) < 8 ? KVM_IRQCHIP_PIC_MASTER : KVM_IRQCHIP_PIC_SLAVE )
2008-07-06 17:15:07 +03:00
2007-12-03 15:30:25 -06:00
struct kvm ;
struct kvm_vcpu ;
2007-07-06 12:20:49 +03:00
struct kvm_kpic_state {
u8 last_irr ; /* edge detection */
u8 irr ; /* interrupt request register */
u8 imr ; /* interrupt mask register */
u8 isr ; /* interrupt service register */
u8 priority_add ; /* highest irq priority */
u8 irq_base ;
u8 read_reg_select ;
u8 poll ;
u8 special_mask ;
u8 init_state ;
u8 auto_eoi ;
u8 rotate_on_auto_eoi ;
u8 special_fully_nested_mode ;
u8 init4 ; /* true if 4 byte init */
u8 elcr ; /* PIIX edge/trigger selection */
u8 elcr_mask ;
2010-08-30 12:49:13 +03:00
u8 isr_ack ; /* interrupt ack detection */
2007-07-06 12:20:49 +03:00
struct kvm_pic * pics_state ;
} ;
struct kvm_pic {
2010-09-19 18:44:07 +02:00
spinlock_t lock ;
2010-02-24 10:41:58 +01:00
bool wakeup_needed ;
2008-12-21 22:48:32 +02:00
unsigned pending_acks ;
struct kvm * kvm ;
2007-07-06 12:20:49 +03:00
struct kvm_kpic_state pics [ 2 ] ; /* 0 is master pic, 1 is slave pic */
int output ; /* intr from master PIC */
2011-07-27 16:00:48 +03:00
struct kvm_io_device dev_master ;
struct kvm_io_device dev_slave ;
struct kvm_io_device dev_eclr ;
2008-07-26 17:01:00 -03:00
void ( * ack_notifier ) ( void * opaque , int irq ) ;
2012-07-19 13:55:53 +03:00
unsigned long irq_states [ PIC_NUM_PINS ] ;
2007-07-06 12:20:49 +03:00
} ;
struct kvm_pic * kvm_create_pic ( struct kvm * kvm ) ;
2010-02-09 10:33:03 +08:00
void kvm_destroy_pic ( struct kvm * kvm ) ;
2008-07-26 17:01:00 -03:00
int kvm_pic_read_irq ( struct kvm * kvm ) ;
2007-07-26 11:05:18 +03:00
void kvm_pic_update_irq ( struct kvm_pic * s ) ;
2007-07-06 12:20:49 +03:00
2007-12-11 20:36:00 +08:00
static inline struct kvm_pic * pic_irqchip ( struct kvm * kvm )
{
2007-12-14 10:17:34 +08:00
return kvm - > arch . vpic ;
2007-12-11 20:36:00 +08:00
}
static inline int irqchip_in_kernel ( struct kvm * kvm )
{
2009-10-29 13:44:15 -02:00
int ret ;
ret = ( pic_irqchip ( kvm ) ! = NULL ) ;
smp_rmb ( ) ;
return ret ;
2007-12-11 20:36:00 +08:00
}
2007-10-10 12:14:25 +02:00
void kvm_pic_reset ( struct kvm_kpic_state * s ) ;
2007-12-02 22:35:57 +08:00
2007-09-03 16:56:58 +03:00
void kvm_inject_pending_timer_irqs ( struct kvm_vcpu * vcpu ) ;
void kvm_inject_apic_timer_irqs ( struct kvm_vcpu * vcpu ) ;
2008-10-20 10:20:02 +02:00
void kvm_apic_nmi_wd_deliver ( struct kvm_vcpu * vcpu ) ;
2008-01-16 12:49:30 +02:00
void __kvm_migrate_apic_timer ( struct kvm_vcpu * vcpu ) ;
2008-05-27 12:10:20 -03:00
void __kvm_migrate_pit_timer ( struct kvm_vcpu * vcpu ) ;
void __kvm_migrate_timers ( struct kvm_vcpu * vcpu ) ;
2007-09-12 10:58:04 +03:00
2008-04-11 14:53:26 -03:00
int apic_has_pending_timer ( struct kvm_vcpu * vcpu ) ;
2007-07-06 12:20:49 +03:00
# endif