• Home
  • Raw
  • Download

Lines Matching +full:psci +full:- +full:0

14 #define pr_fmt(fmt) "psci: " fmt
17 #include <linux/arm-smccc.h>
24 #include <linux/psci.h>
29 #include <uapi/linux/psci.h>
38 * While a 64-bit OS can make calls with SMC32 calling conventions, for some
39 * calls it is necessary to use SMC64 to pass or return 64-bit values.
41 * (native-width) function ID.
52 * a Trusted OS even if it claims to be capable of migration -- doing so will
55 static int resident_cpu = -1;
122 arm_smccc_hvc(function_id, arg0, arg1, arg2, 0, 0, 0, 0, &res); in __invoke_psci_fn_hvc()
132 arm_smccc_smc(function_id, arg0, arg1, arg2, 0, 0, 0, 0, &res); in __invoke_psci_fn_smc()
140 return 0; in psci_to_linux_errno()
142 return -EOPNOTSUPP; in psci_to_linux_errno()
145 return -EINVAL; in psci_to_linux_errno()
147 return -EPERM; in psci_to_linux_errno()
150 return -EINVAL; in psci_to_linux_errno()
155 return invoke_psci_fn(PSCI_0_2_FN_PSCI_VERSION, 0, 0, 0); in psci_get_version()
164 err = invoke_psci_fn(fn, state, entry_point, 0); in psci_cpu_suspend()
174 err = invoke_psci_fn(fn, state, 0, 0); in psci_cpu_off()
184 err = invoke_psci_fn(fn, cpuid, entry_point, 0); in psci_cpu_on()
194 err = invoke_psci_fn(fn, cpuid, 0, 0); in psci_migrate()
201 return invoke_psci_fn(PSCI_FN_NATIVE(0_2, AFFINITY_INFO), in psci_affinity_info()
202 target_affinity, lowest_affinity_level, 0); in psci_affinity_info()
207 return invoke_psci_fn(PSCI_0_2_FN_MIGRATE_INFO_TYPE, 0, 0, 0); in psci_migrate_info_type()
212 return invoke_psci_fn(PSCI_FN_NATIVE(0_2, MIGRATE_INFO_UP_CPU), in psci_migrate_info_up_cpu()
213 0, 0, 0); in psci_migrate_info_up_cpu()
226 WARN(1, "Unexpected PSCI conduit %d\n", conduit); in set_conduit()
240 return -ENXIO; in get_set_conduit_method()
249 return -EINVAL; in get_set_conduit_method()
251 return 0; in get_set_conduit_method()
256 invoke_psci_fn(PSCI_0_2_FN_SYSTEM_RESET, 0, 0, 0); in psci_sys_reset()
261 invoke_psci_fn(PSCI_0_2_FN_SYSTEM_OFF, 0, 0, 0); in psci_sys_poweroff()
267 psci_func_id, 0, 0); in psci_features()
275 int i, ret, count = 0; in psci_dt_cpu_init_idle()
280 while ((state_node = of_parse_phandle(cpu_node, "cpu-idle-states", in psci_dt_cpu_init_idle()
287 return -ENODEV; in psci_dt_cpu_init_idle()
291 return -ENOMEM; in psci_dt_cpu_init_idle()
293 for (i = 0; i < count; i++) { in psci_dt_cpu_init_idle()
296 state_node = of_parse_phandle(cpu_node, "cpu-idle-states", i); in psci_dt_cpu_init_idle()
299 "arm,psci-suspend-param", in psci_dt_cpu_init_idle()
302 pr_warn(" * %pOF missing arm,psci-suspend-param property\n", in psci_dt_cpu_init_idle()
309 pr_debug("psci-power-state %#x index %d\n", state, i); in psci_dt_cpu_init_idle()
311 pr_warn("Invalid PSCI power state %#x\n", state); in psci_dt_cpu_init_idle()
312 ret = -EINVAL; in psci_dt_cpu_init_idle()
317 /* Idle states parsed correctly, initialize per-cpu pointer */ in psci_dt_cpu_init_idle()
319 return 0; in psci_dt_cpu_init_idle()
336 if (unlikely(!pr || !pr->flags.has_lpi)) in psci_acpi_cpu_init_idle()
337 return -EINVAL; in psci_acpi_cpu_init_idle()
339 count = pr->power.count - 1; in psci_acpi_cpu_init_idle()
340 if (count <= 0) in psci_acpi_cpu_init_idle()
341 return -ENODEV; in psci_acpi_cpu_init_idle()
345 return -ENOMEM; in psci_acpi_cpu_init_idle()
347 for (i = 0; i < count; i++) { in psci_acpi_cpu_init_idle()
350 lpi = &pr->power.lpi_states[i + 1]; in psci_acpi_cpu_init_idle()
352 * Only bits[31:0] represent a PSCI power_state while in psci_acpi_cpu_init_idle()
353 * bits[63:32] must be 0x0 as per ARM ACPI FFH Specification in psci_acpi_cpu_init_idle()
355 state = lpi->address; in psci_acpi_cpu_init_idle()
357 pr_warn("Invalid PSCI power state %#x\n", state); in psci_acpi_cpu_init_idle()
359 return -EINVAL; in psci_acpi_cpu_init_idle()
363 /* Idle states parsed correctly, initialize per-cpu pointer */ in psci_acpi_cpu_init_idle()
365 return 0; in psci_acpi_cpu_init_idle()
370 return -EINVAL; in psci_acpi_cpu_init_idle()
380 * If the PSCI cpu_suspend function hook has not been initialized in psci_cpu_init_idle()
384 return -EOPNOTSUPP; in psci_cpu_init_idle()
391 return -ENODEV; in psci_cpu_init_idle()
404 return psci_ops.cpu_suspend(state[index - 1], in psci_suspend_finisher()
413 * idle state index 0 corresponds to wfi, should never be called in psci_cpu_suspend_enter()
417 return -EINVAL; in psci_cpu_suspend_enter()
419 if (!psci_power_state_loses_context(state[index - 1])) in psci_cpu_suspend_enter()
420 ret = psci_ops.cpu_suspend(state[index - 1], 0); in psci_cpu_suspend_enter()
434 CPUIDLE_METHOD_OF_DECLARE(psci, "psci", &psci_cpuidle_ops);
441 __pa_symbol(cpu_resume), 0, 0); in psci_system_suspend()
446 return cpu_suspend(0, psci_system_suspend); in psci_system_suspend_enter()
482 int type, cpu = -1; in psci_init_migrate()
504 pr_warn("MIGRATE_INFO_UP_CPU reported invalid physical ID (0x%lx)\n", in psci_init_migrate()
510 resident_cpu = cpu >= 0 ? cpu : -1; in psci_init_migrate()
512 pr_info("Trusted OS resident on physical CPU 0x%lx\n", cpuid); in psci_init_migrate()
524 ret = invoke_psci_fn(ARM_SMCCC_VERSION_FUNC_ID, 0, 0, 0); in psci_init_smccc()
532 * Conveniently, the SMCCC and PSCI versions are encoded the in psci_init_smccc()
542 pr_info("Using standard PSCI v0.2 function IDs\n"); in psci_0_2_set_functions()
546 PSCI_FN_NATIVE(0_2, CPU_SUSPEND); in psci_0_2_set_functions()
552 psci_function_id[PSCI_FN_CPU_ON] = PSCI_FN_NATIVE(0_2, CPU_ON); in psci_0_2_set_functions()
555 psci_function_id[PSCI_FN_MIGRATE] = PSCI_FN_NATIVE(0_2, MIGRATE); in psci_0_2_set_functions()
568 * Probe function for PSCI firmware versions >= 0.2
578 if (PSCI_VERSION_MAJOR(ver) == 0 && PSCI_VERSION_MINOR(ver) < 2) { in psci_probe()
579 pr_err("Conflicting PSCI version detected.\n"); in psci_probe()
580 return -EINVAL; in psci_probe()
593 return 0; in psci_probe()
599 * PSCI init function for PSCI versions >=0.2
601 * Probe based on PSCI PSCI_VERSION function
612 * Starting with v0.2, the PSCI specification introduced a call in psci_0_2_init()
614 * that PSCI function IDs and version specific initialization in psci_0_2_init()
626 * PSCI < v0.2 get PSCI Function IDs via DT.
638 pr_info("Using PSCI v0.1 Function IDs from DT\n"); in psci_0_1_init()
666 { .compatible = "arm,psci", .data = psci_0_1_init},
667 { .compatible = "arm,psci-0.2", .data = psci_0_2_init},
668 { .compatible = "arm,psci-1.0", .data = psci_0_2_init},
681 return -ENODEV; in psci_dt_init()
683 init_fn = (psci_initcall_t)matched_np->data; in psci_dt_init()
689 * We use PSCI 0.2+ when ACPI is deployed on ARM64 and it's
696 return -EOPNOTSUPP; in psci_acpi_init()