2 * Copyright 2016 - 2017 Xilinx, Inc.
4 * Michal Simek <michal.simek@xilinx.com>
6 * SPDX-License-Identifier: GPL-2.0+
11 #include <asm/arch/hardware.h>
12 #include <asm/arch/sys_proto.h>
16 * Parameter bitfield encoding
17 * -----------------------------------------------------------------------------
18 * Exec State 0 0 -> Aarch64, 1-> Aarch32
19 * endianness 1 0 -> LE, 1 -> BE
20 * secure (TZ) 2 0 -> Non secure, 1 -> secure
21 * EL 3:4 00 -> EL0, 01 -> EL1, 10 -> EL2, 11 -> EL3
22 * CPU# 5:6 00 -> A53_0, 01 -> A53_1, 10 -> A53_2, 11 -> A53_3
25 #define FSBL_FLAGS_ESTATE_SHIFT 0
26 #define FSBL_FLAGS_ESTATE_MASK (1 << FSBL_FLAGS_ESTATE_SHIFT)
27 #define FSBL_FLAGS_ESTATE_A64 0
28 #define FSBL_FLAGS_ESTATE_A32 1
30 #define FSBL_FLAGS_ENDIAN_SHIFT 1
31 #define FSBL_FLAGS_ENDIAN_MASK (1 << FSBL_FLAGS_ENDIAN_SHIFT)
32 #define FSBL_FLAGS_ENDIAN_LE 0
33 #define FSBL_FLAGS_ENDIAN_BE 1
35 #define FSBL_FLAGS_TZ_SHIFT 2
36 #define FSBL_FLAGS_TZ_MASK (1 << FSBL_FLAGS_TZ_SHIFT)
37 #define FSBL_FLAGS_NON_SECURE 0
38 #define FSBL_FLAGS_SECURE 1
40 #define FSBL_FLAGS_EL_SHIFT 3
41 #define FSBL_FLAGS_EL_MASK (3 << FSBL_FLAGS_EL_SHIFT)
42 #define FSBL_FLAGS_EL0 0
43 #define FSBL_FLAGS_EL1 1
44 #define FSBL_FLAGS_EL2 2
45 #define FSBL_FLAGS_EL3 3
47 #define FSBL_FLAGS_CPU_SHIFT 5
48 #define FSBL_FLAGS_CPU_MASK (3 << FSBL_FLAGS_CPU_SHIFT)
49 #define FSBL_FLAGS_A53_0 0
50 #define FSBL_FLAGS_A53_1 1
51 #define FSBL_FLAGS_A53_2 2
52 #define FSBL_FLAGS_A53_3 3
54 #define FSBL_MAX_PARTITIONS 8
56 /* Structure corresponding to each partition entry */
57 struct xfsbl_partition {
62 /* Structure for handoff parameters to ARM Trusted Firmware (ATF) */
63 struct xfsbl_atf_handoff_params {
66 struct xfsbl_partition partition[FSBL_MAX_PARTITIONS];
69 #ifdef CONFIG_SPL_OS_BOOT
70 void handoff_setup(void)
72 struct xfsbl_atf_handoff_params *atfhandoffparams;
74 atfhandoffparams = (void *)CONFIG_SPL_TEXT_BASE;
75 atfhandoffparams->magic[0] = 'X';
76 atfhandoffparams->magic[1] = 'L';
77 atfhandoffparams->magic[2] = 'N';
78 atfhandoffparams->magic[3] = 'X';
80 atfhandoffparams->num_entries = 1;
81 atfhandoffparams->partition[0].entry_point = CONFIG_SYS_TEXT_BASE;
82 atfhandoffparams->partition[0].flags = FSBL_FLAGS_EL2 <<
85 writel(CONFIG_SPL_TEXT_BASE, &pmu_base->gen_storage6);