2019-05-29 16:57:35 -07:00
/* SPDX-License-Identifier: GPL-2.0-only */
2007-07-06 12:20:49 +03:00
/*
* irq . h : in kernel interrupt controller related definitions
* Copyright ( c ) 2007 , Intel Corporation .
*
* 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 "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 ;
2021-07-20 05:28:15 +02:00
struct kvm_io_device dev_elcr ;
2012-07-19 13:55:53 +03:00
unsigned long irq_states [ PIC_NUM_PINS ] ;
2007-07-06 12:20:49 +03:00
} ;
2016-12-16 16:10:03 +01:00
int kvm_pic_init ( struct kvm * kvm ) ;
void kvm_pic_destroy ( 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
2015-07-29 23:21:40 -07:00
static inline int irqchip_split ( struct kvm * kvm )
{
2017-04-07 10:50:19 +02:00
int mode = kvm - > arch . irqchip_mode ;
/* Matches smp_wmb() when setting irqchip_mode */
smp_rmb ( ) ;
return mode = = KVM_IRQCHIP_SPLIT ;
2015-07-29 23:21:40 -07:00
}
2016-12-16 16:10:02 +01:00
static inline int irqchip_kernel ( struct kvm * kvm )
2007-12-11 20:36:00 +08:00
{
2017-04-07 10:50:19 +02:00
int mode = kvm - > arch . irqchip_mode ;
/* Matches smp_wmb() when setting irqchip_mode */
smp_rmb ( ) ;
return mode = = KVM_IRQCHIP_KERNEL ;
2016-12-16 16:10:02 +01:00
}
2015-07-29 23:21:40 -07:00
2020-05-21 05:57:49 +00:00
static inline int pic_in_kernel ( struct kvm * kvm )
{
return irqchip_kernel ( kvm ) ;
}
2016-12-16 16:10:02 +01:00
static inline int irqchip_in_kernel ( struct kvm * kvm )
{
2017-04-07 10:50:19 +02:00
int mode = kvm - > arch . irqchip_mode ;
2009-10-29 13:44:15 -02:00
2017-04-07 10:50:19 +02:00
/* Matches smp_wmb() when setting irqchip_mode */
2009-10-29 13:44:15 -02:00
smp_rmb ( ) ;
2017-04-28 17:06:20 +02:00
return mode ! = KVM_IRQCHIP_NONE ;
2007-12-11 20:36:00 +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 ) ;
2016-07-22 16:20:40 +00:00
int kvm_setup_default_irq_routing ( struct kvm * kvm ) ;
int kvm_setup_empty_irq_routing ( struct kvm * kvm ) ;
2019-12-04 20:07:17 +01:00
int kvm_irq_delivery_to_apic ( struct kvm * kvm , struct kvm_lapic * src ,
struct kvm_lapic_irq * irq ,
struct dest_map * dest_map ) ;
2016-07-22 16:20:40 +00:00
2007-07-06 12:20:49 +03:00
# endif