From: Fangyu Yu According to the RISC-V IOMMU Spec, an IOMMU may optionally support memory-resident interrupt files (MRIFs). When the guest interrupt files are used up, we transfer the physical address of MRIF to iommu-ir, and enable MRIF mode if the iommu-ir supports. Signed-off-by: Fangyu Yu --- arch/riscv/kvm/aia_imsic.c | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/arch/riscv/kvm/aia_imsic.c b/arch/riscv/kvm/aia_imsic.c index 8f5703d9112a..e91164742fd0 100644 --- a/arch/riscv/kvm/aia_imsic.c +++ b/arch/riscv/kvm/aia_imsic.c @@ -21,6 +21,8 @@ #define IMSIC_MAX_EIX (IMSIC_MAX_ID / BITS_PER_TYPE(u64)) +static int kvm_riscv_vcpu_irq_update(struct kvm_vcpu *vcpu); + struct imsic_mrif_eix { unsigned long eip[BITS_PER_TYPE(u64) / BITS_PER_LONG]; unsigned long eie[BITS_PER_TYPE(u64) / BITS_PER_LONG]; @@ -717,7 +719,8 @@ void kvm_riscv_vcpu_aia_imsic_release(struct kvm_vcpu *vcpu) vcpu->arch.aia_context.imsic_addr, IMSIC_MMIO_PAGE_SZ); - /* TODO: Purge the IOMMU mapping ??? */ + /* Update the IOMMU mapping */ + kvm_riscv_vcpu_irq_update(vcpu); /* * At this point, all interrupt producers have been re-directed @@ -795,13 +798,14 @@ int kvm_arch_update_irqfd_routing(struct kvm *kvm, unsigned int host_irq, read_lock_irqsave(&imsic->vsfile_lock, flags); - if (WARN_ON_ONCE(imsic->vsfile_cpu < 0)) { - read_unlock_irqrestore(&imsic->vsfile_lock, flags); - goto out; + if (imsic->vsfile_cpu < 0) { + vcpu_info.hpa = imsic->swfile_pa; + vcpu_info.mrif = true; + } else { + vcpu_info.hpa = imsic->vsfile_pa; + vcpu_info.mrif = false; } - vcpu_info.hpa = imsic->vsfile_pa; - ret = irq_set_vcpu_affinity(host_irq, &vcpu_info); if (ret) { read_unlock_irqrestore(&imsic->vsfile_lock, flags); @@ -844,6 +848,13 @@ static int kvm_riscv_vcpu_irq_update(struct kvm_vcpu *vcpu) if (!irqfd->producer) continue; host_irq = irqfd->producer->irq; + + if (imsic->vsfile_cpu < 0) { + vcpu_info.hpa = imsic->swfile_pa; + vcpu_info.mrif = true; + } else { + vcpu_info.mrif = false; + } ret = irq_set_vcpu_affinity(host_irq, &vcpu_info); if (ret) { spin_unlock_irq(&kvm->irqfds.lock); -- 2.49.0