mirror of
				https://xff.cz/git/u-boot/
				synced 2025-10-31 10:26:10 +01:00 
			
		
		
		
	This patch fixes an stability issue seen on some vcoreiii targets, which was root caused to a cache inconsistency situation. The inconsistency was caused by having kuseg pointing to NOR area but used as a stack/gd/heap area during initialization, while only relatively late remapping the RAM area into kuseg position. The fix is to initialize the DDR right after the TLB setup, and then remapping it into position before gd/stack/heap usage. Reported-by: Ramin Seyed-Moussavi <ramin.moussavi@yacoub.de> Reviewed-by: Alexandre Belloni <alexandre.belloni@bootlin.com> Reviewed-by: Horatiu Vultur <horatiu.vultur@microchip.com> Signed-off-by: Lars Povlsen <lars.povlsen@microchip.com>
		
			
				
	
	
		
			46 lines
		
	
	
		
			817 B
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			46 lines
		
	
	
		
			817 B
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
| /* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */
 | |
| /*
 | |
|  * Copyright (c) 2018 Microsemi Corporation
 | |
|  */
 | |
| 
 | |
| #include <asm/asm.h>
 | |
| #include <asm/regdef.h>
 | |
| 
 | |
|     .set noreorder
 | |
|     .extern     vcoreiii_tlb_init
 | |
|     .extern     vcoreiii_ddr_init
 | |
| #ifdef CONFIG_SOC_LUTON
 | |
|     .extern     pll_init
 | |
| #endif
 | |
| 
 | |
| LEAF(lowlevel_init)
 | |
| 	/*
 | |
| 	 * As we have no stack yet, we can assume the restricted
 | |
| 	 * luxury of the sX-registers without saving them
 | |
| 	 */
 | |
| 
 | |
| 	/* Modify ra/s0 such we return to physical NOR location */
 | |
| 	li	t0, 0x0fffffff
 | |
| 	li	t1, CONFIG_SYS_TEXT_BASE
 | |
| 	and	s0, ra, t0
 | |
| 	add	s0, s0, t1
 | |
| 
 | |
| 	jal	vcoreiii_tlb_init
 | |
| 	 nop
 | |
| 
 | |
| #ifdef CONFIG_SOC_LUTON
 | |
| 	jal	pll_init
 | |
| 	 nop
 | |
| #endif
 | |
| 
 | |
| 	/* Initialize DDR controller to enable stack/gd/heap */
 | |
| 0:
 | |
| 	jal	vcoreiii_ddr_init
 | |
| 	 nop
 | |
| 	bnez	v0, 0b		/* Retry on error */
 | |
| 	 nop
 | |
| 
 | |
| 	jr	s0
 | |
| 	 nop
 | |
| 	END(lowlevel_init)
 |