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_direct_msi_allowed;
|
||||
extern bool kvm_ioeventfd_any_length_allowed;
|
||||
extern bool kvm_msi_use_devid;
|
||||
|
||||
#if defined CONFIG_KVM || !defined NEED_CPU_H
|
||||
#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)
|
||||
|
||||
/**
|
||||
* 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
|
||||
#define kvm_enabled() (0)
|
||||
#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_direct_msi_enabled() (false)
|
||||
#define kvm_ioeventfd_any_length_enabled() (false)
|
||||
#define kvm_msi_devid_required() (false)
|
||||
#endif
|
||||
|
||||
struct kvm_run;
|
||||
|
@ -119,6 +119,7 @@ bool kvm_readonly_mem_allowed;
|
||||
bool kvm_vm_attributes_allowed;
|
||||
bool kvm_direct_msi_allowed;
|
||||
bool kvm_ioeventfd_any_length_allowed;
|
||||
bool kvm_msi_use_devid;
|
||||
|
||||
static const KVMCapabilityInfo kvm_required_capabilites[] = {
|
||||
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_hi = msg.address >> 32;
|
||||
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)) {
|
||||
kvm_irqchip_release_virq(s, virq);
|
||||
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_hi = msg.address >> 32;
|
||||
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)) {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
@ -31,6 +31,7 @@ bool kvm_gsi_direct_mapping;
|
||||
bool kvm_allowed;
|
||||
bool kvm_readonly_mem_allowed;
|
||||
bool kvm_ioeventfd_any_length_allowed;
|
||||
bool kvm_msi_use_devid;
|
||||
|
||||
int kvm_destroy_vcpu(CPUState *cpu)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user