mirror of
				https://github.com/smaeul/u-boot.git
				synced 2025-10-31 12:08:19 +00:00 
			
		
		
		
	Override 'lowlevel_init' to make sure secondary CPUs trapped in ATF instead of SPL. After ATF is initialized, it will signal the secondary CPUs to jump from SPL to ATF waiting to be 'activated' by Linux OS via PSCI call. Signed-off-by: Chee Hong Ang <chee.hong.ang@intel.com>
		
			
				
	
	
		
			77 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			77 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
| /*
 | |
|  * Copyright (C) 2020 Intel Corporation. All rights reserved
 | |
|  *
 | |
|  * SPDX-License-Identifier:    GPL-2.0
 | |
|  */
 | |
| 
 | |
| #include <asm-offsets.h>
 | |
| #include <config.h>
 | |
| #include <linux/linkage.h>
 | |
| #include <asm/macro.h>
 | |
| 
 | |
| ENTRY(lowlevel_init)
 | |
| 	mov	x29, lr			/* Save LR */
 | |
| 
 | |
| #if defined(CONFIG_GICV2) || defined(CONFIG_GICV3)
 | |
| #if defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_ATF)
 | |
| wait_for_atf:
 | |
| 	ldr	x4, =CPU_RELEASE_ADDR
 | |
| 	ldr	x5, [x4]
 | |
| 	cbz	x5, slave_wait_atf
 | |
| 	br	x5
 | |
| slave_wait_atf:
 | |
| 	branch_if_slave x0, wait_for_atf
 | |
| #else
 | |
| 	branch_if_slave x0, 1f
 | |
| #endif
 | |
| 	ldr	x0, =GICD_BASE
 | |
| 	bl	gic_init_secure
 | |
| 1:
 | |
| #if defined(CONFIG_GICV3)
 | |
| 	ldr	x0, =GICR_BASE
 | |
| 	bl	gic_init_secure_percpu
 | |
| #elif defined(CONFIG_GICV2)
 | |
| 	ldr	x0, =GICD_BASE
 | |
| 	ldr	x1, =GICC_BASE
 | |
| 	bl	gic_init_secure_percpu
 | |
| #endif
 | |
| #endif
 | |
| 
 | |
| #ifdef CONFIG_ARMV8_MULTIENTRY
 | |
| 	branch_if_master x0, x1, 2f
 | |
| 
 | |
| 	/*
 | |
| 	 * Slave should wait for master clearing spin table.
 | |
| 	 * This sync prevent slaves observing incorrect
 | |
| 	 * value of spin table and jumping to wrong place.
 | |
| 	 */
 | |
| #if defined(CONFIG_GICV2) || defined(CONFIG_GICV3)
 | |
| #ifdef CONFIG_GICV2
 | |
| 	ldr	x0, =GICC_BASE
 | |
| #endif
 | |
| 	bl	gic_wait_for_interrupt
 | |
| #endif
 | |
| 
 | |
| 	/*
 | |
| 	 * All slaves will enter EL2 and optionally EL1.
 | |
| 	 */
 | |
| 	adr	x4, lowlevel_in_el2
 | |
| 	ldr	x5, =ES_TO_AARCH64
 | |
| 	bl	armv8_switch_to_el2
 | |
| 
 | |
| lowlevel_in_el2:
 | |
| #ifdef CONFIG_ARMV8_SWITCH_TO_EL1
 | |
| 	adr	x4, lowlevel_in_el1
 | |
| 	ldr	x5, =ES_TO_AARCH64
 | |
| 	bl	armv8_switch_to_el1
 | |
| 
 | |
| lowlevel_in_el1:
 | |
| #endif
 | |
| 
 | |
| #endif /* CONFIG_ARMV8_MULTIENTRY */
 | |
| 
 | |
| 2:
 | |
| 	mov	lr, x29			/* Restore LR */
 | |
| 	ret
 | |
| ENDPROC(lowlevel_init)
 |