kvm-all: Pass requester ID to MSI routing functions
Introduce global kvm_msi_use_devid flag plus associated kvm_msi_devid_required() macro. Passes the device ID, if needed, while building the MSI route entry. Device IDs are required by the ARM GICv3 ITS (IRQ remapping function is based on this information). Signed-off-by: Pavel Fedin <p.fedin@samsung.com> Signed-off-by: Eric Auger <eric.auger@redhat.com> Message-id: 1474616617-366-5-git-send-email-eric.auger@redhat.com Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
1b20616f26
commit
767a554a0c
|
@ -53,6 +53,7 @@ extern bool kvm_gsi_direct_mapping;
|
||||||
extern bool kvm_readonly_mem_allowed;
|
extern bool kvm_readonly_mem_allowed;
|
||||||
extern bool kvm_direct_msi_allowed;
|
extern bool kvm_direct_msi_allowed;
|
||||||
extern bool kvm_ioeventfd_any_length_allowed;
|
extern bool kvm_ioeventfd_any_length_allowed;
|
||||||
|
extern bool kvm_msi_use_devid;
|
||||||
|
|
||||||
#if defined CONFIG_KVM || !defined NEED_CPU_H
|
#if defined CONFIG_KVM || !defined NEED_CPU_H
|
||||||
#define kvm_enabled() (kvm_allowed)
|
#define kvm_enabled() (kvm_allowed)
|
||||||
|
@ -169,6 +170,13 @@ extern bool kvm_ioeventfd_any_length_allowed;
|
||||||
*/
|
*/
|
||||||
#define kvm_ioeventfd_any_length_enabled() (kvm_ioeventfd_any_length_allowed)
|
#define kvm_ioeventfd_any_length_enabled() (kvm_ioeventfd_any_length_allowed)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* kvm_msi_devid_required:
|
||||||
|
* Returns: true if KVM requires a device id to be provided while
|
||||||
|
* defining an MSI routing entry.
|
||||||
|
*/
|
||||||
|
#define kvm_msi_devid_required() (kvm_msi_use_devid)
|
||||||
|
|
||||||
#else
|
#else
|
||||||
#define kvm_enabled() (0)
|
#define kvm_enabled() (0)
|
||||||
#define kvm_irqchip_in_kernel() (false)
|
#define kvm_irqchip_in_kernel() (false)
|
||||||
|
@ -184,6 +192,7 @@ extern bool kvm_ioeventfd_any_length_allowed;
|
||||||
#define kvm_readonly_mem_enabled() (false)
|
#define kvm_readonly_mem_enabled() (false)
|
||||||
#define kvm_direct_msi_enabled() (false)
|
#define kvm_direct_msi_enabled() (false)
|
||||||
#define kvm_ioeventfd_any_length_enabled() (false)
|
#define kvm_ioeventfd_any_length_enabled() (false)
|
||||||
|
#define kvm_msi_devid_required() (false)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
struct kvm_run;
|
struct kvm_run;
|
||||||
|
|
|
@ -119,6 +119,7 @@ bool kvm_readonly_mem_allowed;
|
||||||
bool kvm_vm_attributes_allowed;
|
bool kvm_vm_attributes_allowed;
|
||||||
bool kvm_direct_msi_allowed;
|
bool kvm_direct_msi_allowed;
|
||||||
bool kvm_ioeventfd_any_length_allowed;
|
bool kvm_ioeventfd_any_length_allowed;
|
||||||
|
bool kvm_msi_use_devid;
|
||||||
|
|
||||||
static const KVMCapabilityInfo kvm_required_capabilites[] = {
|
static const KVMCapabilityInfo kvm_required_capabilites[] = {
|
||||||
KVM_CAP_INFO(USER_MEMORY),
|
KVM_CAP_INFO(USER_MEMORY),
|
||||||
|
@ -1275,6 +1276,10 @@ int kvm_irqchip_add_msi_route(KVMState *s, int vector, PCIDevice *dev)
|
||||||
kroute.u.msi.address_lo = (uint32_t)msg.address;
|
kroute.u.msi.address_lo = (uint32_t)msg.address;
|
||||||
kroute.u.msi.address_hi = msg.address >> 32;
|
kroute.u.msi.address_hi = msg.address >> 32;
|
||||||
kroute.u.msi.data = le32_to_cpu(msg.data);
|
kroute.u.msi.data = le32_to_cpu(msg.data);
|
||||||
|
if (kvm_msi_devid_required()) {
|
||||||
|
kroute.flags = KVM_MSI_VALID_DEVID;
|
||||||
|
kroute.u.msi.devid = pci_requester_id(dev);
|
||||||
|
}
|
||||||
if (kvm_arch_fixup_msi_route(&kroute, msg.address, msg.data, dev)) {
|
if (kvm_arch_fixup_msi_route(&kroute, msg.address, msg.data, dev)) {
|
||||||
kvm_irqchip_release_virq(s, virq);
|
kvm_irqchip_release_virq(s, virq);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
@ -1308,6 +1313,10 @@ int kvm_irqchip_update_msi_route(KVMState *s, int virq, MSIMessage msg,
|
||||||
kroute.u.msi.address_lo = (uint32_t)msg.address;
|
kroute.u.msi.address_lo = (uint32_t)msg.address;
|
||||||
kroute.u.msi.address_hi = msg.address >> 32;
|
kroute.u.msi.address_hi = msg.address >> 32;
|
||||||
kroute.u.msi.data = le32_to_cpu(msg.data);
|
kroute.u.msi.data = le32_to_cpu(msg.data);
|
||||||
|
if (kvm_msi_devid_required()) {
|
||||||
|
kroute.flags = KVM_MSI_VALID_DEVID;
|
||||||
|
kroute.u.msi.devid = pci_requester_id(dev);
|
||||||
|
}
|
||||||
if (kvm_arch_fixup_msi_route(&kroute, msg.address, msg.data, dev)) {
|
if (kvm_arch_fixup_msi_route(&kroute, msg.address, msg.data, dev)) {
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,6 +31,7 @@ bool kvm_gsi_direct_mapping;
|
||||||
bool kvm_allowed;
|
bool kvm_allowed;
|
||||||
bool kvm_readonly_mem_allowed;
|
bool kvm_readonly_mem_allowed;
|
||||||
bool kvm_ioeventfd_any_length_allowed;
|
bool kvm_ioeventfd_any_length_allowed;
|
||||||
|
bool kvm_msi_use_devid;
|
||||||
|
|
||||||
int kvm_destroy_vcpu(CPUState *cpu)
|
int kvm_destroy_vcpu(CPUState *cpu)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue