xref: /rk3399_ARM-atf/plat/renesas/common/bl31_plat_setup.c (revision 499c2713f05c602e6f22467c18be30cf9697c42d)
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