xref: /rk3399_ARM-atf/plat/renesas/rzg/bl2_plat_setup.c (revision db10bad9ffb2b04c325f7eec021c7cfc75797ca4)
1*db10bad9SBiju Das /*
2*db10bad9SBiju Das  * Copyright (c) 2020, Renesas Electronics Corporation. All rights reserved.
3*db10bad9SBiju Das  *
4*db10bad9SBiju Das  * SPDX-License-Identifier: BSD-3-Clause
5*db10bad9SBiju Das  */
6*db10bad9SBiju Das 
7*db10bad9SBiju Das #include <string.h>
8*db10bad9SBiju Das 
9*db10bad9SBiju Das #include <arch_helpers.h>
10*db10bad9SBiju Das #include <bl1/bl1.h>
11*db10bad9SBiju Das #include <common/bl_common.h>
12*db10bad9SBiju Das #include <common/debug.h>
13*db10bad9SBiju Das #include <common/desc_image_load.h>
14*db10bad9SBiju Das #include <drivers/console.h>
15*db10bad9SBiju Das #include <drivers/io/io_driver.h>
16*db10bad9SBiju Das #include <drivers/io/io_storage.h>
17*db10bad9SBiju Das #include <libfdt.h>
18*db10bad9SBiju Das #include <lib/mmio.h>
19*db10bad9SBiju Das #include <lib/xlat_tables/xlat_tables_defs.h>
20*db10bad9SBiju Das #include <platform_def.h>
21*db10bad9SBiju Das #include <plat/common/platform.h>
22*db10bad9SBiju Das 
23*db10bad9SBiju Das #include "avs_driver.h"
24*db10bad9SBiju Das #include "board.h"
25*db10bad9SBiju Das #include "boot_init_dram.h"
26*db10bad9SBiju Das #include "cpg_registers.h"
27*db10bad9SBiju Das #include "emmc_def.h"
28*db10bad9SBiju Das #include "emmc_hal.h"
29*db10bad9SBiju Das #include "emmc_std.h"
30*db10bad9SBiju Das #include "io_common.h"
31*db10bad9SBiju Das #include "io_rcar.h"
32*db10bad9SBiju Das #include "qos_init.h"
33*db10bad9SBiju Das #include "rcar_def.h"
34*db10bad9SBiju Das #include "rcar_private.h"
35*db10bad9SBiju Das #include "rcar_version.h"
36*db10bad9SBiju Das #include "rom_api.h"
37*db10bad9SBiju Das 
38*db10bad9SBiju Das #define MAX_DRAM_CHANNELS 4
39*db10bad9SBiju Das 
40*db10bad9SBiju Das #if RCAR_BL2_DCACHE == 1
41*db10bad9SBiju Das /*
42*db10bad9SBiju Das  * Following symbols are only used during plat_arch_setup() only
43*db10bad9SBiju Das  * when RCAR_BL2_DCACHE is enabled.
44*db10bad9SBiju Das  */
45*db10bad9SBiju Das static const uint64_t BL2_RO_BASE		= BL_CODE_BASE;
46*db10bad9SBiju Das static const uint64_t BL2_RO_LIMIT		= BL_CODE_END;
47*db10bad9SBiju Das 
48*db10bad9SBiju Das #if USE_COHERENT_MEM
49*db10bad9SBiju Das static const uint64_t BL2_COHERENT_RAM_BASE	= BL_COHERENT_RAM_BASE;
50*db10bad9SBiju Das static const uint64_t BL2_COHERENT_RAM_LIMIT	= BL_COHERENT_RAM_END;
51*db10bad9SBiju Das #endif /* USE_COHERENT_MEM */
52*db10bad9SBiju Das 
53*db10bad9SBiju Das #endif /* RCAR_BL2_DCACHE */
54*db10bad9SBiju Das 
55*db10bad9SBiju Das extern void plat_rcar_gic_driver_init(void);
56*db10bad9SBiju Das extern void plat_rcar_gic_init(void);
57*db10bad9SBiju Das extern void bl2_enter_bl31(const struct entry_point_info *bl_ep_info);
58*db10bad9SBiju Das extern void bl2_system_cpg_init(void);
59*db10bad9SBiju Das extern void bl2_secure_setting(void);
60*db10bad9SBiju Das extern void bl2_cpg_init(void);
61*db10bad9SBiju Das extern void rcar_io_emmc_setup(void);
62*db10bad9SBiju Das extern void rcar_io_setup(void);
63*db10bad9SBiju Das extern void rcar_swdt_release(void);
64*db10bad9SBiju Das extern void rcar_swdt_init(void);
65*db10bad9SBiju Das extern void rcar_rpc_init(void);
66*db10bad9SBiju Das extern void rcar_dma_init(void);
67*db10bad9SBiju Das extern void rzg_pfc_init(void);
68*db10bad9SBiju Das 
69*db10bad9SBiju Das static void bl2_init_generic_timer(void);
70*db10bad9SBiju Das 
71*db10bad9SBiju Das /* RZ/G2 product check */
72*db10bad9SBiju Das #if RCAR_LSI == RZ_G2M
73*db10bad9SBiju Das #define TARGET_PRODUCT			PRR_PRODUCT_M3
74*db10bad9SBiju Das #define TARGET_NAME			"RZ/G2M"
75*db10bad9SBiju Das #elif RCAR_LSI == RCAR_AUTO
76*db10bad9SBiju Das #define TARGET_NAME			"RZ/G2M"
77*db10bad9SBiju Das #endif /* RCAR_LSI == RZ_G2M */
78*db10bad9SBiju Das 
79*db10bad9SBiju Das #define GPIO_INDT			(GPIO_INDT1)
80*db10bad9SBiju Das #define GPIO_BKUP_TRG_SHIFT		(1U << 8U)
81*db10bad9SBiju Das 
82*db10bad9SBiju Das CASSERT((PARAMS_BASE + sizeof(bl2_to_bl31_params_mem_t) + 0x100)
83*db10bad9SBiju Das 	 < (RCAR_SHARED_MEM_BASE + RCAR_SHARED_MEM_SIZE),
84*db10bad9SBiju Das 	assert_bl31_params_do_not_fit_in_shared_memory);
85*db10bad9SBiju Das 
86*db10bad9SBiju Das static meminfo_t bl2_tzram_layout __aligned(CACHE_WRITEBACK_GRANULE);
87*db10bad9SBiju Das 
88*db10bad9SBiju Das /* FDT with DRAM configuration */
89*db10bad9SBiju Das uint64_t fdt_blob[PAGE_SIZE_4KB / sizeof(uint64_t)];
90*db10bad9SBiju Das static void *fdt = (void *)fdt_blob;
91*db10bad9SBiju Das 
92*db10bad9SBiju Das static void unsigned_num_print(uint64_t unum, unsigned int radix, char *string)
93*db10bad9SBiju Das {
94*db10bad9SBiju Das 	/* Just need enough space to store 64 bit decimal integer */
95*db10bad9SBiju Das 	char num_buf[20];
96*db10bad9SBiju Das 	int i = 0;
97*db10bad9SBiju Das 	unsigned int rem;
98*db10bad9SBiju Das 
99*db10bad9SBiju Das 	do {
100*db10bad9SBiju Das 		rem = unum % radix;
101*db10bad9SBiju Das 		if (rem < 0xaU) {
102*db10bad9SBiju Das 			num_buf[i] = '0' + rem;
103*db10bad9SBiju Das 		} else {
104*db10bad9SBiju Das 			num_buf[i] = 'a' + (rem - 0xaU);
105*db10bad9SBiju Das 		}
106*db10bad9SBiju Das 		i++;
107*db10bad9SBiju Das 		unum /= radix;
108*db10bad9SBiju Das 	} while (unum > 0U);
109*db10bad9SBiju Das 
110*db10bad9SBiju Das 	while (--i >= 0) {
111*db10bad9SBiju Das 		*string++ = num_buf[i];
112*db10bad9SBiju Das 	}
113*db10bad9SBiju Das 	*string = 0;
114*db10bad9SBiju Das }
115*db10bad9SBiju Das 
116*db10bad9SBiju Das #if RCAR_LOSSY_ENABLE == 1
117*db10bad9SBiju Das typedef struct bl2_lossy_info {
118*db10bad9SBiju Das 	uint32_t magic;
119*db10bad9SBiju Das 	uint32_t a0;
120*db10bad9SBiju Das 	uint32_t b0;
121*db10bad9SBiju Das } bl2_lossy_info_t;
122*db10bad9SBiju Das 
123*db10bad9SBiju Das static void bl2_lossy_gen_fdt(uint32_t no, uint64_t start_addr,
124*db10bad9SBiju Das 			      uint64_t end_addr, uint32_t format,
125*db10bad9SBiju Das 			      uint32_t enable, int fcnlnode)
126*db10bad9SBiju Das {
127*db10bad9SBiju Das 	const uint64_t fcnlsize = cpu_to_fdt64(end_addr - start_addr);
128*db10bad9SBiju Das 	char nodename[40] = { 0 };
129*db10bad9SBiju Das 	int ret, node;
130*db10bad9SBiju Das 
131*db10bad9SBiju Das 	/* Ignore undefined addresses */
132*db10bad9SBiju Das 	if (start_addr == 0UL && end_addr == 0UL) {
133*db10bad9SBiju Das 		return;
134*db10bad9SBiju Das 	}
135*db10bad9SBiju Das 
136*db10bad9SBiju Das 	snprintf(nodename, sizeof(nodename), "lossy-decompression@");
137*db10bad9SBiju Das 	unsigned_num_print(start_addr, 16, nodename + strlen(nodename));
138*db10bad9SBiju Das 
139*db10bad9SBiju Das 	node = ret = fdt_add_subnode(fdt, fcnlnode, nodename);
140*db10bad9SBiju Das 	if (ret < 0) {
141*db10bad9SBiju Das 		NOTICE("BL2: Cannot create FCNL node (ret=%i)\n", ret);
142*db10bad9SBiju Das 		panic();
143*db10bad9SBiju Das 	}
144*db10bad9SBiju Das 
145*db10bad9SBiju Das 	ret = fdt_setprop_string(fdt, node, "compatible",
146*db10bad9SBiju Das 				 "renesas,lossy-decompression");
147*db10bad9SBiju Das 	if (ret < 0) {
148*db10bad9SBiju Das 		NOTICE("BL2: Cannot add FCNL compat string %s (ret=%i)\n",
149*db10bad9SBiju Das 		       "renesas,lossy-decompression", ret);
150*db10bad9SBiju Das 		panic();
151*db10bad9SBiju Das 	}
152*db10bad9SBiju Das 
153*db10bad9SBiju Das 	ret = fdt_appendprop_string(fdt, node, "compatible",
154*db10bad9SBiju Das 				    "shared-dma-pool");
155*db10bad9SBiju Das 	if (ret < 0) {
156*db10bad9SBiju Das 		NOTICE("BL2: Cannot append FCNL compat string %s (ret=%i)\n",
157*db10bad9SBiju Das 		       "shared-dma-pool", ret);
158*db10bad9SBiju Das 		panic();
159*db10bad9SBiju Das 	}
160*db10bad9SBiju Das 
161*db10bad9SBiju Das 	ret = fdt_setprop_u64(fdt, node, "reg", start_addr);
162*db10bad9SBiju Das 	if (ret < 0) {
163*db10bad9SBiju Das 		NOTICE("BL2: Cannot add FCNL reg prop (ret=%i)\n", ret);
164*db10bad9SBiju Das 		panic();
165*db10bad9SBiju Das 	}
166*db10bad9SBiju Das 
167*db10bad9SBiju Das 	ret = fdt_appendprop(fdt, node, "reg", &fcnlsize, sizeof(fcnlsize));
168*db10bad9SBiju Das 	if (ret < 0) {
169*db10bad9SBiju Das 		NOTICE("BL2: Cannot append FCNL reg size prop (ret=%i)\n", ret);
170*db10bad9SBiju Das 		panic();
171*db10bad9SBiju Das 	}
172*db10bad9SBiju Das 
173*db10bad9SBiju Das 	ret = fdt_setprop(fdt, node, "no-map", NULL, 0);
174*db10bad9SBiju Das 	if (ret < 0) {
175*db10bad9SBiju Das 		NOTICE("BL2: Cannot add FCNL no-map prop (ret=%i)\n", ret);
176*db10bad9SBiju Das 		panic();
177*db10bad9SBiju Das 	}
178*db10bad9SBiju Das 
179*db10bad9SBiju Das 	ret = fdt_setprop_u32(fdt, node, "renesas,formats", format);
180*db10bad9SBiju Das 	if (ret < 0) {
181*db10bad9SBiju Das 		NOTICE("BL2: Cannot add FCNL formats prop (ret=%i)\n", ret);
182*db10bad9SBiju Das 		panic();
183*db10bad9SBiju Das 	}
184*db10bad9SBiju Das }
185*db10bad9SBiju Das 
186*db10bad9SBiju Das static void bl2_lossy_setting(uint32_t no, uint64_t start_addr,
187*db10bad9SBiju Das 			      uint64_t end_addr, uint32_t format,
188*db10bad9SBiju Das 			      uint32_t enable, int fcnlnode)
189*db10bad9SBiju Das {
190*db10bad9SBiju Das 	bl2_lossy_info_t info;
191*db10bad9SBiju Das 	uint32_t reg;
192*db10bad9SBiju Das 
193*db10bad9SBiju Das 	bl2_lossy_gen_fdt(no, start_addr, end_addr, format, enable, fcnlnode);
194*db10bad9SBiju Das 
195*db10bad9SBiju Das 	reg = format | (start_addr >> 20);
196*db10bad9SBiju Das 	mmio_write_32(AXI_DCMPAREACRA0 + 0x8U * no, reg);
197*db10bad9SBiju Das 	mmio_write_32(AXI_DCMPAREACRB0 + 0x8U * no, end_addr >> 20);
198*db10bad9SBiju Das 	mmio_write_32(AXI_DCMPAREACRA0 + 0x8U * no, reg | enable);
199*db10bad9SBiju Das 
200*db10bad9SBiju Das 	info.magic = 0x12345678U;
201*db10bad9SBiju Das 	info.a0 = mmio_read_32(AXI_DCMPAREACRA0 + 0x8U * no);
202*db10bad9SBiju Das 	info.b0 = mmio_read_32(AXI_DCMPAREACRB0 + 0x8U * no);
203*db10bad9SBiju Das 
204*db10bad9SBiju Das 	mmio_write_32(LOSSY_PARAMS_BASE + sizeof(info) * no, info.magic);
205*db10bad9SBiju Das 	mmio_write_32(LOSSY_PARAMS_BASE + sizeof(info) * no + 0x4U, info.a0);
206*db10bad9SBiju Das 	mmio_write_32(LOSSY_PARAMS_BASE + sizeof(info) * no + 0x8U, info.b0);
207*db10bad9SBiju Das 
208*db10bad9SBiju Das 	NOTICE("     Entry %d: DCMPAREACRAx:0x%x DCMPAREACRBx:0x%x\n", no,
209*db10bad9SBiju Das 	       mmio_read_32(AXI_DCMPAREACRA0 + 0x8U * no),
210*db10bad9SBiju Das 	       mmio_read_32(AXI_DCMPAREACRB0 + 0x8U * no));
211*db10bad9SBiju Das }
212*db10bad9SBiju Das #endif /* RCAR_LOSSY_ENABLE == 1 */
213*db10bad9SBiju Das 
214*db10bad9SBiju Das void bl2_plat_flush_bl31_params(void)
215*db10bad9SBiju Das {
216*db10bad9SBiju Das 	uint32_t product_cut, product, cut;
217*db10bad9SBiju Das 	uint32_t boot_dev, boot_cpu;
218*db10bad9SBiju Das 	uint32_t reg;
219*db10bad9SBiju Das 
220*db10bad9SBiju Das 	reg = mmio_read_32(RCAR_MODEMR);
221*db10bad9SBiju Das 	boot_dev = reg & MODEMR_BOOT_DEV_MASK;
222*db10bad9SBiju Das 
223*db10bad9SBiju Das 	if (boot_dev == MODEMR_BOOT_DEV_EMMC_25X1 ||
224*db10bad9SBiju Das 	    boot_dev == MODEMR_BOOT_DEV_EMMC_50X8) {
225*db10bad9SBiju Das 		emmc_terminate();
226*db10bad9SBiju Das 	}
227*db10bad9SBiju Das 
228*db10bad9SBiju Das 	if ((reg & MODEMR_BOOT_CPU_MASK) != MODEMR_BOOT_CPU_CR7) {
229*db10bad9SBiju Das 		bl2_secure_setting();
230*db10bad9SBiju Das 	}
231*db10bad9SBiju Das 
232*db10bad9SBiju Das 	reg = mmio_read_32(RCAR_PRR);
233*db10bad9SBiju Das 	product_cut = reg & (PRR_PRODUCT_MASK | PRR_CUT_MASK);
234*db10bad9SBiju Das 	product = reg & PRR_PRODUCT_MASK;
235*db10bad9SBiju Das 	cut = reg & PRR_CUT_MASK;
236*db10bad9SBiju Das 
237*db10bad9SBiju Das 	if (!((product == PRR_PRODUCT_M3 && cut < PRR_PRODUCT_30) ||
238*db10bad9SBiju Das 	      (product == PRR_PRODUCT_H3 && cut < PRR_PRODUCT_20))) {
239*db10bad9SBiju Das 		/* Disable MFIS write protection */
240*db10bad9SBiju Das 		mmio_write_32(MFISWPCNTR, MFISWPCNTR_PASSWORD | 1U);
241*db10bad9SBiju Das 	}
242*db10bad9SBiju Das 
243*db10bad9SBiju Das 	reg = mmio_read_32(RCAR_MODEMR);
244*db10bad9SBiju Das 	boot_cpu = reg & MODEMR_BOOT_CPU_MASK;
245*db10bad9SBiju Das 	if (boot_cpu == MODEMR_BOOT_CPU_CA57 ||
246*db10bad9SBiju Das 	    boot_cpu == MODEMR_BOOT_CPU_CA53) {
247*db10bad9SBiju Das 		if (product_cut == PRR_PRODUCT_H3_CUT20) {
248*db10bad9SBiju Das 			mmio_write_32(IPMMUVI0_IMSCTLR, IMSCTLR_DISCACHE);
249*db10bad9SBiju Das 			mmio_write_32(IPMMUVI1_IMSCTLR, IMSCTLR_DISCACHE);
250*db10bad9SBiju Das 			mmio_write_32(IPMMUPV0_IMSCTLR, IMSCTLR_DISCACHE);
251*db10bad9SBiju Das 			mmio_write_32(IPMMUPV1_IMSCTLR, IMSCTLR_DISCACHE);
252*db10bad9SBiju Das 			mmio_write_32(IPMMUPV2_IMSCTLR, IMSCTLR_DISCACHE);
253*db10bad9SBiju Das 			mmio_write_32(IPMMUPV3_IMSCTLR, IMSCTLR_DISCACHE);
254*db10bad9SBiju Das 		} else if (product_cut == (PRR_PRODUCT_M3N | PRR_PRODUCT_10) ||
255*db10bad9SBiju Das 			   product_cut == (PRR_PRODUCT_M3N | PRR_PRODUCT_11)) {
256*db10bad9SBiju Das 			mmio_write_32(IPMMUVI0_IMSCTLR, IMSCTLR_DISCACHE);
257*db10bad9SBiju Das 			mmio_write_32(IPMMUPV0_IMSCTLR, IMSCTLR_DISCACHE);
258*db10bad9SBiju Das 		} else if ((product_cut == (PRR_PRODUCT_E3 | PRR_PRODUCT_10)) ||
259*db10bad9SBiju Das 			   (product_cut == (PRR_PRODUCT_E3 | PRR_PRODUCT_11))) {
260*db10bad9SBiju Das 			mmio_write_32(IPMMUVI0_IMSCTLR, IMSCTLR_DISCACHE);
261*db10bad9SBiju Das 			mmio_write_32(IPMMUVP0_IMSCTLR, IMSCTLR_DISCACHE);
262*db10bad9SBiju Das 			mmio_write_32(IPMMUPV0_IMSCTLR, IMSCTLR_DISCACHE);
263*db10bad9SBiju Das 		}
264*db10bad9SBiju Das 
265*db10bad9SBiju Das 		if (product_cut == (PRR_PRODUCT_H3_CUT20) ||
266*db10bad9SBiju Das 		    product_cut == (PRR_PRODUCT_M3N | PRR_PRODUCT_10) ||
267*db10bad9SBiju Das 		    product_cut == (PRR_PRODUCT_M3N | PRR_PRODUCT_11) ||
268*db10bad9SBiju Das 		    product_cut == (PRR_PRODUCT_E3 | PRR_PRODUCT_10)) {
269*db10bad9SBiju Das 			mmio_write_32(IPMMUHC_IMSCTLR, IMSCTLR_DISCACHE);
270*db10bad9SBiju Das 			mmio_write_32(IPMMURT_IMSCTLR, IMSCTLR_DISCACHE);
271*db10bad9SBiju Das 			mmio_write_32(IPMMUMP_IMSCTLR, IMSCTLR_DISCACHE);
272*db10bad9SBiju Das 
273*db10bad9SBiju Das 			mmio_write_32(IPMMUDS0_IMSCTLR, IMSCTLR_DISCACHE);
274*db10bad9SBiju Das 			mmio_write_32(IPMMUDS1_IMSCTLR, IMSCTLR_DISCACHE);
275*db10bad9SBiju Das 		}
276*db10bad9SBiju Das 	}
277*db10bad9SBiju Das 
278*db10bad9SBiju Das 	mmio_write_32(IPMMUMM_IMSCTLR, IPMMUMM_IMSCTLR_ENABLE);
279*db10bad9SBiju Das 	mmio_write_32(IPMMUMM_IMAUXCTLR, IPMMUMM_IMAUXCTLR_NMERGE40_BIT);
280*db10bad9SBiju Das 
281*db10bad9SBiju Das 	rcar_swdt_release();
282*db10bad9SBiju Das 	bl2_system_cpg_init();
283*db10bad9SBiju Das 
284*db10bad9SBiju Das #if RCAR_BL2_DCACHE == 1
285*db10bad9SBiju Das 	/* Disable data cache (clean and invalidate) */
286*db10bad9SBiju Das 	disable_mmu_el3();
287*db10bad9SBiju Das #endif /* RCAR_BL2_DCACHE == 1 */
288*db10bad9SBiju Das }
289*db10bad9SBiju Das 
290*db10bad9SBiju Das static uint32_t is_ddr_backup_mode(void)
291*db10bad9SBiju Das {
292*db10bad9SBiju Das #if RCAR_SYSTEM_SUSPEND
293*db10bad9SBiju Das 	static uint32_t reason = RCAR_COLD_BOOT;
294*db10bad9SBiju Das 	static uint32_t once;
295*db10bad9SBiju Das 
296*db10bad9SBiju Das 	if (once != 0U) {
297*db10bad9SBiju Das 		return reason;
298*db10bad9SBiju Das 	}
299*db10bad9SBiju Das 
300*db10bad9SBiju Das 	once = 1;
301*db10bad9SBiju Das 	if ((mmio_read_32(GPIO_INDT) & GPIO_BKUP_TRG_SHIFT) == 0U) {
302*db10bad9SBiju Das 		return reason;
303*db10bad9SBiju Das 	}
304*db10bad9SBiju Das 
305*db10bad9SBiju Das 	reason = RCAR_WARM_BOOT;
306*db10bad9SBiju Das 	return reason;
307*db10bad9SBiju Das #else /* RCAR_SYSTEM_SUSPEND */
308*db10bad9SBiju Das 	return RCAR_COLD_BOOT;
309*db10bad9SBiju Das #endif /* RCAR_SYSTEM_SUSPEND */
310*db10bad9SBiju Das }
311*db10bad9SBiju Das 
312*db10bad9SBiju Das int bl2_plat_handle_pre_image_load(unsigned int image_id)
313*db10bad9SBiju Das {
314*db10bad9SBiju Das 	u_register_t *boot_kind = (void *)BOOT_KIND_BASE;
315*db10bad9SBiju Das 	bl_mem_params_node_t *bl_mem_params;
316*db10bad9SBiju Das 
317*db10bad9SBiju Das 	if (image_id != BL31_IMAGE_ID) {
318*db10bad9SBiju Das 		return 0;
319*db10bad9SBiju Das 	}
320*db10bad9SBiju Das 
321*db10bad9SBiju Das 	bl_mem_params = get_bl_mem_params_node(image_id);
322*db10bad9SBiju Das 
323*db10bad9SBiju Das 	if (is_ddr_backup_mode() != RCAR_COLD_BOOT) {
324*db10bad9SBiju Das 		*boot_kind  = RCAR_WARM_BOOT;
325*db10bad9SBiju Das 		flush_dcache_range(BOOT_KIND_BASE, sizeof(*boot_kind));
326*db10bad9SBiju Das 
327*db10bad9SBiju Das 		console_flush();
328*db10bad9SBiju Das 		bl2_plat_flush_bl31_params();
329*db10bad9SBiju Das 
330*db10bad9SBiju Das 		/* will not return */
331*db10bad9SBiju Das 		bl2_enter_bl31(&bl_mem_params->ep_info);
332*db10bad9SBiju Das 	}
333*db10bad9SBiju Das 
334*db10bad9SBiju Das 	*boot_kind  = RCAR_COLD_BOOT;
335*db10bad9SBiju Das 	flush_dcache_range(BOOT_KIND_BASE, sizeof(*boot_kind));
336*db10bad9SBiju Das 
337*db10bad9SBiju Das 	return 0;
338*db10bad9SBiju Das }
339*db10bad9SBiju Das 
340*db10bad9SBiju Das static uint64_t rzg_get_dest_addr_from_cert(uint32_t certid, uintptr_t *dest)
341*db10bad9SBiju Das {
342*db10bad9SBiju Das 	uint32_t cert, len;
343*db10bad9SBiju Das 	int err;
344*db10bad9SBiju Das 
345*db10bad9SBiju Das 	err = rcar_get_certificate(certid, &cert);
346*db10bad9SBiju Das 	if (err != 0) {
347*db10bad9SBiju Das 		ERROR("%s : cert file load error", __func__);
348*db10bad9SBiju Das 		return 1U;
349*db10bad9SBiju Das 	}
350*db10bad9SBiju Das 
351*db10bad9SBiju Das 	rcar_read_certificate((uint64_t)cert, &len, dest);
352*db10bad9SBiju Das 
353*db10bad9SBiju Das 	return 0U;
354*db10bad9SBiju Das }
355*db10bad9SBiju Das 
356*db10bad9SBiju Das int bl2_plat_handle_post_image_load(unsigned int image_id)
357*db10bad9SBiju Das {
358*db10bad9SBiju Das 	static bl2_to_bl31_params_mem_t *params;
359*db10bad9SBiju Das 	bl_mem_params_node_t *bl_mem_params;
360*db10bad9SBiju Das 	uintptr_t dest;
361*db10bad9SBiju Das 	uint64_t ret;
362*db10bad9SBiju Das 
363*db10bad9SBiju Das 	if (params == NULL) {
364*db10bad9SBiju Das 		params = (bl2_to_bl31_params_mem_t *)PARAMS_BASE;
365*db10bad9SBiju Das 		memset((void *)PARAMS_BASE, 0, sizeof(*params));
366*db10bad9SBiju Das 	}
367*db10bad9SBiju Das 
368*db10bad9SBiju Das 	bl_mem_params = get_bl_mem_params_node(image_id);
369*db10bad9SBiju Das 
370*db10bad9SBiju Das 	switch (image_id) {
371*db10bad9SBiju Das 	case BL31_IMAGE_ID:
372*db10bad9SBiju Das 		ret = rzg_get_dest_addr_from_cert(SOC_FW_CONTENT_CERT_ID,
373*db10bad9SBiju Das 						  &dest);
374*db10bad9SBiju Das 		if (ret == 0U) {
375*db10bad9SBiju Das 			bl_mem_params->image_info.image_base = dest;
376*db10bad9SBiju Das 		}
377*db10bad9SBiju Das 		break;
378*db10bad9SBiju Das 	case BL32_IMAGE_ID:
379*db10bad9SBiju Das 		ret = rzg_get_dest_addr_from_cert(TRUSTED_OS_FW_CONTENT_CERT_ID,
380*db10bad9SBiju Das 						  &dest);
381*db10bad9SBiju Das 		if (ret == 0U) {
382*db10bad9SBiju Das 			bl_mem_params->image_info.image_base = dest;
383*db10bad9SBiju Das 		}
384*db10bad9SBiju Das 
385*db10bad9SBiju Das 		memcpy(&params->bl32_ep_info, &bl_mem_params->ep_info,
386*db10bad9SBiju Das 		       sizeof(entry_point_info_t));
387*db10bad9SBiju Das 		break;
388*db10bad9SBiju Das 	case BL33_IMAGE_ID:
389*db10bad9SBiju Das 		memcpy(&params->bl33_ep_info, &bl_mem_params->ep_info,
390*db10bad9SBiju Das 		       sizeof(entry_point_info_t));
391*db10bad9SBiju Das 		break;
392*db10bad9SBiju Das 	default:
393*db10bad9SBiju Das 		break;
394*db10bad9SBiju Das 	}
395*db10bad9SBiju Das 
396*db10bad9SBiju Das 	return 0;
397*db10bad9SBiju Das }
398*db10bad9SBiju Das 
399*db10bad9SBiju Das struct meminfo *bl2_plat_sec_mem_layout(void)
400*db10bad9SBiju Das {
401*db10bad9SBiju Das 	return &bl2_tzram_layout;
402*db10bad9SBiju Das }
403*db10bad9SBiju Das 
404*db10bad9SBiju Das static void bl2_populate_compatible_string(void *dt)
405*db10bad9SBiju Das {
406*db10bad9SBiju Das 	uint32_t board_type;
407*db10bad9SBiju Das 	uint32_t board_rev;
408*db10bad9SBiju Das 	uint32_t reg;
409*db10bad9SBiju Das 	int ret;
410*db10bad9SBiju Das 
411*db10bad9SBiju Das 	fdt_setprop_u32(dt, 0, "#address-cells", 2);
412*db10bad9SBiju Das 	fdt_setprop_u32(dt, 0, "#size-cells", 2);
413*db10bad9SBiju Das 
414*db10bad9SBiju Das 	/* Populate compatible string */
415*db10bad9SBiju Das 	rzg_get_board_type(&board_type, &board_rev);
416*db10bad9SBiju Das 	switch (board_type) {
417*db10bad9SBiju Das 	case BOARD_HIHOPE_RZ_G2M:
418*db10bad9SBiju Das 		ret = fdt_setprop_string(dt, 0, "compatible",
419*db10bad9SBiju Das 					 "hoperun,hihope-rzg2m");
420*db10bad9SBiju Das 		break;
421*db10bad9SBiju Das 	default:
422*db10bad9SBiju Das 		NOTICE("BL2: Cannot set compatible string, board unsupported\n");
423*db10bad9SBiju Das 		panic();
424*db10bad9SBiju Das 		break;
425*db10bad9SBiju Das 	}
426*db10bad9SBiju Das 
427*db10bad9SBiju Das 	if (ret < 0) {
428*db10bad9SBiju Das 		NOTICE("BL2: Cannot set compatible string (ret=%i)\n", ret);
429*db10bad9SBiju Das 		panic();
430*db10bad9SBiju Das 	}
431*db10bad9SBiju Das 
432*db10bad9SBiju Das 	reg = mmio_read_32(RCAR_PRR);
433*db10bad9SBiju Das 	switch (reg & PRR_PRODUCT_MASK) {
434*db10bad9SBiju Das 	case PRR_PRODUCT_M3:
435*db10bad9SBiju Das 		ret = fdt_appendprop_string(dt, 0, "compatible",
436*db10bad9SBiju Das 					    "renesas,r8a774a1");
437*db10bad9SBiju Das 		break;
438*db10bad9SBiju Das 	default:
439*db10bad9SBiju Das 		NOTICE("BL2: Cannot set compatible string, SoC unsupported\n");
440*db10bad9SBiju Das 		panic();
441*db10bad9SBiju Das 		break;
442*db10bad9SBiju Das 	}
443*db10bad9SBiju Das 
444*db10bad9SBiju Das 	if (ret < 0) {
445*db10bad9SBiju Das 		NOTICE("BL2: Cannot set compatible string (ret=%i)\n", ret);
446*db10bad9SBiju Das 		panic();
447*db10bad9SBiju Das 	}
448*db10bad9SBiju Das }
449*db10bad9SBiju Das 
450*db10bad9SBiju Das static void bl2_advertise_dram_entries(uint64_t dram_config[8])
451*db10bad9SBiju Das {
452*db10bad9SBiju Das 	char nodename[32] = { 0 };
453*db10bad9SBiju Das 	uint64_t start, size;
454*db10bad9SBiju Das 	uint64_t fdtsize;
455*db10bad9SBiju Das 	int ret, node, chan;
456*db10bad9SBiju Das 
457*db10bad9SBiju Das 	for (chan = 0; chan < MAX_DRAM_CHANNELS; chan++) {
458*db10bad9SBiju Das 		start = dram_config[2 * chan];
459*db10bad9SBiju Das 		size = dram_config[2 * chan + 1];
460*db10bad9SBiju Das 		if (size == 0U) {
461*db10bad9SBiju Das 			continue;
462*db10bad9SBiju Das 		}
463*db10bad9SBiju Das 
464*db10bad9SBiju Das 		NOTICE("BL2: CH%d: %llx - %llx, %lld %siB\n",
465*db10bad9SBiju Das 		       chan, start, start + size - 1U,
466*db10bad9SBiju Das 		       (size >> 30) ? : size >> 20,
467*db10bad9SBiju Das 		       (size >> 30) ? "G" : "M");
468*db10bad9SBiju Das 	}
469*db10bad9SBiju Das 
470*db10bad9SBiju Das 	/*
471*db10bad9SBiju Das 	 * We add the DT nodes in reverse order here. The fdt_add_subnode()
472*db10bad9SBiju Das 	 * adds the DT node before the first existing DT node, so we have
473*db10bad9SBiju Das 	 * to add them in reverse order to get nodes sorted by address in
474*db10bad9SBiju Das 	 * the resulting DT.
475*db10bad9SBiju Das 	 */
476*db10bad9SBiju Das 	for (chan = MAX_DRAM_CHANNELS - 1; chan >= 0; chan--) {
477*db10bad9SBiju Das 		start = dram_config[2 * chan];
478*db10bad9SBiju Das 		size = dram_config[2 * chan + 1];
479*db10bad9SBiju Das 		if (size == 0U) {
480*db10bad9SBiju Das 			continue;
481*db10bad9SBiju Das 		}
482*db10bad9SBiju Das 
483*db10bad9SBiju Das 		/*
484*db10bad9SBiju Das 		 * Channel 0 is mapped in 32bit space and the first
485*db10bad9SBiju Das 		 * 128 MiB are reserved
486*db10bad9SBiju Das 		 */
487*db10bad9SBiju Das 		if (chan == 0) {
488*db10bad9SBiju Das 			start = 0x48000000U;
489*db10bad9SBiju Das 			size -= 0x8000000U;
490*db10bad9SBiju Das 		}
491*db10bad9SBiju Das 
492*db10bad9SBiju Das 		fdtsize = cpu_to_fdt64(size);
493*db10bad9SBiju Das 
494*db10bad9SBiju Das 		snprintf(nodename, sizeof(nodename), "memory@");
495*db10bad9SBiju Das 		unsigned_num_print(start, 16, nodename + strlen(nodename));
496*db10bad9SBiju Das 		node = ret = fdt_add_subnode(fdt, 0, nodename);
497*db10bad9SBiju Das 		if (ret < 0) {
498*db10bad9SBiju Das 			goto err;
499*db10bad9SBiju Das 		}
500*db10bad9SBiju Das 
501*db10bad9SBiju Das 		ret = fdt_setprop_string(fdt, node, "device_type", "memory");
502*db10bad9SBiju Das 		if (ret < 0) {
503*db10bad9SBiju Das 			goto err;
504*db10bad9SBiju Das 		}
505*db10bad9SBiju Das 
506*db10bad9SBiju Das 		ret = fdt_setprop_u64(fdt, node, "reg", start);
507*db10bad9SBiju Das 		if (ret < 0) {
508*db10bad9SBiju Das 			goto err;
509*db10bad9SBiju Das 		}
510*db10bad9SBiju Das 
511*db10bad9SBiju Das 		ret = fdt_appendprop(fdt, node, "reg", &fdtsize,
512*db10bad9SBiju Das 				     sizeof(fdtsize));
513*db10bad9SBiju Das 		if (ret < 0) {
514*db10bad9SBiju Das 			goto err;
515*db10bad9SBiju Das 		}
516*db10bad9SBiju Das 	}
517*db10bad9SBiju Das 
518*db10bad9SBiju Das 	return;
519*db10bad9SBiju Das err:
520*db10bad9SBiju Das 	NOTICE("BL2: Cannot add memory node to FDT (ret=%i)\n", ret);
521*db10bad9SBiju Das 	panic();
522*db10bad9SBiju Das }
523*db10bad9SBiju Das 
524*db10bad9SBiju Das static void bl2_advertise_dram_size(uint32_t product)
525*db10bad9SBiju Das {
526*db10bad9SBiju Das 	uint64_t dram_config[8] = {
527*db10bad9SBiju Das 		[0] = 0x400000000ULL,
528*db10bad9SBiju Das 		[2] = 0x500000000ULL,
529*db10bad9SBiju Das 		[4] = 0x600000000ULL,
530*db10bad9SBiju Das 		[6] = 0x700000000ULL,
531*db10bad9SBiju Das 	};
532*db10bad9SBiju Das 
533*db10bad9SBiju Das 	switch (product) {
534*db10bad9SBiju Das 	case PRR_PRODUCT_M3:
535*db10bad9SBiju Das 		/* 4GB(2GBx2 2ch split) */
536*db10bad9SBiju Das 		dram_config[1] = 0x80000000ULL;
537*db10bad9SBiju Das 		dram_config[5] = 0x80000000ULL;
538*db10bad9SBiju Das 		break;
539*db10bad9SBiju Das 	default:
540*db10bad9SBiju Das 		NOTICE("BL2: Detected invalid DRAM entries\n");
541*db10bad9SBiju Das 		break;
542*db10bad9SBiju Das 	}
543*db10bad9SBiju Das 
544*db10bad9SBiju Das 	bl2_advertise_dram_entries(dram_config);
545*db10bad9SBiju Das }
546*db10bad9SBiju Das 
547*db10bad9SBiju Das void bl2_el3_early_platform_setup(u_register_t arg1, u_register_t arg2,
548*db10bad9SBiju Das 				  u_register_t arg3, u_register_t arg4)
549*db10bad9SBiju Das {
550*db10bad9SBiju Das 	uint32_t reg, midr, boot_dev, boot_cpu, type, rev;
551*db10bad9SBiju Das 	uint32_t product, product_cut, major, minor;
552*db10bad9SBiju Das 	int32_t ret;
553*db10bad9SBiju Das 	const char *str;
554*db10bad9SBiju Das 	const char *unknown = "unknown";
555*db10bad9SBiju Das 	const char *cpu_ca57 = "CA57";
556*db10bad9SBiju Das 	const char *cpu_ca53 = "CA53";
557*db10bad9SBiju Das 	const char *product_g2m = "G2M";
558*db10bad9SBiju Das 	const char *boot_hyper80 = "HyperFlash(80MHz)";
559*db10bad9SBiju Das 	const char *boot_qspi40 = "QSPI Flash(40MHz)";
560*db10bad9SBiju Das 	const char *boot_qspi80 = "QSPI Flash(80MHz)";
561*db10bad9SBiju Das 	const char *boot_emmc25x1 = "eMMC(25MHz x1)";
562*db10bad9SBiju Das 	const char *boot_emmc50x8 = "eMMC(50MHz x8)";
563*db10bad9SBiju Das 	const char *boot_hyper160 = "HyperFlash(160MHz)";
564*db10bad9SBiju Das #if RZG_LCS_STATE_DETECTION_ENABLE
565*db10bad9SBiju Das 	uint32_t lcs;
566*db10bad9SBiju Das 	const char *lcs_secure = "SE";
567*db10bad9SBiju Das 	const char *lcs_cm = "CM";
568*db10bad9SBiju Das 	const char *lcs_dm = "DM";
569*db10bad9SBiju Das 	const char *lcs_sd = "SD";
570*db10bad9SBiju Das 	const char *lcs_fa = "FA";
571*db10bad9SBiju Das #endif /* RZG_LCS_STATE_DETECTION_ENABLE */
572*db10bad9SBiju Das 
573*db10bad9SBiju Das #if (RCAR_LOSSY_ENABLE == 1)
574*db10bad9SBiju Das 	int fcnlnode;
575*db10bad9SBiju Das #endif /* (RCAR_LOSSY_ENABLE == 1) */
576*db10bad9SBiju Das 
577*db10bad9SBiju Das 	bl2_init_generic_timer();
578*db10bad9SBiju Das 
579*db10bad9SBiju Das 	reg = mmio_read_32(RCAR_MODEMR);
580*db10bad9SBiju Das 	boot_dev = reg & MODEMR_BOOT_DEV_MASK;
581*db10bad9SBiju Das 	boot_cpu = reg & MODEMR_BOOT_CPU_MASK;
582*db10bad9SBiju Das 
583*db10bad9SBiju Das 	bl2_cpg_init();
584*db10bad9SBiju Das 
585*db10bad9SBiju Das 	if (boot_cpu == MODEMR_BOOT_CPU_CA57 ||
586*db10bad9SBiju Das 	    boot_cpu == MODEMR_BOOT_CPU_CA53) {
587*db10bad9SBiju Das 		rzg_pfc_init();
588*db10bad9SBiju Das 		rcar_console_boot_init();
589*db10bad9SBiju Das 	}
590*db10bad9SBiju Das 
591*db10bad9SBiju Das 	plat_rcar_gic_driver_init();
592*db10bad9SBiju Das 	plat_rcar_gic_init();
593*db10bad9SBiju Das 	rcar_swdt_init();
594*db10bad9SBiju Das 
595*db10bad9SBiju Das 	/* FIQ interrupts are taken to EL3 */
596*db10bad9SBiju Das 	write_scr_el3(read_scr_el3() | SCR_FIQ_BIT);
597*db10bad9SBiju Das 
598*db10bad9SBiju Das 	write_daifclr(DAIF_FIQ_BIT);
599*db10bad9SBiju Das 
600*db10bad9SBiju Das 	reg = read_midr();
601*db10bad9SBiju Das 	midr = reg & (MIDR_PN_MASK << MIDR_PN_SHIFT);
602*db10bad9SBiju Das 	switch (midr) {
603*db10bad9SBiju Das 	case MIDR_CA57:
604*db10bad9SBiju Das 		str = cpu_ca57;
605*db10bad9SBiju Das 		break;
606*db10bad9SBiju Das 	case MIDR_CA53:
607*db10bad9SBiju Das 		str = cpu_ca53;
608*db10bad9SBiju Das 		break;
609*db10bad9SBiju Das 	default:
610*db10bad9SBiju Das 		str = unknown;
611*db10bad9SBiju Das 		break;
612*db10bad9SBiju Das 	}
613*db10bad9SBiju Das 
614*db10bad9SBiju Das 	NOTICE("BL2: RZ/G2 Initial Program Loader(%s) Rev.%s\n", str,
615*db10bad9SBiju Das 	       version_of_renesas);
616*db10bad9SBiju Das 
617*db10bad9SBiju Das 	reg = mmio_read_32(RCAR_PRR);
618*db10bad9SBiju Das 	product_cut = reg & (PRR_PRODUCT_MASK | PRR_CUT_MASK);
619*db10bad9SBiju Das 	product = reg & PRR_PRODUCT_MASK;
620*db10bad9SBiju Das 
621*db10bad9SBiju Das 	switch (product) {
622*db10bad9SBiju Das 	case PRR_PRODUCT_M3:
623*db10bad9SBiju Das 		str = product_g2m;
624*db10bad9SBiju Das 		break;
625*db10bad9SBiju Das 	default:
626*db10bad9SBiju Das 		str = unknown;
627*db10bad9SBiju Das 		break;
628*db10bad9SBiju Das 	}
629*db10bad9SBiju Das 
630*db10bad9SBiju Das 	if ((product == PRR_PRODUCT_M3) &&
631*db10bad9SBiju Das 	    ((reg & RCAR_MAJOR_MASK) == PRR_PRODUCT_20)) {
632*db10bad9SBiju Das 		if ((reg & PRR_CUT_MASK) == RCAR_M3_CUT_VER11) {
633*db10bad9SBiju Das 			/* M3 Ver.1.1 or Ver.1.2 */
634*db10bad9SBiju Das 			NOTICE("BL2: PRR is RZ/%s Ver.1.1 / Ver.1.2\n", str);
635*db10bad9SBiju Das 		} else {
636*db10bad9SBiju Das 			NOTICE("BL2: PRR is RZ/%s Ver.1.%d\n", str,
637*db10bad9SBiju Das 				(reg & RCAR_MINOR_MASK) + RCAR_M3_MINOR_OFFSET);
638*db10bad9SBiju Das 		}
639*db10bad9SBiju Das 	} else {
640*db10bad9SBiju Das 		major = (reg & RCAR_MAJOR_MASK) >> RCAR_MAJOR_SHIFT;
641*db10bad9SBiju Das 		major = major + RCAR_MAJOR_OFFSET;
642*db10bad9SBiju Das 		minor = reg & RCAR_MINOR_MASK;
643*db10bad9SBiju Das 		NOTICE("BL2: PRR is RZ/%s Ver.%d.%d\n", str, major, minor);
644*db10bad9SBiju Das 	}
645*db10bad9SBiju Das 
646*db10bad9SBiju Das 	rzg_get_board_type(&type, &rev);
647*db10bad9SBiju Das 
648*db10bad9SBiju Das 	switch (type) {
649*db10bad9SBiju Das 	case BOARD_HIHOPE_RZ_G2M:
650*db10bad9SBiju Das 		break;
651*db10bad9SBiju Das 	default:
652*db10bad9SBiju Das 		type = BOARD_UNKNOWN;
653*db10bad9SBiju Das 		break;
654*db10bad9SBiju Das 	}
655*db10bad9SBiju Das 
656*db10bad9SBiju Das 	if (type == BOARD_UNKNOWN || rev == BOARD_REV_UNKNOWN) {
657*db10bad9SBiju Das 		NOTICE("BL2: Board is %s Rev.---\n", GET_BOARD_NAME(type));
658*db10bad9SBiju Das 	} else {
659*db10bad9SBiju Das 		NOTICE("BL2: Board is %s Rev.%d.%d\n",
660*db10bad9SBiju Das 		       GET_BOARD_NAME(type),
661*db10bad9SBiju Das 		       GET_BOARD_MAJOR(rev), GET_BOARD_MINOR(rev));
662*db10bad9SBiju Das 	}
663*db10bad9SBiju Das 
664*db10bad9SBiju Das #if RCAR_LSI != RCAR_AUTO
665*db10bad9SBiju Das 	if (product != TARGET_PRODUCT) {
666*db10bad9SBiju Das 		ERROR("BL2: IPL was been built for the %s.\n", TARGET_NAME);
667*db10bad9SBiju Das 		ERROR("BL2: Please write the correct IPL to flash memory.\n");
668*db10bad9SBiju Das 		panic();
669*db10bad9SBiju Das 	}
670*db10bad9SBiju Das #endif /* RCAR_LSI != RCAR_AUTO */
671*db10bad9SBiju Das 	rcar_avs_init();
672*db10bad9SBiju Das 	rcar_avs_setting();
673*db10bad9SBiju Das 
674*db10bad9SBiju Das 	switch (boot_dev) {
675*db10bad9SBiju Das 	case MODEMR_BOOT_DEV_HYPERFLASH160:
676*db10bad9SBiju Das 		str = boot_hyper160;
677*db10bad9SBiju Das 		break;
678*db10bad9SBiju Das 	case MODEMR_BOOT_DEV_HYPERFLASH80:
679*db10bad9SBiju Das 		str = boot_hyper80;
680*db10bad9SBiju Das 		break;
681*db10bad9SBiju Das 	case MODEMR_BOOT_DEV_QSPI_FLASH40:
682*db10bad9SBiju Das 		str = boot_qspi40;
683*db10bad9SBiju Das 		break;
684*db10bad9SBiju Das 	case MODEMR_BOOT_DEV_QSPI_FLASH80:
685*db10bad9SBiju Das 		str = boot_qspi80;
686*db10bad9SBiju Das 		break;
687*db10bad9SBiju Das 	case MODEMR_BOOT_DEV_EMMC_25X1:
688*db10bad9SBiju Das 		str = boot_emmc25x1;
689*db10bad9SBiju Das 		break;
690*db10bad9SBiju Das 	case MODEMR_BOOT_DEV_EMMC_50X8:
691*db10bad9SBiju Das 		str = boot_emmc50x8;
692*db10bad9SBiju Das 		break;
693*db10bad9SBiju Das 	default:
694*db10bad9SBiju Das 		str = unknown;
695*db10bad9SBiju Das 		break;
696*db10bad9SBiju Das 	}
697*db10bad9SBiju Das 	NOTICE("BL2: Boot device is %s\n", str);
698*db10bad9SBiju Das 
699*db10bad9SBiju Das 	rcar_avs_setting();
700*db10bad9SBiju Das 
701*db10bad9SBiju Das #if RZG_LCS_STATE_DETECTION_ENABLE
702*db10bad9SBiju Das 	reg = rcar_rom_get_lcs(&lcs);
703*db10bad9SBiju Das 	if (reg != 0U) {
704*db10bad9SBiju Das 		str = unknown;
705*db10bad9SBiju Das 		goto lcm_state;
706*db10bad9SBiju Das 	}
707*db10bad9SBiju Das 
708*db10bad9SBiju Das 	switch (lcs) {
709*db10bad9SBiju Das 	case LCS_CM:
710*db10bad9SBiju Das 		str = lcs_cm;
711*db10bad9SBiju Das 		break;
712*db10bad9SBiju Das 	case LCS_DM:
713*db10bad9SBiju Das 		str = lcs_dm;
714*db10bad9SBiju Das 		break;
715*db10bad9SBiju Das 	case LCS_SD:
716*db10bad9SBiju Das 		str = lcs_sd;
717*db10bad9SBiju Das 		break;
718*db10bad9SBiju Das 	case LCS_SE:
719*db10bad9SBiju Das 		str = lcs_secure;
720*db10bad9SBiju Das 		break;
721*db10bad9SBiju Das 	case LCS_FA:
722*db10bad9SBiju Das 		str = lcs_fa;
723*db10bad9SBiju Das 		break;
724*db10bad9SBiju Das 	default:
725*db10bad9SBiju Das 		str = unknown;
726*db10bad9SBiju Das 		break;
727*db10bad9SBiju Das 	}
728*db10bad9SBiju Das 
729*db10bad9SBiju Das lcm_state:
730*db10bad9SBiju Das 	NOTICE("BL2: LCM state is %s\n", str);
731*db10bad9SBiju Das #endif /* RZG_LCS_STATE_DETECTION_ENABLE */
732*db10bad9SBiju Das 
733*db10bad9SBiju Das 	rcar_avs_end();
734*db10bad9SBiju Das 	is_ddr_backup_mode();
735*db10bad9SBiju Das 
736*db10bad9SBiju Das 	bl2_tzram_layout.total_base = BL31_BASE;
737*db10bad9SBiju Das 	bl2_tzram_layout.total_size = BL31_LIMIT - BL31_BASE;
738*db10bad9SBiju Das 
739*db10bad9SBiju Das 	if (boot_cpu == MODEMR_BOOT_CPU_CA57 ||
740*db10bad9SBiju Das 	    boot_cpu == MODEMR_BOOT_CPU_CA53) {
741*db10bad9SBiju Das 		ret = rzg_dram_init();
742*db10bad9SBiju Das 		if (ret != 0) {
743*db10bad9SBiju Das 			NOTICE("BL2: Failed to DRAM initialize (%d).\n", ret);
744*db10bad9SBiju Das 			panic();
745*db10bad9SBiju Das 		}
746*db10bad9SBiju Das 		rzg_qos_init();
747*db10bad9SBiju Das 	}
748*db10bad9SBiju Das 
749*db10bad9SBiju Das 	/* Set up FDT */
750*db10bad9SBiju Das 	ret = fdt_create_empty_tree(fdt, sizeof(fdt_blob));
751*db10bad9SBiju Das 	if (ret != 0) {
752*db10bad9SBiju Das 		NOTICE("BL2: Cannot allocate FDT for U-Boot (ret=%i)\n", ret);
753*db10bad9SBiju Das 		panic();
754*db10bad9SBiju Das 	}
755*db10bad9SBiju Das 
756*db10bad9SBiju Das 	/* Add platform compatible string */
757*db10bad9SBiju Das 	bl2_populate_compatible_string(fdt);
758*db10bad9SBiju Das 
759*db10bad9SBiju Das 	/* Print DRAM layout */
760*db10bad9SBiju Das 	bl2_advertise_dram_size(product);
761*db10bad9SBiju Das 
762*db10bad9SBiju Das 	if (boot_dev == MODEMR_BOOT_DEV_EMMC_25X1 ||
763*db10bad9SBiju Das 	    boot_dev == MODEMR_BOOT_DEV_EMMC_50X8) {
764*db10bad9SBiju Das 		if (rcar_emmc_init() != EMMC_SUCCESS) {
765*db10bad9SBiju Das 			NOTICE("BL2: Failed to eMMC driver initialize.\n");
766*db10bad9SBiju Das 			panic();
767*db10bad9SBiju Das 		}
768*db10bad9SBiju Das 		rcar_emmc_memcard_power(EMMC_POWER_ON);
769*db10bad9SBiju Das 		if (rcar_emmc_mount() != EMMC_SUCCESS) {
770*db10bad9SBiju Das 			NOTICE("BL2: Failed to eMMC mount operation.\n");
771*db10bad9SBiju Das 			panic();
772*db10bad9SBiju Das 		}
773*db10bad9SBiju Das 	} else {
774*db10bad9SBiju Das 		rcar_rpc_init();
775*db10bad9SBiju Das 		rcar_dma_init();
776*db10bad9SBiju Das 	}
777*db10bad9SBiju Das 
778*db10bad9SBiju Das 	reg = mmio_read_32(RST_WDTRSTCR);
779*db10bad9SBiju Das 	reg &= ~WDTRSTCR_RWDT_RSTMSK;
780*db10bad9SBiju Das 	reg |= WDTRSTCR_PASSWORD;
781*db10bad9SBiju Das 	mmio_write_32(RST_WDTRSTCR, reg);
782*db10bad9SBiju Das 
783*db10bad9SBiju Das 	mmio_write_32(CPG_CPGWPR, CPGWPR_PASSWORD);
784*db10bad9SBiju Das 	mmio_write_32(CPG_CPGWPCR, CPGWPCR_PASSWORD);
785*db10bad9SBiju Das 
786*db10bad9SBiju Das 	reg = mmio_read_32(RCAR_PRR);
787*db10bad9SBiju Das 	if ((reg & RCAR_CPU_MASK_CA57) == RCAR_CPU_HAVE_CA57) {
788*db10bad9SBiju Das 		mmio_write_32(CPG_CA57DBGRCR,
789*db10bad9SBiju Das 			      DBGCPUPREN | mmio_read_32(CPG_CA57DBGRCR));
790*db10bad9SBiju Das 	}
791*db10bad9SBiju Das 
792*db10bad9SBiju Das 	if ((reg & RCAR_CPU_MASK_CA53) == RCAR_CPU_HAVE_CA53) {
793*db10bad9SBiju Das 		mmio_write_32(CPG_CA53DBGRCR,
794*db10bad9SBiju Das 			      DBGCPUPREN | mmio_read_32(CPG_CA53DBGRCR));
795*db10bad9SBiju Das 	}
796*db10bad9SBiju Das 
797*db10bad9SBiju Das 	if (product_cut == PRR_PRODUCT_H3_CUT10) {
798*db10bad9SBiju Das 		reg = mmio_read_32(CPG_PLL2CR);
799*db10bad9SBiju Das 		reg &= ~((uint32_t)1 << 5);
800*db10bad9SBiju Das 		mmio_write_32(CPG_PLL2CR, reg);
801*db10bad9SBiju Das 
802*db10bad9SBiju Das 		reg = mmio_read_32(CPG_PLL4CR);
803*db10bad9SBiju Das 		reg &= ~((uint32_t)1 << 5);
804*db10bad9SBiju Das 		mmio_write_32(CPG_PLL4CR, reg);
805*db10bad9SBiju Das 
806*db10bad9SBiju Das 		reg = mmio_read_32(CPG_PLL0CR);
807*db10bad9SBiju Das 		reg &= ~((uint32_t)1 << 12);
808*db10bad9SBiju Das 		mmio_write_32(CPG_PLL0CR, reg);
809*db10bad9SBiju Das 	}
810*db10bad9SBiju Das #if (RCAR_LOSSY_ENABLE == 1)
811*db10bad9SBiju Das 	NOTICE("BL2: Lossy Decomp areas\n");
812*db10bad9SBiju Das 
813*db10bad9SBiju Das 	fcnlnode = fdt_add_subnode(fdt, 0, "reserved-memory");
814*db10bad9SBiju Das 	if (fcnlnode < 0) {
815*db10bad9SBiju Das 		NOTICE("BL2: Cannot create reserved mem node (ret=%i)\n",
816*db10bad9SBiju Das 		       fcnlnode);
817*db10bad9SBiju Das 		panic();
818*db10bad9SBiju Das 	}
819*db10bad9SBiju Das 
820*db10bad9SBiju Das 	bl2_lossy_setting(0, LOSSY_ST_ADDR0, LOSSY_END_ADDR0,
821*db10bad9SBiju Das 			  LOSSY_FMT0, LOSSY_ENA_DIS0, fcnlnode);
822*db10bad9SBiju Das 	bl2_lossy_setting(1, LOSSY_ST_ADDR1, LOSSY_END_ADDR1,
823*db10bad9SBiju Das 			  LOSSY_FMT1, LOSSY_ENA_DIS1, fcnlnode);
824*db10bad9SBiju Das 	bl2_lossy_setting(2, LOSSY_ST_ADDR2, LOSSY_END_ADDR2,
825*db10bad9SBiju Das 			  LOSSY_FMT2, LOSSY_ENA_DIS2, fcnlnode);
826*db10bad9SBiju Das #endif /* RCAR_LOSSY_ENABLE */
827*db10bad9SBiju Das 
828*db10bad9SBiju Das 	fdt_pack(fdt);
829*db10bad9SBiju Das 	NOTICE("BL2: FDT at %p\n", fdt);
830*db10bad9SBiju Das 
831*db10bad9SBiju Das 	if (boot_dev == MODEMR_BOOT_DEV_EMMC_25X1 ||
832*db10bad9SBiju Das 	    boot_dev == MODEMR_BOOT_DEV_EMMC_50X8) {
833*db10bad9SBiju Das 		rcar_io_emmc_setup();
834*db10bad9SBiju Das 	} else {
835*db10bad9SBiju Das 		rcar_io_setup();
836*db10bad9SBiju Das 	}
837*db10bad9SBiju Das }
838*db10bad9SBiju Das 
839*db10bad9SBiju Das void bl2_el3_plat_arch_setup(void)
840*db10bad9SBiju Das {
841*db10bad9SBiju Das #if RCAR_BL2_DCACHE == 1
842*db10bad9SBiju Das 	NOTICE("BL2: D-Cache enable\n");
843*db10bad9SBiju Das 	rcar_configure_mmu_el3(BL2_BASE,
844*db10bad9SBiju Das 			       BL2_END - BL2_BASE,
845*db10bad9SBiju Das 			       BL2_RO_BASE, BL2_RO_LIMIT
846*db10bad9SBiju Das #if USE_COHERENT_MEM
847*db10bad9SBiju Das 			       , BL2_COHERENT_RAM_BASE, BL2_COHERENT_RAM_LIMIT
848*db10bad9SBiju Das #endif /* USE_COHERENT_MEM */
849*db10bad9SBiju Das 	    );
850*db10bad9SBiju Das #endif /* RCAR_BL2_DCACHE == 1 */
851*db10bad9SBiju Das }
852*db10bad9SBiju Das 
853*db10bad9SBiju Das void bl2_platform_setup(void)
854*db10bad9SBiju Das {
855*db10bad9SBiju Das 	/*
856*db10bad9SBiju Das 	 * Place holder for performing any platform initialization specific
857*db10bad9SBiju Das 	 * to BL2.
858*db10bad9SBiju Das 	 */
859*db10bad9SBiju Das }
860*db10bad9SBiju Das 
861*db10bad9SBiju Das static void bl2_init_generic_timer(void)
862*db10bad9SBiju Das {
863*db10bad9SBiju Das 	uint32_t reg_cntfid;
864*db10bad9SBiju Das 	uint32_t modemr;
865*db10bad9SBiju Das 	uint32_t modemr_pll;
866*db10bad9SBiju Das 	uint32_t pll_table[] = {
867*db10bad9SBiju Das 		EXTAL_MD14_MD13_TYPE_0,	/* MD14/MD13 : 0b00 */
868*db10bad9SBiju Das 		EXTAL_MD14_MD13_TYPE_1,	/* MD14/MD13 : 0b01 */
869*db10bad9SBiju Das 		EXTAL_MD14_MD13_TYPE_2,	/* MD14/MD13 : 0b10 */
870*db10bad9SBiju Das 		EXTAL_MD14_MD13_TYPE_3	/* MD14/MD13 : 0b11 */
871*db10bad9SBiju Das 	};
872*db10bad9SBiju Das 
873*db10bad9SBiju Das 	modemr = mmio_read_32(RCAR_MODEMR);
874*db10bad9SBiju Das 	modemr_pll = (modemr & MODEMR_BOOT_PLL_MASK);
875*db10bad9SBiju Das 
876*db10bad9SBiju Das 	/* Set frequency data in CNTFID0 */
877*db10bad9SBiju Das 	reg_cntfid = pll_table[modemr_pll >> MODEMR_BOOT_PLL_SHIFT];
878*db10bad9SBiju Das 
879*db10bad9SBiju Das 	/* Update memory mapped and register based frequency */
880*db10bad9SBiju Das 	write_cntfrq_el0((u_register_t)reg_cntfid);
881*db10bad9SBiju Das 	mmio_write_32(ARM_SYS_CNTCTL_BASE + (uintptr_t)CNTFID_OFF, reg_cntfid);
882*db10bad9SBiju Das 	/* Enable counter */
883*db10bad9SBiju Das 	mmio_setbits_32(RCAR_CNTC_BASE + (uintptr_t)CNTCR_OFF,
884*db10bad9SBiju Das 			(uint32_t)CNTCR_EN);
885*db10bad9SBiju Das }
886