OSDN Git Service

KVM: arm64: Bump guest PSCI version to 1.1
authorWill Deacon <will@kernel.org>
Mon, 21 Feb 2022 15:35:22 +0000 (15:35 +0000)
committerMarc Zyngier <maz@kernel.org>
Mon, 21 Feb 2022 16:02:55 +0000 (16:02 +0000)
Expose PSCI version v1.1 to the guest by default. The only difference
for now is that an updated version number is reported by PSCI_VERSION.

Cc: Marc Zyngier <maz@kernel.org>
Cc: James Morse <james.morse@arm.com>
Cc: Alexandru Elisei <alexandru.elisei@arm.com>
Cc: Suzuki K Poulose <suzuki.poulose@arm.com>
Signed-off-by: Will Deacon <will@kernel.org>
Signed-off-by: Marc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/20220221153524.15397-2-will@kernel.org
arch/arm64/kvm/psci.c
include/kvm/arm_psci.h

index 3eae328..70d0747 100644 (file)
@@ -305,16 +305,19 @@ out:
        return ret;
 }
 
-static int kvm_psci_1_0_call(struct kvm_vcpu *vcpu)
+static int kvm_psci_1_x_call(struct kvm_vcpu *vcpu, u32 minor)
 {
        u32 psci_fn = smccc_get_function(vcpu);
        u32 feature;
        unsigned long val;
        int ret = 1;
 
+       if (minor > 1)
+               return -EINVAL;
+
        switch(psci_fn) {
        case PSCI_0_2_FN_PSCI_VERSION:
-               val = KVM_ARM_PSCI_1_0;
+               val = minor == 0 ? KVM_ARM_PSCI_1_0 : KVM_ARM_PSCI_1_1;
                break;
        case PSCI_1_0_FN_PSCI_FEATURES:
                feature = smccc_get_arg1(vcpu);
@@ -393,8 +396,10 @@ static int kvm_psci_0_1_call(struct kvm_vcpu *vcpu)
 int kvm_psci_call(struct kvm_vcpu *vcpu)
 {
        switch (kvm_psci_version(vcpu, vcpu->kvm)) {
+       case KVM_ARM_PSCI_1_1:
+               return kvm_psci_1_x_call(vcpu, 1);
        case KVM_ARM_PSCI_1_0:
-               return kvm_psci_1_0_call(vcpu);
+               return kvm_psci_1_x_call(vcpu, 0);
        case KVM_ARM_PSCI_0_2:
                return kvm_psci_0_2_call(vcpu);
        case KVM_ARM_PSCI_0_1:
@@ -511,6 +516,7 @@ int kvm_arm_set_fw_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg)
                        return 0;
                case KVM_ARM_PSCI_0_2:
                case KVM_ARM_PSCI_1_0:
+               case KVM_ARM_PSCI_1_1:
                        if (!wants_02)
                                return -EINVAL;
                        vcpu->kvm->arch.psci_version = val;
index 5b58bd2..4a10033 100644 (file)
@@ -13,8 +13,9 @@
 #define KVM_ARM_PSCI_0_1       PSCI_VERSION(0, 1)
 #define KVM_ARM_PSCI_0_2       PSCI_VERSION(0, 2)
 #define KVM_ARM_PSCI_1_0       PSCI_VERSION(1, 0)
+#define KVM_ARM_PSCI_1_1       PSCI_VERSION(1, 1)
 
-#define KVM_ARM_PSCI_LATEST    KVM_ARM_PSCI_1_0
+#define KVM_ARM_PSCI_LATEST    KVM_ARM_PSCI_1_1
 
 /*
  * We need the KVM pointer independently from the vcpu as we can call