87 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			87 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
	
	
| // SPDX-License-Identifier: GPL-2.0+
 | |
| /*
 | |
|  * Copyright 2016 - 2017 Xilinx, Inc.
 | |
|  *
 | |
|  * Michal Simek <michal.simek@xilinx.com>
 | |
|  */
 | |
| 
 | |
| #include <common.h>
 | |
| #include <asm/io.h>
 | |
| #include <asm/arch/hardware.h>
 | |
| #include <asm/arch/sys_proto.h>
 | |
| 
 | |
| /*
 | |
|  * atfhandoffparams
 | |
|  * Parameter	bitfield	encoding
 | |
|  * -----------------------------------------------------------------------------
 | |
|  * Exec State	0	0 -> Aarch64, 1-> Aarch32
 | |
|  * endianness	1	0 -> LE, 1 -> BE
 | |
|  * secure (TZ)	2	0 -> Non secure, 1 -> secure
 | |
|  * EL		3:4	00 -> EL0, 01 -> EL1, 10 -> EL2, 11 -> EL3
 | |
|  * CPU#		5:6	00 -> A53_0, 01 -> A53_1, 10 -> A53_2, 11 -> A53_3
 | |
|  */
 | |
| 
 | |
| #define FSBL_FLAGS_ESTATE_SHIFT		0
 | |
| #define FSBL_FLAGS_ESTATE_MASK		(1 << FSBL_FLAGS_ESTATE_SHIFT)
 | |
| #define FSBL_FLAGS_ESTATE_A64		0
 | |
| #define FSBL_FLAGS_ESTATE_A32		1
 | |
| 
 | |
| #define FSBL_FLAGS_ENDIAN_SHIFT		1
 | |
| #define FSBL_FLAGS_ENDIAN_MASK		(1 << FSBL_FLAGS_ENDIAN_SHIFT)
 | |
| #define FSBL_FLAGS_ENDIAN_LE		0
 | |
| #define FSBL_FLAGS_ENDIAN_BE		1
 | |
| 
 | |
| #define FSBL_FLAGS_TZ_SHIFT		2
 | |
| #define FSBL_FLAGS_TZ_MASK		(1 << FSBL_FLAGS_TZ_SHIFT)
 | |
| #define FSBL_FLAGS_NON_SECURE		0
 | |
| #define FSBL_FLAGS_SECURE		1
 | |
| 
 | |
| #define FSBL_FLAGS_EL_SHIFT		3
 | |
| #define FSBL_FLAGS_EL_MASK		(3 << FSBL_FLAGS_EL_SHIFT)
 | |
| #define FSBL_FLAGS_EL0			0
 | |
| #define FSBL_FLAGS_EL1			1
 | |
| #define FSBL_FLAGS_EL2			2
 | |
| #define FSBL_FLAGS_EL3			3
 | |
| 
 | |
| #define FSBL_FLAGS_CPU_SHIFT		5
 | |
| #define FSBL_FLAGS_CPU_MASK		(3 << FSBL_FLAGS_CPU_SHIFT)
 | |
| #define FSBL_FLAGS_A53_0		0
 | |
| #define FSBL_FLAGS_A53_1		1
 | |
| #define FSBL_FLAGS_A53_2		2
 | |
| #define FSBL_FLAGS_A53_3		3
 | |
| 
 | |
| #define FSBL_MAX_PARTITIONS		8
 | |
| 
 | |
| /* Structure corresponding to each partition entry */
 | |
| struct xfsbl_partition {
 | |
| 	uint64_t entry_point;
 | |
| 	uint64_t flags;
 | |
| };
 | |
| 
 | |
| /* Structure for handoff parameters to ARM Trusted Firmware (ATF) */
 | |
| struct xfsbl_atf_handoff_params {
 | |
| 	uint8_t magic[4];
 | |
| 	uint32_t num_entries;
 | |
| 	struct xfsbl_partition partition[FSBL_MAX_PARTITIONS];
 | |
| };
 | |
| 
 | |
| #ifdef CONFIG_SPL_OS_BOOT
 | |
| void handoff_setup(void)
 | |
| {
 | |
| 	struct xfsbl_atf_handoff_params *atfhandoffparams;
 | |
| 
 | |
| 	atfhandoffparams = (void *)CONFIG_SPL_TEXT_BASE;
 | |
| 	atfhandoffparams->magic[0] = 'X';
 | |
| 	atfhandoffparams->magic[1] = 'L';
 | |
| 	atfhandoffparams->magic[2] = 'N';
 | |
| 	atfhandoffparams->magic[3] = 'X';
 | |
| 
 | |
| 	atfhandoffparams->num_entries = 1;
 | |
| 	atfhandoffparams->partition[0].entry_point = CONFIG_SYS_TEXT_BASE;
 | |
| 	atfhandoffparams->partition[0].flags = FSBL_FLAGS_EL2 <<
 | |
| 					       FSBL_FLAGS_EL_SHIFT;
 | |
| 
 | |
| 	writel(CONFIG_SPL_TEXT_BASE, &pmu_base->gen_storage6);
 | |
| }
 | |
| #endif
 |