xref: /rk3399_ARM-atf/plat/renesas/rcar_gen4/bl31_plat_setup.c (revision b45b5bacb95d0e2d4539a7869c1ccf90da041498)
1*b45b5bacSMarek Vasut /*
2*b45b5bacSMarek Vasut  * Copyright (c) 2013-2025, ARM Limited and Contributors. All rights reserved.
3*b45b5bacSMarek Vasut  * Copyright (c) 2015-2025, Renesas Electronics Corporation. All rights reserved.
4*b45b5bacSMarek Vasut  *
5*b45b5bacSMarek Vasut  * SPDX-License-Identifier: BSD-3-Clause
6*b45b5bacSMarek Vasut  */
7*b45b5bacSMarek Vasut 
8*b45b5bacSMarek Vasut #include <stddef.h>
9*b45b5bacSMarek Vasut 
10*b45b5bacSMarek Vasut #include <arch.h>
11*b45b5bacSMarek Vasut #include <arch_helpers.h>
12*b45b5bacSMarek Vasut #include <bl31/bl31.h>
13*b45b5bacSMarek Vasut #include <common/bl_common.h>
14*b45b5bacSMarek Vasut #include <common/debug.h>
15*b45b5bacSMarek Vasut #include <drivers/arm/cci.h>
16*b45b5bacSMarek Vasut #include <drivers/console.h>
17*b45b5bacSMarek Vasut #include <lib/mmio.h>
18*b45b5bacSMarek Vasut #include "mssr.h"
19*b45b5bacSMarek Vasut #include <plat/arm/common/plat_arm.h>
20*b45b5bacSMarek Vasut #include <plat/common/platform.h>
21*b45b5bacSMarek Vasut #include "ptp.h"
22*b45b5bacSMarek Vasut #include "pwrc.h"
23*b45b5bacSMarek Vasut 
24*b45b5bacSMarek Vasut #include "rcar_def.h"
25*b45b5bacSMarek Vasut #include "rcar_private.h"
26*b45b5bacSMarek Vasut #include "rcar_version.h"
27*b45b5bacSMarek Vasut 
28*b45b5bacSMarek Vasut struct entry_point_info *bl31_plat_get_next_image_ep_info(uint32_t type)
29*b45b5bacSMarek Vasut {
30*b45b5bacSMarek Vasut 	bl2_to_bl31_params_mem_t *from_bl2 =
31*b45b5bacSMarek Vasut 		(bl2_to_bl31_params_mem_t *)PARAMS_BASE;
32*b45b5bacSMarek Vasut 	entry_point_info_t *next_image_info = (type == NON_SECURE) ?
33*b45b5bacSMarek Vasut 					      &from_bl2->bl33_ep_info :
34*b45b5bacSMarek Vasut 					      &from_bl2->bl32_ep_info;
35*b45b5bacSMarek Vasut 
36*b45b5bacSMarek Vasut 	return next_image_info->pc ? next_image_info : NULL;
37*b45b5bacSMarek Vasut }
38*b45b5bacSMarek Vasut 
39*b45b5bacSMarek Vasut void bl31_early_platform_setup2(u_register_t arg0, u_register_t arg1,
40*b45b5bacSMarek Vasut 				u_register_t arg2, u_register_t arg3)
41*b45b5bacSMarek Vasut {
42*b45b5bacSMarek Vasut 	rcar_console_boot_init();
43*b45b5bacSMarek Vasut 
44*b45b5bacSMarek Vasut 	NOTICE("BL3-1 : Rev.%s\n", version_of_renesas);
45*b45b5bacSMarek Vasut }
46*b45b5bacSMarek Vasut 
47*b45b5bacSMarek Vasut void bl31_plat_arch_setup(void)
48*b45b5bacSMarek Vasut {
49*b45b5bacSMarek Vasut 	static const uintptr_t BL31_RO_BASE = BL_CODE_BASE;
50*b45b5bacSMarek Vasut 	static const uintptr_t BL31_RO_LIMIT = BL_CODE_END;
51*b45b5bacSMarek Vasut 
52*b45b5bacSMarek Vasut 	rcar_configure_mmu_el3(BL31_BASE,
53*b45b5bacSMarek Vasut 			       BL31_LIMIT - BL31_BASE,
54*b45b5bacSMarek Vasut 			       BL31_RO_BASE, BL31_RO_LIMIT);
55*b45b5bacSMarek Vasut 
56*b45b5bacSMarek Vasut 	rcar_pwrc_code_copy_to_system_ram();
57*b45b5bacSMarek Vasut }
58*b45b5bacSMarek Vasut 
59*b45b5bacSMarek Vasut static const uintptr_t gicr_base_addrs[2] = {
60*b45b5bacSMarek Vasut 	PLAT_ARM_GICR_BASE,	/* GICR Base address of the primary CPU */
61*b45b5bacSMarek Vasut 	0U			/* Zero Termination */
62*b45b5bacSMarek Vasut };
63*b45b5bacSMarek Vasut 
64*b45b5bacSMarek Vasut void bl31_platform_setup(void)
65*b45b5bacSMarek Vasut {
66*b45b5bacSMarek Vasut 	/* Initialize generic timer */
67*b45b5bacSMarek Vasut 	u_register_t reg_cntfid = RCAR_CNTC_EXTAL;
68*b45b5bacSMarek Vasut 
69*b45b5bacSMarek Vasut 	rcar_mssr_setup();
70*b45b5bacSMarek Vasut 
71*b45b5bacSMarek Vasut 	/* Update memory mapped and register based frequency */
72*b45b5bacSMarek Vasut 	write_cntfrq_el0(reg_cntfid);
73*b45b5bacSMarek Vasut 	mmio_write_32(ARM_SYS_CNTCTL_BASE + CNTFID_OFF, reg_cntfid);
74*b45b5bacSMarek Vasut 
75*b45b5bacSMarek Vasut 	/* Enable the system level generic timer */
76*b45b5bacSMarek Vasut 	mmio_write_32(RCAR_CNTC_BASE + CNTCR_OFF, CNTCR_FCREQ(0) | CNTCR_EN);
77*b45b5bacSMarek Vasut 
78*b45b5bacSMarek Vasut 	gic_set_gicr_frames(gicr_base_addrs);
79*b45b5bacSMarek Vasut 
80*b45b5bacSMarek Vasut 	plat_rcar_scmi_setup();
81*b45b5bacSMarek Vasut 	rcar_pwrc_setup();
82*b45b5bacSMarek Vasut 	rcar_ptp_setup();
83*b45b5bacSMarek Vasut }
84*b45b5bacSMarek Vasut 
85*b45b5bacSMarek Vasut const spd_pm_ops_t rcar_pm = {
86*b45b5bacSMarek Vasut 	.svc_migrate_info = rcar_pwrc_cpu_migrate_info,
87*b45b5bacSMarek Vasut };
88*b45b5bacSMarek Vasut 
89*b45b5bacSMarek Vasut void bl31_plat_runtime_setup(void)
90*b45b5bacSMarek Vasut {
91*b45b5bacSMarek Vasut 	psci_register_spd_pm_hook(&rcar_pm);
92*b45b5bacSMarek Vasut 
93*b45b5bacSMarek Vasut 	rcar_console_runtime_init();
94*b45b5bacSMarek Vasut 	console_switch_state(CONSOLE_FLAG_RUNTIME);
95*b45b5bacSMarek Vasut }
96