1*499c2713SBiju Das /* 2*499c2713SBiju Das * Copyright (c) 2013-2014, ARM Limited and Contributors. All rights reserved. 3*499c2713SBiju Das * Copyright (c) 2015-2020, Renesas Electronics Corporation. All rights reserved. 4*499c2713SBiju Das * 5*499c2713SBiju Das * SPDX-License-Identifier: BSD-3-Clause 6*499c2713SBiju Das */ 7*499c2713SBiju Das 8*499c2713SBiju Das #include <stddef.h> 9*499c2713SBiju Das 10*499c2713SBiju Das #include <arch.h> 11*499c2713SBiju Das #include <arch_helpers.h> 12*499c2713SBiju Das #include <bl31/bl31.h> 13*499c2713SBiju Das #include <common/bl_common.h> 14*499c2713SBiju Das #include <common/debug.h> 15*499c2713SBiju Das #include <drivers/arm/cci.h> 16*499c2713SBiju Das #include <drivers/console.h> 17*499c2713SBiju Das #include <lib/mmio.h> 18*499c2713SBiju Das #include <plat/common/platform.h> 19*499c2713SBiju Das 20*499c2713SBiju Das #include "pwrc.h" 21*499c2713SBiju Das #include "rcar_def.h" 22*499c2713SBiju Das #include "rcar_private.h" 23*499c2713SBiju Das #include "rcar_version.h" 24*499c2713SBiju Das 25*499c2713SBiju Das static const uint64_t BL31_RO_BASE = BL_CODE_BASE; 26*499c2713SBiju Das static const uint64_t BL31_RO_LIMIT = BL_CODE_END; 27*499c2713SBiju Das 28*499c2713SBiju Das #if USE_COHERENT_MEM 29*499c2713SBiju Das static const uint64_t BL31_COHERENT_RAM_BASE = BL_COHERENT_RAM_BASE; 30*499c2713SBiju Das static const uint64_t BL31_COHERENT_RAM_LIMIT = BL_COHERENT_RAM_END; 31*499c2713SBiju Das #endif /* USE_COHERENT_MEM */ 32*499c2713SBiju Das 33*499c2713SBiju Das extern void plat_rcar_gic_driver_init(void); 34*499c2713SBiju Das extern void plat_rcar_gic_init(void); 35*499c2713SBiju Das 36*499c2713SBiju Das u_register_t rcar_boot_mpidr; 37*499c2713SBiju Das 38*499c2713SBiju Das static int cci_map[] = { 39*499c2713SBiju Das CCI500_CLUSTER0_SL_IFACE_IX_FOR_M3, 40*499c2713SBiju Das CCI500_CLUSTER1_SL_IFACE_IX_FOR_M3 41*499c2713SBiju Das }; 42*499c2713SBiju Das 43*499c2713SBiju Das void plat_cci_init(void) 44*499c2713SBiju Das { 45*499c2713SBiju Das uint32_t prd; 46*499c2713SBiju Das 47*499c2713SBiju Das prd = mmio_read_32(RCAR_PRR) & (PRR_PRODUCT_MASK | PRR_CUT_MASK); 48*499c2713SBiju Das 49*499c2713SBiju Das if (PRR_PRODUCT_H3_CUT10 == prd || PRR_PRODUCT_H3_CUT11 == prd) { 50*499c2713SBiju Das cci_map[0U] = CCI500_CLUSTER0_SL_IFACE_IX; 51*499c2713SBiju Das cci_map[1U] = CCI500_CLUSTER1_SL_IFACE_IX; 52*499c2713SBiju Das } 53*499c2713SBiju Das 54*499c2713SBiju Das cci_init(RCAR_CCI_BASE, cci_map, ARRAY_SIZE(cci_map)); 55*499c2713SBiju Das } 56*499c2713SBiju Das 57*499c2713SBiju Das void plat_cci_enable(void) 58*499c2713SBiju Das { 59*499c2713SBiju Das cci_enable_snoop_dvm_reqs(MPIDR_AFFLVL1_VAL(read_mpidr())); 60*499c2713SBiju Das } 61*499c2713SBiju Das 62*499c2713SBiju Das void plat_cci_disable(void) 63*499c2713SBiju Das { 64*499c2713SBiju Das cci_disable_snoop_dvm_reqs(MPIDR_AFFLVL1_VAL(read_mpidr())); 65*499c2713SBiju Das } 66*499c2713SBiju Das 67*499c2713SBiju Das struct entry_point_info *bl31_plat_get_next_image_ep_info(uint32_t type) 68*499c2713SBiju Das { 69*499c2713SBiju Das bl2_to_bl31_params_mem_t *from_bl2 = (bl2_to_bl31_params_mem_t *) 70*499c2713SBiju Das PARAMS_BASE; 71*499c2713SBiju Das entry_point_info_t *next_image_info; 72*499c2713SBiju Das 73*499c2713SBiju Das next_image_info = (type == NON_SECURE) ? 74*499c2713SBiju Das &from_bl2->bl33_ep_info : &from_bl2->bl32_ep_info; 75*499c2713SBiju Das 76*499c2713SBiju Das return next_image_info->pc ? next_image_info : NULL; 77*499c2713SBiju Das } 78*499c2713SBiju Das 79*499c2713SBiju Das void bl31_early_platform_setup2(u_register_t arg0, u_register_t arg1, 80*499c2713SBiju Das u_register_t arg2, u_register_t arg3) 81*499c2713SBiju Das { 82*499c2713SBiju Das rcar_console_runtime_init(); 83*499c2713SBiju Das 84*499c2713SBiju Das NOTICE("BL3-1 : Rev.%s\n", version_of_renesas); 85*499c2713SBiju Das 86*499c2713SBiju Das #if RCAR_LSI != RCAR_D3 87*499c2713SBiju Das if (rcar_pwrc_get_cluster() == RCAR_CLUSTER_A53A57) { 88*499c2713SBiju Das plat_cci_init(); 89*499c2713SBiju Das plat_cci_enable(); 90*499c2713SBiju Das } 91*499c2713SBiju Das #endif /* RCAR_LSI != RCAR_D3 */ 92*499c2713SBiju Das } 93*499c2713SBiju Das 94*499c2713SBiju Das void bl31_plat_arch_setup(void) 95*499c2713SBiju Das { 96*499c2713SBiju Das rcar_configure_mmu_el3(BL31_BASE, 97*499c2713SBiju Das BL31_LIMIT - BL31_BASE, 98*499c2713SBiju Das BL31_RO_BASE, BL31_RO_LIMIT 99*499c2713SBiju Das #if USE_COHERENT_MEM 100*499c2713SBiju Das , BL31_COHERENT_RAM_BASE, BL31_COHERENT_RAM_LIMIT 101*499c2713SBiju Das #endif /* USE_COHERENT_MEM */ 102*499c2713SBiju Das ); 103*499c2713SBiju Das rcar_pwrc_code_copy_to_system_ram(); 104*499c2713SBiju Das } 105*499c2713SBiju Das 106*499c2713SBiju Das void bl31_platform_setup(void) 107*499c2713SBiju Das { 108*499c2713SBiju Das plat_rcar_gic_driver_init(); 109*499c2713SBiju Das plat_rcar_gic_init(); 110*499c2713SBiju Das 111*499c2713SBiju Das /* enable the system level generic timer */ 112*499c2713SBiju Das mmio_write_32(RCAR_CNTC_BASE + CNTCR_OFF, CNTCR_FCREQ(U(0)) | CNTCR_EN); 113*499c2713SBiju Das 114*499c2713SBiju Das rcar_pwrc_setup(); 115*499c2713SBiju Das #if 0 116*499c2713SBiju Das /* 117*499c2713SBiju Das * TODO: there is a broad number of rcar-gen3 SoC configurations; to 118*499c2713SBiju Das * support all of them, Renesas use the pwrc driver to discover what 119*499c2713SBiju Das * cores are on/off before announcing the topology. 120*499c2713SBiju Das * This code hasnt been ported yet 121*499c2713SBiju Das */ 122*499c2713SBiju Das 123*499c2713SBiju Das rcar_setup_topology(); 124*499c2713SBiju Das #endif 125*499c2713SBiju Das 126*499c2713SBiju Das /* 127*499c2713SBiju Das * mask should match the kernel's MPIDR_HWID_BITMASK so the core can be 128*499c2713SBiju Das * identified during cpuhotplug (check the kernel's psci migrate set of 129*499c2713SBiju Das * functions 130*499c2713SBiju Das */ 131*499c2713SBiju Das rcar_boot_mpidr = read_mpidr_el1() & 0x0000ffffU; 132*499c2713SBiju Das } 133