17e532c4bSJorge Ramirez-Ortiz /* 27e532c4bSJorge Ramirez-Ortiz * Copyright (c) 2018, Renesas Electronics Corporation. All rights reserved. 37e532c4bSJorge Ramirez-Ortiz * 47e532c4bSJorge Ramirez-Ortiz * SPDX-License-Identifier: BSD-3-Clause 57e532c4bSJorge Ramirez-Ortiz */ 67e532c4bSJorge Ramirez-Ortiz 77e532c4bSJorge Ramirez-Ortiz #include <desc_image_load.h> 87e532c4bSJorge Ramirez-Ortiz #include <arch_helpers.h> 97e532c4bSJorge Ramirez-Ortiz #include <bl_common.h> 107e532c4bSJorge Ramirez-Ortiz #include <bl1.h> 117e532c4bSJorge Ramirez-Ortiz #include <console.h> 127e532c4bSJorge Ramirez-Ortiz #include <debug.h> 131d85c4bdSMarek Vasut #include <libfdt.h> 147e532c4bSJorge Ramirez-Ortiz #include <mmio.h> 157e532c4bSJorge Ramirez-Ortiz #include <platform.h> 167e532c4bSJorge Ramirez-Ortiz #include <platform_def.h> 177e532c4bSJorge Ramirez-Ortiz #include <string.h> 181d85c4bdSMarek Vasut #include <xlat_tables_defs.h> 197e532c4bSJorge Ramirez-Ortiz 207e532c4bSJorge Ramirez-Ortiz #include "avs_driver.h" 217e532c4bSJorge Ramirez-Ortiz #include "boot_init_dram.h" 227e532c4bSJorge Ramirez-Ortiz #include "cpg_registers.h" 237e532c4bSJorge Ramirez-Ortiz #include "board.h" 247e532c4bSJorge Ramirez-Ortiz #include "emmc_def.h" 257e532c4bSJorge Ramirez-Ortiz #include "emmc_hal.h" 267e532c4bSJorge Ramirez-Ortiz #include "emmc_std.h" 277e532c4bSJorge Ramirez-Ortiz 287e532c4bSJorge Ramirez-Ortiz #if PMIC_ROHM_BD9571 && RCAR_SYSTEM_RESET_KEEPON_DDR 297e532c4bSJorge Ramirez-Ortiz #include "iic_dvfs.h" 307e532c4bSJorge Ramirez-Ortiz #endif 317e532c4bSJorge Ramirez-Ortiz 327e532c4bSJorge Ramirez-Ortiz #include "io_common.h" 337e532c4bSJorge Ramirez-Ortiz #include "qos_init.h" 347e532c4bSJorge Ramirez-Ortiz #include "rcar_def.h" 357e532c4bSJorge Ramirez-Ortiz #include "rcar_private.h" 367e532c4bSJorge Ramirez-Ortiz #include "rcar_version.h" 377e532c4bSJorge Ramirez-Ortiz #include "rom_api.h" 387e532c4bSJorge Ramirez-Ortiz 397e532c4bSJorge Ramirez-Ortiz IMPORT_SYM(unsigned long, __RO_START__, BL2_RO_BASE) 407e532c4bSJorge Ramirez-Ortiz IMPORT_SYM(unsigned long, __RO_END__, BL2_RO_LIMIT) 417e532c4bSJorge Ramirez-Ortiz 427e532c4bSJorge Ramirez-Ortiz #if USE_COHERENT_MEM 437e532c4bSJorge Ramirez-Ortiz IMPORT_SYM(unsigned long, __COHERENT_RAM_START__, BL2_COHERENT_RAM_BASE) 447e532c4bSJorge Ramirez-Ortiz IMPORT_SYM(unsigned long, __COHERENT_RAM_END__, BL2_COHERENT_RAM_LIMIT) 457e532c4bSJorge Ramirez-Ortiz #endif 467e532c4bSJorge Ramirez-Ortiz 477e532c4bSJorge Ramirez-Ortiz extern void plat_rcar_gic_driver_init(void); 487e532c4bSJorge Ramirez-Ortiz extern void plat_rcar_gic_init(void); 497e532c4bSJorge Ramirez-Ortiz extern void bl2_enter_bl31(const struct entry_point_info *bl_ep_info); 507e532c4bSJorge Ramirez-Ortiz extern void bl2_system_cpg_init(void); 517e532c4bSJorge Ramirez-Ortiz extern void bl2_secure_setting(void); 527e532c4bSJorge Ramirez-Ortiz extern void bl2_cpg_init(void); 537e532c4bSJorge Ramirez-Ortiz extern void rcar_io_emmc_setup(void); 547e532c4bSJorge Ramirez-Ortiz extern void rcar_io_setup(void); 557e532c4bSJorge Ramirez-Ortiz extern void rcar_swdt_release(void); 567e532c4bSJorge Ramirez-Ortiz extern void rcar_swdt_init(void); 577e532c4bSJorge Ramirez-Ortiz extern void rcar_rpc_init(void); 587e532c4bSJorge Ramirez-Ortiz extern void rcar_pfc_init(void); 597e532c4bSJorge Ramirez-Ortiz extern void rcar_dma_init(void); 607e532c4bSJorge Ramirez-Ortiz 617e532c4bSJorge Ramirez-Ortiz /* R-Car Gen3 product check */ 627e532c4bSJorge Ramirez-Ortiz #if (RCAR_LSI == RCAR_H3) || (RCAR_LSI == RCAR_H3N) 637e532c4bSJorge Ramirez-Ortiz #define TARGET_PRODUCT RCAR_PRODUCT_H3 647e532c4bSJorge Ramirez-Ortiz #define TARGET_NAME "R-Car H3" 657e532c4bSJorge Ramirez-Ortiz #elif RCAR_LSI == RCAR_M3 667e532c4bSJorge Ramirez-Ortiz #define TARGET_PRODUCT RCAR_PRODUCT_M3 677e532c4bSJorge Ramirez-Ortiz #define TARGET_NAME "R-Car M3" 687e532c4bSJorge Ramirez-Ortiz #elif RCAR_LSI == RCAR_M3N 697e532c4bSJorge Ramirez-Ortiz #define TARGET_PRODUCT RCAR_PRODUCT_M3N 707e532c4bSJorge Ramirez-Ortiz #define TARGET_NAME "R-Car M3N" 717e532c4bSJorge Ramirez-Ortiz #elif RCAR_LSI == RCAR_E3 727e532c4bSJorge Ramirez-Ortiz #define TARGET_PRODUCT RCAR_PRODUCT_E3 737e532c4bSJorge Ramirez-Ortiz #define TARGET_NAME "R-Car E3" 747e532c4bSJorge Ramirez-Ortiz #endif 757e532c4bSJorge Ramirez-Ortiz 767e532c4bSJorge Ramirez-Ortiz #if (RCAR_LSI == RCAR_E3) 777e532c4bSJorge Ramirez-Ortiz #define GPIO_INDT (GPIO_INDT6) 787e532c4bSJorge Ramirez-Ortiz #define GPIO_BKUP_TRG_SHIFT ((uint32_t)1U<<13U) 797e532c4bSJorge Ramirez-Ortiz #else 807e532c4bSJorge Ramirez-Ortiz #define GPIO_INDT (GPIO_INDT1) 817e532c4bSJorge Ramirez-Ortiz #define GPIO_BKUP_TRG_SHIFT ((uint32_t)1U<<8U) 827e532c4bSJorge Ramirez-Ortiz #endif 837e532c4bSJorge Ramirez-Ortiz 847e532c4bSJorge Ramirez-Ortiz CASSERT((PARAMS_BASE + sizeof(bl2_to_bl31_params_mem_t) + 0x100) 857e532c4bSJorge Ramirez-Ortiz < (RCAR_SHARED_MEM_BASE + RCAR_SHARED_MEM_SIZE), 867e532c4bSJorge Ramirez-Ortiz assert_bl31_params_do_not_fit_in_shared_memory); 877e532c4bSJorge Ramirez-Ortiz 887e532c4bSJorge Ramirez-Ortiz static meminfo_t bl2_tzram_layout __aligned(CACHE_WRITEBACK_GRANULE); 897e532c4bSJorge Ramirez-Ortiz 901d85c4bdSMarek Vasut /* FDT with DRAM configuration */ 911d85c4bdSMarek Vasut uint64_t fdt_blob[PAGE_SIZE_4KB / sizeof(uint64_t)]; 921d85c4bdSMarek Vasut static void *fdt = (void *)fdt_blob; 931d85c4bdSMarek Vasut 941d85c4bdSMarek Vasut static void unsigned_num_print(unsigned long long int unum, unsigned int radix, 951d85c4bdSMarek Vasut char *string) 961d85c4bdSMarek Vasut { 971d85c4bdSMarek Vasut /* Just need enough space to store 64 bit decimal integer */ 981d85c4bdSMarek Vasut char num_buf[20]; 991d85c4bdSMarek Vasut int i = 0; 1001d85c4bdSMarek Vasut unsigned int rem; 1011d85c4bdSMarek Vasut 1021d85c4bdSMarek Vasut do { 1031d85c4bdSMarek Vasut rem = unum % radix; 1041d85c4bdSMarek Vasut if (rem < 0xa) 1051d85c4bdSMarek Vasut num_buf[i] = '0' + rem; 1061d85c4bdSMarek Vasut else 1071d85c4bdSMarek Vasut num_buf[i] = 'a' + (rem - 0xa); 1081d85c4bdSMarek Vasut i++; 1091d85c4bdSMarek Vasut unum /= radix; 1101d85c4bdSMarek Vasut } while (unum > 0U); 1111d85c4bdSMarek Vasut 1121d85c4bdSMarek Vasut while (--i >= 0) 1131d85c4bdSMarek Vasut *string++ = num_buf[i]; 1141d85c4bdSMarek Vasut } 1151d85c4bdSMarek Vasut 1167e532c4bSJorge Ramirez-Ortiz #if (RCAR_LOSSY_ENABLE == 1) 1177e532c4bSJorge Ramirez-Ortiz typedef struct bl2_lossy_info { 1187e532c4bSJorge Ramirez-Ortiz uint32_t magic; 1197e532c4bSJorge Ramirez-Ortiz uint32_t a0; 1207e532c4bSJorge Ramirez-Ortiz uint32_t b0; 1217e532c4bSJorge Ramirez-Ortiz } bl2_lossy_info_t; 1227e532c4bSJorge Ramirez-Ortiz 123*a6de3db7SMarek Vasut static void bl2_lossy_gen_fdt(uint32_t no, uint64_t start_addr, 124*a6de3db7SMarek Vasut uint64_t end_addr, uint32_t format, 125*a6de3db7SMarek Vasut uint32_t enable, int fcnlnode) 126*a6de3db7SMarek Vasut { 127*a6de3db7SMarek Vasut const uint64_t fcnlsize = cpu_to_fdt64(end_addr - start_addr); 128*a6de3db7SMarek Vasut char nodename[40] = { 0 }; 129*a6de3db7SMarek Vasut int ret, node; 130*a6de3db7SMarek Vasut 131*a6de3db7SMarek Vasut /* Ignore undefined addresses */ 132*a6de3db7SMarek Vasut if (start_addr == 0 && end_addr == 0) 133*a6de3db7SMarek Vasut return; 134*a6de3db7SMarek Vasut 135*a6de3db7SMarek Vasut snprintf(nodename, sizeof(nodename), "lossy-decompression@"); 136*a6de3db7SMarek Vasut unsigned_num_print(start_addr, 16, nodename + strlen(nodename)); 137*a6de3db7SMarek Vasut 138*a6de3db7SMarek Vasut node = ret = fdt_add_subnode(fdt, fcnlnode, nodename); 139*a6de3db7SMarek Vasut if (ret < 0) { 140*a6de3db7SMarek Vasut NOTICE("BL2: Cannot create FCNL node (ret=%i)\n", ret); 141*a6de3db7SMarek Vasut panic(); 142*a6de3db7SMarek Vasut } 143*a6de3db7SMarek Vasut 144*a6de3db7SMarek Vasut ret = fdt_setprop_string(fdt, node, "compatible", 145*a6de3db7SMarek Vasut "renesas,lossy-decompression"); 146*a6de3db7SMarek Vasut if (ret < 0) { 147*a6de3db7SMarek Vasut NOTICE("BL2: Cannot add FCNL compat string (ret=%i)\n", ret); 148*a6de3db7SMarek Vasut panic(); 149*a6de3db7SMarek Vasut } 150*a6de3db7SMarek Vasut 151*a6de3db7SMarek Vasut ret = fdt_appendprop_string(fdt, node, "compatible", 152*a6de3db7SMarek Vasut "shared-dma-pool"); 153*a6de3db7SMarek Vasut if (ret < 0) { 154*a6de3db7SMarek Vasut NOTICE("BL2: Cannot append FCNL compat string (ret=%i)\n", ret); 155*a6de3db7SMarek Vasut panic(); 156*a6de3db7SMarek Vasut } 157*a6de3db7SMarek Vasut 158*a6de3db7SMarek Vasut ret = fdt_setprop_u64(fdt, node, "reg", start_addr); 159*a6de3db7SMarek Vasut if (ret < 0) { 160*a6de3db7SMarek Vasut NOTICE("BL2: Cannot add FCNL reg prop (ret=%i)\n", ret); 161*a6de3db7SMarek Vasut panic(); 162*a6de3db7SMarek Vasut } 163*a6de3db7SMarek Vasut 164*a6de3db7SMarek Vasut ret = fdt_appendprop(fdt, node, "reg", &fcnlsize, sizeof(fcnlsize)); 165*a6de3db7SMarek Vasut if (ret < 0) { 166*a6de3db7SMarek Vasut NOTICE("BL2: Cannot append FCNL reg size prop (ret=%i)\n", ret); 167*a6de3db7SMarek Vasut panic(); 168*a6de3db7SMarek Vasut } 169*a6de3db7SMarek Vasut 170*a6de3db7SMarek Vasut ret = fdt_setprop(fdt, node, "no-map", NULL, 0); 171*a6de3db7SMarek Vasut if (ret < 0) { 172*a6de3db7SMarek Vasut NOTICE("BL2: Cannot add FCNL no-map prop (ret=%i)\n", ret); 173*a6de3db7SMarek Vasut panic(); 174*a6de3db7SMarek Vasut } 175*a6de3db7SMarek Vasut 176*a6de3db7SMarek Vasut ret = fdt_setprop_u32(fdt, node, "renesas,formats", format); 177*a6de3db7SMarek Vasut if (ret < 0) { 178*a6de3db7SMarek Vasut NOTICE("BL2: Cannot add FCNL formats prop (ret=%i)\n", ret); 179*a6de3db7SMarek Vasut panic(); 180*a6de3db7SMarek Vasut } 181*a6de3db7SMarek Vasut } 182*a6de3db7SMarek Vasut 1837e532c4bSJorge Ramirez-Ortiz static void bl2_lossy_setting(uint32_t no, uint64_t start_addr, 1847e532c4bSJorge Ramirez-Ortiz uint64_t end_addr, uint32_t format, 185*a6de3db7SMarek Vasut uint32_t enable, int fcnlnode) 1867e532c4bSJorge Ramirez-Ortiz { 1877e532c4bSJorge Ramirez-Ortiz bl2_lossy_info_t info; 1887e532c4bSJorge Ramirez-Ortiz uint32_t reg; 1897e532c4bSJorge Ramirez-Ortiz 190*a6de3db7SMarek Vasut bl2_lossy_gen_fdt(no, start_addr, end_addr, format, enable, fcnlnode); 191*a6de3db7SMarek Vasut 1927e532c4bSJorge Ramirez-Ortiz reg = format | (start_addr >> 20); 1937e532c4bSJorge Ramirez-Ortiz mmio_write_32(AXI_DCMPAREACRA0 + 0x8 * no, reg); 1947e532c4bSJorge Ramirez-Ortiz mmio_write_32(AXI_DCMPAREACRB0 + 0x8 * no, end_addr >> 20); 1957e532c4bSJorge Ramirez-Ortiz mmio_write_32(AXI_DCMPAREACRA0 + 0x8 * no, reg | enable); 1967e532c4bSJorge Ramirez-Ortiz 1977e532c4bSJorge Ramirez-Ortiz info.magic = 0x12345678U; 1987e532c4bSJorge Ramirez-Ortiz info.a0 = mmio_read_32(AXI_DCMPAREACRA0 + 0x8 * no); 1997e532c4bSJorge Ramirez-Ortiz info.b0 = mmio_read_32(AXI_DCMPAREACRB0 + 0x8 * no); 2007e532c4bSJorge Ramirez-Ortiz 2017e532c4bSJorge Ramirez-Ortiz mmio_write_32(LOSSY_PARAMS_BASE + sizeof(info) * no, info.magic); 2027e532c4bSJorge Ramirez-Ortiz mmio_write_32(LOSSY_PARAMS_BASE + sizeof(info) * no + 0x4, info.a0); 2037e532c4bSJorge Ramirez-Ortiz mmio_write_32(LOSSY_PARAMS_BASE + sizeof(info) * no + 0x8, info.b0); 2047e532c4bSJorge Ramirez-Ortiz 2057e532c4bSJorge Ramirez-Ortiz NOTICE(" Entry %d: DCMPAREACRAx:0x%x DCMPAREACRBx:0x%x\n", no, 2067e532c4bSJorge Ramirez-Ortiz mmio_read_32(AXI_DCMPAREACRA0 + 0x8 * no), 2077e532c4bSJorge Ramirez-Ortiz mmio_read_32(AXI_DCMPAREACRB0 + 0x8 * no)); 2087e532c4bSJorge Ramirez-Ortiz } 2097e532c4bSJorge Ramirez-Ortiz #endif 2107e532c4bSJorge Ramirez-Ortiz 2117e532c4bSJorge Ramirez-Ortiz void bl2_plat_flush_bl31_params(void) 2127e532c4bSJorge Ramirez-Ortiz { 2137e532c4bSJorge Ramirez-Ortiz uint32_t product_cut, product, cut; 2147e532c4bSJorge Ramirez-Ortiz uint32_t boot_dev, boot_cpu; 2157e532c4bSJorge Ramirez-Ortiz uint32_t lcs, reg, val; 2167e532c4bSJorge Ramirez-Ortiz 2177e532c4bSJorge Ramirez-Ortiz reg = mmio_read_32(RCAR_MODEMR); 2187e532c4bSJorge Ramirez-Ortiz boot_dev = reg & MODEMR_BOOT_DEV_MASK; 2197e532c4bSJorge Ramirez-Ortiz 2207e532c4bSJorge Ramirez-Ortiz if (boot_dev == MODEMR_BOOT_DEV_EMMC_25X1 || 2217e532c4bSJorge Ramirez-Ortiz boot_dev == MODEMR_BOOT_DEV_EMMC_50X8) 2227e532c4bSJorge Ramirez-Ortiz emmc_terminate(); 2237e532c4bSJorge Ramirez-Ortiz 2247e532c4bSJorge Ramirez-Ortiz if ((reg & MODEMR_BOOT_CPU_MASK) != MODEMR_BOOT_CPU_CR7) 2257e532c4bSJorge Ramirez-Ortiz bl2_secure_setting(); 2267e532c4bSJorge Ramirez-Ortiz 2277e532c4bSJorge Ramirez-Ortiz reg = mmio_read_32(RCAR_PRR); 2287e532c4bSJorge Ramirez-Ortiz product_cut = reg & (RCAR_PRODUCT_MASK | RCAR_CUT_MASK); 2297e532c4bSJorge Ramirez-Ortiz product = reg & RCAR_PRODUCT_MASK; 2307e532c4bSJorge Ramirez-Ortiz cut = reg & RCAR_CUT_MASK; 2317e532c4bSJorge Ramirez-Ortiz 2327e532c4bSJorge Ramirez-Ortiz if (product == RCAR_PRODUCT_M3) 2337e532c4bSJorge Ramirez-Ortiz goto tlb; 2347e532c4bSJorge Ramirez-Ortiz 2357e532c4bSJorge Ramirez-Ortiz if (product == RCAR_PRODUCT_H3 && RCAR_CUT_VER20 > cut) 2367e532c4bSJorge Ramirez-Ortiz goto tlb; 2377e532c4bSJorge Ramirez-Ortiz 2387e532c4bSJorge Ramirez-Ortiz /* Disable MFIS write protection */ 2397e532c4bSJorge Ramirez-Ortiz mmio_write_32(MFISWPCNTR, MFISWPCNTR_PASSWORD | 1); 2407e532c4bSJorge Ramirez-Ortiz 2417e532c4bSJorge Ramirez-Ortiz tlb: 2427e532c4bSJorge Ramirez-Ortiz reg = mmio_read_32(RCAR_MODEMR); 2437e532c4bSJorge Ramirez-Ortiz boot_cpu = reg & MODEMR_BOOT_CPU_MASK; 2447e532c4bSJorge Ramirez-Ortiz if (boot_cpu != MODEMR_BOOT_CPU_CA57 && 2457e532c4bSJorge Ramirez-Ortiz boot_cpu != MODEMR_BOOT_CPU_CA53) 2467e532c4bSJorge Ramirez-Ortiz goto mmu; 2477e532c4bSJorge Ramirez-Ortiz 2487e532c4bSJorge Ramirez-Ortiz if (product_cut == RCAR_PRODUCT_H3_CUT20) { 2497e532c4bSJorge Ramirez-Ortiz mmio_write_32(IPMMUVI0_IMSCTLR, IMSCTLR_DISCACHE); 2507e532c4bSJorge Ramirez-Ortiz mmio_write_32(IPMMUVI1_IMSCTLR, IMSCTLR_DISCACHE); 2517e532c4bSJorge Ramirez-Ortiz mmio_write_32(IPMMUPV0_IMSCTLR, IMSCTLR_DISCACHE); 2527e532c4bSJorge Ramirez-Ortiz mmio_write_32(IPMMUPV1_IMSCTLR, IMSCTLR_DISCACHE); 2537e532c4bSJorge Ramirez-Ortiz mmio_write_32(IPMMUPV2_IMSCTLR, IMSCTLR_DISCACHE); 2547e532c4bSJorge Ramirez-Ortiz mmio_write_32(IPMMUPV3_IMSCTLR, IMSCTLR_DISCACHE); 2557e532c4bSJorge Ramirez-Ortiz } else if (product_cut == (RCAR_PRODUCT_M3N | RCAR_CUT_VER10) || 2567e532c4bSJorge Ramirez-Ortiz product_cut == (RCAR_PRODUCT_M3N | RCAR_CUT_VER11)) { 2577e532c4bSJorge Ramirez-Ortiz mmio_write_32(IPMMUVI0_IMSCTLR, IMSCTLR_DISCACHE); 2587e532c4bSJorge Ramirez-Ortiz mmio_write_32(IPMMUPV0_IMSCTLR, IMSCTLR_DISCACHE); 2597e532c4bSJorge Ramirez-Ortiz } else if (product_cut == (RCAR_PRODUCT_E3 | RCAR_CUT_VER10)) { 2607e532c4bSJorge Ramirez-Ortiz mmio_write_32(IPMMUVI0_IMSCTLR, IMSCTLR_DISCACHE); 2617e532c4bSJorge Ramirez-Ortiz mmio_write_32(IPMMUPV0_IMSCTLR, IMSCTLR_DISCACHE); 2627e532c4bSJorge Ramirez-Ortiz } 2637e532c4bSJorge Ramirez-Ortiz 2647e532c4bSJorge Ramirez-Ortiz if (product_cut == (RCAR_PRODUCT_H3_CUT20) || 2657e532c4bSJorge Ramirez-Ortiz product_cut == (RCAR_PRODUCT_M3N | RCAR_CUT_VER10) || 2667e532c4bSJorge Ramirez-Ortiz product_cut == (RCAR_PRODUCT_M3N | RCAR_CUT_VER11) || 2677e532c4bSJorge Ramirez-Ortiz product_cut == (RCAR_PRODUCT_E3 | RCAR_CUT_VER10)) { 2687e532c4bSJorge Ramirez-Ortiz mmio_write_32(IPMMUHC_IMSCTLR, IMSCTLR_DISCACHE); 2697e532c4bSJorge Ramirez-Ortiz mmio_write_32(IPMMURT_IMSCTLR, IMSCTLR_DISCACHE); 2707e532c4bSJorge Ramirez-Ortiz mmio_write_32(IPMMUMP_IMSCTLR, IMSCTLR_DISCACHE); 2717e532c4bSJorge Ramirez-Ortiz 2727e532c4bSJorge Ramirez-Ortiz mmio_write_32(IPMMUDS0_IMSCTLR, IMSCTLR_DISCACHE); 2737e532c4bSJorge Ramirez-Ortiz mmio_write_32(IPMMUDS1_IMSCTLR, IMSCTLR_DISCACHE); 2747e532c4bSJorge Ramirez-Ortiz } 2757e532c4bSJorge Ramirez-Ortiz 2767e532c4bSJorge Ramirez-Ortiz mmu: 2777e532c4bSJorge Ramirez-Ortiz mmio_write_32(IPMMUMM_IMSCTLR, IPMMUMM_IMSCTLR_ENABLE); 2787e532c4bSJorge Ramirez-Ortiz mmio_write_32(IPMMUMM_IMAUXCTLR, IPMMUMM_IMAUXCTLR_NMERGE40_BIT); 2797e532c4bSJorge Ramirez-Ortiz 2807e532c4bSJorge Ramirez-Ortiz val = rcar_rom_get_lcs(&lcs); 2817e532c4bSJorge Ramirez-Ortiz if (val) { 2827e532c4bSJorge Ramirez-Ortiz ERROR("BL2: Failed to get the LCS. (%d)\n", val); 2837e532c4bSJorge Ramirez-Ortiz panic(); 2847e532c4bSJorge Ramirez-Ortiz } 2857e532c4bSJorge Ramirez-Ortiz 2867e532c4bSJorge Ramirez-Ortiz if (lcs == LCS_SE) 2877e532c4bSJorge Ramirez-Ortiz mmio_clrbits_32(P_ARMREG_SEC_CTRL, P_ARMREG_SEC_CTRL_PROT); 2887e532c4bSJorge Ramirez-Ortiz 2897e532c4bSJorge Ramirez-Ortiz rcar_swdt_release(); 2907e532c4bSJorge Ramirez-Ortiz bl2_system_cpg_init(); 2917e532c4bSJorge Ramirez-Ortiz 2927e532c4bSJorge Ramirez-Ortiz #if RCAR_BL2_DCACHE == 1 2937e532c4bSJorge Ramirez-Ortiz /* Disable data cache (clean and invalidate) */ 2947e532c4bSJorge Ramirez-Ortiz disable_mmu_el3(); 2957e532c4bSJorge Ramirez-Ortiz #endif 2967e532c4bSJorge Ramirez-Ortiz } 2977e532c4bSJorge Ramirez-Ortiz 2987e532c4bSJorge Ramirez-Ortiz static uint32_t is_ddr_backup_mode(void) 2997e532c4bSJorge Ramirez-Ortiz { 3007e532c4bSJorge Ramirez-Ortiz #if RCAR_SYSTEM_SUSPEND 3017e532c4bSJorge Ramirez-Ortiz static uint32_t reason = RCAR_COLD_BOOT; 3027e532c4bSJorge Ramirez-Ortiz static uint32_t once; 3037e532c4bSJorge Ramirez-Ortiz 3047e532c4bSJorge Ramirez-Ortiz #if PMIC_ROHM_BD9571 && RCAR_SYSTEM_RESET_KEEPON_DDR 3057e532c4bSJorge Ramirez-Ortiz uint8_t data; 3067e532c4bSJorge Ramirez-Ortiz #endif 3077e532c4bSJorge Ramirez-Ortiz if (once) 3087e532c4bSJorge Ramirez-Ortiz return reason; 3097e532c4bSJorge Ramirez-Ortiz 3107e532c4bSJorge Ramirez-Ortiz once = 1; 3117e532c4bSJorge Ramirez-Ortiz if ((mmio_read_32(GPIO_INDT) & GPIO_BKUP_TRG_SHIFT) == 0) 3127e532c4bSJorge Ramirez-Ortiz return reason; 3137e532c4bSJorge Ramirez-Ortiz 3147e532c4bSJorge Ramirez-Ortiz #if PMIC_ROHM_BD9571 && RCAR_SYSTEM_RESET_KEEPON_DDR 3157e532c4bSJorge Ramirez-Ortiz if (rcar_iic_dvfs_receive(PMIC, REG_KEEP10, &data)) { 3167e532c4bSJorge Ramirez-Ortiz ERROR("BL2: REG Keep10 READ ERROR.\n"); 3177e532c4bSJorge Ramirez-Ortiz panic(); 3187e532c4bSJorge Ramirez-Ortiz } 3197e532c4bSJorge Ramirez-Ortiz 3207e532c4bSJorge Ramirez-Ortiz if (KEEP10_MAGIC != data) 3217e532c4bSJorge Ramirez-Ortiz reason = RCAR_WARM_BOOT; 3227e532c4bSJorge Ramirez-Ortiz #else 3237e532c4bSJorge Ramirez-Ortiz reason = RCAR_WARM_BOOT; 3247e532c4bSJorge Ramirez-Ortiz #endif 3257e532c4bSJorge Ramirez-Ortiz return reason; 3267e532c4bSJorge Ramirez-Ortiz #else 3277e532c4bSJorge Ramirez-Ortiz return RCAR_COLD_BOOT; 3287e532c4bSJorge Ramirez-Ortiz #endif 3297e532c4bSJorge Ramirez-Ortiz } 3307e532c4bSJorge Ramirez-Ortiz 3317e532c4bSJorge Ramirez-Ortiz int bl2_plat_handle_pre_image_load(unsigned int image_id) 3327e532c4bSJorge Ramirez-Ortiz { 3337e532c4bSJorge Ramirez-Ortiz u_register_t *boot_kind = (void *) BOOT_KIND_BASE; 3347e532c4bSJorge Ramirez-Ortiz bl_mem_params_node_t *bl_mem_params; 3357e532c4bSJorge Ramirez-Ortiz 3367e532c4bSJorge Ramirez-Ortiz if (image_id != BL31_IMAGE_ID) 3377e532c4bSJorge Ramirez-Ortiz return 0; 3387e532c4bSJorge Ramirez-Ortiz 3397e532c4bSJorge Ramirez-Ortiz bl_mem_params = get_bl_mem_params_node(image_id); 3407e532c4bSJorge Ramirez-Ortiz 3417e532c4bSJorge Ramirez-Ortiz if (is_ddr_backup_mode() == RCAR_COLD_BOOT) 3427e532c4bSJorge Ramirez-Ortiz goto cold_boot; 3437e532c4bSJorge Ramirez-Ortiz 3447e532c4bSJorge Ramirez-Ortiz *boot_kind = RCAR_WARM_BOOT; 3457e532c4bSJorge Ramirez-Ortiz flush_dcache_range(BOOT_KIND_BASE, sizeof(*boot_kind)); 3467e532c4bSJorge Ramirez-Ortiz 3477e532c4bSJorge Ramirez-Ortiz console_flush(); 3487e532c4bSJorge Ramirez-Ortiz bl2_plat_flush_bl31_params(); 3497e532c4bSJorge Ramirez-Ortiz 3507e532c4bSJorge Ramirez-Ortiz /* will not return */ 3517e532c4bSJorge Ramirez-Ortiz bl2_enter_bl31(&bl_mem_params->ep_info); 3527e532c4bSJorge Ramirez-Ortiz 3537e532c4bSJorge Ramirez-Ortiz cold_boot: 3547e532c4bSJorge Ramirez-Ortiz *boot_kind = RCAR_COLD_BOOT; 3557e532c4bSJorge Ramirez-Ortiz flush_dcache_range(BOOT_KIND_BASE, sizeof(*boot_kind)); 3567e532c4bSJorge Ramirez-Ortiz 3577e532c4bSJorge Ramirez-Ortiz return 0; 3587e532c4bSJorge Ramirez-Ortiz } 3597e532c4bSJorge Ramirez-Ortiz 3607e532c4bSJorge Ramirez-Ortiz int bl2_plat_handle_post_image_load(unsigned int image_id) 3617e532c4bSJorge Ramirez-Ortiz { 3627e532c4bSJorge Ramirez-Ortiz static bl2_to_bl31_params_mem_t *params; 3637e532c4bSJorge Ramirez-Ortiz bl_mem_params_node_t *bl_mem_params; 3647e532c4bSJorge Ramirez-Ortiz 3657e532c4bSJorge Ramirez-Ortiz if (!params) { 3667e532c4bSJorge Ramirez-Ortiz params = (bl2_to_bl31_params_mem_t *) PARAMS_BASE; 3677e532c4bSJorge Ramirez-Ortiz memset((void *)PARAMS_BASE, 0, sizeof(*params)); 3687e532c4bSJorge Ramirez-Ortiz } 3697e532c4bSJorge Ramirez-Ortiz 3707e532c4bSJorge Ramirez-Ortiz bl_mem_params = get_bl_mem_params_node(image_id); 3717e532c4bSJorge Ramirez-Ortiz 3727e532c4bSJorge Ramirez-Ortiz switch (image_id) { 3737e532c4bSJorge Ramirez-Ortiz case BL31_IMAGE_ID: 3747e532c4bSJorge Ramirez-Ortiz break; 3757e532c4bSJorge Ramirez-Ortiz case BL32_IMAGE_ID: 3767e532c4bSJorge Ramirez-Ortiz memcpy(¶ms->bl32_ep_info, &bl_mem_params->ep_info, 3777e532c4bSJorge Ramirez-Ortiz sizeof(entry_point_info_t)); 3787e532c4bSJorge Ramirez-Ortiz break; 3797e532c4bSJorge Ramirez-Ortiz case BL33_IMAGE_ID: 3807e532c4bSJorge Ramirez-Ortiz memcpy(¶ms->bl33_ep_info, &bl_mem_params->ep_info, 3817e532c4bSJorge Ramirez-Ortiz sizeof(entry_point_info_t)); 3827e532c4bSJorge Ramirez-Ortiz break; 3837e532c4bSJorge Ramirez-Ortiz } 3847e532c4bSJorge Ramirez-Ortiz 3857e532c4bSJorge Ramirez-Ortiz return 0; 3867e532c4bSJorge Ramirez-Ortiz } 3877e532c4bSJorge Ramirez-Ortiz 3887e532c4bSJorge Ramirez-Ortiz meminfo_t *bl2_plat_sec_mem_layout(void) 3897e532c4bSJorge Ramirez-Ortiz { 3907e532c4bSJorge Ramirez-Ortiz return &bl2_tzram_layout; 3917e532c4bSJorge Ramirez-Ortiz } 3927e532c4bSJorge Ramirez-Ortiz 393ac49c5fbSMarek Vasut static void bl2_populate_compatible_string(void *fdt) 394ac49c5fbSMarek Vasut { 395ac49c5fbSMarek Vasut uint32_t board_type; 396ac49c5fbSMarek Vasut uint32_t board_rev; 397ac49c5fbSMarek Vasut uint32_t reg; 398ac49c5fbSMarek Vasut int ret; 399ac49c5fbSMarek Vasut 400ac49c5fbSMarek Vasut /* Populate compatible string */ 401ac49c5fbSMarek Vasut rcar_get_board_type(&board_type, &board_rev); 402ac49c5fbSMarek Vasut switch (board_type) { 403ac49c5fbSMarek Vasut case BOARD_SALVATOR_X: 404ac49c5fbSMarek Vasut ret = fdt_setprop_string(fdt, 0, "compatible", 405ac49c5fbSMarek Vasut "renesas,salvator-x"); 406ac49c5fbSMarek Vasut break; 407ac49c5fbSMarek Vasut case BOARD_SALVATOR_XS: 408ac49c5fbSMarek Vasut ret = fdt_setprop_string(fdt, 0, "compatible", 409ac49c5fbSMarek Vasut "renesas,salvator-xs"); 410ac49c5fbSMarek Vasut break; 411ac49c5fbSMarek Vasut case BOARD_STARTER_KIT: 412ac49c5fbSMarek Vasut ret = fdt_setprop_string(fdt, 0, "compatible", 413ac49c5fbSMarek Vasut "renesas,m3ulcb"); 414ac49c5fbSMarek Vasut break; 415ac49c5fbSMarek Vasut case BOARD_STARTER_KIT_PRE: 416ac49c5fbSMarek Vasut ret = fdt_setprop_string(fdt, 0, "compatible", 417ac49c5fbSMarek Vasut "renesas,h3ulcb"); 418ac49c5fbSMarek Vasut break; 419ac49c5fbSMarek Vasut case BOARD_EBISU: 420ac49c5fbSMarek Vasut case BOARD_EBISU_4D: 421ac49c5fbSMarek Vasut ret = fdt_setprop_string(fdt, 0, "compatible", 422ac49c5fbSMarek Vasut "renesas,ebisu"); 423ac49c5fbSMarek Vasut break; 424ac49c5fbSMarek Vasut default: 425ac49c5fbSMarek Vasut NOTICE("BL2: Cannot set compatible string, board unsupported\n"); 426ac49c5fbSMarek Vasut panic(); 427ac49c5fbSMarek Vasut } 428ac49c5fbSMarek Vasut 429ac49c5fbSMarek Vasut if (ret < 0) { 430ac49c5fbSMarek Vasut NOTICE("BL2: Cannot set compatible string (ret=%i)\n", ret); 431ac49c5fbSMarek Vasut panic(); 432ac49c5fbSMarek Vasut } 433ac49c5fbSMarek Vasut 434ac49c5fbSMarek Vasut reg = mmio_read_32(RCAR_PRR); 435ac49c5fbSMarek Vasut switch (reg & RCAR_PRODUCT_MASK) { 436ac49c5fbSMarek Vasut case RCAR_PRODUCT_H3: 437ac49c5fbSMarek Vasut ret = fdt_appendprop_string(fdt, 0, "compatible", 438ac49c5fbSMarek Vasut "renesas,r8a7795"); 439ac49c5fbSMarek Vasut break; 440ac49c5fbSMarek Vasut case RCAR_PRODUCT_M3: 441ac49c5fbSMarek Vasut ret = fdt_appendprop_string(fdt, 0, "compatible", 442ac49c5fbSMarek Vasut "renesas,r8a7796"); 443ac49c5fbSMarek Vasut break; 444ac49c5fbSMarek Vasut case RCAR_PRODUCT_M3N: 445ac49c5fbSMarek Vasut ret = fdt_appendprop_string(fdt, 0, "compatible", 446ac49c5fbSMarek Vasut "renesas,r8a77965"); 447ac49c5fbSMarek Vasut break; 448ac49c5fbSMarek Vasut case RCAR_PRODUCT_E3: 449ac49c5fbSMarek Vasut ret = fdt_appendprop_string(fdt, 0, "compatible", 450ac49c5fbSMarek Vasut "renesas,r8a77990"); 451ac49c5fbSMarek Vasut break; 452ac49c5fbSMarek Vasut default: 453ac49c5fbSMarek Vasut NOTICE("BL2: Cannot set compatible string, SoC unsupported\n"); 454ac49c5fbSMarek Vasut panic(); 455ac49c5fbSMarek Vasut } 456ac49c5fbSMarek Vasut 457ac49c5fbSMarek Vasut if (ret < 0) { 458ac49c5fbSMarek Vasut NOTICE("BL2: Cannot set compatible string (ret=%i)\n", ret); 459ac49c5fbSMarek Vasut panic(); 460ac49c5fbSMarek Vasut } 461ac49c5fbSMarek Vasut } 462ac49c5fbSMarek Vasut 46385185151SMarek Vasut static void bl2_advertise_dram_entries(uint64_t dram_config[8]) 46485185151SMarek Vasut { 4651d85c4bdSMarek Vasut char nodename[32] = { 0 }; 46685185151SMarek Vasut uint64_t start, size; 4671d85c4bdSMarek Vasut uint64_t fdtsize; 4681d85c4bdSMarek Vasut int ret, node, chan; 46985185151SMarek Vasut 47085185151SMarek Vasut for (chan = 0; chan < 4; chan++) { 47185185151SMarek Vasut start = dram_config[2 * chan]; 47285185151SMarek Vasut size = dram_config[2 * chan + 1]; 47385185151SMarek Vasut if (!size) 47485185151SMarek Vasut continue; 47585185151SMarek Vasut 47685185151SMarek Vasut NOTICE("BL2: CH%d: %llx - %llx, %lld GiB\n", 47785185151SMarek Vasut chan, start, start + size - 1, size >> 30); 47885185151SMarek Vasut } 4791d85c4bdSMarek Vasut 4801d85c4bdSMarek Vasut /* 4811d85c4bdSMarek Vasut * We add the DT nodes in reverse order here. The fdt_add_subnode() 4821d85c4bdSMarek Vasut * adds the DT node before the first existing DT node, so we have 4831d85c4bdSMarek Vasut * to add them in reverse order to get nodes sorted by address in 4841d85c4bdSMarek Vasut * the resulting DT. 4851d85c4bdSMarek Vasut */ 4861d85c4bdSMarek Vasut for (chan = 3; chan >= 0; chan--) { 4871d85c4bdSMarek Vasut start = dram_config[2 * chan]; 4881d85c4bdSMarek Vasut size = dram_config[2 * chan + 1]; 4891d85c4bdSMarek Vasut if (!size) 4901d85c4bdSMarek Vasut continue; 4911d85c4bdSMarek Vasut 4921d85c4bdSMarek Vasut /* 4931d85c4bdSMarek Vasut * Channel 0 is mapped in 32bit space and the first 4941d85c4bdSMarek Vasut * 128 MiB are reserved 4951d85c4bdSMarek Vasut */ 4961d85c4bdSMarek Vasut if (chan == 0) { 4971d85c4bdSMarek Vasut start = 0x48000000; 4981d85c4bdSMarek Vasut size -= 0x8000000; 4991d85c4bdSMarek Vasut } 5001d85c4bdSMarek Vasut 5011d85c4bdSMarek Vasut fdtsize = cpu_to_fdt64(size); 5021d85c4bdSMarek Vasut 5031d85c4bdSMarek Vasut snprintf(nodename, sizeof(nodename), "memory@"); 5041d85c4bdSMarek Vasut unsigned_num_print(start, 16, nodename + strlen(nodename)); 5051d85c4bdSMarek Vasut node = ret = fdt_add_subnode(fdt, 0, nodename); 5061d85c4bdSMarek Vasut if (ret < 0) 5071d85c4bdSMarek Vasut goto err; 5081d85c4bdSMarek Vasut 5091d85c4bdSMarek Vasut ret = fdt_setprop_string(fdt, node, "device_type", "memory"); 5101d85c4bdSMarek Vasut if (ret < 0) 5111d85c4bdSMarek Vasut goto err; 5121d85c4bdSMarek Vasut 5131d85c4bdSMarek Vasut ret = fdt_setprop_u64(fdt, node, "reg", start); 5141d85c4bdSMarek Vasut if (ret < 0) 5151d85c4bdSMarek Vasut goto err; 5161d85c4bdSMarek Vasut 5171d85c4bdSMarek Vasut ret = fdt_appendprop(fdt, node, "reg", &fdtsize, 5181d85c4bdSMarek Vasut sizeof(fdtsize)); 5191d85c4bdSMarek Vasut if (ret < 0) 5201d85c4bdSMarek Vasut goto err; 5211d85c4bdSMarek Vasut } 5221d85c4bdSMarek Vasut 5231d85c4bdSMarek Vasut return; 5241d85c4bdSMarek Vasut err: 5251d85c4bdSMarek Vasut NOTICE("BL2: Cannot add memory node to FDT (ret=%i)\n", ret); 5261d85c4bdSMarek Vasut panic(); 52785185151SMarek Vasut } 52885185151SMarek Vasut 5297bf24ae3SMarek Vasut static void bl2_advertise_dram_size(uint32_t product) 530358ed930SMarek Vasut { 53185185151SMarek Vasut uint64_t dram_config[8] = { 53285185151SMarek Vasut [0] = 0x400000000ULL, 53385185151SMarek Vasut [2] = 0x500000000ULL, 53485185151SMarek Vasut [4] = 0x600000000ULL, 53585185151SMarek Vasut [6] = 0x700000000ULL, 53685185151SMarek Vasut }; 53785185151SMarek Vasut 538e1eddfeaSMarek Vasut switch (product) { 539e1eddfeaSMarek Vasut case RCAR_PRODUCT_H3: 540358ed930SMarek Vasut #if (RCAR_DRAM_LPDDR4_MEMCONF == 0) 541358ed930SMarek Vasut /* 4GB(1GBx4) */ 54285185151SMarek Vasut dram_config[1] = 0x40000000ULL; 54385185151SMarek Vasut dram_config[3] = 0x40000000ULL; 54485185151SMarek Vasut dram_config[5] = 0x40000000ULL; 54585185151SMarek Vasut dram_config[7] = 0x40000000ULL; 546358ed930SMarek Vasut #elif (RCAR_DRAM_LPDDR4_MEMCONF == 1) && \ 547358ed930SMarek Vasut (RCAR_DRAM_CHANNEL == 5) && \ 548358ed930SMarek Vasut (RCAR_DRAM_SPLIT == 2) 549358ed930SMarek Vasut /* 4GB(2GBx2 2ch split) */ 55085185151SMarek Vasut dram_config[1] = 0x80000000ULL; 55185185151SMarek Vasut dram_config[3] = 0x80000000ULL; 552358ed930SMarek Vasut #elif (RCAR_DRAM_LPDDR4_MEMCONF == 1) && (RCAR_DRAM_CHANNEL == 15) 553358ed930SMarek Vasut /* 8GB(2GBx4: default) */ 55485185151SMarek Vasut dram_config[1] = 0x80000000ULL; 55585185151SMarek Vasut dram_config[3] = 0x80000000ULL; 55685185151SMarek Vasut dram_config[5] = 0x80000000ULL; 55785185151SMarek Vasut dram_config[7] = 0x80000000ULL; 558358ed930SMarek Vasut #endif /* RCAR_DRAM_LPDDR4_MEMCONF == 0 */ 559e1eddfeaSMarek Vasut break; 560358ed930SMarek Vasut 561e1eddfeaSMarek Vasut case RCAR_PRODUCT_M3: 562e1eddfeaSMarek Vasut /* 4GB(2GBx2 2ch split) */ 56385185151SMarek Vasut dram_config[1] = 0x80000000ULL; 56485185151SMarek Vasut dram_config[5] = 0x80000000ULL; 565e1eddfeaSMarek Vasut break; 566e1eddfeaSMarek Vasut 567e1eddfeaSMarek Vasut case RCAR_PRODUCT_M3N: 568e1eddfeaSMarek Vasut /* 2GB(1GBx2) */ 56985185151SMarek Vasut dram_config[1] = 0x80000000ULL; 570e1eddfeaSMarek Vasut break; 571e1eddfeaSMarek Vasut 572e1eddfeaSMarek Vasut case RCAR_PRODUCT_E3: 573358ed930SMarek Vasut #if (RCAR_DRAM_DDR3L_MEMCONF == 0) 574358ed930SMarek Vasut /* 1GB(512MBx2) */ 57585185151SMarek Vasut dram_config[1] = 0x40000000ULL; 576358ed930SMarek Vasut #elif (RCAR_DRAM_DDR3L_MEMCONF == 1) 577358ed930SMarek Vasut /* 2GB(512MBx4) */ 57885185151SMarek Vasut dram_config[1] = 0x80000000ULL; 5793b507aabSMarek Vasut #elif (RCAR_DRAM_DDR3L_MEMCONF == 2) 5803b507aabSMarek Vasut /* 4GB(1GBx4) */ 58185185151SMarek Vasut dram_config[1] = 0x100000000ULL; 582358ed930SMarek Vasut #endif /* RCAR_DRAM_DDR3L_MEMCONF == 0 */ 583e1eddfeaSMarek Vasut break; 584358ed930SMarek Vasut } 58585185151SMarek Vasut 58685185151SMarek Vasut bl2_advertise_dram_entries(dram_config); 587358ed930SMarek Vasut } 588358ed930SMarek Vasut 5897e532c4bSJorge Ramirez-Ortiz void bl2_el3_early_platform_setup(u_register_t arg1, u_register_t arg2, 5907e532c4bSJorge Ramirez-Ortiz u_register_t arg3, u_register_t arg4) 5917e532c4bSJorge Ramirez-Ortiz { 5927e532c4bSJorge Ramirez-Ortiz uint32_t reg, midr, lcs, boot_dev, boot_cpu, sscg, type, rev; 5937bf24ae3SMarek Vasut uint32_t product, product_cut, major, minor; 5947e532c4bSJorge Ramirez-Ortiz int32_t ret; 5957e532c4bSJorge Ramirez-Ortiz const char *str; 5967e532c4bSJorge Ramirez-Ortiz const char *unknown = "unknown"; 5977e532c4bSJorge Ramirez-Ortiz const char *cpu_ca57 = "CA57"; 5987e532c4bSJorge Ramirez-Ortiz const char *cpu_ca53 = "CA53"; 5997e532c4bSJorge Ramirez-Ortiz const char *product_m3n = "M3N"; 6007e532c4bSJorge Ramirez-Ortiz const char *product_h3 = "H3"; 6017e532c4bSJorge Ramirez-Ortiz const char *product_m3 = "M3"; 6027e532c4bSJorge Ramirez-Ortiz const char *product_e3 = "E3"; 6037e532c4bSJorge Ramirez-Ortiz const char *lcs_secure = "SE"; 6047e532c4bSJorge Ramirez-Ortiz const char *lcs_cm = "CM"; 6057e532c4bSJorge Ramirez-Ortiz const char *lcs_dm = "DM"; 6067e532c4bSJorge Ramirez-Ortiz const char *lcs_sd = "SD"; 6077e532c4bSJorge Ramirez-Ortiz const char *lcs_fa = "FA"; 6087e532c4bSJorge Ramirez-Ortiz const char *sscg_off = "PLL1 nonSSCG Clock select"; 6097e532c4bSJorge Ramirez-Ortiz const char *sscg_on = "PLL1 SSCG Clock select"; 6107e532c4bSJorge Ramirez-Ortiz const char *boot_hyper80 = "HyperFlash(80MHz)"; 6117e532c4bSJorge Ramirez-Ortiz const char *boot_qspi40 = "QSPI Flash(40MHz)"; 6127e532c4bSJorge Ramirez-Ortiz const char *boot_qspi80 = "QSPI Flash(80MHz)"; 6137e532c4bSJorge Ramirez-Ortiz const char *boot_emmc25x1 = "eMMC(25MHz x1)"; 6147e532c4bSJorge Ramirez-Ortiz const char *boot_emmc50x8 = "eMMC(50MHz x8)"; 6157e532c4bSJorge Ramirez-Ortiz #if RCAR_LSI == RCAR_E3 6167e532c4bSJorge Ramirez-Ortiz const char *boot_hyper160 = "HyperFlash(150MHz)"; 6177e532c4bSJorge Ramirez-Ortiz #else 6187e532c4bSJorge Ramirez-Ortiz const char *boot_hyper160 = "HyperFlash(160MHz)"; 6197e532c4bSJorge Ramirez-Ortiz #endif 620*a6de3db7SMarek Vasut #if (RCAR_LOSSY_ENABLE == 1) 621*a6de3db7SMarek Vasut int fcnlnode; 622*a6de3db7SMarek Vasut #endif 6237e532c4bSJorge Ramirez-Ortiz 6247e532c4bSJorge Ramirez-Ortiz reg = mmio_read_32(RCAR_MODEMR); 6257e532c4bSJorge Ramirez-Ortiz boot_dev = reg & MODEMR_BOOT_DEV_MASK; 6267e532c4bSJorge Ramirez-Ortiz boot_cpu = reg & MODEMR_BOOT_CPU_MASK; 6277e532c4bSJorge Ramirez-Ortiz 6287e532c4bSJorge Ramirez-Ortiz bl2_cpg_init(); 6297e532c4bSJorge Ramirez-Ortiz 6307e532c4bSJorge Ramirez-Ortiz if (boot_cpu == MODEMR_BOOT_CPU_CA57 || 6317e532c4bSJorge Ramirez-Ortiz boot_cpu == MODEMR_BOOT_CPU_CA53) { 6327e532c4bSJorge Ramirez-Ortiz rcar_pfc_init(); 6337e532c4bSJorge Ramirez-Ortiz /* console configuration (platform specific) done in driver */ 6347e532c4bSJorge Ramirez-Ortiz console_init(0, 0, 0); 6357e532c4bSJorge Ramirez-Ortiz } 6367e532c4bSJorge Ramirez-Ortiz 6377e532c4bSJorge Ramirez-Ortiz plat_rcar_gic_driver_init(); 6387e532c4bSJorge Ramirez-Ortiz plat_rcar_gic_init(); 6397e532c4bSJorge Ramirez-Ortiz rcar_swdt_init(); 6407e532c4bSJorge Ramirez-Ortiz 6417e532c4bSJorge Ramirez-Ortiz /* FIQ interrupts are taken to EL3 */ 6427e532c4bSJorge Ramirez-Ortiz write_scr_el3(read_scr_el3() | SCR_FIQ_BIT); 6437e532c4bSJorge Ramirez-Ortiz 6447e532c4bSJorge Ramirez-Ortiz write_daifclr(DAIF_FIQ_BIT); 6457e532c4bSJorge Ramirez-Ortiz 6467e532c4bSJorge Ramirez-Ortiz reg = read_midr(); 6477e532c4bSJorge Ramirez-Ortiz midr = reg & (MIDR_PN_MASK << MIDR_PN_SHIFT); 6487e532c4bSJorge Ramirez-Ortiz switch (midr) { 6497e532c4bSJorge Ramirez-Ortiz case MIDR_CA57: 6507e532c4bSJorge Ramirez-Ortiz str = cpu_ca57; 6517e532c4bSJorge Ramirez-Ortiz break; 6527e532c4bSJorge Ramirez-Ortiz case MIDR_CA53: 6537e532c4bSJorge Ramirez-Ortiz str = cpu_ca53; 6547e532c4bSJorge Ramirez-Ortiz break; 6557e532c4bSJorge Ramirez-Ortiz default: 6567e532c4bSJorge Ramirez-Ortiz str = unknown; 6577e532c4bSJorge Ramirez-Ortiz break; 6587e532c4bSJorge Ramirez-Ortiz } 6597e532c4bSJorge Ramirez-Ortiz 6607e532c4bSJorge Ramirez-Ortiz NOTICE("BL2: R-Car Gen3 Initial Program Loader(%s) Rev.%s\n", str, 6617e532c4bSJorge Ramirez-Ortiz version_of_renesas); 6627e532c4bSJorge Ramirez-Ortiz 6637e532c4bSJorge Ramirez-Ortiz reg = mmio_read_32(RCAR_PRR); 6647e532c4bSJorge Ramirez-Ortiz product_cut = reg & (RCAR_PRODUCT_MASK | RCAR_CUT_MASK); 6657e532c4bSJorge Ramirez-Ortiz product = reg & RCAR_PRODUCT_MASK; 6667e532c4bSJorge Ramirez-Ortiz 6677e532c4bSJorge Ramirez-Ortiz switch (product) { 6687e532c4bSJorge Ramirez-Ortiz case RCAR_PRODUCT_H3: 6697e532c4bSJorge Ramirez-Ortiz str = product_h3; 6707e532c4bSJorge Ramirez-Ortiz break; 6717e532c4bSJorge Ramirez-Ortiz case RCAR_PRODUCT_M3: 6727e532c4bSJorge Ramirez-Ortiz str = product_m3; 6737e532c4bSJorge Ramirez-Ortiz break; 6747e532c4bSJorge Ramirez-Ortiz case RCAR_PRODUCT_M3N: 6757e532c4bSJorge Ramirez-Ortiz str = product_m3n; 6767e532c4bSJorge Ramirez-Ortiz break; 6777e532c4bSJorge Ramirez-Ortiz case RCAR_PRODUCT_E3: 6787e532c4bSJorge Ramirez-Ortiz str = product_e3; 6797e532c4bSJorge Ramirez-Ortiz break; 6807e532c4bSJorge Ramirez-Ortiz default: 6817e532c4bSJorge Ramirez-Ortiz str = unknown; 6827e532c4bSJorge Ramirez-Ortiz break; 6837e532c4bSJorge Ramirez-Ortiz } 6847e532c4bSJorge Ramirez-Ortiz 6857e532c4bSJorge Ramirez-Ortiz if (RCAR_PRODUCT_M3_CUT11 == product_cut) { 6867e532c4bSJorge Ramirez-Ortiz NOTICE("BL2: PRR is R-Car %s Ver.1.1 / Ver.1.2\n", str); 6877e532c4bSJorge Ramirez-Ortiz } else { 6887e532c4bSJorge Ramirez-Ortiz major = (reg & RCAR_MAJOR_MASK) >> RCAR_MAJOR_SHIFT; 6897e532c4bSJorge Ramirez-Ortiz major = major + RCAR_MAJOR_OFFSET; 6907e532c4bSJorge Ramirez-Ortiz minor = reg & RCAR_MINOR_MASK; 6917e532c4bSJorge Ramirez-Ortiz NOTICE("BL2: PRR is R-Car %s Ver.%d.%d\n", str, major, minor); 6927e532c4bSJorge Ramirez-Ortiz } 6937e532c4bSJorge Ramirez-Ortiz 6947e532c4bSJorge Ramirez-Ortiz if (product == RCAR_PRODUCT_E3) { 6957e532c4bSJorge Ramirez-Ortiz reg = mmio_read_32(RCAR_MODEMR); 6967e532c4bSJorge Ramirez-Ortiz sscg = reg & RCAR_SSCG_MASK; 6977e532c4bSJorge Ramirez-Ortiz str = sscg == RCAR_SSCG_ENABLE ? sscg_on : sscg_off; 6987e532c4bSJorge Ramirez-Ortiz NOTICE("BL2: %s\n", str); 6997e532c4bSJorge Ramirez-Ortiz } 7007e532c4bSJorge Ramirez-Ortiz 7017e532c4bSJorge Ramirez-Ortiz rcar_get_board_type(&type, &rev); 7027e532c4bSJorge Ramirez-Ortiz 7037e532c4bSJorge Ramirez-Ortiz switch (type) { 7047e532c4bSJorge Ramirez-Ortiz case BOARD_SALVATOR_X: 7057e532c4bSJorge Ramirez-Ortiz case BOARD_KRIEK: 7067e532c4bSJorge Ramirez-Ortiz case BOARD_STARTER_KIT: 7077e532c4bSJorge Ramirez-Ortiz case BOARD_SALVATOR_XS: 7087e532c4bSJorge Ramirez-Ortiz case BOARD_EBISU: 7097e532c4bSJorge Ramirez-Ortiz case BOARD_STARTER_KIT_PRE: 7107e532c4bSJorge Ramirez-Ortiz case BOARD_EBISU_4D: 7117e532c4bSJorge Ramirez-Ortiz break; 7127e532c4bSJorge Ramirez-Ortiz default: 7137e532c4bSJorge Ramirez-Ortiz type = BOARD_UNKNOWN; 7147e532c4bSJorge Ramirez-Ortiz break; 7157e532c4bSJorge Ramirez-Ortiz } 7167e532c4bSJorge Ramirez-Ortiz 7177e532c4bSJorge Ramirez-Ortiz if (type == BOARD_UNKNOWN || rev == BOARD_REV_UNKNOWN) 7187e532c4bSJorge Ramirez-Ortiz NOTICE("BL2: Board is %s Rev.---\n", GET_BOARD_NAME(type)); 7197e532c4bSJorge Ramirez-Ortiz else { 7207e532c4bSJorge Ramirez-Ortiz NOTICE("BL2: Board is %s Rev.%d.%d\n", 7217e532c4bSJorge Ramirez-Ortiz GET_BOARD_NAME(type), 7227e532c4bSJorge Ramirez-Ortiz GET_BOARD_MAJOR(rev), GET_BOARD_MINOR(rev)); 7237e532c4bSJorge Ramirez-Ortiz } 7247e532c4bSJorge Ramirez-Ortiz 7257e532c4bSJorge Ramirez-Ortiz #if RCAR_LSI != RCAR_AUTO 7267e532c4bSJorge Ramirez-Ortiz if (product != TARGET_PRODUCT) { 7277e532c4bSJorge Ramirez-Ortiz ERROR("BL2: IPL was been built for the %s.\n", TARGET_NAME); 7287e532c4bSJorge Ramirez-Ortiz ERROR("BL2: Please write the correct IPL to flash memory.\n"); 7297e532c4bSJorge Ramirez-Ortiz panic(); 7307e532c4bSJorge Ramirez-Ortiz } 7317e532c4bSJorge Ramirez-Ortiz #endif 7327e532c4bSJorge Ramirez-Ortiz rcar_avs_init(); 7337e532c4bSJorge Ramirez-Ortiz rcar_avs_setting(); 7347e532c4bSJorge Ramirez-Ortiz 7357e532c4bSJorge Ramirez-Ortiz switch (boot_dev) { 7367e532c4bSJorge Ramirez-Ortiz case MODEMR_BOOT_DEV_HYPERFLASH160: 7377e532c4bSJorge Ramirez-Ortiz str = boot_hyper160; 7387e532c4bSJorge Ramirez-Ortiz break; 7397e532c4bSJorge Ramirez-Ortiz case MODEMR_BOOT_DEV_HYPERFLASH80: 7407e532c4bSJorge Ramirez-Ortiz str = boot_hyper80; 7417e532c4bSJorge Ramirez-Ortiz break; 7427e532c4bSJorge Ramirez-Ortiz case MODEMR_BOOT_DEV_QSPI_FLASH40: 7437e532c4bSJorge Ramirez-Ortiz str = boot_qspi40; 7447e532c4bSJorge Ramirez-Ortiz break; 7457e532c4bSJorge Ramirez-Ortiz case MODEMR_BOOT_DEV_QSPI_FLASH80: 7467e532c4bSJorge Ramirez-Ortiz str = boot_qspi80; 7477e532c4bSJorge Ramirez-Ortiz break; 7487e532c4bSJorge Ramirez-Ortiz case MODEMR_BOOT_DEV_EMMC_25X1: 7497e532c4bSJorge Ramirez-Ortiz str = boot_emmc25x1; 7507e532c4bSJorge Ramirez-Ortiz break; 7517e532c4bSJorge Ramirez-Ortiz case MODEMR_BOOT_DEV_EMMC_50X8: 7527e532c4bSJorge Ramirez-Ortiz str = boot_emmc50x8; 7537e532c4bSJorge Ramirez-Ortiz break; 7547e532c4bSJorge Ramirez-Ortiz default: 7557e532c4bSJorge Ramirez-Ortiz str = unknown; 7567e532c4bSJorge Ramirez-Ortiz break; 7577e532c4bSJorge Ramirez-Ortiz } 7587e532c4bSJorge Ramirez-Ortiz NOTICE("BL2: Boot device is %s\n", str); 7597e532c4bSJorge Ramirez-Ortiz 7607e532c4bSJorge Ramirez-Ortiz rcar_avs_setting(); 7617e532c4bSJorge Ramirez-Ortiz reg = rcar_rom_get_lcs(&lcs); 7627e532c4bSJorge Ramirez-Ortiz if (reg) { 7637e532c4bSJorge Ramirez-Ortiz str = unknown; 7647e532c4bSJorge Ramirez-Ortiz goto lcm_state; 7657e532c4bSJorge Ramirez-Ortiz } 7667e532c4bSJorge Ramirez-Ortiz 7677e532c4bSJorge Ramirez-Ortiz switch (lcs) { 7687e532c4bSJorge Ramirez-Ortiz case LCS_CM: 7697e532c4bSJorge Ramirez-Ortiz str = lcs_cm; 7707e532c4bSJorge Ramirez-Ortiz break; 7717e532c4bSJorge Ramirez-Ortiz case LCS_DM: 7727e532c4bSJorge Ramirez-Ortiz str = lcs_dm; 7737e532c4bSJorge Ramirez-Ortiz break; 7747e532c4bSJorge Ramirez-Ortiz case LCS_SD: 7757e532c4bSJorge Ramirez-Ortiz str = lcs_sd; 7767e532c4bSJorge Ramirez-Ortiz break; 7777e532c4bSJorge Ramirez-Ortiz case LCS_SE: 7787e532c4bSJorge Ramirez-Ortiz str = lcs_secure; 7797e532c4bSJorge Ramirez-Ortiz break; 7807e532c4bSJorge Ramirez-Ortiz case LCS_FA: 7817e532c4bSJorge Ramirez-Ortiz str = lcs_fa; 7827e532c4bSJorge Ramirez-Ortiz break; 7837e532c4bSJorge Ramirez-Ortiz default: 7847e532c4bSJorge Ramirez-Ortiz str = unknown; 7857e532c4bSJorge Ramirez-Ortiz break; 7867e532c4bSJorge Ramirez-Ortiz } 7877e532c4bSJorge Ramirez-Ortiz 7887e532c4bSJorge Ramirez-Ortiz lcm_state: 7897e532c4bSJorge Ramirez-Ortiz NOTICE("BL2: LCM state is %s\n", str); 7907e532c4bSJorge Ramirez-Ortiz 7917e532c4bSJorge Ramirez-Ortiz rcar_avs_end(); 7927e532c4bSJorge Ramirez-Ortiz is_ddr_backup_mode(); 7937e532c4bSJorge Ramirez-Ortiz 7947e532c4bSJorge Ramirez-Ortiz bl2_tzram_layout.total_base = BL31_BASE; 7957e532c4bSJorge Ramirez-Ortiz bl2_tzram_layout.total_size = BL31_LIMIT - BL31_BASE; 7967e532c4bSJorge Ramirez-Ortiz 7977e532c4bSJorge Ramirez-Ortiz if (boot_cpu == MODEMR_BOOT_CPU_CA57 || 7987e532c4bSJorge Ramirez-Ortiz boot_cpu == MODEMR_BOOT_CPU_CA53) { 7997e532c4bSJorge Ramirez-Ortiz ret = rcar_dram_init(); 8007e532c4bSJorge Ramirez-Ortiz if (ret) { 8017e532c4bSJorge Ramirez-Ortiz NOTICE("BL2: Failed to DRAM initialize (%d).\n", ret); 8027e532c4bSJorge Ramirez-Ortiz panic(); 8037e532c4bSJorge Ramirez-Ortiz } 8047e532c4bSJorge Ramirez-Ortiz rcar_qos_init(); 8057e532c4bSJorge Ramirez-Ortiz } 8067e532c4bSJorge Ramirez-Ortiz 8071d85c4bdSMarek Vasut /* Set up FDT */ 8081d85c4bdSMarek Vasut ret = fdt_create_empty_tree(fdt, sizeof(fdt_blob)); 8091d85c4bdSMarek Vasut if (ret) { 8101d85c4bdSMarek Vasut NOTICE("BL2: Cannot allocate FDT for U-Boot (ret=%i)\n", ret); 8111d85c4bdSMarek Vasut panic(); 8121d85c4bdSMarek Vasut } 8131d85c4bdSMarek Vasut 814ac49c5fbSMarek Vasut /* Add platform compatible string */ 815ac49c5fbSMarek Vasut bl2_populate_compatible_string(fdt); 816ac49c5fbSMarek Vasut 81710b7a4aeSMarek Vasut /* Print DRAM layout */ 81810b7a4aeSMarek Vasut bl2_advertise_dram_size(product); 81910b7a4aeSMarek Vasut 8207e532c4bSJorge Ramirez-Ortiz if (boot_dev == MODEMR_BOOT_DEV_EMMC_25X1 || 8217e532c4bSJorge Ramirez-Ortiz boot_dev == MODEMR_BOOT_DEV_EMMC_50X8) { 8227e532c4bSJorge Ramirez-Ortiz if (rcar_emmc_init() != EMMC_SUCCESS) { 8237e532c4bSJorge Ramirez-Ortiz NOTICE("BL2: Failed to eMMC driver initialize.\n"); 8247e532c4bSJorge Ramirez-Ortiz panic(); 8257e532c4bSJorge Ramirez-Ortiz } 8267e532c4bSJorge Ramirez-Ortiz rcar_emmc_memcard_power(EMMC_POWER_ON); 8277e532c4bSJorge Ramirez-Ortiz if (rcar_emmc_mount() != EMMC_SUCCESS) { 8287e532c4bSJorge Ramirez-Ortiz NOTICE("BL2: Failed to eMMC mount operation.\n"); 8297e532c4bSJorge Ramirez-Ortiz panic(); 8307e532c4bSJorge Ramirez-Ortiz } 8317e532c4bSJorge Ramirez-Ortiz } else { 8327e532c4bSJorge Ramirez-Ortiz rcar_rpc_init(); 8337e532c4bSJorge Ramirez-Ortiz rcar_dma_init(); 8347e532c4bSJorge Ramirez-Ortiz } 8357e532c4bSJorge Ramirez-Ortiz 8367e532c4bSJorge Ramirez-Ortiz reg = mmio_read_32(RST_WDTRSTCR); 8377e532c4bSJorge Ramirez-Ortiz reg &= ~WDTRSTCR_RWDT_RSTMSK; 8387e532c4bSJorge Ramirez-Ortiz reg |= WDTRSTCR_PASSWORD; 8397e532c4bSJorge Ramirez-Ortiz mmio_write_32(RST_WDTRSTCR, reg); 8407e532c4bSJorge Ramirez-Ortiz 8417e532c4bSJorge Ramirez-Ortiz mmio_write_32(CPG_CPGWPR, CPGWPR_PASSWORD); 8427e532c4bSJorge Ramirez-Ortiz mmio_write_32(CPG_CPGWPCR, CPGWPCR_PASSWORD); 8437e532c4bSJorge Ramirez-Ortiz 8447e532c4bSJorge Ramirez-Ortiz reg = mmio_read_32(RCAR_PRR); 8457e532c4bSJorge Ramirez-Ortiz if ((reg & RCAR_CPU_MASK_CA57) == RCAR_CPU_HAVE_CA57) 8467e532c4bSJorge Ramirez-Ortiz mmio_write_32(CPG_CA57DBGRCR, 8477e532c4bSJorge Ramirez-Ortiz DBGCPUPREN | mmio_read_32(CPG_CA57DBGRCR)); 8487e532c4bSJorge Ramirez-Ortiz 8497e532c4bSJorge Ramirez-Ortiz if ((reg & RCAR_CPU_MASK_CA53) == RCAR_CPU_HAVE_CA53) 8507e532c4bSJorge Ramirez-Ortiz mmio_write_32(CPG_CA53DBGRCR, 8517e532c4bSJorge Ramirez-Ortiz DBGCPUPREN | mmio_read_32(CPG_CA53DBGRCR)); 8527e532c4bSJorge Ramirez-Ortiz 8537e532c4bSJorge Ramirez-Ortiz if (product_cut == RCAR_PRODUCT_H3_CUT10) { 8547e532c4bSJorge Ramirez-Ortiz reg = mmio_read_32(CPG_PLL2CR); 8557e532c4bSJorge Ramirez-Ortiz reg &= ~((uint32_t) 1 << 5); 8567e532c4bSJorge Ramirez-Ortiz mmio_write_32(CPG_PLL2CR, reg); 8577e532c4bSJorge Ramirez-Ortiz 8587e532c4bSJorge Ramirez-Ortiz reg = mmio_read_32(CPG_PLL4CR); 8597e532c4bSJorge Ramirez-Ortiz reg &= ~((uint32_t) 1 << 5); 8607e532c4bSJorge Ramirez-Ortiz mmio_write_32(CPG_PLL4CR, reg); 8617e532c4bSJorge Ramirez-Ortiz 8627e532c4bSJorge Ramirez-Ortiz reg = mmio_read_32(CPG_PLL0CR); 8637e532c4bSJorge Ramirez-Ortiz reg &= ~((uint32_t) 1 << 12); 8647e532c4bSJorge Ramirez-Ortiz mmio_write_32(CPG_PLL0CR, reg); 8657e532c4bSJorge Ramirez-Ortiz } 8667e532c4bSJorge Ramirez-Ortiz #if (RCAR_LOSSY_ENABLE == 1) 8677e532c4bSJorge Ramirez-Ortiz NOTICE("BL2: Lossy Decomp areas\n"); 868*a6de3db7SMarek Vasut 869*a6de3db7SMarek Vasut fcnlnode = fdt_add_subnode(fdt, 0, "reserved-memory"); 870*a6de3db7SMarek Vasut if (fcnlnode < 0) { 871*a6de3db7SMarek Vasut NOTICE("BL2: Cannot create reserved mem node (ret=%i)\n", 872*a6de3db7SMarek Vasut fcnlnode); 873*a6de3db7SMarek Vasut panic(); 874*a6de3db7SMarek Vasut } 875*a6de3db7SMarek Vasut 8767e532c4bSJorge Ramirez-Ortiz bl2_lossy_setting(0, LOSSY_ST_ADDR0, LOSSY_END_ADDR0, 877*a6de3db7SMarek Vasut LOSSY_FMT0, LOSSY_ENA_DIS0, fcnlnode); 8787e532c4bSJorge Ramirez-Ortiz bl2_lossy_setting(1, LOSSY_ST_ADDR1, LOSSY_END_ADDR1, 879*a6de3db7SMarek Vasut LOSSY_FMT1, LOSSY_ENA_DIS1, fcnlnode); 8807e532c4bSJorge Ramirez-Ortiz bl2_lossy_setting(2, LOSSY_ST_ADDR2, LOSSY_END_ADDR2, 881*a6de3db7SMarek Vasut LOSSY_FMT2, LOSSY_ENA_DIS2, fcnlnode); 8827e532c4bSJorge Ramirez-Ortiz #endif 8837e532c4bSJorge Ramirez-Ortiz 8841d85c4bdSMarek Vasut fdt_pack(fdt); 8851d85c4bdSMarek Vasut NOTICE("BL2: FDT at %p\n", fdt); 8861d85c4bdSMarek Vasut 8877e532c4bSJorge Ramirez-Ortiz if (boot_dev == MODEMR_BOOT_DEV_EMMC_25X1 || 8887e532c4bSJorge Ramirez-Ortiz boot_dev == MODEMR_BOOT_DEV_EMMC_50X8) 8897e532c4bSJorge Ramirez-Ortiz rcar_io_emmc_setup(); 8907e532c4bSJorge Ramirez-Ortiz else 8917e532c4bSJorge Ramirez-Ortiz rcar_io_setup(); 8927e532c4bSJorge Ramirez-Ortiz } 8937e532c4bSJorge Ramirez-Ortiz 8947e532c4bSJorge Ramirez-Ortiz void bl2_el3_plat_arch_setup(void) 8957e532c4bSJorge Ramirez-Ortiz { 8967e532c4bSJorge Ramirez-Ortiz #if RCAR_BL2_DCACHE == 1 8977e532c4bSJorge Ramirez-Ortiz NOTICE("BL2: D-Cache enable\n"); 8987e532c4bSJorge Ramirez-Ortiz rcar_configure_mmu_el3(BL2_BASE, 8997e532c4bSJorge Ramirez-Ortiz RCAR_SYSRAM_LIMIT - BL2_BASE, 9007e532c4bSJorge Ramirez-Ortiz BL2_RO_BASE, BL2_RO_LIMIT 9017e532c4bSJorge Ramirez-Ortiz #if USE_COHERENT_MEM 9027e532c4bSJorge Ramirez-Ortiz , BL2_COHERENT_RAM_BASE, BL2_COHERENT_RAM_LIMIT 9037e532c4bSJorge Ramirez-Ortiz #endif 9047e532c4bSJorge Ramirez-Ortiz ); 9057e532c4bSJorge Ramirez-Ortiz #endif 9067e532c4bSJorge Ramirez-Ortiz } 9077e532c4bSJorge Ramirez-Ortiz 9087e532c4bSJorge Ramirez-Ortiz void bl2_platform_setup(void) 9097e532c4bSJorge Ramirez-Ortiz { 9107e532c4bSJorge Ramirez-Ortiz 9117e532c4bSJorge Ramirez-Ortiz } 912