[U-Boot] [PATCH 2/3] arm/PSCI: Fixed the backward compatiblity issue

Zhiqiang Hou Zhiqiang.Hou at nxp.com
Fri Jul 29 12:26:36 CEST 2016


From: Hou Zhiqiang <Zhiqiang.Hou at nxp.com>

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, such as 'cpu_on' 'cpu_off' etc.

Note:
The PSCI version 0.1 isn't supported by ARMv8 Secure Firmware Framework.

Signed-off-by: Hou Zhiqiang <Zhiqiang.Hou at nxp.com>
---
 arch/arm/include/asm/psci.h |  3 +++
 arch/arm/lib/psci-dt.c      | 61 ++++++++++++++++++++++++++-------------------
 2 files changed, 38 insertions(+), 26 deletions(-)

diff --git a/arch/arm/include/asm/psci.h b/arch/arm/include/asm/psci.h
index 8aefaa7..5b8ce4d 100644
--- a/arch/arm/include/asm/psci.h
+++ b/arch/arm/include/asm/psci.h
@@ -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))
diff --git a/arch/arm/lib/psci-dt.c b/arch/arm/lib/psci-dt.c
index bcd92e7..af49c24 100644
--- a/arch/arm/lib/psci-dt.c
+++ b/arch/arm/lib/psci-dt.c
@@ -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;
 }
-- 
2.1.0.27.g96db324



More information about the U-Boot mailing list