arm/PSCI: Fixed the backward compatiblity issue
authorHou Zhiqiang <Zhiqiang.Hou@nxp.com>
Fri, 29 Jul 2016 10:26:36 +0000 (18:26 +0800)
committerYork Sun <york.sun@nxp.com>
Tue, 2 Aug 2016 16:47:49 +0000 (09:47 -0700)
Appended the compatible strings of old version PSCI to the latest
version supported. And there are some psci functions' property must
be added to DT only for psci version 0.1, including cpu_on, cpu_off,
cpu_suspend, migrate.

Note, ARMv8 Secure Firmware Framework doesn't support PSCI ver 0.1.

Signed-off-by: Hou Zhiqiang <Zhiqiang.Hou@nxp.com>
Reviewed-by: York Sun <york.sun@nxp.com>
arch/arm/include/asm/psci.h
arch/arm/lib/psci-dt.c

index 8aefaa7708559c358215a3948081f65ab4aa08c5..5b8ce4d31bddf22fa724fb4b22f2edaff8dca205 100644 (file)
@@ -18,6 +18,9 @@
 #ifndef __ARM_PSCI_H__
 #define __ARM_PSCI_H__
 
+#define ARM_PSCI_VER_1_0               (0x00010000)
+#define ARM_PSCI_VER_0_2               (0x00000002)
+
 /* PSCI 0.1 interface */
 #define ARM_PSCI_FN_BASE               0x95c1ba5e
 #define ARM_PSCI_FN(n)                 (ARM_PSCI_FN_BASE + (n))
index bcd92e77eeab5925679e69ee78b3d4480b8b3461..af49c249cd99a23fd8cf73f28236ccd4fcf759e2 100644 (file)
@@ -19,7 +19,6 @@ int fdt_psci(void *fdt)
 #if defined(CONFIG_ARMV8_PSCI) || defined(CONFIG_ARMV7_PSCI)
        int nodeoff;
        unsigned int psci_ver = 0;
-       char *psci_compt;
        int tmp;
 
        nodeoff = fdt_path_offset(fdt, "/cpus");
@@ -68,39 +67,49 @@ init_psci_node:
        psci_ver = sec_firmware_support_psci_version();
 #endif
        switch (psci_ver) {
-       case 0x00010000:
-               psci_compt = "arm,psci-1.0";
-               break;
-       case 0x00000002:
-               psci_compt = "arm,psci-0.2";
-               break;
+       case ARM_PSCI_VER_1_0:
+               tmp = fdt_setprop_string(fdt, nodeoff,
+                               "compatible", "arm,psci-1.0");
+               if (tmp)
+                       return tmp;
+       case ARM_PSCI_VER_0_2:
+               tmp = fdt_appendprop_string(fdt, nodeoff,
+                               "compatible", "arm,psci-0.2");
+               if (tmp)
+                       return tmp;
        default:
-               psci_compt = "arm,psci";
+       /*
+        * The Secure firmware framework isn't able to support PSCI version 0.1.
+        */
+#ifndef CONFIG_ARMV8_SEC_FIRMWARE_SUPPORT
+               tmp = fdt_appendprop_string(fdt, nodeoff,
+                               "compatible", "arm,psci");
+               if (tmp)
+                       return tmp;
+               tmp = fdt_setprop_u32(fdt, nodeoff, "cpu_suspend",
+                               ARM_PSCI_FN_CPU_SUSPEND);
+               if (tmp)
+                       return tmp;
+               tmp = fdt_setprop_u32(fdt, nodeoff, "cpu_off",
+                               ARM_PSCI_FN_CPU_OFF);
+               if (tmp)
+                       return tmp;
+               tmp = fdt_setprop_u32(fdt, nodeoff, "cpu_on",
+                               ARM_PSCI_FN_CPU_ON);
+               if (tmp)
+                       return tmp;
+               tmp = fdt_setprop_u32(fdt, nodeoff, "migrate",
+                               ARM_PSCI_FN_MIGRATE);
+               if (tmp)
+                       return tmp;
+#endif
                break;
        }
 
-       tmp = fdt_setprop_string(fdt, nodeoff, "compatible", psci_compt);
-       if (tmp)
-               return tmp;
        tmp = fdt_setprop_string(fdt, nodeoff, "method", "smc");
        if (tmp)
                return tmp;
 
-#ifdef CONFIG_ARMV7_PSCI
-       tmp = fdt_setprop_u32(fdt, nodeoff, "cpu_suspend",
-                               ARM_PSCI_FN_CPU_SUSPEND);
-       if (tmp)
-               return tmp;
-       tmp = fdt_setprop_u32(fdt, nodeoff, "cpu_off", ARM_PSCI_FN_CPU_OFF);
-       if (tmp)
-               return tmp;
-       tmp = fdt_setprop_u32(fdt, nodeoff, "cpu_on", ARM_PSCI_FN_CPU_ON);
-       if (tmp)
-               return tmp;
-       tmp = fdt_setprop_u32(fdt, nodeoff, "migrate", ARM_PSCI_FN_MIGRATE);
-       if (tmp)
-               return tmp;
-#endif
 #endif
        return 0;
 }