^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0-only */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Copyright (C) 2012,2013 - ARM Ltd
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * Author: Marc Zyngier <marc.zyngier@arm.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #ifndef __KVM_ARM_PSCI_H__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #define __KVM_ARM_PSCI_H__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <linux/kvm_host.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <uapi/linux/psci.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #define KVM_ARM_PSCI_0_1 PSCI_VERSION(0, 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #define KVM_ARM_PSCI_0_2 PSCI_VERSION(0, 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #define KVM_ARM_PSCI_1_0 PSCI_VERSION(1, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #define KVM_ARM_PSCI_LATEST KVM_ARM_PSCI_1_0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) * We need the KVM pointer independently from the vcpu as we can call
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) * this from HYP, and need to apply kern_hyp_va on it...
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) static inline int kvm_psci_version(struct kvm_vcpu *vcpu, struct kvm *kvm)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) * Our PSCI implementation stays the same across versions from
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) * v0.2 onward, only adding the few mandatory functions (such
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) * as FEATURES with 1.0) that are required by newer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) * revisions. It is thus safe to return the latest, unless
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) * userspace has instructed us otherwise.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) if (test_bit(KVM_ARM_VCPU_PSCI_0_2, vcpu->arch.features)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) if (vcpu->kvm->arch.psci_version)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) return vcpu->kvm->arch.psci_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) return KVM_ARM_PSCI_LATEST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) return KVM_ARM_PSCI_0_1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) int kvm_psci_call(struct kvm_vcpu *vcpu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) struct kvm_one_reg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) int kvm_arm_get_fw_num_regs(struct kvm_vcpu *vcpu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) int kvm_arm_copy_fw_reg_indices(struct kvm_vcpu *vcpu, u64 __user *uindices);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) int kvm_arm_get_fw_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) int kvm_arm_set_fw_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) #endif /* __KVM_ARM_PSCI_H__ */