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
|
EFI_LDS := elf_riscv64_efi.lds
|
||||||
endif
|
endif
|
||||||
|
|
||||||
CONFIG_STANDALONE_LOAD_ADDR = 0x00000000
|
CONFIG_STANDALONE_LOAD_ADDR ?= 0x00000000
|
||||||
LDFLAGS_STANDALONE += -T $(srctree)/examples/standalone/riscv.lds
|
|
||||||
|
|
||||||
PLATFORM_CPPFLAGS += -ffixed-gp -fpic
|
PLATFORM_CPPFLAGS += -ffixed-gp -fpic
|
||||||
PLATFORM_RELFLAGS += -fno-common -gdwarf-2 -ffunction-sections \
|
PLATFORM_RELFLAGS += -fno-common -gdwarf-2 -ffunction-sections \
|
||||||
|
@ -6,6 +6,28 @@
|
|||||||
|
|
||||||
#include <common.h>
|
#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)
|
void icache_enable(void)
|
||||||
{
|
{
|
||||||
#ifndef CONFIG_SYS_ICACHE_OFF
|
#ifndef CONFIG_SYS_ICACHE_OFF
|
||||||
|
@ -11,13 +11,12 @@ void invalidate_icache_all(void)
|
|||||||
asm volatile ("fence.i" ::: "memory");
|
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)
|
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();
|
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)
|
void cache_flush(void)
|
||||||
@ -42,8 +40,8 @@ void cache_flush(void)
|
|||||||
|
|
||||||
void flush_cache(unsigned long addr, unsigned long size)
|
void flush_cache(unsigned long addr, unsigned long size)
|
||||||
{
|
{
|
||||||
invalidate_icache_all();
|
invalidate_icache_range(addr, addr + size);
|
||||||
flush_dcache_all();
|
flush_dcache_range(addr, addr + size);
|
||||||
}
|
}
|
||||||
|
|
||||||
__weak void icache_enable(void)
|
__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",
|
printf("exception code: %ld , %s , epc %lx , ra %lx\n",
|
||||||
code, exception_code[code], epc, regs->ra);
|
code, exception_code[code], epc, regs->ra);
|
||||||
} else {
|
} else {
|
||||||
printf("Reserved\n");
|
printf("reserved exception code: %ld , epc %lx , ra %lx\n",
|
||||||
|
code, epc, regs->ra);
|
||||||
}
|
}
|
||||||
|
|
||||||
hang();
|
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");
|
: : "i"(offsetof(gd_t, jt)), "i"(FO(x)) : "$r16");
|
||||||
#elif defined(CONFIG_RISCV)
|
#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, ...) \
|
#define EXPORT_FUNC(f, a, x, ...) \
|
||||||
asm volatile ( \
|
asm volatile ( \
|
||||||
" .globl " #x "\n" \
|
" .globl " #x "\n" \
|
||||||
#x ":\n" \
|
#x ":\n" \
|
||||||
" lw x19, %0(gp)\n" \
|
" ld t0, %0(gp)\n" \
|
||||||
" lw x19, %1(x19)\n" \
|
" ld t0, %1(t0)\n" \
|
||||||
" jr x19\n" \
|
" jr t0\n" \
|
||||||
: : "i"(offsetof(gd_t, jt)), "i"(FO(x)) : "x19");
|
: : "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)
|
#elif defined(CONFIG_ARC)
|
||||||
/*
|
/*
|
||||||
* r25 holds the pointer to the global_data. r10 is call clobbered.
|
* 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_SYS_BOOTM_LEN SZ_16M
|
||||||
|
|
||||||
|
#define CONFIG_STANDALONE_LOAD_ADDR 0x80200000
|
||||||
|
|
||||||
/* Environment options */
|
/* Environment options */
|
||||||
#define CONFIG_ENV_SIZE SZ_4K
|
#define CONFIG_ENV_SIZE SZ_4K
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user