1/* 2 * Copyright (c) 2020, Arm Limited and Contributors. All rights reserved. 3 * 4 * SPDX-License-Identifier: BSD-3-Clause 5 */ 6 7#ifndef FVP_DEFS_DTSI 8#define FVP_DEFS_DTSI 9 10/* Set default topology values if not passed from platform's makefile */ 11#ifndef CLUSTER_COUNT 12#ifdef FVP_CLUSTER_COUNT 13#define CLUSTER_COUNT FVP_CLUSTER_COUNT 14#else 15#define CLUSTER_COUNT 2 16#endif 17#endif /* CLUSTER_COUNT */ 18 19#ifndef CPUS_PER_CLUSTER 20#ifdef FVP_MAX_CPUS_PER_CLUSTER 21#define CPUS_PER_CLUSTER FVP_MAX_CPUS_PER_CLUSTER 22#else 23#define CPUS_PER_CLUSTER 4 24#endif 25#endif /* CPUS_PER_CLUSTER */ 26 27/* Get platform's topology */ 28#define CPUS_COUNT (CLUSTER_COUNT * CPUS_PER_CLUSTER) 29 30#define CONCAT(x, y) x##y 31#define CONC(x, y) CONCAT(x, y) 32 33/* CPU's cluster */ 34#define CLS(n) (n / CPUS_PER_CLUSTER) 35 36/* CPU's position in cluster */ 37#define POS(n) (n % CPUS_PER_CLUSTER) 38 39#define ADR(n, c, p) \ 40 CPU##n:cpu@CONC(c, CONC(p, AFF)) { 41 42#define PRE \ 43 device_type = "cpu"; \ 44 compatible = "arm,armv8"; 45 46#define POST \ 47 enable-method = "psci"; \ 48 cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0>; \ 49 next-level-cache = <&L2_0>; \ 50 }; 51 52#define CPU_0 \ 53 CPU0:cpu@0 { \ 54 PRE \ 55 reg = <0x0 0x0>;\ 56 POST 57 58/* 59 * n - CPU number 60 */ 61#define CPU(n, c, p) \ 62 ADR(n, c, p) \ 63 PRE \ 64 reg = <0x0 CONC(0x, CONC(c, CONC(p, AFF)))>; \ 65 POST 66 67/* 2 CPUs */ 68#if (CPUS_COUNT > 1) 69#if (CLS(1) == 0) 70#define c1 71#define p1 1 72#else 73#define c1 10 74#define p1 0 75#endif 76 77#define CPU_1 CPU(1, c1, p1) /* CPU1: 0.1; 1.0 */ 78 79/* 3 CPUs */ 80#if (CPUS_COUNT > 2) 81#if (CLS(2) == 0) 82#define c2 83#define p2 2 84#elif (CLS(2) == 1) 85#define c2 10 86#define p2 0 87#else 88#define c2 20 89#define p2 0 90#endif 91 92#define CPU_2 CPU(2, c2, p2) /* CPU2: 0.2; 1.0; 2.0 */ 93 94/* 4 CPUs */ 95#if (CPUS_COUNT > 3) 96#if (CLS(3) == 0) 97#define c3 98#elif (CLS(3) == 1) 99#define c3 10 100#else 101#define c3 30 102#endif 103 104#if (POS(3) == 0) 105#define p3 0 106#elif (POS(3) == 1) 107#define p3 1 108#else 109#define p3 3 110#endif 111 112#define CPU_3 CPU(3, c3, p3) /* CPU3: 0.3; 1.0; 1.1; 3.0 */ 113 114/* 6 CPUs */ 115#if (CPUS_COUNT > 4) 116#if (CLS(4) == 1) 117#define c4 10 118#else 119#define c4 20 120#endif 121 122#if (POS(4) == 0) 123#define p4 0 124#else 125#define p4 1 126#endif 127 128#if (CLS(5) == 1) 129#define c5 10 130#else 131#define c5 20 132#endif 133 134#if (POS(5) == 1) 135#define p5 1 136#else 137#define p5 2 138#endif 139 140#define CPU_4 CPU(4, c4, p4) /* CPU4: 1.0; 1.1; 2.0 */ 141#define CPU_5 CPU(5, c5, p5) /* CPU5: 1.1; 1.2; 2.1 */ 142 143/* 8 CPUs */ 144#if (CPUS_COUNT > 6) 145#if (CLS(6) == 1) 146#define c6 10 147#define p6 2 148#elif (CLS(6) == 2) 149#define c6 20 150#define p6 0 151#else 152#define c6 30 153#define p6 0 154#endif 155 156#if (CLS(7) == 1) 157#define c7 10 158#define p7 3 159#elif (CLS(7) == 2) 160#define c7 20 161#define p7 1 162#else 163#define c7 30 164#define p7 1 165#endif 166 167#define CPU_6 CPU(6, c6, p6) /* CPU6: 1.2; 2.0; 3.0 */ 168#define CPU_7 CPU(7, c7, p7) /* CPU7: 1.3; 2.1; 3.1 */ 169 170/* 9 CPUs */ 171#if (CPUS_COUNT > 8) 172#if (POS(8) == 0) 173#define p8 0 174#else 175#define p8 2 176#endif 177 178#define CPU_8 CPU(8, 20, p8) /* CPU8: 2.0; 2.2 */ 179 180/* 12 CPUs */ 181#if (CPUS_COUNT > 9) 182#if (CLS(9) == 2) 183#define c9 20 184#define p9 1 185#else 186#define c9 30 187#define p9 0 188#endif 189 190#if (CLS(10) == 2) 191#define c10 20 192#define p10 2 193#else 194#define c10 30 195#define p10 1 196#endif 197 198#if (CLS(11) == 2) 199#define c11 20 200#define p11 3 201#else 202#define c11 30 203#define p11 2 204#endif 205 206#define CPU_9 CPU(9, c9, p9) /* CPU9: 2.1; 3.0 */ 207#define CPU_10 CPU(10, c10, p10) /* CPU10: 2.2; 3.1 */ 208#define CPU_11 CPU(11, c11, p11) /* CPU11: 2.3; 3.2 */ 209 210/* 16 CPUs */ 211#if (CPUS_COUNT > 12) 212#define CPU_12 CPU(12, 30, 0) /* CPU12: 3.0 */ 213#define CPU_13 CPU(13, 30, 1) /* CPU13: 3.1 */ 214#define CPU_14 CPU(14, 30, 2) /* CPU14: 3.2 */ 215#define CPU_15 CPU(15, 30, 3) /* CPU15: 3.3 */ 216#endif /* > 12 */ 217#endif /* > 9 */ 218#endif /* > 8 */ 219#endif /* > 6 */ 220#endif /* > 4 */ 221#endif /* > 3 */ 222#endif /* > 2 */ 223#endif /* > 1 */ 224 225#if (CPUS_COUNT == 1) 226#define CPUS \ 227 CPU_0 228 229#elif (CPUS_COUNT == 2) 230#define CPUS \ 231 CPU_0 \ 232 CPU_1 233 234#elif (CPUS_COUNT == 3) 235#define CPUS \ 236 CPU_0 \ 237 CPU_1 \ 238 CPU_2 239 240#elif (CPUS_COUNT == 4) 241#define CPUS \ 242 CPU_0 \ 243 CPU_1 \ 244 CPU_2 \ 245 CPU_3 246 247#elif (CPUS_COUNT == 6) 248#define CPUS \ 249 CPU_0 \ 250 CPU_1 \ 251 CPU_2 \ 252 CPU_3 \ 253 CPU_4 \ 254 CPU_5 255 256#elif (CPUS_COUNT == 8) 257#define CPUS \ 258 CPU_0 \ 259 CPU_1 \ 260 CPU_2 \ 261 CPU_3 \ 262 CPU_4 \ 263 CPU_5 \ 264 CPU_6 \ 265 CPU_7 266 267#elif (CPUS_COUNT == 9) 268#define CPUS \ 269 CPU_0 \ 270 CPU_1 \ 271 CPU_2 \ 272 CPU_3 \ 273 CPU_4 \ 274 CPU_5 \ 275 CPU_6 \ 276 CPU_7 \ 277 CPU_8 278 279#elif (CPUS_COUNT == 12) 280#define CPUS \ 281 CPU_0 \ 282 CPU_1 \ 283 CPU_2 \ 284 CPU_3 \ 285 CPU_4 \ 286 CPU_5 \ 287 CPU_6 \ 288 CPU_7 \ 289 CPU_8 \ 290 CPU_9 \ 291 CPU_10 \ 292 CPU_11 293 294#else 295#define CPUS \ 296 CPU_0 \ 297 CPU_1 \ 298 CPU_2 \ 299 CPU_3 \ 300 CPU_4 \ 301 CPU_5 \ 302 CPU_6 \ 303 CPU_7 \ 304 CPU_8 \ 305 CPU_9 \ 306 CPU_10 \ 307 CPU_11 \ 308 CPU_12 \ 309 CPU_13 \ 310 CPU_14 \ 311 CPU_15 312#endif /* CPUS_COUNT */ 313 314#define CORE(n) \ 315 core##n { \ 316 cpu = <&CONC(CPU, __COUNTER__)>; \ 317 }; 318 319/* Max 4 CPUs per cluster */ 320#if (CPUS_PER_CLUSTER == 1) 321#define CLUSTER(n) \ 322 cluster##n { \ 323 CORE(0) \ 324 }; 325#elif (CPUS_PER_CLUSTER == 2) 326#define CLUSTER(n) \ 327 cluster##n { \ 328 CORE(0) \ 329 CORE(1) \ 330 }; 331 332#elif (CPUS_PER_CLUSTER == 3) 333#define CLUSTER(n) \ 334 cluster##n { \ 335 CORE(0) \ 336 CORE(1) \ 337 CORE(2) \ 338 }; 339 340#else 341#define CLUSTER(n) \ 342 cluster##n { \ 343 CORE(0) \ 344 CORE(1) \ 345 CORE(2) \ 346 CORE(3) \ 347 }; 348#endif /* CPUS_PER_CLUSTER */ 349 350/* Max 4 clusters */ 351#if (CLUSTER_COUNT == 1) 352#define CPU_MAP \ 353 cpu-map { \ 354 CLUSTER(0) \ 355 }; 356 357#elif (CLUSTER_COUNT == 2) 358#define CPU_MAP \ 359 cpu-map { \ 360 CLUSTER(0) \ 361 CLUSTER(1) \ 362 }; 363 364#elif (CLUSTER_COUNT == 3) 365#define CPU_MAP \ 366 cpu-map { \ 367 CLUSTER(0) \ 368 CLUSTER(1) \ 369 CLUSTER(2) \ 370 }; 371 372#else 373#define CPU_MAP \ 374 cpu-map { \ 375 CLUSTER(0) \ 376 CLUSTER(1) \ 377 CLUSTER(2) \ 378 CLUSTER(3) \ 379 }; 380#endif /* CLUSTER_COUNT */ 381 382#endif /* FVP_DEFS_DTSI */ 383