1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright (c) 2018-2021, Renesas Electronics Corporation. All rights reserved. 3*91f16700Schasinglulu * 4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 5*91f16700Schasinglulu */ 6*91f16700Schasinglulu 7*91f16700Schasinglulu #include <inttypes.h> 8*91f16700Schasinglulu #include <stdint.h> 9*91f16700Schasinglulu #include <string.h> 10*91f16700Schasinglulu 11*91f16700Schasinglulu #include <libfdt.h> 12*91f16700Schasinglulu 13*91f16700Schasinglulu #include <platform_def.h> 14*91f16700Schasinglulu 15*91f16700Schasinglulu #include <arch_helpers.h> 16*91f16700Schasinglulu #include <bl1/bl1.h> 17*91f16700Schasinglulu #include <common/bl_common.h> 18*91f16700Schasinglulu #include <common/debug.h> 19*91f16700Schasinglulu #include <common/desc_image_load.h> 20*91f16700Schasinglulu #include <common/image_decompress.h> 21*91f16700Schasinglulu #include <drivers/console.h> 22*91f16700Schasinglulu #include <drivers/io/io_driver.h> 23*91f16700Schasinglulu #include <drivers/io/io_storage.h> 24*91f16700Schasinglulu #include <lib/mmio.h> 25*91f16700Schasinglulu #include <lib/xlat_tables/xlat_tables_defs.h> 26*91f16700Schasinglulu #include <plat/common/platform.h> 27*91f16700Schasinglulu #if RCAR_GEN3_BL33_GZIP == 1 28*91f16700Schasinglulu #include <tf_gunzip.h> 29*91f16700Schasinglulu #endif 30*91f16700Schasinglulu 31*91f16700Schasinglulu #include "avs_driver.h" 32*91f16700Schasinglulu #include "boot_init_dram.h" 33*91f16700Schasinglulu #include "cpg_registers.h" 34*91f16700Schasinglulu #include "board.h" 35*91f16700Schasinglulu #include "emmc_def.h" 36*91f16700Schasinglulu #include "emmc_hal.h" 37*91f16700Schasinglulu #include "emmc_std.h" 38*91f16700Schasinglulu 39*91f16700Schasinglulu #if PMIC_ROHM_BD9571 && RCAR_SYSTEM_RESET_KEEPON_DDR 40*91f16700Schasinglulu #include "iic_dvfs.h" 41*91f16700Schasinglulu #endif 42*91f16700Schasinglulu 43*91f16700Schasinglulu #include "io_common.h" 44*91f16700Schasinglulu #include "io_rcar.h" 45*91f16700Schasinglulu #include "qos_init.h" 46*91f16700Schasinglulu #include "rcar_def.h" 47*91f16700Schasinglulu #include "rcar_private.h" 48*91f16700Schasinglulu #include "rcar_version.h" 49*91f16700Schasinglulu #include "rom_api.h" 50*91f16700Schasinglulu 51*91f16700Schasinglulu #if RCAR_BL2_DCACHE == 1 52*91f16700Schasinglulu /* 53*91f16700Schasinglulu * Following symbols are only used during plat_arch_setup() only 54*91f16700Schasinglulu * when RCAR_BL2_DCACHE is enabled. 55*91f16700Schasinglulu */ 56*91f16700Schasinglulu static const uint64_t BL2_RO_BASE = BL_CODE_BASE; 57*91f16700Schasinglulu static const uint64_t BL2_RO_LIMIT = BL_CODE_END; 58*91f16700Schasinglulu 59*91f16700Schasinglulu #if USE_COHERENT_MEM 60*91f16700Schasinglulu static const uint64_t BL2_COHERENT_RAM_BASE = BL_COHERENT_RAM_BASE; 61*91f16700Schasinglulu static const uint64_t BL2_COHERENT_RAM_LIMIT = BL_COHERENT_RAM_END; 62*91f16700Schasinglulu #endif 63*91f16700Schasinglulu 64*91f16700Schasinglulu #endif 65*91f16700Schasinglulu 66*91f16700Schasinglulu extern void plat_rcar_gic_driver_init(void); 67*91f16700Schasinglulu extern void plat_rcar_gic_init(void); 68*91f16700Schasinglulu extern void bl2_enter_bl31(const struct entry_point_info *bl_ep_info); 69*91f16700Schasinglulu extern void bl2_system_cpg_init(void); 70*91f16700Schasinglulu extern void bl2_secure_setting(void); 71*91f16700Schasinglulu extern void bl2_cpg_init(void); 72*91f16700Schasinglulu extern void rcar_io_emmc_setup(void); 73*91f16700Schasinglulu extern void rcar_io_setup(void); 74*91f16700Schasinglulu extern void rcar_swdt_release(void); 75*91f16700Schasinglulu extern void rcar_swdt_init(void); 76*91f16700Schasinglulu extern void rcar_rpc_init(void); 77*91f16700Schasinglulu extern void rcar_pfc_init(void); 78*91f16700Schasinglulu extern void rcar_dma_init(void); 79*91f16700Schasinglulu 80*91f16700Schasinglulu static void bl2_init_generic_timer(void); 81*91f16700Schasinglulu 82*91f16700Schasinglulu /* R-Car Gen3 product check */ 83*91f16700Schasinglulu #if (RCAR_LSI == RCAR_H3) || (RCAR_LSI == RCAR_H3N) 84*91f16700Schasinglulu #define TARGET_PRODUCT PRR_PRODUCT_H3 85*91f16700Schasinglulu #define TARGET_NAME "R-Car H3" 86*91f16700Schasinglulu #elif RCAR_LSI == RCAR_M3 87*91f16700Schasinglulu #define TARGET_PRODUCT PRR_PRODUCT_M3 88*91f16700Schasinglulu #define TARGET_NAME "R-Car M3" 89*91f16700Schasinglulu #elif RCAR_LSI == RCAR_M3N 90*91f16700Schasinglulu #define TARGET_PRODUCT PRR_PRODUCT_M3N 91*91f16700Schasinglulu #define TARGET_NAME "R-Car M3N" 92*91f16700Schasinglulu #elif RCAR_LSI == RCAR_V3M 93*91f16700Schasinglulu #define TARGET_PRODUCT PRR_PRODUCT_V3M 94*91f16700Schasinglulu #define TARGET_NAME "R-Car V3M" 95*91f16700Schasinglulu #elif RCAR_LSI == RCAR_E3 96*91f16700Schasinglulu #define TARGET_PRODUCT PRR_PRODUCT_E3 97*91f16700Schasinglulu #define TARGET_NAME "R-Car E3" 98*91f16700Schasinglulu #elif RCAR_LSI == RCAR_D3 99*91f16700Schasinglulu #define TARGET_PRODUCT PRR_PRODUCT_D3 100*91f16700Schasinglulu #define TARGET_NAME "R-Car D3" 101*91f16700Schasinglulu #elif RCAR_LSI == RCAR_AUTO 102*91f16700Schasinglulu #define TARGET_NAME "R-Car H3/M3/M3N/V3M" 103*91f16700Schasinglulu #endif 104*91f16700Schasinglulu 105*91f16700Schasinglulu #if (RCAR_LSI == RCAR_E3) 106*91f16700Schasinglulu #define GPIO_INDT (GPIO_INDT6) 107*91f16700Schasinglulu #define GPIO_BKUP_TRG_SHIFT ((uint32_t)1U<<13U) 108*91f16700Schasinglulu #else 109*91f16700Schasinglulu #define GPIO_INDT (GPIO_INDT1) 110*91f16700Schasinglulu #define GPIO_BKUP_TRG_SHIFT ((uint32_t)1U<<8U) 111*91f16700Schasinglulu #endif 112*91f16700Schasinglulu 113*91f16700Schasinglulu CASSERT((PARAMS_BASE + sizeof(bl2_to_bl31_params_mem_t) + 0x100) 114*91f16700Schasinglulu < (RCAR_SHARED_MEM_BASE + RCAR_SHARED_MEM_SIZE), 115*91f16700Schasinglulu assert_bl31_params_do_not_fit_in_shared_memory); 116*91f16700Schasinglulu 117*91f16700Schasinglulu static meminfo_t bl2_tzram_layout __aligned(CACHE_WRITEBACK_GRANULE); 118*91f16700Schasinglulu 119*91f16700Schasinglulu /* FDT with DRAM configuration */ 120*91f16700Schasinglulu uint64_t fdt_blob[PAGE_SIZE_4KB / sizeof(uint64_t)]; 121*91f16700Schasinglulu static void *fdt = (void *)fdt_blob; 122*91f16700Schasinglulu 123*91f16700Schasinglulu static void unsigned_num_print(unsigned long long int unum, unsigned int radix, 124*91f16700Schasinglulu char *string) 125*91f16700Schasinglulu { 126*91f16700Schasinglulu /* Just need enough space to store 64 bit decimal integer */ 127*91f16700Schasinglulu char num_buf[20]; 128*91f16700Schasinglulu int i = 0; 129*91f16700Schasinglulu unsigned int rem; 130*91f16700Schasinglulu 131*91f16700Schasinglulu do { 132*91f16700Schasinglulu rem = unum % radix; 133*91f16700Schasinglulu if (rem < 0xa) 134*91f16700Schasinglulu num_buf[i] = '0' + rem; 135*91f16700Schasinglulu else 136*91f16700Schasinglulu num_buf[i] = 'a' + (rem - 0xa); 137*91f16700Schasinglulu i++; 138*91f16700Schasinglulu unum /= radix; 139*91f16700Schasinglulu } while (unum > 0U); 140*91f16700Schasinglulu 141*91f16700Schasinglulu while (--i >= 0) 142*91f16700Schasinglulu *string++ = num_buf[i]; 143*91f16700Schasinglulu *string = 0; 144*91f16700Schasinglulu } 145*91f16700Schasinglulu 146*91f16700Schasinglulu #if (RCAR_LOSSY_ENABLE == 1) 147*91f16700Schasinglulu typedef struct bl2_lossy_info { 148*91f16700Schasinglulu uint32_t magic; 149*91f16700Schasinglulu uint32_t a0; 150*91f16700Schasinglulu uint32_t b0; 151*91f16700Schasinglulu } bl2_lossy_info_t; 152*91f16700Schasinglulu 153*91f16700Schasinglulu static void bl2_lossy_gen_fdt(uint32_t no, uint64_t start_addr, 154*91f16700Schasinglulu uint64_t end_addr, uint32_t format, 155*91f16700Schasinglulu uint32_t enable, int fcnlnode) 156*91f16700Schasinglulu { 157*91f16700Schasinglulu const uint64_t fcnlsize = cpu_to_fdt64(end_addr - start_addr); 158*91f16700Schasinglulu char nodename[40] = { 0 }; 159*91f16700Schasinglulu int ret, node; 160*91f16700Schasinglulu 161*91f16700Schasinglulu /* Ignore undefined addresses */ 162*91f16700Schasinglulu if (start_addr == 0 && end_addr == 0) 163*91f16700Schasinglulu return; 164*91f16700Schasinglulu 165*91f16700Schasinglulu snprintf(nodename, sizeof(nodename), "lossy-decompression@"); 166*91f16700Schasinglulu unsigned_num_print(start_addr, 16, nodename + strlen(nodename)); 167*91f16700Schasinglulu 168*91f16700Schasinglulu node = ret = fdt_add_subnode(fdt, fcnlnode, nodename); 169*91f16700Schasinglulu if (ret < 0) { 170*91f16700Schasinglulu NOTICE("BL2: Cannot create FCNL node (ret=%i)\n", ret); 171*91f16700Schasinglulu panic(); 172*91f16700Schasinglulu } 173*91f16700Schasinglulu 174*91f16700Schasinglulu ret = fdt_setprop_string(fdt, node, "compatible", 175*91f16700Schasinglulu "renesas,lossy-decompression"); 176*91f16700Schasinglulu if (ret < 0) { 177*91f16700Schasinglulu NOTICE("BL2: Cannot add FCNL compat string (ret=%i)\n", ret); 178*91f16700Schasinglulu panic(); 179*91f16700Schasinglulu } 180*91f16700Schasinglulu 181*91f16700Schasinglulu ret = fdt_appendprop_string(fdt, node, "compatible", 182*91f16700Schasinglulu "shared-dma-pool"); 183*91f16700Schasinglulu if (ret < 0) { 184*91f16700Schasinglulu NOTICE("BL2: Cannot append FCNL compat string (ret=%i)\n", ret); 185*91f16700Schasinglulu panic(); 186*91f16700Schasinglulu } 187*91f16700Schasinglulu 188*91f16700Schasinglulu ret = fdt_setprop_u64(fdt, node, "reg", start_addr); 189*91f16700Schasinglulu if (ret < 0) { 190*91f16700Schasinglulu NOTICE("BL2: Cannot add FCNL reg prop (ret=%i)\n", ret); 191*91f16700Schasinglulu panic(); 192*91f16700Schasinglulu } 193*91f16700Schasinglulu 194*91f16700Schasinglulu ret = fdt_appendprop(fdt, node, "reg", &fcnlsize, sizeof(fcnlsize)); 195*91f16700Schasinglulu if (ret < 0) { 196*91f16700Schasinglulu NOTICE("BL2: Cannot append FCNL reg size prop (ret=%i)\n", ret); 197*91f16700Schasinglulu panic(); 198*91f16700Schasinglulu } 199*91f16700Schasinglulu 200*91f16700Schasinglulu ret = fdt_setprop(fdt, node, "no-map", NULL, 0); 201*91f16700Schasinglulu if (ret < 0) { 202*91f16700Schasinglulu NOTICE("BL2: Cannot add FCNL no-map prop (ret=%i)\n", ret); 203*91f16700Schasinglulu panic(); 204*91f16700Schasinglulu } 205*91f16700Schasinglulu 206*91f16700Schasinglulu ret = fdt_setprop_u32(fdt, node, "renesas,formats", format); 207*91f16700Schasinglulu if (ret < 0) { 208*91f16700Schasinglulu NOTICE("BL2: Cannot add FCNL formats prop (ret=%i)\n", ret); 209*91f16700Schasinglulu panic(); 210*91f16700Schasinglulu } 211*91f16700Schasinglulu } 212*91f16700Schasinglulu 213*91f16700Schasinglulu static void bl2_lossy_setting(uint32_t no, uint64_t start_addr, 214*91f16700Schasinglulu uint64_t end_addr, uint32_t format, 215*91f16700Schasinglulu uint32_t enable, int fcnlnode) 216*91f16700Schasinglulu { 217*91f16700Schasinglulu bl2_lossy_info_t info; 218*91f16700Schasinglulu uint32_t reg; 219*91f16700Schasinglulu 220*91f16700Schasinglulu bl2_lossy_gen_fdt(no, start_addr, end_addr, format, enable, fcnlnode); 221*91f16700Schasinglulu 222*91f16700Schasinglulu reg = format | (start_addr >> 20); 223*91f16700Schasinglulu mmio_write_32(AXI_DCMPAREACRA0 + 0x8 * no, reg); 224*91f16700Schasinglulu mmio_write_32(AXI_DCMPAREACRB0 + 0x8 * no, end_addr >> 20); 225*91f16700Schasinglulu mmio_write_32(AXI_DCMPAREACRA0 + 0x8 * no, reg | enable); 226*91f16700Schasinglulu 227*91f16700Schasinglulu info.magic = 0x12345678U; 228*91f16700Schasinglulu info.a0 = mmio_read_32(AXI_DCMPAREACRA0 + 0x8 * no); 229*91f16700Schasinglulu info.b0 = mmio_read_32(AXI_DCMPAREACRB0 + 0x8 * no); 230*91f16700Schasinglulu 231*91f16700Schasinglulu mmio_write_32(LOSSY_PARAMS_BASE + sizeof(info) * no, info.magic); 232*91f16700Schasinglulu mmio_write_32(LOSSY_PARAMS_BASE + sizeof(info) * no + 0x4, info.a0); 233*91f16700Schasinglulu mmio_write_32(LOSSY_PARAMS_BASE + sizeof(info) * no + 0x8, info.b0); 234*91f16700Schasinglulu 235*91f16700Schasinglulu NOTICE(" Entry %d: DCMPAREACRAx:0x%x DCMPAREACRBx:0x%x\n", no, 236*91f16700Schasinglulu mmio_read_32(AXI_DCMPAREACRA0 + 0x8 * no), 237*91f16700Schasinglulu mmio_read_32(AXI_DCMPAREACRB0 + 0x8 * no)); 238*91f16700Schasinglulu } 239*91f16700Schasinglulu 240*91f16700Schasinglulu static int bl2_create_reserved_memory(void) 241*91f16700Schasinglulu { 242*91f16700Schasinglulu int ret; 243*91f16700Schasinglulu 244*91f16700Schasinglulu int fcnlnode = fdt_add_subnode(fdt, 0, "reserved-memory"); 245*91f16700Schasinglulu if (fcnlnode < 0) { 246*91f16700Schasinglulu NOTICE("BL2: Cannot create reserved mem node (ret=%i)\n", 247*91f16700Schasinglulu fcnlnode); 248*91f16700Schasinglulu panic(); 249*91f16700Schasinglulu } 250*91f16700Schasinglulu 251*91f16700Schasinglulu ret = fdt_setprop(fdt, fcnlnode, "ranges", NULL, 0); 252*91f16700Schasinglulu if (ret < 0) { 253*91f16700Schasinglulu NOTICE("BL2: Cannot add FCNL ranges prop (ret=%i)\n", ret); 254*91f16700Schasinglulu panic(); 255*91f16700Schasinglulu } 256*91f16700Schasinglulu 257*91f16700Schasinglulu ret = fdt_setprop_u32(fdt, fcnlnode, "#address-cells", 2); 258*91f16700Schasinglulu if (ret < 0) { 259*91f16700Schasinglulu NOTICE("BL2: Cannot add FCNL #address-cells prop (ret=%i)\n", ret); 260*91f16700Schasinglulu panic(); 261*91f16700Schasinglulu } 262*91f16700Schasinglulu 263*91f16700Schasinglulu ret = fdt_setprop_u32(fdt, fcnlnode, "#size-cells", 2); 264*91f16700Schasinglulu if (ret < 0) { 265*91f16700Schasinglulu NOTICE("BL2: Cannot add FCNL #size-cells prop (ret=%i)\n", ret); 266*91f16700Schasinglulu panic(); 267*91f16700Schasinglulu } 268*91f16700Schasinglulu 269*91f16700Schasinglulu return fcnlnode; 270*91f16700Schasinglulu } 271*91f16700Schasinglulu 272*91f16700Schasinglulu static void bl2_create_fcnl_reserved_memory(void) 273*91f16700Schasinglulu { 274*91f16700Schasinglulu int fcnlnode; 275*91f16700Schasinglulu 276*91f16700Schasinglulu NOTICE("BL2: Lossy Decomp areas\n"); 277*91f16700Schasinglulu 278*91f16700Schasinglulu fcnlnode = bl2_create_reserved_memory(); 279*91f16700Schasinglulu 280*91f16700Schasinglulu bl2_lossy_setting(0, LOSSY_ST_ADDR0, LOSSY_END_ADDR0, 281*91f16700Schasinglulu LOSSY_FMT0, LOSSY_ENA_DIS0, fcnlnode); 282*91f16700Schasinglulu bl2_lossy_setting(1, LOSSY_ST_ADDR1, LOSSY_END_ADDR1, 283*91f16700Schasinglulu LOSSY_FMT1, LOSSY_ENA_DIS1, fcnlnode); 284*91f16700Schasinglulu bl2_lossy_setting(2, LOSSY_ST_ADDR2, LOSSY_END_ADDR2, 285*91f16700Schasinglulu LOSSY_FMT2, LOSSY_ENA_DIS2, fcnlnode); 286*91f16700Schasinglulu } 287*91f16700Schasinglulu #else 288*91f16700Schasinglulu static void bl2_create_fcnl_reserved_memory(void) {} 289*91f16700Schasinglulu #endif 290*91f16700Schasinglulu 291*91f16700Schasinglulu void bl2_plat_flush_bl31_params(void) 292*91f16700Schasinglulu { 293*91f16700Schasinglulu uint32_t product_cut, product, cut; 294*91f16700Schasinglulu uint32_t boot_dev, boot_cpu; 295*91f16700Schasinglulu uint32_t lcs, reg, val; 296*91f16700Schasinglulu 297*91f16700Schasinglulu reg = mmio_read_32(RCAR_MODEMR); 298*91f16700Schasinglulu boot_dev = reg & MODEMR_BOOT_DEV_MASK; 299*91f16700Schasinglulu 300*91f16700Schasinglulu if (boot_dev == MODEMR_BOOT_DEV_EMMC_25X1 || 301*91f16700Schasinglulu boot_dev == MODEMR_BOOT_DEV_EMMC_50X8) 302*91f16700Schasinglulu emmc_terminate(); 303*91f16700Schasinglulu 304*91f16700Schasinglulu if ((reg & MODEMR_BOOT_CPU_MASK) != MODEMR_BOOT_CPU_CR7) 305*91f16700Schasinglulu bl2_secure_setting(); 306*91f16700Schasinglulu 307*91f16700Schasinglulu reg = mmio_read_32(RCAR_PRR); 308*91f16700Schasinglulu product_cut = reg & (PRR_PRODUCT_MASK | PRR_CUT_MASK); 309*91f16700Schasinglulu product = reg & PRR_PRODUCT_MASK; 310*91f16700Schasinglulu cut = reg & PRR_CUT_MASK; 311*91f16700Schasinglulu 312*91f16700Schasinglulu if (product == PRR_PRODUCT_M3 && PRR_PRODUCT_30 > cut) 313*91f16700Schasinglulu goto tlb; 314*91f16700Schasinglulu 315*91f16700Schasinglulu if (product == PRR_PRODUCT_H3 && PRR_PRODUCT_20 > cut) 316*91f16700Schasinglulu goto tlb; 317*91f16700Schasinglulu 318*91f16700Schasinglulu /* Disable MFIS write protection */ 319*91f16700Schasinglulu mmio_write_32(MFISWPCNTR, MFISWPCNTR_PASSWORD | 1); 320*91f16700Schasinglulu 321*91f16700Schasinglulu tlb: 322*91f16700Schasinglulu reg = mmio_read_32(RCAR_MODEMR); 323*91f16700Schasinglulu boot_cpu = reg & MODEMR_BOOT_CPU_MASK; 324*91f16700Schasinglulu if (boot_cpu != MODEMR_BOOT_CPU_CA57 && 325*91f16700Schasinglulu boot_cpu != MODEMR_BOOT_CPU_CA53) 326*91f16700Schasinglulu goto mmu; 327*91f16700Schasinglulu 328*91f16700Schasinglulu if (product_cut == PRR_PRODUCT_H3_CUT20) { 329*91f16700Schasinglulu mmio_write_32(IPMMUVI0_IMSCTLR, IMSCTLR_DISCACHE); 330*91f16700Schasinglulu mmio_write_32(IPMMUVI1_IMSCTLR, IMSCTLR_DISCACHE); 331*91f16700Schasinglulu mmio_write_32(IPMMUPV0_IMSCTLR, IMSCTLR_DISCACHE); 332*91f16700Schasinglulu mmio_write_32(IPMMUPV1_IMSCTLR, IMSCTLR_DISCACHE); 333*91f16700Schasinglulu mmio_write_32(IPMMUPV2_IMSCTLR, IMSCTLR_DISCACHE); 334*91f16700Schasinglulu mmio_write_32(IPMMUPV3_IMSCTLR, IMSCTLR_DISCACHE); 335*91f16700Schasinglulu } else if (product_cut == (PRR_PRODUCT_M3N | PRR_PRODUCT_10) || 336*91f16700Schasinglulu product_cut == (PRR_PRODUCT_M3N | PRR_PRODUCT_11)) { 337*91f16700Schasinglulu mmio_write_32(IPMMUVI0_IMSCTLR, IMSCTLR_DISCACHE); 338*91f16700Schasinglulu mmio_write_32(IPMMUPV0_IMSCTLR, IMSCTLR_DISCACHE); 339*91f16700Schasinglulu } else if ((product_cut == (PRR_PRODUCT_E3 | PRR_PRODUCT_10)) || 340*91f16700Schasinglulu (product_cut == (PRR_PRODUCT_E3 | PRR_PRODUCT_11))) { 341*91f16700Schasinglulu mmio_write_32(IPMMUVI0_IMSCTLR, IMSCTLR_DISCACHE); 342*91f16700Schasinglulu mmio_write_32(IPMMUVP0_IMSCTLR, IMSCTLR_DISCACHE); 343*91f16700Schasinglulu mmio_write_32(IPMMUPV0_IMSCTLR, IMSCTLR_DISCACHE); 344*91f16700Schasinglulu } 345*91f16700Schasinglulu 346*91f16700Schasinglulu if (product_cut == (PRR_PRODUCT_H3_CUT20) || 347*91f16700Schasinglulu product_cut == (PRR_PRODUCT_M3N | PRR_PRODUCT_10) || 348*91f16700Schasinglulu product_cut == (PRR_PRODUCT_M3N | PRR_PRODUCT_11) || 349*91f16700Schasinglulu product_cut == (PRR_PRODUCT_E3 | PRR_PRODUCT_10)) { 350*91f16700Schasinglulu mmio_write_32(IPMMUHC_IMSCTLR, IMSCTLR_DISCACHE); 351*91f16700Schasinglulu mmio_write_32(IPMMURT_IMSCTLR, IMSCTLR_DISCACHE); 352*91f16700Schasinglulu mmio_write_32(IPMMUMP_IMSCTLR, IMSCTLR_DISCACHE); 353*91f16700Schasinglulu 354*91f16700Schasinglulu mmio_write_32(IPMMUDS0_IMSCTLR, IMSCTLR_DISCACHE); 355*91f16700Schasinglulu mmio_write_32(IPMMUDS1_IMSCTLR, IMSCTLR_DISCACHE); 356*91f16700Schasinglulu } 357*91f16700Schasinglulu 358*91f16700Schasinglulu mmu: 359*91f16700Schasinglulu mmio_write_32(IPMMUMM_IMSCTLR, IPMMUMM_IMSCTLR_ENABLE); 360*91f16700Schasinglulu mmio_write_32(IPMMUMM_IMAUXCTLR, IPMMUMM_IMAUXCTLR_NMERGE40_BIT); 361*91f16700Schasinglulu 362*91f16700Schasinglulu val = rcar_rom_get_lcs(&lcs); 363*91f16700Schasinglulu if (val) { 364*91f16700Schasinglulu ERROR("BL2: Failed to get the LCS. (%d)\n", val); 365*91f16700Schasinglulu panic(); 366*91f16700Schasinglulu } 367*91f16700Schasinglulu 368*91f16700Schasinglulu if (lcs == LCS_SE) 369*91f16700Schasinglulu mmio_clrbits_32(P_ARMREG_SEC_CTRL, P_ARMREG_SEC_CTRL_PROT); 370*91f16700Schasinglulu 371*91f16700Schasinglulu rcar_swdt_release(); 372*91f16700Schasinglulu bl2_system_cpg_init(); 373*91f16700Schasinglulu 374*91f16700Schasinglulu #if RCAR_BL2_DCACHE == 1 375*91f16700Schasinglulu /* Disable data cache (clean and invalidate) */ 376*91f16700Schasinglulu disable_mmu_el3(); 377*91f16700Schasinglulu #endif 378*91f16700Schasinglulu } 379*91f16700Schasinglulu 380*91f16700Schasinglulu static uint32_t is_ddr_backup_mode(void) 381*91f16700Schasinglulu { 382*91f16700Schasinglulu #if RCAR_SYSTEM_SUSPEND 383*91f16700Schasinglulu static uint32_t reason = RCAR_COLD_BOOT; 384*91f16700Schasinglulu static uint32_t once; 385*91f16700Schasinglulu 386*91f16700Schasinglulu #if PMIC_ROHM_BD9571 && RCAR_SYSTEM_RESET_KEEPON_DDR 387*91f16700Schasinglulu uint8_t data; 388*91f16700Schasinglulu #endif 389*91f16700Schasinglulu if (once) 390*91f16700Schasinglulu return reason; 391*91f16700Schasinglulu 392*91f16700Schasinglulu once = 1; 393*91f16700Schasinglulu if ((mmio_read_32(GPIO_INDT) & GPIO_BKUP_TRG_SHIFT) == 0) 394*91f16700Schasinglulu return reason; 395*91f16700Schasinglulu 396*91f16700Schasinglulu #if PMIC_ROHM_BD9571 && RCAR_SYSTEM_RESET_KEEPON_DDR 397*91f16700Schasinglulu if (rcar_iic_dvfs_receive(PMIC, REG_KEEP10, &data)) { 398*91f16700Schasinglulu ERROR("BL2: REG Keep10 READ ERROR.\n"); 399*91f16700Schasinglulu panic(); 400*91f16700Schasinglulu } 401*91f16700Schasinglulu 402*91f16700Schasinglulu if (KEEP10_MAGIC != data) 403*91f16700Schasinglulu reason = RCAR_WARM_BOOT; 404*91f16700Schasinglulu #else 405*91f16700Schasinglulu reason = RCAR_WARM_BOOT; 406*91f16700Schasinglulu #endif 407*91f16700Schasinglulu return reason; 408*91f16700Schasinglulu #else 409*91f16700Schasinglulu return RCAR_COLD_BOOT; 410*91f16700Schasinglulu #endif 411*91f16700Schasinglulu } 412*91f16700Schasinglulu 413*91f16700Schasinglulu #if RCAR_GEN3_BL33_GZIP == 1 414*91f16700Schasinglulu void bl2_plat_preload_setup(void) 415*91f16700Schasinglulu { 416*91f16700Schasinglulu image_decompress_init(BL33_COMP_BASE, BL33_COMP_SIZE, gunzip); 417*91f16700Schasinglulu } 418*91f16700Schasinglulu #endif 419*91f16700Schasinglulu 420*91f16700Schasinglulu int bl2_plat_handle_pre_image_load(unsigned int image_id) 421*91f16700Schasinglulu { 422*91f16700Schasinglulu u_register_t *boot_kind = (void *) BOOT_KIND_BASE; 423*91f16700Schasinglulu bl_mem_params_node_t *bl_mem_params; 424*91f16700Schasinglulu 425*91f16700Schasinglulu bl_mem_params = get_bl_mem_params_node(image_id); 426*91f16700Schasinglulu 427*91f16700Schasinglulu #if RCAR_GEN3_BL33_GZIP == 1 428*91f16700Schasinglulu if (image_id == BL33_IMAGE_ID) { 429*91f16700Schasinglulu image_decompress_prepare(&bl_mem_params->image_info); 430*91f16700Schasinglulu } 431*91f16700Schasinglulu #endif 432*91f16700Schasinglulu 433*91f16700Schasinglulu if (image_id != BL31_IMAGE_ID) 434*91f16700Schasinglulu return 0; 435*91f16700Schasinglulu 436*91f16700Schasinglulu if (is_ddr_backup_mode() == RCAR_COLD_BOOT) 437*91f16700Schasinglulu goto cold_boot; 438*91f16700Schasinglulu 439*91f16700Schasinglulu *boot_kind = RCAR_WARM_BOOT; 440*91f16700Schasinglulu flush_dcache_range(BOOT_KIND_BASE, sizeof(*boot_kind)); 441*91f16700Schasinglulu 442*91f16700Schasinglulu console_flush(); 443*91f16700Schasinglulu bl2_plat_flush_bl31_params(); 444*91f16700Schasinglulu 445*91f16700Schasinglulu /* will not return */ 446*91f16700Schasinglulu bl2_enter_bl31(&bl_mem_params->ep_info); 447*91f16700Schasinglulu 448*91f16700Schasinglulu cold_boot: 449*91f16700Schasinglulu *boot_kind = RCAR_COLD_BOOT; 450*91f16700Schasinglulu flush_dcache_range(BOOT_KIND_BASE, sizeof(*boot_kind)); 451*91f16700Schasinglulu 452*91f16700Schasinglulu return 0; 453*91f16700Schasinglulu } 454*91f16700Schasinglulu 455*91f16700Schasinglulu static uint64_t rcar_get_dest_addr_from_cert(uint32_t certid, uintptr_t *dest) 456*91f16700Schasinglulu { 457*91f16700Schasinglulu uint32_t cert, len; 458*91f16700Schasinglulu int ret; 459*91f16700Schasinglulu 460*91f16700Schasinglulu ret = rcar_get_certificate(certid, &cert); 461*91f16700Schasinglulu if (ret) { 462*91f16700Schasinglulu ERROR("%s : cert file load error", __func__); 463*91f16700Schasinglulu return 1; 464*91f16700Schasinglulu } 465*91f16700Schasinglulu 466*91f16700Schasinglulu rcar_read_certificate((uint64_t) cert, &len, dest); 467*91f16700Schasinglulu 468*91f16700Schasinglulu return 0; 469*91f16700Schasinglulu } 470*91f16700Schasinglulu 471*91f16700Schasinglulu int bl2_plat_handle_post_image_load(unsigned int image_id) 472*91f16700Schasinglulu { 473*91f16700Schasinglulu static bl2_to_bl31_params_mem_t *params; 474*91f16700Schasinglulu bl_mem_params_node_t *bl_mem_params; 475*91f16700Schasinglulu uintptr_t dest; 476*91f16700Schasinglulu int ret; 477*91f16700Schasinglulu 478*91f16700Schasinglulu if (!params) { 479*91f16700Schasinglulu params = (bl2_to_bl31_params_mem_t *) PARAMS_BASE; 480*91f16700Schasinglulu memset((void *)PARAMS_BASE, 0, sizeof(*params)); 481*91f16700Schasinglulu } 482*91f16700Schasinglulu 483*91f16700Schasinglulu bl_mem_params = get_bl_mem_params_node(image_id); 484*91f16700Schasinglulu 485*91f16700Schasinglulu switch (image_id) { 486*91f16700Schasinglulu case BL31_IMAGE_ID: 487*91f16700Schasinglulu ret = rcar_get_dest_addr_from_cert(SOC_FW_CONTENT_CERT_ID, 488*91f16700Schasinglulu &dest); 489*91f16700Schasinglulu if (!ret) 490*91f16700Schasinglulu bl_mem_params->image_info.image_base = dest; 491*91f16700Schasinglulu break; 492*91f16700Schasinglulu case BL32_IMAGE_ID: 493*91f16700Schasinglulu ret = rcar_get_dest_addr_from_cert(TRUSTED_OS_FW_CONTENT_CERT_ID, 494*91f16700Schasinglulu &dest); 495*91f16700Schasinglulu if (!ret) 496*91f16700Schasinglulu bl_mem_params->image_info.image_base = dest; 497*91f16700Schasinglulu 498*91f16700Schasinglulu memcpy(¶ms->bl32_ep_info, &bl_mem_params->ep_info, 499*91f16700Schasinglulu sizeof(entry_point_info_t)); 500*91f16700Schasinglulu break; 501*91f16700Schasinglulu case BL33_IMAGE_ID: 502*91f16700Schasinglulu #if RCAR_GEN3_BL33_GZIP == 1 503*91f16700Schasinglulu if ((mmio_read_32(BL33_COMP_BASE) & 0xffff) == 0x8b1f) { 504*91f16700Schasinglulu /* decompress gzip-compressed image */ 505*91f16700Schasinglulu ret = image_decompress(&bl_mem_params->image_info); 506*91f16700Schasinglulu if (ret != 0) { 507*91f16700Schasinglulu return ret; 508*91f16700Schasinglulu } 509*91f16700Schasinglulu } else { 510*91f16700Schasinglulu /* plain image, copy it in place */ 511*91f16700Schasinglulu memcpy((void *)BL33_BASE, (void *)BL33_COMP_BASE, 512*91f16700Schasinglulu bl_mem_params->image_info.image_size); 513*91f16700Schasinglulu } 514*91f16700Schasinglulu #endif 515*91f16700Schasinglulu memcpy(¶ms->bl33_ep_info, &bl_mem_params->ep_info, 516*91f16700Schasinglulu sizeof(entry_point_info_t)); 517*91f16700Schasinglulu break; 518*91f16700Schasinglulu } 519*91f16700Schasinglulu 520*91f16700Schasinglulu return 0; 521*91f16700Schasinglulu } 522*91f16700Schasinglulu 523*91f16700Schasinglulu struct meminfo *bl2_plat_sec_mem_layout(void) 524*91f16700Schasinglulu { 525*91f16700Schasinglulu return &bl2_tzram_layout; 526*91f16700Schasinglulu } 527*91f16700Schasinglulu 528*91f16700Schasinglulu static void bl2_populate_compatible_string(void *dt) 529*91f16700Schasinglulu { 530*91f16700Schasinglulu uint32_t board_type; 531*91f16700Schasinglulu uint32_t board_rev; 532*91f16700Schasinglulu uint32_t reg; 533*91f16700Schasinglulu int ret; 534*91f16700Schasinglulu 535*91f16700Schasinglulu fdt_setprop_u32(dt, 0, "#address-cells", 2); 536*91f16700Schasinglulu fdt_setprop_u32(dt, 0, "#size-cells", 2); 537*91f16700Schasinglulu 538*91f16700Schasinglulu /* Populate compatible string */ 539*91f16700Schasinglulu rcar_get_board_type(&board_type, &board_rev); 540*91f16700Schasinglulu switch (board_type) { 541*91f16700Schasinglulu case BOARD_SALVATOR_X: 542*91f16700Schasinglulu ret = fdt_setprop_string(dt, 0, "compatible", 543*91f16700Schasinglulu "renesas,salvator-x"); 544*91f16700Schasinglulu break; 545*91f16700Schasinglulu case BOARD_SALVATOR_XS: 546*91f16700Schasinglulu ret = fdt_setprop_string(dt, 0, "compatible", 547*91f16700Schasinglulu "renesas,salvator-xs"); 548*91f16700Schasinglulu break; 549*91f16700Schasinglulu case BOARD_STARTER_KIT: 550*91f16700Schasinglulu ret = fdt_setprop_string(dt, 0, "compatible", 551*91f16700Schasinglulu "renesas,m3ulcb"); 552*91f16700Schasinglulu break; 553*91f16700Schasinglulu case BOARD_STARTER_KIT_PRE: 554*91f16700Schasinglulu ret = fdt_setprop_string(dt, 0, "compatible", 555*91f16700Schasinglulu "renesas,h3ulcb"); 556*91f16700Schasinglulu break; 557*91f16700Schasinglulu case BOARD_EAGLE: 558*91f16700Schasinglulu ret = fdt_setprop_string(dt, 0, "compatible", 559*91f16700Schasinglulu "renesas,eagle"); 560*91f16700Schasinglulu break; 561*91f16700Schasinglulu case BOARD_EBISU: 562*91f16700Schasinglulu case BOARD_EBISU_4D: 563*91f16700Schasinglulu ret = fdt_setprop_string(dt, 0, "compatible", 564*91f16700Schasinglulu "renesas,ebisu"); 565*91f16700Schasinglulu break; 566*91f16700Schasinglulu case BOARD_DRAAK: 567*91f16700Schasinglulu ret = fdt_setprop_string(dt, 0, "compatible", 568*91f16700Schasinglulu "renesas,draak"); 569*91f16700Schasinglulu break; 570*91f16700Schasinglulu default: 571*91f16700Schasinglulu NOTICE("BL2: Cannot set compatible string, board unsupported\n"); 572*91f16700Schasinglulu panic(); 573*91f16700Schasinglulu } 574*91f16700Schasinglulu 575*91f16700Schasinglulu if (ret < 0) { 576*91f16700Schasinglulu NOTICE("BL2: Cannot set compatible string (ret=%i)\n", ret); 577*91f16700Schasinglulu panic(); 578*91f16700Schasinglulu } 579*91f16700Schasinglulu 580*91f16700Schasinglulu reg = mmio_read_32(RCAR_PRR); 581*91f16700Schasinglulu switch (reg & PRR_PRODUCT_MASK) { 582*91f16700Schasinglulu case PRR_PRODUCT_H3: 583*91f16700Schasinglulu ret = fdt_appendprop_string(dt, 0, "compatible", 584*91f16700Schasinglulu "renesas,r8a7795"); 585*91f16700Schasinglulu break; 586*91f16700Schasinglulu case PRR_PRODUCT_M3: 587*91f16700Schasinglulu ret = fdt_appendprop_string(dt, 0, "compatible", 588*91f16700Schasinglulu "renesas,r8a7796"); 589*91f16700Schasinglulu break; 590*91f16700Schasinglulu case PRR_PRODUCT_M3N: 591*91f16700Schasinglulu ret = fdt_appendprop_string(dt, 0, "compatible", 592*91f16700Schasinglulu "renesas,r8a77965"); 593*91f16700Schasinglulu break; 594*91f16700Schasinglulu case PRR_PRODUCT_V3M: 595*91f16700Schasinglulu ret = fdt_appendprop_string(dt, 0, "compatible", 596*91f16700Schasinglulu "renesas,r8a77970"); 597*91f16700Schasinglulu break; 598*91f16700Schasinglulu case PRR_PRODUCT_E3: 599*91f16700Schasinglulu ret = fdt_appendprop_string(dt, 0, "compatible", 600*91f16700Schasinglulu "renesas,r8a77990"); 601*91f16700Schasinglulu break; 602*91f16700Schasinglulu case PRR_PRODUCT_D3: 603*91f16700Schasinglulu ret = fdt_appendprop_string(dt, 0, "compatible", 604*91f16700Schasinglulu "renesas,r8a77995"); 605*91f16700Schasinglulu break; 606*91f16700Schasinglulu default: 607*91f16700Schasinglulu NOTICE("BL2: Cannot set compatible string, SoC unsupported\n"); 608*91f16700Schasinglulu panic(); 609*91f16700Schasinglulu } 610*91f16700Schasinglulu 611*91f16700Schasinglulu if (ret < 0) { 612*91f16700Schasinglulu NOTICE("BL2: Cannot set compatible string (ret=%i)\n", ret); 613*91f16700Schasinglulu panic(); 614*91f16700Schasinglulu } 615*91f16700Schasinglulu } 616*91f16700Schasinglulu 617*91f16700Schasinglulu static void bl2_add_rpc_node(void) 618*91f16700Schasinglulu { 619*91f16700Schasinglulu #if (RCAR_RPC_HYPERFLASH_LOCKED == 0) 620*91f16700Schasinglulu int ret, node; 621*91f16700Schasinglulu 622*91f16700Schasinglulu node = ret = fdt_add_subnode(fdt, 0, "soc"); 623*91f16700Schasinglulu if (ret < 0) { 624*91f16700Schasinglulu goto err; 625*91f16700Schasinglulu } 626*91f16700Schasinglulu 627*91f16700Schasinglulu node = ret = fdt_add_subnode(fdt, node, "spi@ee200000"); 628*91f16700Schasinglulu if (ret < 0) { 629*91f16700Schasinglulu goto err; 630*91f16700Schasinglulu } 631*91f16700Schasinglulu 632*91f16700Schasinglulu ret = fdt_setprop_string(fdt, node, "status", "okay"); 633*91f16700Schasinglulu if (ret < 0) { 634*91f16700Schasinglulu goto err; 635*91f16700Schasinglulu } 636*91f16700Schasinglulu 637*91f16700Schasinglulu return; 638*91f16700Schasinglulu err: 639*91f16700Schasinglulu NOTICE("BL2: Cannot add RPC node to FDT (ret=%i)\n", ret); 640*91f16700Schasinglulu panic(); 641*91f16700Schasinglulu #endif 642*91f16700Schasinglulu } 643*91f16700Schasinglulu 644*91f16700Schasinglulu static void bl2_add_dram_entry(uint64_t start, uint64_t size) 645*91f16700Schasinglulu { 646*91f16700Schasinglulu char nodename[32] = { 0 }; 647*91f16700Schasinglulu uint64_t fdtsize; 648*91f16700Schasinglulu int ret, node; 649*91f16700Schasinglulu 650*91f16700Schasinglulu fdtsize = cpu_to_fdt64(size); 651*91f16700Schasinglulu 652*91f16700Schasinglulu snprintf(nodename, sizeof(nodename), "memory@"); 653*91f16700Schasinglulu unsigned_num_print(start, 16, nodename + strlen(nodename)); 654*91f16700Schasinglulu node = ret = fdt_add_subnode(fdt, 0, nodename); 655*91f16700Schasinglulu if (ret < 0) { 656*91f16700Schasinglulu goto err; 657*91f16700Schasinglulu } 658*91f16700Schasinglulu 659*91f16700Schasinglulu ret = fdt_setprop_string(fdt, node, "device_type", "memory"); 660*91f16700Schasinglulu if (ret < 0) { 661*91f16700Schasinglulu goto err; 662*91f16700Schasinglulu } 663*91f16700Schasinglulu 664*91f16700Schasinglulu ret = fdt_setprop_u64(fdt, node, "reg", start); 665*91f16700Schasinglulu if (ret < 0) { 666*91f16700Schasinglulu goto err; 667*91f16700Schasinglulu } 668*91f16700Schasinglulu 669*91f16700Schasinglulu ret = fdt_appendprop(fdt, node, "reg", &fdtsize, 670*91f16700Schasinglulu sizeof(fdtsize)); 671*91f16700Schasinglulu if (ret < 0) { 672*91f16700Schasinglulu goto err; 673*91f16700Schasinglulu } 674*91f16700Schasinglulu 675*91f16700Schasinglulu return; 676*91f16700Schasinglulu err: 677*91f16700Schasinglulu NOTICE("BL2: Cannot add memory node [%" PRIx64 " - %" PRIx64 "] to FDT (ret=%i)\n", 678*91f16700Schasinglulu start, start + size - 1, ret); 679*91f16700Schasinglulu panic(); 680*91f16700Schasinglulu } 681*91f16700Schasinglulu 682*91f16700Schasinglulu static void bl2_advertise_dram_entries(uint64_t dram_config[8]) 683*91f16700Schasinglulu { 684*91f16700Schasinglulu uint64_t start, size, size32; 685*91f16700Schasinglulu int chan; 686*91f16700Schasinglulu 687*91f16700Schasinglulu for (chan = 0; chan < 4; chan++) { 688*91f16700Schasinglulu start = dram_config[2 * chan]; 689*91f16700Schasinglulu size = dram_config[2 * chan + 1]; 690*91f16700Schasinglulu if (!size) 691*91f16700Schasinglulu continue; 692*91f16700Schasinglulu 693*91f16700Schasinglulu NOTICE("BL2: CH%d: %" PRIx64 " - %" PRIx64 ", %" PRId64 " %siB\n", 694*91f16700Schasinglulu chan, start, start + size - 1, 695*91f16700Schasinglulu (size >> 30) ? : size >> 20, 696*91f16700Schasinglulu (size >> 30) ? "G" : "M"); 697*91f16700Schasinglulu } 698*91f16700Schasinglulu 699*91f16700Schasinglulu /* 700*91f16700Schasinglulu * We add the DT nodes in reverse order here. The fdt_add_subnode() 701*91f16700Schasinglulu * adds the DT node before the first existing DT node, so we have 702*91f16700Schasinglulu * to add them in reverse order to get nodes sorted by address in 703*91f16700Schasinglulu * the resulting DT. 704*91f16700Schasinglulu */ 705*91f16700Schasinglulu for (chan = 3; chan >= 0; chan--) { 706*91f16700Schasinglulu start = dram_config[2 * chan]; 707*91f16700Schasinglulu size = dram_config[2 * chan + 1]; 708*91f16700Schasinglulu if (!size) 709*91f16700Schasinglulu continue; 710*91f16700Schasinglulu 711*91f16700Schasinglulu /* 712*91f16700Schasinglulu * Channel 0 is mapped in 32bit space and the first 713*91f16700Schasinglulu * 128 MiB are reserved and the maximum size is 2GiB. 714*91f16700Schasinglulu */ 715*91f16700Schasinglulu if (chan == 0) { 716*91f16700Schasinglulu /* Limit the 32bit entry to 2 GiB - 128 MiB */ 717*91f16700Schasinglulu size32 = size - 0x8000000U; 718*91f16700Schasinglulu if (size32 >= 0x78000000U) { 719*91f16700Schasinglulu size32 = 0x78000000U; 720*91f16700Schasinglulu } 721*91f16700Schasinglulu 722*91f16700Schasinglulu /* Emit 32bit entry, up to 2 GiB - 128 MiB long. */ 723*91f16700Schasinglulu bl2_add_dram_entry(0x48000000, size32); 724*91f16700Schasinglulu 725*91f16700Schasinglulu /* 726*91f16700Schasinglulu * If channel 0 is less than 2 GiB long, the 727*91f16700Schasinglulu * entire memory fits into the 32bit space entry, 728*91f16700Schasinglulu * so move on to the next channel. 729*91f16700Schasinglulu */ 730*91f16700Schasinglulu if (size <= 0x80000000U) { 731*91f16700Schasinglulu continue; 732*91f16700Schasinglulu } 733*91f16700Schasinglulu 734*91f16700Schasinglulu /* 735*91f16700Schasinglulu * If channel 0 is more than 2 GiB long, emit 736*91f16700Schasinglulu * another entry which covers the rest of the 737*91f16700Schasinglulu * memory in channel 0, in the 64bit space. 738*91f16700Schasinglulu * 739*91f16700Schasinglulu * Start of this new entry is at 2 GiB offset 740*91f16700Schasinglulu * from the beginning of the 64bit channel 0 741*91f16700Schasinglulu * address, size is 2 GiB shorter than total 742*91f16700Schasinglulu * size of the channel. 743*91f16700Schasinglulu */ 744*91f16700Schasinglulu start += 0x80000000U; 745*91f16700Schasinglulu size -= 0x80000000U; 746*91f16700Schasinglulu } 747*91f16700Schasinglulu 748*91f16700Schasinglulu bl2_add_dram_entry(start, size); 749*91f16700Schasinglulu } 750*91f16700Schasinglulu } 751*91f16700Schasinglulu 752*91f16700Schasinglulu static void bl2_advertise_dram_size(uint32_t product) 753*91f16700Schasinglulu { 754*91f16700Schasinglulu uint64_t dram_config[8] = { 755*91f16700Schasinglulu [0] = 0x400000000ULL, 756*91f16700Schasinglulu [2] = 0x500000000ULL, 757*91f16700Schasinglulu [4] = 0x600000000ULL, 758*91f16700Schasinglulu [6] = 0x700000000ULL, 759*91f16700Schasinglulu }; 760*91f16700Schasinglulu uint32_t cut = mmio_read_32(RCAR_PRR) & PRR_CUT_MASK; 761*91f16700Schasinglulu 762*91f16700Schasinglulu switch (product) { 763*91f16700Schasinglulu case PRR_PRODUCT_H3: 764*91f16700Schasinglulu #if (RCAR_DRAM_LPDDR4_MEMCONF == 0) 765*91f16700Schasinglulu /* 4GB(1GBx4) */ 766*91f16700Schasinglulu dram_config[1] = 0x40000000ULL; 767*91f16700Schasinglulu dram_config[3] = 0x40000000ULL; 768*91f16700Schasinglulu dram_config[5] = 0x40000000ULL; 769*91f16700Schasinglulu dram_config[7] = 0x40000000ULL; 770*91f16700Schasinglulu #elif (RCAR_DRAM_LPDDR4_MEMCONF == 1) && \ 771*91f16700Schasinglulu (RCAR_DRAM_CHANNEL == 5) && \ 772*91f16700Schasinglulu (RCAR_DRAM_SPLIT == 2) 773*91f16700Schasinglulu /* 4GB(2GBx2 2ch split) */ 774*91f16700Schasinglulu dram_config[1] = 0x80000000ULL; 775*91f16700Schasinglulu dram_config[3] = 0x80000000ULL; 776*91f16700Schasinglulu #elif (RCAR_DRAM_LPDDR4_MEMCONF == 1) && (RCAR_DRAM_CHANNEL == 15) 777*91f16700Schasinglulu /* 8GB(2GBx4: default) */ 778*91f16700Schasinglulu dram_config[1] = 0x80000000ULL; 779*91f16700Schasinglulu dram_config[3] = 0x80000000ULL; 780*91f16700Schasinglulu dram_config[5] = 0x80000000ULL; 781*91f16700Schasinglulu dram_config[7] = 0x80000000ULL; 782*91f16700Schasinglulu #endif /* RCAR_DRAM_LPDDR4_MEMCONF == 0 */ 783*91f16700Schasinglulu break; 784*91f16700Schasinglulu 785*91f16700Schasinglulu case PRR_PRODUCT_M3: 786*91f16700Schasinglulu if (cut < PRR_PRODUCT_30) { 787*91f16700Schasinglulu #if (RCAR_GEN3_ULCB == 1) 788*91f16700Schasinglulu /* 2GB(1GBx2 2ch split) */ 789*91f16700Schasinglulu dram_config[1] = 0x40000000ULL; 790*91f16700Schasinglulu dram_config[5] = 0x40000000ULL; 791*91f16700Schasinglulu #else 792*91f16700Schasinglulu /* 4GB(2GBx2 2ch split) */ 793*91f16700Schasinglulu dram_config[1] = 0x80000000ULL; 794*91f16700Schasinglulu dram_config[5] = 0x80000000ULL; 795*91f16700Schasinglulu #endif 796*91f16700Schasinglulu } else { 797*91f16700Schasinglulu /* 8GB(2GBx4 2ch split) */ 798*91f16700Schasinglulu dram_config[1] = 0x100000000ULL; 799*91f16700Schasinglulu dram_config[5] = 0x100000000ULL; 800*91f16700Schasinglulu } 801*91f16700Schasinglulu break; 802*91f16700Schasinglulu 803*91f16700Schasinglulu case PRR_PRODUCT_M3N: 804*91f16700Schasinglulu #if (RCAR_DRAM_LPDDR4_MEMCONF == 2) 805*91f16700Schasinglulu /* 4GB(4GBx1) */ 806*91f16700Schasinglulu dram_config[1] = 0x100000000ULL; 807*91f16700Schasinglulu #elif (RCAR_DRAM_LPDDR4_MEMCONF == 1) 808*91f16700Schasinglulu /* 2GB(1GBx2) */ 809*91f16700Schasinglulu dram_config[1] = 0x80000000ULL; 810*91f16700Schasinglulu #endif 811*91f16700Schasinglulu break; 812*91f16700Schasinglulu 813*91f16700Schasinglulu case PRR_PRODUCT_V3M: 814*91f16700Schasinglulu /* 1GB(512MBx2) */ 815*91f16700Schasinglulu dram_config[1] = 0x40000000ULL; 816*91f16700Schasinglulu break; 817*91f16700Schasinglulu 818*91f16700Schasinglulu case PRR_PRODUCT_E3: 819*91f16700Schasinglulu #if (RCAR_DRAM_DDR3L_MEMCONF == 0) 820*91f16700Schasinglulu /* 1GB(512MBx2) */ 821*91f16700Schasinglulu dram_config[1] = 0x40000000ULL; 822*91f16700Schasinglulu #elif (RCAR_DRAM_DDR3L_MEMCONF == 1) 823*91f16700Schasinglulu /* 2GB(512MBx4) */ 824*91f16700Schasinglulu dram_config[1] = 0x80000000ULL; 825*91f16700Schasinglulu #elif (RCAR_DRAM_DDR3L_MEMCONF == 2) 826*91f16700Schasinglulu /* 4GB(1GBx4) */ 827*91f16700Schasinglulu dram_config[1] = 0x100000000ULL; 828*91f16700Schasinglulu #endif /* RCAR_DRAM_DDR3L_MEMCONF == 0 */ 829*91f16700Schasinglulu break; 830*91f16700Schasinglulu 831*91f16700Schasinglulu case PRR_PRODUCT_D3: 832*91f16700Schasinglulu /* 512MB */ 833*91f16700Schasinglulu dram_config[1] = 0x20000000ULL; 834*91f16700Schasinglulu break; 835*91f16700Schasinglulu } 836*91f16700Schasinglulu 837*91f16700Schasinglulu bl2_advertise_dram_entries(dram_config); 838*91f16700Schasinglulu } 839*91f16700Schasinglulu 840*91f16700Schasinglulu void bl2_el3_early_platform_setup(u_register_t arg1, u_register_t arg2, 841*91f16700Schasinglulu u_register_t arg3, u_register_t arg4) 842*91f16700Schasinglulu { 843*91f16700Schasinglulu uint32_t reg, midr, lcs, boot_dev, boot_cpu, sscg, type, rev; 844*91f16700Schasinglulu uint32_t product, product_cut, major, minor; 845*91f16700Schasinglulu int32_t ret; 846*91f16700Schasinglulu const char *str; 847*91f16700Schasinglulu const char *unknown = "unknown"; 848*91f16700Schasinglulu const char *cpu_ca57 = "CA57"; 849*91f16700Schasinglulu const char *cpu_ca53 = "CA53"; 850*91f16700Schasinglulu const char *product_m3n = "M3N"; 851*91f16700Schasinglulu const char *product_h3 = "H3"; 852*91f16700Schasinglulu const char *product_m3 = "M3"; 853*91f16700Schasinglulu const char *product_e3 = "E3"; 854*91f16700Schasinglulu const char *product_d3 = "D3"; 855*91f16700Schasinglulu const char *product_v3m = "V3M"; 856*91f16700Schasinglulu const char *lcs_secure = "SE"; 857*91f16700Schasinglulu const char *lcs_cm = "CM"; 858*91f16700Schasinglulu const char *lcs_dm = "DM"; 859*91f16700Schasinglulu const char *lcs_sd = "SD"; 860*91f16700Schasinglulu const char *lcs_fa = "FA"; 861*91f16700Schasinglulu const char *sscg_off = "PLL1 nonSSCG Clock select"; 862*91f16700Schasinglulu const char *sscg_on = "PLL1 SSCG Clock select"; 863*91f16700Schasinglulu const char *boot_hyper80 = "HyperFlash(80MHz)"; 864*91f16700Schasinglulu const char *boot_qspi40 = "QSPI Flash(40MHz)"; 865*91f16700Schasinglulu const char *boot_qspi80 = "QSPI Flash(80MHz)"; 866*91f16700Schasinglulu const char *boot_emmc25x1 = "eMMC(25MHz x1)"; 867*91f16700Schasinglulu const char *boot_emmc50x8 = "eMMC(50MHz x8)"; 868*91f16700Schasinglulu #if (RCAR_LSI == RCAR_E3) || (RCAR_LSI == RCAR_D3) 869*91f16700Schasinglulu const char *boot_hyper160 = "HyperFlash(150MHz)"; 870*91f16700Schasinglulu #else 871*91f16700Schasinglulu const char *boot_hyper160 = "HyperFlash(160MHz)"; 872*91f16700Schasinglulu #endif 873*91f16700Schasinglulu 874*91f16700Schasinglulu bl2_init_generic_timer(); 875*91f16700Schasinglulu 876*91f16700Schasinglulu reg = mmio_read_32(RCAR_MODEMR); 877*91f16700Schasinglulu boot_dev = reg & MODEMR_BOOT_DEV_MASK; 878*91f16700Schasinglulu boot_cpu = reg & MODEMR_BOOT_CPU_MASK; 879*91f16700Schasinglulu 880*91f16700Schasinglulu bl2_cpg_init(); 881*91f16700Schasinglulu 882*91f16700Schasinglulu if (boot_cpu == MODEMR_BOOT_CPU_CA57 || 883*91f16700Schasinglulu boot_cpu == MODEMR_BOOT_CPU_CA53) { 884*91f16700Schasinglulu rcar_pfc_init(); 885*91f16700Schasinglulu rcar_console_boot_init(); 886*91f16700Schasinglulu } 887*91f16700Schasinglulu 888*91f16700Schasinglulu plat_rcar_gic_driver_init(); 889*91f16700Schasinglulu plat_rcar_gic_init(); 890*91f16700Schasinglulu rcar_swdt_init(); 891*91f16700Schasinglulu 892*91f16700Schasinglulu /* FIQ interrupts are taken to EL3 */ 893*91f16700Schasinglulu write_scr_el3(read_scr_el3() | SCR_FIQ_BIT); 894*91f16700Schasinglulu 895*91f16700Schasinglulu write_daifclr(DAIF_FIQ_BIT); 896*91f16700Schasinglulu 897*91f16700Schasinglulu reg = read_midr(); 898*91f16700Schasinglulu midr = reg & (MIDR_PN_MASK << MIDR_PN_SHIFT); 899*91f16700Schasinglulu switch (midr) { 900*91f16700Schasinglulu case MIDR_CA57: 901*91f16700Schasinglulu str = cpu_ca57; 902*91f16700Schasinglulu break; 903*91f16700Schasinglulu case MIDR_CA53: 904*91f16700Schasinglulu str = cpu_ca53; 905*91f16700Schasinglulu break; 906*91f16700Schasinglulu default: 907*91f16700Schasinglulu str = unknown; 908*91f16700Schasinglulu break; 909*91f16700Schasinglulu } 910*91f16700Schasinglulu 911*91f16700Schasinglulu NOTICE("BL2: R-Car Gen3 Initial Program Loader(%s) Rev.%s\n", str, 912*91f16700Schasinglulu version_of_renesas); 913*91f16700Schasinglulu 914*91f16700Schasinglulu reg = mmio_read_32(RCAR_PRR); 915*91f16700Schasinglulu product_cut = reg & (PRR_PRODUCT_MASK | PRR_CUT_MASK); 916*91f16700Schasinglulu product = reg & PRR_PRODUCT_MASK; 917*91f16700Schasinglulu 918*91f16700Schasinglulu switch (product) { 919*91f16700Schasinglulu case PRR_PRODUCT_H3: 920*91f16700Schasinglulu str = product_h3; 921*91f16700Schasinglulu break; 922*91f16700Schasinglulu case PRR_PRODUCT_M3: 923*91f16700Schasinglulu str = product_m3; 924*91f16700Schasinglulu break; 925*91f16700Schasinglulu case PRR_PRODUCT_M3N: 926*91f16700Schasinglulu str = product_m3n; 927*91f16700Schasinglulu break; 928*91f16700Schasinglulu case PRR_PRODUCT_V3M: 929*91f16700Schasinglulu str = product_v3m; 930*91f16700Schasinglulu break; 931*91f16700Schasinglulu case PRR_PRODUCT_E3: 932*91f16700Schasinglulu str = product_e3; 933*91f16700Schasinglulu break; 934*91f16700Schasinglulu case PRR_PRODUCT_D3: 935*91f16700Schasinglulu str = product_d3; 936*91f16700Schasinglulu break; 937*91f16700Schasinglulu default: 938*91f16700Schasinglulu str = unknown; 939*91f16700Schasinglulu break; 940*91f16700Schasinglulu } 941*91f16700Schasinglulu 942*91f16700Schasinglulu if ((PRR_PRODUCT_M3 == product) && 943*91f16700Schasinglulu (PRR_PRODUCT_20 == (reg & RCAR_MAJOR_MASK))) { 944*91f16700Schasinglulu if (RCAR_M3_CUT_VER11 == (reg & PRR_CUT_MASK)) { 945*91f16700Schasinglulu /* M3 Ver.1.1 or Ver.1.2 */ 946*91f16700Schasinglulu NOTICE("BL2: PRR is R-Car %s Ver.1.1 / Ver.1.2\n", 947*91f16700Schasinglulu str); 948*91f16700Schasinglulu } else { 949*91f16700Schasinglulu NOTICE("BL2: PRR is R-Car %s Ver.1.%d\n", 950*91f16700Schasinglulu str, 951*91f16700Schasinglulu (reg & RCAR_MINOR_MASK) + RCAR_M3_MINOR_OFFSET); 952*91f16700Schasinglulu } 953*91f16700Schasinglulu } else if (product == PRR_PRODUCT_D3) { 954*91f16700Schasinglulu if (RCAR_D3_CUT_VER10 == (reg & PRR_CUT_MASK)) { 955*91f16700Schasinglulu NOTICE("BL2: PRR is R-Car %s Ver.1.0\n", str); 956*91f16700Schasinglulu } else if (RCAR_D3_CUT_VER11 == (reg & PRR_CUT_MASK)) { 957*91f16700Schasinglulu NOTICE("BL2: PRR is R-Car %s Ver.1.1\n", str); 958*91f16700Schasinglulu } else { 959*91f16700Schasinglulu NOTICE("BL2: PRR is R-Car %s Ver.X.X\n", str); 960*91f16700Schasinglulu } 961*91f16700Schasinglulu } else { 962*91f16700Schasinglulu major = (reg & RCAR_MAJOR_MASK) >> RCAR_MAJOR_SHIFT; 963*91f16700Schasinglulu major = major + RCAR_MAJOR_OFFSET; 964*91f16700Schasinglulu minor = reg & RCAR_MINOR_MASK; 965*91f16700Schasinglulu NOTICE("BL2: PRR is R-Car %s Ver.%d.%d\n", str, major, minor); 966*91f16700Schasinglulu } 967*91f16700Schasinglulu 968*91f16700Schasinglulu if (PRR_PRODUCT_E3 == product || PRR_PRODUCT_D3 == product) { 969*91f16700Schasinglulu reg = mmio_read_32(RCAR_MODEMR); 970*91f16700Schasinglulu sscg = reg & RCAR_SSCG_MASK; 971*91f16700Schasinglulu str = sscg == RCAR_SSCG_ENABLE ? sscg_on : sscg_off; 972*91f16700Schasinglulu NOTICE("BL2: %s\n", str); 973*91f16700Schasinglulu } 974*91f16700Schasinglulu 975*91f16700Schasinglulu rcar_get_board_type(&type, &rev); 976*91f16700Schasinglulu 977*91f16700Schasinglulu switch (type) { 978*91f16700Schasinglulu case BOARD_SALVATOR_X: 979*91f16700Schasinglulu case BOARD_KRIEK: 980*91f16700Schasinglulu case BOARD_STARTER_KIT: 981*91f16700Schasinglulu case BOARD_SALVATOR_XS: 982*91f16700Schasinglulu case BOARD_EBISU: 983*91f16700Schasinglulu case BOARD_STARTER_KIT_PRE: 984*91f16700Schasinglulu case BOARD_EBISU_4D: 985*91f16700Schasinglulu case BOARD_DRAAK: 986*91f16700Schasinglulu case BOARD_EAGLE: 987*91f16700Schasinglulu break; 988*91f16700Schasinglulu default: 989*91f16700Schasinglulu type = BOARD_UNKNOWN; 990*91f16700Schasinglulu break; 991*91f16700Schasinglulu } 992*91f16700Schasinglulu 993*91f16700Schasinglulu if (type == BOARD_UNKNOWN || rev == BOARD_REV_UNKNOWN) 994*91f16700Schasinglulu NOTICE("BL2: Board is %s Rev.---\n", GET_BOARD_NAME(type)); 995*91f16700Schasinglulu else { 996*91f16700Schasinglulu NOTICE("BL2: Board is %s Rev.%d.%d\n", 997*91f16700Schasinglulu GET_BOARD_NAME(type), 998*91f16700Schasinglulu GET_BOARD_MAJOR(rev), GET_BOARD_MINOR(rev)); 999*91f16700Schasinglulu } 1000*91f16700Schasinglulu 1001*91f16700Schasinglulu #if RCAR_LSI != RCAR_AUTO 1002*91f16700Schasinglulu if (product != TARGET_PRODUCT) { 1003*91f16700Schasinglulu ERROR("BL2: IPL was been built for the %s.\n", TARGET_NAME); 1004*91f16700Schasinglulu ERROR("BL2: Please write the correct IPL to flash memory.\n"); 1005*91f16700Schasinglulu panic(); 1006*91f16700Schasinglulu } 1007*91f16700Schasinglulu #endif 1008*91f16700Schasinglulu rcar_avs_init(); 1009*91f16700Schasinglulu rcar_avs_setting(); 1010*91f16700Schasinglulu 1011*91f16700Schasinglulu switch (boot_dev) { 1012*91f16700Schasinglulu case MODEMR_BOOT_DEV_HYPERFLASH160: 1013*91f16700Schasinglulu str = boot_hyper160; 1014*91f16700Schasinglulu break; 1015*91f16700Schasinglulu case MODEMR_BOOT_DEV_HYPERFLASH80: 1016*91f16700Schasinglulu str = boot_hyper80; 1017*91f16700Schasinglulu break; 1018*91f16700Schasinglulu case MODEMR_BOOT_DEV_QSPI_FLASH40: 1019*91f16700Schasinglulu str = boot_qspi40; 1020*91f16700Schasinglulu break; 1021*91f16700Schasinglulu case MODEMR_BOOT_DEV_QSPI_FLASH80: 1022*91f16700Schasinglulu str = boot_qspi80; 1023*91f16700Schasinglulu break; 1024*91f16700Schasinglulu case MODEMR_BOOT_DEV_EMMC_25X1: 1025*91f16700Schasinglulu #if RCAR_LSI == RCAR_D3 1026*91f16700Schasinglulu ERROR("BL2: Failed to Initialize. eMMC is not supported.\n"); 1027*91f16700Schasinglulu panic(); 1028*91f16700Schasinglulu #endif 1029*91f16700Schasinglulu str = boot_emmc25x1; 1030*91f16700Schasinglulu break; 1031*91f16700Schasinglulu case MODEMR_BOOT_DEV_EMMC_50X8: 1032*91f16700Schasinglulu str = boot_emmc50x8; 1033*91f16700Schasinglulu break; 1034*91f16700Schasinglulu default: 1035*91f16700Schasinglulu str = unknown; 1036*91f16700Schasinglulu break; 1037*91f16700Schasinglulu } 1038*91f16700Schasinglulu NOTICE("BL2: Boot device is %s\n", str); 1039*91f16700Schasinglulu 1040*91f16700Schasinglulu rcar_avs_setting(); 1041*91f16700Schasinglulu reg = rcar_rom_get_lcs(&lcs); 1042*91f16700Schasinglulu if (reg) { 1043*91f16700Schasinglulu str = unknown; 1044*91f16700Schasinglulu goto lcm_state; 1045*91f16700Schasinglulu } 1046*91f16700Schasinglulu 1047*91f16700Schasinglulu switch (lcs) { 1048*91f16700Schasinglulu case LCS_CM: 1049*91f16700Schasinglulu str = lcs_cm; 1050*91f16700Schasinglulu break; 1051*91f16700Schasinglulu case LCS_DM: 1052*91f16700Schasinglulu str = lcs_dm; 1053*91f16700Schasinglulu break; 1054*91f16700Schasinglulu case LCS_SD: 1055*91f16700Schasinglulu str = lcs_sd; 1056*91f16700Schasinglulu break; 1057*91f16700Schasinglulu case LCS_SE: 1058*91f16700Schasinglulu str = lcs_secure; 1059*91f16700Schasinglulu break; 1060*91f16700Schasinglulu case LCS_FA: 1061*91f16700Schasinglulu str = lcs_fa; 1062*91f16700Schasinglulu break; 1063*91f16700Schasinglulu default: 1064*91f16700Schasinglulu str = unknown; 1065*91f16700Schasinglulu break; 1066*91f16700Schasinglulu } 1067*91f16700Schasinglulu 1068*91f16700Schasinglulu lcm_state: 1069*91f16700Schasinglulu NOTICE("BL2: LCM state is %s\n", str); 1070*91f16700Schasinglulu 1071*91f16700Schasinglulu rcar_avs_end(); 1072*91f16700Schasinglulu is_ddr_backup_mode(); 1073*91f16700Schasinglulu 1074*91f16700Schasinglulu bl2_tzram_layout.total_base = BL31_BASE; 1075*91f16700Schasinglulu bl2_tzram_layout.total_size = BL31_LIMIT - BL31_BASE; 1076*91f16700Schasinglulu 1077*91f16700Schasinglulu if (boot_cpu == MODEMR_BOOT_CPU_CA57 || 1078*91f16700Schasinglulu boot_cpu == MODEMR_BOOT_CPU_CA53) { 1079*91f16700Schasinglulu ret = rcar_dram_init(); 1080*91f16700Schasinglulu if (ret) { 1081*91f16700Schasinglulu NOTICE("BL2: Failed to DRAM initialize (%d).\n", ret); 1082*91f16700Schasinglulu panic(); 1083*91f16700Schasinglulu } 1084*91f16700Schasinglulu rcar_qos_init(); 1085*91f16700Schasinglulu } 1086*91f16700Schasinglulu 1087*91f16700Schasinglulu /* Set up FDT */ 1088*91f16700Schasinglulu ret = fdt_create_empty_tree(fdt, sizeof(fdt_blob)); 1089*91f16700Schasinglulu if (ret) { 1090*91f16700Schasinglulu NOTICE("BL2: Cannot allocate FDT for U-Boot (ret=%i)\n", ret); 1091*91f16700Schasinglulu panic(); 1092*91f16700Schasinglulu } 1093*91f16700Schasinglulu 1094*91f16700Schasinglulu /* Add platform compatible string */ 1095*91f16700Schasinglulu bl2_populate_compatible_string(fdt); 1096*91f16700Schasinglulu 1097*91f16700Schasinglulu /* Enable RPC if unlocked */ 1098*91f16700Schasinglulu bl2_add_rpc_node(); 1099*91f16700Schasinglulu 1100*91f16700Schasinglulu /* Print DRAM layout */ 1101*91f16700Schasinglulu bl2_advertise_dram_size(product); 1102*91f16700Schasinglulu 1103*91f16700Schasinglulu if (boot_dev == MODEMR_BOOT_DEV_EMMC_25X1 || 1104*91f16700Schasinglulu boot_dev == MODEMR_BOOT_DEV_EMMC_50X8) { 1105*91f16700Schasinglulu if (rcar_emmc_init() != EMMC_SUCCESS) { 1106*91f16700Schasinglulu NOTICE("BL2: Failed to eMMC driver initialize.\n"); 1107*91f16700Schasinglulu panic(); 1108*91f16700Schasinglulu } 1109*91f16700Schasinglulu rcar_emmc_memcard_power(EMMC_POWER_ON); 1110*91f16700Schasinglulu if (rcar_emmc_mount() != EMMC_SUCCESS) { 1111*91f16700Schasinglulu NOTICE("BL2: Failed to eMMC mount operation.\n"); 1112*91f16700Schasinglulu panic(); 1113*91f16700Schasinglulu } 1114*91f16700Schasinglulu } else { 1115*91f16700Schasinglulu rcar_rpc_init(); 1116*91f16700Schasinglulu rcar_dma_init(); 1117*91f16700Schasinglulu } 1118*91f16700Schasinglulu 1119*91f16700Schasinglulu reg = mmio_read_32(RST_WDTRSTCR); 1120*91f16700Schasinglulu reg &= ~WDTRSTCR_RWDT_RSTMSK; 1121*91f16700Schasinglulu reg |= WDTRSTCR_PASSWORD; 1122*91f16700Schasinglulu mmio_write_32(RST_WDTRSTCR, reg); 1123*91f16700Schasinglulu 1124*91f16700Schasinglulu mmio_write_32(CPG_CPGWPR, CPGWPR_PASSWORD); 1125*91f16700Schasinglulu mmio_write_32(CPG_CPGWPCR, CPGWPCR_PASSWORD); 1126*91f16700Schasinglulu 1127*91f16700Schasinglulu reg = mmio_read_32(RCAR_PRR); 1128*91f16700Schasinglulu if ((reg & RCAR_CPU_MASK_CA57) == RCAR_CPU_HAVE_CA57) 1129*91f16700Schasinglulu mmio_write_32(CPG_CA57DBGRCR, 1130*91f16700Schasinglulu DBGCPUPREN | mmio_read_32(CPG_CA57DBGRCR)); 1131*91f16700Schasinglulu 1132*91f16700Schasinglulu if ((reg & RCAR_CPU_MASK_CA53) == RCAR_CPU_HAVE_CA53) 1133*91f16700Schasinglulu mmio_write_32(CPG_CA53DBGRCR, 1134*91f16700Schasinglulu DBGCPUPREN | mmio_read_32(CPG_CA53DBGRCR)); 1135*91f16700Schasinglulu 1136*91f16700Schasinglulu if (product_cut == PRR_PRODUCT_H3_CUT10) { 1137*91f16700Schasinglulu reg = mmio_read_32(CPG_PLL2CR); 1138*91f16700Schasinglulu reg &= ~((uint32_t) 1 << 5); 1139*91f16700Schasinglulu mmio_write_32(CPG_PLL2CR, reg); 1140*91f16700Schasinglulu 1141*91f16700Schasinglulu reg = mmio_read_32(CPG_PLL4CR); 1142*91f16700Schasinglulu reg &= ~((uint32_t) 1 << 5); 1143*91f16700Schasinglulu mmio_write_32(CPG_PLL4CR, reg); 1144*91f16700Schasinglulu 1145*91f16700Schasinglulu reg = mmio_read_32(CPG_PLL0CR); 1146*91f16700Schasinglulu reg &= ~((uint32_t) 1 << 12); 1147*91f16700Schasinglulu mmio_write_32(CPG_PLL0CR, reg); 1148*91f16700Schasinglulu } 1149*91f16700Schasinglulu 1150*91f16700Schasinglulu bl2_create_fcnl_reserved_memory(); 1151*91f16700Schasinglulu 1152*91f16700Schasinglulu fdt_pack(fdt); 1153*91f16700Schasinglulu NOTICE("BL2: FDT at %p\n", fdt); 1154*91f16700Schasinglulu 1155*91f16700Schasinglulu if (boot_dev == MODEMR_BOOT_DEV_EMMC_25X1 || 1156*91f16700Schasinglulu boot_dev == MODEMR_BOOT_DEV_EMMC_50X8) 1157*91f16700Schasinglulu rcar_io_emmc_setup(); 1158*91f16700Schasinglulu else 1159*91f16700Schasinglulu rcar_io_setup(); 1160*91f16700Schasinglulu } 1161*91f16700Schasinglulu 1162*91f16700Schasinglulu void bl2_el3_plat_arch_setup(void) 1163*91f16700Schasinglulu { 1164*91f16700Schasinglulu #if RCAR_BL2_DCACHE == 1 1165*91f16700Schasinglulu NOTICE("BL2: D-Cache enable\n"); 1166*91f16700Schasinglulu rcar_configure_mmu_el3(BL2_BASE, 1167*91f16700Schasinglulu BL2_END - BL2_BASE, 1168*91f16700Schasinglulu BL2_RO_BASE, BL2_RO_LIMIT 1169*91f16700Schasinglulu #if USE_COHERENT_MEM 1170*91f16700Schasinglulu , BL2_COHERENT_RAM_BASE, BL2_COHERENT_RAM_LIMIT 1171*91f16700Schasinglulu #endif 1172*91f16700Schasinglulu ); 1173*91f16700Schasinglulu #endif 1174*91f16700Schasinglulu } 1175*91f16700Schasinglulu 1176*91f16700Schasinglulu void bl2_platform_setup(void) 1177*91f16700Schasinglulu { 1178*91f16700Schasinglulu 1179*91f16700Schasinglulu } 1180*91f16700Schasinglulu 1181*91f16700Schasinglulu static void bl2_init_generic_timer(void) 1182*91f16700Schasinglulu { 1183*91f16700Schasinglulu /* FIXME: V3M 16.666 MHz ? */ 1184*91f16700Schasinglulu #if RCAR_LSI == RCAR_D3 1185*91f16700Schasinglulu uint32_t reg_cntfid = EXTAL_DRAAK; 1186*91f16700Schasinglulu #elif RCAR_LSI == RCAR_E3 1187*91f16700Schasinglulu uint32_t reg_cntfid = EXTAL_EBISU; 1188*91f16700Schasinglulu #else /* RCAR_LSI == RCAR_E3 */ 1189*91f16700Schasinglulu uint32_t reg; 1190*91f16700Schasinglulu uint32_t reg_cntfid; 1191*91f16700Schasinglulu uint32_t modemr; 1192*91f16700Schasinglulu uint32_t modemr_pll; 1193*91f16700Schasinglulu uint32_t board_type; 1194*91f16700Schasinglulu uint32_t board_rev; 1195*91f16700Schasinglulu uint32_t pll_table[] = { 1196*91f16700Schasinglulu EXTAL_MD14_MD13_TYPE_0, /* MD14/MD13 : 0b00 */ 1197*91f16700Schasinglulu EXTAL_MD14_MD13_TYPE_1, /* MD14/MD13 : 0b01 */ 1198*91f16700Schasinglulu EXTAL_MD14_MD13_TYPE_2, /* MD14/MD13 : 0b10 */ 1199*91f16700Schasinglulu EXTAL_MD14_MD13_TYPE_3 /* MD14/MD13 : 0b11 */ 1200*91f16700Schasinglulu }; 1201*91f16700Schasinglulu 1202*91f16700Schasinglulu modemr = mmio_read_32(RCAR_MODEMR); 1203*91f16700Schasinglulu modemr_pll = (modemr & MODEMR_BOOT_PLL_MASK); 1204*91f16700Schasinglulu 1205*91f16700Schasinglulu /* Set frequency data in CNTFID0 */ 1206*91f16700Schasinglulu reg_cntfid = pll_table[modemr_pll >> MODEMR_BOOT_PLL_SHIFT]; 1207*91f16700Schasinglulu reg = mmio_read_32(RCAR_PRR) & (PRR_PRODUCT_MASK | PRR_CUT_MASK); 1208*91f16700Schasinglulu switch (modemr_pll) { 1209*91f16700Schasinglulu case MD14_MD13_TYPE_0: 1210*91f16700Schasinglulu rcar_get_board_type(&board_type, &board_rev); 1211*91f16700Schasinglulu if (BOARD_SALVATOR_XS == board_type) { 1212*91f16700Schasinglulu reg_cntfid = EXTAL_SALVATOR_XS; 1213*91f16700Schasinglulu } 1214*91f16700Schasinglulu break; 1215*91f16700Schasinglulu case MD14_MD13_TYPE_3: 1216*91f16700Schasinglulu if (PRR_PRODUCT_H3_CUT10 == reg) { 1217*91f16700Schasinglulu reg_cntfid = reg_cntfid >> 1U; 1218*91f16700Schasinglulu } 1219*91f16700Schasinglulu break; 1220*91f16700Schasinglulu default: 1221*91f16700Schasinglulu /* none */ 1222*91f16700Schasinglulu break; 1223*91f16700Schasinglulu } 1224*91f16700Schasinglulu #endif /* RCAR_LSI == RCAR_E3 */ 1225*91f16700Schasinglulu /* Update memory mapped and register based frequency */ 1226*91f16700Schasinglulu write_cntfrq_el0((u_register_t )reg_cntfid); 1227*91f16700Schasinglulu mmio_write_32(ARM_SYS_CNTCTL_BASE + (uintptr_t)CNTFID_OFF, reg_cntfid); 1228*91f16700Schasinglulu /* Enable counter */ 1229*91f16700Schasinglulu mmio_setbits_32(RCAR_CNTC_BASE + (uintptr_t)CNTCR_OFF, 1230*91f16700Schasinglulu (uint32_t)CNTCR_EN); 1231*91f16700Schasinglulu } 1232