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