[RFC PATCH] sunxi: arm64: boot0.h: runtime check for RVBAR address

Jernej Škrabec jernej.skrabec at gmail.com
Sat Apr 8 08:27:22 CEST 2023


Dne sreda, 05. april 2023 ob 22:30:11 CEST je Andre Przywara napisal(a):
> Some SoCs of the H616 family use a die variant, that puts some CPU power
> and reset control registers at a different address. There are examples
> of two instances of the same board, using different die revisions of the
> otherwise same H313 SoC. We need to write to a register in that block
> *very* early in the SPL boot, to switch the core to AArch64.
> 
> Since the devices are otherwise indistinguishable, let the SPL code read
> that die variant and use the respective RVBAR address based on that.
> That is a bit tricky, since we need to do that in hand-coded AArch32
> machine language, shared by all 64-bit SoCs. To avoid build dependencies
> in this mess, we always provide two addresses to choose from, and just
> give identical values for all other SoCs. This allows the same code to
> run on all 64-bit SoCs, and controls this switch behaviour purely from
> Kconfig.
> 
> Signed-off-by: Andre Przywara <andre.przywara at arm.com>
> ---
> Hi,
> 
> this patch goes on top of the two patches I sent earlier, that
> introduce CONFIG_SUNXI_RVBAR_ADDRESS. I don't have a device with that
> die variant, so just roughly tested this by inverting the ldrne and
> swapping the addresses.
> Please let me know if you have such a device and can confirm that this
> code works on the original and alternative die alike.
> 
> Cheers,
> Andre
> 
>  arch/arm/include/asm/arch-sunxi/boot0.h | 14 ++++++++++----
>  arch/arm/mach-sunxi/Kconfig             | 17 ++++++++++++++++-
>  2 files changed, 26 insertions(+), 5 deletions(-)
> 
> diff --git a/arch/arm/include/asm/arch-sunxi/boot0.h
> b/arch/arm/include/asm/arch-sunxi/boot0.h index 1a396f78488..b27df3b9b5e
> 100644
> --- a/arch/arm/include/asm/arch-sunxi/boot0.h
> +++ b/arch/arm/include/asm/arch-sunxi/boot0.h
> @@ -20,8 +20,8 @@
>  	b       reset
>  	.space  0x7c
> 
> -	.word	0xe28f0058	// add     r0, pc, #88
> -	.word	0xe59f1054	// ldr     r1, [pc, #84]
> +	.word	0xe28f0070	// add     r0, pc, #112	 // @(fel_stash - 
.)
> +	.word	0xe59f106c	// ldr     r1, [pc, #108] // fel_stash - .
>  	.word	0xe0800001	// add     r0, r0, r1
>  	.word	0xe580d000	// str     sp, [r0]
>  	.word	0xe580e004	// str     lr, [r0, #4]
> @@ -32,8 +32,12 @@
>  	.word	0xee1cef10	// mrc     15, 0, lr, cr12, cr0, {0}
>  	.word	0xe580e010	// str     lr, [r0, #16]
> 
> -	.word	0xe59f1024	// ldr     r1, [pc, #36] ; 0x170000a0
> -	.word	0xe59f0024	// ldr     r0, [pc, #36] ; 
CONFIG_*_TEXT_BASE
> +	.word	0xe59f1034	// ldr     r1, [pc, #52] ; RVBAR_ADDRESS
> +	.word	0xe59f0034	// ldr     r0, [pc, #52] ; SUNXI_SRAMC_BASE
> +	.word	0xe5900024	// ldr     r0, [r0, #36] ; SRAM_VER_REG
> +	.word	0xe21000ff	// ands    r0, r0, #255    ; 0xff
> +	.word	0x159f102c	// ldrne   r1, [pc, #44] ; RVBAR_ALTERNATIVE
> +	.word	0xe59f002c	// ldr     r0, [pc, #44] ; CONFIG_*TEXT_BASE
>  	.word	0xe5810000	// str     r0, [r1]
>  	.word	0xf57ff04f	// dsb     sy
>  	.word	0xf57ff06f	// isb     sy
> @@ -45,6 +49,8 @@
>  	.word	0xeafffffd	// b       @wfi
> 
>  	.word	CONFIG_SUNXI_RVBAR_ADDRESS	// writable RVBAR 
mapping addr
> +	.word	SUNXI_SRAMC_BASE
> +	.word	CONFIG_SUNXI_RVBAR_ALTERNATIVE	// address for die 
variant
>  #ifdef CONFIG_SPL_BUILD
>  	.word	CONFIG_SPL_TEXT_BASE
>  #else
> diff --git a/arch/arm/mach-sunxi/Kconfig b/arch/arm/mach-sunxi/Kconfig
> index 0527b3863a7..be0910499bb 100644
> --- a/arch/arm/mach-sunxi/Kconfig
> +++ b/arch/arm/mach-sunxi/Kconfig
> @@ -111,7 +111,7 @@ config SUNXI_SRAM_ADDRESS
>  	SRAM to a different address.
> 
>  config SUNXI_RVBAR_ADDRESS
> -	hex "RVBAR address"
> +	hex
>  	depends on ARM64
>  	default 0x09010040 if SUN50I_GEN_H6
>  	default 0x017000a0
> @@ -122,6 +122,21 @@ config SUNXI_RVBAR_ADDRESS
>  	entry point when switching to AArch64. This store is on different
>  	addresses, depending on the SoC.
> 
> +config SUNXI_RVBAR_ALTERNATIVE
> +	hex
> +	depends on ARM64
> +	default 0x81000040 if MACH_SUN50I_H616

As discussed on IRC by warpme, above default has a typo.

Apart from that, changes look good, so once fixed:
Reviewed-by: Jernej Skrabec <jernej.skrabec at gmail.com>

Best regards,
Jernej

> +	default 0x09010040 if SUN50I_GEN_H6
> +	default 0x017000a0
> +	---help---
> +	The H616 die exists is at least two variants, with one having the
> +	RVBAR registers at a different address. If the SoC variant ID
> +	(stored in SRAM_VER_REG[7:0]) is not 0, we need to use the
> +	other address.
> +	Set this alternative address to the same as the normal address
> +	for all other SoCs, so the content of the SRAM_VER_REG becomes
> +	irrelevant there, and we can use the same code.
> +
>  config SUNXI_A64_TIMER_ERRATUM
>  	bool






More information about the U-Boot mailing list