{
unsigned long val;
+ if (cpu_has_lsx)
+ kvm->arch.kvm_features |= BIT(KVM_LOONGARCH_VM_FEAT_LSX);
+ if (cpu_has_lasx)
+ kvm->arch.kvm_features |= BIT(KVM_LOONGARCH_VM_FEAT_LASX);
+ if (cpu_has_lbt_x86)
+ kvm->arch.kvm_features |= BIT(KVM_LOONGARCH_VM_FEAT_X86BT);
+ if (cpu_has_lbt_arm)
+ kvm->arch.kvm_features |= BIT(KVM_LOONGARCH_VM_FEAT_ARMBT);
+ if (cpu_has_lbt_mips)
+ kvm->arch.kvm_features |= BIT(KVM_LOONGARCH_VM_FEAT_MIPSBT);
+ if (cpu_has_ptw)
+ kvm->arch.kvm_features |= BIT(KVM_LOONGARCH_VM_FEAT_PTW);
+ if (cpu_has_msgint)
+ kvm->arch.kvm_features |= BIT(KVM_LOONGARCH_VM_FEAT_MSGINT);
+
val = read_csr_gcfg();
if (val & CSR_GCFG_GPMP)
kvm->arch.kvm_features |= BIT(KVM_LOONGARCH_VM_FEAT_PMU);
{
switch (attr->attr) {
case KVM_LOONGARCH_VM_FEAT_LSX:
- if (cpu_has_lsx)
- return 0;
- return -ENXIO;
case KVM_LOONGARCH_VM_FEAT_LASX:
- if (cpu_has_lasx)
- return 0;
- return -ENXIO;
case KVM_LOONGARCH_VM_FEAT_X86BT:
- if (cpu_has_lbt_x86)
- return 0;
- return -ENXIO;
case KVM_LOONGARCH_VM_FEAT_ARMBT:
- if (cpu_has_lbt_arm)
- return 0;
- return -ENXIO;
case KVM_LOONGARCH_VM_FEAT_MIPSBT:
- if (cpu_has_lbt_mips)
- return 0;
- return -ENXIO;
case KVM_LOONGARCH_VM_FEAT_PTW:
- if (cpu_has_ptw)
- return 0;
- return -ENXIO;
case KVM_LOONGARCH_VM_FEAT_MSGINT:
- if (cpu_has_msgint)
- return 0;
- return -ENXIO;
case KVM_LOONGARCH_VM_FEAT_PMU:
case KVM_LOONGARCH_VM_FEAT_PV_IPI:
case KVM_LOONGARCH_VM_FEAT_PV_STEALTIME: