]> git.sur5r.net Git - u-boot/blobdiff - arch/arm/lib/psci-dt.c
libfdt: move headers to <linux/libfdt.h> and <linux/libfdt_env.h>
[u-boot] / arch / arm / lib / psci-dt.c
index 8dc31d4897deb2d1c816014d486899d55d008461..8272e2db9f87925e98853b0fcc17e8e3b81dbdd3 100644 (file)
@@ -5,7 +5,7 @@
  */
 
 #include <common.h>
-#include <libfdt.h>
+#include <linux/libfdt.h>
 #include <fdt_support.h>
 #include <linux/sizes.h>
 #include <linux/kernel.h>
 
 int fdt_psci(void *fdt)
 {
-#if defined(CONFIG_ARMV8_PSCI) || defined(CONFIG_ARMV7_PSCI)
+#if defined(CONFIG_ARMV7_PSCI) || defined(CONFIG_ARMV8_PSCI) || \
+       defined(CONFIG_SEC_FIRMWARE_ARMV8_PSCI)
        int nodeoff;
        unsigned int psci_ver = 0;
-       char *psci_compt;
        int tmp;
 
        nodeoff = fdt_path_offset(fdt, "/cpus");
@@ -51,27 +51,10 @@ int fdt_psci(void *fdt)
                fdt_setprop_string(fdt, tmp, "enable-method", "psci");
        }
 
-       /*
-        * The PSCI node might be called "/psci" or might be called something
-        * else but contain either of the compatible strings
-        * "arm,psci"/"arm,psci-0.2"
-        */
        nodeoff = fdt_path_offset(fdt, "/psci");
        if (nodeoff >= 0)
                goto init_psci_node;
 
-       nodeoff = fdt_node_offset_by_compatible(fdt, -1, "arm,psci");
-       if (nodeoff >= 0)
-               goto init_psci_node;
-
-       nodeoff = fdt_node_offset_by_compatible(fdt, -1, "arm,psci-0.2");
-       if (nodeoff >= 0)
-               goto init_psci_node;
-
-       nodeoff = fdt_node_offset_by_compatible(fdt, -1, "arm,psci-1.0");
-       if (nodeoff >= 0)
-               goto init_psci_node;
-
        nodeoff = fdt_path_offset(fdt, "/");
        if (nodeoff < 0)
                return nodeoff;
@@ -83,41 +66,55 @@ int fdt_psci(void *fdt)
 init_psci_node:
 #ifdef CONFIG_ARMV8_SEC_FIRMWARE_SUPPORT
        psci_ver = sec_firmware_support_psci_version();
+#elif defined(CONFIG_ARMV7_PSCI_1_0) || defined(CONFIG_ARMV8_PSCI)
+       psci_ver = ARM_PSCI_VER_1_0;
 #endif
-       switch (psci_ver) {
-       case 0x00010000:
-               psci_compt = "arm,psci-1.0";
-               break;
-       case 0x00000002:
-               psci_compt = "arm,psci-0.2";
-               break;
-       default:
-               psci_compt = "arm,psci";
-               break;
+       if (psci_ver >= ARM_PSCI_VER_1_0) {
+               tmp = fdt_setprop_string(fdt, nodeoff,
+                               "compatible", "arm,psci-1.0");
+               if (tmp)
+                       return tmp;
        }
 
-       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;
+       if (psci_ver >= ARM_PSCI_VER_0_2) {
+               tmp = fdt_appendprop_string(fdt, nodeoff,
+                               "compatible", "arm,psci-0.2");
+               if (tmp)
+                       return tmp;
+       }
 
-#ifdef CONFIG_ARMV7_PSCI
-       tmp = fdt_setprop_u32(fdt, nodeoff, "cpu_suspend",
+#ifndef CONFIG_ARMV8_SEC_FIRMWARE_SUPPORT
+       /*
+        * The Secure firmware framework isn't able to support PSCI version 0.1.
+        */
+       if (psci_ver < ARM_PSCI_VER_0_2) {
+               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
+
+       tmp = fdt_setprop_string(fdt, nodeoff, "method", "smc");
        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;
 }