]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
RISC-V: KVM: Replace aia_set_hvictl() with aia_hvictl_value()
authorAnup Patel <apatel@ventanamicro.com>
Sun, 20 Oct 2024 19:47:26 +0000 (01:17 +0530)
committerAnup Patel <anup@brainfault.org>
Mon, 28 Oct 2024 11:13:50 +0000 (16:43 +0530)
The aia_set_hvictl() internally writes the HVICTL CSR which makes
it difficult to optimize the CSR write using SBI NACL extension for
kvm_riscv_vcpu_aia_update_hvip() function so replace aia_set_hvictl()
with new aia_hvictl_value() which only computes the HVICTL value.

Signed-off-by: Anup Patel <apatel@ventanamicro.com>
Reviewed-by: Atish Patra <atishp@rivosinc.com>
Link: https://lore.kernel.org/r/20241020194734.58686-6-apatel@ventanamicro.com
Signed-off-by: Anup Patel <anup@brainfault.org>
arch/riscv/kvm/aia.c

index 2967d305c442782f4f62b56adcef3bc06a0783ef..17ae4a7c0e948e544cc2884b19e38c80040f8df2 100644 (file)
@@ -51,7 +51,7 @@ static int aia_find_hgei(struct kvm_vcpu *owner)
        return hgei;
 }
 
-static void aia_set_hvictl(bool ext_irq_pending)
+static inline unsigned long aia_hvictl_value(bool ext_irq_pending)
 {
        unsigned long hvictl;
 
@@ -62,7 +62,7 @@ static void aia_set_hvictl(bool ext_irq_pending)
 
        hvictl = (IRQ_S_EXT << HVICTL_IID_SHIFT) & HVICTL_IID;
        hvictl |= ext_irq_pending;
-       csr_write(CSR_HVICTL, hvictl);
+       return hvictl;
 }
 
 #ifdef CONFIG_32BIT
@@ -130,7 +130,7 @@ void kvm_riscv_vcpu_aia_update_hvip(struct kvm_vcpu *vcpu)
 #ifdef CONFIG_32BIT
        csr_write(CSR_HVIPH, vcpu->arch.aia_context.guest_csr.hviph);
 #endif
-       aia_set_hvictl(!!(csr->hvip & BIT(IRQ_VS_EXT)));
+       csr_write(CSR_HVICTL, aia_hvictl_value(!!(csr->hvip & BIT(IRQ_VS_EXT))));
 }
 
 void kvm_riscv_vcpu_aia_load(struct kvm_vcpu *vcpu, int cpu)
@@ -536,7 +536,7 @@ void kvm_riscv_aia_enable(void)
        if (!kvm_riscv_aia_available())
                return;
 
-       aia_set_hvictl(false);
+       csr_write(CSR_HVICTL, aia_hvictl_value(false));
        csr_write(CSR_HVIPRIO1, 0x0);
        csr_write(CSR_HVIPRIO2, 0x0);
 #ifdef CONFIG_32BIT
@@ -572,7 +572,7 @@ void kvm_riscv_aia_disable(void)
        csr_clear(CSR_HIE, BIT(IRQ_S_GEXT));
        disable_percpu_irq(hgei_parent_irq);
 
-       aia_set_hvictl(false);
+       csr_write(CSR_HVICTL, aia_hvictl_value(false));
 
        raw_spin_lock_irqsave(&hgctrl->lock, flags);