You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
401 lines
5.8 KiB
401 lines
5.8 KiB
5 years ago
|
/*
|
||
|
* Copyright (c) 2020, Arm Limited and Contributors. All rights reserved.
|
||
|
*
|
||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||
|
*/
|
||
|
|
||
|
#ifndef FVP_DEFS_DTSI
|
||
|
#define FVP_DEFS_DTSI
|
||
|
|
||
|
/* Set default topology values if not passed from platform's makefile */
|
||
|
#ifndef CLUSTER_COUNT
|
||
|
#ifdef FVP_CLUSTER_COUNT
|
||
|
#define CLUSTER_COUNT FVP_CLUSTER_COUNT
|
||
|
#else
|
||
|
#define CLUSTER_COUNT 2
|
||
|
#endif
|
||
|
#endif /* CLUSTER_COUNT */
|
||
|
|
||
|
#ifndef CPUS_PER_CLUSTER
|
||
|
#ifdef FVP_MAX_CPUS_PER_CLUSTER
|
||
|
#define CPUS_PER_CLUSTER FVP_MAX_CPUS_PER_CLUSTER
|
||
|
#else
|
||
|
#define CPUS_PER_CLUSTER 4
|
||
|
#endif
|
||
|
#endif /* CPUS_PER_CLUSTER */
|
||
|
|
||
|
/* Get platform's topology */
|
||
|
#define CPUS_COUNT (CLUSTER_COUNT * CPUS_PER_CLUSTER)
|
||
|
|
||
|
#define CONCAT(x, y) x##y
|
||
|
#define CONC(x, y) CONCAT(x, y)
|
||
|
|
||
|
/* CPU's cluster */
|
||
|
#define CLS(n) (n / CPUS_PER_CLUSTER)
|
||
|
|
||
|
/* CPU's position in cluster */
|
||
|
#define POS(n) (n % CPUS_PER_CLUSTER)
|
||
|
|
||
|
#define ADR(n, c, p) \
|
||
|
CPU##n:cpu@CONC(c, CONC(p, AFF)) {
|
||
|
|
||
|
#define PRE \
|
||
|
device_type = "cpu"; \
|
||
|
compatible = "arm,armv8";
|
||
|
|
||
|
#ifdef REG_32
|
||
|
/* 32-bit address */
|
||
|
#define REG(c, p) \
|
||
|
reg = <CONC(0x, CONC(c, CONC(p, AFF)))>;
|
||
|
#else
|
||
|
/* 64-bit address */
|
||
|
#define REG(c, p) \
|
||
|
reg = <0x0 CONC(0x, CONC(c, CONC(p, AFF)))>;
|
||
|
#endif /* REG_32 */
|
||
|
|
||
|
#define POST \
|
||
|
enable-method = "psci"; \
|
||
|
cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0>; \
|
||
|
next-level-cache = <&L2_0>; \
|
||
|
};
|
||
|
|
||
|
#ifdef REG_32
|
||
|
#define CPU_0 \
|
||
|
CPU0:cpu@0 { \
|
||
|
PRE \
|
||
|
reg = <0x0>; \
|
||
|
POST
|
||
|
#else
|
||
|
#define CPU_0 \
|
||
|
CPU0:cpu@0 { \
|
||
|
PRE \
|
||
|
reg = <0x0 0x0>;\
|
||
|
POST
|
||
|
#endif /* REG_32 */
|
||
|
|
||
|
/*
|
||
|
* n - CPU number
|
||
|
*/
|
||
|
#define CPU(n, c, p) \
|
||
|
ADR(n, c, p) \
|
||
|
PRE \
|
||
|
REG(c, p) \
|
||
|
POST
|
||
|
|
||
|
/* 2 CPUs */
|
||
|
#if (CPUS_COUNT > 1)
|
||
|
#if (CLS(1) == 0)
|
||
|
#define c1
|
||
|
#define p1 1
|
||
|
#else
|
||
|
#define c1 10
|
||
|
#define p1 0
|
||
|
#endif
|
||
|
|
||
|
#define CPU_1 CPU(1, c1, p1) /* CPU1: 0.1; 1.0 */
|
||
|
|
||
|
/* 3 CPUs */
|
||
|
#if (CPUS_COUNT > 2)
|
||
|
#if (CLS(2) == 0)
|
||
|
#define c2
|
||
|
#define p2 2
|
||
|
#elif (CLS(2) == 1)
|
||
|
#define c2 10
|
||
|
#define p2 0
|
||
|
#else
|
||
|
#define c2 20
|
||
|
#define p2 0
|
||
|
#endif
|
||
|
|
||
|
#define CPU_2 CPU(2, c2, p2) /* CPU2: 0.2; 1.0; 2.0 */
|
||
|
|
||
|
/* 4 CPUs */
|
||
|
#if (CPUS_COUNT > 3)
|
||
|
#if (CLS(3) == 0)
|
||
|
#define c3
|
||
|
#elif (CLS(3) == 1)
|
||
|
#define c3 10
|
||
|
#else
|
||
|
#define c3 30
|
||
|
#endif
|
||
|
|
||
|
#if (POS(3) == 0)
|
||
|
#define p3 0
|
||
|
#elif (POS(3) == 1)
|
||
|
#define p3 1
|
||
|
#else
|
||
|
#define p3 3
|
||
|
#endif
|
||
|
|
||
|
#define CPU_3 CPU(3, c3, p3) /* CPU3: 0.3; 1.0; 1.1; 3.0 */
|
||
|
|
||
|
/* 6 CPUs */
|
||
|
#if (CPUS_COUNT > 4)
|
||
|
#if (CLS(4) == 1)
|
||
|
#define c4 10
|
||
|
#else
|
||
|
#define c4 20
|
||
|
#endif
|
||
|
|
||
|
#if (POS(4) == 0)
|
||
|
#define p4 0
|
||
|
#else
|
||
|
#define p4 1
|
||
|
#endif
|
||
|
|
||
|
#if (CLS(5) == 1)
|
||
|
#define c5 10
|
||
|
#else
|
||
|
#define c5 20
|
||
|
#endif
|
||
|
|
||
|
#if (POS(5) == 1)
|
||
|
#define p5 1
|
||
|
#else
|
||
|
#define p5 2
|
||
|
#endif
|
||
|
|
||
|
#define CPU_4 CPU(4, c4, p4) /* CPU4: 1.0; 1.1; 2.0 */
|
||
|
#define CPU_5 CPU(5, c5, p5) /* CPU5: 1.1; 1.2; 2.1 */
|
||
|
|
||
|
/* 8 CPUs */
|
||
|
#if (CPUS_COUNT > 6)
|
||
|
#if (CLS(6) == 1)
|
||
|
#define c6 10
|
||
|
#define p6 2
|
||
|
#elif (CLS(6) == 2)
|
||
|
#define c6 20
|
||
|
#define p6 0
|
||
|
#else
|
||
|
#define c6 30
|
||
|
#define p6 0
|
||
|
#endif
|
||
|
|
||
|
#if (CLS(7) == 1)
|
||
|
#define c7 10
|
||
|
#define p7 3
|
||
|
#elif (CLS(7) == 2)
|
||
|
#define c7 20
|
||
|
#define p7 1
|
||
|
#else
|
||
|
#define c7 30
|
||
|
#define p7 1
|
||
|
#endif
|
||
|
|
||
|
#define CPU_6 CPU(6, c6, p6) /* CPU6: 1.2; 2.0; 3.0 */
|
||
|
#define CPU_7 CPU(7, c7, p7) /* CPU7: 1.3; 2.1; 3.1 */
|
||
|
|
||
|
/* 9 CPUs */
|
||
|
#if (CPUS_COUNT > 8)
|
||
|
#if (POS(8) == 0)
|
||
|
#define p8 0
|
||
|
#else
|
||
|
#define p8 2
|
||
|
#endif
|
||
|
|
||
|
#define CPU_8 CPU(8, 20, p8) /* CPU8: 2.0; 2.2 */
|
||
|
|
||
|
/* 12 CPUs */
|
||
|
#if (CPUS_COUNT > 9)
|
||
|
#if (CLS(9) == 2)
|
||
|
#define c9 20
|
||
|
#define p9 1
|
||
|
#else
|
||
|
#define c9 30
|
||
|
#define p9 0
|
||
|
#endif
|
||
|
|
||
|
#if (CLS(10) == 2)
|
||
|
#define c10 20
|
||
|
#define p10 2
|
||
|
#else
|
||
|
#define c10 30
|
||
|
#define p10 1
|
||
|
#endif
|
||
|
|
||
|
#if (CLS(11) == 2)
|
||
|
#define c11 20
|
||
|
#define p11 3
|
||
|
#else
|
||
|
#define c11 30
|
||
|
#define p11 2
|
||
|
#endif
|
||
|
|
||
|
#define CPU_9 CPU(9, c9, p9) /* CPU9: 2.1; 3.0 */
|
||
|
#define CPU_10 CPU(10, c10, p10) /* CPU10: 2.2; 3.1 */
|
||
|
#define CPU_11 CPU(11, c11, p11) /* CPU11: 2.3; 3.2 */
|
||
|
|
||
|
/* 16 CPUs */
|
||
|
#if (CPUS_COUNT > 12)
|
||
|
#define CPU_12 CPU(12, 30, 0) /* CPU12: 3.0 */
|
||
|
#define CPU_13 CPU(13, 30, 1) /* CPU13: 3.1 */
|
||
|
#define CPU_14 CPU(14, 30, 2) /* CPU14: 3.2 */
|
||
|
#define CPU_15 CPU(15, 30, 3) /* CPU15: 3.3 */
|
||
|
#endif /* > 12 */
|
||
|
#endif /* > 9 */
|
||
|
#endif /* > 8 */
|
||
|
#endif /* > 6 */
|
||
|
#endif /* > 4 */
|
||
|
#endif /* > 3 */
|
||
|
#endif /* > 2 */
|
||
|
#endif /* > 1 */
|
||
|
|
||
|
#if (CPUS_COUNT == 1)
|
||
|
#define CPUS \
|
||
|
CPU_0
|
||
|
|
||
|
#elif (CPUS_COUNT == 2)
|
||
|
#define CPUS \
|
||
|
CPU_0 \
|
||
|
CPU_1
|
||
|
|
||
|
#elif (CPUS_COUNT == 3)
|
||
|
#define CPUS \
|
||
|
CPU_0 \
|
||
|
CPU_1 \
|
||
|
CPU_2
|
||
|
|
||
|
#elif (CPUS_COUNT == 4)
|
||
|
#define CPUS \
|
||
|
CPU_0 \
|
||
|
CPU_1 \
|
||
|
CPU_2 \
|
||
|
CPU_3
|
||
|
|
||
|
#elif (CPUS_COUNT == 6)
|
||
|
#define CPUS \
|
||
|
CPU_0 \
|
||
|
CPU_1 \
|
||
|
CPU_2 \
|
||
|
CPU_3 \
|
||
|
CPU_4 \
|
||
|
CPU_5
|
||
|
|
||
|
#elif (CPUS_COUNT == 8)
|
||
|
#define CPUS \
|
||
|
CPU_0 \
|
||
|
CPU_1 \
|
||
|
CPU_2 \
|
||
|
CPU_3 \
|
||
|
CPU_4 \
|
||
|
CPU_5 \
|
||
|
CPU_6 \
|
||
|
CPU_7
|
||
|
|
||
|
#elif (CPUS_COUNT == 9)
|
||
|
#define CPUS \
|
||
|
CPU_0 \
|
||
|
CPU_1 \
|
||
|
CPU_2 \
|
||
|
CPU_3 \
|
||
|
CPU_4 \
|
||
|
CPU_5 \
|
||
|
CPU_6 \
|
||
|
CPU_7 \
|
||
|
CPU_8
|
||
|
|
||
|
#elif (CPUS_COUNT == 12)
|
||
|
#define CPUS \
|
||
|
CPU_0 \
|
||
|
CPU_1 \
|
||
|
CPU_2 \
|
||
|
CPU_3 \
|
||
|
CPU_4 \
|
||
|
CPU_5 \
|
||
|
CPU_6 \
|
||
|
CPU_7 \
|
||
|
CPU_8 \
|
||
|
CPU_9 \
|
||
|
CPU_10 \
|
||
|
CPU_11
|
||
|
|
||
|
#else
|
||
|
#define CPUS \
|
||
|
CPU_0 \
|
||
|
CPU_1 \
|
||
|
CPU_2 \
|
||
|
CPU_3 \
|
||
|
CPU_4 \
|
||
|
CPU_5 \
|
||
|
CPU_6 \
|
||
|
CPU_7 \
|
||
|
CPU_8 \
|
||
|
CPU_9 \
|
||
|
CPU_10 \
|
||
|
CPU_11 \
|
||
|
CPU_12 \
|
||
|
CPU_13 \
|
||
|
CPU_14 \
|
||
|
CPU_15
|
||
|
#endif /* CPUS_COUNT */
|
||
|
|
||
|
#define CORE(n) \
|
||
|
core##n { \
|
||
|
cpu = <&CONC(CPU, __COUNTER__)>; \
|
||
|
};
|
||
|
|
||
|
/* Max 4 CPUs per cluster */
|
||
|
#if (CPUS_PER_CLUSTER == 1)
|
||
|
#define CLUSTER(n) \
|
||
|
cluster##n { \
|
||
|
CORE(0) \
|
||
|
};
|
||
|
#elif (CPUS_PER_CLUSTER == 2)
|
||
|
#define CLUSTER(n) \
|
||
|
cluster##n { \
|
||
|
CORE(0) \
|
||
|
CORE(1) \
|
||
|
};
|
||
|
|
||
|
#elif (CPUS_PER_CLUSTER == 3)
|
||
|
#define CLUSTER(n) \
|
||
|
cluster##n { \
|
||
|
CORE(0) \
|
||
|
CORE(1) \
|
||
|
CORE(2) \
|
||
|
};
|
||
|
|
||
|
#else
|
||
|
#define CLUSTER(n) \
|
||
|
cluster##n { \
|
||
|
CORE(0) \
|
||
|
CORE(1) \
|
||
|
CORE(2) \
|
||
|
CORE(3) \
|
||
|
};
|
||
|
#endif /* CPUS_PER_CLUSTER */
|
||
|
|
||
|
/* Max 4 clusters */
|
||
|
#if (CLUSTER_COUNT == 1)
|
||
|
#define CPU_MAP \
|
||
|
cpu-map { \
|
||
|
CLUSTER(0) \
|
||
|
};
|
||
|
|
||
|
#elif (CLUSTER_COUNT == 2)
|
||
|
#define CPU_MAP \
|
||
|
cpu-map { \
|
||
|
CLUSTER(0) \
|
||
|
CLUSTER(1) \
|
||
|
};
|
||
|
|
||
|
#elif (CLUSTER_COUNT == 3)
|
||
|
#define CPU_MAP \
|
||
|
cpu-map { \
|
||
|
CLUSTER(0) \
|
||
|
CLUSTER(1) \
|
||
|
CLUSTER(2) \
|
||
|
};
|
||
|
|
||
|
#else
|
||
|
#define CPU_MAP \
|
||
|
cpu-map { \
|
||
|
CLUSTER(0) \
|
||
|
CLUSTER(1) \
|
||
|
CLUSTER(2) \
|
||
|
CLUSTER(3) \
|
||
|
};
|
||
|
#endif /* CLUSTER_COUNT */
|
||
|
|
||
|
#endif /* FVP_DEFS_DTSI */
|