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> 137e532c4bSJorge Ramirez-Ortiz #include <mmio.h> 147e532c4bSJorge Ramirez-Ortiz #include <platform.h> 157e532c4bSJorge Ramirez-Ortiz #include <platform_def.h> 167e532c4bSJorge Ramirez-Ortiz #include <string.h> 177e532c4bSJorge Ramirez-Ortiz 187e532c4bSJorge Ramirez-Ortiz #include "avs_driver.h" 197e532c4bSJorge Ramirez-Ortiz #include "boot_init_dram.h" 207e532c4bSJorge Ramirez-Ortiz #include "cpg_registers.h" 217e532c4bSJorge Ramirez-Ortiz #include "board.h" 227e532c4bSJorge Ramirez-Ortiz #include "emmc_def.h" 237e532c4bSJorge Ramirez-Ortiz #include "emmc_hal.h" 247e532c4bSJorge Ramirez-Ortiz #include "emmc_std.h" 257e532c4bSJorge Ramirez-Ortiz 267e532c4bSJorge Ramirez-Ortiz #if PMIC_ROHM_BD9571 && RCAR_SYSTEM_RESET_KEEPON_DDR 277e532c4bSJorge Ramirez-Ortiz #include "iic_dvfs.h" 287e532c4bSJorge Ramirez-Ortiz #endif 297e532c4bSJorge Ramirez-Ortiz 307e532c4bSJorge Ramirez-Ortiz #include "io_common.h" 317e532c4bSJorge Ramirez-Ortiz #include "qos_init.h" 327e532c4bSJorge Ramirez-Ortiz #include "rcar_def.h" 337e532c4bSJorge Ramirez-Ortiz #include "rcar_private.h" 347e532c4bSJorge Ramirez-Ortiz #include "rcar_version.h" 357e532c4bSJorge Ramirez-Ortiz #include "rom_api.h" 367e532c4bSJorge Ramirez-Ortiz 377e532c4bSJorge Ramirez-Ortiz IMPORT_SYM(unsigned long, __RO_START__, BL2_RO_BASE) 387e532c4bSJorge Ramirez-Ortiz IMPORT_SYM(unsigned long, __RO_END__, BL2_RO_LIMIT) 397e532c4bSJorge Ramirez-Ortiz 407e532c4bSJorge Ramirez-Ortiz #if USE_COHERENT_MEM 417e532c4bSJorge Ramirez-Ortiz IMPORT_SYM(unsigned long, __COHERENT_RAM_START__, BL2_COHERENT_RAM_BASE) 427e532c4bSJorge Ramirez-Ortiz IMPORT_SYM(unsigned long, __COHERENT_RAM_END__, BL2_COHERENT_RAM_LIMIT) 437e532c4bSJorge Ramirez-Ortiz #endif 447e532c4bSJorge Ramirez-Ortiz 457e532c4bSJorge Ramirez-Ortiz extern void plat_rcar_gic_driver_init(void); 467e532c4bSJorge Ramirez-Ortiz extern void plat_rcar_gic_init(void); 477e532c4bSJorge Ramirez-Ortiz extern void bl2_enter_bl31(const struct entry_point_info *bl_ep_info); 487e532c4bSJorge Ramirez-Ortiz extern void bl2_system_cpg_init(void); 497e532c4bSJorge Ramirez-Ortiz extern void bl2_secure_setting(void); 507e532c4bSJorge Ramirez-Ortiz extern void bl2_cpg_init(void); 517e532c4bSJorge Ramirez-Ortiz extern void rcar_io_emmc_setup(void); 527e532c4bSJorge Ramirez-Ortiz extern void rcar_io_setup(void); 537e532c4bSJorge Ramirez-Ortiz extern void rcar_swdt_release(void); 547e532c4bSJorge Ramirez-Ortiz extern void rcar_swdt_init(void); 557e532c4bSJorge Ramirez-Ortiz extern void rcar_rpc_init(void); 567e532c4bSJorge Ramirez-Ortiz extern void rcar_pfc_init(void); 577e532c4bSJorge Ramirez-Ortiz extern void rcar_dma_init(void); 587e532c4bSJorge Ramirez-Ortiz 597e532c4bSJorge Ramirez-Ortiz /* R-Car Gen3 product check */ 607e532c4bSJorge Ramirez-Ortiz #if (RCAR_LSI == RCAR_H3) || (RCAR_LSI == RCAR_H3N) 617e532c4bSJorge Ramirez-Ortiz #define TARGET_PRODUCT RCAR_PRODUCT_H3 627e532c4bSJorge Ramirez-Ortiz #define TARGET_NAME "R-Car H3" 637e532c4bSJorge Ramirez-Ortiz #elif RCAR_LSI == RCAR_M3 647e532c4bSJorge Ramirez-Ortiz #define TARGET_PRODUCT RCAR_PRODUCT_M3 657e532c4bSJorge Ramirez-Ortiz #define TARGET_NAME "R-Car M3" 667e532c4bSJorge Ramirez-Ortiz #elif RCAR_LSI == RCAR_M3N 677e532c4bSJorge Ramirez-Ortiz #define TARGET_PRODUCT RCAR_PRODUCT_M3N 687e532c4bSJorge Ramirez-Ortiz #define TARGET_NAME "R-Car M3N" 697e532c4bSJorge Ramirez-Ortiz #elif RCAR_LSI == RCAR_E3 707e532c4bSJorge Ramirez-Ortiz #define TARGET_PRODUCT RCAR_PRODUCT_E3 717e532c4bSJorge Ramirez-Ortiz #define TARGET_NAME "R-Car E3" 727e532c4bSJorge Ramirez-Ortiz #endif 737e532c4bSJorge Ramirez-Ortiz 747e532c4bSJorge Ramirez-Ortiz #if (RCAR_LSI == RCAR_E3) 757e532c4bSJorge Ramirez-Ortiz #define GPIO_INDT (GPIO_INDT6) 767e532c4bSJorge Ramirez-Ortiz #define GPIO_BKUP_TRG_SHIFT ((uint32_t)1U<<13U) 777e532c4bSJorge Ramirez-Ortiz #else 787e532c4bSJorge Ramirez-Ortiz #define GPIO_INDT (GPIO_INDT1) 797e532c4bSJorge Ramirez-Ortiz #define GPIO_BKUP_TRG_SHIFT ((uint32_t)1U<<8U) 807e532c4bSJorge Ramirez-Ortiz #endif 817e532c4bSJorge Ramirez-Ortiz 827e532c4bSJorge Ramirez-Ortiz CASSERT((PARAMS_BASE + sizeof(bl2_to_bl31_params_mem_t) + 0x100) 837e532c4bSJorge Ramirez-Ortiz < (RCAR_SHARED_MEM_BASE + RCAR_SHARED_MEM_SIZE), 847e532c4bSJorge Ramirez-Ortiz assert_bl31_params_do_not_fit_in_shared_memory); 857e532c4bSJorge Ramirez-Ortiz 867e532c4bSJorge Ramirez-Ortiz static meminfo_t bl2_tzram_layout __aligned(CACHE_WRITEBACK_GRANULE); 877e532c4bSJorge Ramirez-Ortiz 887e532c4bSJorge Ramirez-Ortiz #if (RCAR_LOSSY_ENABLE == 1) 897e532c4bSJorge Ramirez-Ortiz typedef struct bl2_lossy_info { 907e532c4bSJorge Ramirez-Ortiz uint32_t magic; 917e532c4bSJorge Ramirez-Ortiz uint32_t a0; 927e532c4bSJorge Ramirez-Ortiz uint32_t b0; 937e532c4bSJorge Ramirez-Ortiz } bl2_lossy_info_t; 947e532c4bSJorge Ramirez-Ortiz 957e532c4bSJorge Ramirez-Ortiz static void bl2_lossy_setting(uint32_t no, uint64_t start_addr, 967e532c4bSJorge Ramirez-Ortiz uint64_t end_addr, uint32_t format, 977e532c4bSJorge Ramirez-Ortiz uint32_t enable) 987e532c4bSJorge Ramirez-Ortiz { 997e532c4bSJorge Ramirez-Ortiz bl2_lossy_info_t info; 1007e532c4bSJorge Ramirez-Ortiz uint32_t reg; 1017e532c4bSJorge Ramirez-Ortiz 1027e532c4bSJorge Ramirez-Ortiz reg = format | (start_addr >> 20); 1037e532c4bSJorge Ramirez-Ortiz mmio_write_32(AXI_DCMPAREACRA0 + 0x8 * no, reg); 1047e532c4bSJorge Ramirez-Ortiz mmio_write_32(AXI_DCMPAREACRB0 + 0x8 * no, end_addr >> 20); 1057e532c4bSJorge Ramirez-Ortiz mmio_write_32(AXI_DCMPAREACRA0 + 0x8 * no, reg | enable); 1067e532c4bSJorge Ramirez-Ortiz 1077e532c4bSJorge Ramirez-Ortiz info.magic = 0x12345678U; 1087e532c4bSJorge Ramirez-Ortiz info.a0 = mmio_read_32(AXI_DCMPAREACRA0 + 0x8 * no); 1097e532c4bSJorge Ramirez-Ortiz info.b0 = mmio_read_32(AXI_DCMPAREACRB0 + 0x8 * no); 1107e532c4bSJorge Ramirez-Ortiz 1117e532c4bSJorge Ramirez-Ortiz mmio_write_32(LOSSY_PARAMS_BASE + sizeof(info) * no, info.magic); 1127e532c4bSJorge Ramirez-Ortiz mmio_write_32(LOSSY_PARAMS_BASE + sizeof(info) * no + 0x4, info.a0); 1137e532c4bSJorge Ramirez-Ortiz mmio_write_32(LOSSY_PARAMS_BASE + sizeof(info) * no + 0x8, info.b0); 1147e532c4bSJorge Ramirez-Ortiz 1157e532c4bSJorge Ramirez-Ortiz NOTICE(" Entry %d: DCMPAREACRAx:0x%x DCMPAREACRBx:0x%x\n", no, 1167e532c4bSJorge Ramirez-Ortiz mmio_read_32(AXI_DCMPAREACRA0 + 0x8 * no), 1177e532c4bSJorge Ramirez-Ortiz mmio_read_32(AXI_DCMPAREACRB0 + 0x8 * no)); 1187e532c4bSJorge Ramirez-Ortiz } 1197e532c4bSJorge Ramirez-Ortiz #endif 1207e532c4bSJorge Ramirez-Ortiz 1217e532c4bSJorge Ramirez-Ortiz void bl2_plat_flush_bl31_params(void) 1227e532c4bSJorge Ramirez-Ortiz { 1237e532c4bSJorge Ramirez-Ortiz uint32_t product_cut, product, cut; 1247e532c4bSJorge Ramirez-Ortiz uint32_t boot_dev, boot_cpu; 1257e532c4bSJorge Ramirez-Ortiz uint32_t lcs, reg, val; 1267e532c4bSJorge Ramirez-Ortiz 1277e532c4bSJorge Ramirez-Ortiz reg = mmio_read_32(RCAR_MODEMR); 1287e532c4bSJorge Ramirez-Ortiz boot_dev = reg & MODEMR_BOOT_DEV_MASK; 1297e532c4bSJorge Ramirez-Ortiz 1307e532c4bSJorge Ramirez-Ortiz if (boot_dev == MODEMR_BOOT_DEV_EMMC_25X1 || 1317e532c4bSJorge Ramirez-Ortiz boot_dev == MODEMR_BOOT_DEV_EMMC_50X8) 1327e532c4bSJorge Ramirez-Ortiz emmc_terminate(); 1337e532c4bSJorge Ramirez-Ortiz 1347e532c4bSJorge Ramirez-Ortiz if ((reg & MODEMR_BOOT_CPU_MASK) != MODEMR_BOOT_CPU_CR7) 1357e532c4bSJorge Ramirez-Ortiz bl2_secure_setting(); 1367e532c4bSJorge Ramirez-Ortiz 1377e532c4bSJorge Ramirez-Ortiz reg = mmio_read_32(RCAR_PRR); 1387e532c4bSJorge Ramirez-Ortiz product_cut = reg & (RCAR_PRODUCT_MASK | RCAR_CUT_MASK); 1397e532c4bSJorge Ramirez-Ortiz product = reg & RCAR_PRODUCT_MASK; 1407e532c4bSJorge Ramirez-Ortiz cut = reg & RCAR_CUT_MASK; 1417e532c4bSJorge Ramirez-Ortiz 1427e532c4bSJorge Ramirez-Ortiz if (product == RCAR_PRODUCT_M3) 1437e532c4bSJorge Ramirez-Ortiz goto tlb; 1447e532c4bSJorge Ramirez-Ortiz 1457e532c4bSJorge Ramirez-Ortiz if (product == RCAR_PRODUCT_H3 && RCAR_CUT_VER20 > cut) 1467e532c4bSJorge Ramirez-Ortiz goto tlb; 1477e532c4bSJorge Ramirez-Ortiz 1487e532c4bSJorge Ramirez-Ortiz /* Disable MFIS write protection */ 1497e532c4bSJorge Ramirez-Ortiz mmio_write_32(MFISWPCNTR, MFISWPCNTR_PASSWORD | 1); 1507e532c4bSJorge Ramirez-Ortiz 1517e532c4bSJorge Ramirez-Ortiz tlb: 1527e532c4bSJorge Ramirez-Ortiz reg = mmio_read_32(RCAR_MODEMR); 1537e532c4bSJorge Ramirez-Ortiz boot_cpu = reg & MODEMR_BOOT_CPU_MASK; 1547e532c4bSJorge Ramirez-Ortiz if (boot_cpu != MODEMR_BOOT_CPU_CA57 && 1557e532c4bSJorge Ramirez-Ortiz boot_cpu != MODEMR_BOOT_CPU_CA53) 1567e532c4bSJorge Ramirez-Ortiz goto mmu; 1577e532c4bSJorge Ramirez-Ortiz 1587e532c4bSJorge Ramirez-Ortiz if (product_cut == RCAR_PRODUCT_H3_CUT20) { 1597e532c4bSJorge Ramirez-Ortiz mmio_write_32(IPMMUVI0_IMSCTLR, IMSCTLR_DISCACHE); 1607e532c4bSJorge Ramirez-Ortiz mmio_write_32(IPMMUVI1_IMSCTLR, IMSCTLR_DISCACHE); 1617e532c4bSJorge Ramirez-Ortiz mmio_write_32(IPMMUPV0_IMSCTLR, IMSCTLR_DISCACHE); 1627e532c4bSJorge Ramirez-Ortiz mmio_write_32(IPMMUPV1_IMSCTLR, IMSCTLR_DISCACHE); 1637e532c4bSJorge Ramirez-Ortiz mmio_write_32(IPMMUPV2_IMSCTLR, IMSCTLR_DISCACHE); 1647e532c4bSJorge Ramirez-Ortiz mmio_write_32(IPMMUPV3_IMSCTLR, IMSCTLR_DISCACHE); 1657e532c4bSJorge Ramirez-Ortiz } else if (product_cut == (RCAR_PRODUCT_M3N | RCAR_CUT_VER10) || 1667e532c4bSJorge Ramirez-Ortiz product_cut == (RCAR_PRODUCT_M3N | RCAR_CUT_VER11)) { 1677e532c4bSJorge Ramirez-Ortiz mmio_write_32(IPMMUVI0_IMSCTLR, IMSCTLR_DISCACHE); 1687e532c4bSJorge Ramirez-Ortiz mmio_write_32(IPMMUPV0_IMSCTLR, IMSCTLR_DISCACHE); 1697e532c4bSJorge Ramirez-Ortiz } else if (product_cut == (RCAR_PRODUCT_E3 | RCAR_CUT_VER10)) { 1707e532c4bSJorge Ramirez-Ortiz mmio_write_32(IPMMUVI0_IMSCTLR, IMSCTLR_DISCACHE); 1717e532c4bSJorge Ramirez-Ortiz mmio_write_32(IPMMUPV0_IMSCTLR, IMSCTLR_DISCACHE); 1727e532c4bSJorge Ramirez-Ortiz } 1737e532c4bSJorge Ramirez-Ortiz 1747e532c4bSJorge Ramirez-Ortiz if (product_cut == (RCAR_PRODUCT_H3_CUT20) || 1757e532c4bSJorge Ramirez-Ortiz product_cut == (RCAR_PRODUCT_M3N | RCAR_CUT_VER10) || 1767e532c4bSJorge Ramirez-Ortiz product_cut == (RCAR_PRODUCT_M3N | RCAR_CUT_VER11) || 1777e532c4bSJorge Ramirez-Ortiz product_cut == (RCAR_PRODUCT_E3 | RCAR_CUT_VER10)) { 1787e532c4bSJorge Ramirez-Ortiz mmio_write_32(IPMMUHC_IMSCTLR, IMSCTLR_DISCACHE); 1797e532c4bSJorge Ramirez-Ortiz mmio_write_32(IPMMURT_IMSCTLR, IMSCTLR_DISCACHE); 1807e532c4bSJorge Ramirez-Ortiz mmio_write_32(IPMMUMP_IMSCTLR, IMSCTLR_DISCACHE); 1817e532c4bSJorge Ramirez-Ortiz 1827e532c4bSJorge Ramirez-Ortiz mmio_write_32(IPMMUDS0_IMSCTLR, IMSCTLR_DISCACHE); 1837e532c4bSJorge Ramirez-Ortiz mmio_write_32(IPMMUDS1_IMSCTLR, IMSCTLR_DISCACHE); 1847e532c4bSJorge Ramirez-Ortiz } 1857e532c4bSJorge Ramirez-Ortiz 1867e532c4bSJorge Ramirez-Ortiz mmu: 1877e532c4bSJorge Ramirez-Ortiz mmio_write_32(IPMMUMM_IMSCTLR, IPMMUMM_IMSCTLR_ENABLE); 1887e532c4bSJorge Ramirez-Ortiz mmio_write_32(IPMMUMM_IMAUXCTLR, IPMMUMM_IMAUXCTLR_NMERGE40_BIT); 1897e532c4bSJorge Ramirez-Ortiz 1907e532c4bSJorge Ramirez-Ortiz val = rcar_rom_get_lcs(&lcs); 1917e532c4bSJorge Ramirez-Ortiz if (val) { 1927e532c4bSJorge Ramirez-Ortiz ERROR("BL2: Failed to get the LCS. (%d)\n", val); 1937e532c4bSJorge Ramirez-Ortiz panic(); 1947e532c4bSJorge Ramirez-Ortiz } 1957e532c4bSJorge Ramirez-Ortiz 1967e532c4bSJorge Ramirez-Ortiz if (lcs == LCS_SE) 1977e532c4bSJorge Ramirez-Ortiz mmio_clrbits_32(P_ARMREG_SEC_CTRL, P_ARMREG_SEC_CTRL_PROT); 1987e532c4bSJorge Ramirez-Ortiz 1997e532c4bSJorge Ramirez-Ortiz rcar_swdt_release(); 2007e532c4bSJorge Ramirez-Ortiz bl2_system_cpg_init(); 2017e532c4bSJorge Ramirez-Ortiz 2027e532c4bSJorge Ramirez-Ortiz #if RCAR_BL2_DCACHE == 1 2037e532c4bSJorge Ramirez-Ortiz /* Disable data cache (clean and invalidate) */ 2047e532c4bSJorge Ramirez-Ortiz disable_mmu_el3(); 2057e532c4bSJorge Ramirez-Ortiz #endif 2067e532c4bSJorge Ramirez-Ortiz } 2077e532c4bSJorge Ramirez-Ortiz 2087e532c4bSJorge Ramirez-Ortiz static uint32_t is_ddr_backup_mode(void) 2097e532c4bSJorge Ramirez-Ortiz { 2107e532c4bSJorge Ramirez-Ortiz #if RCAR_SYSTEM_SUSPEND 2117e532c4bSJorge Ramirez-Ortiz static uint32_t reason = RCAR_COLD_BOOT; 2127e532c4bSJorge Ramirez-Ortiz static uint32_t once; 2137e532c4bSJorge Ramirez-Ortiz 2147e532c4bSJorge Ramirez-Ortiz #if PMIC_ROHM_BD9571 && RCAR_SYSTEM_RESET_KEEPON_DDR 2157e532c4bSJorge Ramirez-Ortiz uint8_t data; 2167e532c4bSJorge Ramirez-Ortiz #endif 2177e532c4bSJorge Ramirez-Ortiz if (once) 2187e532c4bSJorge Ramirez-Ortiz return reason; 2197e532c4bSJorge Ramirez-Ortiz 2207e532c4bSJorge Ramirez-Ortiz once = 1; 2217e532c4bSJorge Ramirez-Ortiz if ((mmio_read_32(GPIO_INDT) & GPIO_BKUP_TRG_SHIFT) == 0) 2227e532c4bSJorge Ramirez-Ortiz return reason; 2237e532c4bSJorge Ramirez-Ortiz 2247e532c4bSJorge Ramirez-Ortiz #if PMIC_ROHM_BD9571 && RCAR_SYSTEM_RESET_KEEPON_DDR 2257e532c4bSJorge Ramirez-Ortiz if (rcar_iic_dvfs_receive(PMIC, REG_KEEP10, &data)) { 2267e532c4bSJorge Ramirez-Ortiz ERROR("BL2: REG Keep10 READ ERROR.\n"); 2277e532c4bSJorge Ramirez-Ortiz panic(); 2287e532c4bSJorge Ramirez-Ortiz } 2297e532c4bSJorge Ramirez-Ortiz 2307e532c4bSJorge Ramirez-Ortiz if (KEEP10_MAGIC != data) 2317e532c4bSJorge Ramirez-Ortiz reason = RCAR_WARM_BOOT; 2327e532c4bSJorge Ramirez-Ortiz #else 2337e532c4bSJorge Ramirez-Ortiz reason = RCAR_WARM_BOOT; 2347e532c4bSJorge Ramirez-Ortiz #endif 2357e532c4bSJorge Ramirez-Ortiz return reason; 2367e532c4bSJorge Ramirez-Ortiz #else 2377e532c4bSJorge Ramirez-Ortiz return RCAR_COLD_BOOT; 2387e532c4bSJorge Ramirez-Ortiz #endif 2397e532c4bSJorge Ramirez-Ortiz } 2407e532c4bSJorge Ramirez-Ortiz 2417e532c4bSJorge Ramirez-Ortiz int bl2_plat_handle_pre_image_load(unsigned int image_id) 2427e532c4bSJorge Ramirez-Ortiz { 2437e532c4bSJorge Ramirez-Ortiz u_register_t *boot_kind = (void *) BOOT_KIND_BASE; 2447e532c4bSJorge Ramirez-Ortiz bl_mem_params_node_t *bl_mem_params; 2457e532c4bSJorge Ramirez-Ortiz 2467e532c4bSJorge Ramirez-Ortiz if (image_id != BL31_IMAGE_ID) 2477e532c4bSJorge Ramirez-Ortiz return 0; 2487e532c4bSJorge Ramirez-Ortiz 2497e532c4bSJorge Ramirez-Ortiz bl_mem_params = get_bl_mem_params_node(image_id); 2507e532c4bSJorge Ramirez-Ortiz 2517e532c4bSJorge Ramirez-Ortiz if (is_ddr_backup_mode() == RCAR_COLD_BOOT) 2527e532c4bSJorge Ramirez-Ortiz goto cold_boot; 2537e532c4bSJorge Ramirez-Ortiz 2547e532c4bSJorge Ramirez-Ortiz *boot_kind = RCAR_WARM_BOOT; 2557e532c4bSJorge Ramirez-Ortiz flush_dcache_range(BOOT_KIND_BASE, sizeof(*boot_kind)); 2567e532c4bSJorge Ramirez-Ortiz 2577e532c4bSJorge Ramirez-Ortiz console_flush(); 2587e532c4bSJorge Ramirez-Ortiz bl2_plat_flush_bl31_params(); 2597e532c4bSJorge Ramirez-Ortiz 2607e532c4bSJorge Ramirez-Ortiz /* will not return */ 2617e532c4bSJorge Ramirez-Ortiz bl2_enter_bl31(&bl_mem_params->ep_info); 2627e532c4bSJorge Ramirez-Ortiz 2637e532c4bSJorge Ramirez-Ortiz cold_boot: 2647e532c4bSJorge Ramirez-Ortiz *boot_kind = RCAR_COLD_BOOT; 2657e532c4bSJorge Ramirez-Ortiz flush_dcache_range(BOOT_KIND_BASE, sizeof(*boot_kind)); 2667e532c4bSJorge Ramirez-Ortiz 2677e532c4bSJorge Ramirez-Ortiz return 0; 2687e532c4bSJorge Ramirez-Ortiz } 2697e532c4bSJorge Ramirez-Ortiz 2707e532c4bSJorge Ramirez-Ortiz int bl2_plat_handle_post_image_load(unsigned int image_id) 2717e532c4bSJorge Ramirez-Ortiz { 2727e532c4bSJorge Ramirez-Ortiz static bl2_to_bl31_params_mem_t *params; 2737e532c4bSJorge Ramirez-Ortiz bl_mem_params_node_t *bl_mem_params; 2747e532c4bSJorge Ramirez-Ortiz 2757e532c4bSJorge Ramirez-Ortiz if (!params) { 2767e532c4bSJorge Ramirez-Ortiz params = (bl2_to_bl31_params_mem_t *) PARAMS_BASE; 2777e532c4bSJorge Ramirez-Ortiz memset((void *)PARAMS_BASE, 0, sizeof(*params)); 2787e532c4bSJorge Ramirez-Ortiz } 2797e532c4bSJorge Ramirez-Ortiz 2807e532c4bSJorge Ramirez-Ortiz bl_mem_params = get_bl_mem_params_node(image_id); 2817e532c4bSJorge Ramirez-Ortiz 2827e532c4bSJorge Ramirez-Ortiz switch (image_id) { 2837e532c4bSJorge Ramirez-Ortiz case BL31_IMAGE_ID: 2847e532c4bSJorge Ramirez-Ortiz break; 2857e532c4bSJorge Ramirez-Ortiz case BL32_IMAGE_ID: 2867e532c4bSJorge Ramirez-Ortiz memcpy(¶ms->bl32_ep_info, &bl_mem_params->ep_info, 2877e532c4bSJorge Ramirez-Ortiz sizeof(entry_point_info_t)); 2887e532c4bSJorge Ramirez-Ortiz break; 2897e532c4bSJorge Ramirez-Ortiz case BL33_IMAGE_ID: 2907e532c4bSJorge Ramirez-Ortiz memcpy(¶ms->bl33_ep_info, &bl_mem_params->ep_info, 2917e532c4bSJorge Ramirez-Ortiz sizeof(entry_point_info_t)); 2927e532c4bSJorge Ramirez-Ortiz break; 2937e532c4bSJorge Ramirez-Ortiz } 2947e532c4bSJorge Ramirez-Ortiz 2957e532c4bSJorge Ramirez-Ortiz return 0; 2967e532c4bSJorge Ramirez-Ortiz } 2977e532c4bSJorge Ramirez-Ortiz 2987e532c4bSJorge Ramirez-Ortiz meminfo_t *bl2_plat_sec_mem_layout(void) 2997e532c4bSJorge Ramirez-Ortiz { 3007e532c4bSJorge Ramirez-Ortiz return &bl2_tzram_layout; 3017e532c4bSJorge Ramirez-Ortiz } 3027e532c4bSJorge Ramirez-Ortiz 3037bf24ae3SMarek Vasut static void bl2_advertise_dram_size(uint32_t product) 304358ed930SMarek Vasut { 305e1eddfeaSMarek Vasut switch (product) { 306e1eddfeaSMarek Vasut case RCAR_PRODUCT_H3: 307358ed930SMarek Vasut #if (RCAR_DRAM_LPDDR4_MEMCONF == 0) 308358ed930SMarek Vasut /* 4GB(1GBx4) */ 309358ed930SMarek Vasut NOTICE("BL2: CH0: 0x400000000 - 0x43fffffff, 1 GiB\n"); 310358ed930SMarek Vasut NOTICE("BL2: CH1: 0x500000000 - 0x53fffffff, 1 GiB\n"); 311358ed930SMarek Vasut NOTICE("BL2: CH2: 0x600000000 - 0x63fffffff, 1 GiB\n"); 312358ed930SMarek Vasut NOTICE("BL2: CH3: 0x700000000 - 0x73fffffff, 1 GiB\n"); 313358ed930SMarek Vasut #elif (RCAR_DRAM_LPDDR4_MEMCONF == 1) && \ 314358ed930SMarek Vasut (RCAR_DRAM_CHANNEL == 5) && \ 315358ed930SMarek Vasut (RCAR_DRAM_SPLIT == 2) 316358ed930SMarek Vasut /* 4GB(2GBx2 2ch split) */ 317358ed930SMarek Vasut NOTICE("BL2: CH0: 0x400000000 - 0x47fffffff, 2 GiB\n"); 318358ed930SMarek Vasut NOTICE("BL2: CH1: 0x500000000 - 0x57fffffff, 2 GiB\n"); 319358ed930SMarek Vasut #elif (RCAR_DRAM_LPDDR4_MEMCONF == 1) && (RCAR_DRAM_CHANNEL == 15) 320358ed930SMarek Vasut /* 8GB(2GBx4: default) */ 321358ed930SMarek Vasut NOTICE("BL2: CH0: 0x400000000 - 0x47fffffff, 2 GiB\n"); 322358ed930SMarek Vasut NOTICE("BL2: CH1: 0x500000000 - 0x57fffffff, 2 GiB\n"); 323358ed930SMarek Vasut NOTICE("BL2: CH2: 0x600000000 - 0x67fffffff, 2 GiB\n"); 324358ed930SMarek Vasut NOTICE("BL2: CH3: 0x700000000 - 0x77fffffff, 2 GiB\n"); 325358ed930SMarek Vasut #endif /* RCAR_DRAM_LPDDR4_MEMCONF == 0 */ 326e1eddfeaSMarek Vasut break; 327358ed930SMarek Vasut 328e1eddfeaSMarek Vasut case RCAR_PRODUCT_M3: 329e1eddfeaSMarek Vasut /* 4GB(2GBx2 2ch split) */ 330e1eddfeaSMarek Vasut NOTICE("BL2: CH0: 0x400000000 - 0x480000000, 2 GiB\n"); 331e1eddfeaSMarek Vasut NOTICE("BL2: CH1: 0x600000000 - 0x680000000, 2 GiB\n"); 332e1eddfeaSMarek Vasut break; 333e1eddfeaSMarek Vasut 334e1eddfeaSMarek Vasut case RCAR_PRODUCT_M3N: 335e1eddfeaSMarek Vasut /* 2GB(1GBx2) */ 336e1eddfeaSMarek Vasut NOTICE("BL2: 0x400000000 - 0x480000000, 2 GiB\n"); 337e1eddfeaSMarek Vasut break; 338e1eddfeaSMarek Vasut 339e1eddfeaSMarek Vasut case RCAR_PRODUCT_E3: 340358ed930SMarek Vasut #if (RCAR_DRAM_DDR3L_MEMCONF == 0) 341358ed930SMarek Vasut /* 1GB(512MBx2) */ 342358ed930SMarek Vasut NOTICE("BL2: 0x400000000 - 0x43fffffff, 1 GiB\n"); 343358ed930SMarek Vasut #elif (RCAR_DRAM_DDR3L_MEMCONF == 1) 344358ed930SMarek Vasut /* 2GB(512MBx4) */ 345358ed930SMarek Vasut NOTICE("BL2: 0x400000000 - 0x47fffffff, 2 GiB\n"); 3463b507aabSMarek Vasut #elif (RCAR_DRAM_DDR3L_MEMCONF == 2) 3473b507aabSMarek Vasut /* 4GB(1GBx4) */ 3483b507aabSMarek Vasut NOTICE("BL2: 0x400000000 - 0x4ffffffff, 4 GiB\n"); 349358ed930SMarek Vasut #endif /* RCAR_DRAM_DDR3L_MEMCONF == 0 */ 350e1eddfeaSMarek Vasut break; 351358ed930SMarek Vasut } 352358ed930SMarek Vasut } 353358ed930SMarek Vasut 3547e532c4bSJorge Ramirez-Ortiz void bl2_el3_early_platform_setup(u_register_t arg1, u_register_t arg2, 3557e532c4bSJorge Ramirez-Ortiz u_register_t arg3, u_register_t arg4) 3567e532c4bSJorge Ramirez-Ortiz { 3577e532c4bSJorge Ramirez-Ortiz uint32_t reg, midr, lcs, boot_dev, boot_cpu, sscg, type, rev; 3587bf24ae3SMarek Vasut uint32_t product, product_cut, major, minor; 3597e532c4bSJorge Ramirez-Ortiz int32_t ret; 3607e532c4bSJorge Ramirez-Ortiz const char *str; 3617e532c4bSJorge Ramirez-Ortiz const char *unknown = "unknown"; 3627e532c4bSJorge Ramirez-Ortiz const char *cpu_ca57 = "CA57"; 3637e532c4bSJorge Ramirez-Ortiz const char *cpu_ca53 = "CA53"; 3647e532c4bSJorge Ramirez-Ortiz const char *product_m3n = "M3N"; 3657e532c4bSJorge Ramirez-Ortiz const char *product_h3 = "H3"; 3667e532c4bSJorge Ramirez-Ortiz const char *product_m3 = "M3"; 3677e532c4bSJorge Ramirez-Ortiz const char *product_e3 = "E3"; 3687e532c4bSJorge Ramirez-Ortiz const char *lcs_secure = "SE"; 3697e532c4bSJorge Ramirez-Ortiz const char *lcs_cm = "CM"; 3707e532c4bSJorge Ramirez-Ortiz const char *lcs_dm = "DM"; 3717e532c4bSJorge Ramirez-Ortiz const char *lcs_sd = "SD"; 3727e532c4bSJorge Ramirez-Ortiz const char *lcs_fa = "FA"; 3737e532c4bSJorge Ramirez-Ortiz const char *sscg_off = "PLL1 nonSSCG Clock select"; 3747e532c4bSJorge Ramirez-Ortiz const char *sscg_on = "PLL1 SSCG Clock select"; 3757e532c4bSJorge Ramirez-Ortiz const char *boot_hyper80 = "HyperFlash(80MHz)"; 3767e532c4bSJorge Ramirez-Ortiz const char *boot_qspi40 = "QSPI Flash(40MHz)"; 3777e532c4bSJorge Ramirez-Ortiz const char *boot_qspi80 = "QSPI Flash(80MHz)"; 3787e532c4bSJorge Ramirez-Ortiz const char *boot_emmc25x1 = "eMMC(25MHz x1)"; 3797e532c4bSJorge Ramirez-Ortiz const char *boot_emmc50x8 = "eMMC(50MHz x8)"; 3807e532c4bSJorge Ramirez-Ortiz #if RCAR_LSI == RCAR_E3 3817e532c4bSJorge Ramirez-Ortiz const char *boot_hyper160 = "HyperFlash(150MHz)"; 3827e532c4bSJorge Ramirez-Ortiz #else 3837e532c4bSJorge Ramirez-Ortiz const char *boot_hyper160 = "HyperFlash(160MHz)"; 3847e532c4bSJorge Ramirez-Ortiz #endif 3857e532c4bSJorge Ramirez-Ortiz 3867e532c4bSJorge Ramirez-Ortiz reg = mmio_read_32(RCAR_MODEMR); 3877e532c4bSJorge Ramirez-Ortiz boot_dev = reg & MODEMR_BOOT_DEV_MASK; 3887e532c4bSJorge Ramirez-Ortiz boot_cpu = reg & MODEMR_BOOT_CPU_MASK; 3897e532c4bSJorge Ramirez-Ortiz 3907e532c4bSJorge Ramirez-Ortiz bl2_cpg_init(); 3917e532c4bSJorge Ramirez-Ortiz 3927e532c4bSJorge Ramirez-Ortiz if (boot_cpu == MODEMR_BOOT_CPU_CA57 || 3937e532c4bSJorge Ramirez-Ortiz boot_cpu == MODEMR_BOOT_CPU_CA53) { 3947e532c4bSJorge Ramirez-Ortiz rcar_pfc_init(); 3957e532c4bSJorge Ramirez-Ortiz /* console configuration (platform specific) done in driver */ 3967e532c4bSJorge Ramirez-Ortiz console_init(0, 0, 0); 3977e532c4bSJorge Ramirez-Ortiz } 3987e532c4bSJorge Ramirez-Ortiz 3997e532c4bSJorge Ramirez-Ortiz plat_rcar_gic_driver_init(); 4007e532c4bSJorge Ramirez-Ortiz plat_rcar_gic_init(); 4017e532c4bSJorge Ramirez-Ortiz rcar_swdt_init(); 4027e532c4bSJorge Ramirez-Ortiz 4037e532c4bSJorge Ramirez-Ortiz /* FIQ interrupts are taken to EL3 */ 4047e532c4bSJorge Ramirez-Ortiz write_scr_el3(read_scr_el3() | SCR_FIQ_BIT); 4057e532c4bSJorge Ramirez-Ortiz 4067e532c4bSJorge Ramirez-Ortiz write_daifclr(DAIF_FIQ_BIT); 4077e532c4bSJorge Ramirez-Ortiz 4087e532c4bSJorge Ramirez-Ortiz reg = read_midr(); 4097e532c4bSJorge Ramirez-Ortiz midr = reg & (MIDR_PN_MASK << MIDR_PN_SHIFT); 4107e532c4bSJorge Ramirez-Ortiz switch (midr) { 4117e532c4bSJorge Ramirez-Ortiz case MIDR_CA57: 4127e532c4bSJorge Ramirez-Ortiz str = cpu_ca57; 4137e532c4bSJorge Ramirez-Ortiz break; 4147e532c4bSJorge Ramirez-Ortiz case MIDR_CA53: 4157e532c4bSJorge Ramirez-Ortiz str = cpu_ca53; 4167e532c4bSJorge Ramirez-Ortiz break; 4177e532c4bSJorge Ramirez-Ortiz default: 4187e532c4bSJorge Ramirez-Ortiz str = unknown; 4197e532c4bSJorge Ramirez-Ortiz break; 4207e532c4bSJorge Ramirez-Ortiz } 4217e532c4bSJorge Ramirez-Ortiz 4227e532c4bSJorge Ramirez-Ortiz NOTICE("BL2: R-Car Gen3 Initial Program Loader(%s) Rev.%s\n", str, 4237e532c4bSJorge Ramirez-Ortiz version_of_renesas); 4247e532c4bSJorge Ramirez-Ortiz 4257e532c4bSJorge Ramirez-Ortiz reg = mmio_read_32(RCAR_PRR); 4267e532c4bSJorge Ramirez-Ortiz product_cut = reg & (RCAR_PRODUCT_MASK | RCAR_CUT_MASK); 4277e532c4bSJorge Ramirez-Ortiz product = reg & RCAR_PRODUCT_MASK; 4287e532c4bSJorge Ramirez-Ortiz 4297e532c4bSJorge Ramirez-Ortiz switch (product) { 4307e532c4bSJorge Ramirez-Ortiz case RCAR_PRODUCT_H3: 4317e532c4bSJorge Ramirez-Ortiz str = product_h3; 4327e532c4bSJorge Ramirez-Ortiz break; 4337e532c4bSJorge Ramirez-Ortiz case RCAR_PRODUCT_M3: 4347e532c4bSJorge Ramirez-Ortiz str = product_m3; 4357e532c4bSJorge Ramirez-Ortiz break; 4367e532c4bSJorge Ramirez-Ortiz case RCAR_PRODUCT_M3N: 4377e532c4bSJorge Ramirez-Ortiz str = product_m3n; 4387e532c4bSJorge Ramirez-Ortiz break; 4397e532c4bSJorge Ramirez-Ortiz case RCAR_PRODUCT_E3: 4407e532c4bSJorge Ramirez-Ortiz str = product_e3; 4417e532c4bSJorge Ramirez-Ortiz break; 4427e532c4bSJorge Ramirez-Ortiz default: 4437e532c4bSJorge Ramirez-Ortiz str = unknown; 4447e532c4bSJorge Ramirez-Ortiz break; 4457e532c4bSJorge Ramirez-Ortiz } 4467e532c4bSJorge Ramirez-Ortiz 4477e532c4bSJorge Ramirez-Ortiz if (RCAR_PRODUCT_M3_CUT11 == product_cut) { 4487e532c4bSJorge Ramirez-Ortiz NOTICE("BL2: PRR is R-Car %s Ver.1.1 / Ver.1.2\n", str); 4497e532c4bSJorge Ramirez-Ortiz } else { 4507e532c4bSJorge Ramirez-Ortiz major = (reg & RCAR_MAJOR_MASK) >> RCAR_MAJOR_SHIFT; 4517e532c4bSJorge Ramirez-Ortiz major = major + RCAR_MAJOR_OFFSET; 4527e532c4bSJorge Ramirez-Ortiz minor = reg & RCAR_MINOR_MASK; 4537e532c4bSJorge Ramirez-Ortiz NOTICE("BL2: PRR is R-Car %s Ver.%d.%d\n", str, major, minor); 4547e532c4bSJorge Ramirez-Ortiz } 4557e532c4bSJorge Ramirez-Ortiz 4567e532c4bSJorge Ramirez-Ortiz if (product == RCAR_PRODUCT_E3) { 4577e532c4bSJorge Ramirez-Ortiz reg = mmio_read_32(RCAR_MODEMR); 4587e532c4bSJorge Ramirez-Ortiz sscg = reg & RCAR_SSCG_MASK; 4597e532c4bSJorge Ramirez-Ortiz str = sscg == RCAR_SSCG_ENABLE ? sscg_on : sscg_off; 4607e532c4bSJorge Ramirez-Ortiz NOTICE("BL2: %s\n", str); 4617e532c4bSJorge Ramirez-Ortiz } 4627e532c4bSJorge Ramirez-Ortiz 4637e532c4bSJorge Ramirez-Ortiz rcar_get_board_type(&type, &rev); 4647e532c4bSJorge Ramirez-Ortiz 4657e532c4bSJorge Ramirez-Ortiz switch (type) { 4667e532c4bSJorge Ramirez-Ortiz case BOARD_SALVATOR_X: 4677e532c4bSJorge Ramirez-Ortiz case BOARD_KRIEK: 4687e532c4bSJorge Ramirez-Ortiz case BOARD_STARTER_KIT: 4697e532c4bSJorge Ramirez-Ortiz case BOARD_SALVATOR_XS: 4707e532c4bSJorge Ramirez-Ortiz case BOARD_EBISU: 4717e532c4bSJorge Ramirez-Ortiz case BOARD_STARTER_KIT_PRE: 4727e532c4bSJorge Ramirez-Ortiz case BOARD_EBISU_4D: 4737e532c4bSJorge Ramirez-Ortiz break; 4747e532c4bSJorge Ramirez-Ortiz default: 4757e532c4bSJorge Ramirez-Ortiz type = BOARD_UNKNOWN; 4767e532c4bSJorge Ramirez-Ortiz break; 4777e532c4bSJorge Ramirez-Ortiz } 4787e532c4bSJorge Ramirez-Ortiz 4797e532c4bSJorge Ramirez-Ortiz if (type == BOARD_UNKNOWN || rev == BOARD_REV_UNKNOWN) 4807e532c4bSJorge Ramirez-Ortiz NOTICE("BL2: Board is %s Rev.---\n", GET_BOARD_NAME(type)); 4817e532c4bSJorge Ramirez-Ortiz else { 4827e532c4bSJorge Ramirez-Ortiz NOTICE("BL2: Board is %s Rev.%d.%d\n", 4837e532c4bSJorge Ramirez-Ortiz GET_BOARD_NAME(type), 4847e532c4bSJorge Ramirez-Ortiz GET_BOARD_MAJOR(rev), GET_BOARD_MINOR(rev)); 4857e532c4bSJorge Ramirez-Ortiz } 4867e532c4bSJorge Ramirez-Ortiz 4877e532c4bSJorge Ramirez-Ortiz #if RCAR_LSI != RCAR_AUTO 4887e532c4bSJorge Ramirez-Ortiz if (product != TARGET_PRODUCT) { 4897e532c4bSJorge Ramirez-Ortiz ERROR("BL2: IPL was been built for the %s.\n", TARGET_NAME); 4907e532c4bSJorge Ramirez-Ortiz ERROR("BL2: Please write the correct IPL to flash memory.\n"); 4917e532c4bSJorge Ramirez-Ortiz panic(); 4927e532c4bSJorge Ramirez-Ortiz } 4937e532c4bSJorge Ramirez-Ortiz #endif 4947e532c4bSJorge Ramirez-Ortiz rcar_avs_init(); 4957e532c4bSJorge Ramirez-Ortiz rcar_avs_setting(); 4967e532c4bSJorge Ramirez-Ortiz 4977e532c4bSJorge Ramirez-Ortiz switch (boot_dev) { 4987e532c4bSJorge Ramirez-Ortiz case MODEMR_BOOT_DEV_HYPERFLASH160: 4997e532c4bSJorge Ramirez-Ortiz str = boot_hyper160; 5007e532c4bSJorge Ramirez-Ortiz break; 5017e532c4bSJorge Ramirez-Ortiz case MODEMR_BOOT_DEV_HYPERFLASH80: 5027e532c4bSJorge Ramirez-Ortiz str = boot_hyper80; 5037e532c4bSJorge Ramirez-Ortiz break; 5047e532c4bSJorge Ramirez-Ortiz case MODEMR_BOOT_DEV_QSPI_FLASH40: 5057e532c4bSJorge Ramirez-Ortiz str = boot_qspi40; 5067e532c4bSJorge Ramirez-Ortiz break; 5077e532c4bSJorge Ramirez-Ortiz case MODEMR_BOOT_DEV_QSPI_FLASH80: 5087e532c4bSJorge Ramirez-Ortiz str = boot_qspi80; 5097e532c4bSJorge Ramirez-Ortiz break; 5107e532c4bSJorge Ramirez-Ortiz case MODEMR_BOOT_DEV_EMMC_25X1: 5117e532c4bSJorge Ramirez-Ortiz str = boot_emmc25x1; 5127e532c4bSJorge Ramirez-Ortiz break; 5137e532c4bSJorge Ramirez-Ortiz case MODEMR_BOOT_DEV_EMMC_50X8: 5147e532c4bSJorge Ramirez-Ortiz str = boot_emmc50x8; 5157e532c4bSJorge Ramirez-Ortiz break; 5167e532c4bSJorge Ramirez-Ortiz default: 5177e532c4bSJorge Ramirez-Ortiz str = unknown; 5187e532c4bSJorge Ramirez-Ortiz break; 5197e532c4bSJorge Ramirez-Ortiz } 5207e532c4bSJorge Ramirez-Ortiz NOTICE("BL2: Boot device is %s\n", str); 5217e532c4bSJorge Ramirez-Ortiz 5227e532c4bSJorge Ramirez-Ortiz rcar_avs_setting(); 5237e532c4bSJorge Ramirez-Ortiz reg = rcar_rom_get_lcs(&lcs); 5247e532c4bSJorge Ramirez-Ortiz if (reg) { 5257e532c4bSJorge Ramirez-Ortiz str = unknown; 5267e532c4bSJorge Ramirez-Ortiz goto lcm_state; 5277e532c4bSJorge Ramirez-Ortiz } 5287e532c4bSJorge Ramirez-Ortiz 5297e532c4bSJorge Ramirez-Ortiz switch (lcs) { 5307e532c4bSJorge Ramirez-Ortiz case LCS_CM: 5317e532c4bSJorge Ramirez-Ortiz str = lcs_cm; 5327e532c4bSJorge Ramirez-Ortiz break; 5337e532c4bSJorge Ramirez-Ortiz case LCS_DM: 5347e532c4bSJorge Ramirez-Ortiz str = lcs_dm; 5357e532c4bSJorge Ramirez-Ortiz break; 5367e532c4bSJorge Ramirez-Ortiz case LCS_SD: 5377e532c4bSJorge Ramirez-Ortiz str = lcs_sd; 5387e532c4bSJorge Ramirez-Ortiz break; 5397e532c4bSJorge Ramirez-Ortiz case LCS_SE: 5407e532c4bSJorge Ramirez-Ortiz str = lcs_secure; 5417e532c4bSJorge Ramirez-Ortiz break; 5427e532c4bSJorge Ramirez-Ortiz case LCS_FA: 5437e532c4bSJorge Ramirez-Ortiz str = lcs_fa; 5447e532c4bSJorge Ramirez-Ortiz break; 5457e532c4bSJorge Ramirez-Ortiz default: 5467e532c4bSJorge Ramirez-Ortiz str = unknown; 5477e532c4bSJorge Ramirez-Ortiz break; 5487e532c4bSJorge Ramirez-Ortiz } 5497e532c4bSJorge Ramirez-Ortiz 5507e532c4bSJorge Ramirez-Ortiz lcm_state: 5517e532c4bSJorge Ramirez-Ortiz NOTICE("BL2: LCM state is %s\n", str); 5527e532c4bSJorge Ramirez-Ortiz 5537e532c4bSJorge Ramirez-Ortiz rcar_avs_end(); 5547e532c4bSJorge Ramirez-Ortiz is_ddr_backup_mode(); 5557e532c4bSJorge Ramirez-Ortiz 5567e532c4bSJorge Ramirez-Ortiz bl2_tzram_layout.total_base = BL31_BASE; 5577e532c4bSJorge Ramirez-Ortiz bl2_tzram_layout.total_size = BL31_LIMIT - BL31_BASE; 5587e532c4bSJorge Ramirez-Ortiz 5597e532c4bSJorge Ramirez-Ortiz if (boot_cpu == MODEMR_BOOT_CPU_CA57 || 5607e532c4bSJorge Ramirez-Ortiz boot_cpu == MODEMR_BOOT_CPU_CA53) { 5617e532c4bSJorge Ramirez-Ortiz ret = rcar_dram_init(); 5627e532c4bSJorge Ramirez-Ortiz if (ret) { 5637e532c4bSJorge Ramirez-Ortiz NOTICE("BL2: Failed to DRAM initialize (%d).\n", ret); 5647e532c4bSJorge Ramirez-Ortiz panic(); 5657e532c4bSJorge Ramirez-Ortiz } 5667e532c4bSJorge Ramirez-Ortiz rcar_qos_init(); 5677e532c4bSJorge Ramirez-Ortiz } 5687e532c4bSJorge Ramirez-Ortiz 569*10b7a4aeSMarek Vasut /* Print DRAM layout */ 570*10b7a4aeSMarek Vasut bl2_advertise_dram_size(product); 571*10b7a4aeSMarek Vasut 5727e532c4bSJorge Ramirez-Ortiz if (boot_dev == MODEMR_BOOT_DEV_EMMC_25X1 || 5737e532c4bSJorge Ramirez-Ortiz boot_dev == MODEMR_BOOT_DEV_EMMC_50X8) { 5747e532c4bSJorge Ramirez-Ortiz if (rcar_emmc_init() != EMMC_SUCCESS) { 5757e532c4bSJorge Ramirez-Ortiz NOTICE("BL2: Failed to eMMC driver initialize.\n"); 5767e532c4bSJorge Ramirez-Ortiz panic(); 5777e532c4bSJorge Ramirez-Ortiz } 5787e532c4bSJorge Ramirez-Ortiz rcar_emmc_memcard_power(EMMC_POWER_ON); 5797e532c4bSJorge Ramirez-Ortiz if (rcar_emmc_mount() != EMMC_SUCCESS) { 5807e532c4bSJorge Ramirez-Ortiz NOTICE("BL2: Failed to eMMC mount operation.\n"); 5817e532c4bSJorge Ramirez-Ortiz panic(); 5827e532c4bSJorge Ramirez-Ortiz } 5837e532c4bSJorge Ramirez-Ortiz } else { 5847e532c4bSJorge Ramirez-Ortiz rcar_rpc_init(); 5857e532c4bSJorge Ramirez-Ortiz rcar_dma_init(); 5867e532c4bSJorge Ramirez-Ortiz } 5877e532c4bSJorge Ramirez-Ortiz 5887e532c4bSJorge Ramirez-Ortiz reg = mmio_read_32(RST_WDTRSTCR); 5897e532c4bSJorge Ramirez-Ortiz reg &= ~WDTRSTCR_RWDT_RSTMSK; 5907e532c4bSJorge Ramirez-Ortiz reg |= WDTRSTCR_PASSWORD; 5917e532c4bSJorge Ramirez-Ortiz mmio_write_32(RST_WDTRSTCR, reg); 5927e532c4bSJorge Ramirez-Ortiz 5937e532c4bSJorge Ramirez-Ortiz mmio_write_32(CPG_CPGWPR, CPGWPR_PASSWORD); 5947e532c4bSJorge Ramirez-Ortiz mmio_write_32(CPG_CPGWPCR, CPGWPCR_PASSWORD); 5957e532c4bSJorge Ramirez-Ortiz 5967e532c4bSJorge Ramirez-Ortiz reg = mmio_read_32(RCAR_PRR); 5977e532c4bSJorge Ramirez-Ortiz if ((reg & RCAR_CPU_MASK_CA57) == RCAR_CPU_HAVE_CA57) 5987e532c4bSJorge Ramirez-Ortiz mmio_write_32(CPG_CA57DBGRCR, 5997e532c4bSJorge Ramirez-Ortiz DBGCPUPREN | mmio_read_32(CPG_CA57DBGRCR)); 6007e532c4bSJorge Ramirez-Ortiz 6017e532c4bSJorge Ramirez-Ortiz if ((reg & RCAR_CPU_MASK_CA53) == RCAR_CPU_HAVE_CA53) 6027e532c4bSJorge Ramirez-Ortiz mmio_write_32(CPG_CA53DBGRCR, 6037e532c4bSJorge Ramirez-Ortiz DBGCPUPREN | mmio_read_32(CPG_CA53DBGRCR)); 6047e532c4bSJorge Ramirez-Ortiz 6057e532c4bSJorge Ramirez-Ortiz if (product_cut == RCAR_PRODUCT_H3_CUT10) { 6067e532c4bSJorge Ramirez-Ortiz reg = mmio_read_32(CPG_PLL2CR); 6077e532c4bSJorge Ramirez-Ortiz reg &= ~((uint32_t) 1 << 5); 6087e532c4bSJorge Ramirez-Ortiz mmio_write_32(CPG_PLL2CR, reg); 6097e532c4bSJorge Ramirez-Ortiz 6107e532c4bSJorge Ramirez-Ortiz reg = mmio_read_32(CPG_PLL4CR); 6117e532c4bSJorge Ramirez-Ortiz reg &= ~((uint32_t) 1 << 5); 6127e532c4bSJorge Ramirez-Ortiz mmio_write_32(CPG_PLL4CR, reg); 6137e532c4bSJorge Ramirez-Ortiz 6147e532c4bSJorge Ramirez-Ortiz reg = mmio_read_32(CPG_PLL0CR); 6157e532c4bSJorge Ramirez-Ortiz reg &= ~((uint32_t) 1 << 12); 6167e532c4bSJorge Ramirez-Ortiz mmio_write_32(CPG_PLL0CR, reg); 6177e532c4bSJorge Ramirez-Ortiz } 6187e532c4bSJorge Ramirez-Ortiz #if (RCAR_LOSSY_ENABLE == 1) 6197e532c4bSJorge Ramirez-Ortiz NOTICE("BL2: Lossy Decomp areas\n"); 6207e532c4bSJorge Ramirez-Ortiz bl2_lossy_setting(0, LOSSY_ST_ADDR0, LOSSY_END_ADDR0, 6217e532c4bSJorge Ramirez-Ortiz LOSSY_FMT0, LOSSY_ENA_DIS0); 6227e532c4bSJorge Ramirez-Ortiz bl2_lossy_setting(1, LOSSY_ST_ADDR1, LOSSY_END_ADDR1, 6237e532c4bSJorge Ramirez-Ortiz LOSSY_FMT1, LOSSY_ENA_DIS1); 6247e532c4bSJorge Ramirez-Ortiz bl2_lossy_setting(2, LOSSY_ST_ADDR2, LOSSY_END_ADDR2, 6257e532c4bSJorge Ramirez-Ortiz LOSSY_FMT2, LOSSY_ENA_DIS2); 6267e532c4bSJorge Ramirez-Ortiz #endif 6277e532c4bSJorge Ramirez-Ortiz 6287e532c4bSJorge Ramirez-Ortiz if (boot_dev == MODEMR_BOOT_DEV_EMMC_25X1 || 6297e532c4bSJorge Ramirez-Ortiz boot_dev == MODEMR_BOOT_DEV_EMMC_50X8) 6307e532c4bSJorge Ramirez-Ortiz rcar_io_emmc_setup(); 6317e532c4bSJorge Ramirez-Ortiz else 6327e532c4bSJorge Ramirez-Ortiz rcar_io_setup(); 6337e532c4bSJorge Ramirez-Ortiz } 6347e532c4bSJorge Ramirez-Ortiz 6357e532c4bSJorge Ramirez-Ortiz void bl2_el3_plat_arch_setup(void) 6367e532c4bSJorge Ramirez-Ortiz { 6377e532c4bSJorge Ramirez-Ortiz #if RCAR_BL2_DCACHE == 1 6387e532c4bSJorge Ramirez-Ortiz NOTICE("BL2: D-Cache enable\n"); 6397e532c4bSJorge Ramirez-Ortiz rcar_configure_mmu_el3(BL2_BASE, 6407e532c4bSJorge Ramirez-Ortiz RCAR_SYSRAM_LIMIT - BL2_BASE, 6417e532c4bSJorge Ramirez-Ortiz BL2_RO_BASE, BL2_RO_LIMIT 6427e532c4bSJorge Ramirez-Ortiz #if USE_COHERENT_MEM 6437e532c4bSJorge Ramirez-Ortiz , BL2_COHERENT_RAM_BASE, BL2_COHERENT_RAM_LIMIT 6447e532c4bSJorge Ramirez-Ortiz #endif 6457e532c4bSJorge Ramirez-Ortiz ); 6467e532c4bSJorge Ramirez-Ortiz #endif 6477e532c4bSJorge Ramirez-Ortiz } 6487e532c4bSJorge Ramirez-Ortiz 6497e532c4bSJorge Ramirez-Ortiz void bl2_platform_setup(void) 6507e532c4bSJorge Ramirez-Ortiz { 6517e532c4bSJorge Ramirez-Ortiz 6527e532c4bSJorge Ramirez-Ortiz } 653