diff mbox

[v2,6/6] arm64: enable PSCI secondary CPU bringup

Message ID 1385982538-17855-7-git-send-email-andre.przywara@linaro.org
State New
Headers show

Commit Message

Andre Przywara Dec. 2, 2013, 11:08 a.m. UTC
If the device tree contains a PSCI node and the DTB CPU node tells us
to use PSCI for enabling secondary cores, we set the function pointer
to the PSCI wrapper function to enable PSCI SMP bringup.

Signed-off-by: Andre Przywara <andre.przywara@linaro.org>
---
 xen/arch/arm/arm64/smpboot.c | 21 ++++++++++++++++++++-
 1 file changed, 20 insertions(+), 1 deletion(-)

Comments

Ian Campbell Dec. 2, 2013, 3:11 p.m. UTC | #1
On Mon, 2013-12-02 at 12:08 +0100, Andre Przywara wrote:
> If the device tree contains a PSCI node and the DTB CPU node tells us
> to use PSCI for enabling secondary cores, we set the function pointer
> to the PSCI wrapper function to enable PSCI SMP bringup.
> 
> Signed-off-by: Andre Przywara <andre.przywara@linaro.org>

Acked-by: Ian Campbell <ian.campbell@citrix.com>
diff mbox

Patch

diff --git a/xen/arch/arm/arm64/smpboot.c b/xen/arch/arm/arm64/smpboot.c
index 6a34bd4..a70b860 100644
--- a/xen/arch/arm/arm64/smpboot.c
+++ b/xen/arch/arm/arm64/smpboot.c
@@ -6,6 +6,7 @@ 
 #include <xen/smp.h>
 #include <xen/vmap.h>
 #include <asm/io.h>
+#include <asm/psci.h>
 
 struct smp_enable_ops {
         int             (*prepare_cpu)(int);
@@ -52,6 +53,23 @@  static void __init smp_spin_table_init(int cpu, struct dt_device_node *dn)
     smp_enable_ops[cpu].prepare_cpu = smp_spin_table_cpu_up;
 }
 
+static int __init psci_cpu_up(int cpu)
+{
+    return call_psci_cpu_on(cpu, init_secondary);
+}
+
+static int __init smp_psci_init(int cpu)
+{
+    if ( !psci_available )
+    {
+        printk("CPU%d asks for PSCI, but DTB has no PSCI node\n", cpu);
+        return -ENODEV;
+    }
+
+    smp_enable_ops[cpu].prepare_cpu = psci_cpu_up;
+    return 0;
+}
+
 int __init arch_smp_init(void)
 {
     /* Nothing */
@@ -71,7 +89,8 @@  int __init arch_cpu_init(int cpu, struct dt_device_node *dn)
 
     if ( !strcmp(enable_method, "spin-table") )
         smp_spin_table_init(cpu, dn);
-    /* TODO: method "psci" */
+    else if ( !strcmp(enable_method, "psci") )
+        return smp_psci_init(cpu);
     else
     {
         printk("CPU%d has unknown enable method \"%s\"\n", cpu, enable_method);