139920a04SFabiano Rosas /* 239920a04SFabiano Rosas * QEMU AArch64 TCG CPUs 339920a04SFabiano Rosas * 439920a04SFabiano Rosas * Copyright (c) 2013 Linaro Ltd 539920a04SFabiano Rosas * 639920a04SFabiano Rosas * This program is free software; you can redistribute it and/or 739920a04SFabiano Rosas * modify it under the terms of the GNU General Public License 839920a04SFabiano Rosas * as published by the Free Software Foundation; either version 2 939920a04SFabiano Rosas * of the License, or (at your option) any later version. 1039920a04SFabiano Rosas * 1139920a04SFabiano Rosas * This program is distributed in the hope that it will be useful, 1239920a04SFabiano Rosas * but WITHOUT ANY WARRANTY; without even the implied warranty of 1339920a04SFabiano Rosas * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1439920a04SFabiano Rosas * GNU General Public License for more details. 1539920a04SFabiano Rosas * 1639920a04SFabiano Rosas * You should have received a copy of the GNU General Public License 1739920a04SFabiano Rosas * along with this program; if not, see 1839920a04SFabiano Rosas * <http://www.gnu.org/licenses/gpl-2.0.html> 1939920a04SFabiano Rosas */ 2039920a04SFabiano Rosas 2139920a04SFabiano Rosas #include "qemu/osdep.h" 2239920a04SFabiano Rosas #include "qapi/error.h" 2339920a04SFabiano Rosas #include "cpu.h" 2439920a04SFabiano Rosas #include "qemu/module.h" 2539920a04SFabiano Rosas #include "qapi/visitor.h" 2639920a04SFabiano Rosas #include "hw/qdev-properties.h" 27d8100822SRichard Henderson #include "qemu/units.h" 2839920a04SFabiano Rosas #include "internals.h" 295a534314SPeter Maydell #include "cpu-features.h" 3039920a04SFabiano Rosas #include "cpregs.h" 3139920a04SFabiano Rosas 3239920a04SFabiano Rosas static void aarch64_a35_initfn(Object *obj) 3339920a04SFabiano Rosas { 3439920a04SFabiano Rosas ARMCPU *cpu = ARM_CPU(obj); 3539920a04SFabiano Rosas 3639920a04SFabiano Rosas cpu->dtb_compatible = "arm,cortex-a35"; 3739920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_V8); 3839920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_NEON); 3939920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_GENERIC_TIMER); 40f037f5b4SPeter Maydell set_feature(&cpu->env, ARM_FEATURE_BACKCOMPAT_CNTFRQ); 4139920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_AARCH64); 4239920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_CBAR_RO); 4339920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_EL2); 4439920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_EL3); 4539920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_PMU); 4639920a04SFabiano Rosas 4739920a04SFabiano Rosas /* From B2.2 AArch64 identification registers. */ 4839920a04SFabiano Rosas cpu->midr = 0x411fd040; 4939920a04SFabiano Rosas cpu->revidr = 0; 5039920a04SFabiano Rosas cpu->ctr = 0x84448004; 5139920a04SFabiano Rosas cpu->isar.id_pfr0 = 0x00000131; 5239920a04SFabiano Rosas cpu->isar.id_pfr1 = 0x00011011; 5339920a04SFabiano Rosas cpu->isar.id_dfr0 = 0x03010066; 5439920a04SFabiano Rosas cpu->id_afr0 = 0; 5539920a04SFabiano Rosas cpu->isar.id_mmfr0 = 0x10201105; 5639920a04SFabiano Rosas cpu->isar.id_mmfr1 = 0x40000000; 5739920a04SFabiano Rosas cpu->isar.id_mmfr2 = 0x01260000; 5839920a04SFabiano Rosas cpu->isar.id_mmfr3 = 0x02102211; 5939920a04SFabiano Rosas cpu->isar.id_isar0 = 0x02101110; 6039920a04SFabiano Rosas cpu->isar.id_isar1 = 0x13112111; 6139920a04SFabiano Rosas cpu->isar.id_isar2 = 0x21232042; 6239920a04SFabiano Rosas cpu->isar.id_isar3 = 0x01112131; 6339920a04SFabiano Rosas cpu->isar.id_isar4 = 0x00011142; 6439920a04SFabiano Rosas cpu->isar.id_isar5 = 0x00011121; 6539920a04SFabiano Rosas cpu->isar.id_aa64pfr0 = 0x00002222; 6639920a04SFabiano Rosas cpu->isar.id_aa64pfr1 = 0; 6739920a04SFabiano Rosas cpu->isar.id_aa64dfr0 = 0x10305106; 6839920a04SFabiano Rosas cpu->isar.id_aa64dfr1 = 0; 6939920a04SFabiano Rosas cpu->isar.id_aa64isar0 = 0x00011120; 7039920a04SFabiano Rosas cpu->isar.id_aa64isar1 = 0; 7139920a04SFabiano Rosas cpu->isar.id_aa64mmfr0 = 0x00101122; 7239920a04SFabiano Rosas cpu->isar.id_aa64mmfr1 = 0; 7339920a04SFabiano Rosas cpu->clidr = 0x0a200023; 7439920a04SFabiano Rosas cpu->dcz_blocksize = 4; 7539920a04SFabiano Rosas 7639920a04SFabiano Rosas /* From B2.4 AArch64 Virtual Memory control registers */ 7739920a04SFabiano Rosas cpu->reset_sctlr = 0x00c50838; 7839920a04SFabiano Rosas 7939920a04SFabiano Rosas /* From B2.10 AArch64 performance monitor registers */ 8039920a04SFabiano Rosas cpu->isar.reset_pmcr_el0 = 0x410a3000; 8139920a04SFabiano Rosas 8239920a04SFabiano Rosas /* From B2.29 Cache ID registers */ 83676624d7SAlireza Sanaee /* 32KB L1 dcache */ 84676624d7SAlireza Sanaee cpu->ccsidr[0] = make_ccsidr(CCSIDR_FORMAT_LEGACY, 4, 64, 32 * KiB, 7); 85676624d7SAlireza Sanaee /* 32KB L1 icache */ 86676624d7SAlireza Sanaee cpu->ccsidr[1] = make_ccsidr(CCSIDR_FORMAT_LEGACY, 4, 64, 32 * KiB, 2); 87676624d7SAlireza Sanaee /* 512KB L2 cache */ 88676624d7SAlireza Sanaee cpu->ccsidr[2] = make_ccsidr(CCSIDR_FORMAT_LEGACY, 16, 64, 512 * KiB, 7); 8939920a04SFabiano Rosas 9039920a04SFabiano Rosas /* From B3.5 VGIC Type register */ 9139920a04SFabiano Rosas cpu->gic_num_lrs = 4; 9239920a04SFabiano Rosas cpu->gic_vpribits = 5; 9339920a04SFabiano Rosas cpu->gic_vprebits = 5; 9439920a04SFabiano Rosas cpu->gic_pribits = 5; 9539920a04SFabiano Rosas 9639920a04SFabiano Rosas /* From C6.4 Debug ID Register */ 9739920a04SFabiano Rosas cpu->isar.dbgdidr = 0x3516d000; 9839920a04SFabiano Rosas /* From C6.5 Debug Device ID Register */ 9939920a04SFabiano Rosas cpu->isar.dbgdevid = 0x00110f13; 10039920a04SFabiano Rosas /* From C6.6 Debug Device ID Register 1 */ 10139920a04SFabiano Rosas cpu->isar.dbgdevid1 = 0x2; 10239920a04SFabiano Rosas 10339920a04SFabiano Rosas /* From Cortex-A35 SIMD and Floating-point Support r1p0 */ 10439920a04SFabiano Rosas /* From 3.2 AArch32 register summary */ 10539920a04SFabiano Rosas cpu->reset_fpsid = 0x41034043; 10639920a04SFabiano Rosas 10739920a04SFabiano Rosas /* From 2.2 AArch64 register summary */ 10839920a04SFabiano Rosas cpu->isar.mvfr0 = 0x10110222; 10939920a04SFabiano Rosas cpu->isar.mvfr1 = 0x12111111; 11039920a04SFabiano Rosas cpu->isar.mvfr2 = 0x00000043; 11139920a04SFabiano Rosas 11239920a04SFabiano Rosas /* These values are the same with A53/A57/A72. */ 11339920a04SFabiano Rosas define_cortex_a72_a57_a53_cp_reginfo(cpu); 11439920a04SFabiano Rosas } 11539920a04SFabiano Rosas 11639920a04SFabiano Rosas static void cpu_max_get_sve_max_vq(Object *obj, Visitor *v, const char *name, 11739920a04SFabiano Rosas void *opaque, Error **errp) 11839920a04SFabiano Rosas { 11939920a04SFabiano Rosas ARMCPU *cpu = ARM_CPU(obj); 12039920a04SFabiano Rosas uint32_t value; 12139920a04SFabiano Rosas 12239920a04SFabiano Rosas /* All vector lengths are disabled when SVE is off. */ 12339920a04SFabiano Rosas if (!cpu_isar_feature(aa64_sve, cpu)) { 12439920a04SFabiano Rosas value = 0; 12539920a04SFabiano Rosas } else { 12639920a04SFabiano Rosas value = cpu->sve_max_vq; 12739920a04SFabiano Rosas } 12839920a04SFabiano Rosas visit_type_uint32(v, name, &value, errp); 12939920a04SFabiano Rosas } 13039920a04SFabiano Rosas 13139920a04SFabiano Rosas static void cpu_max_set_sve_max_vq(Object *obj, Visitor *v, const char *name, 13239920a04SFabiano Rosas void *opaque, Error **errp) 13339920a04SFabiano Rosas { 13439920a04SFabiano Rosas ARMCPU *cpu = ARM_CPU(obj); 13539920a04SFabiano Rosas uint32_t max_vq; 13639920a04SFabiano Rosas 13739920a04SFabiano Rosas if (!visit_type_uint32(v, name, &max_vq, errp)) { 13839920a04SFabiano Rosas return; 13939920a04SFabiano Rosas } 14039920a04SFabiano Rosas 14139920a04SFabiano Rosas if (max_vq == 0 || max_vq > ARM_MAX_VQ) { 14239920a04SFabiano Rosas error_setg(errp, "unsupported SVE vector length"); 14339920a04SFabiano Rosas error_append_hint(errp, "Valid sve-max-vq in range [1-%d]\n", 14439920a04SFabiano Rosas ARM_MAX_VQ); 14539920a04SFabiano Rosas return; 14639920a04SFabiano Rosas } 14739920a04SFabiano Rosas 14839920a04SFabiano Rosas cpu->sve_max_vq = max_vq; 14939920a04SFabiano Rosas } 15039920a04SFabiano Rosas 151a834d547SRichard Henderson static bool cpu_arm_get_rme(Object *obj, Error **errp) 152a834d547SRichard Henderson { 153a834d547SRichard Henderson ARMCPU *cpu = ARM_CPU(obj); 154a834d547SRichard Henderson return cpu_isar_feature(aa64_rme, cpu); 155a834d547SRichard Henderson } 156a834d547SRichard Henderson 157a834d547SRichard Henderson static void cpu_arm_set_rme(Object *obj, bool value, Error **errp) 158a834d547SRichard Henderson { 159a834d547SRichard Henderson ARMCPU *cpu = ARM_CPU(obj); 160a834d547SRichard Henderson uint64_t t; 161a834d547SRichard Henderson 162a834d547SRichard Henderson t = cpu->isar.id_aa64pfr0; 163a834d547SRichard Henderson t = FIELD_DP64(t, ID_AA64PFR0, RME, value); 164a834d547SRichard Henderson cpu->isar.id_aa64pfr0 = t; 165a834d547SRichard Henderson } 166a834d547SRichard Henderson 167a834d547SRichard Henderson static void cpu_max_set_l0gptsz(Object *obj, Visitor *v, const char *name, 168a834d547SRichard Henderson void *opaque, Error **errp) 169a834d547SRichard Henderson { 170a834d547SRichard Henderson ARMCPU *cpu = ARM_CPU(obj); 171a834d547SRichard Henderson uint32_t value; 172a834d547SRichard Henderson 173a834d547SRichard Henderson if (!visit_type_uint32(v, name, &value, errp)) { 174a834d547SRichard Henderson return; 175a834d547SRichard Henderson } 176a834d547SRichard Henderson 177a834d547SRichard Henderson /* Encode the value for the GPCCR_EL3 field. */ 178a834d547SRichard Henderson switch (value) { 179a834d547SRichard Henderson case 30: 180a834d547SRichard Henderson case 34: 181a834d547SRichard Henderson case 36: 182a834d547SRichard Henderson case 39: 183a834d547SRichard Henderson cpu->reset_l0gptsz = value - 30; 184a834d547SRichard Henderson break; 185a834d547SRichard Henderson default: 186a834d547SRichard Henderson error_setg(errp, "invalid value for l0gptsz"); 187a834d547SRichard Henderson error_append_hint(errp, "valid values are 30, 34, 36, 39\n"); 188a834d547SRichard Henderson break; 189a834d547SRichard Henderson } 190a834d547SRichard Henderson } 191a834d547SRichard Henderson 192a834d547SRichard Henderson static void cpu_max_get_l0gptsz(Object *obj, Visitor *v, const char *name, 193a834d547SRichard Henderson void *opaque, Error **errp) 194a834d547SRichard Henderson { 195a834d547SRichard Henderson ARMCPU *cpu = ARM_CPU(obj); 196a834d547SRichard Henderson uint32_t value = cpu->reset_l0gptsz + 30; 197a834d547SRichard Henderson 198a834d547SRichard Henderson visit_type_uint32(v, name, &value, errp); 199a834d547SRichard Henderson } 200a834d547SRichard Henderson 201eeed7aedSRichard Henderson static const Property arm_cpu_lpa2_property = 20239920a04SFabiano Rosas DEFINE_PROP_BOOL("lpa2", ARMCPU, prop_lpa2, true); 20339920a04SFabiano Rosas 20439920a04SFabiano Rosas static void aarch64_a55_initfn(Object *obj) 20539920a04SFabiano Rosas { 20639920a04SFabiano Rosas ARMCPU *cpu = ARM_CPU(obj); 20739920a04SFabiano Rosas 20839920a04SFabiano Rosas cpu->dtb_compatible = "arm,cortex-a55"; 20939920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_V8); 21039920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_NEON); 21139920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_GENERIC_TIMER); 212f037f5b4SPeter Maydell set_feature(&cpu->env, ARM_FEATURE_BACKCOMPAT_CNTFRQ); 21339920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_AARCH64); 21439920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_CBAR_RO); 21539920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_EL2); 21639920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_EL3); 21739920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_PMU); 21839920a04SFabiano Rosas 21939920a04SFabiano Rosas /* Ordered by B2.4 AArch64 registers by functional group */ 22039920a04SFabiano Rosas cpu->clidr = 0x82000023; 22139920a04SFabiano Rosas cpu->ctr = 0x84448004; /* L1Ip = VIPT */ 22239920a04SFabiano Rosas cpu->dcz_blocksize = 4; /* 64 bytes */ 22339920a04SFabiano Rosas cpu->isar.id_aa64dfr0 = 0x0000000010305408ull; 22439920a04SFabiano Rosas cpu->isar.id_aa64isar0 = 0x0000100010211120ull; 22539920a04SFabiano Rosas cpu->isar.id_aa64isar1 = 0x0000000000100001ull; 22639920a04SFabiano Rosas cpu->isar.id_aa64mmfr0 = 0x0000000000101122ull; 22739920a04SFabiano Rosas cpu->isar.id_aa64mmfr1 = 0x0000000010212122ull; 22839920a04SFabiano Rosas cpu->isar.id_aa64mmfr2 = 0x0000000000001011ull; 22939920a04SFabiano Rosas cpu->isar.id_aa64pfr0 = 0x0000000010112222ull; 23039920a04SFabiano Rosas cpu->isar.id_aa64pfr1 = 0x0000000000000010ull; 23139920a04SFabiano Rosas cpu->id_afr0 = 0x00000000; 23239920a04SFabiano Rosas cpu->isar.id_dfr0 = 0x04010088; 23339920a04SFabiano Rosas cpu->isar.id_isar0 = 0x02101110; 23439920a04SFabiano Rosas cpu->isar.id_isar1 = 0x13112111; 23539920a04SFabiano Rosas cpu->isar.id_isar2 = 0x21232042; 23639920a04SFabiano Rosas cpu->isar.id_isar3 = 0x01112131; 23739920a04SFabiano Rosas cpu->isar.id_isar4 = 0x00011142; 23839920a04SFabiano Rosas cpu->isar.id_isar5 = 0x01011121; 23939920a04SFabiano Rosas cpu->isar.id_isar6 = 0x00000010; 24039920a04SFabiano Rosas cpu->isar.id_mmfr0 = 0x10201105; 24139920a04SFabiano Rosas cpu->isar.id_mmfr1 = 0x40000000; 24239920a04SFabiano Rosas cpu->isar.id_mmfr2 = 0x01260000; 24339920a04SFabiano Rosas cpu->isar.id_mmfr3 = 0x02122211; 24439920a04SFabiano Rosas cpu->isar.id_mmfr4 = 0x00021110; 24539920a04SFabiano Rosas cpu->isar.id_pfr0 = 0x10010131; 24639920a04SFabiano Rosas cpu->isar.id_pfr1 = 0x00011011; 24739920a04SFabiano Rosas cpu->isar.id_pfr2 = 0x00000011; 24839920a04SFabiano Rosas cpu->midr = 0x412FD050; /* r2p0 */ 24939920a04SFabiano Rosas cpu->revidr = 0; 25039920a04SFabiano Rosas 25139920a04SFabiano Rosas /* From B2.23 CCSIDR_EL1 */ 252676624d7SAlireza Sanaee /* 32KB L1 dcache */ 253676624d7SAlireza Sanaee cpu->ccsidr[0] = make_ccsidr(CCSIDR_FORMAT_LEGACY, 4, 64, 32 * KiB, 7); 254676624d7SAlireza Sanaee /* 32KB L1 icache */ 255676624d7SAlireza Sanaee cpu->ccsidr[1] = make_ccsidr(CCSIDR_FORMAT_LEGACY, 4, 64, 32 * KiB, 2); 256676624d7SAlireza Sanaee /* 512KB L2 cache */ 257676624d7SAlireza Sanaee cpu->ccsidr[2] = make_ccsidr(CCSIDR_FORMAT_LEGACY, 16, 64, 512 * KiB, 7); 25839920a04SFabiano Rosas 25939920a04SFabiano Rosas /* From B2.96 SCTLR_EL3 */ 26039920a04SFabiano Rosas cpu->reset_sctlr = 0x30c50838; 26139920a04SFabiano Rosas 26239920a04SFabiano Rosas /* From B4.45 ICH_VTR_EL2 */ 26339920a04SFabiano Rosas cpu->gic_num_lrs = 4; 26439920a04SFabiano Rosas cpu->gic_vpribits = 5; 26539920a04SFabiano Rosas cpu->gic_vprebits = 5; 26639920a04SFabiano Rosas cpu->gic_pribits = 5; 26739920a04SFabiano Rosas 26839920a04SFabiano Rosas cpu->isar.mvfr0 = 0x10110222; 26939920a04SFabiano Rosas cpu->isar.mvfr1 = 0x13211111; 27039920a04SFabiano Rosas cpu->isar.mvfr2 = 0x00000043; 27139920a04SFabiano Rosas 27239920a04SFabiano Rosas /* From D5.4 AArch64 PMU register summary */ 27339920a04SFabiano Rosas cpu->isar.reset_pmcr_el0 = 0x410b3000; 27439920a04SFabiano Rosas } 27539920a04SFabiano Rosas 27639920a04SFabiano Rosas static void aarch64_a72_initfn(Object *obj) 27739920a04SFabiano Rosas { 27839920a04SFabiano Rosas ARMCPU *cpu = ARM_CPU(obj); 27939920a04SFabiano Rosas 28039920a04SFabiano Rosas cpu->dtb_compatible = "arm,cortex-a72"; 28139920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_V8); 28239920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_NEON); 28339920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_GENERIC_TIMER); 284f037f5b4SPeter Maydell set_feature(&cpu->env, ARM_FEATURE_BACKCOMPAT_CNTFRQ); 28539920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_AARCH64); 28639920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_CBAR_RO); 28739920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_EL2); 28839920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_EL3); 28939920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_PMU); 29039920a04SFabiano Rosas cpu->midr = 0x410fd083; 29139920a04SFabiano Rosas cpu->revidr = 0x00000000; 29239920a04SFabiano Rosas cpu->reset_fpsid = 0x41034080; 29339920a04SFabiano Rosas cpu->isar.mvfr0 = 0x10110222; 29439920a04SFabiano Rosas cpu->isar.mvfr1 = 0x12111111; 29539920a04SFabiano Rosas cpu->isar.mvfr2 = 0x00000043; 29639920a04SFabiano Rosas cpu->ctr = 0x8444c004; 29739920a04SFabiano Rosas cpu->reset_sctlr = 0x00c50838; 29839920a04SFabiano Rosas cpu->isar.id_pfr0 = 0x00000131; 29939920a04SFabiano Rosas cpu->isar.id_pfr1 = 0x00011011; 30039920a04SFabiano Rosas cpu->isar.id_dfr0 = 0x03010066; 30139920a04SFabiano Rosas cpu->id_afr0 = 0x00000000; 30239920a04SFabiano Rosas cpu->isar.id_mmfr0 = 0x10201105; 30339920a04SFabiano Rosas cpu->isar.id_mmfr1 = 0x40000000; 30439920a04SFabiano Rosas cpu->isar.id_mmfr2 = 0x01260000; 30539920a04SFabiano Rosas cpu->isar.id_mmfr3 = 0x02102211; 30639920a04SFabiano Rosas cpu->isar.id_isar0 = 0x02101110; 30739920a04SFabiano Rosas cpu->isar.id_isar1 = 0x13112111; 30839920a04SFabiano Rosas cpu->isar.id_isar2 = 0x21232042; 30939920a04SFabiano Rosas cpu->isar.id_isar3 = 0x01112131; 31039920a04SFabiano Rosas cpu->isar.id_isar4 = 0x00011142; 31139920a04SFabiano Rosas cpu->isar.id_isar5 = 0x00011121; 31239920a04SFabiano Rosas cpu->isar.id_aa64pfr0 = 0x00002222; 31339920a04SFabiano Rosas cpu->isar.id_aa64dfr0 = 0x10305106; 31439920a04SFabiano Rosas cpu->isar.id_aa64isar0 = 0x00011120; 31539920a04SFabiano Rosas cpu->isar.id_aa64mmfr0 = 0x00001124; 31639920a04SFabiano Rosas cpu->isar.dbgdidr = 0x3516d000; 31739920a04SFabiano Rosas cpu->isar.dbgdevid = 0x01110f13; 31839920a04SFabiano Rosas cpu->isar.dbgdevid1 = 0x2; 31939920a04SFabiano Rosas cpu->isar.reset_pmcr_el0 = 0x41023000; 32039920a04SFabiano Rosas cpu->clidr = 0x0a200023; 321676624d7SAlireza Sanaee /* 32KB L1 dcache */ 322676624d7SAlireza Sanaee cpu->ccsidr[0] = make_ccsidr(CCSIDR_FORMAT_LEGACY, 4, 64, 32 * KiB, 7); 323676624d7SAlireza Sanaee /* 48KB L1 dcache */ 324676624d7SAlireza Sanaee cpu->ccsidr[1] = make_ccsidr(CCSIDR_FORMAT_LEGACY, 3, 64, 48 * KiB, 2); 325676624d7SAlireza Sanaee /* 1MB L2 cache */ 326676624d7SAlireza Sanaee cpu->ccsidr[2] = make_ccsidr(CCSIDR_FORMAT_LEGACY, 16, 64, 1 * MiB, 7); 32739920a04SFabiano Rosas cpu->dcz_blocksize = 4; /* 64 bytes */ 32839920a04SFabiano Rosas cpu->gic_num_lrs = 4; 32939920a04SFabiano Rosas cpu->gic_vpribits = 5; 33039920a04SFabiano Rosas cpu->gic_vprebits = 5; 33139920a04SFabiano Rosas cpu->gic_pribits = 5; 33239920a04SFabiano Rosas define_cortex_a72_a57_a53_cp_reginfo(cpu); 33339920a04SFabiano Rosas } 33439920a04SFabiano Rosas 33539920a04SFabiano Rosas static void aarch64_a76_initfn(Object *obj) 33639920a04SFabiano Rosas { 33739920a04SFabiano Rosas ARMCPU *cpu = ARM_CPU(obj); 33839920a04SFabiano Rosas 33939920a04SFabiano Rosas cpu->dtb_compatible = "arm,cortex-a76"; 34039920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_V8); 34139920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_NEON); 34239920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_GENERIC_TIMER); 343f037f5b4SPeter Maydell set_feature(&cpu->env, ARM_FEATURE_BACKCOMPAT_CNTFRQ); 34439920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_AARCH64); 34539920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_CBAR_RO); 34639920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_EL2); 34739920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_EL3); 34839920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_PMU); 34939920a04SFabiano Rosas 35039920a04SFabiano Rosas /* Ordered by B2.4 AArch64 registers by functional group */ 35139920a04SFabiano Rosas cpu->clidr = 0x82000023; 35239920a04SFabiano Rosas cpu->ctr = 0x8444C004; 35339920a04SFabiano Rosas cpu->dcz_blocksize = 4; 35439920a04SFabiano Rosas cpu->isar.id_aa64dfr0 = 0x0000000010305408ull; 35539920a04SFabiano Rosas cpu->isar.id_aa64isar0 = 0x0000100010211120ull; 35639920a04SFabiano Rosas cpu->isar.id_aa64isar1 = 0x0000000000100001ull; 35739920a04SFabiano Rosas cpu->isar.id_aa64mmfr0 = 0x0000000000101122ull; 35839920a04SFabiano Rosas cpu->isar.id_aa64mmfr1 = 0x0000000010212122ull; 35939920a04SFabiano Rosas cpu->isar.id_aa64mmfr2 = 0x0000000000001011ull; 36039920a04SFabiano Rosas cpu->isar.id_aa64pfr0 = 0x1100000010111112ull; /* GIC filled in later */ 36139920a04SFabiano Rosas cpu->isar.id_aa64pfr1 = 0x0000000000000010ull; 36239920a04SFabiano Rosas cpu->id_afr0 = 0x00000000; 36339920a04SFabiano Rosas cpu->isar.id_dfr0 = 0x04010088; 36439920a04SFabiano Rosas cpu->isar.id_isar0 = 0x02101110; 36539920a04SFabiano Rosas cpu->isar.id_isar1 = 0x13112111; 36639920a04SFabiano Rosas cpu->isar.id_isar2 = 0x21232042; 36739920a04SFabiano Rosas cpu->isar.id_isar3 = 0x01112131; 36839920a04SFabiano Rosas cpu->isar.id_isar4 = 0x00010142; 36939920a04SFabiano Rosas cpu->isar.id_isar5 = 0x01011121; 37039920a04SFabiano Rosas cpu->isar.id_isar6 = 0x00000010; 37139920a04SFabiano Rosas cpu->isar.id_mmfr0 = 0x10201105; 37239920a04SFabiano Rosas cpu->isar.id_mmfr1 = 0x40000000; 37339920a04SFabiano Rosas cpu->isar.id_mmfr2 = 0x01260000; 37439920a04SFabiano Rosas cpu->isar.id_mmfr3 = 0x02122211; 37539920a04SFabiano Rosas cpu->isar.id_mmfr4 = 0x00021110; 37639920a04SFabiano Rosas cpu->isar.id_pfr0 = 0x10010131; 37739920a04SFabiano Rosas cpu->isar.id_pfr1 = 0x00010000; /* GIC filled in later */ 37839920a04SFabiano Rosas cpu->isar.id_pfr2 = 0x00000011; 37939920a04SFabiano Rosas cpu->midr = 0x414fd0b1; /* r4p1 */ 38039920a04SFabiano Rosas cpu->revidr = 0; 38139920a04SFabiano Rosas 38239920a04SFabiano Rosas /* From B2.18 CCSIDR_EL1 */ 383676624d7SAlireza Sanaee /* 64KB L1 dcache */ 384676624d7SAlireza Sanaee cpu->ccsidr[0] = make_ccsidr(CCSIDR_FORMAT_LEGACY, 4, 64, 64 * KiB, 7); 385676624d7SAlireza Sanaee /* 64KB L1 icache */ 386676624d7SAlireza Sanaee cpu->ccsidr[1] = make_ccsidr(CCSIDR_FORMAT_LEGACY, 4, 64, 64 * KiB, 2); 387676624d7SAlireza Sanaee /* 512KB L2 cache */ 388676624d7SAlireza Sanaee cpu->ccsidr[2] = make_ccsidr(CCSIDR_FORMAT_LEGACY, 8, 64, 512 * KiB, 7); 38939920a04SFabiano Rosas 39039920a04SFabiano Rosas /* From B2.93 SCTLR_EL3 */ 39139920a04SFabiano Rosas cpu->reset_sctlr = 0x30c50838; 39239920a04SFabiano Rosas 39339920a04SFabiano Rosas /* From B4.23 ICH_VTR_EL2 */ 39439920a04SFabiano Rosas cpu->gic_num_lrs = 4; 39539920a04SFabiano Rosas cpu->gic_vpribits = 5; 39639920a04SFabiano Rosas cpu->gic_vprebits = 5; 39739920a04SFabiano Rosas cpu->gic_pribits = 5; 39839920a04SFabiano Rosas 39939920a04SFabiano Rosas /* From B5.1 AdvSIMD AArch64 register summary */ 40039920a04SFabiano Rosas cpu->isar.mvfr0 = 0x10110222; 40139920a04SFabiano Rosas cpu->isar.mvfr1 = 0x13211111; 40239920a04SFabiano Rosas cpu->isar.mvfr2 = 0x00000043; 40339920a04SFabiano Rosas 40439920a04SFabiano Rosas /* From D5.1 AArch64 PMU register summary */ 40539920a04SFabiano Rosas cpu->isar.reset_pmcr_el0 = 0x410b3000; 40639920a04SFabiano Rosas } 40739920a04SFabiano Rosas 40839920a04SFabiano Rosas static void aarch64_a64fx_initfn(Object *obj) 40939920a04SFabiano Rosas { 41039920a04SFabiano Rosas ARMCPU *cpu = ARM_CPU(obj); 41139920a04SFabiano Rosas 41239920a04SFabiano Rosas cpu->dtb_compatible = "arm,a64fx"; 41339920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_V8); 41439920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_NEON); 41539920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_GENERIC_TIMER); 416f037f5b4SPeter Maydell set_feature(&cpu->env, ARM_FEATURE_BACKCOMPAT_CNTFRQ); 41739920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_AARCH64); 41839920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_EL2); 41939920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_EL3); 42039920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_PMU); 42139920a04SFabiano Rosas cpu->midr = 0x461f0010; 42239920a04SFabiano Rosas cpu->revidr = 0x00000000; 42339920a04SFabiano Rosas cpu->ctr = 0x86668006; 42439920a04SFabiano Rosas cpu->reset_sctlr = 0x30000180; 42539920a04SFabiano Rosas cpu->isar.id_aa64pfr0 = 0x0000000101111111; /* No RAS Extensions */ 42639920a04SFabiano Rosas cpu->isar.id_aa64pfr1 = 0x0000000000000000; 42739920a04SFabiano Rosas cpu->isar.id_aa64dfr0 = 0x0000000010305408; 42839920a04SFabiano Rosas cpu->isar.id_aa64dfr1 = 0x0000000000000000; 42939920a04SFabiano Rosas cpu->id_aa64afr0 = 0x0000000000000000; 43039920a04SFabiano Rosas cpu->id_aa64afr1 = 0x0000000000000000; 43139920a04SFabiano Rosas cpu->isar.id_aa64mmfr0 = 0x0000000000001122; 43239920a04SFabiano Rosas cpu->isar.id_aa64mmfr1 = 0x0000000011212100; 43339920a04SFabiano Rosas cpu->isar.id_aa64mmfr2 = 0x0000000000001011; 43439920a04SFabiano Rosas cpu->isar.id_aa64isar0 = 0x0000000010211120; 43539920a04SFabiano Rosas cpu->isar.id_aa64isar1 = 0x0000000000010001; 43639920a04SFabiano Rosas cpu->isar.id_aa64zfr0 = 0x0000000000000000; 43739920a04SFabiano Rosas cpu->clidr = 0x0000000080000023; 438676624d7SAlireza Sanaee /* 64KB L1 dcache */ 439676624d7SAlireza Sanaee cpu->ccsidr[0] = make_ccsidr(CCSIDR_FORMAT_LEGACY, 4, 256, 64 * KiB, 7); 440676624d7SAlireza Sanaee /* 64KB L1 icache */ 441676624d7SAlireza Sanaee cpu->ccsidr[1] = make_ccsidr(CCSIDR_FORMAT_LEGACY, 4, 256, 64 * KiB, 2); 442676624d7SAlireza Sanaee /* 8MB L2 cache */ 443676624d7SAlireza Sanaee cpu->ccsidr[2] = make_ccsidr(CCSIDR_FORMAT_LEGACY, 16, 256, 8 * MiB, 7); 44439920a04SFabiano Rosas cpu->dcz_blocksize = 6; /* 256 bytes */ 44539920a04SFabiano Rosas cpu->gic_num_lrs = 4; 44639920a04SFabiano Rosas cpu->gic_vpribits = 5; 44739920a04SFabiano Rosas cpu->gic_vprebits = 5; 44839920a04SFabiano Rosas cpu->gic_pribits = 5; 44939920a04SFabiano Rosas 45039920a04SFabiano Rosas /* The A64FX supports only 128, 256 and 512 bit vector lengths */ 45139920a04SFabiano Rosas aarch64_add_sve_properties(obj); 45239920a04SFabiano Rosas cpu->sve_vq.supported = (1 << 0) /* 128bit */ 45339920a04SFabiano Rosas | (1 << 1) /* 256bit */ 45439920a04SFabiano Rosas | (1 << 3); /* 512bit */ 45539920a04SFabiano Rosas 45639920a04SFabiano Rosas cpu->isar.reset_pmcr_el0 = 0x46014040; 45739920a04SFabiano Rosas 45839920a04SFabiano Rosas /* TODO: Add A64FX specific HPC extension registers */ 45939920a04SFabiano Rosas } 46039920a04SFabiano Rosas 4616d482423SRichard Henderson static CPAccessResult access_actlr_w(CPUARMState *env, const ARMCPRegInfo *r, 4626d482423SRichard Henderson bool read) 4636d482423SRichard Henderson { 4646d482423SRichard Henderson if (!read) { 4656d482423SRichard Henderson int el = arm_current_el(env); 4666d482423SRichard Henderson 4676d482423SRichard Henderson /* Because ACTLR_EL2 is constant 0, writes below EL2 trap to EL2. */ 4686d482423SRichard Henderson if (el < 2 && arm_is_el2_enabled(env)) { 4696d482423SRichard Henderson return CP_ACCESS_TRAP_EL2; 4706d482423SRichard Henderson } 4716d482423SRichard Henderson /* Because ACTLR_EL3 is constant 0, writes below EL3 trap to EL3. */ 4726d482423SRichard Henderson if (el < 3 && arm_feature(env, ARM_FEATURE_EL3)) { 4736d482423SRichard Henderson return CP_ACCESS_TRAP_EL3; 4746d482423SRichard Henderson } 4756d482423SRichard Henderson } 4766d482423SRichard Henderson return CP_ACCESS_OK; 4776d482423SRichard Henderson } 4786d482423SRichard Henderson 47939920a04SFabiano Rosas static const ARMCPRegInfo neoverse_n1_cp_reginfo[] = { 48039920a04SFabiano Rosas { .name = "ATCR_EL1", .state = ARM_CP_STATE_AA64, 48139920a04SFabiano Rosas .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 7, .opc2 = 0, 4826d482423SRichard Henderson .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0, 4836d482423SRichard Henderson /* Traps and enables are the same as for TCR_EL1. */ 4846d482423SRichard Henderson .accessfn = access_tvm_trvm, .fgt = FGT_TCR_EL1, }, 48539920a04SFabiano Rosas { .name = "ATCR_EL2", .state = ARM_CP_STATE_AA64, 48639920a04SFabiano Rosas .opc0 = 3, .opc1 = 4, .crn = 15, .crm = 7, .opc2 = 0, 48739920a04SFabiano Rosas .access = PL2_RW, .type = ARM_CP_CONST, .resetvalue = 0 }, 48839920a04SFabiano Rosas { .name = "ATCR_EL3", .state = ARM_CP_STATE_AA64, 48939920a04SFabiano Rosas .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 7, .opc2 = 0, 49039920a04SFabiano Rosas .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 }, 49139920a04SFabiano Rosas { .name = "ATCR_EL12", .state = ARM_CP_STATE_AA64, 49239920a04SFabiano Rosas .opc0 = 3, .opc1 = 5, .crn = 15, .crm = 7, .opc2 = 0, 49339920a04SFabiano Rosas .access = PL2_RW, .type = ARM_CP_CONST, .resetvalue = 0 }, 49439920a04SFabiano Rosas { .name = "AVTCR_EL2", .state = ARM_CP_STATE_AA64, 49539920a04SFabiano Rosas .opc0 = 3, .opc1 = 4, .crn = 15, .crm = 7, .opc2 = 1, 49639920a04SFabiano Rosas .access = PL2_RW, .type = ARM_CP_CONST, .resetvalue = 0 }, 49739920a04SFabiano Rosas { .name = "CPUACTLR_EL1", .state = ARM_CP_STATE_AA64, 49839920a04SFabiano Rosas .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 1, .opc2 = 0, 4996d482423SRichard Henderson .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0, 5006d482423SRichard Henderson .accessfn = access_actlr_w }, 50139920a04SFabiano Rosas { .name = "CPUACTLR2_EL1", .state = ARM_CP_STATE_AA64, 50239920a04SFabiano Rosas .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 1, .opc2 = 1, 5036d482423SRichard Henderson .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0, 5046d482423SRichard Henderson .accessfn = access_actlr_w }, 50539920a04SFabiano Rosas { .name = "CPUACTLR3_EL1", .state = ARM_CP_STATE_AA64, 50639920a04SFabiano Rosas .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 1, .opc2 = 2, 5076d482423SRichard Henderson .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0, 5086d482423SRichard Henderson .accessfn = access_actlr_w }, 50939920a04SFabiano Rosas /* 51039920a04SFabiano Rosas * Report CPUCFR_EL1.SCU as 1, as we do not implement the DSU 51139920a04SFabiano Rosas * (and in particular its system registers). 51239920a04SFabiano Rosas */ 51339920a04SFabiano Rosas { .name = "CPUCFR_EL1", .state = ARM_CP_STATE_AA64, 51439920a04SFabiano Rosas .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 0, .opc2 = 0, 51539920a04SFabiano Rosas .access = PL1_R, .type = ARM_CP_CONST, .resetvalue = 4 }, 51639920a04SFabiano Rosas { .name = "CPUECTLR_EL1", .state = ARM_CP_STATE_AA64, 51739920a04SFabiano Rosas .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 1, .opc2 = 4, 5186d482423SRichard Henderson .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0x961563010, 5196d482423SRichard Henderson .accessfn = access_actlr_w }, 52039920a04SFabiano Rosas { .name = "CPUPCR_EL3", .state = ARM_CP_STATE_AA64, 52139920a04SFabiano Rosas .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 8, .opc2 = 1, 52239920a04SFabiano Rosas .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 }, 52339920a04SFabiano Rosas { .name = "CPUPMR_EL3", .state = ARM_CP_STATE_AA64, 52439920a04SFabiano Rosas .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 8, .opc2 = 3, 52539920a04SFabiano Rosas .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 }, 52639920a04SFabiano Rosas { .name = "CPUPOR_EL3", .state = ARM_CP_STATE_AA64, 52739920a04SFabiano Rosas .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 8, .opc2 = 2, 52839920a04SFabiano Rosas .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 }, 52939920a04SFabiano Rosas { .name = "CPUPSELR_EL3", .state = ARM_CP_STATE_AA64, 53039920a04SFabiano Rosas .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 8, .opc2 = 0, 53139920a04SFabiano Rosas .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 }, 53239920a04SFabiano Rosas { .name = "CPUPWRCTLR_EL1", .state = ARM_CP_STATE_AA64, 53339920a04SFabiano Rosas .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 2, .opc2 = 7, 5346d482423SRichard Henderson .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0, 5356d482423SRichard Henderson .accessfn = access_actlr_w }, 53639920a04SFabiano Rosas { .name = "ERXPFGCDN_EL1", .state = ARM_CP_STATE_AA64, 53739920a04SFabiano Rosas .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 2, .opc2 = 2, 5386d482423SRichard Henderson .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0, 5396d482423SRichard Henderson .accessfn = access_actlr_w }, 54039920a04SFabiano Rosas { .name = "ERXPFGCTL_EL1", .state = ARM_CP_STATE_AA64, 54139920a04SFabiano Rosas .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 2, .opc2 = 1, 5426d482423SRichard Henderson .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0, 5436d482423SRichard Henderson .accessfn = access_actlr_w }, 54439920a04SFabiano Rosas { .name = "ERXPFGF_EL1", .state = ARM_CP_STATE_AA64, 54539920a04SFabiano Rosas .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 2, .opc2 = 0, 5466d482423SRichard Henderson .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0, 5476d482423SRichard Henderson .accessfn = access_actlr_w }, 54839920a04SFabiano Rosas }; 54939920a04SFabiano Rosas 55039920a04SFabiano Rosas static void define_neoverse_n1_cp_reginfo(ARMCPU *cpu) 55139920a04SFabiano Rosas { 55239920a04SFabiano Rosas define_arm_cp_regs(cpu, neoverse_n1_cp_reginfo); 55339920a04SFabiano Rosas } 55439920a04SFabiano Rosas 555c74138c6SPeter Maydell static const ARMCPRegInfo neoverse_v1_cp_reginfo[] = { 556c74138c6SPeter Maydell { .name = "CPUECTLR2_EL1", .state = ARM_CP_STATE_AA64, 557c74138c6SPeter Maydell .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 1, .opc2 = 5, 55887da10b4SRichard Henderson .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0, 55987da10b4SRichard Henderson .accessfn = access_actlr_w }, 560c74138c6SPeter Maydell { .name = "CPUPPMCR_EL3", .state = ARM_CP_STATE_AA64, 561c74138c6SPeter Maydell .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 2, .opc2 = 0, 562c74138c6SPeter Maydell .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 }, 563c74138c6SPeter Maydell { .name = "CPUPPMCR2_EL3", .state = ARM_CP_STATE_AA64, 564c74138c6SPeter Maydell .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 2, .opc2 = 1, 565c74138c6SPeter Maydell .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 }, 566c74138c6SPeter Maydell { .name = "CPUPPMCR3_EL3", .state = ARM_CP_STATE_AA64, 567c74138c6SPeter Maydell .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 2, .opc2 = 6, 568c74138c6SPeter Maydell .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 }, 569c74138c6SPeter Maydell }; 570c74138c6SPeter Maydell 571c74138c6SPeter Maydell static void define_neoverse_v1_cp_reginfo(ARMCPU *cpu) 572c74138c6SPeter Maydell { 573c74138c6SPeter Maydell /* 574c74138c6SPeter Maydell * The Neoverse V1 has all of the Neoverse N1's IMPDEF 575c74138c6SPeter Maydell * registers and a few more of its own. 576c74138c6SPeter Maydell */ 577c74138c6SPeter Maydell define_arm_cp_regs(cpu, neoverse_n1_cp_reginfo); 578c74138c6SPeter Maydell define_arm_cp_regs(cpu, neoverse_v1_cp_reginfo); 579c74138c6SPeter Maydell } 580c74138c6SPeter Maydell 58139920a04SFabiano Rosas static void aarch64_neoverse_n1_initfn(Object *obj) 58239920a04SFabiano Rosas { 58339920a04SFabiano Rosas ARMCPU *cpu = ARM_CPU(obj); 58439920a04SFabiano Rosas 58539920a04SFabiano Rosas cpu->dtb_compatible = "arm,neoverse-n1"; 58639920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_V8); 58739920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_NEON); 58839920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_GENERIC_TIMER); 589f037f5b4SPeter Maydell set_feature(&cpu->env, ARM_FEATURE_BACKCOMPAT_CNTFRQ); 59039920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_AARCH64); 59139920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_CBAR_RO); 59239920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_EL2); 59339920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_EL3); 59439920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_PMU); 59539920a04SFabiano Rosas 59639920a04SFabiano Rosas /* Ordered by B2.4 AArch64 registers by functional group */ 59739920a04SFabiano Rosas cpu->clidr = 0x82000023; 59839920a04SFabiano Rosas cpu->ctr = 0x8444c004; 59939920a04SFabiano Rosas cpu->dcz_blocksize = 4; 60039920a04SFabiano Rosas cpu->isar.id_aa64dfr0 = 0x0000000110305408ull; 60139920a04SFabiano Rosas cpu->isar.id_aa64isar0 = 0x0000100010211120ull; 60239920a04SFabiano Rosas cpu->isar.id_aa64isar1 = 0x0000000000100001ull; 60339920a04SFabiano Rosas cpu->isar.id_aa64mmfr0 = 0x0000000000101125ull; 60439920a04SFabiano Rosas cpu->isar.id_aa64mmfr1 = 0x0000000010212122ull; 60539920a04SFabiano Rosas cpu->isar.id_aa64mmfr2 = 0x0000000000001011ull; 60639920a04SFabiano Rosas cpu->isar.id_aa64pfr0 = 0x1100000010111112ull; /* GIC filled in later */ 60739920a04SFabiano Rosas cpu->isar.id_aa64pfr1 = 0x0000000000000020ull; 60839920a04SFabiano Rosas cpu->id_afr0 = 0x00000000; 60939920a04SFabiano Rosas cpu->isar.id_dfr0 = 0x04010088; 61039920a04SFabiano Rosas cpu->isar.id_isar0 = 0x02101110; 61139920a04SFabiano Rosas cpu->isar.id_isar1 = 0x13112111; 61239920a04SFabiano Rosas cpu->isar.id_isar2 = 0x21232042; 61339920a04SFabiano Rosas cpu->isar.id_isar3 = 0x01112131; 61439920a04SFabiano Rosas cpu->isar.id_isar4 = 0x00010142; 61539920a04SFabiano Rosas cpu->isar.id_isar5 = 0x01011121; 61639920a04SFabiano Rosas cpu->isar.id_isar6 = 0x00000010; 61739920a04SFabiano Rosas cpu->isar.id_mmfr0 = 0x10201105; 61839920a04SFabiano Rosas cpu->isar.id_mmfr1 = 0x40000000; 61939920a04SFabiano Rosas cpu->isar.id_mmfr2 = 0x01260000; 62039920a04SFabiano Rosas cpu->isar.id_mmfr3 = 0x02122211; 62139920a04SFabiano Rosas cpu->isar.id_mmfr4 = 0x00021110; 62239920a04SFabiano Rosas cpu->isar.id_pfr0 = 0x10010131; 62339920a04SFabiano Rosas cpu->isar.id_pfr1 = 0x00010000; /* GIC filled in later */ 62439920a04SFabiano Rosas cpu->isar.id_pfr2 = 0x00000011; 62539920a04SFabiano Rosas cpu->midr = 0x414fd0c1; /* r4p1 */ 62639920a04SFabiano Rosas cpu->revidr = 0; 62739920a04SFabiano Rosas 62839920a04SFabiano Rosas /* From B2.23 CCSIDR_EL1 */ 629676624d7SAlireza Sanaee /* 64KB L1 dcache */ 630676624d7SAlireza Sanaee cpu->ccsidr[0] = make_ccsidr(CCSIDR_FORMAT_LEGACY, 4, 64, 64 * KiB, 7); 631676624d7SAlireza Sanaee /* 64KB L1 icache */ 632676624d7SAlireza Sanaee cpu->ccsidr[1] = make_ccsidr(CCSIDR_FORMAT_LEGACY, 4, 64, 64 * KiB, 2); 633676624d7SAlireza Sanaee /* 1MB L2 dcache */ 634676624d7SAlireza Sanaee cpu->ccsidr[2] = make_ccsidr(CCSIDR_FORMAT_LEGACY, 8, 64, 1 * MiB, 7); 63539920a04SFabiano Rosas 63639920a04SFabiano Rosas /* From B2.98 SCTLR_EL3 */ 63739920a04SFabiano Rosas cpu->reset_sctlr = 0x30c50838; 63839920a04SFabiano Rosas 63939920a04SFabiano Rosas /* From B4.23 ICH_VTR_EL2 */ 64039920a04SFabiano Rosas cpu->gic_num_lrs = 4; 64139920a04SFabiano Rosas cpu->gic_vpribits = 5; 64239920a04SFabiano Rosas cpu->gic_vprebits = 5; 64339920a04SFabiano Rosas cpu->gic_pribits = 5; 64439920a04SFabiano Rosas 64539920a04SFabiano Rosas /* From B5.1 AdvSIMD AArch64 register summary */ 64639920a04SFabiano Rosas cpu->isar.mvfr0 = 0x10110222; 64739920a04SFabiano Rosas cpu->isar.mvfr1 = 0x13211111; 64839920a04SFabiano Rosas cpu->isar.mvfr2 = 0x00000043; 64939920a04SFabiano Rosas 65039920a04SFabiano Rosas /* From D5.1 AArch64 PMU register summary */ 65139920a04SFabiano Rosas cpu->isar.reset_pmcr_el0 = 0x410c3000; 65239920a04SFabiano Rosas 65339920a04SFabiano Rosas define_neoverse_n1_cp_reginfo(cpu); 65439920a04SFabiano Rosas } 65539920a04SFabiano Rosas 656c74138c6SPeter Maydell static void aarch64_neoverse_v1_initfn(Object *obj) 657c74138c6SPeter Maydell { 658c74138c6SPeter Maydell ARMCPU *cpu = ARM_CPU(obj); 659c74138c6SPeter Maydell 660c74138c6SPeter Maydell cpu->dtb_compatible = "arm,neoverse-v1"; 661c74138c6SPeter Maydell set_feature(&cpu->env, ARM_FEATURE_V8); 662c74138c6SPeter Maydell set_feature(&cpu->env, ARM_FEATURE_NEON); 663c74138c6SPeter Maydell set_feature(&cpu->env, ARM_FEATURE_GENERIC_TIMER); 664f037f5b4SPeter Maydell set_feature(&cpu->env, ARM_FEATURE_BACKCOMPAT_CNTFRQ); 665c74138c6SPeter Maydell set_feature(&cpu->env, ARM_FEATURE_AARCH64); 666c74138c6SPeter Maydell set_feature(&cpu->env, ARM_FEATURE_CBAR_RO); 667c74138c6SPeter Maydell set_feature(&cpu->env, ARM_FEATURE_EL2); 668c74138c6SPeter Maydell set_feature(&cpu->env, ARM_FEATURE_EL3); 669c74138c6SPeter Maydell set_feature(&cpu->env, ARM_FEATURE_PMU); 670c74138c6SPeter Maydell 671c74138c6SPeter Maydell /* Ordered by 3.2.4 AArch64 registers by functional group */ 672c74138c6SPeter Maydell cpu->clidr = 0x82000023; 673c74138c6SPeter Maydell cpu->ctr = 0xb444c004; /* With DIC and IDC set */ 674c74138c6SPeter Maydell cpu->dcz_blocksize = 4; 675c74138c6SPeter Maydell cpu->id_aa64afr0 = 0x00000000; 676c74138c6SPeter Maydell cpu->id_aa64afr1 = 0x00000000; 677c74138c6SPeter Maydell cpu->isar.id_aa64dfr0 = 0x000001f210305519ull; 678c74138c6SPeter Maydell cpu->isar.id_aa64dfr1 = 0x00000000; 679c74138c6SPeter Maydell cpu->isar.id_aa64isar0 = 0x1011111110212120ull; /* with FEAT_RNG */ 6808676007eSPeter Maydell cpu->isar.id_aa64isar1 = 0x0011100001211032ull; 681c74138c6SPeter Maydell cpu->isar.id_aa64mmfr0 = 0x0000000000101125ull; 682c74138c6SPeter Maydell cpu->isar.id_aa64mmfr1 = 0x0000000010212122ull; 683c74138c6SPeter Maydell cpu->isar.id_aa64mmfr2 = 0x0220011102101011ull; 684c74138c6SPeter Maydell cpu->isar.id_aa64pfr0 = 0x1101110120111112ull; /* GIC filled in later */ 685c74138c6SPeter Maydell cpu->isar.id_aa64pfr1 = 0x0000000000000020ull; 686c74138c6SPeter Maydell cpu->id_afr0 = 0x00000000; 687c74138c6SPeter Maydell cpu->isar.id_dfr0 = 0x15011099; 688c74138c6SPeter Maydell cpu->isar.id_isar0 = 0x02101110; 689c74138c6SPeter Maydell cpu->isar.id_isar1 = 0x13112111; 690c74138c6SPeter Maydell cpu->isar.id_isar2 = 0x21232042; 691c74138c6SPeter Maydell cpu->isar.id_isar3 = 0x01112131; 692c74138c6SPeter Maydell cpu->isar.id_isar4 = 0x00010142; 693c74138c6SPeter Maydell cpu->isar.id_isar5 = 0x11011121; 694c74138c6SPeter Maydell cpu->isar.id_isar6 = 0x01100111; 695c74138c6SPeter Maydell cpu->isar.id_mmfr0 = 0x10201105; 696c74138c6SPeter Maydell cpu->isar.id_mmfr1 = 0x40000000; 697c74138c6SPeter Maydell cpu->isar.id_mmfr2 = 0x01260000; 698c74138c6SPeter Maydell cpu->isar.id_mmfr3 = 0x02122211; 699c74138c6SPeter Maydell cpu->isar.id_mmfr4 = 0x01021110; 700c74138c6SPeter Maydell cpu->isar.id_pfr0 = 0x21110131; 701c74138c6SPeter Maydell cpu->isar.id_pfr1 = 0x00010000; /* GIC filled in later */ 702c74138c6SPeter Maydell cpu->isar.id_pfr2 = 0x00000011; 703c74138c6SPeter Maydell cpu->midr = 0x411FD402; /* r1p2 */ 704c74138c6SPeter Maydell cpu->revidr = 0; 705c74138c6SPeter Maydell 706c74138c6SPeter Maydell /* 707c74138c6SPeter Maydell * The Neoverse-V1 r1p2 TRM lists 32-bit format CCSIDR_EL1 values, 708c74138c6SPeter Maydell * but also says it implements CCIDX, which means they should be 709c74138c6SPeter Maydell * 64-bit format. So we here use values which are based on the textual 710d8100822SRichard Henderson * information in chapter 2 of the TRM: 711c74138c6SPeter Maydell * 712d8100822SRichard Henderson * L1: 4-way set associative 64-byte line size, total size 64K. 713c74138c6SPeter Maydell * L2: 8-way set associative, 64 byte line size, either 512K or 1MB. 714c74138c6SPeter Maydell * L3: No L3 (this matches the CLIDR_EL1 value). 715c74138c6SPeter Maydell */ 716676624d7SAlireza Sanaee /* 64KB L1 dcache */ 717676624d7SAlireza Sanaee cpu->ccsidr[0] = make_ccsidr(CCSIDR_FORMAT_CCIDX, 4, 64, 64 * KiB, 0); 718676624d7SAlireza Sanaee /* 64KB L1 icache */ 719676624d7SAlireza Sanaee cpu->ccsidr[1] = cpu->ccsidr[0]; 720676624d7SAlireza Sanaee /* 1MB L2 cache */ 721676624d7SAlireza Sanaee cpu->ccsidr[2] = make_ccsidr(CCSIDR_FORMAT_CCIDX, 8, 64, 1 * MiB, 0); 722c74138c6SPeter Maydell 723c74138c6SPeter Maydell /* From 3.2.115 SCTLR_EL3 */ 724c74138c6SPeter Maydell cpu->reset_sctlr = 0x30c50838; 725c74138c6SPeter Maydell 726c74138c6SPeter Maydell /* From 3.4.8 ICC_CTLR_EL3 and 3.4.23 ICH_VTR_EL2 */ 727c74138c6SPeter Maydell cpu->gic_num_lrs = 4; 728c74138c6SPeter Maydell cpu->gic_vpribits = 5; 729c74138c6SPeter Maydell cpu->gic_vprebits = 5; 730c74138c6SPeter Maydell cpu->gic_pribits = 5; 731c74138c6SPeter Maydell 732c74138c6SPeter Maydell /* From 3.5.1 AdvSIMD AArch64 register summary */ 733c74138c6SPeter Maydell cpu->isar.mvfr0 = 0x10110222; 734c74138c6SPeter Maydell cpu->isar.mvfr1 = 0x13211111; 735c74138c6SPeter Maydell cpu->isar.mvfr2 = 0x00000043; 736c74138c6SPeter Maydell 737c74138c6SPeter Maydell /* From 3.7.5 ID_AA64ZFR0_EL1 */ 738c74138c6SPeter Maydell cpu->isar.id_aa64zfr0 = 0x0000100000100000; 739c74138c6SPeter Maydell cpu->sve_vq.supported = (1 << 0) /* 128bit */ 740c74138c6SPeter Maydell | (1 << 1); /* 256bit */ 741c74138c6SPeter Maydell 742c74138c6SPeter Maydell /* From 5.5.1 AArch64 PMU register summary */ 743c74138c6SPeter Maydell cpu->isar.reset_pmcr_el0 = 0x41213000; 744c74138c6SPeter Maydell 745c74138c6SPeter Maydell define_neoverse_v1_cp_reginfo(cpu); 746c74138c6SPeter Maydell 747c74138c6SPeter Maydell aarch64_add_pauth_properties(obj); 748c74138c6SPeter Maydell aarch64_add_sve_properties(obj); 749c74138c6SPeter Maydell } 750c74138c6SPeter Maydell 751e3d45c0aSRichard Henderson static const ARMCPRegInfo cortex_a710_cp_reginfo[] = { 752e3d45c0aSRichard Henderson { .name = "CPUACTLR_EL1", .state = ARM_CP_STATE_AA64, 753e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 1, .opc2 = 0, 754e3d45c0aSRichard Henderson .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0, 755e3d45c0aSRichard Henderson .accessfn = access_actlr_w }, 756e3d45c0aSRichard Henderson { .name = "CPUACTLR2_EL1", .state = ARM_CP_STATE_AA64, 757e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 1, .opc2 = 1, 758e3d45c0aSRichard Henderson .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0, 759e3d45c0aSRichard Henderson .accessfn = access_actlr_w }, 760e3d45c0aSRichard Henderson { .name = "CPUACTLR3_EL1", .state = ARM_CP_STATE_AA64, 761e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 1, .opc2 = 2, 762e3d45c0aSRichard Henderson .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0, 763e3d45c0aSRichard Henderson .accessfn = access_actlr_w }, 764e3d45c0aSRichard Henderson { .name = "CPUACTLR4_EL1", .state = ARM_CP_STATE_AA64, 765e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 1, .opc2 = 3, 766e3d45c0aSRichard Henderson .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0, 767e3d45c0aSRichard Henderson .accessfn = access_actlr_w }, 768e3d45c0aSRichard Henderson { .name = "CPUECTLR_EL1", .state = ARM_CP_STATE_AA64, 769e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 1, .opc2 = 4, 770e3d45c0aSRichard Henderson .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0, 771e3d45c0aSRichard Henderson .accessfn = access_actlr_w }, 772e3d45c0aSRichard Henderson { .name = "CPUECTLR2_EL1", .state = ARM_CP_STATE_AA64, 773e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 1, .opc2 = 5, 774e3d45c0aSRichard Henderson .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0, 775e3d45c0aSRichard Henderson .accessfn = access_actlr_w }, 776e3d45c0aSRichard Henderson { .name = "CPUPPMCR_EL3", .state = ARM_CP_STATE_AA64, 777e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 2, .opc2 = 4, 778e3d45c0aSRichard Henderson .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 }, 779e3d45c0aSRichard Henderson { .name = "CPUPWRCTLR_EL1", .state = ARM_CP_STATE_AA64, 780e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 2, .opc2 = 7, 781e3d45c0aSRichard Henderson .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0, 782e3d45c0aSRichard Henderson .accessfn = access_actlr_w }, 783e3d45c0aSRichard Henderson { .name = "ATCR_EL1", .state = ARM_CP_STATE_AA64, 784e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 7, .opc2 = 0, 785e3d45c0aSRichard Henderson .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0 }, 786e3d45c0aSRichard Henderson { .name = "CPUACTLR5_EL1", .state = ARM_CP_STATE_AA64, 787e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 8, .opc2 = 0, 788e3d45c0aSRichard Henderson .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0, 789e3d45c0aSRichard Henderson .accessfn = access_actlr_w }, 790e3d45c0aSRichard Henderson { .name = "CPUACTLR6_EL1", .state = ARM_CP_STATE_AA64, 791e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 8, .opc2 = 1, 792e3d45c0aSRichard Henderson .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0, 793e3d45c0aSRichard Henderson .accessfn = access_actlr_w }, 794e3d45c0aSRichard Henderson { .name = "CPUACTLR7_EL1", .state = ARM_CP_STATE_AA64, 795e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 8, .opc2 = 2, 796e3d45c0aSRichard Henderson .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0, 797e3d45c0aSRichard Henderson .accessfn = access_actlr_w }, 798e3d45c0aSRichard Henderson { .name = "ATCR_EL2", .state = ARM_CP_STATE_AA64, 799e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 4, .crn = 15, .crm = 7, .opc2 = 0, 800e3d45c0aSRichard Henderson .access = PL2_RW, .type = ARM_CP_CONST, .resetvalue = 0 }, 801e3d45c0aSRichard Henderson { .name = "AVTCR_EL2", .state = ARM_CP_STATE_AA64, 802e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 4, .crn = 15, .crm = 7, .opc2 = 1, 803e3d45c0aSRichard Henderson .access = PL2_RW, .type = ARM_CP_CONST, .resetvalue = 0 }, 804e3d45c0aSRichard Henderson { .name = "CPUPPMCR_EL3", .state = ARM_CP_STATE_AA64, 805e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 2, .opc2 = 0, 806e3d45c0aSRichard Henderson .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 }, 807e3d45c0aSRichard Henderson { .name = "CPUPPMCR2_EL3", .state = ARM_CP_STATE_AA64, 808e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 2, .opc2 = 1, 809e3d45c0aSRichard Henderson .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 }, 810e3d45c0aSRichard Henderson { .name = "CPUPPMCR4_EL3", .state = ARM_CP_STATE_AA64, 811e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 2, .opc2 = 4, 812e3d45c0aSRichard Henderson .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 }, 813e3d45c0aSRichard Henderson { .name = "CPUPPMCR5_EL3", .state = ARM_CP_STATE_AA64, 814e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 2, .opc2 = 5, 815e3d45c0aSRichard Henderson .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 }, 816e3d45c0aSRichard Henderson { .name = "CPUPPMCR6_EL3", .state = ARM_CP_STATE_AA64, 817e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 2, .opc2 = 6, 818e3d45c0aSRichard Henderson .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 }, 819e3d45c0aSRichard Henderson { .name = "CPUACTLR_EL3", .state = ARM_CP_STATE_AA64, 820e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 4, .opc2 = 0, 821e3d45c0aSRichard Henderson .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 }, 822e3d45c0aSRichard Henderson { .name = "ATCR_EL3", .state = ARM_CP_STATE_AA64, 823e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 7, .opc2 = 0, 824e3d45c0aSRichard Henderson .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 }, 825e3d45c0aSRichard Henderson { .name = "CPUPSELR_EL3", .state = ARM_CP_STATE_AA64, 826e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 8, .opc2 = 0, 827e3d45c0aSRichard Henderson .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 }, 828e3d45c0aSRichard Henderson { .name = "CPUPCR_EL3", .state = ARM_CP_STATE_AA64, 829e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 8, .opc2 = 1, 830e3d45c0aSRichard Henderson .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 }, 831e3d45c0aSRichard Henderson { .name = "CPUPOR_EL3", .state = ARM_CP_STATE_AA64, 832e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 8, .opc2 = 2, 833e3d45c0aSRichard Henderson .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 }, 834e3d45c0aSRichard Henderson { .name = "CPUPMR_EL3", .state = ARM_CP_STATE_AA64, 835e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 8, .opc2 = 3, 836e3d45c0aSRichard Henderson .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 }, 837e3d45c0aSRichard Henderson { .name = "CPUPOR2_EL3", .state = ARM_CP_STATE_AA64, 838e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 8, .opc2 = 4, 839e3d45c0aSRichard Henderson .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 }, 840e3d45c0aSRichard Henderson { .name = "CPUPMR2_EL3", .state = ARM_CP_STATE_AA64, 841e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 8, .opc2 = 5, 842e3d45c0aSRichard Henderson .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 }, 843e3d45c0aSRichard Henderson { .name = "CPUPFR_EL3", .state = ARM_CP_STATE_AA64, 844e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 8, .opc2 = 6, 845e3d45c0aSRichard Henderson .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 }, 8463bcc5398SPeter Maydell /* 8473bcc5398SPeter Maydell * Report CPUCFR_EL1.SCU as 1, as we do not implement the DSU 8483bcc5398SPeter Maydell * (and in particular its system registers). 8493bcc5398SPeter Maydell */ 8503bcc5398SPeter Maydell { .name = "CPUCFR_EL1", .state = ARM_CP_STATE_AA64, 8513bcc5398SPeter Maydell .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 0, .opc2 = 0, 8523bcc5398SPeter Maydell .access = PL1_R, .type = ARM_CP_CONST, .resetvalue = 4 }, 853e3d45c0aSRichard Henderson 854e3d45c0aSRichard Henderson /* 855e3d45c0aSRichard Henderson * Stub RAMINDEX, as we don't actually implement caches, BTB, 856e3d45c0aSRichard Henderson * or anything else with cpu internal memory. 857e3d45c0aSRichard Henderson * "Read" zeros into the IDATA* and DDATA* output registers. 858e3d45c0aSRichard Henderson */ 859e3d45c0aSRichard Henderson { .name = "RAMINDEX_EL3", .state = ARM_CP_STATE_AA64, 860e3d45c0aSRichard Henderson .opc0 = 1, .opc1 = 6, .crn = 15, .crm = 0, .opc2 = 0, 861e3d45c0aSRichard Henderson .access = PL3_W, .type = ARM_CP_CONST, .resetvalue = 0 }, 862e3d45c0aSRichard Henderson { .name = "IDATA0_EL3", .state = ARM_CP_STATE_AA64, 863e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 0, .opc2 = 0, 864e3d45c0aSRichard Henderson .access = PL3_R, .type = ARM_CP_CONST, .resetvalue = 0 }, 865e3d45c0aSRichard Henderson { .name = "IDATA1_EL3", .state = ARM_CP_STATE_AA64, 866e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 0, .opc2 = 1, 867e3d45c0aSRichard Henderson .access = PL3_R, .type = ARM_CP_CONST, .resetvalue = 0 }, 868e3d45c0aSRichard Henderson { .name = "IDATA2_EL3", .state = ARM_CP_STATE_AA64, 869e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 0, .opc2 = 2, 870e3d45c0aSRichard Henderson .access = PL3_R, .type = ARM_CP_CONST, .resetvalue = 0 }, 871e3d45c0aSRichard Henderson { .name = "DDATA0_EL3", .state = ARM_CP_STATE_AA64, 872e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 1, .opc2 = 0, 873e3d45c0aSRichard Henderson .access = PL3_R, .type = ARM_CP_CONST, .resetvalue = 0 }, 874e3d45c0aSRichard Henderson { .name = "DDATA1_EL3", .state = ARM_CP_STATE_AA64, 875e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 1, .opc2 = 1, 876e3d45c0aSRichard Henderson .access = PL3_R, .type = ARM_CP_CONST, .resetvalue = 0 }, 877e3d45c0aSRichard Henderson { .name = "DDATA2_EL3", .state = ARM_CP_STATE_AA64, 878e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 1, .opc2 = 2, 879e3d45c0aSRichard Henderson .access = PL3_R, .type = ARM_CP_CONST, .resetvalue = 0 }, 880e3d45c0aSRichard Henderson }; 881e3d45c0aSRichard Henderson 882e3d45c0aSRichard Henderson static void aarch64_a710_initfn(Object *obj) 883e3d45c0aSRichard Henderson { 884e3d45c0aSRichard Henderson ARMCPU *cpu = ARM_CPU(obj); 885e3d45c0aSRichard Henderson 886e3d45c0aSRichard Henderson cpu->dtb_compatible = "arm,cortex-a710"; 887e3d45c0aSRichard Henderson set_feature(&cpu->env, ARM_FEATURE_V8); 888e3d45c0aSRichard Henderson set_feature(&cpu->env, ARM_FEATURE_NEON); 889e3d45c0aSRichard Henderson set_feature(&cpu->env, ARM_FEATURE_GENERIC_TIMER); 890f037f5b4SPeter Maydell set_feature(&cpu->env, ARM_FEATURE_BACKCOMPAT_CNTFRQ); 891e3d45c0aSRichard Henderson set_feature(&cpu->env, ARM_FEATURE_AARCH64); 892e3d45c0aSRichard Henderson set_feature(&cpu->env, ARM_FEATURE_CBAR_RO); 893e3d45c0aSRichard Henderson set_feature(&cpu->env, ARM_FEATURE_EL2); 894e3d45c0aSRichard Henderson set_feature(&cpu->env, ARM_FEATURE_EL3); 895e3d45c0aSRichard Henderson set_feature(&cpu->env, ARM_FEATURE_PMU); 896e3d45c0aSRichard Henderson 897e3d45c0aSRichard Henderson /* Ordered by Section B.4: AArch64 registers */ 898e3d45c0aSRichard Henderson cpu->midr = 0x412FD471; /* r2p1 */ 899e3d45c0aSRichard Henderson cpu->revidr = 0; 900e3d45c0aSRichard Henderson cpu->isar.id_pfr0 = 0x21110131; 901e3d45c0aSRichard Henderson cpu->isar.id_pfr1 = 0x00010000; /* GIC filled in later */ 902e3d45c0aSRichard Henderson cpu->isar.id_dfr0 = 0x16011099; 903e3d45c0aSRichard Henderson cpu->id_afr0 = 0; 904e3d45c0aSRichard Henderson cpu->isar.id_mmfr0 = 0x10201105; 905e3d45c0aSRichard Henderson cpu->isar.id_mmfr1 = 0x40000000; 906e3d45c0aSRichard Henderson cpu->isar.id_mmfr2 = 0x01260000; 907e3d45c0aSRichard Henderson cpu->isar.id_mmfr3 = 0x02122211; 908e3d45c0aSRichard Henderson cpu->isar.id_isar0 = 0x02101110; 909e3d45c0aSRichard Henderson cpu->isar.id_isar1 = 0x13112111; 910e3d45c0aSRichard Henderson cpu->isar.id_isar2 = 0x21232042; 911e3d45c0aSRichard Henderson cpu->isar.id_isar3 = 0x01112131; 912e3d45c0aSRichard Henderson cpu->isar.id_isar4 = 0x00010142; 913e3d45c0aSRichard Henderson cpu->isar.id_isar5 = 0x11011121; /* with Crypto */ 914e3d45c0aSRichard Henderson cpu->isar.id_mmfr4 = 0x21021110; 915e3d45c0aSRichard Henderson cpu->isar.id_isar6 = 0x01111111; 916e3d45c0aSRichard Henderson cpu->isar.mvfr0 = 0x10110222; 917e3d45c0aSRichard Henderson cpu->isar.mvfr1 = 0x13211111; 918e3d45c0aSRichard Henderson cpu->isar.mvfr2 = 0x00000043; 919e3d45c0aSRichard Henderson cpu->isar.id_pfr2 = 0x00000011; 920e3d45c0aSRichard Henderson cpu->isar.id_aa64pfr0 = 0x1201111120111112ull; /* GIC filled in later */ 921e3d45c0aSRichard Henderson cpu->isar.id_aa64pfr1 = 0x0000000000000221ull; 922e3d45c0aSRichard Henderson cpu->isar.id_aa64zfr0 = 0x0000110100110021ull; /* with Crypto */ 9233bcc5398SPeter Maydell cpu->isar.id_aa64dfr0 = 0x000011f010305619ull; 924e3d45c0aSRichard Henderson cpu->isar.id_aa64dfr1 = 0; 925e3d45c0aSRichard Henderson cpu->id_aa64afr0 = 0; 926e3d45c0aSRichard Henderson cpu->id_aa64afr1 = 0; 927e3d45c0aSRichard Henderson cpu->isar.id_aa64isar0 = 0x0221111110212120ull; /* with Crypto */ 9283bcc5398SPeter Maydell cpu->isar.id_aa64isar1 = 0x0010111101211052ull; 929e3d45c0aSRichard Henderson cpu->isar.id_aa64mmfr0 = 0x0000022200101122ull; 930e3d45c0aSRichard Henderson cpu->isar.id_aa64mmfr1 = 0x0000000010212122ull; 931e3d45c0aSRichard Henderson cpu->isar.id_aa64mmfr2 = 0x1221011110101011ull; 932e3d45c0aSRichard Henderson cpu->clidr = 0x0000001482000023ull; 933e3d45c0aSRichard Henderson cpu->gm_blocksize = 4; 934e3d45c0aSRichard Henderson cpu->ctr = 0x000000049444c004ull; 935e3d45c0aSRichard Henderson cpu->dcz_blocksize = 4; 936e3d45c0aSRichard Henderson /* TODO FEAT_MPAM: mpamidr_el1 = 0x0000_0001_0006_003f */ 937e3d45c0aSRichard Henderson 938e3d45c0aSRichard Henderson /* Section B.5.2: PMCR_EL0 */ 939e3d45c0aSRichard Henderson cpu->isar.reset_pmcr_el0 = 0xa000; /* with 20 counters */ 940e3d45c0aSRichard Henderson 941e3d45c0aSRichard Henderson /* Section B.6.7: ICH_VTR_EL2 */ 942e3d45c0aSRichard Henderson cpu->gic_num_lrs = 4; 943e3d45c0aSRichard Henderson cpu->gic_vpribits = 5; 944e3d45c0aSRichard Henderson cpu->gic_vprebits = 5; 945e3d45c0aSRichard Henderson cpu->gic_pribits = 5; 946e3d45c0aSRichard Henderson 947e3d45c0aSRichard Henderson /* Section 14: Scalable Vector Extensions support */ 948e3d45c0aSRichard Henderson cpu->sve_vq.supported = 1 << 0; /* 128bit */ 949e3d45c0aSRichard Henderson 950e3d45c0aSRichard Henderson /* 951e3d45c0aSRichard Henderson * The cortex-a710 TRM does not list CCSIDR values. The layout of 952e3d45c0aSRichard Henderson * the caches are in text in Table 7-1, Table 8-1, and Table 9-1. 953e3d45c0aSRichard Henderson * 954e3d45c0aSRichard Henderson * L1: 4-way set associative 64-byte line size, total either 32K or 64K. 955e3d45c0aSRichard Henderson * L2: 8-way set associative 64 byte line size, total either 256K or 512K. 956e3d45c0aSRichard Henderson */ 957676624d7SAlireza Sanaee /* L1 dcache */ 958676624d7SAlireza Sanaee cpu->ccsidr[0] = make_ccsidr(CCSIDR_FORMAT_CCIDX, 4, 64, 64 * KiB, 0); 959676624d7SAlireza Sanaee /* L1 icache */ 960676624d7SAlireza Sanaee cpu->ccsidr[1] = cpu->ccsidr[0]; 961676624d7SAlireza Sanaee /* L2 cache */ 962676624d7SAlireza Sanaee cpu->ccsidr[2] = make_ccsidr(CCSIDR_FORMAT_CCIDX, 8, 64, 512 * KiB, 0); 963e3d45c0aSRichard Henderson 964e3d45c0aSRichard Henderson /* FIXME: Not documented -- copied from neoverse-v1 */ 965e3d45c0aSRichard Henderson cpu->reset_sctlr = 0x30c50838; 966e3d45c0aSRichard Henderson 967e3d45c0aSRichard Henderson define_arm_cp_regs(cpu, cortex_a710_cp_reginfo); 968e3d45c0aSRichard Henderson 969e3d45c0aSRichard Henderson aarch64_add_pauth_properties(obj); 970e3d45c0aSRichard Henderson aarch64_add_sve_properties(obj); 971e3d45c0aSRichard Henderson } 972e3d45c0aSRichard Henderson 973dfff1000SPeter Maydell /* Extra IMPDEF regs in the N2 beyond those in the A710 */ 974dfff1000SPeter Maydell static const ARMCPRegInfo neoverse_n2_cp_reginfo[] = { 975dfff1000SPeter Maydell { .name = "CPURNDBR_EL3", .state = ARM_CP_STATE_AA64, 976dfff1000SPeter Maydell .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 3, .opc2 = 0, 977dfff1000SPeter Maydell .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 }, 978dfff1000SPeter Maydell { .name = "CPURNDPEID_EL3", .state = ARM_CP_STATE_AA64, 979dfff1000SPeter Maydell .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 3, .opc2 = 1, 980dfff1000SPeter Maydell .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 }, 981dfff1000SPeter Maydell }; 982dfff1000SPeter Maydell 983dfff1000SPeter Maydell static void aarch64_neoverse_n2_initfn(Object *obj) 984dfff1000SPeter Maydell { 985dfff1000SPeter Maydell ARMCPU *cpu = ARM_CPU(obj); 986dfff1000SPeter Maydell 987dfff1000SPeter Maydell cpu->dtb_compatible = "arm,neoverse-n2"; 988dfff1000SPeter Maydell set_feature(&cpu->env, ARM_FEATURE_V8); 989dfff1000SPeter Maydell set_feature(&cpu->env, ARM_FEATURE_NEON); 990dfff1000SPeter Maydell set_feature(&cpu->env, ARM_FEATURE_GENERIC_TIMER); 991f037f5b4SPeter Maydell set_feature(&cpu->env, ARM_FEATURE_BACKCOMPAT_CNTFRQ); 992dfff1000SPeter Maydell set_feature(&cpu->env, ARM_FEATURE_AARCH64); 993dfff1000SPeter Maydell set_feature(&cpu->env, ARM_FEATURE_CBAR_RO); 994dfff1000SPeter Maydell set_feature(&cpu->env, ARM_FEATURE_EL2); 995dfff1000SPeter Maydell set_feature(&cpu->env, ARM_FEATURE_EL3); 996dfff1000SPeter Maydell set_feature(&cpu->env, ARM_FEATURE_PMU); 997dfff1000SPeter Maydell 998dfff1000SPeter Maydell /* Ordered by Section B.5: AArch64 ID registers */ 999dfff1000SPeter Maydell cpu->midr = 0x410FD493; /* r0p3 */ 1000dfff1000SPeter Maydell cpu->revidr = 0; 1001dfff1000SPeter Maydell cpu->isar.id_pfr0 = 0x21110131; 1002dfff1000SPeter Maydell cpu->isar.id_pfr1 = 0x00010000; /* GIC filled in later */ 1003dfff1000SPeter Maydell cpu->isar.id_dfr0 = 0x16011099; 1004dfff1000SPeter Maydell cpu->id_afr0 = 0; 1005dfff1000SPeter Maydell cpu->isar.id_mmfr0 = 0x10201105; 1006dfff1000SPeter Maydell cpu->isar.id_mmfr1 = 0x40000000; 1007dfff1000SPeter Maydell cpu->isar.id_mmfr2 = 0x01260000; 1008dfff1000SPeter Maydell cpu->isar.id_mmfr3 = 0x02122211; 1009dfff1000SPeter Maydell cpu->isar.id_isar0 = 0x02101110; 1010dfff1000SPeter Maydell cpu->isar.id_isar1 = 0x13112111; 1011dfff1000SPeter Maydell cpu->isar.id_isar2 = 0x21232042; 1012dfff1000SPeter Maydell cpu->isar.id_isar3 = 0x01112131; 1013dfff1000SPeter Maydell cpu->isar.id_isar4 = 0x00010142; 1014dfff1000SPeter Maydell cpu->isar.id_isar5 = 0x11011121; /* with Crypto */ 1015dfff1000SPeter Maydell cpu->isar.id_mmfr4 = 0x01021110; 1016dfff1000SPeter Maydell cpu->isar.id_isar6 = 0x01111111; 1017dfff1000SPeter Maydell cpu->isar.mvfr0 = 0x10110222; 1018dfff1000SPeter Maydell cpu->isar.mvfr1 = 0x13211111; 1019dfff1000SPeter Maydell cpu->isar.mvfr2 = 0x00000043; 1020dfff1000SPeter Maydell cpu->isar.id_pfr2 = 0x00000011; 1021dfff1000SPeter Maydell cpu->isar.id_aa64pfr0 = 0x1201111120111112ull; /* GIC filled in later */ 1022dfff1000SPeter Maydell cpu->isar.id_aa64pfr1 = 0x0000000000000221ull; 1023dfff1000SPeter Maydell cpu->isar.id_aa64zfr0 = 0x0000110100110021ull; /* with Crypto */ 1024dfff1000SPeter Maydell cpu->isar.id_aa64dfr0 = 0x000011f210305619ull; 1025dfff1000SPeter Maydell cpu->isar.id_aa64dfr1 = 0; 1026dfff1000SPeter Maydell cpu->id_aa64afr0 = 0; 1027dfff1000SPeter Maydell cpu->id_aa64afr1 = 0; 1028e867a124SMarcin Juszkiewicz cpu->isar.id_aa64isar0 = 0x1221111110212120ull; /* with Crypto and FEAT_RNG */ 1029dfff1000SPeter Maydell cpu->isar.id_aa64isar1 = 0x0011111101211052ull; 1030dfff1000SPeter Maydell cpu->isar.id_aa64mmfr0 = 0x0000022200101125ull; 1031dfff1000SPeter Maydell cpu->isar.id_aa64mmfr1 = 0x0000000010212122ull; 1032dfff1000SPeter Maydell cpu->isar.id_aa64mmfr2 = 0x1221011112101011ull; 1033dfff1000SPeter Maydell cpu->clidr = 0x0000001482000023ull; 1034dfff1000SPeter Maydell cpu->gm_blocksize = 4; 1035dfff1000SPeter Maydell cpu->ctr = 0x00000004b444c004ull; 1036dfff1000SPeter Maydell cpu->dcz_blocksize = 4; 1037dfff1000SPeter Maydell /* TODO FEAT_MPAM: mpamidr_el1 = 0x0000_0001_001e_01ff */ 1038dfff1000SPeter Maydell 1039dfff1000SPeter Maydell /* Section B.7.2: PMCR_EL0 */ 1040dfff1000SPeter Maydell cpu->isar.reset_pmcr_el0 = 0x3000; /* with 6 counters */ 1041dfff1000SPeter Maydell 1042dfff1000SPeter Maydell /* Section B.8.9: ICH_VTR_EL2 */ 1043dfff1000SPeter Maydell cpu->gic_num_lrs = 4; 1044dfff1000SPeter Maydell cpu->gic_vpribits = 5; 1045dfff1000SPeter Maydell cpu->gic_vprebits = 5; 1046dfff1000SPeter Maydell cpu->gic_pribits = 5; 1047dfff1000SPeter Maydell 1048dfff1000SPeter Maydell /* Section 14: Scalable Vector Extensions support */ 1049dfff1000SPeter Maydell cpu->sve_vq.supported = 1 << 0; /* 128bit */ 1050dfff1000SPeter Maydell 1051dfff1000SPeter Maydell /* 1052dfff1000SPeter Maydell * The Neoverse N2 TRM does not list CCSIDR values. The layout of 1053dfff1000SPeter Maydell * the caches are in text in Table 7-1, Table 8-1, and Table 9-1. 1054dfff1000SPeter Maydell * 1055dfff1000SPeter Maydell * L1: 4-way set associative 64-byte line size, total 64K. 1056dfff1000SPeter Maydell * L2: 8-way set associative 64 byte line size, total either 512K or 1024K. 1057dfff1000SPeter Maydell */ 1058676624d7SAlireza Sanaee /* L1 dcache */ 1059676624d7SAlireza Sanaee cpu->ccsidr[0] = make_ccsidr(CCSIDR_FORMAT_CCIDX, 4, 64, 64 * KiB, 0); 1060676624d7SAlireza Sanaee /* L1 icache */ 1061676624d7SAlireza Sanaee cpu->ccsidr[1] = cpu->ccsidr[0]; 1062676624d7SAlireza Sanaee /* L2 cache */ 1063676624d7SAlireza Sanaee cpu->ccsidr[2] = make_ccsidr(CCSIDR_FORMAT_CCIDX, 8, 64, 512 * KiB, 0); 1064dfff1000SPeter Maydell /* FIXME: Not documented -- copied from neoverse-v1 */ 1065dfff1000SPeter Maydell cpu->reset_sctlr = 0x30c50838; 1066dfff1000SPeter Maydell 1067dfff1000SPeter Maydell /* 1068dfff1000SPeter Maydell * The Neoverse N2 has all of the Cortex-A710 IMPDEF registers, 1069dfff1000SPeter Maydell * and a few more RNG related ones. 1070dfff1000SPeter Maydell */ 1071dfff1000SPeter Maydell define_arm_cp_regs(cpu, cortex_a710_cp_reginfo); 1072dfff1000SPeter Maydell define_arm_cp_regs(cpu, neoverse_n2_cp_reginfo); 1073dfff1000SPeter Maydell 1074dfff1000SPeter Maydell aarch64_add_pauth_properties(obj); 1075dfff1000SPeter Maydell aarch64_add_sve_properties(obj); 1076dfff1000SPeter Maydell } 1077dfff1000SPeter Maydell 107839920a04SFabiano Rosas /* 107939920a04SFabiano Rosas * -cpu max: a CPU with as many features enabled as our emulation supports. 108020cf68efSClaudio Fontana * The version of '-cpu max' for qemu-system-arm is defined in cpu32.c; 108139920a04SFabiano Rosas * this only needs to handle 64 bits. 108239920a04SFabiano Rosas */ 108339920a04SFabiano Rosas void aarch64_max_tcg_initfn(Object *obj) 108439920a04SFabiano Rosas { 108539920a04SFabiano Rosas ARMCPU *cpu = ARM_CPU(obj); 108639920a04SFabiano Rosas uint64_t t; 108739920a04SFabiano Rosas uint32_t u; 108839920a04SFabiano Rosas 108939920a04SFabiano Rosas /* 1090f037f5b4SPeter Maydell * Unset ARM_FEATURE_BACKCOMPAT_CNTFRQ, which we would otherwise default 1091f037f5b4SPeter Maydell * to because we started with aarch64_a57_initfn(). A 'max' CPU might 1092f037f5b4SPeter Maydell * be a v8.6-or-later one, in which case the cntfrq must be 1GHz; and 1093f037f5b4SPeter Maydell * because it is our "may change" CPU type we are OK with it not being 1094f037f5b4SPeter Maydell * backwards-compatible with how it worked in old QEMU. 1095f037f5b4SPeter Maydell */ 1096f037f5b4SPeter Maydell unset_feature(&cpu->env, ARM_FEATURE_BACKCOMPAT_CNTFRQ); 1097f037f5b4SPeter Maydell 1098f037f5b4SPeter Maydell /* 109939920a04SFabiano Rosas * Reset MIDR so the guest doesn't mistake our 'max' CPU type for a real 110039920a04SFabiano Rosas * one and try to apply errata workarounds or use impdef features we 110139920a04SFabiano Rosas * don't provide. 110239920a04SFabiano Rosas * An IMPLEMENTER field of 0 means "reserved for software use"; 110339920a04SFabiano Rosas * ARCHITECTURE must be 0xf indicating "v7 or later, check ID registers 110439920a04SFabiano Rosas * to see which features are present"; 110539920a04SFabiano Rosas * the VARIANT, PARTNUM and REVISION fields are all implementation 110639920a04SFabiano Rosas * defined and we choose to define PARTNUM just in case guest 110739920a04SFabiano Rosas * code needs to distinguish this QEMU CPU from other software 110839920a04SFabiano Rosas * implementations, though this shouldn't be needed. 110939920a04SFabiano Rosas */ 111039920a04SFabiano Rosas t = FIELD_DP64(0, MIDR_EL1, IMPLEMENTER, 0); 111139920a04SFabiano Rosas t = FIELD_DP64(t, MIDR_EL1, ARCHITECTURE, 0xf); 111239920a04SFabiano Rosas t = FIELD_DP64(t, MIDR_EL1, PARTNUM, 'Q'); 111339920a04SFabiano Rosas t = FIELD_DP64(t, MIDR_EL1, VARIANT, 0); 111439920a04SFabiano Rosas t = FIELD_DP64(t, MIDR_EL1, REVISION, 0); 111539920a04SFabiano Rosas cpu->midr = t; 111639920a04SFabiano Rosas 111739920a04SFabiano Rosas /* 111839920a04SFabiano Rosas * We're going to set FEAT_S2FWB, which mandates that CLIDR_EL1.{LoUU,LoUIS} 111939920a04SFabiano Rosas * are zero. 112039920a04SFabiano Rosas */ 112139920a04SFabiano Rosas u = cpu->clidr; 112239920a04SFabiano Rosas u = FIELD_DP32(u, CLIDR_EL1, LOUIS, 0); 112339920a04SFabiano Rosas u = FIELD_DP32(u, CLIDR_EL1, LOUU, 0); 112439920a04SFabiano Rosas cpu->clidr = u; 112539920a04SFabiano Rosas 11263d65b958SPeter Maydell /* 11273d65b958SPeter Maydell * Set CTR_EL0.DIC and IDC to tell the guest it doesnt' need to 11283d65b958SPeter Maydell * do any cache maintenance for data-to-instruction or 11293d65b958SPeter Maydell * instruction-to-guest coherence. (Our cache ops are nops.) 11303d65b958SPeter Maydell */ 11313d65b958SPeter Maydell t = cpu->ctr; 11323d65b958SPeter Maydell t = FIELD_DP64(t, CTR_EL0, IDC, 1); 11333d65b958SPeter Maydell t = FIELD_DP64(t, CTR_EL0, DIC, 1); 11343d65b958SPeter Maydell cpu->ctr = t; 11353d65b958SPeter Maydell 113639920a04SFabiano Rosas t = cpu->isar.id_aa64isar0; 113739920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64ISAR0, AES, 2); /* FEAT_PMULL */ 113839920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64ISAR0, SHA1, 1); /* FEAT_SHA1 */ 113939920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64ISAR0, SHA2, 2); /* FEAT_SHA512 */ 11409e771a2fSAlex Bennée t = FIELD_DP64(t, ID_AA64ISAR0, CRC32, 1); /* FEAT_CRC32 */ 114139920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64ISAR0, ATOMIC, 2); /* FEAT_LSE */ 114239920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64ISAR0, RDM, 1); /* FEAT_RDM */ 114339920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64ISAR0, SHA3, 1); /* FEAT_SHA3 */ 114439920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64ISAR0, SM3, 1); /* FEAT_SM3 */ 114539920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64ISAR0, SM4, 1); /* FEAT_SM4 */ 114639920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64ISAR0, DP, 1); /* FEAT_DotProd */ 114739920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64ISAR0, FHM, 1); /* FEAT_FHM */ 114839920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64ISAR0, TS, 2); /* FEAT_FlagM2 */ 114939920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64ISAR0, TLB, 2); /* FEAT_TLBIRANGE */ 115039920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64ISAR0, RNDR, 1); /* FEAT_RNG */ 115139920a04SFabiano Rosas cpu->isar.id_aa64isar0 = t; 115239920a04SFabiano Rosas 115339920a04SFabiano Rosas t = cpu->isar.id_aa64isar1; 115439920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64ISAR1, DPB, 2); /* FEAT_DPB2 */ 11558a69a423SAaron Lindsay t = FIELD_DP64(t, ID_AA64ISAR1, APA, PauthFeat_FPACCOMBINED); 11566c3427eeSRichard Henderson t = FIELD_DP64(t, ID_AA64ISAR1, API, 1); 115739920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64ISAR1, JSCVT, 1); /* FEAT_JSCVT */ 115839920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64ISAR1, FCMA, 1); /* FEAT_FCMA */ 115939920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64ISAR1, LRCPC, 2); /* FEAT_LRCPC2 */ 116039920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64ISAR1, FRINTTS, 1); /* FEAT_FRINTTS */ 116139920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64ISAR1, SB, 1); /* FEAT_SB */ 116239920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64ISAR1, SPECRES, 1); /* FEAT_SPECRES */ 11635d1187b3SPeter Maydell t = FIELD_DP64(t, ID_AA64ISAR1, BF16, 2); /* FEAT_BF16, FEAT_EBF16 */ 116439920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64ISAR1, DGH, 1); /* FEAT_DGH */ 116539920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64ISAR1, I8MM, 1); /* FEAT_I8MM */ 116619db1d4dSManos Pitsidianakis t = FIELD_DP64(t, ID_AA64ISAR1, XS, 1); /* FEAT_XS */ 116739920a04SFabiano Rosas cpu->isar.id_aa64isar1 = t; 116839920a04SFabiano Rosas 11693039b090SPeter Maydell t = cpu->isar.id_aa64isar2; 1170b0bf3774SPeter Maydell t = FIELD_DP64(t, ID_AA64ISAR2, RPRES, 1); /* FEAT_RPRES */ 1171706a92fbSPeter Maydell t = FIELD_DP64(t, ID_AA64ISAR2, MOPS, 1); /* FEAT_MOPS */ 11723039b090SPeter Maydell t = FIELD_DP64(t, ID_AA64ISAR2, BC, 1); /* FEAT_HBC */ 1173a96edb68SPeter Maydell t = FIELD_DP64(t, ID_AA64ISAR2, WFXT, 2); /* FEAT_WFxT */ 11743039b090SPeter Maydell cpu->isar.id_aa64isar2 = t; 11753039b090SPeter Maydell 117639920a04SFabiano Rosas t = cpu->isar.id_aa64pfr0; 117739920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64PFR0, FP, 1); /* FEAT_FP16 */ 117839920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64PFR0, ADVSIMD, 1); /* FEAT_FP16 */ 117939920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64PFR0, RAS, 2); /* FEAT_RASv1p1 + FEAT_DoubleFault */ 118039920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64PFR0, SVE, 1); 118139920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64PFR0, SEL2, 1); /* FEAT_SEL2 */ 118239920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64PFR0, DIT, 1); /* FEAT_DIT */ 1183e1973951SPeter Maydell t = FIELD_DP64(t, ID_AA64PFR0, CSV2, 3); /* FEAT_CSV2_3 */ 118439920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64PFR0, CSV3, 1); /* FEAT_CSV3 */ 118539920a04SFabiano Rosas cpu->isar.id_aa64pfr0 = t; 118639920a04SFabiano Rosas 118739920a04SFabiano Rosas t = cpu->isar.id_aa64pfr1; 118839920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64PFR1, BT, 1); /* FEAT_BTI */ 118939920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64PFR1, SSBS, 2); /* FEAT_SSBS2 */ 119039920a04SFabiano Rosas /* 119139920a04SFabiano Rosas * Begin with full support for MTE. This will be downgraded to MTE=0 119239920a04SFabiano Rosas * during realize if the board provides no tag memory, much like 119339920a04SFabiano Rosas * we do for EL2 with the virtualization=on property. 119439920a04SFabiano Rosas */ 119539920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64PFR1, MTE, 3); /* FEAT_MTE3 */ 119639920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64PFR1, RAS_FRAC, 0); /* FEAT_RASv1p1 + FEAT_DoubleFault */ 119739920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64PFR1, SME, 1); /* FEAT_SME */ 1198e1973951SPeter Maydell t = FIELD_DP64(t, ID_AA64PFR1, CSV2_FRAC, 0); /* FEAT_CSV2_3 */ 119914a16403SJinjie Ruan t = FIELD_DP64(t, ID_AA64PFR1, NMI, 1); /* FEAT_NMI */ 120039920a04SFabiano Rosas cpu->isar.id_aa64pfr1 = t; 120139920a04SFabiano Rosas 120239920a04SFabiano Rosas t = cpu->isar.id_aa64mmfr0; 120339920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64MMFR0, PARANGE, 6); /* FEAT_LPA: 52 bits */ 120439920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64MMFR0, TGRAN16, 1); /* 16k pages supported */ 120539920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64MMFR0, TGRAN16_2, 2); /* 16k stage2 supported */ 120639920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64MMFR0, TGRAN64_2, 2); /* 64k stage2 supported */ 120739920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64MMFR0, TGRAN4_2, 2); /* 4k stage2 supported */ 120839920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64MMFR0, FGT, 1); /* FEAT_FGT */ 1209c10a9a51SPeter Maydell t = FIELD_DP64(t, ID_AA64MMFR0, ECV, 2); /* FEAT_ECV */ 121039920a04SFabiano Rosas cpu->isar.id_aa64mmfr0 = t; 121139920a04SFabiano Rosas 121239920a04SFabiano Rosas t = cpu->isar.id_aa64mmfr1; 121339920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64MMFR1, HAFDBS, 2); /* FEAT_HAFDBS */ 121439920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64MMFR1, VMIDBITS, 2); /* FEAT_VMID16 */ 121539920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64MMFR1, VH, 1); /* FEAT_VHE */ 1216df9a3917SRichard Henderson t = FIELD_DP64(t, ID_AA64MMFR1, HPDS, 2); /* FEAT_HPDS2 */ 121739920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64MMFR1, LO, 1); /* FEAT_LOR */ 121839920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64MMFR1, PAN, 3); /* FEAT_PAN3 */ 121939920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64MMFR1, XNX, 1); /* FEAT_XNX */ 122074360f35SPeter Maydell t = FIELD_DP64(t, ID_AA64MMFR1, ETS, 2); /* FEAT_ETS2 */ 122139920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64MMFR1, HCX, 1); /* FEAT_HCX */ 1222d38a57a3SPeter Maydell t = FIELD_DP64(t, ID_AA64MMFR1, AFP, 1); /* FEAT_AFP */ 12239cd0c0deSRichard Henderson t = FIELD_DP64(t, ID_AA64MMFR1, TIDCP1, 1); /* FEAT_TIDCP1 */ 1224374cdc8eSGustavo Romero t = FIELD_DP64(t, ID_AA64MMFR1, CMOW, 1); /* FEAT_CMOW */ 122539920a04SFabiano Rosas cpu->isar.id_aa64mmfr1 = t; 122639920a04SFabiano Rosas 122739920a04SFabiano Rosas t = cpu->isar.id_aa64mmfr2; 122839920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64MMFR2, CNP, 1); /* FEAT_TTCNP */ 122939920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64MMFR2, UAO, 1); /* FEAT_UAO */ 123039920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64MMFR2, IESB, 1); /* FEAT_IESB */ 123139920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64MMFR2, VARANGE, 1); /* FEAT_LVA */ 1232e2862554SPeter Maydell t = FIELD_DP64(t, ID_AA64MMFR2, NV, 2); /* FEAT_NV2 */ 123339920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64MMFR2, ST, 1); /* FEAT_TTST */ 123459b6b42cSRichard Henderson t = FIELD_DP64(t, ID_AA64MMFR2, AT, 1); /* FEAT_LSE2 */ 123539920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64MMFR2, IDS, 1); /* FEAT_IDST */ 123639920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64MMFR2, FWB, 1); /* FEAT_S2FWB */ 123739920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64MMFR2, TTL, 1); /* FEAT_TTL */ 123839920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64MMFR2, BBM, 2); /* FEAT_BBM at level 2 */ 123939920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64MMFR2, EVT, 2); /* FEAT_EVT */ 124039920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64MMFR2, E0PD, 1); /* FEAT_E0PD */ 124139920a04SFabiano Rosas cpu->isar.id_aa64mmfr2 = t; 124239920a04SFabiano Rosas 1243663163f0SPeter Maydell t = cpu->isar.id_aa64mmfr3; 1244663163f0SPeter Maydell t = FIELD_DP64(t, ID_AA64MMFR3, SPEC_FPACC, 1); /* FEAT_FPACC_SPEC */ 1245663163f0SPeter Maydell cpu->isar.id_aa64mmfr3 = t; 1246663163f0SPeter Maydell 124739920a04SFabiano Rosas t = cpu->isar.id_aa64zfr0; 124839920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64ZFR0, SVEVER, 1); 124939920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64ZFR0, AES, 2); /* FEAT_SVE_PMULL128 */ 125039920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64ZFR0, BITPERM, 1); /* FEAT_SVE_BitPerm */ 12515d1187b3SPeter Maydell t = FIELD_DP64(t, ID_AA64ZFR0, BFLOAT16, 2); /* FEAT_BF16, FEAT_EBF16 */ 125239920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64ZFR0, SHA3, 1); /* FEAT_SVE_SHA3 */ 125339920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64ZFR0, SM4, 1); /* FEAT_SVE_SM4 */ 125439920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64ZFR0, I8MM, 1); /* FEAT_I8MM */ 125539920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64ZFR0, F32MM, 1); /* FEAT_F32MM */ 125639920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64ZFR0, F64MM, 1); /* FEAT_F64MM */ 125739920a04SFabiano Rosas cpu->isar.id_aa64zfr0 = t; 125839920a04SFabiano Rosas 125939920a04SFabiano Rosas t = cpu->isar.id_aa64dfr0; 126002ff2addSGustavo Romero t = FIELD_DP64(t, ID_AA64DFR0, DEBUGVER, 10); /* FEAT_Debugv8p8 */ 126139920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64DFR0, PMUVER, 6); /* FEAT_PMUv3p5 */ 12623d80bbf1SPeter Maydell t = FIELD_DP64(t, ID_AA64DFR0, HPMN0, 1); /* FEAT_HPMN0 */ 126339920a04SFabiano Rosas cpu->isar.id_aa64dfr0 = t; 126439920a04SFabiano Rosas 126539920a04SFabiano Rosas t = cpu->isar.id_aa64smfr0; 126639920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64SMFR0, F32F32, 1); /* FEAT_SME */ 126739920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64SMFR0, B16F32, 1); /* FEAT_SME */ 126839920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64SMFR0, F16F32, 1); /* FEAT_SME */ 126939920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64SMFR0, I8I32, 0xf); /* FEAT_SME */ 127039920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64SMFR0, F64F64, 1); /* FEAT_SME_F64F64 */ 127139920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64SMFR0, I16I64, 0xf); /* FEAT_SME_I16I64 */ 127239920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64SMFR0, FA64, 1); /* FEAT_SME_FA64 */ 127339920a04SFabiano Rosas cpu->isar.id_aa64smfr0 = t; 127439920a04SFabiano Rosas 127539920a04SFabiano Rosas /* Replicate the same data to the 32-bit id registers. */ 127639920a04SFabiano Rosas aa32_max_features(cpu); 127739920a04SFabiano Rosas 127839920a04SFabiano Rosas #ifdef CONFIG_USER_ONLY 127939920a04SFabiano Rosas /* 128039920a04SFabiano Rosas * For usermode -cpu max we can use a larger and more efficient DCZ 128139920a04SFabiano Rosas * blocksize since we don't have to follow what the hardware does. 128239920a04SFabiano Rosas */ 128339920a04SFabiano Rosas cpu->ctr = 0x80038003; /* 32 byte I and D cacheline size, VIPT icache */ 128439920a04SFabiano Rosas cpu->dcz_blocksize = 7; /* 512 bytes */ 128539920a04SFabiano Rosas #endif 1286851ec6ebSRichard Henderson cpu->gm_blocksize = 6; /* 256 bytes */ 128739920a04SFabiano Rosas 128839920a04SFabiano Rosas cpu->sve_vq.supported = MAKE_64BIT_MASK(0, ARM_MAX_VQ); 128939920a04SFabiano Rosas cpu->sme_vq.supported = SVE_VQ_POW2_MAP; 129039920a04SFabiano Rosas 129139920a04SFabiano Rosas aarch64_add_pauth_properties(obj); 129239920a04SFabiano Rosas aarch64_add_sve_properties(obj); 129339920a04SFabiano Rosas aarch64_add_sme_properties(obj); 129439920a04SFabiano Rosas object_property_add(obj, "sve-max-vq", "uint32", cpu_max_get_sve_max_vq, 129539920a04SFabiano Rosas cpu_max_set_sve_max_vq, NULL, NULL); 1296a834d547SRichard Henderson object_property_add_bool(obj, "x-rme", cpu_arm_get_rme, cpu_arm_set_rme); 1297a834d547SRichard Henderson object_property_add(obj, "x-l0gptsz", "uint32", cpu_max_get_l0gptsz, 1298a834d547SRichard Henderson cpu_max_set_l0gptsz, NULL, NULL); 129939920a04SFabiano Rosas qdev_property_add_static(DEVICE(obj), &arm_cpu_lpa2_property); 130039920a04SFabiano Rosas } 130139920a04SFabiano Rosas 130239920a04SFabiano Rosas static const ARMCPUInfo aarch64_cpus[] = { 130339920a04SFabiano Rosas { .name = "cortex-a35", .initfn = aarch64_a35_initfn }, 130439920a04SFabiano Rosas { .name = "cortex-a55", .initfn = aarch64_a55_initfn }, 130539920a04SFabiano Rosas { .name = "cortex-a72", .initfn = aarch64_a72_initfn }, 130639920a04SFabiano Rosas { .name = "cortex-a76", .initfn = aarch64_a76_initfn }, 1307e3d45c0aSRichard Henderson { .name = "cortex-a710", .initfn = aarch64_a710_initfn }, 130839920a04SFabiano Rosas { .name = "a64fx", .initfn = aarch64_a64fx_initfn }, 130939920a04SFabiano Rosas { .name = "neoverse-n1", .initfn = aarch64_neoverse_n1_initfn }, 1310c74138c6SPeter Maydell { .name = "neoverse-v1", .initfn = aarch64_neoverse_v1_initfn }, 1311dfff1000SPeter Maydell { .name = "neoverse-n2", .initfn = aarch64_neoverse_n2_initfn }, 131239920a04SFabiano Rosas }; 131339920a04SFabiano Rosas 131439920a04SFabiano Rosas static void aarch64_cpu_register_types(void) 131539920a04SFabiano Rosas { 131639920a04SFabiano Rosas size_t i; 131739920a04SFabiano Rosas 131839920a04SFabiano Rosas for (i = 0; i < ARRAY_SIZE(aarch64_cpus); ++i) { 1319*ec7e5a90SPeter Maydell arm_cpu_register(&aarch64_cpus[i]); 132039920a04SFabiano Rosas } 132139920a04SFabiano Rosas } 132239920a04SFabiano Rosas 132339920a04SFabiano Rosas type_init(aarch64_cpu_register_types) 1324