|
@@ -234,7 +234,7 @@ static void kvm_psci_system_reset(struct kvm_vcpu *vcpu)
|
|
|
int kvm_psci_version(struct kvm_vcpu *vcpu)
|
|
|
{
|
|
|
if (test_bit(KVM_ARM_VCPU_PSCI_0_2, vcpu->arch.features))
|
|
|
- return KVM_ARM_PSCI_0_2;
|
|
|
+ return KVM_ARM_PSCI_LATEST;
|
|
|
|
|
|
return KVM_ARM_PSCI_0_1;
|
|
|
}
|
|
@@ -313,6 +313,47 @@ static int kvm_psci_0_2_call(struct kvm_vcpu *vcpu)
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
+static int kvm_psci_1_0_call(struct kvm_vcpu *vcpu)
|
|
|
+{
|
|
|
+ u32 psci_fn = smccc_get_function(vcpu);
|
|
|
+ u32 feature;
|
|
|
+ unsigned long val;
|
|
|
+ int ret = 1;
|
|
|
+
|
|
|
+ switch(psci_fn) {
|
|
|
+ case PSCI_0_2_FN_PSCI_VERSION:
|
|
|
+ val = KVM_ARM_PSCI_1_0;
|
|
|
+ break;
|
|
|
+ case PSCI_1_0_FN_PSCI_FEATURES:
|
|
|
+ feature = smccc_get_arg1(vcpu);
|
|
|
+ switch(feature) {
|
|
|
+ case PSCI_0_2_FN_PSCI_VERSION:
|
|
|
+ case PSCI_0_2_FN_CPU_SUSPEND:
|
|
|
+ case PSCI_0_2_FN64_CPU_SUSPEND:
|
|
|
+ case PSCI_0_2_FN_CPU_OFF:
|
|
|
+ case PSCI_0_2_FN_CPU_ON:
|
|
|
+ case PSCI_0_2_FN64_CPU_ON:
|
|
|
+ case PSCI_0_2_FN_AFFINITY_INFO:
|
|
|
+ case PSCI_0_2_FN64_AFFINITY_INFO:
|
|
|
+ case PSCI_0_2_FN_MIGRATE_INFO_TYPE:
|
|
|
+ case PSCI_0_2_FN_SYSTEM_OFF:
|
|
|
+ case PSCI_0_2_FN_SYSTEM_RESET:
|
|
|
+ case PSCI_1_0_FN_PSCI_FEATURES:
|
|
|
+ val = 0;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ val = PSCI_RET_NOT_SUPPORTED;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ return kvm_psci_0_2_call(vcpu);
|
|
|
+ }
|
|
|
+
|
|
|
+ smccc_set_retval(vcpu, val, 0, 0, 0);
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
static int kvm_psci_0_1_call(struct kvm_vcpu *vcpu)
|
|
|
{
|
|
|
struct kvm *kvm = vcpu->kvm;
|
|
@@ -355,6 +396,8 @@ static int kvm_psci_0_1_call(struct kvm_vcpu *vcpu)
|
|
|
int kvm_psci_call(struct kvm_vcpu *vcpu)
|
|
|
{
|
|
|
switch (kvm_psci_version(vcpu)) {
|
|
|
+ case KVM_ARM_PSCI_1_0:
|
|
|
+ return kvm_psci_1_0_call(vcpu);
|
|
|
case KVM_ARM_PSCI_0_2:
|
|
|
return kvm_psci_0_2_call(vcpu);
|
|
|
case KVM_ARM_PSCI_0_1:
|