xref: /arm-trusted-firmware/plat/socionext/uniphier/uniphier_bl2_setup.c (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright (c) 2017-2020, ARM Limited and Contributors. All rights reserved.
3*91f16700Schasinglulu  *
4*91f16700Schasinglulu  * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu  */
6*91f16700Schasinglulu 
7*91f16700Schasinglulu #include <errno.h>
8*91f16700Schasinglulu 
9*91f16700Schasinglulu #include <platform_def.h>
10*91f16700Schasinglulu 
11*91f16700Schasinglulu #include <common/bl_common.h>
12*91f16700Schasinglulu #include <common/debug.h>
13*91f16700Schasinglulu #include <common/desc_image_load.h>
14*91f16700Schasinglulu #include <common/image_decompress.h>
15*91f16700Schasinglulu #include <drivers/io/io_storage.h>
16*91f16700Schasinglulu #include <lib/xlat_tables/xlat_tables_v2.h>
17*91f16700Schasinglulu #include <plat/common/platform.h>
18*91f16700Schasinglulu #ifdef UNIPHIER_DECOMPRESS_GZIP
19*91f16700Schasinglulu #include <tf_gunzip.h>
20*91f16700Schasinglulu #endif
21*91f16700Schasinglulu 
22*91f16700Schasinglulu #include "uniphier.h"
23*91f16700Schasinglulu 
24*91f16700Schasinglulu #define UNIPHIER_IMAGE_BUF_OFFSET	0x03800000UL
25*91f16700Schasinglulu #define UNIPHIER_IMAGE_BUF_SIZE		0x00800000UL
26*91f16700Schasinglulu 
27*91f16700Schasinglulu static uintptr_t uniphier_mem_base = UNIPHIER_MEM_BASE;
28*91f16700Schasinglulu static unsigned int uniphier_soc = UNIPHIER_SOC_UNKNOWN;
29*91f16700Schasinglulu static int uniphier_bl2_kick_scp;
30*91f16700Schasinglulu 
31*91f16700Schasinglulu void bl2_el3_early_platform_setup(u_register_t x0, u_register_t x1,
32*91f16700Schasinglulu 				  u_register_t x2, u_register_t x3)
33*91f16700Schasinglulu {
34*91f16700Schasinglulu 	uniphier_soc = uniphier_get_soc_id();
35*91f16700Schasinglulu 	if (uniphier_soc == UNIPHIER_SOC_UNKNOWN)
36*91f16700Schasinglulu 		plat_error_handler(-ENOTSUP);
37*91f16700Schasinglulu 
38*91f16700Schasinglulu 	uniphier_console_setup(uniphier_soc);
39*91f16700Schasinglulu }
40*91f16700Schasinglulu 
41*91f16700Schasinglulu void bl2_el3_plat_arch_setup(void)
42*91f16700Schasinglulu {
43*91f16700Schasinglulu 	int skip_scp = 0;
44*91f16700Schasinglulu 	int ret;
45*91f16700Schasinglulu 
46*91f16700Schasinglulu 	uniphier_mmap_setup(uniphier_soc);
47*91f16700Schasinglulu 
48*91f16700Schasinglulu 	/* add relocation offset (run-time-address - link-address) */
49*91f16700Schasinglulu 	uniphier_mem_base += BL_CODE_BASE - BL2_BASE;
50*91f16700Schasinglulu 
51*91f16700Schasinglulu 	ret = uniphier_io_setup(uniphier_soc, uniphier_mem_base);
52*91f16700Schasinglulu 	if (ret) {
53*91f16700Schasinglulu 		ERROR("failed to setup io devices\n");
54*91f16700Schasinglulu 		plat_error_handler(ret);
55*91f16700Schasinglulu 	}
56*91f16700Schasinglulu 
57*91f16700Schasinglulu 	switch (uniphier_get_boot_master(uniphier_soc)) {
58*91f16700Schasinglulu 	case UNIPHIER_BOOT_MASTER_THIS:
59*91f16700Schasinglulu 		INFO("Booting from this SoC\n");
60*91f16700Schasinglulu 		skip_scp = 1;
61*91f16700Schasinglulu 		break;
62*91f16700Schasinglulu 	case UNIPHIER_BOOT_MASTER_SCP:
63*91f16700Schasinglulu 		INFO("Booting from on-chip SCP\n");
64*91f16700Schasinglulu 		if (uniphier_scp_is_running()) {
65*91f16700Schasinglulu 			INFO("SCP is already running. SCP_BL2 load will be skipped.\n");
66*91f16700Schasinglulu 			skip_scp = 1;
67*91f16700Schasinglulu 		}
68*91f16700Schasinglulu 
69*91f16700Schasinglulu 		/*
70*91f16700Schasinglulu 		 * SCP must be kicked every time even if it is already running
71*91f16700Schasinglulu 		 * because it polls this event after the reboot of the backend.
72*91f16700Schasinglulu 		 */
73*91f16700Schasinglulu 		uniphier_bl2_kick_scp = 1;
74*91f16700Schasinglulu 		break;
75*91f16700Schasinglulu 	case UNIPHIER_BOOT_MASTER_EXT:
76*91f16700Schasinglulu 		INFO("Booting from external SCP\n");
77*91f16700Schasinglulu 		skip_scp = 1;
78*91f16700Schasinglulu 		break;
79*91f16700Schasinglulu 	default:
80*91f16700Schasinglulu 		plat_error_handler(-ENOTSUP);
81*91f16700Schasinglulu 		break;
82*91f16700Schasinglulu 	}
83*91f16700Schasinglulu 
84*91f16700Schasinglulu 	if (skip_scp) {
85*91f16700Schasinglulu 		struct image_info *image_info;
86*91f16700Schasinglulu 
87*91f16700Schasinglulu 		image_info = uniphier_get_image_info(SCP_BL2_IMAGE_ID);
88*91f16700Schasinglulu 		image_info->h.attr |= IMAGE_ATTRIB_SKIP_LOADING;
89*91f16700Schasinglulu 	}
90*91f16700Schasinglulu }
91*91f16700Schasinglulu 
92*91f16700Schasinglulu void bl2_platform_setup(void)
93*91f16700Schasinglulu {
94*91f16700Schasinglulu }
95*91f16700Schasinglulu 
96*91f16700Schasinglulu void plat_flush_next_bl_params(void)
97*91f16700Schasinglulu {
98*91f16700Schasinglulu 	flush_bl_params_desc();
99*91f16700Schasinglulu }
100*91f16700Schasinglulu 
101*91f16700Schasinglulu bl_load_info_t *plat_get_bl_image_load_info(void)
102*91f16700Schasinglulu {
103*91f16700Schasinglulu 	return get_bl_load_info_from_mem_params_desc();
104*91f16700Schasinglulu }
105*91f16700Schasinglulu 
106*91f16700Schasinglulu bl_params_t *plat_get_next_bl_params(void)
107*91f16700Schasinglulu {
108*91f16700Schasinglulu 	return get_next_bl_params_from_mem_params_desc();
109*91f16700Schasinglulu }
110*91f16700Schasinglulu 
111*91f16700Schasinglulu void bl2_plat_preload_setup(void)
112*91f16700Schasinglulu {
113*91f16700Schasinglulu #ifdef UNIPHIER_DECOMPRESS_GZIP
114*91f16700Schasinglulu 	uintptr_t buf_base = uniphier_mem_base + UNIPHIER_IMAGE_BUF_OFFSET;
115*91f16700Schasinglulu 	int ret;
116*91f16700Schasinglulu 
117*91f16700Schasinglulu 	ret = mmap_add_dynamic_region(buf_base, buf_base,
118*91f16700Schasinglulu 				      UNIPHIER_IMAGE_BUF_SIZE,
119*91f16700Schasinglulu 				      MT_MEMORY | MT_RW | MT_NS);
120*91f16700Schasinglulu 	if (ret)
121*91f16700Schasinglulu 		plat_error_handler(ret);
122*91f16700Schasinglulu 
123*91f16700Schasinglulu 	image_decompress_init(buf_base, UNIPHIER_IMAGE_BUF_SIZE, gunzip);
124*91f16700Schasinglulu #endif
125*91f16700Schasinglulu 
126*91f16700Schasinglulu 	uniphier_init_image_descs(uniphier_mem_base);
127*91f16700Schasinglulu }
128*91f16700Schasinglulu 
129*91f16700Schasinglulu int bl2_plat_handle_pre_image_load(unsigned int image_id)
130*91f16700Schasinglulu {
131*91f16700Schasinglulu 	struct image_info *image_info;
132*91f16700Schasinglulu 	int ret;
133*91f16700Schasinglulu 
134*91f16700Schasinglulu 	image_info = uniphier_get_image_info(image_id);
135*91f16700Schasinglulu 
136*91f16700Schasinglulu 	ret = mmap_add_dynamic_region(image_info->image_base,
137*91f16700Schasinglulu 				      image_info->image_base,
138*91f16700Schasinglulu 				      image_info->image_max_size,
139*91f16700Schasinglulu 				      MT_MEMORY | MT_RW | MT_NS);
140*91f16700Schasinglulu 	if (ret)
141*91f16700Schasinglulu 		return ret;
142*91f16700Schasinglulu 
143*91f16700Schasinglulu #ifdef UNIPHIER_DECOMPRESS_GZIP
144*91f16700Schasinglulu 	image_decompress_prepare(image_info);
145*91f16700Schasinglulu #endif
146*91f16700Schasinglulu 	return 0;
147*91f16700Schasinglulu }
148*91f16700Schasinglulu 
149*91f16700Schasinglulu int bl2_plat_handle_post_image_load(unsigned int image_id)
150*91f16700Schasinglulu {
151*91f16700Schasinglulu 	struct image_info *image_info = uniphier_get_image_info(image_id);
152*91f16700Schasinglulu #ifdef UNIPHIER_DECOMPRESS_GZIP
153*91f16700Schasinglulu 	int ret;
154*91f16700Schasinglulu 
155*91f16700Schasinglulu 	if (!(image_info->h.attr & IMAGE_ATTRIB_SKIP_LOADING)) {
156*91f16700Schasinglulu 		ret = image_decompress(uniphier_get_image_info(image_id));
157*91f16700Schasinglulu 		if (ret)
158*91f16700Schasinglulu 			return ret;
159*91f16700Schasinglulu 	}
160*91f16700Schasinglulu #endif
161*91f16700Schasinglulu 
162*91f16700Schasinglulu 	if (image_id == SCP_BL2_IMAGE_ID && uniphier_bl2_kick_scp)
163*91f16700Schasinglulu 		uniphier_scp_start(image_info->image_base);
164*91f16700Schasinglulu 
165*91f16700Schasinglulu 	return 0;
166*91f16700Schasinglulu }
167