Merge git://git.denx.de/u-boot-riscv

1. Improve cache implementation.
2. Fix and improve standalone applications
This commit is contained in:
Tom Rini 2019-01-15 22:05:05 -05:00
commit 0cd35f3920
7 changed files with 49 additions and 56 deletions

View File

@ -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 \

View File

@ -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

View File

@ -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)

View File

@ -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();

View File

@ -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 = .;
}

View File

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

View File

@ -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