1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21#include "qemu/osdep.h"
22#include "qapi/error.h"
23#include "cpu.h"
24#include "qemu/module.h"
25#include "qapi/visitor.h"
26#include "hw/qdev-properties.h"
27#include "internals.h"
28#include "cpregs.h"
29
30static void aarch64_a35_initfn(Object *obj)
31{
32 ARMCPU *cpu = ARM_CPU(obj);
33
34 cpu->dtb_compatible = "arm,cortex-a35";
35 set_feature(&cpu->env, ARM_FEATURE_V8);
36 set_feature(&cpu->env, ARM_FEATURE_NEON);
37 set_feature(&cpu->env, ARM_FEATURE_GENERIC_TIMER);
38 set_feature(&cpu->env, ARM_FEATURE_AARCH64);
39 set_feature(&cpu->env, ARM_FEATURE_CBAR_RO);
40 set_feature(&cpu->env, ARM_FEATURE_EL2);
41 set_feature(&cpu->env, ARM_FEATURE_EL3);
42 set_feature(&cpu->env, ARM_FEATURE_PMU);
43
44
45 cpu->midr = 0x411fd040;
46 cpu->revidr = 0;
47 cpu->ctr = 0x84448004;
48 cpu->isar.id_pfr0 = 0x00000131;
49 cpu->isar.id_pfr1 = 0x00011011;
50 cpu->isar.id_dfr0 = 0x03010066;
51 cpu->id_afr0 = 0;
52 cpu->isar.id_mmfr0 = 0x10201105;
53 cpu->isar.id_mmfr1 = 0x40000000;
54 cpu->isar.id_mmfr2 = 0x01260000;
55 cpu->isar.id_mmfr3 = 0x02102211;
56 cpu->isar.id_isar0 = 0x02101110;
57 cpu->isar.id_isar1 = 0x13112111;
58 cpu->isar.id_isar2 = 0x21232042;
59 cpu->isar.id_isar3 = 0x01112131;
60 cpu->isar.id_isar4 = 0x00011142;
61 cpu->isar.id_isar5 = 0x00011121;
62 cpu->isar.id_aa64pfr0 = 0x00002222;
63 cpu->isar.id_aa64pfr1 = 0;
64 cpu->isar.id_aa64dfr0 = 0x10305106;
65 cpu->isar.id_aa64dfr1 = 0;
66 cpu->isar.id_aa64isar0 = 0x00011120;
67 cpu->isar.id_aa64isar1 = 0;
68 cpu->isar.id_aa64mmfr0 = 0x00101122;
69 cpu->isar.id_aa64mmfr1 = 0;
70 cpu->clidr = 0x0a200023;
71 cpu->dcz_blocksize = 4;
72
73
74 cpu->reset_sctlr = 0x00c50838;
75
76
77 cpu->isar.reset_pmcr_el0 = 0x410a3000;
78
79
80 cpu->ccsidr[0] = 0x700fe01a;
81 cpu->ccsidr[1] = 0x201fe00a;
82 cpu->ccsidr[2] = 0x703fe03a;
83
84
85 cpu->gic_num_lrs = 4;
86 cpu->gic_vpribits = 5;
87 cpu->gic_vprebits = 5;
88 cpu->gic_pribits = 5;
89
90
91 cpu->isar.dbgdidr = 0x3516d000;
92
93 cpu->isar.dbgdevid = 0x00110f13;
94
95 cpu->isar.dbgdevid1 = 0x2;
96
97
98
99 cpu->reset_fpsid = 0x41034043;
100
101
102 cpu->isar.mvfr0 = 0x10110222;
103 cpu->isar.mvfr1 = 0x12111111;
104 cpu->isar.mvfr2 = 0x00000043;
105
106
107 define_cortex_a72_a57_a53_cp_reginfo(cpu);
108}
109
110static void cpu_max_get_sve_max_vq(Object *obj, Visitor *v, const char *name,
111 void *opaque, Error **errp)
112{
113 ARMCPU *cpu = ARM_CPU(obj);
114 uint32_t value;
115
116
117 if (!cpu_isar_feature(aa64_sve, cpu)) {
118 value = 0;
119 } else {
120 value = cpu->sve_max_vq;
121 }
122 visit_type_uint32(v, name, &value, errp);
123}
124
125static void cpu_max_set_sve_max_vq(Object *obj, Visitor *v, const char *name,
126 void *opaque, Error **errp)
127{
128 ARMCPU *cpu = ARM_CPU(obj);
129 uint32_t max_vq;
130
131 if (!visit_type_uint32(v, name, &max_vq, errp)) {
132 return;
133 }
134
135 if (max_vq == 0 || max_vq > ARM_MAX_VQ) {
136 error_setg(errp, "unsupported SVE vector length");
137 error_append_hint(errp, "Valid sve-max-vq in range [1-%d]\n",
138 ARM_MAX_VQ);
139 return;
140 }
141
142 cpu->sve_max_vq = max_vq;
143}
144
145static bool cpu_arm_get_rme(Object *obj, Error **errp)
146{
147 ARMCPU *cpu = ARM_CPU(obj);
148 return cpu_isar_feature(aa64_rme, cpu);
149}
150
151static void cpu_arm_set_rme(Object *obj, bool value, Error **errp)
152{
153 ARMCPU *cpu = ARM_CPU(obj);
154 uint64_t t;
155
156 t = cpu->isar.id_aa64pfr0;
157 t = FIELD_DP64(t, ID_AA64PFR0, RME, value);
158 cpu->isar.id_aa64pfr0 = t;
159}
160
161static void cpu_max_set_l0gptsz(Object *obj, Visitor *v, const char *name,
162 void *opaque, Error **errp)
163{
164 ARMCPU *cpu = ARM_CPU(obj);
165 uint32_t value;
166
167 if (!visit_type_uint32(v, name, &value, errp)) {
168 return;
169 }
170
171
172 switch (value) {
173 case 30:
174 case 34:
175 case 36:
176 case 39:
177 cpu->reset_l0gptsz = value - 30;
178 break;
179 default:
180 error_setg(errp, "invalid value for l0gptsz");
181 error_append_hint(errp, "valid values are 30, 34, 36, 39\n");
182 break;
183 }
184}
185
186static void cpu_max_get_l0gptsz(Object *obj, Visitor *v, const char *name,
187 void *opaque, Error **errp)
188{
189 ARMCPU *cpu = ARM_CPU(obj);
190 uint32_t value = cpu->reset_l0gptsz + 30;
191
192 visit_type_uint32(v, name, &value, errp);
193}
194
195static Property arm_cpu_lpa2_property =
196 DEFINE_PROP_BOOL("lpa2", ARMCPU, prop_lpa2, true);
197
198static void aarch64_a55_initfn(Object *obj)
199{
200 ARMCPU *cpu = ARM_CPU(obj);
201
202 cpu->dtb_compatible = "arm,cortex-a55";
203 set_feature(&cpu->env, ARM_FEATURE_V8);
204 set_feature(&cpu->env, ARM_FEATURE_NEON);
205 set_feature(&cpu->env, ARM_FEATURE_GENERIC_TIMER);
206 set_feature(&cpu->env, ARM_FEATURE_AARCH64);
207 set_feature(&cpu->env, ARM_FEATURE_CBAR_RO);
208 set_feature(&cpu->env, ARM_FEATURE_EL2);
209 set_feature(&cpu->env, ARM_FEATURE_EL3);
210 set_feature(&cpu->env, ARM_FEATURE_PMU);
211
212
213 cpu->clidr = 0x82000023;
214 cpu->ctr = 0x84448004;
215 cpu->dcz_blocksize = 4;
216 cpu->isar.id_aa64dfr0 = 0x0000000010305408ull;
217 cpu->isar.id_aa64isar0 = 0x0000100010211120ull;
218 cpu->isar.id_aa64isar1 = 0x0000000000100001ull;
219 cpu->isar.id_aa64mmfr0 = 0x0000000000101122ull;
220 cpu->isar.id_aa64mmfr1 = 0x0000000010212122ull;
221 cpu->isar.id_aa64mmfr2 = 0x0000000000001011ull;
222 cpu->isar.id_aa64pfr0 = 0x0000000010112222ull;
223 cpu->isar.id_aa64pfr1 = 0x0000000000000010ull;
224 cpu->id_afr0 = 0x00000000;
225 cpu->isar.id_dfr0 = 0x04010088;
226 cpu->isar.id_isar0 = 0x02101110;
227 cpu->isar.id_isar1 = 0x13112111;
228 cpu->isar.id_isar2 = 0x21232042;
229 cpu->isar.id_isar3 = 0x01112131;
230 cpu->isar.id_isar4 = 0x00011142;
231 cpu->isar.id_isar5 = 0x01011121;
232 cpu->isar.id_isar6 = 0x00000010;
233 cpu->isar.id_mmfr0 = 0x10201105;
234 cpu->isar.id_mmfr1 = 0x40000000;
235 cpu->isar.id_mmfr2 = 0x01260000;
236 cpu->isar.id_mmfr3 = 0x02122211;
237 cpu->isar.id_mmfr4 = 0x00021110;
238 cpu->isar.id_pfr0 = 0x10010131;
239 cpu->isar.id_pfr1 = 0x00011011;
240 cpu->isar.id_pfr2 = 0x00000011;
241 cpu->midr = 0x412FD050;
242 cpu->revidr = 0;
243
244
245 cpu->ccsidr[0] = 0x700fe01a;
246 cpu->ccsidr[1] = 0x200fe01a;
247 cpu->ccsidr[2] = 0x703fe07a;
248
249
250 cpu->reset_sctlr = 0x30c50838;
251
252
253 cpu->gic_num_lrs = 4;
254 cpu->gic_vpribits = 5;
255 cpu->gic_vprebits = 5;
256 cpu->gic_pribits = 5;
257
258 cpu->isar.mvfr0 = 0x10110222;
259 cpu->isar.mvfr1 = 0x13211111;
260 cpu->isar.mvfr2 = 0x00000043;
261
262
263 cpu->isar.reset_pmcr_el0 = 0x410b3000;
264}
265
266static void aarch64_a72_initfn(Object *obj)
267{
268 ARMCPU *cpu = ARM_CPU(obj);
269
270 cpu->dtb_compatible = "arm,cortex-a72";
271 set_feature(&cpu->env, ARM_FEATURE_V8);
272 set_feature(&cpu->env, ARM_FEATURE_NEON);
273 set_feature(&cpu->env, ARM_FEATURE_GENERIC_TIMER);
274 set_feature(&cpu->env, ARM_FEATURE_AARCH64);
275 set_feature(&cpu->env, ARM_FEATURE_CBAR_RO);
276 set_feature(&cpu->env, ARM_FEATURE_EL2);
277 set_feature(&cpu->env, ARM_FEATURE_EL3);
278 set_feature(&cpu->env, ARM_FEATURE_PMU);
279 cpu->midr = 0x410fd083;
280 cpu->revidr = 0x00000000;
281 cpu->reset_fpsid = 0x41034080;
282 cpu->isar.mvfr0 = 0x10110222;
283 cpu->isar.mvfr1 = 0x12111111;
284 cpu->isar.mvfr2 = 0x00000043;
285 cpu->ctr = 0x8444c004;
286 cpu->reset_sctlr = 0x00c50838;
287 cpu->isar.id_pfr0 = 0x00000131;
288 cpu->isar.id_pfr1 = 0x00011011;
289 cpu->isar.id_dfr0 = 0x03010066;
290 cpu->id_afr0 = 0x00000000;
291 cpu->isar.id_mmfr0 = 0x10201105;
292 cpu->isar.id_mmfr1 = 0x40000000;
293 cpu->isar.id_mmfr2 = 0x01260000;
294 cpu->isar.id_mmfr3 = 0x02102211;
295 cpu->isar.id_isar0 = 0x02101110;
296 cpu->isar.id_isar1 = 0x13112111;
297 cpu->isar.id_isar2 = 0x21232042;
298 cpu->isar.id_isar3 = 0x01112131;
299 cpu->isar.id_isar4 = 0x00011142;
300 cpu->isar.id_isar5 = 0x00011121;
301 cpu->isar.id_aa64pfr0 = 0x00002222;
302 cpu->isar.id_aa64dfr0 = 0x10305106;
303 cpu->isar.id_aa64isar0 = 0x00011120;
304 cpu->isar.id_aa64mmfr0 = 0x00001124;
305 cpu->isar.dbgdidr = 0x3516d000;
306 cpu->isar.dbgdevid = 0x01110f13;
307 cpu->isar.dbgdevid1 = 0x2;
308 cpu->isar.reset_pmcr_el0 = 0x41023000;
309 cpu->clidr = 0x0a200023;
310 cpu->ccsidr[0] = 0x701fe00a;
311 cpu->ccsidr[1] = 0x201fe012;
312 cpu->ccsidr[2] = 0x707fe07a;
313 cpu->dcz_blocksize = 4;
314 cpu->gic_num_lrs = 4;
315 cpu->gic_vpribits = 5;
316 cpu->gic_vprebits = 5;
317 cpu->gic_pribits = 5;
318 define_cortex_a72_a57_a53_cp_reginfo(cpu);
319}
320
321static void aarch64_a76_initfn(Object *obj)
322{
323 ARMCPU *cpu = ARM_CPU(obj);
324
325 cpu->dtb_compatible = "arm,cortex-a76";
326 set_feature(&cpu->env, ARM_FEATURE_V8);
327 set_feature(&cpu->env, ARM_FEATURE_NEON);
328 set_feature(&cpu->env, ARM_FEATURE_GENERIC_TIMER);
329 set_feature(&cpu->env, ARM_FEATURE_AARCH64);
330 set_feature(&cpu->env, ARM_FEATURE_CBAR_RO);
331 set_feature(&cpu->env, ARM_FEATURE_EL2);
332 set_feature(&cpu->env, ARM_FEATURE_EL3);
333 set_feature(&cpu->env, ARM_FEATURE_PMU);
334
335
336 cpu->clidr = 0x82000023;
337 cpu->ctr = 0x8444C004;
338 cpu->dcz_blocksize = 4;
339 cpu->isar.id_aa64dfr0 = 0x0000000010305408ull;
340 cpu->isar.id_aa64isar0 = 0x0000100010211120ull;
341 cpu->isar.id_aa64isar1 = 0x0000000000100001ull;
342 cpu->isar.id_aa64mmfr0 = 0x0000000000101122ull;
343 cpu->isar.id_aa64mmfr1 = 0x0000000010212122ull;
344 cpu->isar.id_aa64mmfr2 = 0x0000000000001011ull;
345 cpu->isar.id_aa64pfr0 = 0x1100000010111112ull;
346 cpu->isar.id_aa64pfr1 = 0x0000000000000010ull;
347 cpu->id_afr0 = 0x00000000;
348 cpu->isar.id_dfr0 = 0x04010088;
349 cpu->isar.id_isar0 = 0x02101110;
350 cpu->isar.id_isar1 = 0x13112111;
351 cpu->isar.id_isar2 = 0x21232042;
352 cpu->isar.id_isar3 = 0x01112131;
353 cpu->isar.id_isar4 = 0x00010142;
354 cpu->isar.id_isar5 = 0x01011121;
355 cpu->isar.id_isar6 = 0x00000010;
356 cpu->isar.id_mmfr0 = 0x10201105;
357 cpu->isar.id_mmfr1 = 0x40000000;
358 cpu->isar.id_mmfr2 = 0x01260000;
359 cpu->isar.id_mmfr3 = 0x02122211;
360 cpu->isar.id_mmfr4 = 0x00021110;
361 cpu->isar.id_pfr0 = 0x10010131;
362 cpu->isar.id_pfr1 = 0x00010000;
363 cpu->isar.id_pfr2 = 0x00000011;
364 cpu->midr = 0x414fd0b1;
365 cpu->revidr = 0;
366
367
368 cpu->ccsidr[0] = 0x701fe01a;
369 cpu->ccsidr[1] = 0x201fe01a;
370 cpu->ccsidr[2] = 0x707fe03a;
371
372
373 cpu->reset_sctlr = 0x30c50838;
374
375
376 cpu->gic_num_lrs = 4;
377 cpu->gic_vpribits = 5;
378 cpu->gic_vprebits = 5;
379 cpu->gic_pribits = 5;
380
381
382 cpu->isar.mvfr0 = 0x10110222;
383 cpu->isar.mvfr1 = 0x13211111;
384 cpu->isar.mvfr2 = 0x00000043;
385
386
387 cpu->isar.reset_pmcr_el0 = 0x410b3000;
388}
389
390static void aarch64_a64fx_initfn(Object *obj)
391{
392 ARMCPU *cpu = ARM_CPU(obj);
393
394 cpu->dtb_compatible = "arm,a64fx";
395 set_feature(&cpu->env, ARM_FEATURE_V8);
396 set_feature(&cpu->env, ARM_FEATURE_NEON);
397 set_feature(&cpu->env, ARM_FEATURE_GENERIC_TIMER);
398 set_feature(&cpu->env, ARM_FEATURE_AARCH64);
399 set_feature(&cpu->env, ARM_FEATURE_EL2);
400 set_feature(&cpu->env, ARM_FEATURE_EL3);
401 set_feature(&cpu->env, ARM_FEATURE_PMU);
402 cpu->midr = 0x461f0010;
403 cpu->revidr = 0x00000000;
404 cpu->ctr = 0x86668006;
405 cpu->reset_sctlr = 0x30000180;
406 cpu->isar.id_aa64pfr0 = 0x0000000101111111;
407 cpu->isar.id_aa64pfr1 = 0x0000000000000000;
408 cpu->isar.id_aa64dfr0 = 0x0000000010305408;
409 cpu->isar.id_aa64dfr1 = 0x0000000000000000;
410 cpu->id_aa64afr0 = 0x0000000000000000;
411 cpu->id_aa64afr1 = 0x0000000000000000;
412 cpu->isar.id_aa64mmfr0 = 0x0000000000001122;
413 cpu->isar.id_aa64mmfr1 = 0x0000000011212100;
414 cpu->isar.id_aa64mmfr2 = 0x0000000000001011;
415 cpu->isar.id_aa64isar0 = 0x0000000010211120;
416 cpu->isar.id_aa64isar1 = 0x0000000000010001;
417 cpu->isar.id_aa64zfr0 = 0x0000000000000000;
418 cpu->clidr = 0x0000000080000023;
419 cpu->ccsidr[0] = 0x7007e01c;
420 cpu->ccsidr[1] = 0x2007e01c;
421 cpu->ccsidr[2] = 0x70ffe07c;
422 cpu->dcz_blocksize = 6;
423 cpu->gic_num_lrs = 4;
424 cpu->gic_vpribits = 5;
425 cpu->gic_vprebits = 5;
426 cpu->gic_pribits = 5;
427
428
429 aarch64_add_sve_properties(obj);
430 cpu->sve_vq.supported = (1 << 0)
431 | (1 << 1)
432 | (1 << 3);
433
434 cpu->isar.reset_pmcr_el0 = 0x46014040;
435
436
437}
438
439static const ARMCPRegInfo neoverse_n1_cp_reginfo[] = {
440 { .name = "ATCR_EL1", .state = ARM_CP_STATE_AA64,
441 .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 7, .opc2 = 0,
442 .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
443 { .name = "ATCR_EL2", .state = ARM_CP_STATE_AA64,
444 .opc0 = 3, .opc1 = 4, .crn = 15, .crm = 7, .opc2 = 0,
445 .access = PL2_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
446 { .name = "ATCR_EL3", .state = ARM_CP_STATE_AA64,
447 .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 7, .opc2 = 0,
448 .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
449 { .name = "ATCR_EL12", .state = ARM_CP_STATE_AA64,
450 .opc0 = 3, .opc1 = 5, .crn = 15, .crm = 7, .opc2 = 0,
451 .access = PL2_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
452 { .name = "AVTCR_EL2", .state = ARM_CP_STATE_AA64,
453 .opc0 = 3, .opc1 = 4, .crn = 15, .crm = 7, .opc2 = 1,
454 .access = PL2_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
455 { .name = "CPUACTLR_EL1", .state = ARM_CP_STATE_AA64,
456 .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 1, .opc2 = 0,
457 .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
458 { .name = "CPUACTLR2_EL1", .state = ARM_CP_STATE_AA64,
459 .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 1, .opc2 = 1,
460 .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
461 { .name = "CPUACTLR3_EL1", .state = ARM_CP_STATE_AA64,
462 .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 1, .opc2 = 2,
463 .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
464
465
466
467
468 { .name = "CPUCFR_EL1", .state = ARM_CP_STATE_AA64,
469 .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 0, .opc2 = 0,
470 .access = PL1_R, .type = ARM_CP_CONST, .resetvalue = 4 },
471 { .name = "CPUECTLR_EL1", .state = ARM_CP_STATE_AA64,
472 .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 1, .opc2 = 4,
473 .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0x961563010 },
474 { .name = "CPUPCR_EL3", .state = ARM_CP_STATE_AA64,
475 .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 8, .opc2 = 1,
476 .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
477 { .name = "CPUPMR_EL3", .state = ARM_CP_STATE_AA64,
478 .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 8, .opc2 = 3,
479 .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
480 { .name = "CPUPOR_EL3", .state = ARM_CP_STATE_AA64,
481 .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 8, .opc2 = 2,
482 .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
483 { .name = "CPUPSELR_EL3", .state = ARM_CP_STATE_AA64,
484 .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 8, .opc2 = 0,
485 .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
486 { .name = "CPUPWRCTLR_EL1", .state = ARM_CP_STATE_AA64,
487 .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 2, .opc2 = 7,
488 .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
489 { .name = "ERXPFGCDN_EL1", .state = ARM_CP_STATE_AA64,
490 .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 2, .opc2 = 2,
491 .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
492 { .name = "ERXPFGCTL_EL1", .state = ARM_CP_STATE_AA64,
493 .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 2, .opc2 = 1,
494 .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
495 { .name = "ERXPFGF_EL1", .state = ARM_CP_STATE_AA64,
496 .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 2, .opc2 = 0,
497 .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
498};
499
500static void define_neoverse_n1_cp_reginfo(ARMCPU *cpu)
501{
502 define_arm_cp_regs(cpu, neoverse_n1_cp_reginfo);
503}
504
505static const ARMCPRegInfo neoverse_v1_cp_reginfo[] = {
506 { .name = "CPUECTLR2_EL1", .state = ARM_CP_STATE_AA64,
507 .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 1, .opc2 = 5,
508 .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
509 { .name = "CPUPPMCR_EL3", .state = ARM_CP_STATE_AA64,
510 .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 2, .opc2 = 0,
511 .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
512 { .name = "CPUPPMCR2_EL3", .state = ARM_CP_STATE_AA64,
513 .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 2, .opc2 = 1,
514 .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
515 { .name = "CPUPPMCR3_EL3", .state = ARM_CP_STATE_AA64,
516 .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 2, .opc2 = 6,
517 .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
518};
519
520static void define_neoverse_v1_cp_reginfo(ARMCPU *cpu)
521{
522
523
524
525
526 define_arm_cp_regs(cpu, neoverse_n1_cp_reginfo);
527 define_arm_cp_regs(cpu, neoverse_v1_cp_reginfo);
528}
529
530static void aarch64_neoverse_n1_initfn(Object *obj)
531{
532 ARMCPU *cpu = ARM_CPU(obj);
533
534 cpu->dtb_compatible = "arm,neoverse-n1";
535 set_feature(&cpu->env, ARM_FEATURE_V8);
536 set_feature(&cpu->env, ARM_FEATURE_NEON);
537 set_feature(&cpu->env, ARM_FEATURE_GENERIC_TIMER);
538 set_feature(&cpu->env, ARM_FEATURE_AARCH64);
539 set_feature(&cpu->env, ARM_FEATURE_CBAR_RO);
540 set_feature(&cpu->env, ARM_FEATURE_EL2);
541 set_feature(&cpu->env, ARM_FEATURE_EL3);
542 set_feature(&cpu->env, ARM_FEATURE_PMU);
543
544
545 cpu->clidr = 0x82000023;
546 cpu->ctr = 0x8444c004;
547 cpu->dcz_blocksize = 4;
548 cpu->isar.id_aa64dfr0 = 0x0000000110305408ull;
549 cpu->isar.id_aa64isar0 = 0x0000100010211120ull;
550 cpu->isar.id_aa64isar1 = 0x0000000000100001ull;
551 cpu->isar.id_aa64mmfr0 = 0x0000000000101125ull;
552 cpu->isar.id_aa64mmfr1 = 0x0000000010212122ull;
553 cpu->isar.id_aa64mmfr2 = 0x0000000000001011ull;
554 cpu->isar.id_aa64pfr0 = 0x1100000010111112ull;
555 cpu->isar.id_aa64pfr1 = 0x0000000000000020ull;
556 cpu->id_afr0 = 0x00000000;
557 cpu->isar.id_dfr0 = 0x04010088;
558 cpu->isar.id_isar0 = 0x02101110;
559 cpu->isar.id_isar1 = 0x13112111;
560 cpu->isar.id_isar2 = 0x21232042;
561 cpu->isar.id_isar3 = 0x01112131;
562 cpu->isar.id_isar4 = 0x00010142;
563 cpu->isar.id_isar5 = 0x01011121;
564 cpu->isar.id_isar6 = 0x00000010;
565 cpu->isar.id_mmfr0 = 0x10201105;
566 cpu->isar.id_mmfr1 = 0x40000000;
567 cpu->isar.id_mmfr2 = 0x01260000;
568 cpu->isar.id_mmfr3 = 0x02122211;
569 cpu->isar.id_mmfr4 = 0x00021110;
570 cpu->isar.id_pfr0 = 0x10010131;
571 cpu->isar.id_pfr1 = 0x00010000;
572 cpu->isar.id_pfr2 = 0x00000011;
573 cpu->midr = 0x414fd0c1;
574 cpu->revidr = 0;
575
576
577 cpu->ccsidr[0] = 0x701fe01a;
578 cpu->ccsidr[1] = 0x201fe01a;
579 cpu->ccsidr[2] = 0x70ffe03a;
580
581
582 cpu->reset_sctlr = 0x30c50838;
583
584
585 cpu->gic_num_lrs = 4;
586 cpu->gic_vpribits = 5;
587 cpu->gic_vprebits = 5;
588 cpu->gic_pribits = 5;
589
590
591 cpu->isar.mvfr0 = 0x10110222;
592 cpu->isar.mvfr1 = 0x13211111;
593 cpu->isar.mvfr2 = 0x00000043;
594
595
596 cpu->isar.reset_pmcr_el0 = 0x410c3000;
597
598 define_neoverse_n1_cp_reginfo(cpu);
599}
600
601static void aarch64_neoverse_v1_initfn(Object *obj)
602{
603 ARMCPU *cpu = ARM_CPU(obj);
604
605 cpu->dtb_compatible = "arm,neoverse-v1";
606 set_feature(&cpu->env, ARM_FEATURE_V8);
607 set_feature(&cpu->env, ARM_FEATURE_NEON);
608 set_feature(&cpu->env, ARM_FEATURE_GENERIC_TIMER);
609 set_feature(&cpu->env, ARM_FEATURE_AARCH64);
610 set_feature(&cpu->env, ARM_FEATURE_CBAR_RO);
611 set_feature(&cpu->env, ARM_FEATURE_EL2);
612 set_feature(&cpu->env, ARM_FEATURE_EL3);
613 set_feature(&cpu->env, ARM_FEATURE_PMU);
614
615
616 cpu->clidr = 0x82000023;
617 cpu->ctr = 0xb444c004;
618 cpu->dcz_blocksize = 4;
619 cpu->id_aa64afr0 = 0x00000000;
620 cpu->id_aa64afr1 = 0x00000000;
621 cpu->isar.id_aa64dfr0 = 0x000001f210305519ull;
622 cpu->isar.id_aa64dfr1 = 0x00000000;
623 cpu->isar.id_aa64isar0 = 0x1011111110212120ull;
624 cpu->isar.id_aa64isar1 = 0x0111000001211032ull;
625 cpu->isar.id_aa64mmfr0 = 0x0000000000101125ull;
626 cpu->isar.id_aa64mmfr1 = 0x0000000010212122ull;
627 cpu->isar.id_aa64mmfr2 = 0x0220011102101011ull;
628 cpu->isar.id_aa64pfr0 = 0x1101110120111112ull;
629 cpu->isar.id_aa64pfr1 = 0x0000000000000020ull;
630 cpu->id_afr0 = 0x00000000;
631 cpu->isar.id_dfr0 = 0x15011099;
632 cpu->isar.id_isar0 = 0x02101110;
633 cpu->isar.id_isar1 = 0x13112111;
634 cpu->isar.id_isar2 = 0x21232042;
635 cpu->isar.id_isar3 = 0x01112131;
636 cpu->isar.id_isar4 = 0x00010142;
637 cpu->isar.id_isar5 = 0x11011121;
638 cpu->isar.id_isar6 = 0x01100111;
639 cpu->isar.id_mmfr0 = 0x10201105;
640 cpu->isar.id_mmfr1 = 0x40000000;
641 cpu->isar.id_mmfr2 = 0x01260000;
642 cpu->isar.id_mmfr3 = 0x02122211;
643 cpu->isar.id_mmfr4 = 0x01021110;
644 cpu->isar.id_pfr0 = 0x21110131;
645 cpu->isar.id_pfr1 = 0x00010000;
646 cpu->isar.id_pfr2 = 0x00000011;
647 cpu->midr = 0x411FD402;
648 cpu->revidr = 0;
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671 cpu->ccsidr[0] = 0x000000ff0000001aull;
672 cpu->ccsidr[1] = 0x000000ff0000001aull;
673 cpu->ccsidr[2] = 0x000007ff0000003aull;
674
675
676 cpu->reset_sctlr = 0x30c50838;
677
678
679 cpu->gic_num_lrs = 4;
680 cpu->gic_vpribits = 5;
681 cpu->gic_vprebits = 5;
682 cpu->gic_pribits = 5;
683
684
685 cpu->isar.mvfr0 = 0x10110222;
686 cpu->isar.mvfr1 = 0x13211111;
687 cpu->isar.mvfr2 = 0x00000043;
688
689
690 cpu->isar.id_aa64zfr0 = 0x0000100000100000;
691 cpu->sve_vq.supported = (1 << 0)
692 | (1 << 1);
693
694
695 cpu->isar.reset_pmcr_el0 = 0x41213000;
696
697 define_neoverse_v1_cp_reginfo(cpu);
698
699 aarch64_add_pauth_properties(obj);
700 aarch64_add_sve_properties(obj);
701}
702
703
704
705
706
707
708void aarch64_max_tcg_initfn(Object *obj)
709{
710 ARMCPU *cpu = ARM_CPU(obj);
711 uint64_t t;
712 uint32_t u;
713
714
715
716
717
718
719
720
721
722
723
724
725
726 t = FIELD_DP64(0, MIDR_EL1, IMPLEMENTER, 0);
727 t = FIELD_DP64(t, MIDR_EL1, ARCHITECTURE, 0xf);
728 t = FIELD_DP64(t, MIDR_EL1, PARTNUM, 'Q');
729 t = FIELD_DP64(t, MIDR_EL1, VARIANT, 0);
730 t = FIELD_DP64(t, MIDR_EL1, REVISION, 0);
731 cpu->midr = t;
732
733
734
735
736
737 u = cpu->clidr;
738 u = FIELD_DP32(u, CLIDR_EL1, LOUIS, 0);
739 u = FIELD_DP32(u, CLIDR_EL1, LOUU, 0);
740 cpu->clidr = u;
741
742 t = cpu->isar.id_aa64isar0;
743 t = FIELD_DP64(t, ID_AA64ISAR0, AES, 2);
744 t = FIELD_DP64(t, ID_AA64ISAR0, SHA1, 1);
745 t = FIELD_DP64(t, ID_AA64ISAR0, SHA2, 2);
746 t = FIELD_DP64(t, ID_AA64ISAR0, CRC32, 1);
747 t = FIELD_DP64(t, ID_AA64ISAR0, ATOMIC, 2);
748 t = FIELD_DP64(t, ID_AA64ISAR0, RDM, 1);
749 t = FIELD_DP64(t, ID_AA64ISAR0, SHA3, 1);
750 t = FIELD_DP64(t, ID_AA64ISAR0, SM3, 1);
751 t = FIELD_DP64(t, ID_AA64ISAR0, SM4, 1);
752 t = FIELD_DP64(t, ID_AA64ISAR0, DP, 1);
753 t = FIELD_DP64(t, ID_AA64ISAR0, FHM, 1);
754 t = FIELD_DP64(t, ID_AA64ISAR0, TS, 2);
755 t = FIELD_DP64(t, ID_AA64ISAR0, TLB, 2);
756 t = FIELD_DP64(t, ID_AA64ISAR0, RNDR, 1);
757 cpu->isar.id_aa64isar0 = t;
758
759 t = cpu->isar.id_aa64isar1;
760 t = FIELD_DP64(t, ID_AA64ISAR1, DPB, 2);
761 t = FIELD_DP64(t, ID_AA64ISAR1, JSCVT, 1);
762 t = FIELD_DP64(t, ID_AA64ISAR1, FCMA, 1);
763 t = FIELD_DP64(t, ID_AA64ISAR1, LRCPC, 2);
764 t = FIELD_DP64(t, ID_AA64ISAR1, FRINTTS, 1);
765 t = FIELD_DP64(t, ID_AA64ISAR1, SB, 1);
766 t = FIELD_DP64(t, ID_AA64ISAR1, SPECRES, 1);
767 t = FIELD_DP64(t, ID_AA64ISAR1, BF16, 1);
768 t = FIELD_DP64(t, ID_AA64ISAR1, DGH, 1);
769 t = FIELD_DP64(t, ID_AA64ISAR1, I8MM, 1);
770 cpu->isar.id_aa64isar1 = t;
771
772 t = cpu->isar.id_aa64pfr0;
773 t = FIELD_DP64(t, ID_AA64PFR0, FP, 1);
774 t = FIELD_DP64(t, ID_AA64PFR0, ADVSIMD, 1);
775 t = FIELD_DP64(t, ID_AA64PFR0, RAS, 2);
776 t = FIELD_DP64(t, ID_AA64PFR0, SVE, 1);
777 t = FIELD_DP64(t, ID_AA64PFR0, SEL2, 1);
778 t = FIELD_DP64(t, ID_AA64PFR0, DIT, 1);
779 t = FIELD_DP64(t, ID_AA64PFR0, CSV2, 2);
780 t = FIELD_DP64(t, ID_AA64PFR0, CSV3, 1);
781 cpu->isar.id_aa64pfr0 = t;
782
783 t = cpu->isar.id_aa64pfr1;
784 t = FIELD_DP64(t, ID_AA64PFR1, BT, 1);
785 t = FIELD_DP64(t, ID_AA64PFR1, SSBS, 2);
786
787
788
789
790
791 t = FIELD_DP64(t, ID_AA64PFR1, MTE, 3);
792 t = FIELD_DP64(t, ID_AA64PFR1, RAS_FRAC, 0);
793 t = FIELD_DP64(t, ID_AA64PFR1, SME, 1);
794 t = FIELD_DP64(t, ID_AA64PFR1, CSV2_FRAC, 0);
795 cpu->isar.id_aa64pfr1 = t;
796
797 t = cpu->isar.id_aa64mmfr0;
798 t = FIELD_DP64(t, ID_AA64MMFR0, PARANGE, 6);
799 t = FIELD_DP64(t, ID_AA64MMFR0, TGRAN16, 1);
800 t = FIELD_DP64(t, ID_AA64MMFR0, TGRAN16_2, 2);
801 t = FIELD_DP64(t, ID_AA64MMFR0, TGRAN64_2, 2);
802 t = FIELD_DP64(t, ID_AA64MMFR0, TGRAN4_2, 2);
803 t = FIELD_DP64(t, ID_AA64MMFR0, FGT, 1);
804 cpu->isar.id_aa64mmfr0 = t;
805
806 t = cpu->isar.id_aa64mmfr1;
807 t = FIELD_DP64(t, ID_AA64MMFR1, HAFDBS, 2);
808 t = FIELD_DP64(t, ID_AA64MMFR1, VMIDBITS, 2);
809 t = FIELD_DP64(t, ID_AA64MMFR1, VH, 1);
810 t = FIELD_DP64(t, ID_AA64MMFR1, HPDS, 1);
811 t = FIELD_DP64(t, ID_AA64MMFR1, LO, 1);
812 t = FIELD_DP64(t, ID_AA64MMFR1, PAN, 3);
813 t = FIELD_DP64(t, ID_AA64MMFR1, XNX, 1);
814 t = FIELD_DP64(t, ID_AA64MMFR1, ETS, 1);
815 t = FIELD_DP64(t, ID_AA64MMFR1, HCX, 1);
816 cpu->isar.id_aa64mmfr1 = t;
817
818 t = cpu->isar.id_aa64mmfr2;
819 t = FIELD_DP64(t, ID_AA64MMFR2, CNP, 1);
820 t = FIELD_DP64(t, ID_AA64MMFR2, UAO, 1);
821 t = FIELD_DP64(t, ID_AA64MMFR2, IESB, 1);
822 t = FIELD_DP64(t, ID_AA64MMFR2, VARANGE, 1);
823 t = FIELD_DP64(t, ID_AA64MMFR2, ST, 1);
824 t = FIELD_DP64(t, ID_AA64MMFR2, AT, 1);
825 t = FIELD_DP64(t, ID_AA64MMFR2, IDS, 1);
826 t = FIELD_DP64(t, ID_AA64MMFR2, FWB, 1);
827 t = FIELD_DP64(t, ID_AA64MMFR2, TTL, 1);
828 t = FIELD_DP64(t, ID_AA64MMFR2, BBM, 2);
829 t = FIELD_DP64(t, ID_AA64MMFR2, EVT, 2);
830 t = FIELD_DP64(t, ID_AA64MMFR2, E0PD, 1);
831 cpu->isar.id_aa64mmfr2 = t;
832
833 t = cpu->isar.id_aa64zfr0;
834 t = FIELD_DP64(t, ID_AA64ZFR0, SVEVER, 1);
835 t = FIELD_DP64(t, ID_AA64ZFR0, AES, 2);
836 t = FIELD_DP64(t, ID_AA64ZFR0, BITPERM, 1);
837 t = FIELD_DP64(t, ID_AA64ZFR0, BFLOAT16, 1);
838 t = FIELD_DP64(t, ID_AA64ZFR0, SHA3, 1);
839 t = FIELD_DP64(t, ID_AA64ZFR0, SM4, 1);
840 t = FIELD_DP64(t, ID_AA64ZFR0, I8MM, 1);
841 t = FIELD_DP64(t, ID_AA64ZFR0, F32MM, 1);
842 t = FIELD_DP64(t, ID_AA64ZFR0, F64MM, 1);
843 cpu->isar.id_aa64zfr0 = t;
844
845 t = cpu->isar.id_aa64dfr0;
846 t = FIELD_DP64(t, ID_AA64DFR0, DEBUGVER, 9);
847 t = FIELD_DP64(t, ID_AA64DFR0, PMUVER, 6);
848 cpu->isar.id_aa64dfr0 = t;
849
850 t = cpu->isar.id_aa64smfr0;
851 t = FIELD_DP64(t, ID_AA64SMFR0, F32F32, 1);
852 t = FIELD_DP64(t, ID_AA64SMFR0, B16F32, 1);
853 t = FIELD_DP64(t, ID_AA64SMFR0, F16F32, 1);
854 t = FIELD_DP64(t, ID_AA64SMFR0, I8I32, 0xf);
855 t = FIELD_DP64(t, ID_AA64SMFR0, F64F64, 1);
856 t = FIELD_DP64(t, ID_AA64SMFR0, I16I64, 0xf);
857 t = FIELD_DP64(t, ID_AA64SMFR0, FA64, 1);
858 cpu->isar.id_aa64smfr0 = t;
859
860
861 aa32_max_features(cpu);
862
863#ifdef CONFIG_USER_ONLY
864
865
866
867
868 cpu->ctr = 0x80038003;
869 cpu->dcz_blocksize = 7;
870#endif
871
872 cpu->sve_vq.supported = MAKE_64BIT_MASK(0, ARM_MAX_VQ);
873 cpu->sme_vq.supported = SVE_VQ_POW2_MAP;
874
875 aarch64_add_pauth_properties(obj);
876 aarch64_add_sve_properties(obj);
877 aarch64_add_sme_properties(obj);
878 object_property_add(obj, "sve-max-vq", "uint32", cpu_max_get_sve_max_vq,
879 cpu_max_set_sve_max_vq, NULL, NULL);
880 object_property_add_bool(obj, "x-rme", cpu_arm_get_rme, cpu_arm_set_rme);
881 object_property_add(obj, "x-l0gptsz", "uint32", cpu_max_get_l0gptsz,
882 cpu_max_set_l0gptsz, NULL, NULL);
883 qdev_property_add_static(DEVICE(obj), &arm_cpu_lpa2_property);
884}
885
886static const ARMCPUInfo aarch64_cpus[] = {
887 { .name = "cortex-a35", .initfn = aarch64_a35_initfn },
888 { .name = "cortex-a55", .initfn = aarch64_a55_initfn },
889 { .name = "cortex-a72", .initfn = aarch64_a72_initfn },
890 { .name = "cortex-a76", .initfn = aarch64_a76_initfn },
891 { .name = "a64fx", .initfn = aarch64_a64fx_initfn },
892 { .name = "neoverse-n1", .initfn = aarch64_neoverse_n1_initfn },
893 { .name = "neoverse-v1", .initfn = aarch64_neoverse_v1_initfn },
894};
895
896static void aarch64_cpu_register_types(void)
897{
898 size_t i;
899
900 for (i = 0; i < ARRAY_SIZE(aarch64_cpus); ++i) {
901 aarch64_cpu_register(&aarch64_cpus[i]);
902 }
903}
904
905type_init(aarch64_cpu_register_types)
906