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