mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-26 10:05:18 +07:00
7a1ff70828
By now ITS code guarded with KVM_ARM_VGIC_V3 config option which was introduced to hide everything specific to vgic-v3 from 32-bit world. We are going to support vgic-v3 in 32-bit world and KVM_ARM_VGIC_V3 will gone, but we don't have support for ITS there yet and we need to continue keeping ITS away. Introduce the new config option to prevent ITS code being build in 32-bit mode when support for vgic-v3 is done. Signed-off-by: Vladimir Murzin <vladimir.murzin@arm.com> Acked-by: Marc Zyngier <marc.zyngier@arm.com> Signed-off-by: Christoffer Dall <christoffer.dall@linaro.org>
178 lines
4.8 KiB
C
178 lines
4.8 KiB
C
/*
|
|
* 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__
|
|
|
|
#include <linux/irqchip/arm-gic-common.h>
|
|
|
|
#define PRODUCT_ID_KVM 0x4b /* ASCII code K */
|
|
#define IMPLEMENTER_ARM 0x43b
|
|
|
|
#define VGIC_ADDR_UNDEF (-1)
|
|
#define IS_VGIC_ADDR_UNDEF(_x) ((_x) == VGIC_ADDR_UNDEF)
|
|
|
|
#define INTERRUPT_ID_BITS_SPIS 10
|
|
#define INTERRUPT_ID_BITS_ITS 16
|
|
#define VGIC_PRI_BITS 5
|
|
|
|
#define vgic_irq_is_sgi(intid) ((intid) < VGIC_NR_SGIS)
|
|
|
|
struct vgic_vmcr {
|
|
u32 ctlr;
|
|
u32 abpr;
|
|
u32 bpr;
|
|
u32 pmr;
|
|
};
|
|
|
|
struct vgic_irq *vgic_get_irq(struct kvm *kvm, struct kvm_vcpu *vcpu,
|
|
u32 intid);
|
|
void vgic_put_irq(struct kvm *kvm, struct vgic_irq *irq);
|
|
bool vgic_queue_irq_unlock(struct kvm *kvm, struct vgic_irq *irq);
|
|
void vgic_kick_vcpus(struct kvm *kvm);
|
|
|
|
int vgic_check_ioaddr(struct kvm *kvm, phys_addr_t *ioaddr,
|
|
phys_addr_t addr, phys_addr_t alignment);
|
|
|
|
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);
|
|
int vgic_v2_has_attr_regs(struct kvm_device *dev, struct kvm_device_attr *attr);
|
|
int vgic_v2_dist_uaccess(struct kvm_vcpu *vcpu, bool is_write,
|
|
int offset, u32 *val);
|
|
int vgic_v2_cpuif_uaccess(struct kvm_vcpu *vcpu, bool is_write,
|
|
int offset, u32 *val);
|
|
void vgic_v2_set_vmcr(struct kvm_vcpu *vcpu, struct vgic_vmcr *vmcr);
|
|
void vgic_v2_get_vmcr(struct kvm_vcpu *vcpu, struct vgic_vmcr *vmcr);
|
|
void vgic_v2_enable(struct kvm_vcpu *vcpu);
|
|
int vgic_v2_probe(const struct gic_kvm_info *info);
|
|
int vgic_v2_map_resources(struct kvm *kvm);
|
|
int vgic_register_dist_iodev(struct kvm *kvm, gpa_t dist_base_address,
|
|
enum vgic_type);
|
|
|
|
static inline void vgic_get_irq_kref(struct vgic_irq *irq)
|
|
{
|
|
if (irq->intid < VGIC_MIN_LPI)
|
|
return;
|
|
|
|
kref_get(&irq->refcount);
|
|
}
|
|
|
|
#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);
|
|
void vgic_v3_set_vmcr(struct kvm_vcpu *vcpu, struct vgic_vmcr *vmcr);
|
|
void vgic_v3_get_vmcr(struct kvm_vcpu *vcpu, struct vgic_vmcr *vmcr);
|
|
void vgic_v3_enable(struct kvm_vcpu *vcpu);
|
|
int vgic_v3_probe(const struct gic_kvm_info *info);
|
|
int vgic_v3_map_resources(struct kvm *kvm);
|
|
int vgic_register_redist_iodevs(struct kvm *kvm, gpa_t dist_base_address);
|
|
|
|
#ifdef CONFIG_KVM_ARM_VGIC_V3_ITS
|
|
int vgic_register_its_iodevs(struct kvm *kvm);
|
|
bool vgic_has_its(struct kvm *kvm);
|
|
int kvm_vgic_register_its_device(void);
|
|
void vgic_enable_lpis(struct kvm_vcpu *vcpu);
|
|
int vgic_its_inject_msi(struct kvm *kvm, struct kvm_msi *msi);
|
|
#endif
|
|
|
|
#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)
|
|
{
|
|
}
|
|
|
|
static inline
|
|
void vgic_v3_set_vmcr(struct kvm_vcpu *vcpu, struct vgic_vmcr *vmcr)
|
|
{
|
|
}
|
|
|
|
static inline
|
|
void vgic_v3_get_vmcr(struct kvm_vcpu *vcpu, struct vgic_vmcr *vmcr)
|
|
{
|
|
}
|
|
|
|
static inline void vgic_v3_enable(struct kvm_vcpu *vcpu)
|
|
{
|
|
}
|
|
|
|
static inline int vgic_v3_probe(const struct gic_kvm_info *info)
|
|
{
|
|
return -ENODEV;
|
|
}
|
|
|
|
static inline int vgic_v3_map_resources(struct kvm *kvm)
|
|
{
|
|
return -ENODEV;
|
|
}
|
|
|
|
static inline int vgic_register_redist_iodevs(struct kvm *kvm,
|
|
gpa_t dist_base_address)
|
|
{
|
|
return -ENODEV;
|
|
}
|
|
|
|
static inline int vgic_register_its_iodevs(struct kvm *kvm)
|
|
{
|
|
return -ENODEV;
|
|
}
|
|
|
|
static inline bool vgic_has_its(struct kvm *kvm)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
static inline int kvm_vgic_register_its_device(void)
|
|
{
|
|
return -ENODEV;
|
|
}
|
|
|
|
static inline void vgic_enable_lpis(struct kvm_vcpu *vcpu)
|
|
{
|
|
}
|
|
|
|
static inline int vgic_its_inject_msi(struct kvm *kvm, struct kvm_msi *msi)
|
|
{
|
|
return -ENODEV;
|
|
}
|
|
#endif
|
|
|
|
int kvm_register_vgic_device(unsigned long type);
|
|
int vgic_lazy_init(struct kvm *kvm);
|
|
int vgic_init(struct kvm *kvm);
|
|
|
|
#endif
|