xref: /rk3399_ARM-atf/plat/socionext/uniphier/uniphier_bl2_setup.c (revision d8e919c7b81a2739300912d6edbd3f929a136dbf)
1*d8e919c7SMasahiro Yamada /*
2*d8e919c7SMasahiro Yamada  * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.
3*d8e919c7SMasahiro Yamada  *
4*d8e919c7SMasahiro Yamada  * SPDX-License-Identifier: BSD-3-Clause
5*d8e919c7SMasahiro Yamada  */
6*d8e919c7SMasahiro Yamada 
7*d8e919c7SMasahiro Yamada #include <bl_common.h>
8*d8e919c7SMasahiro Yamada #include <debug.h>
9*d8e919c7SMasahiro Yamada #include <desc_image_load.h>
10*d8e919c7SMasahiro Yamada #include <errno.h>
11*d8e919c7SMasahiro Yamada #include <io/io_storage.h>
12*d8e919c7SMasahiro Yamada #include <platform.h>
13*d8e919c7SMasahiro Yamada #include <platform_def.h>
14*d8e919c7SMasahiro Yamada #include <xlat_tables_v2.h>
15*d8e919c7SMasahiro Yamada 
16*d8e919c7SMasahiro Yamada #include "uniphier.h"
17*d8e919c7SMasahiro Yamada 
18*d8e919c7SMasahiro Yamada static meminfo_t uniphier_bl2_tzram_layout __aligned(CACHE_WRITEBACK_GRANULE);
19*d8e919c7SMasahiro Yamada static int uniphier_bl2_kick_scp;
20*d8e919c7SMasahiro Yamada 
21*d8e919c7SMasahiro Yamada void bl2_early_platform_setup(meminfo_t *mem_layout)
22*d8e919c7SMasahiro Yamada {
23*d8e919c7SMasahiro Yamada 	uniphier_bl2_tzram_layout = *mem_layout;
24*d8e919c7SMasahiro Yamada 
25*d8e919c7SMasahiro Yamada 	uniphier_console_setup();
26*d8e919c7SMasahiro Yamada }
27*d8e919c7SMasahiro Yamada 
28*d8e919c7SMasahiro Yamada static const struct mmap_region uniphier_bl2_mmap[] = {
29*d8e919c7SMasahiro Yamada 	/* for SCP, BL33 */
30*d8e919c7SMasahiro Yamada 	MAP_REGION_FLAT(UNIPHIER_NS_DRAM_BASE, UNIPHIER_NS_DRAM_SIZE,
31*d8e919c7SMasahiro Yamada 			MT_MEMORY | MT_RW | MT_NS),
32*d8e919c7SMasahiro Yamada 	{ .size = 0 },
33*d8e919c7SMasahiro Yamada };
34*d8e919c7SMasahiro Yamada 
35*d8e919c7SMasahiro Yamada void bl2_plat_arch_setup(void)
36*d8e919c7SMasahiro Yamada {
37*d8e919c7SMasahiro Yamada 	unsigned int soc;
38*d8e919c7SMasahiro Yamada 	int skip_scp = 0;
39*d8e919c7SMasahiro Yamada 	int ret;
40*d8e919c7SMasahiro Yamada 
41*d8e919c7SMasahiro Yamada 	uniphier_mmap_setup(UNIPHIER_SEC_DRAM_BASE, UNIPHIER_SEC_DRAM_SIZE,
42*d8e919c7SMasahiro Yamada 			    uniphier_bl2_mmap);
43*d8e919c7SMasahiro Yamada 	enable_mmu_el1(0);
44*d8e919c7SMasahiro Yamada 
45*d8e919c7SMasahiro Yamada 	soc = uniphier_get_soc_id();
46*d8e919c7SMasahiro Yamada 	if (soc == UNIPHIER_SOC_UNKNOWN) {
47*d8e919c7SMasahiro Yamada 		ERROR("unsupported SoC\n");
48*d8e919c7SMasahiro Yamada 		plat_error_handler(-ENOTSUP);
49*d8e919c7SMasahiro Yamada 	}
50*d8e919c7SMasahiro Yamada 
51*d8e919c7SMasahiro Yamada 	ret = uniphier_io_setup(soc);
52*d8e919c7SMasahiro Yamada 	if (ret) {
53*d8e919c7SMasahiro Yamada 		ERROR("failed to setup io devices\n");
54*d8e919c7SMasahiro Yamada 		plat_error_handler(ret);
55*d8e919c7SMasahiro Yamada 	}
56*d8e919c7SMasahiro Yamada 
57*d8e919c7SMasahiro Yamada 	switch (uniphier_get_boot_master(soc)) {
58*d8e919c7SMasahiro Yamada 	case UNIPHIER_BOOT_MASTER_THIS:
59*d8e919c7SMasahiro Yamada 		INFO("Booting from this SoC\n");
60*d8e919c7SMasahiro Yamada 		skip_scp = 1;
61*d8e919c7SMasahiro Yamada 		break;
62*d8e919c7SMasahiro Yamada 	case UNIPHIER_BOOT_MASTER_SCP:
63*d8e919c7SMasahiro Yamada 		INFO("Booting from on-chip SCP\n");
64*d8e919c7SMasahiro Yamada 		if (uniphier_scp_is_running()) {
65*d8e919c7SMasahiro Yamada 			INFO("SCP is already running. SCP_BL2 load will be skipped.\n");
66*d8e919c7SMasahiro Yamada 			skip_scp = 1;
67*d8e919c7SMasahiro Yamada 		}
68*d8e919c7SMasahiro Yamada 
69*d8e919c7SMasahiro Yamada 		/*
70*d8e919c7SMasahiro Yamada 		 * SCP must be kicked every time even if it is already running
71*d8e919c7SMasahiro Yamada 		 * because it polls this event after the reboot of the backend.
72*d8e919c7SMasahiro Yamada 		 */
73*d8e919c7SMasahiro Yamada 		uniphier_bl2_kick_scp = 1;
74*d8e919c7SMasahiro Yamada 		break;
75*d8e919c7SMasahiro Yamada 	case UNIPHIER_BOOT_MASTER_EXT:
76*d8e919c7SMasahiro Yamada 		INFO("Booting from external SCP\n");
77*d8e919c7SMasahiro Yamada 		skip_scp = 1;
78*d8e919c7SMasahiro Yamada 		break;
79*d8e919c7SMasahiro Yamada 	default:
80*d8e919c7SMasahiro Yamada 		plat_error_handler(-ENOTSUP);
81*d8e919c7SMasahiro Yamada 	}
82*d8e919c7SMasahiro Yamada 
83*d8e919c7SMasahiro Yamada 	if (!skip_scp) {
84*d8e919c7SMasahiro Yamada 		ret = uniphier_check_image(SCP_BL2_IMAGE_ID);
85*d8e919c7SMasahiro Yamada 		if (ret) {
86*d8e919c7SMasahiro Yamada 			WARN("SCP_BL2 image not found. SCP_BL2 load will be skipped.\n");
87*d8e919c7SMasahiro Yamada 			WARN("You must setup SCP by other means.\n");
88*d8e919c7SMasahiro Yamada 			skip_scp = 1;
89*d8e919c7SMasahiro Yamada 			uniphier_bl2_kick_scp = 0;
90*d8e919c7SMasahiro Yamada 		}
91*d8e919c7SMasahiro Yamada 	}
92*d8e919c7SMasahiro Yamada 
93*d8e919c7SMasahiro Yamada 	if (skip_scp)
94*d8e919c7SMasahiro Yamada 		uniphier_image_descs_fixup();
95*d8e919c7SMasahiro Yamada }
96*d8e919c7SMasahiro Yamada 
97*d8e919c7SMasahiro Yamada void bl2_platform_setup(void)
98*d8e919c7SMasahiro Yamada {
99*d8e919c7SMasahiro Yamada }
100*d8e919c7SMasahiro Yamada 
101*d8e919c7SMasahiro Yamada void plat_flush_next_bl_params(void)
102*d8e919c7SMasahiro Yamada {
103*d8e919c7SMasahiro Yamada 	flush_bl_params_desc();
104*d8e919c7SMasahiro Yamada }
105*d8e919c7SMasahiro Yamada 
106*d8e919c7SMasahiro Yamada bl_load_info_t *plat_get_bl_image_load_info(void)
107*d8e919c7SMasahiro Yamada {
108*d8e919c7SMasahiro Yamada 	return get_bl_load_info_from_mem_params_desc();
109*d8e919c7SMasahiro Yamada }
110*d8e919c7SMasahiro Yamada 
111*d8e919c7SMasahiro Yamada bl_params_t *plat_get_next_bl_params(void)
112*d8e919c7SMasahiro Yamada {
113*d8e919c7SMasahiro Yamada 	return get_next_bl_params_from_mem_params_desc();
114*d8e919c7SMasahiro Yamada }
115*d8e919c7SMasahiro Yamada 
116*d8e919c7SMasahiro Yamada int bl2_plat_handle_post_image_load(unsigned int image_id)
117*d8e919c7SMasahiro Yamada {
118*d8e919c7SMasahiro Yamada 	if (image_id == SCP_BL2_IMAGE_ID && uniphier_bl2_kick_scp)
119*d8e919c7SMasahiro Yamada 		uniphier_scp_start();
120*d8e919c7SMasahiro Yamada 
121*d8e919c7SMasahiro Yamada 	return 0;
122*d8e919c7SMasahiro Yamada }
123