|
@@ -57,6 +57,9 @@ static struct psci_operations psci_ops;
|
|
|
static int (*invoke_psci_fn)(u64, u64, u64, u64);
|
|
|
typedef int (*psci_initcall_t)(const struct device_node *);
|
|
|
|
|
|
+asmlinkage int __invoke_psci_fn_hvc(u64, u64, u64, u64);
|
|
|
+asmlinkage int __invoke_psci_fn_smc(u64, u64, u64, u64);
|
|
|
+
|
|
|
enum psci_function {
|
|
|
PSCI_FN_CPU_SUSPEND,
|
|
|
PSCI_FN_CPU_ON,
|
|
@@ -109,40 +112,6 @@ static void psci_power_state_unpack(u32 power_state,
|
|
|
PSCI_0_2_POWER_STATE_AFFL_SHIFT;
|
|
|
}
|
|
|
|
|
|
-/*
|
|
|
- * The following two functions are invoked via the invoke_psci_fn pointer
|
|
|
- * and will not be inlined, allowing us to piggyback on the AAPCS.
|
|
|
- */
|
|
|
-static noinline int __invoke_psci_fn_hvc(u64 function_id, u64 arg0, u64 arg1,
|
|
|
- u64 arg2)
|
|
|
-{
|
|
|
- asm volatile(
|
|
|
- __asmeq("%0", "x0")
|
|
|
- __asmeq("%1", "x1")
|
|
|
- __asmeq("%2", "x2")
|
|
|
- __asmeq("%3", "x3")
|
|
|
- "hvc #0\n"
|
|
|
- : "+r" (function_id)
|
|
|
- : "r" (arg0), "r" (arg1), "r" (arg2));
|
|
|
-
|
|
|
- return function_id;
|
|
|
-}
|
|
|
-
|
|
|
-static noinline int __invoke_psci_fn_smc(u64 function_id, u64 arg0, u64 arg1,
|
|
|
- u64 arg2)
|
|
|
-{
|
|
|
- asm volatile(
|
|
|
- __asmeq("%0", "x0")
|
|
|
- __asmeq("%1", "x1")
|
|
|
- __asmeq("%2", "x2")
|
|
|
- __asmeq("%3", "x3")
|
|
|
- "smc #0\n"
|
|
|
- : "+r" (function_id)
|
|
|
- : "r" (arg0), "r" (arg1), "r" (arg2));
|
|
|
-
|
|
|
- return function_id;
|
|
|
-}
|
|
|
-
|
|
|
static int psci_get_version(void)
|
|
|
{
|
|
|
int err;
|