|
@@ -59,7 +59,9 @@ bool psci_tos_resident_on(int cpu)
|
|
|
return cpu == resident_cpu;
|
|
|
}
|
|
|
|
|
|
-struct psci_operations psci_ops;
|
|
|
+struct psci_operations psci_ops = {
|
|
|
+ .conduit = PSCI_CONDUIT_NONE,
|
|
|
+};
|
|
|
|
|
|
typedef unsigned long (psci_fn)(unsigned long, unsigned long,
|
|
|
unsigned long, unsigned long);
|
|
@@ -210,6 +212,22 @@ static unsigned long psci_migrate_info_up_cpu(void)
|
|
|
0, 0, 0);
|
|
|
}
|
|
|
|
|
|
+static void set_conduit(enum psci_conduit conduit)
|
|
|
+{
|
|
|
+ switch (conduit) {
|
|
|
+ case PSCI_CONDUIT_HVC:
|
|
|
+ invoke_psci_fn = __invoke_psci_fn_hvc;
|
|
|
+ break;
|
|
|
+ case PSCI_CONDUIT_SMC:
|
|
|
+ invoke_psci_fn = __invoke_psci_fn_smc;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ WARN(1, "Unexpected PSCI conduit %d\n", conduit);
|
|
|
+ }
|
|
|
+
|
|
|
+ psci_ops.conduit = conduit;
|
|
|
+}
|
|
|
+
|
|
|
static int get_set_conduit_method(struct device_node *np)
|
|
|
{
|
|
|
const char *method;
|
|
@@ -222,9 +240,9 @@ static int get_set_conduit_method(struct device_node *np)
|
|
|
}
|
|
|
|
|
|
if (!strcmp("hvc", method)) {
|
|
|
- invoke_psci_fn = __invoke_psci_fn_hvc;
|
|
|
+ set_conduit(PSCI_CONDUIT_HVC);
|
|
|
} else if (!strcmp("smc", method)) {
|
|
|
- invoke_psci_fn = __invoke_psci_fn_smc;
|
|
|
+ set_conduit(PSCI_CONDUIT_SMC);
|
|
|
} else {
|
|
|
pr_warn("invalid \"method\" property: %s\n", method);
|
|
|
return -EINVAL;
|
|
@@ -654,9 +672,9 @@ int __init psci_acpi_init(void)
|
|
|
pr_info("probing for conduit method from ACPI.\n");
|
|
|
|
|
|
if (acpi_psci_use_hvc())
|
|
|
- invoke_psci_fn = __invoke_psci_fn_hvc;
|
|
|
+ set_conduit(PSCI_CONDUIT_HVC);
|
|
|
else
|
|
|
- invoke_psci_fn = __invoke_psci_fn_smc;
|
|
|
+ set_conduit(PSCI_CONDUIT_SMC);
|
|
|
|
|
|
return psci_probe();
|
|
|
}
|