On Thu, Feb 01, 2018 at 11:46:46AM +0000, Marc Zyngier wrote: > PSCI 1.0 can be trivially implemented by having PSCI 0.2 and > the FEATURES call. Of, and returning 1.0 as the PSCI version. Of? (Oh ?) > > We happily ignore everything else, as it is optional. nit: Might be worth mentioning that there are other changes between v0.2 but they are clarifications or relaxations and therefore don't require additional changes. Reviewed-by: Christoffer Dall <christoffer.dall@xxxxxxxxxx> > > Signed-off-by: Marc Zyngier <marc.zyngier@xxxxxxx> > --- > include/kvm/arm_psci.h | 1 + > virt/kvm/arm/psci.c | 43 +++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 44 insertions(+) > > diff --git a/include/kvm/arm_psci.h b/include/kvm/arm_psci.h > index 5659343580a3..5446435457c2 100644 > --- a/include/kvm/arm_psci.h > +++ b/include/kvm/arm_psci.h > @@ -22,6 +22,7 @@ > > #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) > > int kvm_psci_version(struct kvm_vcpu *vcpu); > int kvm_psci_call(struct kvm_vcpu *vcpu); > diff --git a/virt/kvm/arm/psci.c b/virt/kvm/arm/psci.c > index c41553d35110..291874cff85e 100644 > --- a/virt/kvm/arm/psci.c > +++ b/virt/kvm/arm/psci.c > @@ -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: > -- > 2.14.2 > _______________________________________________ kvmarm mailing list kvmarm@xxxxxxxxxxxxxxxxxxxxx https://lists.cs.columbia.edu/mailman/listinfo/kvmarm