2015-11-24 18:51:12 +03:00
/*
* Copyright ( C ) 2015 , 2016 ARM Ltd .
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation .
*
* This program is distributed in the hope that 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 , see < http : //www.gnu.org/licenses/>.
*/
# ifndef __KVM_ARM_VGIC_NEW_H__
# define __KVM_ARM_VGIC_NEW_H__
2016-04-26 13:06:47 +03:00
# define PRODUCT_ID_KVM 0x4b /* ASCII code K */
# define IMPLEMENTER_ARM 0x43b
2015-12-21 18:36:04 +03:00
# define VGIC_ADDR_UNDEF (-1)
# define IS_VGIC_ADDR_UNDEF(_x) ((_x) == VGIC_ADDR_UNDEF)
2016-01-27 17:54:30 +03:00
# define INTERRUPT_ID_BITS_SPIS 10
2015-12-01 17:34:02 +03:00
# define VGIC_PRI_BITS 5
2015-11-26 20:19:25 +03:00
# define vgic_irq_is_sgi(intid) ((intid) < VGIC_NR_SGIS)
2015-11-24 18:51:12 +03:00
struct vgic_irq * vgic_get_irq ( struct kvm * kvm , struct kvm_vcpu * vcpu ,
u32 intid ) ;
2015-11-25 21:02:16 +03:00
bool vgic_queue_irq_unlock ( struct kvm * kvm , struct vgic_irq * irq ) ;
2016-04-26 13:06:47 +03:00
void vgic_kick_vcpus ( struct kvm * kvm ) ;
2015-11-24 18:51:12 +03:00
2015-11-26 20:19:25 +03:00
void vgic_v2_process_maintenance ( struct kvm_vcpu * vcpu ) ;
void vgic_v2_fold_lr_state ( struct kvm_vcpu * vcpu ) ;
void vgic_v2_populate_lr ( struct kvm_vcpu * vcpu , struct vgic_irq * irq , int lr ) ;
void vgic_v2_clear_lr ( struct kvm_vcpu * vcpu , int lr ) ;
void vgic_v2_set_underflow ( struct kvm_vcpu * vcpu ) ;
2015-12-21 19:34:52 +03:00
int vgic_v2_has_attr_regs ( struct kvm_device * dev , struct kvm_device_attr * attr ) ;
2016-04-26 23:32:49 +03:00
int vgic_register_dist_iodev ( struct kvm * kvm , gpa_t dist_base_address ,
enum vgic_type ) ;
2015-11-26 20:19:25 +03:00
2015-11-30 16:09:53 +03:00
# ifdef CONFIG_KVM_ARM_VGIC_V3
void vgic_v3_process_maintenance ( struct kvm_vcpu * vcpu ) ;
void vgic_v3_fold_lr_state ( struct kvm_vcpu * vcpu ) ;
void vgic_v3_populate_lr ( struct kvm_vcpu * vcpu , struct vgic_irq * irq , int lr ) ;
void vgic_v3_clear_lr ( struct kvm_vcpu * vcpu , int lr ) ;
void vgic_v3_set_underflow ( struct kvm_vcpu * vcpu ) ;
2015-12-01 17:34:34 +03:00
int vgic_register_redist_iodevs ( struct kvm * kvm , gpa_t dist_base_address ) ;
2015-11-30 16:09:53 +03:00
# else
static inline void vgic_v3_process_maintenance ( struct kvm_vcpu * vcpu )
{
}
static inline void vgic_v3_fold_lr_state ( struct kvm_vcpu * vcpu )
{
}
static inline void vgic_v3_populate_lr ( struct kvm_vcpu * vcpu ,
struct vgic_irq * irq , int lr )
{
}
static inline void vgic_v3_clear_lr ( struct kvm_vcpu * vcpu , int lr )
{
}
static inline void vgic_v3_set_underflow ( struct kvm_vcpu * vcpu )
{
}
2015-12-01 17:34:34 +03:00
static inline int vgic_register_redist_iodevs ( struct kvm * kvm ,
gpa_t dist_base_address )
{
return - ENODEV ;
}
2015-11-30 16:09:53 +03:00
# endif
2015-11-30 16:01:58 +03:00
void kvm_register_vgic_device ( unsigned long type ) ;
2015-11-24 18:51:12 +03:00
# endif