1499c2713SBiju Das /* 2499c2713SBiju Das * Copyright (c) 2013-2014, ARM Limited and Contributors. All rights reserved. 3499c2713SBiju Das * Copyright (c) 2015-2020, Renesas Electronics Corporation. All rights reserved. 4499c2713SBiju Das * 5499c2713SBiju Das * SPDX-License-Identifier: BSD-3-Clause 6499c2713SBiju Das */ 7499c2713SBiju Das 8499c2713SBiju Das #include <stddef.h> 9499c2713SBiju Das 10499c2713SBiju Das #include <arch.h> 11499c2713SBiju Das #include <arch_helpers.h> 12499c2713SBiju Das #include <bl31/bl31.h> 13499c2713SBiju Das #include <common/bl_common.h> 14499c2713SBiju Das #include <common/debug.h> 15499c2713SBiju Das #include <drivers/arm/cci.h> 16499c2713SBiju Das #include <drivers/console.h> 17499c2713SBiju Das #include <lib/mmio.h> 18499c2713SBiju Das #include <plat/common/platform.h> 19499c2713SBiju Das 20499c2713SBiju Das #include "pwrc.h" 21499c2713SBiju Das #include "rcar_def.h" 22499c2713SBiju Das #include "rcar_private.h" 23499c2713SBiju Das #include "rcar_version.h" 24499c2713SBiju Das 25499c2713SBiju Das static const uint64_t BL31_RO_BASE = BL_CODE_BASE; 26499c2713SBiju Das static const uint64_t BL31_RO_LIMIT = BL_CODE_END; 27499c2713SBiju Das 28499c2713SBiju Das #if USE_COHERENT_MEM 29499c2713SBiju Das static const uint64_t BL31_COHERENT_RAM_BASE = BL_COHERENT_RAM_BASE; 30499c2713SBiju Das static const uint64_t BL31_COHERENT_RAM_LIMIT = BL_COHERENT_RAM_END; 31499c2713SBiju Das #endif /* USE_COHERENT_MEM */ 32499c2713SBiju Das 33499c2713SBiju Das extern void plat_rcar_gic_driver_init(void); 34499c2713SBiju Das extern void plat_rcar_gic_init(void); 35499c2713SBiju Das 36499c2713SBiju Das u_register_t rcar_boot_mpidr; 37499c2713SBiju Das 38499c2713SBiju Das static int cci_map[] = { 39499c2713SBiju Das CCI500_CLUSTER0_SL_IFACE_IX_FOR_M3, 40499c2713SBiju Das CCI500_CLUSTER1_SL_IFACE_IX_FOR_M3 41499c2713SBiju Das }; 42499c2713SBiju Das 43499c2713SBiju Das void plat_cci_init(void) 44499c2713SBiju Das { 45499c2713SBiju Das uint32_t prd; 46499c2713SBiju Das 47499c2713SBiju Das prd = mmio_read_32(RCAR_PRR) & (PRR_PRODUCT_MASK | PRR_CUT_MASK); 48499c2713SBiju Das 49499c2713SBiju Das if (PRR_PRODUCT_H3_CUT10 == prd || PRR_PRODUCT_H3_CUT11 == prd) { 50499c2713SBiju Das cci_map[0U] = CCI500_CLUSTER0_SL_IFACE_IX; 51499c2713SBiju Das cci_map[1U] = CCI500_CLUSTER1_SL_IFACE_IX; 52499c2713SBiju Das } 53499c2713SBiju Das 54499c2713SBiju Das cci_init(RCAR_CCI_BASE, cci_map, ARRAY_SIZE(cci_map)); 55499c2713SBiju Das } 56499c2713SBiju Das 57499c2713SBiju Das void plat_cci_enable(void) 58499c2713SBiju Das { 59499c2713SBiju Das cci_enable_snoop_dvm_reqs(MPIDR_AFFLVL1_VAL(read_mpidr())); 60499c2713SBiju Das } 61499c2713SBiju Das 62499c2713SBiju Das void plat_cci_disable(void) 63499c2713SBiju Das { 64499c2713SBiju Das cci_disable_snoop_dvm_reqs(MPIDR_AFFLVL1_VAL(read_mpidr())); 65499c2713SBiju Das } 66499c2713SBiju Das 67499c2713SBiju Das struct entry_point_info *bl31_plat_get_next_image_ep_info(uint32_t type) 68499c2713SBiju Das { 69499c2713SBiju Das bl2_to_bl31_params_mem_t *from_bl2 = (bl2_to_bl31_params_mem_t *) 70499c2713SBiju Das PARAMS_BASE; 71499c2713SBiju Das entry_point_info_t *next_image_info; 72499c2713SBiju Das 73499c2713SBiju Das next_image_info = (type == NON_SECURE) ? 74499c2713SBiju Das &from_bl2->bl33_ep_info : &from_bl2->bl32_ep_info; 75499c2713SBiju Das 76499c2713SBiju Das return next_image_info->pc ? next_image_info : NULL; 77499c2713SBiju Das } 78499c2713SBiju Das 79499c2713SBiju Das void bl31_early_platform_setup2(u_register_t arg0, u_register_t arg1, 80499c2713SBiju Das u_register_t arg2, u_register_t arg3) 81499c2713SBiju Das { 82499c2713SBiju Das rcar_console_runtime_init(); 83499c2713SBiju Das 84499c2713SBiju Das NOTICE("BL3-1 : Rev.%s\n", version_of_renesas); 85499c2713SBiju Das 86499c2713SBiju Das #if RCAR_LSI != RCAR_D3 87499c2713SBiju Das if (rcar_pwrc_get_cluster() == RCAR_CLUSTER_A53A57) { 88499c2713SBiju Das plat_cci_init(); 89499c2713SBiju Das plat_cci_enable(); 90499c2713SBiju Das } 91499c2713SBiju Das #endif /* RCAR_LSI != RCAR_D3 */ 92499c2713SBiju Das } 93499c2713SBiju Das 94499c2713SBiju Das void bl31_plat_arch_setup(void) 95499c2713SBiju Das { 96499c2713SBiju Das rcar_configure_mmu_el3(BL31_BASE, 97499c2713SBiju Das BL31_LIMIT - BL31_BASE, 98499c2713SBiju Das BL31_RO_BASE, BL31_RO_LIMIT 99499c2713SBiju Das #if USE_COHERENT_MEM 100499c2713SBiju Das , BL31_COHERENT_RAM_BASE, BL31_COHERENT_RAM_LIMIT 101499c2713SBiju Das #endif /* USE_COHERENT_MEM */ 102499c2713SBiju Das ); 103499c2713SBiju Das rcar_pwrc_code_copy_to_system_ram(); 104499c2713SBiju Das } 105499c2713SBiju Das 106499c2713SBiju Das void bl31_platform_setup(void) 107499c2713SBiju Das { 108499c2713SBiju Das plat_rcar_gic_driver_init(); 109499c2713SBiju Das plat_rcar_gic_init(); 110499c2713SBiju Das 111499c2713SBiju Das /* enable the system level generic timer */ 112499c2713SBiju Das mmio_write_32(RCAR_CNTC_BASE + CNTCR_OFF, CNTCR_FCREQ(U(0)) | CNTCR_EN); 113499c2713SBiju Das 114499c2713SBiju Das rcar_pwrc_setup(); 115499c2713SBiju Das #if 0 116499c2713SBiju Das /* 117499c2713SBiju Das * TODO: there is a broad number of rcar-gen3 SoC configurations; to 118499c2713SBiju Das * support all of them, Renesas use the pwrc driver to discover what 119499c2713SBiju Das * cores are on/off before announcing the topology. 120499c2713SBiju Das * This code hasnt been ported yet 121499c2713SBiju Das */ 122499c2713SBiju Das 123499c2713SBiju Das rcar_setup_topology(); 124499c2713SBiju Das #endif 125499c2713SBiju Das 126499c2713SBiju Das /* 127499c2713SBiju Das * mask should match the kernel's MPIDR_HWID_BITMASK so the core can be 128499c2713SBiju Das * identified during cpuhotplug (check the kernel's psci migrate set of 129499c2713SBiju Das * functions 130499c2713SBiju Das */ 131499c2713SBiju Das rcar_boot_mpidr = read_mpidr_el1() & 0x0000ffffU; 132*d9912cf3STakuya Sakata rcar_pwrc_all_disable_interrupt_wakeup(); 133499c2713SBiju Das } 134