xref: /rk3399_ARM-atf/plat/nxp/s32/s32g274ardb2/s32g2_soc.c (revision d0ce1ac58476f546ee87233112b59f4c73e11228)
1e73c3c3aSGhennadi Procopciuc /*
2*e7905128SGhennadi Procopciuc  * Copyright 2024-2025 NXP
3e73c3c3aSGhennadi Procopciuc  *
4e73c3c3aSGhennadi Procopciuc  * SPDX-License-Identifier: BSD-3-Clause
5e73c3c3aSGhennadi Procopciuc  */
6e73c3c3aSGhennadi Procopciuc 
7e73c3c3aSGhennadi Procopciuc #include <plat/common/platform.h>
8e73c3c3aSGhennadi Procopciuc #include <plat_helpers.h>
9e73c3c3aSGhennadi Procopciuc 
plat_get_power_domain_tree_desc(void)10e73c3c3aSGhennadi Procopciuc const unsigned char *plat_get_power_domain_tree_desc(void)
11e73c3c3aSGhennadi Procopciuc {
12e73c3c3aSGhennadi Procopciuc 	static const unsigned char s32g_power_domain_tree_desc[] = {
13e73c3c3aSGhennadi Procopciuc 		PLATFORM_SYSTEM_COUNT,
14e73c3c3aSGhennadi Procopciuc 		PLATFORM_CLUSTER_COUNT,
15e73c3c3aSGhennadi Procopciuc 		PLATFORM_CORE_COUNT / U(2),
16e73c3c3aSGhennadi Procopciuc 		PLATFORM_CORE_COUNT / U(2),
17e73c3c3aSGhennadi Procopciuc 	};
18e73c3c3aSGhennadi Procopciuc 
19e73c3c3aSGhennadi Procopciuc 	return s32g_power_domain_tree_desc;
20e73c3c3aSGhennadi Procopciuc }
21e73c3c3aSGhennadi Procopciuc 
plat_core_pos_by_mpidr(u_register_t mpidr)22e73c3c3aSGhennadi Procopciuc int plat_core_pos_by_mpidr(u_register_t mpidr)
23e73c3c3aSGhennadi Procopciuc {
24e73c3c3aSGhennadi Procopciuc 	unsigned int cluster_id, cpu_id, core_id;
25e73c3c3aSGhennadi Procopciuc 	u_register_t mpidr_priv = mpidr;
26e73c3c3aSGhennadi Procopciuc 
27e73c3c3aSGhennadi Procopciuc 	mpidr_priv &= MPIDR_AFFINITY_MASK;
28e73c3c3aSGhennadi Procopciuc 
29e73c3c3aSGhennadi Procopciuc 	if ((mpidr_priv & ~(MPIDR_CLUSTER_MASK | MPIDR_CPU_MASK)) != 0) {
30e73c3c3aSGhennadi Procopciuc 		return -1;
31e73c3c3aSGhennadi Procopciuc 	}
32e73c3c3aSGhennadi Procopciuc 
33e73c3c3aSGhennadi Procopciuc 	cluster_id = MPIDR_AFFLVL1_VAL(mpidr_priv);
34e73c3c3aSGhennadi Procopciuc 	cpu_id = MPIDR_AFFLVL0_VAL(mpidr_priv);
35e73c3c3aSGhennadi Procopciuc 
36e73c3c3aSGhennadi Procopciuc 	if ((cluster_id >= PLATFORM_CLUSTER_COUNT) ||
37e73c3c3aSGhennadi Procopciuc 	    (cpu_id >= PLATFORM_MAX_CPUS_PER_CLUSTER)) {
38e73c3c3aSGhennadi Procopciuc 		return -1;
39e73c3c3aSGhennadi Procopciuc 	}
40e73c3c3aSGhennadi Procopciuc 
41e73c3c3aSGhennadi Procopciuc 	core_id = s32g2_core_pos_by_mpidr(mpidr_priv);
42e73c3c3aSGhennadi Procopciuc 	if (core_id >= PLATFORM_CORE_COUNT) {
43e73c3c3aSGhennadi Procopciuc 		return -1;
44e73c3c3aSGhennadi Procopciuc 	}
45e73c3c3aSGhennadi Procopciuc 
46e73c3c3aSGhennadi Procopciuc 	return (int)core_id;
47e73c3c3aSGhennadi Procopciuc }
48