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

1 // SPDX-License-Identifier: GPL-2.0-only
7 #define pr_fmt(fmt) "psci: " fmt
10 #include <linux/arm-smccc.h>
18 #include <linux/psci.h>
23 #include <uapi/linux/psci.h>
33 * While a 64-bit OS can make calls with SMC32 calling conventions, for some
34 * calls it is necessary to use SMC64 to pass or return 64-bit values.
36 * (native-width) function ID.
47 * a Trusted OS even if it claims to be capable of migration -- doing so will
50 static int resident_cpu = -1;
117 arm_smccc_hvc(function_id, arg0, arg1, arg2, 0, 0, 0, 0, &res); in __invoke_psci_fn_hvc()
127 arm_smccc_smc(function_id, arg0, arg1, arg2, 0, 0, 0, 0, &res); in __invoke_psci_fn_smc()
135 return 0; in psci_to_linux_errno()
137 return -EOPNOTSUPP; in psci_to_linux_errno()
140 return -EINVAL; in psci_to_linux_errno()
142 return -EPERM; in psci_to_linux_errno()
145 return -EINVAL; in psci_to_linux_errno()
150 return PSCI_VERSION(0, 1); in psci_0_1_get_version()
155 return invoke_psci_fn(PSCI_0_2_FN_PSCI_VERSION, 0, 0, 0); in psci_0_2_get_version()
166 err = invoke_psci_fn(PSCI_1_0_FN_SET_SUSPEND_MODE, suspend_mode, 0, 0); in psci_set_osi_mode()
167 if (err < 0) in psci_set_osi_mode()
176 err = invoke_psci_fn(fn, state, entry_point, 0); in __psci_cpu_suspend()
188 return __psci_cpu_suspend(PSCI_FN_NATIVE(0_2, CPU_SUSPEND), in psci_0_2_cpu_suspend()
196 err = invoke_psci_fn(fn, state, 0, 0); in __psci_cpu_off()
214 err = invoke_psci_fn(fn, cpuid, entry_point, 0); in __psci_cpu_on()
225 return __psci_cpu_on(PSCI_FN_NATIVE(0_2, CPU_ON), cpuid, entry_point); in psci_0_2_cpu_on()
232 err = invoke_psci_fn(fn, cpuid, 0, 0); in __psci_migrate()
243 return __psci_migrate(PSCI_FN_NATIVE(0_2, MIGRATE), cpuid); in psci_0_2_migrate()
249 return invoke_psci_fn(PSCI_FN_NATIVE(0_2, AFFINITY_INFO), in psci_affinity_info()
250 target_affinity, lowest_affinity_level, 0); in psci_affinity_info()
255 return invoke_psci_fn(PSCI_0_2_FN_MIGRATE_INFO_TYPE, 0, 0, 0); in psci_migrate_info_type()
260 return invoke_psci_fn(PSCI_FN_NATIVE(0_2, MIGRATE_INFO_UP_CPU), in psci_migrate_info_up_cpu()
261 0, 0, 0); in psci_migrate_info_up_cpu()
274 WARN(1, "Unexpected PSCI conduit %d\n", conduit); in set_conduit()
288 return -ENXIO; in get_set_conduit_method()
297 return -EINVAL; in get_set_conduit_method()
299 return 0; in get_set_conduit_method()
308 * reset_type[31] = 0 (architectural) in psci_sys_reset()
309 * reset_type[30:0] = 0 (SYSTEM_WARM_RESET) in psci_sys_reset()
310 * cookie = 0 (ignored by the implementation) in psci_sys_reset()
312 invoke_psci_fn(PSCI_FN_NATIVE(1_1, SYSTEM_RESET2), 0, 0, 0); in psci_sys_reset()
314 invoke_psci_fn(PSCI_0_2_FN_SYSTEM_RESET, 0, 0, 0); in psci_sys_reset()
327 invoke_psci_fn(PSCI_0_2_FN_SYSTEM_OFF, 0, 0, 0); in psci_sys_poweroff()
333 psci_func_id, 0, 0); in psci_features()
348 PSCI_ID_NATIVE(0_2, MIGRATE),
349 PSCI_ID(0_2, MIGRATE_INFO_TYPE),
350 PSCI_ID_NATIVE(0_2, MIGRATE_INFO_UP_CPU),
375 return 0; in psci_debugfs_read()
379 ver = invoke_psci_fn(ARM_SMCCC_VERSION_FUNC_ID, 0, 0, 0); in psci_debugfs_read()
384 seq_puts(s, "SMC Calling Convention v1.0 is assumed\n"); in psci_debugfs_read()
387 feature = psci_features(PSCI_FN_NATIVE(0_2, CPU_SUSPEND)); in psci_debugfs_read()
388 if (feature < 0) { in psci_debugfs_read()
392 (feature & BIT(0)) ? "" : "not "); in psci_debugfs_read()
405 seq_printf(s, "Trusted OS resident on physical CPU 0x%lx (#%d)\n", in psci_debugfs_read()
414 for (i = 0; i < ARRAY_SIZE(psci_fn_ids); i++) { in psci_debugfs_read()
418 if (feature < 0) in psci_debugfs_read()
425 return 0; in psci_debugfs_read()
443 return PTR_ERR_OR_ZERO(debugfs_create_file("psci", 0444, NULL, NULL, in psci_debugfs_init()
466 ret = psci_ops.cpu_suspend(state, 0); in psci_cpu_suspend_enter()
481 pa_cpu_resume, 0, 0); in psci_system_suspend()
486 return cpu_suspend(0, psci_system_suspend); in psci_system_suspend_enter()
519 int feature = psci_features(PSCI_FN_NATIVE(0_2, CPU_SUSPEND)); in psci_init_cpu_suspend()
532 int type, cpu = -1; in psci_init_migrate()
554 pr_warn("MIGRATE_INFO_UP_CPU reported invalid physical ID (0x%lx)\n", in psci_init_migrate()
560 resident_cpu = cpu >= 0 ? cpu : -1; in psci_init_migrate()
562 pr_info("Trusted OS resident on physical CPU 0x%lx\n", cpuid); in psci_init_migrate()
574 ret = invoke_psci_fn(ARM_SMCCC_VERSION_FUNC_ID, 0, 0, 0); in psci_init_smccc()
582 * Conveniently, the SMCCC and PSCI versions are encoded the in psci_init_smccc()
592 pr_info("Using standard PSCI v0.2 function IDs\n"); in psci_0_2_set_functions()
610 * Probe function for PSCI firmware versions >= 0.2
620 if (PSCI_VERSION_MAJOR(ver) == 0 && PSCI_VERSION_MINOR(ver) < 2) { in psci_probe()
621 pr_err("Conflicting PSCI version detected.\n"); in psci_probe()
622 return -EINVAL; in psci_probe()
637 return 0; in psci_probe()
643 * PSCI init function for PSCI versions >=0.2
645 * Probe based on PSCI PSCI_VERSION function
656 * Starting with v0.2, the PSCI specification introduced a call in psci_0_2_init()
658 * that PSCI function IDs and version specific initialization in psci_0_2_init()
666 * PSCI < v0.2 get PSCI Function IDs via DT.
677 pr_info("Using PSCI v0.1 Function IDs from DT\n"); in psci_0_1_init()
701 return 0; in psci_0_1_init()
719 return 0; in psci_1_0_init()
723 { .compatible = "arm,psci", .data = psci_0_1_init},
724 { .compatible = "arm,psci-0.2", .data = psci_0_2_init},
725 { .compatible = "arm,psci-1.0", .data = psci_1_0_init},
739 return -ENODEV; in psci_dt_init()
741 init_fn = (psci_initcall_t)matched_np->data; in psci_dt_init()
750 * We use PSCI 0.2+ when ACPI is deployed on ARM64 and it's
757 return -EOPNOTSUPP; in psci_acpi_init()