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