aboutsummaryrefslogtreecommitdiff
path: root/plat
diff options
context:
space:
mode:
authorAlexei Fedorov <Alexei.Fedorov@arm.com>2020-06-02 16:35:36 +0100
committerAlexei Fedorov <Alexei.Fedorov@arm.com>2020-06-04 13:30:22 +0000
commit7cc2587da605299e175444350c064c589ad09803 (patch)
treee41b02ff4ba15df29582eaddb8f8e688a6ec4a8f /plat
parent9060e3e68241a3fc1ad8588c20a97218c34c6c68 (diff)
downloadtf-a-tests-7cc2587da605299e175444350c064c589ad09803.tar.gz
TFTF: get FVP platform's topology from build options
This patch extends passing FVP topology parameters with FVP_CLUSTER_COUNT and FVP_MAX_CPUS_PER_CLUSTER build options to match TF-A. The change adds more test options, make FVP platform configuration more flexible and eliminates test errors when the platform is configured with number of CPUs less than default values in the makefile. These build options are documented in 'Arm FVP Platform Specific Build Options' section of 'build-options.rst' document. Signed-off-by: Alexei Fedorov <Alexei.Fedorov@arm.com> Change-Id: I01c6437d468885755a5415804b3688e4c878170d
Diffstat (limited to 'plat')
-rw-r--r--plat/arm/fvp/fvp_def.h12
-rw-r--r--plat/arm/fvp/fvp_topology.c66
-rw-r--r--plat/arm/fvp/platform.mk49
-rw-r--r--plat/common/plat_topology.c6
4 files changed, 121 insertions, 12 deletions
diff --git a/plat/arm/fvp/fvp_def.h b/plat/arm/fvp/fvp_def.h
index 3f016786a..bcd3a7c88 100644
--- a/plat/arm/fvp/fvp_def.h
+++ b/plat/arm/fvp/fvp_def.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2018-2019, Arm Limited. All rights reserved.
+ * Copyright (c) 2018-2020, Arm Limited. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
@@ -16,9 +16,13 @@
/*******************************************************************************
* Cluster Topology definitions
******************************************************************************/
-#define FVP_MAX_CPUS_PER_CLUSTER 8
-/* Currently the highest cluster count on the FVP is 4 (Quad cluster) */
-#define FVP_CLUSTER_COUNT 4
+#ifndef FVP_CLUSTER_COUNT
+#error "FVP_CLUSTER_COUNT is not set in makefile"
+#endif
+
+#ifndef FVP_MAX_CPUS_PER_CLUSTER
+#error "FVP_MAX_CPUS_PER_CLUSTER is not set in makefile"
+#endif
/*******************************************************************************
* FVP memory map related constants
diff --git a/plat/arm/fvp/fvp_topology.c b/plat/arm/fvp/fvp_topology.c
index e13e80144..6dece2865 100644
--- a/plat/arm/fvp/fvp_topology.c
+++ b/plat/arm/fvp/fvp_topology.c
@@ -22,13 +22,60 @@
#define CPU_DEF(cluster, cpu) \
{ cluster, cpu, 0 }, \
{ cluster, cpu, 1 }
-
#else
+/* ST: 1 thread per CPU */
#define CPU_DEF(cluster, cpu) \
{ cluster, cpu }
-#endif
+#endif /* FVP_MAX_PE_PER_CPU */
-/* 8 CPUs per cluster */
+/*
+ * Max CPUs per cluster:
+ * ST: 4
+ * SMT: 8
+ */
+#if (FVP_MAX_CPUS_PER_CLUSTER == 1)
+#define CLUSTER_DEF(cluster) \
+ CPU_DEF(cluster, 0)
+#elif (FVP_MAX_CPUS_PER_CLUSTER == 2)
+#define CLUSTER_DEF(cluster) \
+ CPU_DEF(cluster, 0), \
+ CPU_DEF(cluster, 1)
+#elif (FVP_MAX_CPUS_PER_CLUSTER == 3)
+#define CLUSTER_DEF(cluster) \
+ CPU_DEF(cluster, 0), \
+ CPU_DEF(cluster, 1), \
+ CPU_DEF(cluster, 2)
+#elif (FVP_MAX_CPUS_PER_CLUSTER == 4)
+#define CLUSTER_DEF(cluster) \
+ CPU_DEF(cluster, 0), \
+ CPU_DEF(cluster, 1), \
+ CPU_DEF(cluster, 2), \
+ CPU_DEF(cluster, 3)
+#elif (FVP_MAX_CPUS_PER_CLUSTER == 5)
+#define CLUSTER_DEF(cluster) \
+ CPU_DEF(cluster, 0), \
+ CPU_DEF(cluster, 1), \
+ CPU_DEF(cluster, 2), \
+ CPU_DEF(cluster, 3), \
+ CPU_DEF(cluster, 4)
+#elif (FVP_MAX_CPUS_PER_CLUSTER == 6)
+#define CLUSTER_DEF(cluster) \
+ CPU_DEF(cluster, 0), \
+ CPU_DEF(cluster, 1), \
+ CPU_DEF(cluster, 2), \
+ CPU_DEF(cluster, 3), \
+ CPU_DEF(cluster, 4), \
+ CPU_DEF(cluster, 5)
+#elif (FVP_MAX_CPUS_PER_CLUSTER == 7)
+#define CLUSTER_DEF(cluster) \
+ CPU_DEF(cluster, 0), \
+ CPU_DEF(cluster, 1), \
+ CPU_DEF(cluster, 2), \
+ CPU_DEF(cluster, 3), \
+ CPU_DEF(cluster, 4), \
+ CPU_DEF(cluster, 5), \
+ CPU_DEF(cluster, 6)
+#else
#define CLUSTER_DEF(cluster) \
CPU_DEF(cluster, 0), \
CPU_DEF(cluster, 1), \
@@ -38,6 +85,7 @@
CPU_DEF(cluster, 5), \
CPU_DEF(cluster, 6), \
CPU_DEF(cluster, 7)
+#endif /* FVP_MAX_CPUS_PER_CLUSTER */
static const struct {
unsigned int cluster_id;
@@ -48,9 +96,15 @@ static const struct {
} fvp_base_aemv8a_aemv8a_cores[] = {
/* Clusters 0...3 */
CLUSTER_DEF(0),
+#if (FVP_CLUSTER_COUNT > 1)
CLUSTER_DEF(1),
+#if (FVP_CLUSTER_COUNT > 2)
CLUSTER_DEF(2),
+#if (FVP_CLUSTER_COUNT > 3)
CLUSTER_DEF(3)
+#endif
+#endif
+#endif
};
/*
@@ -70,12 +124,18 @@ static const unsigned char fvp_power_domain_tree_desc[] = {
FVP_CLUSTER_COUNT,
/* Number of children for the first node */
FVP_MAX_CPUS_PER_CLUSTER * FVP_MAX_PE_PER_CPU,
+#if (FVP_CLUSTER_COUNT > 1)
/* Number of children for the second node */
FVP_MAX_CPUS_PER_CLUSTER * FVP_MAX_PE_PER_CPU,
+#if (FVP_CLUSTER_COUNT > 2)
/* Number of children for the third node */
FVP_MAX_CPUS_PER_CLUSTER * FVP_MAX_PE_PER_CPU,
+#if (FVP_CLUSTER_COUNT > 3)
/* Number of children for the fourth node */
FVP_MAX_CPUS_PER_CLUSTER * FVP_MAX_PE_PER_CPU
+#endif
+#endif
+#endif
};
const unsigned char *tftf_plat_get_pwr_domain_tree_desc(void)
diff --git a/plat/arm/fvp/platform.mk b/plat/arm/fvp/platform.mk
index 34f6051a8..b993d725c 100644
--- a/plat/arm/fvp/platform.mk
+++ b/plat/arm/fvp/platform.mk
@@ -1,20 +1,61 @@
#
-# Copyright (c) 2018-2019, Arm Limited. All rights reserved.
+# Copyright (c) 2018-2020, Arm Limited. All rights reserved.
#
# SPDX-License-Identifier: BSD-3-Clause
#
# Default number of threads per CPU on FVP
-FVP_MAX_PE_PER_CPU := 1
+FVP_MAX_PE_PER_CPU := 1
# Check the PE per core count
ifneq ($(FVP_MAX_PE_PER_CPU),$(filter $(FVP_MAX_PE_PER_CPU),1 2))
-$(error "Incorrect FVP_MAX_PE_PER_CPU specified for FVP port")
+$(error "Incorrect FVP_MAX_PE_PER_CPU = ${FVP_MAX_PE_PER_CPU} \
+ specified for FVP port")
endif
-# Pass FVP_MAX_PE_PER_CPU to the build system
+# Default cluster count and number of CPUs per cluster for FVP
+ifeq ($(FVP_MAX_PE_PER_CPU),1)
+FVP_CLUSTER_COUNT := 2
+FVP_MAX_CPUS_PER_CLUSTER := 4
+else
+FVP_CLUSTER_COUNT := 1
+FVP_MAX_CPUS_PER_CLUSTER := 8
+endif
+
+# Check cluster count and number of CPUs per cluster
+ifeq ($(FVP_MAX_PE_PER_CPU),2)
+# Multithreaded CPU: 1 cluster with up to 8 CPUs
+$(eval $(call CREATE_SEQ,CLS,1))
+$(eval $(call CREATE_SEQ,CPU,8))
+else
+# CPU with single thread: max 4 clusters with up to 4 CPUs
+$(eval $(call CREATE_SEQ,CLS,4))
+$(eval $(call CREATE_SEQ,CPU,4))
+endif
+
+# Check cluster count
+ifneq ($(FVP_CLUSTER_COUNT),$(filter $(FVP_CLUSTER_COUNT),$(CLS)))
+ $(error "Incorrect FVP_CLUSTER_COUNT = ${FVP_CLUSTER_COUNT} \
+ specified for FVP port with FVP_MAX_PE_PER_CPU = ${FVP_MAX_PE_PER_CPU}")
+endif
+
+# Check number of CPUs per cluster
+ifneq ($(FVP_MAX_CPUS_PER_CLUSTER),$(filter $(FVP_MAX_CPUS_PER_CLUSTER),$(CPU)))
+ $(error "Incorrect FVP_MAX_CPUS_PER_CLUSTER = ${FVP_MAX_CPUS_PER_CLUSTER} \
+ specified for FVP port with FVP_MAX_PE_PER_CPU = ${FVP_MAX_PE_PER_CPU}")
+endif
+
+# Pass FVP topology definitions to the build system
+$(eval $(call add_define,TFTF_DEFINES,FVP_CLUSTER_COUNT))
+$(eval $(call add_define,TFTF_DEFINES,FVP_MAX_CPUS_PER_CLUSTER))
$(eval $(call add_define,TFTF_DEFINES,FVP_MAX_PE_PER_CPU))
+
+$(eval $(call add_define,NS_BL1U_DEFINES,FVP_CLUSTER_COUNT))
+$(eval $(call add_define,NS_BL1U_DEFINES,FVP_MAX_CPUS_PER_CLUSTER))
$(eval $(call add_define,NS_BL1U_DEFINES,FVP_MAX_PE_PER_CPU))
+
+$(eval $(call add_define,NS_BL2U_DEFINES,FVP_CLUSTER_COUNT))
+$(eval $(call add_define,NS_BL2U_DEFINES,FVP_MAX_CPUS_PER_CLUSTER))
$(eval $(call add_define,NS_BL2U_DEFINES,FVP_MAX_PE_PER_CPU))
PLAT_INCLUDES := -Iplat/arm/fvp/include/
diff --git a/plat/common/plat_topology.c b/plat/common/plat_topology.c
index 33b6e57cc..5ff7a31ec 100644
--- a/plat/common/plat_topology.c
+++ b/plat/common/plat_topology.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2018-2019, Arm Limited. All rights reserved.
+ * Copyright (c) 2018-2020, Arm Limited. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
@@ -364,6 +364,9 @@ unsigned int tftf_find_any_cpu_other_than(unsigned exclude_mpid)
unsigned int tftf_find_random_cpu_other_than(unsigned int exclude_mpid)
{
+#if (PLATFORM_CORE_COUNT == 1)
+ return INVALID_MPID;
+#else
unsigned int cpu_node, mpidr;
unsigned int possible_cpus_cnt = 0;
unsigned int possible_cpus[PLATFORM_CORE_COUNT];
@@ -378,4 +381,5 @@ unsigned int tftf_find_random_cpu_other_than(unsigned int exclude_mpid)
return INVALID_MPID;
return possible_cpus[rand() % possible_cpus_cnt];
+#endif
}