xref: /rk3399_ARM-atf/plat/renesas/rcar_gen5/plat_topology.c (revision f180a3b7e0a65450ba1c8900079e42babfe0e787)
1*f180a3b7SHieu Nguyen /*
2*f180a3b7SHieu Nguyen  * Copyright (c) 2025, Renesas Electronics Corporation. All rights reserved.
3*f180a3b7SHieu Nguyen  *
4*f180a3b7SHieu Nguyen  * SPDX-License-Identifier: BSD-3-Clause
5*f180a3b7SHieu Nguyen  */
6*f180a3b7SHieu Nguyen 
7*f180a3b7SHieu Nguyen #include <common/debug.h>
8*f180a3b7SHieu Nguyen #include <lib/psci/psci.h>
9*f180a3b7SHieu Nguyen 
10*f180a3b7SHieu Nguyen #include <plat_helpers.h>
11*f180a3b7SHieu Nguyen #include <platform_def.h>
12*f180a3b7SHieu Nguyen #include "rcar_private.h"
13*f180a3b7SHieu Nguyen #include "rcar_scmi_id.h"
14*f180a3b7SHieu Nguyen 
15*f180a3b7SHieu Nguyen const unsigned char *plat_get_power_domain_tree_desc(void)
16*f180a3b7SHieu Nguyen {
17*f180a3b7SHieu Nguyen 	static const unsigned char rcar_power_domain_tree_desc[] = {
18*f180a3b7SHieu Nguyen 		1,
19*f180a3b7SHieu Nguyen 		PLATFORM_CLUSTER_COUNT,
20*f180a3b7SHieu Nguyen 		PLATFORM_CLUSTER0_CORE_COUNT,
21*f180a3b7SHieu Nguyen 		PLATFORM_CLUSTER1_CORE_COUNT,
22*f180a3b7SHieu Nguyen 		PLATFORM_CLUSTER2_CORE_COUNT,
23*f180a3b7SHieu Nguyen 		PLATFORM_CLUSTER3_CORE_COUNT,
24*f180a3b7SHieu Nguyen 		PLATFORM_CLUSTER4_CORE_COUNT,
25*f180a3b7SHieu Nguyen 		PLATFORM_CLUSTER5_CORE_COUNT,
26*f180a3b7SHieu Nguyen 		PLATFORM_CLUSTER6_CORE_COUNT,
27*f180a3b7SHieu Nguyen 		PLATFORM_CLUSTER7_CORE_COUNT
28*f180a3b7SHieu Nguyen 	};
29*f180a3b7SHieu Nguyen 
30*f180a3b7SHieu Nguyen 	return rcar_power_domain_tree_desc;
31*f180a3b7SHieu Nguyen }
32*f180a3b7SHieu Nguyen 
33*f180a3b7SHieu Nguyen /*******************************************************************************
34*f180a3b7SHieu Nguyen  * The array mapping platform core position (implemented by plat_my_core_pos())
35*f180a3b7SHieu Nguyen  * to the SCMI power domain ID implemented by SCP.
36*f180a3b7SHieu Nguyen  ******************************************************************************/
37*f180a3b7SHieu Nguyen const uint32_t plat_css_core_pos_to_scmi_dmn_id_map[] = {
38*f180a3b7SHieu Nguyen 	(SET_SCMI_CHANNEL_ID(0x0) | SCP_POWER_DOMAIN_ID_PD_P_APU_CORE00),
39*f180a3b7SHieu Nguyen 	(SET_SCMI_CHANNEL_ID(0x0) | SCP_POWER_DOMAIN_ID_PD_P_APU_CORE01),
40*f180a3b7SHieu Nguyen 	(SET_SCMI_CHANNEL_ID(0x0) | SCP_POWER_DOMAIN_ID_PD_P_APU_CORE02),
41*f180a3b7SHieu Nguyen 	(SET_SCMI_CHANNEL_ID(0x0) | SCP_POWER_DOMAIN_ID_PD_P_APU_CORE03),
42*f180a3b7SHieu Nguyen 	(SET_SCMI_CHANNEL_ID(0x0) | SCP_POWER_DOMAIN_ID_PD_P_APU_CORE04),
43*f180a3b7SHieu Nguyen 	(SET_SCMI_CHANNEL_ID(0x0) | SCP_POWER_DOMAIN_ID_PD_P_APU_CORE05),
44*f180a3b7SHieu Nguyen 	(SET_SCMI_CHANNEL_ID(0x0) | SCP_POWER_DOMAIN_ID_PD_P_APU_CORE06),
45*f180a3b7SHieu Nguyen 	(SET_SCMI_CHANNEL_ID(0x0) | SCP_POWER_DOMAIN_ID_PD_P_APU_CORE07),
46*f180a3b7SHieu Nguyen 	(SET_SCMI_CHANNEL_ID(0x0) | SCP_POWER_DOMAIN_ID_PD_P_APU_CORE08),
47*f180a3b7SHieu Nguyen 	(SET_SCMI_CHANNEL_ID(0x0) | SCP_POWER_DOMAIN_ID_PD_P_APU_CORE09),
48*f180a3b7SHieu Nguyen 	(SET_SCMI_CHANNEL_ID(0x0) | SCP_POWER_DOMAIN_ID_PD_P_APU_CORE10),
49*f180a3b7SHieu Nguyen 	(SET_SCMI_CHANNEL_ID(0x0) | SCP_POWER_DOMAIN_ID_PD_P_APU_CORE11),
50*f180a3b7SHieu Nguyen 	(SET_SCMI_CHANNEL_ID(0x0) | SCP_POWER_DOMAIN_ID_PD_P_APU_CORE12),
51*f180a3b7SHieu Nguyen 	(SET_SCMI_CHANNEL_ID(0x0) | SCP_POWER_DOMAIN_ID_PD_P_APU_CORE13),
52*f180a3b7SHieu Nguyen 	(SET_SCMI_CHANNEL_ID(0x0) | SCP_POWER_DOMAIN_ID_PD_P_APU_CORE14),
53*f180a3b7SHieu Nguyen 	(SET_SCMI_CHANNEL_ID(0x0) | SCP_POWER_DOMAIN_ID_PD_P_APU_CORE15),
54*f180a3b7SHieu Nguyen 	(SET_SCMI_CHANNEL_ID(0x0) | SCP_POWER_DOMAIN_ID_PD_P_APU_CORE16),
55*f180a3b7SHieu Nguyen 	(SET_SCMI_CHANNEL_ID(0x0) | SCP_POWER_DOMAIN_ID_PD_P_APU_CORE17),
56*f180a3b7SHieu Nguyen 	(SET_SCMI_CHANNEL_ID(0x0) | SCP_POWER_DOMAIN_ID_PD_P_APU_CORE18),
57*f180a3b7SHieu Nguyen 	(SET_SCMI_CHANNEL_ID(0x0) | SCP_POWER_DOMAIN_ID_PD_P_APU_CORE19),
58*f180a3b7SHieu Nguyen 	(SET_SCMI_CHANNEL_ID(0x0) | SCP_POWER_DOMAIN_ID_PD_P_APU_CORE20),
59*f180a3b7SHieu Nguyen 	(SET_SCMI_CHANNEL_ID(0x0) | SCP_POWER_DOMAIN_ID_PD_P_APU_CORE21),
60*f180a3b7SHieu Nguyen 	(SET_SCMI_CHANNEL_ID(0x0) | SCP_POWER_DOMAIN_ID_PD_P_APU_CORE22),
61*f180a3b7SHieu Nguyen 	(SET_SCMI_CHANNEL_ID(0x0) | SCP_POWER_DOMAIN_ID_PD_P_APU_CORE23),
62*f180a3b7SHieu Nguyen 	(SET_SCMI_CHANNEL_ID(0x0) | SCP_POWER_DOMAIN_ID_PD_P_APU_CORE24),
63*f180a3b7SHieu Nguyen 	(SET_SCMI_CHANNEL_ID(0x0) | SCP_POWER_DOMAIN_ID_PD_P_APU_CORE25),
64*f180a3b7SHieu Nguyen 	(SET_SCMI_CHANNEL_ID(0x0) | SCP_POWER_DOMAIN_ID_PD_P_APU_CORE26),
65*f180a3b7SHieu Nguyen 	(SET_SCMI_CHANNEL_ID(0x0) | SCP_POWER_DOMAIN_ID_PD_P_APU_CORE27),
66*f180a3b7SHieu Nguyen 	(SET_SCMI_CHANNEL_ID(0x0) | SCP_POWER_DOMAIN_ID_PD_P_APU_CORE28),
67*f180a3b7SHieu Nguyen 	(SET_SCMI_CHANNEL_ID(0x0) | SCP_POWER_DOMAIN_ID_PD_P_APU_CORE29),
68*f180a3b7SHieu Nguyen 	(SET_SCMI_CHANNEL_ID(0x0) | SCP_POWER_DOMAIN_ID_PD_P_APU_CORE30),
69*f180a3b7SHieu Nguyen 	(SET_SCMI_CHANNEL_ID(0x0) | SCP_POWER_DOMAIN_ID_PD_P_APU_CORE31),
70*f180a3b7SHieu Nguyen };
71*f180a3b7SHieu Nguyen 
72*f180a3b7SHieu Nguyen 
73*f180a3b7SHieu Nguyen int plat_core_pos_by_mpidr(u_register_t mpidr)
74*f180a3b7SHieu Nguyen {
75*f180a3b7SHieu Nguyen 	u_register_t cpu;
76*f180a3b7SHieu Nguyen 
77*f180a3b7SHieu Nguyen 	/* ARMv8.2 arch */
78*f180a3b7SHieu Nguyen 	if ((mpidr & (MPIDR_AFFLVL_MASK << MPIDR_AFF0_SHIFT)) != 0U) {
79*f180a3b7SHieu Nguyen 		return -1;
80*f180a3b7SHieu Nguyen 	}
81*f180a3b7SHieu Nguyen 
82*f180a3b7SHieu Nguyen 	cpu = plat_renesas_calc_core_pos(mpidr);
83*f180a3b7SHieu Nguyen 	if (cpu >= PLATFORM_CORE_COUNT) {
84*f180a3b7SHieu Nguyen 		return -1;
85*f180a3b7SHieu Nguyen 	}
86*f180a3b7SHieu Nguyen 
87*f180a3b7SHieu Nguyen 	return (int)cpu;
88*f180a3b7SHieu Nguyen }
89*f180a3b7SHieu Nguyen 
90*f180a3b7SHieu Nguyen int32_t rcar_cluster_pos_by_mpidr(u_register_t mpidr)
91*f180a3b7SHieu Nguyen {
92*f180a3b7SHieu Nguyen 	u_register_t cluster;
93*f180a3b7SHieu Nguyen 
94*f180a3b7SHieu Nguyen 	/* ARMv8.2 arch */
95*f180a3b7SHieu Nguyen 	if ((mpidr & (MPIDR_AFFLVL_MASK << MPIDR_AFF0_SHIFT)) != 0U) {
96*f180a3b7SHieu Nguyen 		return -1;
97*f180a3b7SHieu Nguyen 	}
98*f180a3b7SHieu Nguyen 
99*f180a3b7SHieu Nguyen 	cluster = MPIDR_AFFLVL2_VAL(mpidr);
100*f180a3b7SHieu Nguyen 	if (cluster >= PLATFORM_CLUSTER_COUNT) {
101*f180a3b7SHieu Nguyen 		return -1;
102*f180a3b7SHieu Nguyen 	}
103*f180a3b7SHieu Nguyen 
104*f180a3b7SHieu Nguyen 	return (int32_t)cluster;
105*f180a3b7SHieu Nguyen }
106*f180a3b7SHieu Nguyen 
107*f180a3b7SHieu Nguyen /* FIXME: Selective counter enablement is mandatory here ! */
108*f180a3b7SHieu Nguyen uint16_t plat_amu_aux_enables[PLATFORM_CORE_COUNT] = {
109*f180a3b7SHieu Nguyen 	0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
110*f180a3b7SHieu Nguyen 	0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
111*f180a3b7SHieu Nguyen 	0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
112*f180a3b7SHieu Nguyen 	0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
113*f180a3b7SHieu Nguyen };
114