diff options
Diffstat (limited to 'include/linux/kvm_host.h')
| -rw-r--r-- | include/linux/kvm_host.h | 53 | 
1 files changed, 48 insertions, 5 deletions
diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index b7bbb5ddd7a..bd5a616d937 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -120,7 +120,7 @@ struct kvm_kernel_irq_routing_entry {  	u32 gsi;  	u32 type;  	int (*set)(struct kvm_kernel_irq_routing_entry *e, -		    struct kvm *kvm, int level); +		   struct kvm *kvm, int irq_source_id, int level);  	union {  		struct {  			unsigned irqchip; @@ -128,9 +128,28 @@ struct kvm_kernel_irq_routing_entry {  		} irqchip;  		struct msi_msg msi;  	}; -	struct list_head link; +	struct hlist_node link; +}; + +#ifdef __KVM_HAVE_IOAPIC + +struct kvm_irq_routing_table { +	int chip[KVM_NR_IRQCHIPS][KVM_IOAPIC_NUM_PINS]; +	struct kvm_kernel_irq_routing_entry *rt_entries; +	u32 nr_rt_entries; +	/* +	 * Array indexed by gsi. Each entry contains list of irq chips +	 * the gsi is connected to. +	 */ +	struct hlist_head map[0];  }; +#else + +struct kvm_irq_routing_table {}; + +#endif +  struct kvm {  	spinlock_t mmu_lock;  	spinlock_t requests_lock; @@ -166,8 +185,9 @@ struct kvm {  	struct mutex irq_lock;  #ifdef CONFIG_HAVE_KVM_IRQCHIP -	struct list_head irq_routing; /* of kvm_kernel_irq_routing_entry */ +	struct kvm_irq_routing_table *irq_routing;  	struct hlist_head mask_notifier_list; +	struct hlist_head irq_ack_notifier_list;  #endif  #ifdef KVM_ARCH_WANT_MMU_NOTIFIER @@ -266,6 +286,7 @@ int kvm_is_visible_gfn(struct kvm *kvm, gfn_t gfn);  void mark_page_dirty(struct kvm *kvm, gfn_t gfn);  void kvm_vcpu_block(struct kvm_vcpu *vcpu); +void kvm_vcpu_on_spin(struct kvm_vcpu *vcpu);  void kvm_resched(struct kvm_vcpu *vcpu);  void kvm_load_guest_fpu(struct kvm_vcpu *vcpu);  void kvm_put_guest_fpu(struct kvm_vcpu *vcpu); @@ -325,7 +346,7 @@ int kvm_arch_vcpu_setup(struct kvm_vcpu *vcpu);  void kvm_arch_vcpu_destroy(struct kvm_vcpu *vcpu);  int kvm_arch_vcpu_reset(struct kvm_vcpu *vcpu); -void kvm_arch_hardware_enable(void *garbage); +int kvm_arch_hardware_enable(void *garbage);  void kvm_arch_hardware_disable(void *garbage);  int kvm_arch_hardware_setup(void);  void kvm_arch_hardware_unsetup(void); @@ -390,7 +411,12 @@ void kvm_unregister_irq_mask_notifier(struct kvm *kvm, int irq,  				      struct kvm_irq_mask_notifier *kimn);  void kvm_fire_mask_notifiers(struct kvm *kvm, int irq, bool mask); -int kvm_set_irq(struct kvm *kvm, int irq_source_id, int irq, int level); +#ifdef __KVM_HAVE_IOAPIC +void kvm_get_intr_delivery_bitmask(struct kvm_ioapic *ioapic, +				   union kvm_ioapic_redirect_entry *entry, +				   unsigned long *deliver_bitmask); +#endif +int kvm_set_irq(struct kvm *kvm, int irq_source_id, u32 irq, int level);  void kvm_notify_acked_irq(struct kvm *kvm, unsigned irqchip, unsigned pin);  void kvm_register_irq_ack_notifier(struct kvm *kvm,  				   struct kvm_irq_ack_notifier *kian); @@ -552,4 +578,21 @@ static inline bool kvm_vcpu_is_bsp(struct kvm_vcpu *vcpu)  	return vcpu->kvm->bsp_vcpu_id == vcpu->vcpu_id;  }  #endif + +#ifdef __KVM_HAVE_DEVICE_ASSIGNMENT + +long kvm_vm_ioctl_assigned_device(struct kvm *kvm, unsigned ioctl, +				  unsigned long arg); + +#else + +static inline long kvm_vm_ioctl_assigned_device(struct kvm *kvm, unsigned ioctl, +						unsigned long arg) +{ +	return -ENOTTY; +} +  #endif + +#endif +  |