xref: /rk3399_ARM-atf/plat/renesas/rcar/bl2_plat_setup.c (revision 7e532c4bf7229f0771cae95b2572f7cb5103a4ae)
1*7e532c4bSJorge Ramirez-Ortiz /*
2*7e532c4bSJorge Ramirez-Ortiz  * Copyright (c) 2018, Renesas Electronics Corporation. All rights reserved.
3*7e532c4bSJorge Ramirez-Ortiz  *
4*7e532c4bSJorge Ramirez-Ortiz  * SPDX-License-Identifier: BSD-3-Clause
5*7e532c4bSJorge Ramirez-Ortiz  */
6*7e532c4bSJorge Ramirez-Ortiz 
7*7e532c4bSJorge Ramirez-Ortiz #include <desc_image_load.h>
8*7e532c4bSJorge Ramirez-Ortiz #include <arch_helpers.h>
9*7e532c4bSJorge Ramirez-Ortiz #include <bl_common.h>
10*7e532c4bSJorge Ramirez-Ortiz #include <bl1.h>
11*7e532c4bSJorge Ramirez-Ortiz #include <console.h>
12*7e532c4bSJorge Ramirez-Ortiz #include <debug.h>
13*7e532c4bSJorge Ramirez-Ortiz #include <mmio.h>
14*7e532c4bSJorge Ramirez-Ortiz #include <platform.h>
15*7e532c4bSJorge Ramirez-Ortiz #include <platform_def.h>
16*7e532c4bSJorge Ramirez-Ortiz #include <string.h>
17*7e532c4bSJorge Ramirez-Ortiz 
18*7e532c4bSJorge Ramirez-Ortiz #include "avs_driver.h"
19*7e532c4bSJorge Ramirez-Ortiz #include "boot_init_dram.h"
20*7e532c4bSJorge Ramirez-Ortiz #include "cpg_registers.h"
21*7e532c4bSJorge Ramirez-Ortiz #include "board.h"
22*7e532c4bSJorge Ramirez-Ortiz #include "emmc_def.h"
23*7e532c4bSJorge Ramirez-Ortiz #include "emmc_hal.h"
24*7e532c4bSJorge Ramirez-Ortiz #include "emmc_std.h"
25*7e532c4bSJorge Ramirez-Ortiz 
26*7e532c4bSJorge Ramirez-Ortiz #if PMIC_ROHM_BD9571 && RCAR_SYSTEM_RESET_KEEPON_DDR
27*7e532c4bSJorge Ramirez-Ortiz #include "iic_dvfs.h"
28*7e532c4bSJorge Ramirez-Ortiz #endif
29*7e532c4bSJorge Ramirez-Ortiz 
30*7e532c4bSJorge Ramirez-Ortiz #include "io_common.h"
31*7e532c4bSJorge Ramirez-Ortiz #include "qos_init.h"
32*7e532c4bSJorge Ramirez-Ortiz #include "rcar_def.h"
33*7e532c4bSJorge Ramirez-Ortiz #include "rcar_private.h"
34*7e532c4bSJorge Ramirez-Ortiz #include "rcar_version.h"
35*7e532c4bSJorge Ramirez-Ortiz #include "rom_api.h"
36*7e532c4bSJorge Ramirez-Ortiz 
37*7e532c4bSJorge Ramirez-Ortiz IMPORT_SYM(unsigned long, __RO_START__, BL2_RO_BASE)
38*7e532c4bSJorge Ramirez-Ortiz IMPORT_SYM(unsigned long, __RO_END__, BL2_RO_LIMIT)
39*7e532c4bSJorge Ramirez-Ortiz 
40*7e532c4bSJorge Ramirez-Ortiz #if USE_COHERENT_MEM
41*7e532c4bSJorge Ramirez-Ortiz IMPORT_SYM(unsigned long, __COHERENT_RAM_START__, BL2_COHERENT_RAM_BASE)
42*7e532c4bSJorge Ramirez-Ortiz IMPORT_SYM(unsigned long, __COHERENT_RAM_END__, BL2_COHERENT_RAM_LIMIT)
43*7e532c4bSJorge Ramirez-Ortiz #endif
44*7e532c4bSJorge Ramirez-Ortiz 
45*7e532c4bSJorge Ramirez-Ortiz extern void plat_rcar_gic_driver_init(void);
46*7e532c4bSJorge Ramirez-Ortiz extern void plat_rcar_gic_init(void);
47*7e532c4bSJorge Ramirez-Ortiz extern void bl2_enter_bl31(const struct entry_point_info *bl_ep_info);
48*7e532c4bSJorge Ramirez-Ortiz extern void bl2_system_cpg_init(void);
49*7e532c4bSJorge Ramirez-Ortiz extern void bl2_secure_setting(void);
50*7e532c4bSJorge Ramirez-Ortiz extern void bl2_cpg_init(void);
51*7e532c4bSJorge Ramirez-Ortiz extern void rcar_io_emmc_setup(void);
52*7e532c4bSJorge Ramirez-Ortiz extern void rcar_io_setup(void);
53*7e532c4bSJorge Ramirez-Ortiz extern void rcar_swdt_release(void);
54*7e532c4bSJorge Ramirez-Ortiz extern void rcar_swdt_init(void);
55*7e532c4bSJorge Ramirez-Ortiz extern void rcar_rpc_init(void);
56*7e532c4bSJorge Ramirez-Ortiz extern void rcar_pfc_init(void);
57*7e532c4bSJorge Ramirez-Ortiz extern void rcar_dma_init(void);
58*7e532c4bSJorge Ramirez-Ortiz 
59*7e532c4bSJorge Ramirez-Ortiz /* R-Car Gen3 product check */
60*7e532c4bSJorge Ramirez-Ortiz #if (RCAR_LSI == RCAR_H3) || (RCAR_LSI == RCAR_H3N)
61*7e532c4bSJorge Ramirez-Ortiz #define TARGET_PRODUCT			RCAR_PRODUCT_H3
62*7e532c4bSJorge Ramirez-Ortiz #define TARGET_NAME			"R-Car H3"
63*7e532c4bSJorge Ramirez-Ortiz #elif RCAR_LSI == RCAR_M3
64*7e532c4bSJorge Ramirez-Ortiz #define TARGET_PRODUCT			RCAR_PRODUCT_M3
65*7e532c4bSJorge Ramirez-Ortiz #define TARGET_NAME			"R-Car M3"
66*7e532c4bSJorge Ramirez-Ortiz #elif RCAR_LSI == RCAR_M3N
67*7e532c4bSJorge Ramirez-Ortiz #define TARGET_PRODUCT			RCAR_PRODUCT_M3N
68*7e532c4bSJorge Ramirez-Ortiz #define TARGET_NAME			"R-Car M3N"
69*7e532c4bSJorge Ramirez-Ortiz #elif RCAR_LSI == RCAR_E3
70*7e532c4bSJorge Ramirez-Ortiz #define TARGET_PRODUCT			RCAR_PRODUCT_E3
71*7e532c4bSJorge Ramirez-Ortiz #define TARGET_NAME			"R-Car E3"
72*7e532c4bSJorge Ramirez-Ortiz #endif
73*7e532c4bSJorge Ramirez-Ortiz 
74*7e532c4bSJorge Ramirez-Ortiz #if (RCAR_LSI == RCAR_E3)
75*7e532c4bSJorge Ramirez-Ortiz #define GPIO_INDT			(GPIO_INDT6)
76*7e532c4bSJorge Ramirez-Ortiz #define GPIO_BKUP_TRG_SHIFT		((uint32_t)1U<<13U)
77*7e532c4bSJorge Ramirez-Ortiz #else
78*7e532c4bSJorge Ramirez-Ortiz #define GPIO_INDT			(GPIO_INDT1)
79*7e532c4bSJorge Ramirez-Ortiz #define GPIO_BKUP_TRG_SHIFT		((uint32_t)1U<<8U)
80*7e532c4bSJorge Ramirez-Ortiz #endif
81*7e532c4bSJorge Ramirez-Ortiz 
82*7e532c4bSJorge Ramirez-Ortiz CASSERT((PARAMS_BASE + sizeof(bl2_to_bl31_params_mem_t) + 0x100)
83*7e532c4bSJorge Ramirez-Ortiz 	 < (RCAR_SHARED_MEM_BASE + RCAR_SHARED_MEM_SIZE),
84*7e532c4bSJorge Ramirez-Ortiz 	assert_bl31_params_do_not_fit_in_shared_memory);
85*7e532c4bSJorge Ramirez-Ortiz 
86*7e532c4bSJorge Ramirez-Ortiz static meminfo_t bl2_tzram_layout __aligned(CACHE_WRITEBACK_GRANULE);
87*7e532c4bSJorge Ramirez-Ortiz 
88*7e532c4bSJorge Ramirez-Ortiz #if (RCAR_LOSSY_ENABLE == 1)
89*7e532c4bSJorge Ramirez-Ortiz typedef struct bl2_lossy_info {
90*7e532c4bSJorge Ramirez-Ortiz 	uint32_t magic;
91*7e532c4bSJorge Ramirez-Ortiz 	uint32_t a0;
92*7e532c4bSJorge Ramirez-Ortiz 	uint32_t b0;
93*7e532c4bSJorge Ramirez-Ortiz } bl2_lossy_info_t;
94*7e532c4bSJorge Ramirez-Ortiz 
95*7e532c4bSJorge Ramirez-Ortiz static void bl2_lossy_setting(uint32_t no, uint64_t start_addr,
96*7e532c4bSJorge Ramirez-Ortiz 			      uint64_t end_addr, uint32_t format,
97*7e532c4bSJorge Ramirez-Ortiz 			      uint32_t enable)
98*7e532c4bSJorge Ramirez-Ortiz {
99*7e532c4bSJorge Ramirez-Ortiz 	bl2_lossy_info_t info;
100*7e532c4bSJorge Ramirez-Ortiz 	uint32_t reg;
101*7e532c4bSJorge Ramirez-Ortiz 
102*7e532c4bSJorge Ramirez-Ortiz 	reg = format | (start_addr >> 20);
103*7e532c4bSJorge Ramirez-Ortiz 	mmio_write_32(AXI_DCMPAREACRA0 + 0x8 * no, reg);
104*7e532c4bSJorge Ramirez-Ortiz 	mmio_write_32(AXI_DCMPAREACRB0 + 0x8 * no, end_addr >> 20);
105*7e532c4bSJorge Ramirez-Ortiz 	mmio_write_32(AXI_DCMPAREACRA0 + 0x8 * no, reg | enable);
106*7e532c4bSJorge Ramirez-Ortiz 
107*7e532c4bSJorge Ramirez-Ortiz 	info.magic = 0x12345678U;
108*7e532c4bSJorge Ramirez-Ortiz 	info.a0 = mmio_read_32(AXI_DCMPAREACRA0 + 0x8 * no);
109*7e532c4bSJorge Ramirez-Ortiz 	info.b0 = mmio_read_32(AXI_DCMPAREACRB0 + 0x8 * no);
110*7e532c4bSJorge Ramirez-Ortiz 
111*7e532c4bSJorge Ramirez-Ortiz 	mmio_write_32(LOSSY_PARAMS_BASE + sizeof(info) * no, info.magic);
112*7e532c4bSJorge Ramirez-Ortiz 	mmio_write_32(LOSSY_PARAMS_BASE + sizeof(info) * no + 0x4, info.a0);
113*7e532c4bSJorge Ramirez-Ortiz 	mmio_write_32(LOSSY_PARAMS_BASE + sizeof(info) * no + 0x8, info.b0);
114*7e532c4bSJorge Ramirez-Ortiz 
115*7e532c4bSJorge Ramirez-Ortiz 	NOTICE("     Entry %d: DCMPAREACRAx:0x%x DCMPAREACRBx:0x%x\n", no,
116*7e532c4bSJorge Ramirez-Ortiz 	       mmio_read_32(AXI_DCMPAREACRA0 + 0x8 * no),
117*7e532c4bSJorge Ramirez-Ortiz 	       mmio_read_32(AXI_DCMPAREACRB0 + 0x8 * no));
118*7e532c4bSJorge Ramirez-Ortiz }
119*7e532c4bSJorge Ramirez-Ortiz #endif
120*7e532c4bSJorge Ramirez-Ortiz 
121*7e532c4bSJorge Ramirez-Ortiz void bl2_plat_flush_bl31_params(void)
122*7e532c4bSJorge Ramirez-Ortiz {
123*7e532c4bSJorge Ramirez-Ortiz 	uint32_t product_cut, product, cut;
124*7e532c4bSJorge Ramirez-Ortiz 	uint32_t boot_dev, boot_cpu;
125*7e532c4bSJorge Ramirez-Ortiz 	uint32_t lcs, reg, val;
126*7e532c4bSJorge Ramirez-Ortiz 
127*7e532c4bSJorge Ramirez-Ortiz 	reg = mmio_read_32(RCAR_MODEMR);
128*7e532c4bSJorge Ramirez-Ortiz 	boot_dev = reg & MODEMR_BOOT_DEV_MASK;
129*7e532c4bSJorge Ramirez-Ortiz 
130*7e532c4bSJorge Ramirez-Ortiz 	if (boot_dev == MODEMR_BOOT_DEV_EMMC_25X1 ||
131*7e532c4bSJorge Ramirez-Ortiz 	    boot_dev == MODEMR_BOOT_DEV_EMMC_50X8)
132*7e532c4bSJorge Ramirez-Ortiz 		emmc_terminate();
133*7e532c4bSJorge Ramirez-Ortiz 
134*7e532c4bSJorge Ramirez-Ortiz 	if ((reg & MODEMR_BOOT_CPU_MASK) != MODEMR_BOOT_CPU_CR7)
135*7e532c4bSJorge Ramirez-Ortiz 		bl2_secure_setting();
136*7e532c4bSJorge Ramirez-Ortiz 
137*7e532c4bSJorge Ramirez-Ortiz 	reg = mmio_read_32(RCAR_PRR);
138*7e532c4bSJorge Ramirez-Ortiz 	product_cut = reg & (RCAR_PRODUCT_MASK | RCAR_CUT_MASK);
139*7e532c4bSJorge Ramirez-Ortiz 	product = reg & RCAR_PRODUCT_MASK;
140*7e532c4bSJorge Ramirez-Ortiz 	cut = reg & RCAR_CUT_MASK;
141*7e532c4bSJorge Ramirez-Ortiz 
142*7e532c4bSJorge Ramirez-Ortiz 	if (product == RCAR_PRODUCT_M3)
143*7e532c4bSJorge Ramirez-Ortiz 		goto tlb;
144*7e532c4bSJorge Ramirez-Ortiz 
145*7e532c4bSJorge Ramirez-Ortiz 	if (product == RCAR_PRODUCT_H3 && RCAR_CUT_VER20 > cut)
146*7e532c4bSJorge Ramirez-Ortiz 		goto tlb;
147*7e532c4bSJorge Ramirez-Ortiz 
148*7e532c4bSJorge Ramirez-Ortiz 	/* Disable MFIS write protection */
149*7e532c4bSJorge Ramirez-Ortiz 	mmio_write_32(MFISWPCNTR, MFISWPCNTR_PASSWORD | 1);
150*7e532c4bSJorge Ramirez-Ortiz 
151*7e532c4bSJorge Ramirez-Ortiz tlb:
152*7e532c4bSJorge Ramirez-Ortiz 	reg = mmio_read_32(RCAR_MODEMR);
153*7e532c4bSJorge Ramirez-Ortiz 	boot_cpu = reg & MODEMR_BOOT_CPU_MASK;
154*7e532c4bSJorge Ramirez-Ortiz 	if (boot_cpu != MODEMR_BOOT_CPU_CA57 &&
155*7e532c4bSJorge Ramirez-Ortiz 	    boot_cpu != MODEMR_BOOT_CPU_CA53)
156*7e532c4bSJorge Ramirez-Ortiz 		goto mmu;
157*7e532c4bSJorge Ramirez-Ortiz 
158*7e532c4bSJorge Ramirez-Ortiz 	if (product_cut == RCAR_PRODUCT_H3_CUT20) {
159*7e532c4bSJorge Ramirez-Ortiz 		mmio_write_32(IPMMUVI0_IMSCTLR, IMSCTLR_DISCACHE);
160*7e532c4bSJorge Ramirez-Ortiz 		mmio_write_32(IPMMUVI1_IMSCTLR, IMSCTLR_DISCACHE);
161*7e532c4bSJorge Ramirez-Ortiz 		mmio_write_32(IPMMUPV0_IMSCTLR, IMSCTLR_DISCACHE);
162*7e532c4bSJorge Ramirez-Ortiz 		mmio_write_32(IPMMUPV1_IMSCTLR, IMSCTLR_DISCACHE);
163*7e532c4bSJorge Ramirez-Ortiz 		mmio_write_32(IPMMUPV2_IMSCTLR, IMSCTLR_DISCACHE);
164*7e532c4bSJorge Ramirez-Ortiz 		mmio_write_32(IPMMUPV3_IMSCTLR, IMSCTLR_DISCACHE);
165*7e532c4bSJorge Ramirez-Ortiz 	} else if (product_cut == (RCAR_PRODUCT_M3N | RCAR_CUT_VER10) ||
166*7e532c4bSJorge Ramirez-Ortiz 		   product_cut == (RCAR_PRODUCT_M3N | RCAR_CUT_VER11)) {
167*7e532c4bSJorge Ramirez-Ortiz 		mmio_write_32(IPMMUVI0_IMSCTLR, IMSCTLR_DISCACHE);
168*7e532c4bSJorge Ramirez-Ortiz 		mmio_write_32(IPMMUPV0_IMSCTLR, IMSCTLR_DISCACHE);
169*7e532c4bSJorge Ramirez-Ortiz 	} else if (product_cut == (RCAR_PRODUCT_E3 | RCAR_CUT_VER10)) {
170*7e532c4bSJorge Ramirez-Ortiz 		mmio_write_32(IPMMUVI0_IMSCTLR, IMSCTLR_DISCACHE);
171*7e532c4bSJorge Ramirez-Ortiz 		mmio_write_32(IPMMUPV0_IMSCTLR, IMSCTLR_DISCACHE);
172*7e532c4bSJorge Ramirez-Ortiz 	}
173*7e532c4bSJorge Ramirez-Ortiz 
174*7e532c4bSJorge Ramirez-Ortiz 	if (product_cut == (RCAR_PRODUCT_H3_CUT20) ||
175*7e532c4bSJorge Ramirez-Ortiz 	    product_cut == (RCAR_PRODUCT_M3N | RCAR_CUT_VER10) ||
176*7e532c4bSJorge Ramirez-Ortiz 	    product_cut == (RCAR_PRODUCT_M3N | RCAR_CUT_VER11) ||
177*7e532c4bSJorge Ramirez-Ortiz 	    product_cut == (RCAR_PRODUCT_E3 | RCAR_CUT_VER10)) {
178*7e532c4bSJorge Ramirez-Ortiz 		mmio_write_32(IPMMUHC_IMSCTLR, IMSCTLR_DISCACHE);
179*7e532c4bSJorge Ramirez-Ortiz 		mmio_write_32(IPMMURT_IMSCTLR, IMSCTLR_DISCACHE);
180*7e532c4bSJorge Ramirez-Ortiz 		mmio_write_32(IPMMUMP_IMSCTLR, IMSCTLR_DISCACHE);
181*7e532c4bSJorge Ramirez-Ortiz 
182*7e532c4bSJorge Ramirez-Ortiz 		mmio_write_32(IPMMUDS0_IMSCTLR, IMSCTLR_DISCACHE);
183*7e532c4bSJorge Ramirez-Ortiz 		mmio_write_32(IPMMUDS1_IMSCTLR, IMSCTLR_DISCACHE);
184*7e532c4bSJorge Ramirez-Ortiz 	}
185*7e532c4bSJorge Ramirez-Ortiz 
186*7e532c4bSJorge Ramirez-Ortiz mmu:
187*7e532c4bSJorge Ramirez-Ortiz 	mmio_write_32(IPMMUMM_IMSCTLR, IPMMUMM_IMSCTLR_ENABLE);
188*7e532c4bSJorge Ramirez-Ortiz 	mmio_write_32(IPMMUMM_IMAUXCTLR, IPMMUMM_IMAUXCTLR_NMERGE40_BIT);
189*7e532c4bSJorge Ramirez-Ortiz 
190*7e532c4bSJorge Ramirez-Ortiz 	val = rcar_rom_get_lcs(&lcs);
191*7e532c4bSJorge Ramirez-Ortiz 	if (val) {
192*7e532c4bSJorge Ramirez-Ortiz 		ERROR("BL2: Failed to get the LCS. (%d)\n", val);
193*7e532c4bSJorge Ramirez-Ortiz 		panic();
194*7e532c4bSJorge Ramirez-Ortiz 	}
195*7e532c4bSJorge Ramirez-Ortiz 
196*7e532c4bSJorge Ramirez-Ortiz 	if (lcs == LCS_SE)
197*7e532c4bSJorge Ramirez-Ortiz 		mmio_clrbits_32(P_ARMREG_SEC_CTRL, P_ARMREG_SEC_CTRL_PROT);
198*7e532c4bSJorge Ramirez-Ortiz 
199*7e532c4bSJorge Ramirez-Ortiz 	rcar_swdt_release();
200*7e532c4bSJorge Ramirez-Ortiz 	bl2_system_cpg_init();
201*7e532c4bSJorge Ramirez-Ortiz 
202*7e532c4bSJorge Ramirez-Ortiz #if RCAR_BL2_DCACHE == 1
203*7e532c4bSJorge Ramirez-Ortiz 	/* Disable data cache (clean and invalidate) */
204*7e532c4bSJorge Ramirez-Ortiz 	disable_mmu_el3();
205*7e532c4bSJorge Ramirez-Ortiz #endif
206*7e532c4bSJorge Ramirez-Ortiz }
207*7e532c4bSJorge Ramirez-Ortiz 
208*7e532c4bSJorge Ramirez-Ortiz static uint32_t is_ddr_backup_mode(void)
209*7e532c4bSJorge Ramirez-Ortiz {
210*7e532c4bSJorge Ramirez-Ortiz #if RCAR_SYSTEM_SUSPEND
211*7e532c4bSJorge Ramirez-Ortiz 	static uint32_t reason = RCAR_COLD_BOOT;
212*7e532c4bSJorge Ramirez-Ortiz 	static uint32_t once;
213*7e532c4bSJorge Ramirez-Ortiz 
214*7e532c4bSJorge Ramirez-Ortiz #if PMIC_ROHM_BD9571 && RCAR_SYSTEM_RESET_KEEPON_DDR
215*7e532c4bSJorge Ramirez-Ortiz 	uint8_t data;
216*7e532c4bSJorge Ramirez-Ortiz #endif
217*7e532c4bSJorge Ramirez-Ortiz 	if (once)
218*7e532c4bSJorge Ramirez-Ortiz 		return reason;
219*7e532c4bSJorge Ramirez-Ortiz 
220*7e532c4bSJorge Ramirez-Ortiz 	once = 1;
221*7e532c4bSJorge Ramirez-Ortiz 	if ((mmio_read_32(GPIO_INDT) & GPIO_BKUP_TRG_SHIFT) == 0)
222*7e532c4bSJorge Ramirez-Ortiz 		return reason;
223*7e532c4bSJorge Ramirez-Ortiz 
224*7e532c4bSJorge Ramirez-Ortiz #if PMIC_ROHM_BD9571 && RCAR_SYSTEM_RESET_KEEPON_DDR
225*7e532c4bSJorge Ramirez-Ortiz 	if (rcar_iic_dvfs_receive(PMIC, REG_KEEP10, &data)) {
226*7e532c4bSJorge Ramirez-Ortiz 		ERROR("BL2: REG Keep10 READ ERROR.\n");
227*7e532c4bSJorge Ramirez-Ortiz 		panic();
228*7e532c4bSJorge Ramirez-Ortiz 	}
229*7e532c4bSJorge Ramirez-Ortiz 
230*7e532c4bSJorge Ramirez-Ortiz 	if (KEEP10_MAGIC != data)
231*7e532c4bSJorge Ramirez-Ortiz 		reason = RCAR_WARM_BOOT;
232*7e532c4bSJorge Ramirez-Ortiz #else
233*7e532c4bSJorge Ramirez-Ortiz 	reason = RCAR_WARM_BOOT;
234*7e532c4bSJorge Ramirez-Ortiz #endif
235*7e532c4bSJorge Ramirez-Ortiz 	return reason;
236*7e532c4bSJorge Ramirez-Ortiz #else
237*7e532c4bSJorge Ramirez-Ortiz 	return RCAR_COLD_BOOT;
238*7e532c4bSJorge Ramirez-Ortiz #endif
239*7e532c4bSJorge Ramirez-Ortiz }
240*7e532c4bSJorge Ramirez-Ortiz 
241*7e532c4bSJorge Ramirez-Ortiz int bl2_plat_handle_pre_image_load(unsigned int image_id)
242*7e532c4bSJorge Ramirez-Ortiz {
243*7e532c4bSJorge Ramirez-Ortiz 	u_register_t *boot_kind = (void *) BOOT_KIND_BASE;
244*7e532c4bSJorge Ramirez-Ortiz 	bl_mem_params_node_t *bl_mem_params;
245*7e532c4bSJorge Ramirez-Ortiz 
246*7e532c4bSJorge Ramirez-Ortiz 	if (image_id != BL31_IMAGE_ID)
247*7e532c4bSJorge Ramirez-Ortiz 		return 0;
248*7e532c4bSJorge Ramirez-Ortiz 
249*7e532c4bSJorge Ramirez-Ortiz 	bl_mem_params = get_bl_mem_params_node(image_id);
250*7e532c4bSJorge Ramirez-Ortiz 
251*7e532c4bSJorge Ramirez-Ortiz 	if (is_ddr_backup_mode() == RCAR_COLD_BOOT)
252*7e532c4bSJorge Ramirez-Ortiz 		goto cold_boot;
253*7e532c4bSJorge Ramirez-Ortiz 
254*7e532c4bSJorge Ramirez-Ortiz 	*boot_kind  = RCAR_WARM_BOOT;
255*7e532c4bSJorge Ramirez-Ortiz 	flush_dcache_range(BOOT_KIND_BASE, sizeof(*boot_kind));
256*7e532c4bSJorge Ramirez-Ortiz 
257*7e532c4bSJorge Ramirez-Ortiz 	console_flush();
258*7e532c4bSJorge Ramirez-Ortiz 	bl2_plat_flush_bl31_params();
259*7e532c4bSJorge Ramirez-Ortiz 
260*7e532c4bSJorge Ramirez-Ortiz 	/* will not return */
261*7e532c4bSJorge Ramirez-Ortiz 	bl2_enter_bl31(&bl_mem_params->ep_info);
262*7e532c4bSJorge Ramirez-Ortiz 
263*7e532c4bSJorge Ramirez-Ortiz cold_boot:
264*7e532c4bSJorge Ramirez-Ortiz 	*boot_kind  = RCAR_COLD_BOOT;
265*7e532c4bSJorge Ramirez-Ortiz 	flush_dcache_range(BOOT_KIND_BASE, sizeof(*boot_kind));
266*7e532c4bSJorge Ramirez-Ortiz 
267*7e532c4bSJorge Ramirez-Ortiz 	return 0;
268*7e532c4bSJorge Ramirez-Ortiz }
269*7e532c4bSJorge Ramirez-Ortiz 
270*7e532c4bSJorge Ramirez-Ortiz int bl2_plat_handle_post_image_load(unsigned int image_id)
271*7e532c4bSJorge Ramirez-Ortiz {
272*7e532c4bSJorge Ramirez-Ortiz 	static bl2_to_bl31_params_mem_t *params;
273*7e532c4bSJorge Ramirez-Ortiz 	bl_mem_params_node_t *bl_mem_params;
274*7e532c4bSJorge Ramirez-Ortiz 
275*7e532c4bSJorge Ramirez-Ortiz 	if (!params) {
276*7e532c4bSJorge Ramirez-Ortiz 		params = (bl2_to_bl31_params_mem_t *) PARAMS_BASE;
277*7e532c4bSJorge Ramirez-Ortiz 		memset((void *)PARAMS_BASE, 0, sizeof(*params));
278*7e532c4bSJorge Ramirez-Ortiz 	}
279*7e532c4bSJorge Ramirez-Ortiz 
280*7e532c4bSJorge Ramirez-Ortiz 	bl_mem_params = get_bl_mem_params_node(image_id);
281*7e532c4bSJorge Ramirez-Ortiz 
282*7e532c4bSJorge Ramirez-Ortiz 	switch (image_id) {
283*7e532c4bSJorge Ramirez-Ortiz 	case BL31_IMAGE_ID:
284*7e532c4bSJorge Ramirez-Ortiz 		break;
285*7e532c4bSJorge Ramirez-Ortiz 	case BL32_IMAGE_ID:
286*7e532c4bSJorge Ramirez-Ortiz 		memcpy(&params->bl32_ep_info, &bl_mem_params->ep_info,
287*7e532c4bSJorge Ramirez-Ortiz 			sizeof(entry_point_info_t));
288*7e532c4bSJorge Ramirez-Ortiz 		break;
289*7e532c4bSJorge Ramirez-Ortiz 	case BL33_IMAGE_ID:
290*7e532c4bSJorge Ramirez-Ortiz 		memcpy(&params->bl33_ep_info, &bl_mem_params->ep_info,
291*7e532c4bSJorge Ramirez-Ortiz 			sizeof(entry_point_info_t));
292*7e532c4bSJorge Ramirez-Ortiz 		break;
293*7e532c4bSJorge Ramirez-Ortiz 	}
294*7e532c4bSJorge Ramirez-Ortiz 
295*7e532c4bSJorge Ramirez-Ortiz 	return 0;
296*7e532c4bSJorge Ramirez-Ortiz }
297*7e532c4bSJorge Ramirez-Ortiz 
298*7e532c4bSJorge Ramirez-Ortiz meminfo_t *bl2_plat_sec_mem_layout(void)
299*7e532c4bSJorge Ramirez-Ortiz {
300*7e532c4bSJorge Ramirez-Ortiz 	return &bl2_tzram_layout;
301*7e532c4bSJorge Ramirez-Ortiz }
302*7e532c4bSJorge Ramirez-Ortiz 
303*7e532c4bSJorge Ramirez-Ortiz void bl2_el3_early_platform_setup(u_register_t arg1, u_register_t arg2,
304*7e532c4bSJorge Ramirez-Ortiz 				  u_register_t arg3, u_register_t arg4)
305*7e532c4bSJorge Ramirez-Ortiz {
306*7e532c4bSJorge Ramirez-Ortiz 	uint32_t reg, midr, lcs, boot_dev, boot_cpu, sscg, type, rev;
307*7e532c4bSJorge Ramirez-Ortiz 	uint32_t cut, product, product_cut, major, minor;
308*7e532c4bSJorge Ramirez-Ortiz 	int32_t ret;
309*7e532c4bSJorge Ramirez-Ortiz 	const char *str;
310*7e532c4bSJorge Ramirez-Ortiz 	const char *unknown = "unknown";
311*7e532c4bSJorge Ramirez-Ortiz 	const char *cpu_ca57 = "CA57";
312*7e532c4bSJorge Ramirez-Ortiz 	const char *cpu_ca53 = "CA53";
313*7e532c4bSJorge Ramirez-Ortiz 	const char *product_m3n = "M3N";
314*7e532c4bSJorge Ramirez-Ortiz 	const char *product_h3 = "H3";
315*7e532c4bSJorge Ramirez-Ortiz 	const char *product_m3 = "M3";
316*7e532c4bSJorge Ramirez-Ortiz 	const char *product_e3 = "E3";
317*7e532c4bSJorge Ramirez-Ortiz 	const char *lcs_secure = "SE";
318*7e532c4bSJorge Ramirez-Ortiz 	const char *lcs_cm = "CM";
319*7e532c4bSJorge Ramirez-Ortiz 	const char *lcs_dm = "DM";
320*7e532c4bSJorge Ramirez-Ortiz 	const char *lcs_sd = "SD";
321*7e532c4bSJorge Ramirez-Ortiz 	const char *lcs_fa = "FA";
322*7e532c4bSJorge Ramirez-Ortiz 	const char *sscg_off = "PLL1 nonSSCG Clock select";
323*7e532c4bSJorge Ramirez-Ortiz 	const char *sscg_on = "PLL1 SSCG Clock select";
324*7e532c4bSJorge Ramirez-Ortiz 	const char *boot_hyper80 = "HyperFlash(80MHz)";
325*7e532c4bSJorge Ramirez-Ortiz 	const char *boot_qspi40 = "QSPI Flash(40MHz)";
326*7e532c4bSJorge Ramirez-Ortiz 	const char *boot_qspi80 = "QSPI Flash(80MHz)";
327*7e532c4bSJorge Ramirez-Ortiz 	const char *boot_emmc25x1 = "eMMC(25MHz x1)";
328*7e532c4bSJorge Ramirez-Ortiz 	const char *boot_emmc50x8 = "eMMC(50MHz x8)";
329*7e532c4bSJorge Ramirez-Ortiz #if RCAR_LSI == RCAR_E3
330*7e532c4bSJorge Ramirez-Ortiz 	const char *boot_hyper160 = "HyperFlash(150MHz)";
331*7e532c4bSJorge Ramirez-Ortiz #else
332*7e532c4bSJorge Ramirez-Ortiz 	const char *boot_hyper160 = "HyperFlash(160MHz)";
333*7e532c4bSJorge Ramirez-Ortiz #endif
334*7e532c4bSJorge Ramirez-Ortiz 
335*7e532c4bSJorge Ramirez-Ortiz 	reg = mmio_read_32(RCAR_MODEMR);
336*7e532c4bSJorge Ramirez-Ortiz 	boot_dev = reg & MODEMR_BOOT_DEV_MASK;
337*7e532c4bSJorge Ramirez-Ortiz 	boot_cpu = reg & MODEMR_BOOT_CPU_MASK;
338*7e532c4bSJorge Ramirez-Ortiz 
339*7e532c4bSJorge Ramirez-Ortiz 	bl2_cpg_init();
340*7e532c4bSJorge Ramirez-Ortiz 
341*7e532c4bSJorge Ramirez-Ortiz 	if (boot_cpu == MODEMR_BOOT_CPU_CA57 ||
342*7e532c4bSJorge Ramirez-Ortiz 	    boot_cpu == MODEMR_BOOT_CPU_CA53) {
343*7e532c4bSJorge Ramirez-Ortiz 		rcar_pfc_init();
344*7e532c4bSJorge Ramirez-Ortiz 		/* console configuration (platform specific) done in driver */
345*7e532c4bSJorge Ramirez-Ortiz 		console_init(0, 0, 0);
346*7e532c4bSJorge Ramirez-Ortiz 	}
347*7e532c4bSJorge Ramirez-Ortiz 
348*7e532c4bSJorge Ramirez-Ortiz 	plat_rcar_gic_driver_init();
349*7e532c4bSJorge Ramirez-Ortiz 	plat_rcar_gic_init();
350*7e532c4bSJorge Ramirez-Ortiz 	rcar_swdt_init();
351*7e532c4bSJorge Ramirez-Ortiz 
352*7e532c4bSJorge Ramirez-Ortiz 	/* FIQ interrupts are taken to EL3 */
353*7e532c4bSJorge Ramirez-Ortiz 	write_scr_el3(read_scr_el3() | SCR_FIQ_BIT);
354*7e532c4bSJorge Ramirez-Ortiz 
355*7e532c4bSJorge Ramirez-Ortiz 	write_daifclr(DAIF_FIQ_BIT);
356*7e532c4bSJorge Ramirez-Ortiz 
357*7e532c4bSJorge Ramirez-Ortiz 	reg = read_midr();
358*7e532c4bSJorge Ramirez-Ortiz 	midr = reg & (MIDR_PN_MASK << MIDR_PN_SHIFT);
359*7e532c4bSJorge Ramirez-Ortiz 	switch (midr) {
360*7e532c4bSJorge Ramirez-Ortiz 	case MIDR_CA57:
361*7e532c4bSJorge Ramirez-Ortiz 		str = cpu_ca57;
362*7e532c4bSJorge Ramirez-Ortiz 		break;
363*7e532c4bSJorge Ramirez-Ortiz 	case MIDR_CA53:
364*7e532c4bSJorge Ramirez-Ortiz 		str = cpu_ca53;
365*7e532c4bSJorge Ramirez-Ortiz 		break;
366*7e532c4bSJorge Ramirez-Ortiz 	default:
367*7e532c4bSJorge Ramirez-Ortiz 		str = unknown;
368*7e532c4bSJorge Ramirez-Ortiz 		break;
369*7e532c4bSJorge Ramirez-Ortiz 	}
370*7e532c4bSJorge Ramirez-Ortiz 
371*7e532c4bSJorge Ramirez-Ortiz 	NOTICE("BL2: R-Car Gen3 Initial Program Loader(%s) Rev.%s\n", str,
372*7e532c4bSJorge Ramirez-Ortiz 	       version_of_renesas);
373*7e532c4bSJorge Ramirez-Ortiz 
374*7e532c4bSJorge Ramirez-Ortiz 	reg = mmio_read_32(RCAR_PRR);
375*7e532c4bSJorge Ramirez-Ortiz 	product_cut = reg & (RCAR_PRODUCT_MASK | RCAR_CUT_MASK);
376*7e532c4bSJorge Ramirez-Ortiz 	product = reg & RCAR_PRODUCT_MASK;
377*7e532c4bSJorge Ramirez-Ortiz 	cut = reg & RCAR_CUT_MASK;
378*7e532c4bSJorge Ramirez-Ortiz 
379*7e532c4bSJorge Ramirez-Ortiz 	switch (product) {
380*7e532c4bSJorge Ramirez-Ortiz 	case RCAR_PRODUCT_H3:
381*7e532c4bSJorge Ramirez-Ortiz 		str = product_h3;
382*7e532c4bSJorge Ramirez-Ortiz 		break;
383*7e532c4bSJorge Ramirez-Ortiz 	case RCAR_PRODUCT_M3:
384*7e532c4bSJorge Ramirez-Ortiz 		str = product_m3;
385*7e532c4bSJorge Ramirez-Ortiz 		break;
386*7e532c4bSJorge Ramirez-Ortiz 	case RCAR_PRODUCT_M3N:
387*7e532c4bSJorge Ramirez-Ortiz 		str = product_m3n;
388*7e532c4bSJorge Ramirez-Ortiz 		break;
389*7e532c4bSJorge Ramirez-Ortiz 	case RCAR_PRODUCT_E3:
390*7e532c4bSJorge Ramirez-Ortiz 		str = product_e3;
391*7e532c4bSJorge Ramirez-Ortiz 		break;
392*7e532c4bSJorge Ramirez-Ortiz 	default:
393*7e532c4bSJorge Ramirez-Ortiz 		str = unknown;
394*7e532c4bSJorge Ramirez-Ortiz 		break;
395*7e532c4bSJorge Ramirez-Ortiz 	}
396*7e532c4bSJorge Ramirez-Ortiz 
397*7e532c4bSJorge Ramirez-Ortiz 	if (RCAR_PRODUCT_M3_CUT11 == product_cut) {
398*7e532c4bSJorge Ramirez-Ortiz 		NOTICE("BL2: PRR is R-Car %s Ver.1.1 / Ver.1.2\n", str);
399*7e532c4bSJorge Ramirez-Ortiz 	} else {
400*7e532c4bSJorge Ramirez-Ortiz 		major = (reg & RCAR_MAJOR_MASK) >> RCAR_MAJOR_SHIFT;
401*7e532c4bSJorge Ramirez-Ortiz 		major = major + RCAR_MAJOR_OFFSET;
402*7e532c4bSJorge Ramirez-Ortiz 		minor = reg & RCAR_MINOR_MASK;
403*7e532c4bSJorge Ramirez-Ortiz 		NOTICE("BL2: PRR is R-Car %s Ver.%d.%d\n", str, major, minor);
404*7e532c4bSJorge Ramirez-Ortiz 	}
405*7e532c4bSJorge Ramirez-Ortiz 
406*7e532c4bSJorge Ramirez-Ortiz 	if (product == RCAR_PRODUCT_E3) {
407*7e532c4bSJorge Ramirez-Ortiz 		reg = mmio_read_32(RCAR_MODEMR);
408*7e532c4bSJorge Ramirez-Ortiz 		sscg = reg & RCAR_SSCG_MASK;
409*7e532c4bSJorge Ramirez-Ortiz 		str = sscg == RCAR_SSCG_ENABLE ? sscg_on : sscg_off;
410*7e532c4bSJorge Ramirez-Ortiz 		NOTICE("BL2: %s\n", str);
411*7e532c4bSJorge Ramirez-Ortiz 	}
412*7e532c4bSJorge Ramirez-Ortiz 
413*7e532c4bSJorge Ramirez-Ortiz 	rcar_get_board_type(&type, &rev);
414*7e532c4bSJorge Ramirez-Ortiz 
415*7e532c4bSJorge Ramirez-Ortiz 	switch (type) {
416*7e532c4bSJorge Ramirez-Ortiz 	case BOARD_SALVATOR_X:
417*7e532c4bSJorge Ramirez-Ortiz 	case BOARD_KRIEK:
418*7e532c4bSJorge Ramirez-Ortiz 	case BOARD_STARTER_KIT:
419*7e532c4bSJorge Ramirez-Ortiz 	case BOARD_SALVATOR_XS:
420*7e532c4bSJorge Ramirez-Ortiz 	case BOARD_EBISU:
421*7e532c4bSJorge Ramirez-Ortiz 	case BOARD_STARTER_KIT_PRE:
422*7e532c4bSJorge Ramirez-Ortiz 	case BOARD_EBISU_4D:
423*7e532c4bSJorge Ramirez-Ortiz 		break;
424*7e532c4bSJorge Ramirez-Ortiz 	default:
425*7e532c4bSJorge Ramirez-Ortiz 		type = BOARD_UNKNOWN;
426*7e532c4bSJorge Ramirez-Ortiz 		break;
427*7e532c4bSJorge Ramirez-Ortiz 	}
428*7e532c4bSJorge Ramirez-Ortiz 
429*7e532c4bSJorge Ramirez-Ortiz 	if (type == BOARD_UNKNOWN || rev == BOARD_REV_UNKNOWN)
430*7e532c4bSJorge Ramirez-Ortiz 		NOTICE("BL2: Board is %s Rev.---\n", GET_BOARD_NAME(type));
431*7e532c4bSJorge Ramirez-Ortiz 	else {
432*7e532c4bSJorge Ramirez-Ortiz 		NOTICE("BL2: Board is %s Rev.%d.%d\n",
433*7e532c4bSJorge Ramirez-Ortiz 		       GET_BOARD_NAME(type),
434*7e532c4bSJorge Ramirez-Ortiz 		       GET_BOARD_MAJOR(rev), GET_BOARD_MINOR(rev));
435*7e532c4bSJorge Ramirez-Ortiz 	}
436*7e532c4bSJorge Ramirez-Ortiz 
437*7e532c4bSJorge Ramirez-Ortiz #if RCAR_LSI != RCAR_AUTO
438*7e532c4bSJorge Ramirez-Ortiz 	if (product != TARGET_PRODUCT) {
439*7e532c4bSJorge Ramirez-Ortiz 		ERROR("BL2: IPL was been built for the %s.\n", TARGET_NAME);
440*7e532c4bSJorge Ramirez-Ortiz 		ERROR("BL2: Please write the correct IPL to flash memory.\n");
441*7e532c4bSJorge Ramirez-Ortiz 		panic();
442*7e532c4bSJorge Ramirez-Ortiz 	}
443*7e532c4bSJorge Ramirez-Ortiz #endif
444*7e532c4bSJorge Ramirez-Ortiz 	rcar_avs_init();
445*7e532c4bSJorge Ramirez-Ortiz 	rcar_avs_setting();
446*7e532c4bSJorge Ramirez-Ortiz 
447*7e532c4bSJorge Ramirez-Ortiz 	switch (boot_dev) {
448*7e532c4bSJorge Ramirez-Ortiz 	case MODEMR_BOOT_DEV_HYPERFLASH160:
449*7e532c4bSJorge Ramirez-Ortiz 		str = boot_hyper160;
450*7e532c4bSJorge Ramirez-Ortiz 		break;
451*7e532c4bSJorge Ramirez-Ortiz 	case MODEMR_BOOT_DEV_HYPERFLASH80:
452*7e532c4bSJorge Ramirez-Ortiz 		str = boot_hyper80;
453*7e532c4bSJorge Ramirez-Ortiz 		break;
454*7e532c4bSJorge Ramirez-Ortiz 	case MODEMR_BOOT_DEV_QSPI_FLASH40:
455*7e532c4bSJorge Ramirez-Ortiz 		str = boot_qspi40;
456*7e532c4bSJorge Ramirez-Ortiz 		break;
457*7e532c4bSJorge Ramirez-Ortiz 	case MODEMR_BOOT_DEV_QSPI_FLASH80:
458*7e532c4bSJorge Ramirez-Ortiz 		str = boot_qspi80;
459*7e532c4bSJorge Ramirez-Ortiz 		break;
460*7e532c4bSJorge Ramirez-Ortiz 	case MODEMR_BOOT_DEV_EMMC_25X1:
461*7e532c4bSJorge Ramirez-Ortiz 		str = boot_emmc25x1;
462*7e532c4bSJorge Ramirez-Ortiz 		break;
463*7e532c4bSJorge Ramirez-Ortiz 	case MODEMR_BOOT_DEV_EMMC_50X8:
464*7e532c4bSJorge Ramirez-Ortiz 		str = boot_emmc50x8;
465*7e532c4bSJorge Ramirez-Ortiz 		break;
466*7e532c4bSJorge Ramirez-Ortiz 	default:
467*7e532c4bSJorge Ramirez-Ortiz 		str = unknown;
468*7e532c4bSJorge Ramirez-Ortiz 		break;
469*7e532c4bSJorge Ramirez-Ortiz 	}
470*7e532c4bSJorge Ramirez-Ortiz 	NOTICE("BL2: Boot device is %s\n", str);
471*7e532c4bSJorge Ramirez-Ortiz 
472*7e532c4bSJorge Ramirez-Ortiz 	rcar_avs_setting();
473*7e532c4bSJorge Ramirez-Ortiz 	reg = rcar_rom_get_lcs(&lcs);
474*7e532c4bSJorge Ramirez-Ortiz 	if (reg) {
475*7e532c4bSJorge Ramirez-Ortiz 		str = unknown;
476*7e532c4bSJorge Ramirez-Ortiz 		goto lcm_state;
477*7e532c4bSJorge Ramirez-Ortiz 	}
478*7e532c4bSJorge Ramirez-Ortiz 
479*7e532c4bSJorge Ramirez-Ortiz 	switch (lcs) {
480*7e532c4bSJorge Ramirez-Ortiz 	case LCS_CM:
481*7e532c4bSJorge Ramirez-Ortiz 		str = lcs_cm;
482*7e532c4bSJorge Ramirez-Ortiz 		break;
483*7e532c4bSJorge Ramirez-Ortiz 	case LCS_DM:
484*7e532c4bSJorge Ramirez-Ortiz 		str = lcs_dm;
485*7e532c4bSJorge Ramirez-Ortiz 		break;
486*7e532c4bSJorge Ramirez-Ortiz 	case LCS_SD:
487*7e532c4bSJorge Ramirez-Ortiz 		str = lcs_sd;
488*7e532c4bSJorge Ramirez-Ortiz 		break;
489*7e532c4bSJorge Ramirez-Ortiz 	case LCS_SE:
490*7e532c4bSJorge Ramirez-Ortiz 		str = lcs_secure;
491*7e532c4bSJorge Ramirez-Ortiz 		break;
492*7e532c4bSJorge Ramirez-Ortiz 	case LCS_FA:
493*7e532c4bSJorge Ramirez-Ortiz 		str = lcs_fa;
494*7e532c4bSJorge Ramirez-Ortiz 		break;
495*7e532c4bSJorge Ramirez-Ortiz 	default:
496*7e532c4bSJorge Ramirez-Ortiz 		str = unknown;
497*7e532c4bSJorge Ramirez-Ortiz 		break;
498*7e532c4bSJorge Ramirez-Ortiz 	}
499*7e532c4bSJorge Ramirez-Ortiz 
500*7e532c4bSJorge Ramirez-Ortiz lcm_state:
501*7e532c4bSJorge Ramirez-Ortiz 	NOTICE("BL2: LCM state is %s\n", str);
502*7e532c4bSJorge Ramirez-Ortiz 
503*7e532c4bSJorge Ramirez-Ortiz 	rcar_avs_end();
504*7e532c4bSJorge Ramirez-Ortiz 	is_ddr_backup_mode();
505*7e532c4bSJorge Ramirez-Ortiz 
506*7e532c4bSJorge Ramirez-Ortiz 	bl2_tzram_layout.total_base = BL31_BASE;
507*7e532c4bSJorge Ramirez-Ortiz 	bl2_tzram_layout.total_size = BL31_LIMIT - BL31_BASE;
508*7e532c4bSJorge Ramirez-Ortiz 
509*7e532c4bSJorge Ramirez-Ortiz 	if (product == RCAR_PRODUCT_H3 && cut >= RCAR_CUT_VER30) {
510*7e532c4bSJorge Ramirez-Ortiz #if (RCAR_DRAM_LPDDR4_MEMCONF == 0)
511*7e532c4bSJorge Ramirez-Ortiz 		NOTICE("BL2: CH0: 0x400000000 - 0x440000000, 1 GiB\n");
512*7e532c4bSJorge Ramirez-Ortiz 		NOTICE("BL2: CH1: 0x500000000 - 0x540000000, 1 GiB\n");
513*7e532c4bSJorge Ramirez-Ortiz 		NOTICE("BL2: CH2: 0x600000000 - 0x640000000, 1 GiB\n");
514*7e532c4bSJorge Ramirez-Ortiz 		NOTICE("BL2: CH3: 0x700000000 - 0x740000000, 1 GiB\n");
515*7e532c4bSJorge Ramirez-Ortiz #elif (RCAR_DRAM_LPDDR4_MEMCONF == 1) && \
516*7e532c4bSJorge Ramirez-Ortiz       (RCAR_DRAM_CHANNEL        == 5) && \
517*7e532c4bSJorge Ramirez-Ortiz       (RCAR_DRAM_SPLIT          == 2)
518*7e532c4bSJorge Ramirez-Ortiz 		NOTICE("BL2: CH0: 0x400000000 - 0x480000000, 2 GiB\n");
519*7e532c4bSJorge Ramirez-Ortiz 		NOTICE("BL2: CH1: 0x500000000 - 0x580000000, 2 GiB\n");
520*7e532c4bSJorge Ramirez-Ortiz #elif (RCAR_DRAM_LPDDR4_MEMCONF == 1) && (RCAR_DRAM_CHANNEL == 15)
521*7e532c4bSJorge Ramirez-Ortiz 		NOTICE("BL2: CH0: 0x400000000 - 0x480000000, 2 GiB\n");
522*7e532c4bSJorge Ramirez-Ortiz 		NOTICE("BL2: CH1: 0x500000000 - 0x580000000, 2 GiB\n");
523*7e532c4bSJorge Ramirez-Ortiz 		NOTICE("BL2: CH2: 0x600000000 - 0x680000000, 2 GiB\n");
524*7e532c4bSJorge Ramirez-Ortiz 		NOTICE("BL2: CH3: 0x700000000 - 0x780000000, 2 GiB\n");
525*7e532c4bSJorge Ramirez-Ortiz #endif
526*7e532c4bSJorge Ramirez-Ortiz 	}
527*7e532c4bSJorge Ramirez-Ortiz 
528*7e532c4bSJorge Ramirez-Ortiz 	if (product == RCAR_PRODUCT_E3) {
529*7e532c4bSJorge Ramirez-Ortiz #if (RCAR_DRAM_DDR3L_MEMCONF == 0)
530*7e532c4bSJorge Ramirez-Ortiz 		NOTICE("BL2: 0x400000000 - 0x440000000, 1 GiB\n");
531*7e532c4bSJorge Ramirez-Ortiz #elif (RCAR_DRAM_DDR3L_MEMCONF == 1)
532*7e532c4bSJorge Ramirez-Ortiz 		NOTICE("BL2: 0x400000000 - 0x480000000, 2 GiB\n");
533*7e532c4bSJorge Ramirez-Ortiz #endif
534*7e532c4bSJorge Ramirez-Ortiz 	}
535*7e532c4bSJorge Ramirez-Ortiz 
536*7e532c4bSJorge Ramirez-Ortiz 	if (boot_cpu == MODEMR_BOOT_CPU_CA57 ||
537*7e532c4bSJorge Ramirez-Ortiz 	    boot_cpu == MODEMR_BOOT_CPU_CA53) {
538*7e532c4bSJorge Ramirez-Ortiz 		ret = rcar_dram_init();
539*7e532c4bSJorge Ramirez-Ortiz 		if (ret) {
540*7e532c4bSJorge Ramirez-Ortiz 			NOTICE("BL2: Failed to DRAM initialize (%d).\n", ret);
541*7e532c4bSJorge Ramirez-Ortiz 			panic();
542*7e532c4bSJorge Ramirez-Ortiz 		}
543*7e532c4bSJorge Ramirez-Ortiz 		rcar_qos_init();
544*7e532c4bSJorge Ramirez-Ortiz 	}
545*7e532c4bSJorge Ramirez-Ortiz 
546*7e532c4bSJorge Ramirez-Ortiz 	if (boot_dev == MODEMR_BOOT_DEV_EMMC_25X1 ||
547*7e532c4bSJorge Ramirez-Ortiz 	    boot_dev == MODEMR_BOOT_DEV_EMMC_50X8) {
548*7e532c4bSJorge Ramirez-Ortiz 		if (rcar_emmc_init() != EMMC_SUCCESS) {
549*7e532c4bSJorge Ramirez-Ortiz 			NOTICE("BL2: Failed to eMMC driver initialize.\n");
550*7e532c4bSJorge Ramirez-Ortiz 			panic();
551*7e532c4bSJorge Ramirez-Ortiz 		}
552*7e532c4bSJorge Ramirez-Ortiz 		rcar_emmc_memcard_power(EMMC_POWER_ON);
553*7e532c4bSJorge Ramirez-Ortiz 		if (rcar_emmc_mount() != EMMC_SUCCESS) {
554*7e532c4bSJorge Ramirez-Ortiz 			NOTICE("BL2: Failed to eMMC mount operation.\n");
555*7e532c4bSJorge Ramirez-Ortiz 			panic();
556*7e532c4bSJorge Ramirez-Ortiz 		}
557*7e532c4bSJorge Ramirez-Ortiz 	} else {
558*7e532c4bSJorge Ramirez-Ortiz 		rcar_rpc_init();
559*7e532c4bSJorge Ramirez-Ortiz 		rcar_dma_init();
560*7e532c4bSJorge Ramirez-Ortiz 	}
561*7e532c4bSJorge Ramirez-Ortiz 
562*7e532c4bSJorge Ramirez-Ortiz 	reg = mmio_read_32(RST_WDTRSTCR);
563*7e532c4bSJorge Ramirez-Ortiz 	reg &= ~WDTRSTCR_RWDT_RSTMSK;
564*7e532c4bSJorge Ramirez-Ortiz 	reg |= WDTRSTCR_PASSWORD;
565*7e532c4bSJorge Ramirez-Ortiz 	mmio_write_32(RST_WDTRSTCR, reg);
566*7e532c4bSJorge Ramirez-Ortiz 
567*7e532c4bSJorge Ramirez-Ortiz 	mmio_write_32(CPG_CPGWPR, CPGWPR_PASSWORD);
568*7e532c4bSJorge Ramirez-Ortiz 	mmio_write_32(CPG_CPGWPCR, CPGWPCR_PASSWORD);
569*7e532c4bSJorge Ramirez-Ortiz 
570*7e532c4bSJorge Ramirez-Ortiz 	reg = mmio_read_32(RCAR_PRR);
571*7e532c4bSJorge Ramirez-Ortiz 	if ((reg & RCAR_CPU_MASK_CA57) == RCAR_CPU_HAVE_CA57)
572*7e532c4bSJorge Ramirez-Ortiz 		mmio_write_32(CPG_CA57DBGRCR,
573*7e532c4bSJorge Ramirez-Ortiz 			      DBGCPUPREN | mmio_read_32(CPG_CA57DBGRCR));
574*7e532c4bSJorge Ramirez-Ortiz 
575*7e532c4bSJorge Ramirez-Ortiz 	if ((reg & RCAR_CPU_MASK_CA53) == RCAR_CPU_HAVE_CA53)
576*7e532c4bSJorge Ramirez-Ortiz 		mmio_write_32(CPG_CA53DBGRCR,
577*7e532c4bSJorge Ramirez-Ortiz 			      DBGCPUPREN | mmio_read_32(CPG_CA53DBGRCR));
578*7e532c4bSJorge Ramirez-Ortiz 
579*7e532c4bSJorge Ramirez-Ortiz 	if (product_cut == RCAR_PRODUCT_H3_CUT10) {
580*7e532c4bSJorge Ramirez-Ortiz 		reg = mmio_read_32(CPG_PLL2CR);
581*7e532c4bSJorge Ramirez-Ortiz 		reg &= ~((uint32_t) 1 << 5);
582*7e532c4bSJorge Ramirez-Ortiz 		mmio_write_32(CPG_PLL2CR, reg);
583*7e532c4bSJorge Ramirez-Ortiz 
584*7e532c4bSJorge Ramirez-Ortiz 		reg = mmio_read_32(CPG_PLL4CR);
585*7e532c4bSJorge Ramirez-Ortiz 		reg &= ~((uint32_t) 1 << 5);
586*7e532c4bSJorge Ramirez-Ortiz 		mmio_write_32(CPG_PLL4CR, reg);
587*7e532c4bSJorge Ramirez-Ortiz 
588*7e532c4bSJorge Ramirez-Ortiz 		reg = mmio_read_32(CPG_PLL0CR);
589*7e532c4bSJorge Ramirez-Ortiz 		reg &= ~((uint32_t) 1 << 12);
590*7e532c4bSJorge Ramirez-Ortiz 		mmio_write_32(CPG_PLL0CR, reg);
591*7e532c4bSJorge Ramirez-Ortiz 	}
592*7e532c4bSJorge Ramirez-Ortiz #if (RCAR_LOSSY_ENABLE == 1)
593*7e532c4bSJorge Ramirez-Ortiz 	NOTICE("BL2: Lossy Decomp areas\n");
594*7e532c4bSJorge Ramirez-Ortiz 	bl2_lossy_setting(0, LOSSY_ST_ADDR0, LOSSY_END_ADDR0,
595*7e532c4bSJorge Ramirez-Ortiz 			  LOSSY_FMT0, LOSSY_ENA_DIS0);
596*7e532c4bSJorge Ramirez-Ortiz 	bl2_lossy_setting(1, LOSSY_ST_ADDR1, LOSSY_END_ADDR1,
597*7e532c4bSJorge Ramirez-Ortiz 			  LOSSY_FMT1, LOSSY_ENA_DIS1);
598*7e532c4bSJorge Ramirez-Ortiz 	bl2_lossy_setting(2, LOSSY_ST_ADDR2, LOSSY_END_ADDR2,
599*7e532c4bSJorge Ramirez-Ortiz 			  LOSSY_FMT2, LOSSY_ENA_DIS2);
600*7e532c4bSJorge Ramirez-Ortiz #endif
601*7e532c4bSJorge Ramirez-Ortiz 
602*7e532c4bSJorge Ramirez-Ortiz 	if (boot_dev == MODEMR_BOOT_DEV_EMMC_25X1 ||
603*7e532c4bSJorge Ramirez-Ortiz 	    boot_dev == MODEMR_BOOT_DEV_EMMC_50X8)
604*7e532c4bSJorge Ramirez-Ortiz 		rcar_io_emmc_setup();
605*7e532c4bSJorge Ramirez-Ortiz 	else
606*7e532c4bSJorge Ramirez-Ortiz 		rcar_io_setup();
607*7e532c4bSJorge Ramirez-Ortiz }
608*7e532c4bSJorge Ramirez-Ortiz 
609*7e532c4bSJorge Ramirez-Ortiz void bl2_el3_plat_arch_setup(void)
610*7e532c4bSJorge Ramirez-Ortiz {
611*7e532c4bSJorge Ramirez-Ortiz #if RCAR_BL2_DCACHE == 1
612*7e532c4bSJorge Ramirez-Ortiz 	NOTICE("BL2: D-Cache enable\n");
613*7e532c4bSJorge Ramirez-Ortiz 	rcar_configure_mmu_el3(BL2_BASE,
614*7e532c4bSJorge Ramirez-Ortiz 			       RCAR_SYSRAM_LIMIT - BL2_BASE,
615*7e532c4bSJorge Ramirez-Ortiz 			       BL2_RO_BASE, BL2_RO_LIMIT
616*7e532c4bSJorge Ramirez-Ortiz #if USE_COHERENT_MEM
617*7e532c4bSJorge Ramirez-Ortiz 			       , BL2_COHERENT_RAM_BASE, BL2_COHERENT_RAM_LIMIT
618*7e532c4bSJorge Ramirez-Ortiz #endif
619*7e532c4bSJorge Ramirez-Ortiz 	    );
620*7e532c4bSJorge Ramirez-Ortiz #endif
621*7e532c4bSJorge Ramirez-Ortiz }
622*7e532c4bSJorge Ramirez-Ortiz 
623*7e532c4bSJorge Ramirez-Ortiz void bl2_platform_setup(void)
624*7e532c4bSJorge Ramirez-Ortiz {
625*7e532c4bSJorge Ramirez-Ortiz 
626*7e532c4bSJorge Ramirez-Ortiz }
627