[PATCH 07/20] RISC-V: support incoherent I-Cache
Ahmad Fatoum
a.fatoum at pengutronix.de
Mon May 31 00:40:30 PDT 2021
Hello Antony,
On 31.05.21 09:38, Ahmad Fatoum wrote:
> SiFive SoCs have separate I-Caches that require self-modifying code
> like barebox' relocation and PBL extraction code to do cache
> maintenance. Implement sync_caches_for_execution and use it where
> appropriate.
>
> Signed-off-by: Ahmad Fatoum <a.fatoum at pengutronix.de>
> ---
> arch/riscv/Kconfig.socs | 2 ++
> arch/riscv/boot/uncompress.c | 2 ++
> arch/riscv/cpu/core.c | 7 +++++++
> arch/riscv/include/asm/barebox-riscv.h | 2 ++
> arch/riscv/lib/reloc.c | 8 ++++++++
> arch/riscv/lib/setupc.S | 2 ++
> 6 files changed, 23 insertions(+)
>
> diff --git a/arch/riscv/Kconfig.socs b/arch/riscv/Kconfig.socs
> index 9c82a36fe4bd..d2970ba1d67f 100644
> --- a/arch/riscv/Kconfig.socs
> +++ b/arch/riscv/Kconfig.socs
> @@ -18,6 +18,7 @@ config SOC_VIRT
> select RISCV_S_MODE
> select BOARD_RISCV_GENERIC_DT
> select CLINT_TIMER
> + select HAS_CACHE
> help
> Generates an image tht can be be booted by QEMU. The image is called
> barebox-dt-2nd.img
> @@ -30,6 +31,7 @@ config SOC_SIFIVE
> select RISCV_TIMER
> select HAS_MACB
> select HAS_ASM_DEBUG_LL
> + select HAS_CACHE
> help
> This enables support for SiFive SoC platform hardware.
>
> diff --git a/arch/riscv/boot/uncompress.c b/arch/riscv/boot/uncompress.c
> index 35a91e8cb62a..9f1d25efb59b 100644
> --- a/arch/riscv/boot/uncompress.c
> +++ b/arch/riscv/boot/uncompress.c
> @@ -63,6 +63,8 @@ void __noreturn barebox_pbl_start(unsigned long membase, unsigned long memsize,
>
> pbl_barebox_uncompress((void*)barebox_base, pg_start, pg_len);
>
> + sync_caches_for_execution();
> +
> barebox = (void *)barebox_base;
>
> pr_debug("jumping to uncompressed image at 0x%p. dtb=0x%p\n", barebox, fdt);
> diff --git a/arch/riscv/cpu/core.c b/arch/riscv/cpu/core.c
> index 62eb0ca87164..b4727fe7449b 100644
> --- a/arch/riscv/cpu/core.c
> +++ b/arch/riscv/cpu/core.c
> @@ -18,6 +18,7 @@
> #include <linux/clk.h>
> #include <linux/err.h>
> #include <memory.h>
> +#include <asm/barebox-riscv.h>
> #include <asm-generic/memory_layout.h>
> #include <globalvar.h>
> #include <magicvar.h>
> @@ -91,3 +92,9 @@ static struct driver_d riscv_driver = {
> .of_compatible = riscv_dt_ids,
> };
> postcore_platform_driver(riscv_driver);
> +
> +static void arch_shutdown(void)
> +{
> + sync_caches_for_execution();
> +}
> +archshutdown_exitcall(arch_shutdown);
> diff --git a/arch/riscv/include/asm/barebox-riscv.h b/arch/riscv/include/asm/barebox-riscv.h
> index bbe6cd040642..abb320242769 100644
> --- a/arch/riscv/include/asm/barebox-riscv.h
> +++ b/arch/riscv/include/asm/barebox-riscv.h
> @@ -27,6 +27,8 @@ void setup_c(void);
> void relocate_to_current_adr(void);
> void relocate_to_adr(unsigned long target);
>
> +void sync_caches_for_execution(void);
> +
> void __noreturn __naked barebox_riscv_entry(unsigned long membase, unsigned long memsize,
> void *boarddata, unsigned int flags);
>
> diff --git a/arch/riscv/lib/reloc.c b/arch/riscv/lib/reloc.c
> index 2fc8818cd698..165190775361 100644
> --- a/arch/riscv/lib/reloc.c
> +++ b/arch/riscv/lib/reloc.c
> @@ -24,6 +24,12 @@
>
> #define RISC_R_TYPE(x) ((x) & 0xFF)
>
> +void sync_caches_for_execution(void)
> +{
> + if (IS_ENABLED(CONFIG_HAS_CACHE))
> + asm volatile ("fence.i" ::: "memory");
If Erizo on FPGA chokes on this, we can have it pass
along a feature flag from PBL that says it doesn't
need cache maintenance. Please advise.
> +}
> +
> void relocate_to_current_adr(void)
> {
> unsigned long offset;
> @@ -63,4 +69,6 @@ void relocate_to_current_adr(void)
> panic("");
> }
> }
> +
> + sync_caches_for_execution();
> }
> diff --git a/arch/riscv/lib/setupc.S b/arch/riscv/lib/setupc.S
> index 5fdd81c2c3ec..d225186c79fd 100644
> --- a/arch/riscv/lib/setupc.S
> +++ b/arch/riscv/lib/setupc.S
> @@ -46,6 +46,8 @@ ENTRY(relocate_to_adr)
>
> jal __memcpy
>
> + jal sync_caches_for_execution
> +
> REG_L a0, (SZREG * 1)(sp)
> jr a0 /* jump to relocated address */
> copied:
>
--
Pengutronix e.K. | |
Steuerwalder Str. 21 | http://www.pengutronix.de/ |
31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
More information about the barebox
mailing list