From: Andre Przywara <andre.przywara@arm.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH v2 11/23] sunxi: A64: do an RMR switch if started in AArch32 mode
Date: Mon, 5 Dec 2016 01:52:18 +0000 [thread overview]
Message-ID: <1480902750-839-12-git-send-email-andre.przywara@arm.com> (raw)
In-Reply-To: <1480902750-839-1-git-send-email-andre.przywara@arm.com>
The Allwinner A64 SoC starts execution in AArch32 mode, and both
the boot ROM and Allwinner's boot0 keep running in this mode.
So U-Boot gets entered in 32-bit, although we want it to run in AArch64.
By using a "magic" instruction, which happens to be an almost-NOP in
AArch64 and a branch in AArch32, we differentiate between being
entered in 64-bit or 32-bit mode.
If in 64-bit mode, we proceed with the branch to reset, but in 32-bit
mode we trigger an RMR write to bring the core into AArch64/EL3 and
re-enter U-Boot at CONFIG_SYS_TEXT_BASE.
This allows a 64-bit U-Boot to be both entered in 32 and 64-bit mode,
so we can use the same start code for the SPL and the U-Boot proper.
We use the existing custom header (boot0.h) functionality, but restrict
the existing boot0 header reservation to the non-SPL build now. A SPL
wouldn't need such header anyway. This allows to have both options
defined and lets us use one for the SPL and the other for U-Boot proper.
Signed-off-by: Andre Przywara <andre.przywara@arm.com>
---
arch/arm/include/asm/arch-sunxi/boot0.h | 27 +++++++++++++++++++++++++++
board/sunxi/Kconfig | 5 +++++
2 files changed, 32 insertions(+)
diff --git a/arch/arm/include/asm/arch-sunxi/boot0.h b/arch/arm/include/asm/arch-sunxi/boot0.h
index 6a13db5..7799a03 100644
--- a/arch/arm/include/asm/arch-sunxi/boot0.h
+++ b/arch/arm/include/asm/arch-sunxi/boot0.h
@@ -4,6 +4,33 @@
* SPDX-License-Identifier: GPL-2.0+
*/
+#if defined(CONFIG_RESERVE_ALLWINNER_BOOT0_HEADER) && !defined(CONFIG_SPL_BUILD)
/* reserve space for BOOT0 header information */
b reset
.space 1532
+#elif defined(CONFIG_ARM_BOOT_HOOK_RMR)
+/* switch into AArch64 if needed */
+ tst x0, x0 // this is "b #0x84" in ARM
+ b reset
+ .space 0x7c
+ .word 0xe59f1024 // ldr r1, [pc, #36] ; 0x170000a0
+ .word 0xe59f0024 // ldr r0, [pc, #36] ; CONFIG_*_TEXT_BASE
+ .word 0xe5810000 // str r0, [r1]
+ .word 0xf57ff04f // dsb sy
+ .word 0xf57ff06f // isb sy
+ .word 0xee1c0f50 // mrc 15, 0, r0, cr12, cr0, {2} ; RMR
+ .word 0xe3800003 // orr r0, r0, #3
+ .word 0xee0c0f50 // mcr 15, 0, r0, cr12, cr0, {2} ; RMR
+ .word 0xf57ff06f // isb sy
+ .word 0xe320f003 // wfi
+ .word 0xeafffffd // b @wfi
+ .word 0x017000a0 // writeable RVBAR mapping address
+#ifdef CONFIG_SPL_BUILD
+ .word CONFIG_SPL_TEXT_BASE
+#else
+ .word CONFIG_SYS_TEXT_BASE
+#endif
+#else
+/* normal execution */
+ b reset
+#endif
diff --git a/board/sunxi/Kconfig b/board/sunxi/Kconfig
index 0cd57a2..ba72e76 100644
--- a/board/sunxi/Kconfig
+++ b/board/sunxi/Kconfig
@@ -142,6 +142,11 @@ config RESERVE_ALLWINNER_BOOT0_HEADER
blob relies on this information to load and execute U-Boot.
Only needed on 64-bit Allwinner boards so far when using boot0.
+config ARM_BOOT_HOOK_RMR
+ bool
+ default y if ARM64
+ select ENABLE_ARM_SOC_BOOT0_HOOK
+
config DRAM_TYPE
int "sunxi dram type"
depends on MACH_SUN8I_A83T
--
2.8.2
next prev parent reply other threads:[~2016-12-05 1:52 UTC|newest]
Thread overview: 95+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-12-05 1:52 [U-Boot] [PATCH v2 00/23] sunxi: Allwinner A64: SPL support Andre Przywara
2016-12-05 1:52 ` [U-Boot] [PATCH v2 01/23] sun6i: Restrict some register initialization to Allwinner A31 SoC Andre Przywara
2016-12-05 6:25 ` Simon Glass
2016-12-05 7:17 ` Maxime Ripard
2016-12-05 1:52 ` [U-Boot] [PATCH v2 02/23] armv8: prevent using THUMB Andre Przywara
2016-12-05 6:25 ` Simon Glass
2016-12-05 7:30 ` Maxime Ripard
2016-12-05 21:57 ` Tom Rini
2016-12-05 1:52 ` [U-Boot] [PATCH v2 03/23] armv8: add lowlevel_init.S Andre Przywara
2016-12-05 6:26 ` Simon Glass
2016-12-17 2:55 ` André Przywara
2016-12-17 22:46 ` Simon Glass
2016-12-05 21:56 ` Tom Rini
2016-12-06 8:04 ` André Przywara
2016-12-06 12:18 ` Tom Rini
2016-12-05 1:52 ` [U-Boot] [PATCH v2 04/23] SPL: tiny-printf: add "l" modifier Andre Przywara
2016-12-05 6:25 ` Simon Glass
2016-12-05 8:01 ` Siarhei Siamashka
2016-12-05 1:52 ` [U-Boot] [PATCH v2 05/23] move UL() macro from armv8/mmu.h into common.h Andre Przywara
2016-12-05 6:25 ` Simon Glass
2016-12-05 1:52 ` [U-Boot] [PATCH v2 06/23] SPL: make struct spl_image 64-bit safe Andre Przywara
2016-12-05 6:25 ` Simon Glass
2016-12-05 22:04 ` Tom Rini
2016-12-06 10:49 ` Maxime Ripard
2016-12-05 1:52 ` [U-Boot] [PATCH v2 07/23] armv8: add simple sdelay implementation Andre Przywara
2016-12-05 6:25 ` Simon Glass
2016-12-05 1:52 ` [U-Boot] [PATCH v2 08/23] armv8: move reset branch into boot hook Andre Przywara
2016-12-05 6:25 ` Simon Glass
2016-12-05 13:43 ` Andre Przywara
2016-12-08 22:21 ` Simon Glass
2016-12-05 1:52 ` [U-Boot] [PATCH v2 09/23] ARM: boot0 hook: remove macro, include whole header file Andre Przywara
2016-12-05 6:25 ` Simon Glass
2016-12-30 20:13 ` Steve Rae
2016-12-05 1:52 ` [U-Boot] [PATCH v2 10/23] sunxi: introduce extra config option for boot0 header Andre Przywara
2016-12-05 6:25 ` Simon Glass
2016-12-05 15:49 ` Andre Przywara
2016-12-06 10:52 ` Maxime Ripard
2016-12-05 1:52 ` Andre Przywara [this message]
2016-12-05 6:25 ` [U-Boot] [PATCH v2 11/23] sunxi: A64: do an RMR switch if started in AArch32 mode Simon Glass
2016-12-05 10:41 ` Andre Przywara
2016-12-06 10:56 ` Maxime Ripard
2016-12-05 1:52 ` [U-Boot] [PATCH v2 12/23] sunxi: provide default DRAM config for sun50i in Kconfig Andre Przywara
2016-12-05 6:25 ` Simon Glass
2016-12-06 10:56 ` Maxime Ripard
2016-12-06 11:21 ` Andre Przywara
2016-12-12 12:33 ` Maxime Ripard
2016-12-05 1:52 ` [U-Boot] [PATCH v2 13/23] sunxi: H3: add and rename some DRAM contoller registers Andre Przywara
2016-12-05 6:26 ` Simon Glass
2016-12-17 2:30 ` André Przywara
2016-12-06 10:58 ` Maxime Ripard
2016-12-05 1:52 ` [U-Boot] [PATCH v2 14/23] sunxi: H3: add DRAM controller single bit delay support Andre Przywara
2016-12-05 6:26 ` Simon Glass
2016-12-05 7:58 ` Chen-Yu Tsai
2016-12-05 11:28 ` Andre Przywara
2016-12-07 3:48 ` Simon Glass
2016-12-17 2:33 ` André Przywara
2016-12-06 11:02 ` Maxime Ripard
2016-12-05 1:52 ` [U-Boot] [PATCH v2 15/23] sunxi: A64: use H3 DRAM initialization code for A64 Andre Przywara
2016-12-05 6:26 ` Simon Glass
2016-12-16 17:30 ` Andre Przywara
2016-12-17 22:48 ` Simon Glass
2016-12-06 11:20 ` Maxime Ripard
2016-12-06 14:15 ` Andre Przywara
2016-12-12 12:29 ` Maxime Ripard
2016-12-12 16:06 ` Andre Przywara
2016-12-05 1:52 ` [U-Boot] [PATCH v2 16/23] sunxi: H3/A64: fix non-ODT setting Andre Przywara
2016-12-05 6:26 ` Simon Glass
2016-12-05 1:52 ` [U-Boot] [PATCH v2 17/23] sunxi: DRAM: fix H3 DRAM size display on aarch64 Andre Przywara
2016-12-05 6:26 ` Simon Glass
2016-12-05 1:52 ` [U-Boot] [PATCH v2 18/23] sunxi: A64: enable SPL Andre Przywara
2016-12-05 6:26 ` Simon Glass
2016-12-16 17:40 ` Andre Przywara
2016-12-17 22:48 ` Simon Glass
2016-12-05 1:52 ` [U-Boot] [PATCH v2 19/23] SPL: read and store arch property from U-Boot image Andre Przywara
2016-12-05 22:56 ` Tom Rini
2016-12-05 1:52 ` [U-Boot] [PATCH v2 20/23] Makefile: use "arm64" architecture for U-Boot image files Andre Przywara
2016-12-05 23:11 ` Tom Rini
2016-12-05 1:52 ` [U-Boot] [PATCH v2 21/23] ARM: SPL/FIT: differentiate between arm and arm64 arch properties Andre Przywara
2016-12-06 0:27 ` Tom Rini
2016-12-05 1:52 ` [U-Boot] [PATCH v2 22/23] sunxi: introduce RMR switch to enter payloads in 64-bit mode Andre Przywara
2016-12-05 6:26 ` Simon Glass
2016-12-05 1:52 ` [U-Boot] [PATCH v2 23/23] sunxi: A64: add 32-bit SPL support Andre Przywara
2016-12-05 6:26 ` Simon Glass
2016-12-17 14:44 ` André Przywara
2016-12-19 8:20 ` Maxime Ripard
2016-12-19 10:26 ` Andre Przywara
2016-12-06 11:28 ` Maxime Ripard
2016-12-06 12:22 ` Andre Przywara
2016-12-12 15:13 ` Maxime Ripard
2016-12-12 16:04 ` Andre Przywara
2016-12-12 16:18 ` Chen-Yu Tsai
2016-12-12 16:32 ` Andre Przywara
2016-12-16 14:52 ` Maxime Ripard
2016-12-16 15:39 ` Andre Przywara
2016-12-19 8:17 ` Maxime Ripard
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1480902750-839-12-git-send-email-andre.przywara@arm.com \
--to=andre.przywara@arm.com \
--cc=u-boot@lists.denx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.