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(¶ms->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(¶ms->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