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.przyw...@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.skra...@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




Reply via email to