xref: /aosp_15_r20/external/arm-trusted-firmware/fdts/fvp-defs.dtsi (revision 54fd6939e177f8ff529b10183254802c76df6d08)
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