From patchwork Wed Jul 31 14:11:00 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luca Fancellu X-Patchwork-Id: 13748841 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id EA994C3DA64 for ; Wed, 31 Jul 2024 14:12:54 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From: Reply-To:Content-Type:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=gkEmoENkHrWknyPVtqcBrSyufR/2RM5XDHOpwwgJT+Y=; b=Vxn+xAW3MBUSqveQnL5FQvkr0b 2nmVAdCjirGqoV15gXsvwJHAB5i5FzflWLfaO/Q1swh8wq4xb0W04IYaHIl9/SixDTCzEyBcbXlS+ XOsxVBeDPQsNrf3xET1Hlisg9AjgKaf6ToZZPSIVy//xqmXFADLC+B26K2RwZyIZsRZC+4zU/OIBG PiPCSsf1PL+caeVhmpwoZ6qiGwxSpf9khNdcr6QdujCcTVMlnpdDkB+5LbzAbauEPRykdxDxi+T/b IiIVae4reY/9kHJE6h8cu4nPcnKKRK0jLg/aJH7tWAGe/CANHY/wlvuvaXdOQh8tuav/zJGT0/KrS ODAWRDOg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1sZA4K-00000001Qlk-1Poa; Wed, 31 Jul 2024 14:12:44 +0000 Received: from foss.arm.com ([217.140.110.172]) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1sZA2t-00000001QDa-45iW for linux-arm-kernel@lists.infradead.org; Wed, 31 Jul 2024 14:11:18 +0000 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 22C4A1063; Wed, 31 Jul 2024 07:11:39 -0700 (PDT) Received: from e125770.cambridge.arm.com (e125770.arm.com [10.1.199.43]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id D18123F5A1; Wed, 31 Jul 2024 07:11:12 -0700 (PDT) From: Luca Fancellu To: mark.rutland@arm.com, andre.przywara@arm.com Cc: linux-arm-kernel@lists.infradead.org Subject: [boot-wrapper v3 1/4] Introduce --with-bw-arch for boot-wrapper compile arch Date: Wed, 31 Jul 2024 15:11:00 +0100 Message-Id: <20240731141103.2559706-2-luca.fancellu@arm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240731141103.2559706-1-luca.fancellu@arm.com> References: <20240731141103.2559706-1-luca.fancellu@arm.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240731_071116_092830_ACC17717 X-CRM114-Status: UNSURE ( 9.73 ) X-CRM114-Notice: Please train this message. X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Introduce a new autoconf parameter --with-bw-arch that takes 'aarch64-a' and 'aarch32-a' as compile architecture, the former is selected by default when the parameter is not passed. This new parameter superseed --enable-aarch32-bw, its functionality is now implemented by --with-bw-arch=aarch32-a. Signed-off-by: Luca Fancellu --- Changes from v2: - Major rework, reason in the cover letter. --- configure.ac | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/configure.ac b/configure.ac index ce41daebc378..bba42fa1dba8 100644 --- a/configure.ac +++ b/configure.ac @@ -9,9 +9,18 @@ AC_INIT([boot-wrapper], [v0.2]) AM_INIT_AUTOMAKE([foreign]) -AC_ARG_ENABLE([aarch32-bw], - AS_HELP_STRING([--enable-aarch32-bw], [build a 32-bit boot-wrapper]), - [BOOTWRAPPER_ES=32], [BOOTWRAPPER_ES=64]) +# Allow a user to pass --with-bw-arch={aarch64-a,aarch32-a} +AC_ARG_WITH([bw-arch], + AS_HELP_STRING([--with-bw-arch], [aarch64-a selects AArch64-A (default), aarch32-a selects AArch32-A]), + [case "${withval}" in + no|yes|aarch64-a) USE_ARCH=aarch64-a ;; + aarch32-a) USE_ARCH=aarch32-a ;; + *) AC_MSG_ERROR([Bad value "${withval}" for --with-bw-arch. Use "aarch64-a" or "aarch32-a"]) ;; + esac]) + +AS_IF([test "x$USE_ARCH" = "xaarch32-a"], + [BOOTWRAPPER_ES=32], [BOOTWRAPPER_ES=64] +) AM_CONDITIONAL([BOOTWRAPPER_32], [test "x$BOOTWRAPPER_ES" = "x32"]) AC_ARG_ENABLE([aarch32-kernel], From patchwork Wed Jul 31 14:11:01 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luca Fancellu X-Patchwork-Id: 13748842 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id F3A5BC3DA64 for ; Wed, 31 Jul 2024 14:13:26 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From: Reply-To:Content-Type:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=OyiNJJyybRfD4PJVPF3Wi5E3HNNTpxY8+MP3l/ONAgY=; b=juUDJfoSKF+k83l3ca3zjdZ9TW dEvWkghyn1gebSlzPykwSl5e1QKQU73IniRCQ8RroCThLAuU/URfXeK197xG0Wiuu+ua5EI5ggJur een2z1U4t7hL3mqU/2L7PijRIfCDY2yfbhdnVrZYimK6ibiTx3dQ0FB8OTaq8JpgULNnRRyoCbHac 4bQeq3iIZgmQEW7z6JAbgvUrlr4EhGn6mqWiQbIyJ+yLztcTc4uoYqrPz6vzD+TgJ4hwwAXjBTcOb pzTd9EEug5N3u0CRk0ZAWokCHutA6ion+kDuzPyl4cHCjKXZR+280q8PFnEGND4yYkKDTejiNsx7R Ut4gVOJg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1sZA4n-00000001QwP-16lR; Wed, 31 Jul 2024 14:13:13 +0000 Received: from foss.arm.com ([217.140.110.172]) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1sZA2u-00000001QDe-3iLo for linux-arm-kernel@lists.infradead.org; Wed, 31 Jul 2024 14:11:19 +0000 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 128BA1476; Wed, 31 Jul 2024 07:11:40 -0700 (PDT) Received: from e125770.cambridge.arm.com (e125770.arm.com [10.1.199.43]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id C16793F5A1; Wed, 31 Jul 2024 07:11:13 -0700 (PDT) From: Luca Fancellu To: mark.rutland@arm.com, andre.przywara@arm.com Cc: linux-arm-kernel@lists.infradead.org Subject: [boot-wrapper v3 2/4] aarch64: Enable Armv8-R EL2 boot Date: Wed, 31 Jul 2024 15:11:01 +0100 Message-Id: <20240731141103.2559706-3-luca.fancellu@arm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240731141103.2559706-1-luca.fancellu@arm.com> References: <20240731141103.2559706-1-luca.fancellu@arm.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240731_071117_154728_B99DD900 X-CRM114-Status: GOOD ( 19.28 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org When booting on Armv8-R, EL3 is not implemented and the Linux kernel needs to be booted in EL1, so initialise EL2 and start the kernel in the expected exception level. To do so, introduce the 'aarch64-r' argument for the --with-bw-arch parameter. PSCI is not yet implemented for aarch64-r. Signed-off-by: Luca Fancellu --- Changes from v2: - Major rework, reason in the cover letter. --- Makefile.am | 4 +++ arch/aarch64/boot.S | 5 ++++ arch/aarch64/include/asm/cpu.h | 24 +++++++++++++++ arch/aarch64/init.c | 55 ++++++++++++++++++++++++++++++++++ configure.ac | 8 +++-- 5 files changed, 93 insertions(+), 3 deletions(-) diff --git a/Makefile.am b/Makefile.am index 6ebece25b230..bf97b989d5d7 100644 --- a/Makefile.am +++ b/Makefile.am @@ -25,6 +25,10 @@ DEFINES += $(if $(SYSREGS_BASE), -DSYSREGS_BASE=$(SYSREGS_BASE), ) DEFINES += -DUART_BASE=$(UART_BASE) DEFINES += -DSTACK_SIZE=256 +if BOOTWRAPPER_64R +DEFINES += -DBOOTWRAPPER_64R +endif + if KERNEL_32 DEFINES += -DKERNEL_32 PSCI_CPU_ON := 0x84000003 diff --git a/arch/aarch64/boot.S b/arch/aarch64/boot.S index f8fc8082fbee..0b4f6824045a 100644 --- a/arch/aarch64/boot.S +++ b/arch/aarch64/boot.S @@ -100,7 +100,12 @@ ASM_FUNC(jump_kernel) mov x1, x21 mov x2, x22 mov x3, x23 +#if defined(BOOTWRAPPER_64R) + // On Armv8-R Linux needs to be booted at EL1 + mov x4, #SPSR_KERNEL_EL1 +#else mov x4, #SPSR_KERNEL +#endif mrs x5, CurrentEL cmp x5, #CURRENTEL_EL3 diff --git a/arch/aarch64/include/asm/cpu.h b/arch/aarch64/include/asm/cpu.h index a5744e16e4b2..6686161c7c0b 100644 --- a/arch/aarch64/include/asm/cpu.h +++ b/arch/aarch64/include/asm/cpu.h @@ -32,10 +32,15 @@ (BIT(29) | BIT(28) | BIT(23) | BIT(22) | BIT(18) | BIT(16) | \ BIT(11) | BIT(5) | BIT(4)) +#define CPTR_EL2_NO_E2H_RES1 \ + (BITS(13,12) | BIT(9) | BITS(7,0)) + #define SCTLR_EL2_RES1 \ (BIT(29) | BIT(28) | BIT(23) | BIT(22) | BIT(18) | BIT(16) | \ BIT(11) | BIT(5) | BIT(4)) +#define VSTCR_EL2_RES1 (BIT(31)) + #define SCTLR_EL1_RES1 \ (BIT(29) | BIT(28) | BIT(23) | BIT(22) | BIT(20) | BIT(11) | \ BIT(8) | BIT(7) | BIT(4)) @@ -64,7 +69,13 @@ #define SCR_EL3_PIEN BIT(45) #define SCR_EL3_D128En BIT(47) +#define VTCR_EL2_MSA BIT(31) + #define HCR_EL2_RES1 BIT(1) +#define HCR_EL2_APK_NOTRAP BIT(40) +#define HCR_EL2_API_NOTRAP BIT(41) +#define HCR_EL2_FIEN_NOTRAP BIT(47) +#define HCR_EL2_ENSCXT_NOTRAP BIT(53) #define ID_AA64DFR0_EL1_PMSVER BITS(35, 32) #define ID_AA64DFR0_EL1_TRACEBUFFER BITS(47, 44) @@ -81,6 +92,8 @@ #define ID_AA64ISAR2_EL1_GPA3 BITS(11, 8) #define ID_AA64ISAR2_EL1_APA3 BITS(15, 12) +#define ID_AA64MMFR0_EL1_MSA BITS(51, 48) +#define ID_AA64MMFR0_EL1_MSA_frac BITS(55, 52) #define ID_AA64MMFR0_EL1_FGT BITS(59, 56) #define ID_AA64MMFR0_EL1_ECV BITS(63, 60) @@ -96,8 +109,12 @@ #define ID_AA64PFR1_EL1_MTE BITS(11, 8) #define ID_AA64PFR1_EL1_SME BITS(27, 24) +#define ID_AA64PFR1_EL1_CSV2_frac BITS(35, 32) #define ID_AA64PFR1_EL1_THE BITS(51, 48) + +#define ID_AA64PFR0_EL1_RAS BITS(31, 28) #define ID_AA64PFR0_EL1_SVE BITS(35, 32) +#define ID_AA64PFR0_EL1_CSV2 BITS(59, 56) #define ID_AA64SMFR0_EL1 s3_0_c0_c4_5 #define ID_AA64SMFR0_EL1_FA64 BIT(63) @@ -106,7 +123,9 @@ * Initial register values required for the boot-wrapper to run out-of-reset. */ #define SCTLR_EL3_RESET SCTLR_EL3_RES1 +#define CPTR_EL2_RESET CPTR_EL2_NO_E2H_RES1 #define SCTLR_EL2_RESET SCTLR_EL2_RES1 +#define VSTCR_EL2_RESET VSTCR_EL2_RES1 #define SCTLR_EL1_RESET SCTLR_EL1_RES1 #define HCR_EL2_RESET HCR_EL2_RES1 @@ -123,6 +142,7 @@ #define SPSR_I (1 << 7) /* IRQ masked */ #define SPSR_F (1 << 6) /* FIQ masked */ #define SPSR_T (1 << 5) /* Thumb */ +#define SPSR_EL1H (5 << 0) /* EL1 Handler mode */ #define SPSR_EL2H (9 << 0) /* EL2 Handler mode */ #define SPSR_HYP (0x1a << 0) /* M[3:0] = hyp, M[4] = AArch32 */ @@ -135,6 +155,9 @@ #define ICC_CTLR_EL3 S3_6_C12_C12_4 #define ICC_PMR_EL1 S3_0_C4_C6_0 +#define VSTCR_EL2 s3_4_c2_c6_2 +#define VSCTLR_EL2 s3_4_c2_c0_0 + #define ZCR_EL3 s3_6_c1_c2_0 #define ZCR_EL3_LEN_MAX 0xf @@ -162,6 +185,7 @@ #else #define SCTLR_EL1_KERNEL SCTLR_EL1_RES1 #define SPSR_KERNEL (SPSR_A | SPSR_D | SPSR_I | SPSR_F | SPSR_EL2H) +#define SPSR_KERNEL_EL1 (SPSR_A | SPSR_D | SPSR_I | SPSR_F | SPSR_EL1H) #endif #ifndef __ASSEMBLY__ diff --git a/arch/aarch64/init.c b/arch/aarch64/init.c index 81fe33ab80ac..b0abde11ebd6 100644 --- a/arch/aarch64/init.c +++ b/arch/aarch64/init.c @@ -54,6 +54,18 @@ static inline bool cpu_has_permission_indirection(void) return mrs(ID_AA64MMFR3_EL1) & mask; } +static bool cpu_has_scxt(void) +{ + unsigned long csv2 = mrs_field(ID_AA64PFR0_EL1, CSV2); + + if (csv2 >= 2) + return true; + if (csv2 < 1) + return false; + + return mrs_field(ID_AA64PFR1_EL1, CSV2_frac) >= 2; +} + static void cpu_init_el3(void) { unsigned long scr = SCR_EL3_RES1 | SCR_EL3_NS | SCR_EL3_HCE; @@ -157,6 +169,43 @@ static void cpu_init_el3(void) } } +void cpu_init_el2_armv8r(void) +{ + unsigned long hcr = mrs(hcr_el2); + + /* On Armv8-R ID_AA64MMFR0_EL1[51:48] == 0xF */ + if ((mrs_field(ID_AA64MMFR0_EL1, MSA) != 0xF) || + (mrs_field(ID_AA64MMFR0_EL1, MSA_frac) < 2)) + { + print_string("Initialization failed, Armv8-R not detected or VMSA not supported at EL1.\r\n"); + while(1) {} + unreachable(); + } + + msr(vpidr_el2, mrs(midr_el1)); + msr(vmpidr_el2, mrs(mpidr_el1)); + + msr(VSCTLR_EL2, 0); + msr(VSTCR_EL2, VSTCR_EL2_RESET); + msr(vtcr_el2, VTCR_EL2_MSA); + + msr(cntvoff_el2, 0); + msr(cptr_el2, CPTR_EL2_RESET); + msr(mdcr_el2, 0); + + if (cpu_has_scxt()) + hcr |= HCR_EL2_ENSCXT_NOTRAP; + + if (mrs_field(ID_AA64PFR0_EL1, RAS) >= 2) + hcr |= HCR_EL2_FIEN_NOTRAP; + + if (cpu_has_pauth()) + hcr |= HCR_EL2_APK_NOTRAP | HCR_EL2_API_NOTRAP; + + msr(hcr_el2, hcr); + isb(); +} + #ifdef PSCI extern char psci_vectors[]; @@ -181,6 +230,12 @@ void cpu_init_arch(unsigned int cpu) gic_secure_init(); } +#if defined(BOOTWRAPPER_64R) + if (mrs(CurrentEL) == CURRENTEL_EL2) { + cpu_init_el2_armv8r(); + } +#endif + cpu_init_psci_arch(cpu); msr(CNTFRQ_EL0, COUNTER_FREQ); diff --git a/configure.ac b/configure.ac index bba42fa1dba8..88dbf9ba4f08 100644 --- a/configure.ac +++ b/configure.ac @@ -9,14 +9,16 @@ AC_INIT([boot-wrapper], [v0.2]) AM_INIT_AUTOMAKE([foreign]) -# Allow a user to pass --with-bw-arch={aarch64-a,aarch32-a} +# Allow a user to pass --with-bw-arch={aarch64-a,aarch32-a,aarch64-r} AC_ARG_WITH([bw-arch], - AS_HELP_STRING([--with-bw-arch], [aarch64-a selects AArch64-A (default), aarch32-a selects AArch32-A]), + AS_HELP_STRING([--with-bw-arch], [aarch64-a selects AArch64-A (default), aarch32-a selects AArch32-A, aarch64-r selects AArch64-R]), [case "${withval}" in no|yes|aarch64-a) USE_ARCH=aarch64-a ;; aarch32-a) USE_ARCH=aarch32-a ;; - *) AC_MSG_ERROR([Bad value "${withval}" for --with-bw-arch. Use "aarch64-a" or "aarch32-a"]) ;; + aarch64-r) USE_ARCH=aarch64-r ;; + *) AC_MSG_ERROR([Bad value "${withval}" for --with-bw-arch. Use "aarch64-a", "aarch32-a" or "aarch64-r"]) ;; esac]) +AM_CONDITIONAL([BOOTWRAPPER_64R], [test "x$USE_ARCH" = "xaarch64-r"]) AS_IF([test "x$USE_ARCH" = "xaarch32-a"], [BOOTWRAPPER_ES=32], [BOOTWRAPPER_ES=64] From patchwork Wed Jul 31 14:11:02 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luca Fancellu X-Patchwork-Id: 13748843 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 69FFFC3DA64 for ; Wed, 31 Jul 2024 14:13:52 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From: Reply-To:Content-Type:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=SW0FLfGX/HYt/btWyV2rUMOB8zyl8kk9thbIHBu90/M=; b=q3SI72D6UwG4aWvbUwTfBjq6Wx 3ZqUW7cAKvUDbHiBG4is+FmCZJublhi5X3Yvwa5lPEV1jgOPHxBzpDRJtCRzALz6JYlqTmKcOstB5 rnkbUqs61iUoa1URihReA284Ixx4DiCMqKITaojyouz786nPSPDMHlPzuuE55KD75xYz0P67getsv sVxOJJdDMao8C0c63IwlK5/NPrIkxkiVvP1ZTvHX3RsRtSbVT+JZtfC1rU0uNb4EVOXR7ln9MwkG6 L60HSyQJ2gE8W4Jk5x/dKlH8dnTzgTqGCQMYkPztb1BSEGiIk4oiYUyUE1t/kxDbqVxIgzZlnVpnY l+SmTe4g==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1sZA5G-00000001R7a-0b6D; Wed, 31 Jul 2024 14:13:42 +0000 Received: from foss.arm.com ([217.140.110.172]) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1sZA2u-00000001QEF-12om for linux-arm-kernel@lists.infradead.org; Wed, 31 Jul 2024 14:11:19 +0000 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 025951576; Wed, 31 Jul 2024 07:11:41 -0700 (PDT) Received: from e125770.cambridge.arm.com (e125770.arm.com [10.1.199.43]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id B103A3F5A1; Wed, 31 Jul 2024 07:11:14 -0700 (PDT) From: Luca Fancellu To: mark.rutland@arm.com, andre.przywara@arm.com Cc: linux-arm-kernel@lists.infradead.org Subject: [boot-wrapper v3 3/4] aarch64: Implement PSCI for Armv8-R Date: Wed, 31 Jul 2024 15:11:02 +0100 Message-Id: <20240731141103.2559706-4-luca.fancellu@arm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240731141103.2559706-1-luca.fancellu@arm.com> References: <20240731141103.2559706-1-luca.fancellu@arm.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240731_071116_349054_3290AA58 X-CRM114-Status: GOOD ( 12.44 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Armv8-R doesn't have EL3, so the PSCI vector needs to be installed in VBAR_EL2 and the conduit needs to be 'hcv' instead of 'smc'. Implement the modifications needed when --with-bw-arch is 'aarch64-r'. Signed-off-by: Luca Fancellu --- Changes from v2: - Major rework, reason in the cover letter. --- Makefile.am | 2 +- arch/aarch64/init.c | 14 +++++++++++--- configure.ac | 3 +++ 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/Makefile.am b/Makefile.am index bf97b989d5d7..62e2988c0dd3 100644 --- a/Makefile.am +++ b/Makefile.am @@ -57,7 +57,7 @@ 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 b0abde11ebd6..d8cf390dce20 100644 --- a/arch/aarch64/init.c +++ b/arch/aarch64/init.c @@ -211,12 +211,20 @@ extern char psci_vectors[]; static void cpu_init_psci_arch(unsigned int cpu) { - if (mrs(CurrentEL) != CURRENTEL_EL3) { + switch (mrs(CurrentEL)) { +#if !defined(BOOTWRAPPER_64R) + 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: print_cpu_warn(cpu, "PSCI could not be initialized (not booted at EL3).\r\n"); return; } - - msr(VBAR_EL3, (unsigned long)psci_vectors); isb(); } #else diff --git a/configure.ac b/configure.ac index 88dbf9ba4f08..381f82612434 100644 --- a/configure.ac +++ b/configure.ac @@ -107,6 +107,9 @@ AC_ARG_ENABLE([psci], [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_ARCH" = "xaarch64-r"], + AC_SUBST([PSCI_METHOD], [hvc]), AC_SUBST([PSCI_METHOD], [smc]) +) AS_IF([test "x$USE_PSCI" != "xyes" -a "x$KERNEL_ES" = "x32"], [AC_MSG_ERROR([With an AArch32 kernel, boot method must be PSCI.])] From patchwork Wed Jul 31 14:11:03 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luca Fancellu X-Patchwork-Id: 13748844 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 8D029C3DA64 for ; Wed, 31 Jul 2024 14:14:26 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From: Reply-To:Content-Type:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=f7luZx2DOU2MWFZlbvC1OthW7ZXQg6xYWXRk7Y1TmNs=; b=HjL2AYM7o8/t6Yx+1wTtROAwIU kNVUroo4zsINhBSV29pfGWblbDxXQkOkGJ4clcFwxzIwefUuF5+yOwezxLjLR9RCXNLgURKGC/sb7 WBqcyLbwDGbOhkE4hcDzwgSBi2nh4QJakK/yB/r0P4Xr69DteKJuBT9qYdaZV0U6UhOs9UbT+zATR j3zDUn61W3VhSUJcTzKWb9NTyEepzPW+YWprXRLX6qFBb0X6GqMkdg6bQv4WYAwGFvqqidqxv/YsZ cnoIFLavd0pK+LiPkGmi/9XG3KMrg7LWVE54aytvAkw4qG+yw6ZcjDRFxKuJf2UkaalRICcgJk8GT jFnp0jog==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1sZA5m-00000001RLH-1KFw; Wed, 31 Jul 2024 14:14:14 +0000 Received: from foss.arm.com ([217.140.110.172]) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1sZA2v-00000001QF3-1oT7 for linux-arm-kernel@lists.infradead.org; Wed, 31 Jul 2024 14:11:19 +0000 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id E613C1595; Wed, 31 Jul 2024 07:11:41 -0700 (PDT) Received: from e125770.cambridge.arm.com (e125770.arm.com [10.1.199.43]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id A0BCA3F5A1; Wed, 31 Jul 2024 07:11:15 -0700 (PDT) From: Luca Fancellu To: mark.rutland@arm.com, andre.przywara@arm.com Cc: linux-arm-kernel@lists.infradead.org Subject: [boot-wrapper v3 4/4] aarch64: Start Xen on Armv8-R at EL2 Date: Wed, 31 Jul 2024 15:11:03 +0100 Message-Id: <20240731141103.2559706-5-luca.fancellu@arm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240731141103.2559706-1-luca.fancellu@arm.com> References: <20240731141103.2559706-1-luca.fancellu@arm.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240731_071117_584678_AB268033 X-CRM114-Status: GOOD ( 11.82 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org When bootwrapper is compiled with Xen support and it is started at EL2 on Armv8-R AArch64, keep the current EL and jump to the Xen image using the SPSR_KERNEL as spsr_el2 value. Signed-off-by: Luca Fancellu --- Changes from v2: - Major rework, reason in the cover letter. --- Makefile.am | 1 + arch/aarch64/boot.S | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Makefile.am b/Makefile.am index 62e2988c0dd3..0aee117eb827 100644 --- a/Makefile.am +++ b/Makefile.am @@ -113,6 +113,7 @@ XEN_CHOSEN := xen,xen-bootargs = \"$(XEN_CMDLINE)\"; \ compatible = \"xen,linux-zimage\", \"xen,multiboot-module\"; \ reg = <0x0 $(DOM0_OFFSET) 0x0 $(KERNEL_SIZE)>; \ }; +DEFINES += -DXEN endif if INITRD diff --git a/arch/aarch64/boot.S b/arch/aarch64/boot.S index 0b4f6824045a..d50ff48d83de 100644 --- a/arch/aarch64/boot.S +++ b/arch/aarch64/boot.S @@ -100,7 +100,7 @@ ASM_FUNC(jump_kernel) mov x1, x21 mov x2, x22 mov x3, x23 -#if defined(BOOTWRAPPER_64R) +#if defined(BOOTWRAPPER_64R) && !defined(XEN) // On Armv8-R Linux needs to be booted at EL1 mov x4, #SPSR_KERNEL_EL1 #else