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