Merge git://git.denx.de/u-boot-riscv
1. Improve cache implementation. 2. Fix and improve standalone applications
This commit is contained in:
commit
0cd35f3920
@ -23,8 +23,7 @@ PLATFORM_LDFLAGS += -m $(64bit-emul)
|
||||
EFI_LDS := elf_riscv64_efi.lds
|
||||
endif
|
||||
|
||||
CONFIG_STANDALONE_LOAD_ADDR = 0x00000000
|
||||
LDFLAGS_STANDALONE += -T $(srctree)/examples/standalone/riscv.lds
|
||||
CONFIG_STANDALONE_LOAD_ADDR ?= 0x00000000
|
||||
|
||||
PLATFORM_CPPFLAGS += -ffixed-gp -fpic
|
||||
PLATFORM_RELFLAGS += -fno-common -gdwarf-2 -ffunction-sections \
|
||||
|
@ -6,6 +6,28 @@
|
||||
|
||||
#include <common.h>
|
||||
|
||||
void flush_dcache_all(void)
|
||||
{
|
||||
/*
|
||||
* Andes' AX25 does not have a coherence agent. U-Boot must use data
|
||||
* cache flush and invalidate functions to keep data in the system
|
||||
* coherent.
|
||||
* The implementation of the fence instruction in the AX25 flushes the
|
||||
* data cache and is used for this purpose.
|
||||
*/
|
||||
asm volatile ("fence" ::: "memory");
|
||||
}
|
||||
|
||||
void flush_dcache_range(unsigned long start, unsigned long end)
|
||||
{
|
||||
flush_dcache_all();
|
||||
}
|
||||
|
||||
void invalidate_dcache_range(unsigned long start, unsigned long end)
|
||||
{
|
||||
flush_dcache_all();
|
||||
}
|
||||
|
||||
void icache_enable(void)
|
||||
{
|
||||
#ifndef CONFIG_SYS_ICACHE_OFF
|
||||
|
@ -11,13 +11,12 @@ void invalidate_icache_all(void)
|
||||
asm volatile ("fence.i" ::: "memory");
|
||||
}
|
||||
|
||||
void flush_dcache_all(void)
|
||||
__weak void flush_dcache_all(void)
|
||||
{
|
||||
asm volatile ("fence" :::"memory");
|
||||
}
|
||||
void flush_dcache_range(unsigned long start, unsigned long end)
|
||||
|
||||
__weak void flush_dcache_range(unsigned long start, unsigned long end)
|
||||
{
|
||||
flush_dcache_all();
|
||||
}
|
||||
|
||||
void invalidate_icache_range(unsigned long start, unsigned long end)
|
||||
@ -29,9 +28,8 @@ void invalidate_icache_range(unsigned long start, unsigned long end)
|
||||
invalidate_icache_all();
|
||||
}
|
||||
|
||||
void invalidate_dcache_range(unsigned long start, unsigned long end)
|
||||
__weak void invalidate_dcache_range(unsigned long start, unsigned long end)
|
||||
{
|
||||
flush_dcache_all();
|
||||
}
|
||||
|
||||
void cache_flush(void)
|
||||
@ -42,8 +40,8 @@ void cache_flush(void)
|
||||
|
||||
void flush_cache(unsigned long addr, unsigned long size)
|
||||
{
|
||||
invalidate_icache_all();
|
||||
flush_dcache_all();
|
||||
invalidate_icache_range(addr, addr + size);
|
||||
flush_dcache_range(addr, addr + size);
|
||||
}
|
||||
|
||||
__weak void icache_enable(void)
|
||||
|
@ -37,7 +37,8 @@ static void _exit_trap(ulong code, ulong epc, struct pt_regs *regs)
|
||||
printf("exception code: %ld , %s , epc %lx , ra %lx\n",
|
||||
code, exception_code[code], epc, regs->ra);
|
||||
} else {
|
||||
printf("Reserved\n");
|
||||
printf("reserved exception code: %ld , epc %lx , ra %lx\n",
|
||||
code, epc, regs->ra);
|
||||
}
|
||||
|
||||
hang();
|
||||
|
@ -1,40 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* Copyright (C) 2017 Andes Technology Corporation
|
||||
* Rick Chen, Andes Technology Corporation <rick@andestech.com>
|
||||
*/
|
||||
|
||||
OUTPUT_ARCH(riscv)
|
||||
ENTRY(_start)
|
||||
SECTIONS
|
||||
{
|
||||
. = ALIGN(4);
|
||||
.text :
|
||||
{
|
||||
*(.text)
|
||||
}
|
||||
|
||||
. = ALIGN(4);
|
||||
.data : {
|
||||
__global_pointer$ = . + 0x800;
|
||||
*(.data)
|
||||
}
|
||||
|
||||
. = ALIGN(4);
|
||||
|
||||
.got : {
|
||||
__got_start = .;
|
||||
*(.got)
|
||||
__got_end = .;
|
||||
}
|
||||
|
||||
. = ALIGN(4);
|
||||
__bss_start = .;
|
||||
.bss : { *(.bss) }
|
||||
__bss_end = .;
|
||||
|
||||
. = ALIGN(4);
|
||||
.rela.text : { *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*) }
|
||||
|
||||
_end = .;
|
||||
}
|
@ -174,16 +174,27 @@ gd_t *global_data;
|
||||
: : "i"(offsetof(gd_t, jt)), "i"(FO(x)) : "$r16");
|
||||
#elif defined(CONFIG_RISCV)
|
||||
/*
|
||||
* t7 holds the pointer to the global_data. gp is call clobbered.
|
||||
* gp holds the pointer to the global_data. t0 is call clobbered.
|
||||
*/
|
||||
#ifdef CONFIG_ARCH_RV64I
|
||||
#define EXPORT_FUNC(f, a, x, ...) \
|
||||
asm volatile ( \
|
||||
" .globl " #x "\n" \
|
||||
#x ":\n" \
|
||||
" lw x19, %0(gp)\n" \
|
||||
" lw x19, %1(x19)\n" \
|
||||
" jr x19\n" \
|
||||
: : "i"(offsetof(gd_t, jt)), "i"(FO(x)) : "x19");
|
||||
" ld t0, %0(gp)\n" \
|
||||
" ld t0, %1(t0)\n" \
|
||||
" jr t0\n" \
|
||||
: : "i"(offsetof(gd_t, jt)), "i"(FO(x)) : "t0");
|
||||
#else
|
||||
#define EXPORT_FUNC(f, a, x, ...) \
|
||||
asm volatile ( \
|
||||
" .globl " #x "\n" \
|
||||
#x ":\n" \
|
||||
" lw t0, %0(gp)\n" \
|
||||
" lw t0, %1(t0)\n" \
|
||||
" jr t0\n" \
|
||||
: : "i"(offsetof(gd_t, jt)), "i"(FO(x)) : "t0");
|
||||
#endif
|
||||
#elif defined(CONFIG_ARC)
|
||||
/*
|
||||
* r25 holds the pointer to the global_data. r10 is call clobbered.
|
||||
|
@ -17,6 +17,8 @@
|
||||
|
||||
#define CONFIG_SYS_BOOTM_LEN SZ_16M
|
||||
|
||||
#define CONFIG_STANDALONE_LOAD_ADDR 0x80200000
|
||||
|
||||
/* Environment options */
|
||||
#define CONFIG_ENV_SIZE SZ_4K
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user