Lines Matching +full:psci +full:- +full:1
1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (C) 2012 - ARM Ltd
7 #include <linux/arm-smccc.h>
24 #define AFFINITY_MASK(level) ~((0x1UL << ((level) * MPIDR_LEVEL_BITS)) - 1)
38 * same-as WFI (Wait-for-interrupt) emulation. in kvm_psci_vcpu_suspend()
42 * in section 5.4.1 of PSCI v0.2 specification (ARM DEN 0022A). in kvm_psci_vcpu_suspend()
44 * Further, we also treat power-down request to be same as in kvm_psci_vcpu_suspend()
45 * stand-by request as-per section 5.4.2 clause 3 of PSCI v0.2 in kvm_psci_vcpu_suspend()
63 struct kvm *kvm = source_vcpu->kvm; in kvm_psci_vcpu_on()
81 spin_lock(&vcpu->arch.mp_state_lock); in kvm_psci_vcpu_on()
91 reset_state = &vcpu->arch.reset_state; in kvm_psci_vcpu_on()
93 reset_state->pc = smccc_get_arg2(source_vcpu); in kvm_psci_vcpu_on()
96 reset_state->be = kvm_vcpu_is_be(source_vcpu); in kvm_psci_vcpu_on()
99 * NOTE: We always update r0 (or x0) because for PSCI v0.1 in kvm_psci_vcpu_on()
102 reset_state->r0 = smccc_get_arg3(source_vcpu); in kvm_psci_vcpu_on()
104 reset_state->reset = true; in kvm_psci_vcpu_on()
113 WRITE_ONCE(vcpu->arch.mp_state.mp_state, KVM_MP_STATE_RUNNABLE); in kvm_psci_vcpu_on()
117 spin_unlock(&vcpu->arch.mp_state_lock); in kvm_psci_vcpu_on()
128 struct kvm *kvm = vcpu->kvm; in kvm_psci_vcpu_affinity_info()
172 * actual request is made. Since we are implementing PSCI and a in kvm_prepare_system_event()
173 * caller of PSCI reboot and shutdown expects that the system shuts in kvm_prepare_system_event()
176 * re-initialized. in kvm_prepare_system_event()
178 kvm_for_each_vcpu(i, tmp, vcpu->kvm) { in kvm_prepare_system_event()
179 spin_lock(&tmp->arch.mp_state_lock); in kvm_prepare_system_event()
180 WRITE_ONCE(tmp->arch.mp_state.mp_state, KVM_MP_STATE_STOPPED); in kvm_prepare_system_event()
181 spin_unlock(&tmp->arch.mp_state_lock); in kvm_prepare_system_event()
183 kvm_make_all_cpus_request(vcpu->kvm, KVM_REQ_SLEEP); in kvm_prepare_system_event()
185 memset(&vcpu->run->system_event, 0, sizeof(vcpu->run->system_event)); in kvm_prepare_system_event()
186 vcpu->run->system_event.type = type; in kvm_prepare_system_event()
187 vcpu->run->system_event.ndata = 1; in kvm_prepare_system_event()
188 vcpu->run->system_event.data[0] = flags; in kvm_prepare_system_event()
189 vcpu->run->exit_reason = KVM_EXIT_SYSTEM_EVENT; in kvm_prepare_system_event()
216 struct kvm_run *run = vcpu->run; in kvm_psci_system_suspend()
218 memset(&run->system_event, 0, sizeof(vcpu->run->system_event)); in kvm_psci_system_suspend()
219 run->system_event.type = KVM_SYSTEM_EVENT_SUSPEND; in kvm_psci_system_suspend()
220 run->exit_reason = KVM_EXIT_SYSTEM_EVENT; in kvm_psci_system_suspend()
231 for (i = 1; i < 4; i++) in kvm_psci_narrow_to_32bit()
238 * Prevent 32 bit guests from calling 64 bit PSCI functions. in kvm_psci_check_allowed_function()
250 int ret = 1; in kvm_psci_0_2_call()
296 * VCPU should see internal failure from PSCI return in kvm_psci_0_2_call()
298 * PSCI return value INTERNAL_FAILURE. in kvm_psci_0_2_call()
307 * with PSCI return value INTERNAL_FAILURE. in kvm_psci_0_2_call()
325 struct kvm *kvm = vcpu->kvm; in kvm_psci_1_x_call()
327 int ret = 1; in kvm_psci_1_x_call()
331 val = PSCI_VERSION(1, minor); in kvm_psci_1_x_call()
359 if (test_bit(KVM_ARCH_FLAG_SYSTEM_SUSPEND_ENABLED, &kvm->arch.flags)) in kvm_psci_1_x_call()
364 if (minor >= 1) in kvm_psci_1_x_call()
383 if (test_bit(KVM_ARCH_FLAG_SYSTEM_SUSPEND_ENABLED, &kvm->arch.flags)) { in kvm_psci_1_x_call()
392 if (minor >= 1) { in kvm_psci_1_x_call()
460 return 1; in kvm_psci_0_1_call()
464 * kvm_psci_call - handle PSCI call if r0 value is in range
467 * Handle PSCI calls from guests through traps from HVC instructions.
475 * -EINVAL: Unrecognized PSCI function
486 return 1; in kvm_psci_call()
495 return kvm_psci_1_x_call(vcpu, 1); in kvm_psci_call()
503 WARN_ONCE(1, "Unknown PSCI version %d", version); in kvm_psci_call()
505 return 1; in kvm_psci_call()