Add LSX and LASX features when VM is created. These features are detected
firstly, enable it if it is available on host machine.

Signed-off-by: Bibo Mao <[email protected]>
---
 .../selftests/kvm/include/loongarch/processor.h      | 10 ++++++++++
 .../testing/selftests/kvm/lib/loongarch/processor.c  | 12 +++++++++++-
 2 files changed, 21 insertions(+), 1 deletion(-)

diff --git a/tools/testing/selftests/kvm/include/loongarch/processor.h 
b/tools/testing/selftests/kvm/include/loongarch/processor.h
index 93dc1fbd2e79..2324e311180f 100644
--- a/tools/testing/selftests/kvm/include/loongarch/processor.h
+++ b/tools/testing/selftests/kvm/include/loongarch/processor.h
@@ -131,6 +131,16 @@
 #define  CSR_TLBREHI_PS_SHIFT          0
 #define  CSR_TLBREHI_PS                        (0x3fUL << CSR_TLBREHI_PS_SHIFT)
 
+#define LOONGARCH_CPUCFG2              0x2
+#define  CPUCFG2_FP                    BIT(0)
+#define  CPUCFG2_FPSP                  BIT(1)
+#define  CPUCFG2_FPDP                  BIT(2)
+#define  CPUCFG2_FPVERS                        GENMASK(5, 3)
+#define  CPUCFG2_LSX                   BIT(6)
+#define  CPUCFG2_LASX                  BIT(7)
+#define  CPUCFG2_LLFTP                 BIT(14)
+#define  CPUCFG2_LLFTPREV              GENMASK(17, 15)
+
 #define read_cpucfg(reg)                       \
 ({                                             \
        register unsigned long __v;             \
diff --git a/tools/testing/selftests/kvm/lib/loongarch/processor.c 
b/tools/testing/selftests/kvm/lib/loongarch/processor.c
index 64d91fb76522..e7fb54d746f4 100644
--- a/tools/testing/selftests/kvm/lib/loongarch/processor.c
+++ b/tools/testing/selftests/kvm/lib/loongarch/processor.c
@@ -278,7 +278,7 @@ static void loongarch_set_csr(struct kvm_vcpu *vcpu, u64 
id, u64 val)
 
 void loongarch_vcpu_setup(struct kvm_vcpu *vcpu)
 {
-       int width;
+       int width, ret;
        unsigned int cfg;
        unsigned long val;
        struct kvm_vm *vm = vcpu->vm;
@@ -292,6 +292,16 @@ void loongarch_vcpu_setup(struct kvm_vcpu *vcpu)
                TEST_FAIL("Unknown guest mode, mode: 0x%x", vm->mode);
        }
 
+       /* Enable LSX/LASX feature by detecting host capability */
+       cfg = CPUCFG2_FP | CPUCFG2_FPSP | CPUCFG2_FPDP | CPUCFG2_LLFTP;
+       ret = __kvm_has_device_attr(vm->fd, KVM_LOONGARCH_VM_FEAT_CTRL, 
KVM_LOONGARCH_VM_FEAT_LSX);
+       if (!ret)
+               cfg |= CPUCFG2_LSX;
+
+       ret = __kvm_has_device_attr(vm->fd, KVM_LOONGARCH_VM_FEAT_CTRL, 
KVM_LOONGARCH_VM_FEAT_LASX);
+       if (!ret)
+               cfg |= CPUCFG2_LASX;
+       loongarch_set_cpucfg(vcpu, LOONGARCH_CPUCFG2, cfg);
        cfg = read_cpucfg(LOONGARCH_CPUCFG6);
        loongarch_set_cpucfg(vcpu, LOONGARCH_CPUCFG6, cfg);
 
-- 
2.39.3


Reply via email to