[boot-wrapper 6/7] aarch64: Support PSCI for Armv8-R AArch64

Luca Fancellu luca.fancellu at arm.com
Thu Jun 6 06:36:27 PDT 2024


Add support for PSCI when booting Linux on Armv8-R AArch64,
allow the autoconf parameter --enable-psci to take an argument
which is the conduit to be used, it can be empty or 'smc' to
select the smc conduit, it can be 'hvc' for the hvc conduit.

Depending on the selected conduit, the vector table will be
installed on the VBAR_EL3 or VBAR_EL2 register.

Signed-off-by: Luca Fancellu <luca.fancellu at arm.com>
---
 Makefile.am         |  5 ++++-
 arch/aarch64/init.c | 15 ++++++++++++---
 configure.ac        | 16 +++++++++++-----
 3 files changed, 27 insertions(+), 9 deletions(-)

diff --git a/Makefile.am b/Makefile.am
index 6ebece25b230..34fbfb1f4ff8 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -49,11 +49,14 @@ endif
 
 if PSCI
 DEFINES		+= -DPSCI
+if PSCI_HVC
+DEFINES		+= -DPSCI_HVC
+endif
 ARCH_OBJ	+= psci.o
 COMMON_OBJ	+= psci.o
 PSCI_NODE	:= psci {				\
 			compatible = \"arm,psci\";	\
-			method = \"smc\";		\
+			method = \"$(PSCI_METHOD)\";	\
 			cpu_on = <$(PSCI_CPU_ON)>;	\
 			cpu_off = <$(PSCI_CPU_OFF)>;	\
 		   };
diff --git a/arch/aarch64/init.c b/arch/aarch64/init.c
index 8006f2705193..3305e69270a4 100644
--- a/arch/aarch64/init.c
+++ b/arch/aarch64/init.c
@@ -174,10 +174,19 @@ extern char psci_vectors[];
 
 bool cpu_init_psci_arch(void)
 {
-	if (mrs(CurrentEL) != CURRENTEL_EL3)
+	switch (mrs(CurrentEL)) {
+#if !defined(PSCI_HVC)
+	case CURRENTEL_EL3:
+		msr(VBAR_EL3, (unsigned long)psci_vectors);
+		break;
+#else
+	case CURRENTEL_EL2:
+		msr(VBAR_EL2, (unsigned long)psci_vectors);
+		break;
+#endif
+	default:
 		return false;
-
-	msr(VBAR_EL3, (unsigned long)psci_vectors);
+	}
 	isb();
 
 	return true;
diff --git a/configure.ac b/configure.ac
index 9e3b7226cd69..44459a4c849e 100644
--- a/configure.ac
+++ b/configure.ac
@@ -83,13 +83,19 @@ AS_IF([test "x$X_IMAGE" != "x"],
 # Allow a user to pass --enable-psci
 AC_ARG_ENABLE([psci],
 	AS_HELP_STRING([--disable-psci], [disable the psci boot method]),
-	[USE_PSCI=$enableval], [USE_PSCI="yes"])
-AM_CONDITIONAL([PSCI], [test "x$USE_PSCI" = "xyes"])
-AS_IF([test "x$USE_PSCI" = "xyes"], [], [USE_PSCI=no])
-
-AS_IF([test "x$USE_PSCI" != "xyes" -a "x$KERNEL_ES" = "x32"],
+	[case "${enableval}" in
+		yes|smc) USE_PSCI=smc ;;
+		hvc) USE_PSCI=hvc ;;
+		no) ;;
+		*) AC_MSG_ERROR([Bad value "${enableval}" for --enable-psci. Use "smc" or "hvc"]) ;;
+	esac])
+AM_CONDITIONAL([PSCI], [test "x$USE_PSCI" = "xyes" -o "x$USE_PSCI" = "xsmc" -o "x$USE_PSCI" = "xhvc"])
+AM_CONDITIONAL([PSCI_HVC], [test "x$USE_PSCI" = "xhvc"])
+
+AS_IF([test "x$USE_PSCI" = "xno" -a "x$KERNEL_ES" = "x32"],
 	[AC_MSG_ERROR([With an AArch32 kernel, boot method must be PSCI.])]
 )
+AC_SUBST([PSCI_METHOD], [$USE_PSCI])
 
 # Allow a user to pass --with-initrd
 AC_ARG_WITH([initrd],
-- 
2.34.1




More information about the linux-arm-kernel mailing list