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 32d8100822SRichard Henderson static uint64_t make_ccsidr64(unsigned assoc, unsigned linesize, 33d8100822SRichard Henderson unsigned cachesize) 34d8100822SRichard Henderson { 35d8100822SRichard Henderson unsigned lg_linesize = ctz32(linesize); 36d8100822SRichard Henderson unsigned sets; 37d8100822SRichard Henderson 38d8100822SRichard Henderson /* 39d8100822SRichard Henderson * The 64-bit CCSIDR_EL1 format is: 40d8100822SRichard Henderson * [55:32] number of sets - 1 41d8100822SRichard Henderson * [23:3] associativity - 1 42d8100822SRichard Henderson * [2:0] log2(linesize) - 4 43d8100822SRichard Henderson * so 0 == 16 bytes, 1 == 32 bytes, 2 == 64 bytes, etc 44d8100822SRichard Henderson */ 45d8100822SRichard Henderson assert(assoc != 0); 46d8100822SRichard Henderson assert(is_power_of_2(linesize)); 47d8100822SRichard Henderson assert(lg_linesize >= 4 && lg_linesize <= 7 + 4); 48d8100822SRichard Henderson 49d8100822SRichard Henderson /* sets * associativity * linesize == cachesize. */ 50d8100822SRichard Henderson sets = cachesize / (assoc * linesize); 51d8100822SRichard Henderson assert(cachesize % (assoc * linesize) == 0); 52d8100822SRichard Henderson 53d8100822SRichard Henderson return ((uint64_t)(sets - 1) << 32) 54d8100822SRichard Henderson | ((assoc - 1) << 3) 55d8100822SRichard Henderson | (lg_linesize - 4); 56d8100822SRichard Henderson } 57d8100822SRichard Henderson 5839920a04SFabiano Rosas static void aarch64_a35_initfn(Object *obj) 5939920a04SFabiano Rosas { 6039920a04SFabiano Rosas ARMCPU *cpu = ARM_CPU(obj); 6139920a04SFabiano Rosas 6239920a04SFabiano Rosas cpu->dtb_compatible = "arm,cortex-a35"; 6339920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_V8); 6439920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_NEON); 6539920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_GENERIC_TIMER); 66*f037f5b4SPeter Maydell set_feature(&cpu->env, ARM_FEATURE_BACKCOMPAT_CNTFRQ); 6739920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_AARCH64); 6839920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_CBAR_RO); 6939920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_EL2); 7039920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_EL3); 7139920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_PMU); 7239920a04SFabiano Rosas 7339920a04SFabiano Rosas /* From B2.2 AArch64 identification registers. */ 7439920a04SFabiano Rosas cpu->midr = 0x411fd040; 7539920a04SFabiano Rosas cpu->revidr = 0; 7639920a04SFabiano Rosas cpu->ctr = 0x84448004; 7739920a04SFabiano Rosas cpu->isar.id_pfr0 = 0x00000131; 7839920a04SFabiano Rosas cpu->isar.id_pfr1 = 0x00011011; 7939920a04SFabiano Rosas cpu->isar.id_dfr0 = 0x03010066; 8039920a04SFabiano Rosas cpu->id_afr0 = 0; 8139920a04SFabiano Rosas cpu->isar.id_mmfr0 = 0x10201105; 8239920a04SFabiano Rosas cpu->isar.id_mmfr1 = 0x40000000; 8339920a04SFabiano Rosas cpu->isar.id_mmfr2 = 0x01260000; 8439920a04SFabiano Rosas cpu->isar.id_mmfr3 = 0x02102211; 8539920a04SFabiano Rosas cpu->isar.id_isar0 = 0x02101110; 8639920a04SFabiano Rosas cpu->isar.id_isar1 = 0x13112111; 8739920a04SFabiano Rosas cpu->isar.id_isar2 = 0x21232042; 8839920a04SFabiano Rosas cpu->isar.id_isar3 = 0x01112131; 8939920a04SFabiano Rosas cpu->isar.id_isar4 = 0x00011142; 9039920a04SFabiano Rosas cpu->isar.id_isar5 = 0x00011121; 9139920a04SFabiano Rosas cpu->isar.id_aa64pfr0 = 0x00002222; 9239920a04SFabiano Rosas cpu->isar.id_aa64pfr1 = 0; 9339920a04SFabiano Rosas cpu->isar.id_aa64dfr0 = 0x10305106; 9439920a04SFabiano Rosas cpu->isar.id_aa64dfr1 = 0; 9539920a04SFabiano Rosas cpu->isar.id_aa64isar0 = 0x00011120; 9639920a04SFabiano Rosas cpu->isar.id_aa64isar1 = 0; 9739920a04SFabiano Rosas cpu->isar.id_aa64mmfr0 = 0x00101122; 9839920a04SFabiano Rosas cpu->isar.id_aa64mmfr1 = 0; 9939920a04SFabiano Rosas cpu->clidr = 0x0a200023; 10039920a04SFabiano Rosas cpu->dcz_blocksize = 4; 10139920a04SFabiano Rosas 10239920a04SFabiano Rosas /* From B2.4 AArch64 Virtual Memory control registers */ 10339920a04SFabiano Rosas cpu->reset_sctlr = 0x00c50838; 10439920a04SFabiano Rosas 10539920a04SFabiano Rosas /* From B2.10 AArch64 performance monitor registers */ 10639920a04SFabiano Rosas cpu->isar.reset_pmcr_el0 = 0x410a3000; 10739920a04SFabiano Rosas 10839920a04SFabiano Rosas /* From B2.29 Cache ID registers */ 10939920a04SFabiano Rosas cpu->ccsidr[0] = 0x700fe01a; /* 32KB L1 dcache */ 11039920a04SFabiano Rosas cpu->ccsidr[1] = 0x201fe00a; /* 32KB L1 icache */ 11139920a04SFabiano Rosas cpu->ccsidr[2] = 0x703fe03a; /* 512KB L2 cache */ 11239920a04SFabiano Rosas 11339920a04SFabiano Rosas /* From B3.5 VGIC Type register */ 11439920a04SFabiano Rosas cpu->gic_num_lrs = 4; 11539920a04SFabiano Rosas cpu->gic_vpribits = 5; 11639920a04SFabiano Rosas cpu->gic_vprebits = 5; 11739920a04SFabiano Rosas cpu->gic_pribits = 5; 11839920a04SFabiano Rosas 11939920a04SFabiano Rosas /* From C6.4 Debug ID Register */ 12039920a04SFabiano Rosas cpu->isar.dbgdidr = 0x3516d000; 12139920a04SFabiano Rosas /* From C6.5 Debug Device ID Register */ 12239920a04SFabiano Rosas cpu->isar.dbgdevid = 0x00110f13; 12339920a04SFabiano Rosas /* From C6.6 Debug Device ID Register 1 */ 12439920a04SFabiano Rosas cpu->isar.dbgdevid1 = 0x2; 12539920a04SFabiano Rosas 12639920a04SFabiano Rosas /* From Cortex-A35 SIMD and Floating-point Support r1p0 */ 12739920a04SFabiano Rosas /* From 3.2 AArch32 register summary */ 12839920a04SFabiano Rosas cpu->reset_fpsid = 0x41034043; 12939920a04SFabiano Rosas 13039920a04SFabiano Rosas /* From 2.2 AArch64 register summary */ 13139920a04SFabiano Rosas cpu->isar.mvfr0 = 0x10110222; 13239920a04SFabiano Rosas cpu->isar.mvfr1 = 0x12111111; 13339920a04SFabiano Rosas cpu->isar.mvfr2 = 0x00000043; 13439920a04SFabiano Rosas 13539920a04SFabiano Rosas /* These values are the same with A53/A57/A72. */ 13639920a04SFabiano Rosas define_cortex_a72_a57_a53_cp_reginfo(cpu); 13739920a04SFabiano Rosas } 13839920a04SFabiano Rosas 13939920a04SFabiano Rosas static void cpu_max_get_sve_max_vq(Object *obj, Visitor *v, const char *name, 14039920a04SFabiano Rosas void *opaque, Error **errp) 14139920a04SFabiano Rosas { 14239920a04SFabiano Rosas ARMCPU *cpu = ARM_CPU(obj); 14339920a04SFabiano Rosas uint32_t value; 14439920a04SFabiano Rosas 14539920a04SFabiano Rosas /* All vector lengths are disabled when SVE is off. */ 14639920a04SFabiano Rosas if (!cpu_isar_feature(aa64_sve, cpu)) { 14739920a04SFabiano Rosas value = 0; 14839920a04SFabiano Rosas } else { 14939920a04SFabiano Rosas value = cpu->sve_max_vq; 15039920a04SFabiano Rosas } 15139920a04SFabiano Rosas visit_type_uint32(v, name, &value, errp); 15239920a04SFabiano Rosas } 15339920a04SFabiano Rosas 15439920a04SFabiano Rosas static void cpu_max_set_sve_max_vq(Object *obj, Visitor *v, const char *name, 15539920a04SFabiano Rosas void *opaque, Error **errp) 15639920a04SFabiano Rosas { 15739920a04SFabiano Rosas ARMCPU *cpu = ARM_CPU(obj); 15839920a04SFabiano Rosas uint32_t max_vq; 15939920a04SFabiano Rosas 16039920a04SFabiano Rosas if (!visit_type_uint32(v, name, &max_vq, errp)) { 16139920a04SFabiano Rosas return; 16239920a04SFabiano Rosas } 16339920a04SFabiano Rosas 16439920a04SFabiano Rosas if (max_vq == 0 || max_vq > ARM_MAX_VQ) { 16539920a04SFabiano Rosas error_setg(errp, "unsupported SVE vector length"); 16639920a04SFabiano Rosas error_append_hint(errp, "Valid sve-max-vq in range [1-%d]\n", 16739920a04SFabiano Rosas ARM_MAX_VQ); 16839920a04SFabiano Rosas return; 16939920a04SFabiano Rosas } 17039920a04SFabiano Rosas 17139920a04SFabiano Rosas cpu->sve_max_vq = max_vq; 17239920a04SFabiano Rosas } 17339920a04SFabiano Rosas 174a834d547SRichard Henderson static bool cpu_arm_get_rme(Object *obj, Error **errp) 175a834d547SRichard Henderson { 176a834d547SRichard Henderson ARMCPU *cpu = ARM_CPU(obj); 177a834d547SRichard Henderson return cpu_isar_feature(aa64_rme, cpu); 178a834d547SRichard Henderson } 179a834d547SRichard Henderson 180a834d547SRichard Henderson static void cpu_arm_set_rme(Object *obj, bool value, Error **errp) 181a834d547SRichard Henderson { 182a834d547SRichard Henderson ARMCPU *cpu = ARM_CPU(obj); 183a834d547SRichard Henderson uint64_t t; 184a834d547SRichard Henderson 185a834d547SRichard Henderson t = cpu->isar.id_aa64pfr0; 186a834d547SRichard Henderson t = FIELD_DP64(t, ID_AA64PFR0, RME, value); 187a834d547SRichard Henderson cpu->isar.id_aa64pfr0 = t; 188a834d547SRichard Henderson } 189a834d547SRichard Henderson 190a834d547SRichard Henderson static void cpu_max_set_l0gptsz(Object *obj, Visitor *v, const char *name, 191a834d547SRichard Henderson void *opaque, Error **errp) 192a834d547SRichard Henderson { 193a834d547SRichard Henderson ARMCPU *cpu = ARM_CPU(obj); 194a834d547SRichard Henderson uint32_t value; 195a834d547SRichard Henderson 196a834d547SRichard Henderson if (!visit_type_uint32(v, name, &value, errp)) { 197a834d547SRichard Henderson return; 198a834d547SRichard Henderson } 199a834d547SRichard Henderson 200a834d547SRichard Henderson /* Encode the value for the GPCCR_EL3 field. */ 201a834d547SRichard Henderson switch (value) { 202a834d547SRichard Henderson case 30: 203a834d547SRichard Henderson case 34: 204a834d547SRichard Henderson case 36: 205a834d547SRichard Henderson case 39: 206a834d547SRichard Henderson cpu->reset_l0gptsz = value - 30; 207a834d547SRichard Henderson break; 208a834d547SRichard Henderson default: 209a834d547SRichard Henderson error_setg(errp, "invalid value for l0gptsz"); 210a834d547SRichard Henderson error_append_hint(errp, "valid values are 30, 34, 36, 39\n"); 211a834d547SRichard Henderson break; 212a834d547SRichard Henderson } 213a834d547SRichard Henderson } 214a834d547SRichard Henderson 215a834d547SRichard Henderson static void cpu_max_get_l0gptsz(Object *obj, Visitor *v, const char *name, 216a834d547SRichard Henderson void *opaque, Error **errp) 217a834d547SRichard Henderson { 218a834d547SRichard Henderson ARMCPU *cpu = ARM_CPU(obj); 219a834d547SRichard Henderson uint32_t value = cpu->reset_l0gptsz + 30; 220a834d547SRichard Henderson 221a834d547SRichard Henderson visit_type_uint32(v, name, &value, errp); 222a834d547SRichard Henderson } 223a834d547SRichard Henderson 22439920a04SFabiano Rosas static Property arm_cpu_lpa2_property = 22539920a04SFabiano Rosas DEFINE_PROP_BOOL("lpa2", ARMCPU, prop_lpa2, true); 22639920a04SFabiano Rosas 22739920a04SFabiano Rosas static void aarch64_a55_initfn(Object *obj) 22839920a04SFabiano Rosas { 22939920a04SFabiano Rosas ARMCPU *cpu = ARM_CPU(obj); 23039920a04SFabiano Rosas 23139920a04SFabiano Rosas cpu->dtb_compatible = "arm,cortex-a55"; 23239920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_V8); 23339920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_NEON); 23439920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_GENERIC_TIMER); 235*f037f5b4SPeter Maydell set_feature(&cpu->env, ARM_FEATURE_BACKCOMPAT_CNTFRQ); 23639920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_AARCH64); 23739920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_CBAR_RO); 23839920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_EL2); 23939920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_EL3); 24039920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_PMU); 24139920a04SFabiano Rosas 24239920a04SFabiano Rosas /* Ordered by B2.4 AArch64 registers by functional group */ 24339920a04SFabiano Rosas cpu->clidr = 0x82000023; 24439920a04SFabiano Rosas cpu->ctr = 0x84448004; /* L1Ip = VIPT */ 24539920a04SFabiano Rosas cpu->dcz_blocksize = 4; /* 64 bytes */ 24639920a04SFabiano Rosas cpu->isar.id_aa64dfr0 = 0x0000000010305408ull; 24739920a04SFabiano Rosas cpu->isar.id_aa64isar0 = 0x0000100010211120ull; 24839920a04SFabiano Rosas cpu->isar.id_aa64isar1 = 0x0000000000100001ull; 24939920a04SFabiano Rosas cpu->isar.id_aa64mmfr0 = 0x0000000000101122ull; 25039920a04SFabiano Rosas cpu->isar.id_aa64mmfr1 = 0x0000000010212122ull; 25139920a04SFabiano Rosas cpu->isar.id_aa64mmfr2 = 0x0000000000001011ull; 25239920a04SFabiano Rosas cpu->isar.id_aa64pfr0 = 0x0000000010112222ull; 25339920a04SFabiano Rosas cpu->isar.id_aa64pfr1 = 0x0000000000000010ull; 25439920a04SFabiano Rosas cpu->id_afr0 = 0x00000000; 25539920a04SFabiano Rosas cpu->isar.id_dfr0 = 0x04010088; 25639920a04SFabiano Rosas cpu->isar.id_isar0 = 0x02101110; 25739920a04SFabiano Rosas cpu->isar.id_isar1 = 0x13112111; 25839920a04SFabiano Rosas cpu->isar.id_isar2 = 0x21232042; 25939920a04SFabiano Rosas cpu->isar.id_isar3 = 0x01112131; 26039920a04SFabiano Rosas cpu->isar.id_isar4 = 0x00011142; 26139920a04SFabiano Rosas cpu->isar.id_isar5 = 0x01011121; 26239920a04SFabiano Rosas cpu->isar.id_isar6 = 0x00000010; 26339920a04SFabiano Rosas cpu->isar.id_mmfr0 = 0x10201105; 26439920a04SFabiano Rosas cpu->isar.id_mmfr1 = 0x40000000; 26539920a04SFabiano Rosas cpu->isar.id_mmfr2 = 0x01260000; 26639920a04SFabiano Rosas cpu->isar.id_mmfr3 = 0x02122211; 26739920a04SFabiano Rosas cpu->isar.id_mmfr4 = 0x00021110; 26839920a04SFabiano Rosas cpu->isar.id_pfr0 = 0x10010131; 26939920a04SFabiano Rosas cpu->isar.id_pfr1 = 0x00011011; 27039920a04SFabiano Rosas cpu->isar.id_pfr2 = 0x00000011; 27139920a04SFabiano Rosas cpu->midr = 0x412FD050; /* r2p0 */ 27239920a04SFabiano Rosas cpu->revidr = 0; 27339920a04SFabiano Rosas 27439920a04SFabiano Rosas /* From B2.23 CCSIDR_EL1 */ 27539920a04SFabiano Rosas cpu->ccsidr[0] = 0x700fe01a; /* 32KB L1 dcache */ 27639920a04SFabiano Rosas cpu->ccsidr[1] = 0x200fe01a; /* 32KB L1 icache */ 27739920a04SFabiano Rosas cpu->ccsidr[2] = 0x703fe07a; /* 512KB L2 cache */ 27839920a04SFabiano Rosas 27939920a04SFabiano Rosas /* From B2.96 SCTLR_EL3 */ 28039920a04SFabiano Rosas cpu->reset_sctlr = 0x30c50838; 28139920a04SFabiano Rosas 28239920a04SFabiano Rosas /* From B4.45 ICH_VTR_EL2 */ 28339920a04SFabiano Rosas cpu->gic_num_lrs = 4; 28439920a04SFabiano Rosas cpu->gic_vpribits = 5; 28539920a04SFabiano Rosas cpu->gic_vprebits = 5; 28639920a04SFabiano Rosas cpu->gic_pribits = 5; 28739920a04SFabiano Rosas 28839920a04SFabiano Rosas cpu->isar.mvfr0 = 0x10110222; 28939920a04SFabiano Rosas cpu->isar.mvfr1 = 0x13211111; 29039920a04SFabiano Rosas cpu->isar.mvfr2 = 0x00000043; 29139920a04SFabiano Rosas 29239920a04SFabiano Rosas /* From D5.4 AArch64 PMU register summary */ 29339920a04SFabiano Rosas cpu->isar.reset_pmcr_el0 = 0x410b3000; 29439920a04SFabiano Rosas } 29539920a04SFabiano Rosas 29639920a04SFabiano Rosas static void aarch64_a72_initfn(Object *obj) 29739920a04SFabiano Rosas { 29839920a04SFabiano Rosas ARMCPU *cpu = ARM_CPU(obj); 29939920a04SFabiano Rosas 30039920a04SFabiano Rosas cpu->dtb_compatible = "arm,cortex-a72"; 30139920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_V8); 30239920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_NEON); 30339920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_GENERIC_TIMER); 304*f037f5b4SPeter Maydell set_feature(&cpu->env, ARM_FEATURE_BACKCOMPAT_CNTFRQ); 30539920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_AARCH64); 30639920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_CBAR_RO); 30739920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_EL2); 30839920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_EL3); 30939920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_PMU); 31039920a04SFabiano Rosas cpu->midr = 0x410fd083; 31139920a04SFabiano Rosas cpu->revidr = 0x00000000; 31239920a04SFabiano Rosas cpu->reset_fpsid = 0x41034080; 31339920a04SFabiano Rosas cpu->isar.mvfr0 = 0x10110222; 31439920a04SFabiano Rosas cpu->isar.mvfr1 = 0x12111111; 31539920a04SFabiano Rosas cpu->isar.mvfr2 = 0x00000043; 31639920a04SFabiano Rosas cpu->ctr = 0x8444c004; 31739920a04SFabiano Rosas cpu->reset_sctlr = 0x00c50838; 31839920a04SFabiano Rosas cpu->isar.id_pfr0 = 0x00000131; 31939920a04SFabiano Rosas cpu->isar.id_pfr1 = 0x00011011; 32039920a04SFabiano Rosas cpu->isar.id_dfr0 = 0x03010066; 32139920a04SFabiano Rosas cpu->id_afr0 = 0x00000000; 32239920a04SFabiano Rosas cpu->isar.id_mmfr0 = 0x10201105; 32339920a04SFabiano Rosas cpu->isar.id_mmfr1 = 0x40000000; 32439920a04SFabiano Rosas cpu->isar.id_mmfr2 = 0x01260000; 32539920a04SFabiano Rosas cpu->isar.id_mmfr3 = 0x02102211; 32639920a04SFabiano Rosas cpu->isar.id_isar0 = 0x02101110; 32739920a04SFabiano Rosas cpu->isar.id_isar1 = 0x13112111; 32839920a04SFabiano Rosas cpu->isar.id_isar2 = 0x21232042; 32939920a04SFabiano Rosas cpu->isar.id_isar3 = 0x01112131; 33039920a04SFabiano Rosas cpu->isar.id_isar4 = 0x00011142; 33139920a04SFabiano Rosas cpu->isar.id_isar5 = 0x00011121; 33239920a04SFabiano Rosas cpu->isar.id_aa64pfr0 = 0x00002222; 33339920a04SFabiano Rosas cpu->isar.id_aa64dfr0 = 0x10305106; 33439920a04SFabiano Rosas cpu->isar.id_aa64isar0 = 0x00011120; 33539920a04SFabiano Rosas cpu->isar.id_aa64mmfr0 = 0x00001124; 33639920a04SFabiano Rosas cpu->isar.dbgdidr = 0x3516d000; 33739920a04SFabiano Rosas cpu->isar.dbgdevid = 0x01110f13; 33839920a04SFabiano Rosas cpu->isar.dbgdevid1 = 0x2; 33939920a04SFabiano Rosas cpu->isar.reset_pmcr_el0 = 0x41023000; 34039920a04SFabiano Rosas cpu->clidr = 0x0a200023; 34139920a04SFabiano Rosas cpu->ccsidr[0] = 0x701fe00a; /* 32KB L1 dcache */ 34239920a04SFabiano Rosas cpu->ccsidr[1] = 0x201fe012; /* 48KB L1 icache */ 34339920a04SFabiano Rosas cpu->ccsidr[2] = 0x707fe07a; /* 1MB L2 cache */ 34439920a04SFabiano Rosas cpu->dcz_blocksize = 4; /* 64 bytes */ 34539920a04SFabiano Rosas cpu->gic_num_lrs = 4; 34639920a04SFabiano Rosas cpu->gic_vpribits = 5; 34739920a04SFabiano Rosas cpu->gic_vprebits = 5; 34839920a04SFabiano Rosas cpu->gic_pribits = 5; 34939920a04SFabiano Rosas define_cortex_a72_a57_a53_cp_reginfo(cpu); 35039920a04SFabiano Rosas } 35139920a04SFabiano Rosas 35239920a04SFabiano Rosas static void aarch64_a76_initfn(Object *obj) 35339920a04SFabiano Rosas { 35439920a04SFabiano Rosas ARMCPU *cpu = ARM_CPU(obj); 35539920a04SFabiano Rosas 35639920a04SFabiano Rosas cpu->dtb_compatible = "arm,cortex-a76"; 35739920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_V8); 35839920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_NEON); 35939920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_GENERIC_TIMER); 360*f037f5b4SPeter Maydell set_feature(&cpu->env, ARM_FEATURE_BACKCOMPAT_CNTFRQ); 36139920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_AARCH64); 36239920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_CBAR_RO); 36339920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_EL2); 36439920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_EL3); 36539920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_PMU); 36639920a04SFabiano Rosas 36739920a04SFabiano Rosas /* Ordered by B2.4 AArch64 registers by functional group */ 36839920a04SFabiano Rosas cpu->clidr = 0x82000023; 36939920a04SFabiano Rosas cpu->ctr = 0x8444C004; 37039920a04SFabiano Rosas cpu->dcz_blocksize = 4; 37139920a04SFabiano Rosas cpu->isar.id_aa64dfr0 = 0x0000000010305408ull; 37239920a04SFabiano Rosas cpu->isar.id_aa64isar0 = 0x0000100010211120ull; 37339920a04SFabiano Rosas cpu->isar.id_aa64isar1 = 0x0000000000100001ull; 37439920a04SFabiano Rosas cpu->isar.id_aa64mmfr0 = 0x0000000000101122ull; 37539920a04SFabiano Rosas cpu->isar.id_aa64mmfr1 = 0x0000000010212122ull; 37639920a04SFabiano Rosas cpu->isar.id_aa64mmfr2 = 0x0000000000001011ull; 37739920a04SFabiano Rosas cpu->isar.id_aa64pfr0 = 0x1100000010111112ull; /* GIC filled in later */ 37839920a04SFabiano Rosas cpu->isar.id_aa64pfr1 = 0x0000000000000010ull; 37939920a04SFabiano Rosas cpu->id_afr0 = 0x00000000; 38039920a04SFabiano Rosas cpu->isar.id_dfr0 = 0x04010088; 38139920a04SFabiano Rosas cpu->isar.id_isar0 = 0x02101110; 38239920a04SFabiano Rosas cpu->isar.id_isar1 = 0x13112111; 38339920a04SFabiano Rosas cpu->isar.id_isar2 = 0x21232042; 38439920a04SFabiano Rosas cpu->isar.id_isar3 = 0x01112131; 38539920a04SFabiano Rosas cpu->isar.id_isar4 = 0x00010142; 38639920a04SFabiano Rosas cpu->isar.id_isar5 = 0x01011121; 38739920a04SFabiano Rosas cpu->isar.id_isar6 = 0x00000010; 38839920a04SFabiano Rosas cpu->isar.id_mmfr0 = 0x10201105; 38939920a04SFabiano Rosas cpu->isar.id_mmfr1 = 0x40000000; 39039920a04SFabiano Rosas cpu->isar.id_mmfr2 = 0x01260000; 39139920a04SFabiano Rosas cpu->isar.id_mmfr3 = 0x02122211; 39239920a04SFabiano Rosas cpu->isar.id_mmfr4 = 0x00021110; 39339920a04SFabiano Rosas cpu->isar.id_pfr0 = 0x10010131; 39439920a04SFabiano Rosas cpu->isar.id_pfr1 = 0x00010000; /* GIC filled in later */ 39539920a04SFabiano Rosas cpu->isar.id_pfr2 = 0x00000011; 39639920a04SFabiano Rosas cpu->midr = 0x414fd0b1; /* r4p1 */ 39739920a04SFabiano Rosas cpu->revidr = 0; 39839920a04SFabiano Rosas 39939920a04SFabiano Rosas /* From B2.18 CCSIDR_EL1 */ 40039920a04SFabiano Rosas cpu->ccsidr[0] = 0x701fe01a; /* 64KB L1 dcache */ 40139920a04SFabiano Rosas cpu->ccsidr[1] = 0x201fe01a; /* 64KB L1 icache */ 40239920a04SFabiano Rosas cpu->ccsidr[2] = 0x707fe03a; /* 512KB L2 cache */ 40339920a04SFabiano Rosas 40439920a04SFabiano Rosas /* From B2.93 SCTLR_EL3 */ 40539920a04SFabiano Rosas cpu->reset_sctlr = 0x30c50838; 40639920a04SFabiano Rosas 40739920a04SFabiano Rosas /* From B4.23 ICH_VTR_EL2 */ 40839920a04SFabiano Rosas cpu->gic_num_lrs = 4; 40939920a04SFabiano Rosas cpu->gic_vpribits = 5; 41039920a04SFabiano Rosas cpu->gic_vprebits = 5; 41139920a04SFabiano Rosas cpu->gic_pribits = 5; 41239920a04SFabiano Rosas 41339920a04SFabiano Rosas /* From B5.1 AdvSIMD AArch64 register summary */ 41439920a04SFabiano Rosas cpu->isar.mvfr0 = 0x10110222; 41539920a04SFabiano Rosas cpu->isar.mvfr1 = 0x13211111; 41639920a04SFabiano Rosas cpu->isar.mvfr2 = 0x00000043; 41739920a04SFabiano Rosas 41839920a04SFabiano Rosas /* From D5.1 AArch64 PMU register summary */ 41939920a04SFabiano Rosas cpu->isar.reset_pmcr_el0 = 0x410b3000; 42039920a04SFabiano Rosas } 42139920a04SFabiano Rosas 42239920a04SFabiano Rosas static void aarch64_a64fx_initfn(Object *obj) 42339920a04SFabiano Rosas { 42439920a04SFabiano Rosas ARMCPU *cpu = ARM_CPU(obj); 42539920a04SFabiano Rosas 42639920a04SFabiano Rosas cpu->dtb_compatible = "arm,a64fx"; 42739920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_V8); 42839920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_NEON); 42939920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_GENERIC_TIMER); 430*f037f5b4SPeter Maydell set_feature(&cpu->env, ARM_FEATURE_BACKCOMPAT_CNTFRQ); 43139920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_AARCH64); 43239920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_EL2); 43339920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_EL3); 43439920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_PMU); 43539920a04SFabiano Rosas cpu->midr = 0x461f0010; 43639920a04SFabiano Rosas cpu->revidr = 0x00000000; 43739920a04SFabiano Rosas cpu->ctr = 0x86668006; 43839920a04SFabiano Rosas cpu->reset_sctlr = 0x30000180; 43939920a04SFabiano Rosas cpu->isar.id_aa64pfr0 = 0x0000000101111111; /* No RAS Extensions */ 44039920a04SFabiano Rosas cpu->isar.id_aa64pfr1 = 0x0000000000000000; 44139920a04SFabiano Rosas cpu->isar.id_aa64dfr0 = 0x0000000010305408; 44239920a04SFabiano Rosas cpu->isar.id_aa64dfr1 = 0x0000000000000000; 44339920a04SFabiano Rosas cpu->id_aa64afr0 = 0x0000000000000000; 44439920a04SFabiano Rosas cpu->id_aa64afr1 = 0x0000000000000000; 44539920a04SFabiano Rosas cpu->isar.id_aa64mmfr0 = 0x0000000000001122; 44639920a04SFabiano Rosas cpu->isar.id_aa64mmfr1 = 0x0000000011212100; 44739920a04SFabiano Rosas cpu->isar.id_aa64mmfr2 = 0x0000000000001011; 44839920a04SFabiano Rosas cpu->isar.id_aa64isar0 = 0x0000000010211120; 44939920a04SFabiano Rosas cpu->isar.id_aa64isar1 = 0x0000000000010001; 45039920a04SFabiano Rosas cpu->isar.id_aa64zfr0 = 0x0000000000000000; 45139920a04SFabiano Rosas cpu->clidr = 0x0000000080000023; 45239920a04SFabiano Rosas cpu->ccsidr[0] = 0x7007e01c; /* 64KB L1 dcache */ 45339920a04SFabiano Rosas cpu->ccsidr[1] = 0x2007e01c; /* 64KB L1 icache */ 45439920a04SFabiano Rosas cpu->ccsidr[2] = 0x70ffe07c; /* 8MB L2 cache */ 45539920a04SFabiano Rosas cpu->dcz_blocksize = 6; /* 256 bytes */ 45639920a04SFabiano Rosas cpu->gic_num_lrs = 4; 45739920a04SFabiano Rosas cpu->gic_vpribits = 5; 45839920a04SFabiano Rosas cpu->gic_vprebits = 5; 45939920a04SFabiano Rosas cpu->gic_pribits = 5; 46039920a04SFabiano Rosas 46139920a04SFabiano Rosas /* The A64FX supports only 128, 256 and 512 bit vector lengths */ 46239920a04SFabiano Rosas aarch64_add_sve_properties(obj); 46339920a04SFabiano Rosas cpu->sve_vq.supported = (1 << 0) /* 128bit */ 46439920a04SFabiano Rosas | (1 << 1) /* 256bit */ 46539920a04SFabiano Rosas | (1 << 3); /* 512bit */ 46639920a04SFabiano Rosas 46739920a04SFabiano Rosas cpu->isar.reset_pmcr_el0 = 0x46014040; 46839920a04SFabiano Rosas 46939920a04SFabiano Rosas /* TODO: Add A64FX specific HPC extension registers */ 47039920a04SFabiano Rosas } 47139920a04SFabiano Rosas 4726d482423SRichard Henderson static CPAccessResult access_actlr_w(CPUARMState *env, const ARMCPRegInfo *r, 4736d482423SRichard Henderson bool read) 4746d482423SRichard Henderson { 4756d482423SRichard Henderson if (!read) { 4766d482423SRichard Henderson int el = arm_current_el(env); 4776d482423SRichard Henderson 4786d482423SRichard Henderson /* Because ACTLR_EL2 is constant 0, writes below EL2 trap to EL2. */ 4796d482423SRichard Henderson if (el < 2 && arm_is_el2_enabled(env)) { 4806d482423SRichard Henderson return CP_ACCESS_TRAP_EL2; 4816d482423SRichard Henderson } 4826d482423SRichard Henderson /* Because ACTLR_EL3 is constant 0, writes below EL3 trap to EL3. */ 4836d482423SRichard Henderson if (el < 3 && arm_feature(env, ARM_FEATURE_EL3)) { 4846d482423SRichard Henderson return CP_ACCESS_TRAP_EL3; 4856d482423SRichard Henderson } 4866d482423SRichard Henderson } 4876d482423SRichard Henderson return CP_ACCESS_OK; 4886d482423SRichard Henderson } 4896d482423SRichard Henderson 49039920a04SFabiano Rosas static const ARMCPRegInfo neoverse_n1_cp_reginfo[] = { 49139920a04SFabiano Rosas { .name = "ATCR_EL1", .state = ARM_CP_STATE_AA64, 49239920a04SFabiano Rosas .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 7, .opc2 = 0, 4936d482423SRichard Henderson .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0, 4946d482423SRichard Henderson /* Traps and enables are the same as for TCR_EL1. */ 4956d482423SRichard Henderson .accessfn = access_tvm_trvm, .fgt = FGT_TCR_EL1, }, 49639920a04SFabiano Rosas { .name = "ATCR_EL2", .state = ARM_CP_STATE_AA64, 49739920a04SFabiano Rosas .opc0 = 3, .opc1 = 4, .crn = 15, .crm = 7, .opc2 = 0, 49839920a04SFabiano Rosas .access = PL2_RW, .type = ARM_CP_CONST, .resetvalue = 0 }, 49939920a04SFabiano Rosas { .name = "ATCR_EL3", .state = ARM_CP_STATE_AA64, 50039920a04SFabiano Rosas .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 7, .opc2 = 0, 50139920a04SFabiano Rosas .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 }, 50239920a04SFabiano Rosas { .name = "ATCR_EL12", .state = ARM_CP_STATE_AA64, 50339920a04SFabiano Rosas .opc0 = 3, .opc1 = 5, .crn = 15, .crm = 7, .opc2 = 0, 50439920a04SFabiano Rosas .access = PL2_RW, .type = ARM_CP_CONST, .resetvalue = 0 }, 50539920a04SFabiano Rosas { .name = "AVTCR_EL2", .state = ARM_CP_STATE_AA64, 50639920a04SFabiano Rosas .opc0 = 3, .opc1 = 4, .crn = 15, .crm = 7, .opc2 = 1, 50739920a04SFabiano Rosas .access = PL2_RW, .type = ARM_CP_CONST, .resetvalue = 0 }, 50839920a04SFabiano Rosas { .name = "CPUACTLR_EL1", .state = ARM_CP_STATE_AA64, 50939920a04SFabiano Rosas .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 1, .opc2 = 0, 5106d482423SRichard Henderson .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0, 5116d482423SRichard Henderson .accessfn = access_actlr_w }, 51239920a04SFabiano Rosas { .name = "CPUACTLR2_EL1", .state = ARM_CP_STATE_AA64, 51339920a04SFabiano Rosas .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 1, .opc2 = 1, 5146d482423SRichard Henderson .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0, 5156d482423SRichard Henderson .accessfn = access_actlr_w }, 51639920a04SFabiano Rosas { .name = "CPUACTLR3_EL1", .state = ARM_CP_STATE_AA64, 51739920a04SFabiano Rosas .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 1, .opc2 = 2, 5186d482423SRichard Henderson .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0, 5196d482423SRichard Henderson .accessfn = access_actlr_w }, 52039920a04SFabiano Rosas /* 52139920a04SFabiano Rosas * Report CPUCFR_EL1.SCU as 1, as we do not implement the DSU 52239920a04SFabiano Rosas * (and in particular its system registers). 52339920a04SFabiano Rosas */ 52439920a04SFabiano Rosas { .name = "CPUCFR_EL1", .state = ARM_CP_STATE_AA64, 52539920a04SFabiano Rosas .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 0, .opc2 = 0, 52639920a04SFabiano Rosas .access = PL1_R, .type = ARM_CP_CONST, .resetvalue = 4 }, 52739920a04SFabiano Rosas { .name = "CPUECTLR_EL1", .state = ARM_CP_STATE_AA64, 52839920a04SFabiano Rosas .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 1, .opc2 = 4, 5296d482423SRichard Henderson .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0x961563010, 5306d482423SRichard Henderson .accessfn = access_actlr_w }, 53139920a04SFabiano Rosas { .name = "CPUPCR_EL3", .state = ARM_CP_STATE_AA64, 53239920a04SFabiano Rosas .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 8, .opc2 = 1, 53339920a04SFabiano Rosas .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 }, 53439920a04SFabiano Rosas { .name = "CPUPMR_EL3", .state = ARM_CP_STATE_AA64, 53539920a04SFabiano Rosas .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 8, .opc2 = 3, 53639920a04SFabiano Rosas .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 }, 53739920a04SFabiano Rosas { .name = "CPUPOR_EL3", .state = ARM_CP_STATE_AA64, 53839920a04SFabiano Rosas .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 8, .opc2 = 2, 53939920a04SFabiano Rosas .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 }, 54039920a04SFabiano Rosas { .name = "CPUPSELR_EL3", .state = ARM_CP_STATE_AA64, 54139920a04SFabiano Rosas .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 8, .opc2 = 0, 54239920a04SFabiano Rosas .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 }, 54339920a04SFabiano Rosas { .name = "CPUPWRCTLR_EL1", .state = ARM_CP_STATE_AA64, 54439920a04SFabiano Rosas .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 2, .opc2 = 7, 5456d482423SRichard Henderson .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0, 5466d482423SRichard Henderson .accessfn = access_actlr_w }, 54739920a04SFabiano Rosas { .name = "ERXPFGCDN_EL1", .state = ARM_CP_STATE_AA64, 54839920a04SFabiano Rosas .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 2, .opc2 = 2, 5496d482423SRichard Henderson .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0, 5506d482423SRichard Henderson .accessfn = access_actlr_w }, 55139920a04SFabiano Rosas { .name = "ERXPFGCTL_EL1", .state = ARM_CP_STATE_AA64, 55239920a04SFabiano Rosas .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 2, .opc2 = 1, 5536d482423SRichard Henderson .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0, 5546d482423SRichard Henderson .accessfn = access_actlr_w }, 55539920a04SFabiano Rosas { .name = "ERXPFGF_EL1", .state = ARM_CP_STATE_AA64, 55639920a04SFabiano Rosas .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 2, .opc2 = 0, 5576d482423SRichard Henderson .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0, 5586d482423SRichard Henderson .accessfn = access_actlr_w }, 55939920a04SFabiano Rosas }; 56039920a04SFabiano Rosas 56139920a04SFabiano Rosas static void define_neoverse_n1_cp_reginfo(ARMCPU *cpu) 56239920a04SFabiano Rosas { 56339920a04SFabiano Rosas define_arm_cp_regs(cpu, neoverse_n1_cp_reginfo); 56439920a04SFabiano Rosas } 56539920a04SFabiano Rosas 566c74138c6SPeter Maydell static const ARMCPRegInfo neoverse_v1_cp_reginfo[] = { 567c74138c6SPeter Maydell { .name = "CPUECTLR2_EL1", .state = ARM_CP_STATE_AA64, 568c74138c6SPeter Maydell .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 1, .opc2 = 5, 56987da10b4SRichard Henderson .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0, 57087da10b4SRichard Henderson .accessfn = access_actlr_w }, 571c74138c6SPeter Maydell { .name = "CPUPPMCR_EL3", .state = ARM_CP_STATE_AA64, 572c74138c6SPeter Maydell .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 2, .opc2 = 0, 573c74138c6SPeter Maydell .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 }, 574c74138c6SPeter Maydell { .name = "CPUPPMCR2_EL3", .state = ARM_CP_STATE_AA64, 575c74138c6SPeter Maydell .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 2, .opc2 = 1, 576c74138c6SPeter Maydell .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 }, 577c74138c6SPeter Maydell { .name = "CPUPPMCR3_EL3", .state = ARM_CP_STATE_AA64, 578c74138c6SPeter Maydell .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 2, .opc2 = 6, 579c74138c6SPeter Maydell .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 }, 580c74138c6SPeter Maydell }; 581c74138c6SPeter Maydell 582c74138c6SPeter Maydell static void define_neoverse_v1_cp_reginfo(ARMCPU *cpu) 583c74138c6SPeter Maydell { 584c74138c6SPeter Maydell /* 585c74138c6SPeter Maydell * The Neoverse V1 has all of the Neoverse N1's IMPDEF 586c74138c6SPeter Maydell * registers and a few more of its own. 587c74138c6SPeter Maydell */ 588c74138c6SPeter Maydell define_arm_cp_regs(cpu, neoverse_n1_cp_reginfo); 589c74138c6SPeter Maydell define_arm_cp_regs(cpu, neoverse_v1_cp_reginfo); 590c74138c6SPeter Maydell } 591c74138c6SPeter Maydell 59239920a04SFabiano Rosas static void aarch64_neoverse_n1_initfn(Object *obj) 59339920a04SFabiano Rosas { 59439920a04SFabiano Rosas ARMCPU *cpu = ARM_CPU(obj); 59539920a04SFabiano Rosas 59639920a04SFabiano Rosas cpu->dtb_compatible = "arm,neoverse-n1"; 59739920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_V8); 59839920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_NEON); 59939920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_GENERIC_TIMER); 600*f037f5b4SPeter Maydell set_feature(&cpu->env, ARM_FEATURE_BACKCOMPAT_CNTFRQ); 60139920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_AARCH64); 60239920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_CBAR_RO); 60339920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_EL2); 60439920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_EL3); 60539920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_PMU); 60639920a04SFabiano Rosas 60739920a04SFabiano Rosas /* Ordered by B2.4 AArch64 registers by functional group */ 60839920a04SFabiano Rosas cpu->clidr = 0x82000023; 60939920a04SFabiano Rosas cpu->ctr = 0x8444c004; 61039920a04SFabiano Rosas cpu->dcz_blocksize = 4; 61139920a04SFabiano Rosas cpu->isar.id_aa64dfr0 = 0x0000000110305408ull; 61239920a04SFabiano Rosas cpu->isar.id_aa64isar0 = 0x0000100010211120ull; 61339920a04SFabiano Rosas cpu->isar.id_aa64isar1 = 0x0000000000100001ull; 61439920a04SFabiano Rosas cpu->isar.id_aa64mmfr0 = 0x0000000000101125ull; 61539920a04SFabiano Rosas cpu->isar.id_aa64mmfr1 = 0x0000000010212122ull; 61639920a04SFabiano Rosas cpu->isar.id_aa64mmfr2 = 0x0000000000001011ull; 61739920a04SFabiano Rosas cpu->isar.id_aa64pfr0 = 0x1100000010111112ull; /* GIC filled in later */ 61839920a04SFabiano Rosas cpu->isar.id_aa64pfr1 = 0x0000000000000020ull; 61939920a04SFabiano Rosas cpu->id_afr0 = 0x00000000; 62039920a04SFabiano Rosas cpu->isar.id_dfr0 = 0x04010088; 62139920a04SFabiano Rosas cpu->isar.id_isar0 = 0x02101110; 62239920a04SFabiano Rosas cpu->isar.id_isar1 = 0x13112111; 62339920a04SFabiano Rosas cpu->isar.id_isar2 = 0x21232042; 62439920a04SFabiano Rosas cpu->isar.id_isar3 = 0x01112131; 62539920a04SFabiano Rosas cpu->isar.id_isar4 = 0x00010142; 62639920a04SFabiano Rosas cpu->isar.id_isar5 = 0x01011121; 62739920a04SFabiano Rosas cpu->isar.id_isar6 = 0x00000010; 62839920a04SFabiano Rosas cpu->isar.id_mmfr0 = 0x10201105; 62939920a04SFabiano Rosas cpu->isar.id_mmfr1 = 0x40000000; 63039920a04SFabiano Rosas cpu->isar.id_mmfr2 = 0x01260000; 63139920a04SFabiano Rosas cpu->isar.id_mmfr3 = 0x02122211; 63239920a04SFabiano Rosas cpu->isar.id_mmfr4 = 0x00021110; 63339920a04SFabiano Rosas cpu->isar.id_pfr0 = 0x10010131; 63439920a04SFabiano Rosas cpu->isar.id_pfr1 = 0x00010000; /* GIC filled in later */ 63539920a04SFabiano Rosas cpu->isar.id_pfr2 = 0x00000011; 63639920a04SFabiano Rosas cpu->midr = 0x414fd0c1; /* r4p1 */ 63739920a04SFabiano Rosas cpu->revidr = 0; 63839920a04SFabiano Rosas 63939920a04SFabiano Rosas /* From B2.23 CCSIDR_EL1 */ 64039920a04SFabiano Rosas cpu->ccsidr[0] = 0x701fe01a; /* 64KB L1 dcache */ 64139920a04SFabiano Rosas cpu->ccsidr[1] = 0x201fe01a; /* 64KB L1 icache */ 64239920a04SFabiano Rosas cpu->ccsidr[2] = 0x70ffe03a; /* 1MB L2 cache */ 64339920a04SFabiano Rosas 64439920a04SFabiano Rosas /* From B2.98 SCTLR_EL3 */ 64539920a04SFabiano Rosas cpu->reset_sctlr = 0x30c50838; 64639920a04SFabiano Rosas 64739920a04SFabiano Rosas /* From B4.23 ICH_VTR_EL2 */ 64839920a04SFabiano Rosas cpu->gic_num_lrs = 4; 64939920a04SFabiano Rosas cpu->gic_vpribits = 5; 65039920a04SFabiano Rosas cpu->gic_vprebits = 5; 65139920a04SFabiano Rosas cpu->gic_pribits = 5; 65239920a04SFabiano Rosas 65339920a04SFabiano Rosas /* From B5.1 AdvSIMD AArch64 register summary */ 65439920a04SFabiano Rosas cpu->isar.mvfr0 = 0x10110222; 65539920a04SFabiano Rosas cpu->isar.mvfr1 = 0x13211111; 65639920a04SFabiano Rosas cpu->isar.mvfr2 = 0x00000043; 65739920a04SFabiano Rosas 65839920a04SFabiano Rosas /* From D5.1 AArch64 PMU register summary */ 65939920a04SFabiano Rosas cpu->isar.reset_pmcr_el0 = 0x410c3000; 66039920a04SFabiano Rosas 66139920a04SFabiano Rosas define_neoverse_n1_cp_reginfo(cpu); 66239920a04SFabiano Rosas } 66339920a04SFabiano Rosas 664c74138c6SPeter Maydell static void aarch64_neoverse_v1_initfn(Object *obj) 665c74138c6SPeter Maydell { 666c74138c6SPeter Maydell ARMCPU *cpu = ARM_CPU(obj); 667c74138c6SPeter Maydell 668c74138c6SPeter Maydell cpu->dtb_compatible = "arm,neoverse-v1"; 669c74138c6SPeter Maydell set_feature(&cpu->env, ARM_FEATURE_V8); 670c74138c6SPeter Maydell set_feature(&cpu->env, ARM_FEATURE_NEON); 671c74138c6SPeter Maydell set_feature(&cpu->env, ARM_FEATURE_GENERIC_TIMER); 672*f037f5b4SPeter Maydell set_feature(&cpu->env, ARM_FEATURE_BACKCOMPAT_CNTFRQ); 673c74138c6SPeter Maydell set_feature(&cpu->env, ARM_FEATURE_AARCH64); 674c74138c6SPeter Maydell set_feature(&cpu->env, ARM_FEATURE_CBAR_RO); 675c74138c6SPeter Maydell set_feature(&cpu->env, ARM_FEATURE_EL2); 676c74138c6SPeter Maydell set_feature(&cpu->env, ARM_FEATURE_EL3); 677c74138c6SPeter Maydell set_feature(&cpu->env, ARM_FEATURE_PMU); 678c74138c6SPeter Maydell 679c74138c6SPeter Maydell /* Ordered by 3.2.4 AArch64 registers by functional group */ 680c74138c6SPeter Maydell cpu->clidr = 0x82000023; 681c74138c6SPeter Maydell cpu->ctr = 0xb444c004; /* With DIC and IDC set */ 682c74138c6SPeter Maydell cpu->dcz_blocksize = 4; 683c74138c6SPeter Maydell cpu->id_aa64afr0 = 0x00000000; 684c74138c6SPeter Maydell cpu->id_aa64afr1 = 0x00000000; 685c74138c6SPeter Maydell cpu->isar.id_aa64dfr0 = 0x000001f210305519ull; 686c74138c6SPeter Maydell cpu->isar.id_aa64dfr1 = 0x00000000; 687c74138c6SPeter Maydell cpu->isar.id_aa64isar0 = 0x1011111110212120ull; /* with FEAT_RNG */ 688c74138c6SPeter Maydell cpu->isar.id_aa64isar1 = 0x0111000001211032ull; 689c74138c6SPeter Maydell cpu->isar.id_aa64mmfr0 = 0x0000000000101125ull; 690c74138c6SPeter Maydell cpu->isar.id_aa64mmfr1 = 0x0000000010212122ull; 691c74138c6SPeter Maydell cpu->isar.id_aa64mmfr2 = 0x0220011102101011ull; 692c74138c6SPeter Maydell cpu->isar.id_aa64pfr0 = 0x1101110120111112ull; /* GIC filled in later */ 693c74138c6SPeter Maydell cpu->isar.id_aa64pfr1 = 0x0000000000000020ull; 694c74138c6SPeter Maydell cpu->id_afr0 = 0x00000000; 695c74138c6SPeter Maydell cpu->isar.id_dfr0 = 0x15011099; 696c74138c6SPeter Maydell cpu->isar.id_isar0 = 0x02101110; 697c74138c6SPeter Maydell cpu->isar.id_isar1 = 0x13112111; 698c74138c6SPeter Maydell cpu->isar.id_isar2 = 0x21232042; 699c74138c6SPeter Maydell cpu->isar.id_isar3 = 0x01112131; 700c74138c6SPeter Maydell cpu->isar.id_isar4 = 0x00010142; 701c74138c6SPeter Maydell cpu->isar.id_isar5 = 0x11011121; 702c74138c6SPeter Maydell cpu->isar.id_isar6 = 0x01100111; 703c74138c6SPeter Maydell cpu->isar.id_mmfr0 = 0x10201105; 704c74138c6SPeter Maydell cpu->isar.id_mmfr1 = 0x40000000; 705c74138c6SPeter Maydell cpu->isar.id_mmfr2 = 0x01260000; 706c74138c6SPeter Maydell cpu->isar.id_mmfr3 = 0x02122211; 707c74138c6SPeter Maydell cpu->isar.id_mmfr4 = 0x01021110; 708c74138c6SPeter Maydell cpu->isar.id_pfr0 = 0x21110131; 709c74138c6SPeter Maydell cpu->isar.id_pfr1 = 0x00010000; /* GIC filled in later */ 710c74138c6SPeter Maydell cpu->isar.id_pfr2 = 0x00000011; 711c74138c6SPeter Maydell cpu->midr = 0x411FD402; /* r1p2 */ 712c74138c6SPeter Maydell cpu->revidr = 0; 713c74138c6SPeter Maydell 714c74138c6SPeter Maydell /* 715c74138c6SPeter Maydell * The Neoverse-V1 r1p2 TRM lists 32-bit format CCSIDR_EL1 values, 716c74138c6SPeter Maydell * but also says it implements CCIDX, which means they should be 717c74138c6SPeter Maydell * 64-bit format. So we here use values which are based on the textual 718d8100822SRichard Henderson * information in chapter 2 of the TRM: 719c74138c6SPeter Maydell * 720d8100822SRichard Henderson * L1: 4-way set associative 64-byte line size, total size 64K. 721c74138c6SPeter Maydell * L2: 8-way set associative, 64 byte line size, either 512K or 1MB. 722c74138c6SPeter Maydell * L3: No L3 (this matches the CLIDR_EL1 value). 723c74138c6SPeter Maydell */ 724d8100822SRichard Henderson cpu->ccsidr[0] = make_ccsidr64(4, 64, 64 * KiB); /* L1 dcache */ 725d8100822SRichard Henderson cpu->ccsidr[1] = cpu->ccsidr[0]; /* L1 icache */ 726d8100822SRichard Henderson cpu->ccsidr[2] = make_ccsidr64(8, 64, 1 * MiB); /* L2 cache */ 727c74138c6SPeter Maydell 728c74138c6SPeter Maydell /* From 3.2.115 SCTLR_EL3 */ 729c74138c6SPeter Maydell cpu->reset_sctlr = 0x30c50838; 730c74138c6SPeter Maydell 731c74138c6SPeter Maydell /* From 3.4.8 ICC_CTLR_EL3 and 3.4.23 ICH_VTR_EL2 */ 732c74138c6SPeter Maydell cpu->gic_num_lrs = 4; 733c74138c6SPeter Maydell cpu->gic_vpribits = 5; 734c74138c6SPeter Maydell cpu->gic_vprebits = 5; 735c74138c6SPeter Maydell cpu->gic_pribits = 5; 736c74138c6SPeter Maydell 737c74138c6SPeter Maydell /* From 3.5.1 AdvSIMD AArch64 register summary */ 738c74138c6SPeter Maydell cpu->isar.mvfr0 = 0x10110222; 739c74138c6SPeter Maydell cpu->isar.mvfr1 = 0x13211111; 740c74138c6SPeter Maydell cpu->isar.mvfr2 = 0x00000043; 741c74138c6SPeter Maydell 742c74138c6SPeter Maydell /* From 3.7.5 ID_AA64ZFR0_EL1 */ 743c74138c6SPeter Maydell cpu->isar.id_aa64zfr0 = 0x0000100000100000; 744c74138c6SPeter Maydell cpu->sve_vq.supported = (1 << 0) /* 128bit */ 745c74138c6SPeter Maydell | (1 << 1); /* 256bit */ 746c74138c6SPeter Maydell 747c74138c6SPeter Maydell /* From 5.5.1 AArch64 PMU register summary */ 748c74138c6SPeter Maydell cpu->isar.reset_pmcr_el0 = 0x41213000; 749c74138c6SPeter Maydell 750c74138c6SPeter Maydell define_neoverse_v1_cp_reginfo(cpu); 751c74138c6SPeter Maydell 752c74138c6SPeter Maydell aarch64_add_pauth_properties(obj); 753c74138c6SPeter Maydell aarch64_add_sve_properties(obj); 754c74138c6SPeter Maydell } 755c74138c6SPeter Maydell 756e3d45c0aSRichard Henderson static const ARMCPRegInfo cortex_a710_cp_reginfo[] = { 757e3d45c0aSRichard Henderson { .name = "CPUACTLR_EL1", .state = ARM_CP_STATE_AA64, 758e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 1, .opc2 = 0, 759e3d45c0aSRichard Henderson .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0, 760e3d45c0aSRichard Henderson .accessfn = access_actlr_w }, 761e3d45c0aSRichard Henderson { .name = "CPUACTLR2_EL1", .state = ARM_CP_STATE_AA64, 762e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 1, .opc2 = 1, 763e3d45c0aSRichard Henderson .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0, 764e3d45c0aSRichard Henderson .accessfn = access_actlr_w }, 765e3d45c0aSRichard Henderson { .name = "CPUACTLR3_EL1", .state = ARM_CP_STATE_AA64, 766e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 1, .opc2 = 2, 767e3d45c0aSRichard Henderson .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0, 768e3d45c0aSRichard Henderson .accessfn = access_actlr_w }, 769e3d45c0aSRichard Henderson { .name = "CPUACTLR4_EL1", .state = ARM_CP_STATE_AA64, 770e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 1, .opc2 = 3, 771e3d45c0aSRichard Henderson .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0, 772e3d45c0aSRichard Henderson .accessfn = access_actlr_w }, 773e3d45c0aSRichard Henderson { .name = "CPUECTLR_EL1", .state = ARM_CP_STATE_AA64, 774e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 1, .opc2 = 4, 775e3d45c0aSRichard Henderson .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0, 776e3d45c0aSRichard Henderson .accessfn = access_actlr_w }, 777e3d45c0aSRichard Henderson { .name = "CPUECTLR2_EL1", .state = ARM_CP_STATE_AA64, 778e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 1, .opc2 = 5, 779e3d45c0aSRichard Henderson .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0, 780e3d45c0aSRichard Henderson .accessfn = access_actlr_w }, 781e3d45c0aSRichard Henderson { .name = "CPUPPMCR_EL3", .state = ARM_CP_STATE_AA64, 782e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 2, .opc2 = 4, 783e3d45c0aSRichard Henderson .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 }, 784e3d45c0aSRichard Henderson { .name = "CPUPWRCTLR_EL1", .state = ARM_CP_STATE_AA64, 785e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 2, .opc2 = 7, 786e3d45c0aSRichard Henderson .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0, 787e3d45c0aSRichard Henderson .accessfn = access_actlr_w }, 788e3d45c0aSRichard Henderson { .name = "ATCR_EL1", .state = ARM_CP_STATE_AA64, 789e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 7, .opc2 = 0, 790e3d45c0aSRichard Henderson .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0 }, 791e3d45c0aSRichard Henderson { .name = "CPUACTLR5_EL1", .state = ARM_CP_STATE_AA64, 792e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 8, .opc2 = 0, 793e3d45c0aSRichard Henderson .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0, 794e3d45c0aSRichard Henderson .accessfn = access_actlr_w }, 795e3d45c0aSRichard Henderson { .name = "CPUACTLR6_EL1", .state = ARM_CP_STATE_AA64, 796e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 8, .opc2 = 1, 797e3d45c0aSRichard Henderson .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0, 798e3d45c0aSRichard Henderson .accessfn = access_actlr_w }, 799e3d45c0aSRichard Henderson { .name = "CPUACTLR7_EL1", .state = ARM_CP_STATE_AA64, 800e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 8, .opc2 = 2, 801e3d45c0aSRichard Henderson .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0, 802e3d45c0aSRichard Henderson .accessfn = access_actlr_w }, 803e3d45c0aSRichard Henderson { .name = "ATCR_EL2", .state = ARM_CP_STATE_AA64, 804e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 4, .crn = 15, .crm = 7, .opc2 = 0, 805e3d45c0aSRichard Henderson .access = PL2_RW, .type = ARM_CP_CONST, .resetvalue = 0 }, 806e3d45c0aSRichard Henderson { .name = "AVTCR_EL2", .state = ARM_CP_STATE_AA64, 807e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 4, .crn = 15, .crm = 7, .opc2 = 1, 808e3d45c0aSRichard Henderson .access = PL2_RW, .type = ARM_CP_CONST, .resetvalue = 0 }, 809e3d45c0aSRichard Henderson { .name = "CPUPPMCR_EL3", .state = ARM_CP_STATE_AA64, 810e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 2, .opc2 = 0, 811e3d45c0aSRichard Henderson .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 }, 812e3d45c0aSRichard Henderson { .name = "CPUPPMCR2_EL3", .state = ARM_CP_STATE_AA64, 813e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 2, .opc2 = 1, 814e3d45c0aSRichard Henderson .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 }, 815e3d45c0aSRichard Henderson { .name = "CPUPPMCR4_EL3", .state = ARM_CP_STATE_AA64, 816e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 2, .opc2 = 4, 817e3d45c0aSRichard Henderson .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 }, 818e3d45c0aSRichard Henderson { .name = "CPUPPMCR5_EL3", .state = ARM_CP_STATE_AA64, 819e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 2, .opc2 = 5, 820e3d45c0aSRichard Henderson .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 }, 821e3d45c0aSRichard Henderson { .name = "CPUPPMCR6_EL3", .state = ARM_CP_STATE_AA64, 822e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 2, .opc2 = 6, 823e3d45c0aSRichard Henderson .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 }, 824e3d45c0aSRichard Henderson { .name = "CPUACTLR_EL3", .state = ARM_CP_STATE_AA64, 825e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 4, .opc2 = 0, 826e3d45c0aSRichard Henderson .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 }, 827e3d45c0aSRichard Henderson { .name = "ATCR_EL3", .state = ARM_CP_STATE_AA64, 828e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 7, .opc2 = 0, 829e3d45c0aSRichard Henderson .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 }, 830e3d45c0aSRichard Henderson { .name = "CPUPSELR_EL3", .state = ARM_CP_STATE_AA64, 831e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 8, .opc2 = 0, 832e3d45c0aSRichard Henderson .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 }, 833e3d45c0aSRichard Henderson { .name = "CPUPCR_EL3", .state = ARM_CP_STATE_AA64, 834e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 8, .opc2 = 1, 835e3d45c0aSRichard Henderson .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 }, 836e3d45c0aSRichard Henderson { .name = "CPUPOR_EL3", .state = ARM_CP_STATE_AA64, 837e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 8, .opc2 = 2, 838e3d45c0aSRichard Henderson .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 }, 839e3d45c0aSRichard Henderson { .name = "CPUPMR_EL3", .state = ARM_CP_STATE_AA64, 840e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 8, .opc2 = 3, 841e3d45c0aSRichard Henderson .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 }, 842e3d45c0aSRichard Henderson { .name = "CPUPOR2_EL3", .state = ARM_CP_STATE_AA64, 843e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 8, .opc2 = 4, 844e3d45c0aSRichard Henderson .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 }, 845e3d45c0aSRichard Henderson { .name = "CPUPMR2_EL3", .state = ARM_CP_STATE_AA64, 846e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 8, .opc2 = 5, 847e3d45c0aSRichard Henderson .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 }, 848e3d45c0aSRichard Henderson { .name = "CPUPFR_EL3", .state = ARM_CP_STATE_AA64, 849e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 8, .opc2 = 6, 850e3d45c0aSRichard Henderson .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 }, 8513bcc5398SPeter Maydell /* 8523bcc5398SPeter Maydell * Report CPUCFR_EL1.SCU as 1, as we do not implement the DSU 8533bcc5398SPeter Maydell * (and in particular its system registers). 8543bcc5398SPeter Maydell */ 8553bcc5398SPeter Maydell { .name = "CPUCFR_EL1", .state = ARM_CP_STATE_AA64, 8563bcc5398SPeter Maydell .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 0, .opc2 = 0, 8573bcc5398SPeter Maydell .access = PL1_R, .type = ARM_CP_CONST, .resetvalue = 4 }, 858e3d45c0aSRichard Henderson 859e3d45c0aSRichard Henderson /* 860e3d45c0aSRichard Henderson * Stub RAMINDEX, as we don't actually implement caches, BTB, 861e3d45c0aSRichard Henderson * or anything else with cpu internal memory. 862e3d45c0aSRichard Henderson * "Read" zeros into the IDATA* and DDATA* output registers. 863e3d45c0aSRichard Henderson */ 864e3d45c0aSRichard Henderson { .name = "RAMINDEX_EL3", .state = ARM_CP_STATE_AA64, 865e3d45c0aSRichard Henderson .opc0 = 1, .opc1 = 6, .crn = 15, .crm = 0, .opc2 = 0, 866e3d45c0aSRichard Henderson .access = PL3_W, .type = ARM_CP_CONST, .resetvalue = 0 }, 867e3d45c0aSRichard Henderson { .name = "IDATA0_EL3", .state = ARM_CP_STATE_AA64, 868e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 0, .opc2 = 0, 869e3d45c0aSRichard Henderson .access = PL3_R, .type = ARM_CP_CONST, .resetvalue = 0 }, 870e3d45c0aSRichard Henderson { .name = "IDATA1_EL3", .state = ARM_CP_STATE_AA64, 871e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 0, .opc2 = 1, 872e3d45c0aSRichard Henderson .access = PL3_R, .type = ARM_CP_CONST, .resetvalue = 0 }, 873e3d45c0aSRichard Henderson { .name = "IDATA2_EL3", .state = ARM_CP_STATE_AA64, 874e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 0, .opc2 = 2, 875e3d45c0aSRichard Henderson .access = PL3_R, .type = ARM_CP_CONST, .resetvalue = 0 }, 876e3d45c0aSRichard Henderson { .name = "DDATA0_EL3", .state = ARM_CP_STATE_AA64, 877e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 1, .opc2 = 0, 878e3d45c0aSRichard Henderson .access = PL3_R, .type = ARM_CP_CONST, .resetvalue = 0 }, 879e3d45c0aSRichard Henderson { .name = "DDATA1_EL3", .state = ARM_CP_STATE_AA64, 880e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 1, .opc2 = 1, 881e3d45c0aSRichard Henderson .access = PL3_R, .type = ARM_CP_CONST, .resetvalue = 0 }, 882e3d45c0aSRichard Henderson { .name = "DDATA2_EL3", .state = ARM_CP_STATE_AA64, 883e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 1, .opc2 = 2, 884e3d45c0aSRichard Henderson .access = PL3_R, .type = ARM_CP_CONST, .resetvalue = 0 }, 885e3d45c0aSRichard Henderson }; 886e3d45c0aSRichard Henderson 887e3d45c0aSRichard Henderson static void aarch64_a710_initfn(Object *obj) 888e3d45c0aSRichard Henderson { 889e3d45c0aSRichard Henderson ARMCPU *cpu = ARM_CPU(obj); 890e3d45c0aSRichard Henderson 891e3d45c0aSRichard Henderson cpu->dtb_compatible = "arm,cortex-a710"; 892e3d45c0aSRichard Henderson set_feature(&cpu->env, ARM_FEATURE_V8); 893e3d45c0aSRichard Henderson set_feature(&cpu->env, ARM_FEATURE_NEON); 894e3d45c0aSRichard Henderson set_feature(&cpu->env, ARM_FEATURE_GENERIC_TIMER); 895*f037f5b4SPeter Maydell set_feature(&cpu->env, ARM_FEATURE_BACKCOMPAT_CNTFRQ); 896e3d45c0aSRichard Henderson set_feature(&cpu->env, ARM_FEATURE_AARCH64); 897e3d45c0aSRichard Henderson set_feature(&cpu->env, ARM_FEATURE_CBAR_RO); 898e3d45c0aSRichard Henderson set_feature(&cpu->env, ARM_FEATURE_EL2); 899e3d45c0aSRichard Henderson set_feature(&cpu->env, ARM_FEATURE_EL3); 900e3d45c0aSRichard Henderson set_feature(&cpu->env, ARM_FEATURE_PMU); 901e3d45c0aSRichard Henderson 902e3d45c0aSRichard Henderson /* Ordered by Section B.4: AArch64 registers */ 903e3d45c0aSRichard Henderson cpu->midr = 0x412FD471; /* r2p1 */ 904e3d45c0aSRichard Henderson cpu->revidr = 0; 905e3d45c0aSRichard Henderson cpu->isar.id_pfr0 = 0x21110131; 906e3d45c0aSRichard Henderson cpu->isar.id_pfr1 = 0x00010000; /* GIC filled in later */ 907e3d45c0aSRichard Henderson cpu->isar.id_dfr0 = 0x16011099; 908e3d45c0aSRichard Henderson cpu->id_afr0 = 0; 909e3d45c0aSRichard Henderson cpu->isar.id_mmfr0 = 0x10201105; 910e3d45c0aSRichard Henderson cpu->isar.id_mmfr1 = 0x40000000; 911e3d45c0aSRichard Henderson cpu->isar.id_mmfr2 = 0x01260000; 912e3d45c0aSRichard Henderson cpu->isar.id_mmfr3 = 0x02122211; 913e3d45c0aSRichard Henderson cpu->isar.id_isar0 = 0x02101110; 914e3d45c0aSRichard Henderson cpu->isar.id_isar1 = 0x13112111; 915e3d45c0aSRichard Henderson cpu->isar.id_isar2 = 0x21232042; 916e3d45c0aSRichard Henderson cpu->isar.id_isar3 = 0x01112131; 917e3d45c0aSRichard Henderson cpu->isar.id_isar4 = 0x00010142; 918e3d45c0aSRichard Henderson cpu->isar.id_isar5 = 0x11011121; /* with Crypto */ 919e3d45c0aSRichard Henderson cpu->isar.id_mmfr4 = 0x21021110; 920e3d45c0aSRichard Henderson cpu->isar.id_isar6 = 0x01111111; 921e3d45c0aSRichard Henderson cpu->isar.mvfr0 = 0x10110222; 922e3d45c0aSRichard Henderson cpu->isar.mvfr1 = 0x13211111; 923e3d45c0aSRichard Henderson cpu->isar.mvfr2 = 0x00000043; 924e3d45c0aSRichard Henderson cpu->isar.id_pfr2 = 0x00000011; 925e3d45c0aSRichard Henderson cpu->isar.id_aa64pfr0 = 0x1201111120111112ull; /* GIC filled in later */ 926e3d45c0aSRichard Henderson cpu->isar.id_aa64pfr1 = 0x0000000000000221ull; 927e3d45c0aSRichard Henderson cpu->isar.id_aa64zfr0 = 0x0000110100110021ull; /* with Crypto */ 9283bcc5398SPeter Maydell cpu->isar.id_aa64dfr0 = 0x000011f010305619ull; 929e3d45c0aSRichard Henderson cpu->isar.id_aa64dfr1 = 0; 930e3d45c0aSRichard Henderson cpu->id_aa64afr0 = 0; 931e3d45c0aSRichard Henderson cpu->id_aa64afr1 = 0; 932e3d45c0aSRichard Henderson cpu->isar.id_aa64isar0 = 0x0221111110212120ull; /* with Crypto */ 9333bcc5398SPeter Maydell cpu->isar.id_aa64isar1 = 0x0010111101211052ull; 934e3d45c0aSRichard Henderson cpu->isar.id_aa64mmfr0 = 0x0000022200101122ull; 935e3d45c0aSRichard Henderson cpu->isar.id_aa64mmfr1 = 0x0000000010212122ull; 936e3d45c0aSRichard Henderson cpu->isar.id_aa64mmfr2 = 0x1221011110101011ull; 937e3d45c0aSRichard Henderson cpu->clidr = 0x0000001482000023ull; 938e3d45c0aSRichard Henderson cpu->gm_blocksize = 4; 939e3d45c0aSRichard Henderson cpu->ctr = 0x000000049444c004ull; 940e3d45c0aSRichard Henderson cpu->dcz_blocksize = 4; 941e3d45c0aSRichard Henderson /* TODO FEAT_MPAM: mpamidr_el1 = 0x0000_0001_0006_003f */ 942e3d45c0aSRichard Henderson 943e3d45c0aSRichard Henderson /* Section B.5.2: PMCR_EL0 */ 944e3d45c0aSRichard Henderson cpu->isar.reset_pmcr_el0 = 0xa000; /* with 20 counters */ 945e3d45c0aSRichard Henderson 946e3d45c0aSRichard Henderson /* Section B.6.7: ICH_VTR_EL2 */ 947e3d45c0aSRichard Henderson cpu->gic_num_lrs = 4; 948e3d45c0aSRichard Henderson cpu->gic_vpribits = 5; 949e3d45c0aSRichard Henderson cpu->gic_vprebits = 5; 950e3d45c0aSRichard Henderson cpu->gic_pribits = 5; 951e3d45c0aSRichard Henderson 952e3d45c0aSRichard Henderson /* Section 14: Scalable Vector Extensions support */ 953e3d45c0aSRichard Henderson cpu->sve_vq.supported = 1 << 0; /* 128bit */ 954e3d45c0aSRichard Henderson 955e3d45c0aSRichard Henderson /* 956e3d45c0aSRichard Henderson * The cortex-a710 TRM does not list CCSIDR values. The layout of 957e3d45c0aSRichard Henderson * the caches are in text in Table 7-1, Table 8-1, and Table 9-1. 958e3d45c0aSRichard Henderson * 959e3d45c0aSRichard Henderson * L1: 4-way set associative 64-byte line size, total either 32K or 64K. 960e3d45c0aSRichard Henderson * L2: 8-way set associative 64 byte line size, total either 256K or 512K. 961e3d45c0aSRichard Henderson */ 962e3d45c0aSRichard Henderson cpu->ccsidr[0] = make_ccsidr64(4, 64, 64 * KiB); /* L1 dcache */ 963e3d45c0aSRichard Henderson cpu->ccsidr[1] = cpu->ccsidr[0]; /* L1 icache */ 964e3d45c0aSRichard Henderson cpu->ccsidr[2] = make_ccsidr64(8, 64, 512 * KiB); /* L2 cache */ 965e3d45c0aSRichard Henderson 966e3d45c0aSRichard Henderson /* FIXME: Not documented -- copied from neoverse-v1 */ 967e3d45c0aSRichard Henderson cpu->reset_sctlr = 0x30c50838; 968e3d45c0aSRichard Henderson 969e3d45c0aSRichard Henderson define_arm_cp_regs(cpu, cortex_a710_cp_reginfo); 970e3d45c0aSRichard Henderson 971e3d45c0aSRichard Henderson aarch64_add_pauth_properties(obj); 972e3d45c0aSRichard Henderson aarch64_add_sve_properties(obj); 973e3d45c0aSRichard Henderson } 974e3d45c0aSRichard Henderson 975dfff1000SPeter Maydell /* Extra IMPDEF regs in the N2 beyond those in the A710 */ 976dfff1000SPeter Maydell static const ARMCPRegInfo neoverse_n2_cp_reginfo[] = { 977dfff1000SPeter Maydell { .name = "CPURNDBR_EL3", .state = ARM_CP_STATE_AA64, 978dfff1000SPeter Maydell .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 3, .opc2 = 0, 979dfff1000SPeter Maydell .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 }, 980dfff1000SPeter Maydell { .name = "CPURNDPEID_EL3", .state = ARM_CP_STATE_AA64, 981dfff1000SPeter Maydell .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 3, .opc2 = 1, 982dfff1000SPeter Maydell .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 }, 983dfff1000SPeter Maydell }; 984dfff1000SPeter Maydell 985dfff1000SPeter Maydell static void aarch64_neoverse_n2_initfn(Object *obj) 986dfff1000SPeter Maydell { 987dfff1000SPeter Maydell ARMCPU *cpu = ARM_CPU(obj); 988dfff1000SPeter Maydell 989dfff1000SPeter Maydell cpu->dtb_compatible = "arm,neoverse-n2"; 990dfff1000SPeter Maydell set_feature(&cpu->env, ARM_FEATURE_V8); 991dfff1000SPeter Maydell set_feature(&cpu->env, ARM_FEATURE_NEON); 992dfff1000SPeter Maydell set_feature(&cpu->env, ARM_FEATURE_GENERIC_TIMER); 993*f037f5b4SPeter Maydell set_feature(&cpu->env, ARM_FEATURE_BACKCOMPAT_CNTFRQ); 994dfff1000SPeter Maydell set_feature(&cpu->env, ARM_FEATURE_AARCH64); 995dfff1000SPeter Maydell set_feature(&cpu->env, ARM_FEATURE_CBAR_RO); 996dfff1000SPeter Maydell set_feature(&cpu->env, ARM_FEATURE_EL2); 997dfff1000SPeter Maydell set_feature(&cpu->env, ARM_FEATURE_EL3); 998dfff1000SPeter Maydell set_feature(&cpu->env, ARM_FEATURE_PMU); 999dfff1000SPeter Maydell 1000dfff1000SPeter Maydell /* Ordered by Section B.5: AArch64 ID registers */ 1001dfff1000SPeter Maydell cpu->midr = 0x410FD493; /* r0p3 */ 1002dfff1000SPeter Maydell cpu->revidr = 0; 1003dfff1000SPeter Maydell cpu->isar.id_pfr0 = 0x21110131; 1004dfff1000SPeter Maydell cpu->isar.id_pfr1 = 0x00010000; /* GIC filled in later */ 1005dfff1000SPeter Maydell cpu->isar.id_dfr0 = 0x16011099; 1006dfff1000SPeter Maydell cpu->id_afr0 = 0; 1007dfff1000SPeter Maydell cpu->isar.id_mmfr0 = 0x10201105; 1008dfff1000SPeter Maydell cpu->isar.id_mmfr1 = 0x40000000; 1009dfff1000SPeter Maydell cpu->isar.id_mmfr2 = 0x01260000; 1010dfff1000SPeter Maydell cpu->isar.id_mmfr3 = 0x02122211; 1011dfff1000SPeter Maydell cpu->isar.id_isar0 = 0x02101110; 1012dfff1000SPeter Maydell cpu->isar.id_isar1 = 0x13112111; 1013dfff1000SPeter Maydell cpu->isar.id_isar2 = 0x21232042; 1014dfff1000SPeter Maydell cpu->isar.id_isar3 = 0x01112131; 1015dfff1000SPeter Maydell cpu->isar.id_isar4 = 0x00010142; 1016dfff1000SPeter Maydell cpu->isar.id_isar5 = 0x11011121; /* with Crypto */ 1017dfff1000SPeter Maydell cpu->isar.id_mmfr4 = 0x01021110; 1018dfff1000SPeter Maydell cpu->isar.id_isar6 = 0x01111111; 1019dfff1000SPeter Maydell cpu->isar.mvfr0 = 0x10110222; 1020dfff1000SPeter Maydell cpu->isar.mvfr1 = 0x13211111; 1021dfff1000SPeter Maydell cpu->isar.mvfr2 = 0x00000043; 1022dfff1000SPeter Maydell cpu->isar.id_pfr2 = 0x00000011; 1023dfff1000SPeter Maydell cpu->isar.id_aa64pfr0 = 0x1201111120111112ull; /* GIC filled in later */ 1024dfff1000SPeter Maydell cpu->isar.id_aa64pfr1 = 0x0000000000000221ull; 1025dfff1000SPeter Maydell cpu->isar.id_aa64zfr0 = 0x0000110100110021ull; /* with Crypto */ 1026dfff1000SPeter Maydell cpu->isar.id_aa64dfr0 = 0x000011f210305619ull; 1027dfff1000SPeter Maydell cpu->isar.id_aa64dfr1 = 0; 1028dfff1000SPeter Maydell cpu->id_aa64afr0 = 0; 1029dfff1000SPeter Maydell cpu->id_aa64afr1 = 0; 1030e867a124SMarcin Juszkiewicz cpu->isar.id_aa64isar0 = 0x1221111110212120ull; /* with Crypto and FEAT_RNG */ 1031dfff1000SPeter Maydell cpu->isar.id_aa64isar1 = 0x0011111101211052ull; 1032dfff1000SPeter Maydell cpu->isar.id_aa64mmfr0 = 0x0000022200101125ull; 1033dfff1000SPeter Maydell cpu->isar.id_aa64mmfr1 = 0x0000000010212122ull; 1034dfff1000SPeter Maydell cpu->isar.id_aa64mmfr2 = 0x1221011112101011ull; 1035dfff1000SPeter Maydell cpu->clidr = 0x0000001482000023ull; 1036dfff1000SPeter Maydell cpu->gm_blocksize = 4; 1037dfff1000SPeter Maydell cpu->ctr = 0x00000004b444c004ull; 1038dfff1000SPeter Maydell cpu->dcz_blocksize = 4; 1039dfff1000SPeter Maydell /* TODO FEAT_MPAM: mpamidr_el1 = 0x0000_0001_001e_01ff */ 1040dfff1000SPeter Maydell 1041dfff1000SPeter Maydell /* Section B.7.2: PMCR_EL0 */ 1042dfff1000SPeter Maydell cpu->isar.reset_pmcr_el0 = 0x3000; /* with 6 counters */ 1043dfff1000SPeter Maydell 1044dfff1000SPeter Maydell /* Section B.8.9: ICH_VTR_EL2 */ 1045dfff1000SPeter Maydell cpu->gic_num_lrs = 4; 1046dfff1000SPeter Maydell cpu->gic_vpribits = 5; 1047dfff1000SPeter Maydell cpu->gic_vprebits = 5; 1048dfff1000SPeter Maydell cpu->gic_pribits = 5; 1049dfff1000SPeter Maydell 1050dfff1000SPeter Maydell /* Section 14: Scalable Vector Extensions support */ 1051dfff1000SPeter Maydell cpu->sve_vq.supported = 1 << 0; /* 128bit */ 1052dfff1000SPeter Maydell 1053dfff1000SPeter Maydell /* 1054dfff1000SPeter Maydell * The Neoverse N2 TRM does not list CCSIDR values. The layout of 1055dfff1000SPeter Maydell * the caches are in text in Table 7-1, Table 8-1, and Table 9-1. 1056dfff1000SPeter Maydell * 1057dfff1000SPeter Maydell * L1: 4-way set associative 64-byte line size, total 64K. 1058dfff1000SPeter Maydell * L2: 8-way set associative 64 byte line size, total either 512K or 1024K. 1059dfff1000SPeter Maydell */ 1060dfff1000SPeter Maydell cpu->ccsidr[0] = make_ccsidr64(4, 64, 64 * KiB); /* L1 dcache */ 1061dfff1000SPeter Maydell cpu->ccsidr[1] = cpu->ccsidr[0]; /* L1 icache */ 1062dfff1000SPeter Maydell cpu->ccsidr[2] = make_ccsidr64(8, 64, 512 * KiB); /* L2 cache */ 1063dfff1000SPeter Maydell 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 /* 1090*f037f5b4SPeter Maydell * Unset ARM_FEATURE_BACKCOMPAT_CNTFRQ, which we would otherwise default 1091*f037f5b4SPeter Maydell * to because we started with aarch64_a57_initfn(). A 'max' CPU might 1092*f037f5b4SPeter Maydell * be a v8.6-or-later one, in which case the cntfrq must be 1GHz; and 1093*f037f5b4SPeter Maydell * because it is our "may change" CPU type we are OK with it not being 1094*f037f5b4SPeter Maydell * backwards-compatible with how it worked in old QEMU. 1095*f037f5b4SPeter Maydell */ 1096*f037f5b4SPeter Maydell unset_feature(&cpu->env, ARM_FEATURE_BACKCOMPAT_CNTFRQ); 1097*f037f5b4SPeter Maydell 1098*f037f5b4SPeter 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 */ 116339920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64ISAR1, BF16, 1); /* FEAT_BF16 */ 116439920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64ISAR1, DGH, 1); /* FEAT_DGH */ 116539920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64ISAR1, I8MM, 1); /* FEAT_I8MM */ 116639920a04SFabiano Rosas cpu->isar.id_aa64isar1 = t; 116739920a04SFabiano Rosas 11683039b090SPeter Maydell t = cpu->isar.id_aa64isar2; 1169706a92fbSPeter Maydell t = FIELD_DP64(t, ID_AA64ISAR2, MOPS, 1); /* FEAT_MOPS */ 11703039b090SPeter Maydell t = FIELD_DP64(t, ID_AA64ISAR2, BC, 1); /* FEAT_HBC */ 11713039b090SPeter Maydell cpu->isar.id_aa64isar2 = t; 11723039b090SPeter Maydell 117339920a04SFabiano Rosas t = cpu->isar.id_aa64pfr0; 117439920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64PFR0, FP, 1); /* FEAT_FP16 */ 117539920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64PFR0, ADVSIMD, 1); /* FEAT_FP16 */ 117639920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64PFR0, RAS, 2); /* FEAT_RASv1p1 + FEAT_DoubleFault */ 117739920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64PFR0, SVE, 1); 117839920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64PFR0, SEL2, 1); /* FEAT_SEL2 */ 117939920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64PFR0, DIT, 1); /* FEAT_DIT */ 1180e1973951SPeter Maydell t = FIELD_DP64(t, ID_AA64PFR0, CSV2, 3); /* FEAT_CSV2_3 */ 118139920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64PFR0, CSV3, 1); /* FEAT_CSV3 */ 118239920a04SFabiano Rosas cpu->isar.id_aa64pfr0 = t; 118339920a04SFabiano Rosas 118439920a04SFabiano Rosas t = cpu->isar.id_aa64pfr1; 118539920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64PFR1, BT, 1); /* FEAT_BTI */ 118639920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64PFR1, SSBS, 2); /* FEAT_SSBS2 */ 118739920a04SFabiano Rosas /* 118839920a04SFabiano Rosas * Begin with full support for MTE. This will be downgraded to MTE=0 118939920a04SFabiano Rosas * during realize if the board provides no tag memory, much like 119039920a04SFabiano Rosas * we do for EL2 with the virtualization=on property. 119139920a04SFabiano Rosas */ 119239920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64PFR1, MTE, 3); /* FEAT_MTE3 */ 119339920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64PFR1, RAS_FRAC, 0); /* FEAT_RASv1p1 + FEAT_DoubleFault */ 119439920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64PFR1, SME, 1); /* FEAT_SME */ 1195e1973951SPeter Maydell t = FIELD_DP64(t, ID_AA64PFR1, CSV2_FRAC, 0); /* FEAT_CSV2_3 */ 119614a16403SJinjie Ruan t = FIELD_DP64(t, ID_AA64PFR1, NMI, 1); /* FEAT_NMI */ 119739920a04SFabiano Rosas cpu->isar.id_aa64pfr1 = t; 119839920a04SFabiano Rosas 119939920a04SFabiano Rosas t = cpu->isar.id_aa64mmfr0; 120039920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64MMFR0, PARANGE, 6); /* FEAT_LPA: 52 bits */ 120139920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64MMFR0, TGRAN16, 1); /* 16k pages supported */ 120239920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64MMFR0, TGRAN16_2, 2); /* 16k stage2 supported */ 120339920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64MMFR0, TGRAN64_2, 2); /* 64k stage2 supported */ 120439920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64MMFR0, TGRAN4_2, 2); /* 4k stage2 supported */ 120539920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64MMFR0, FGT, 1); /* FEAT_FGT */ 1206c10a9a51SPeter Maydell t = FIELD_DP64(t, ID_AA64MMFR0, ECV, 2); /* FEAT_ECV */ 120739920a04SFabiano Rosas cpu->isar.id_aa64mmfr0 = t; 120839920a04SFabiano Rosas 120939920a04SFabiano Rosas t = cpu->isar.id_aa64mmfr1; 121039920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64MMFR1, HAFDBS, 2); /* FEAT_HAFDBS */ 121139920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64MMFR1, VMIDBITS, 2); /* FEAT_VMID16 */ 121239920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64MMFR1, VH, 1); /* FEAT_VHE */ 1213df9a3917SRichard Henderson t = FIELD_DP64(t, ID_AA64MMFR1, HPDS, 2); /* FEAT_HPDS2 */ 121439920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64MMFR1, LO, 1); /* FEAT_LOR */ 121539920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64MMFR1, PAN, 3); /* FEAT_PAN3 */ 121639920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64MMFR1, XNX, 1); /* FEAT_XNX */ 121774360f35SPeter Maydell t = FIELD_DP64(t, ID_AA64MMFR1, ETS, 2); /* FEAT_ETS2 */ 121839920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64MMFR1, HCX, 1); /* FEAT_HCX */ 12199cd0c0deSRichard Henderson t = FIELD_DP64(t, ID_AA64MMFR1, TIDCP1, 1); /* FEAT_TIDCP1 */ 122039920a04SFabiano Rosas cpu->isar.id_aa64mmfr1 = t; 122139920a04SFabiano Rosas 122239920a04SFabiano Rosas t = cpu->isar.id_aa64mmfr2; 122339920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64MMFR2, CNP, 1); /* FEAT_TTCNP */ 122439920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64MMFR2, UAO, 1); /* FEAT_UAO */ 122539920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64MMFR2, IESB, 1); /* FEAT_IESB */ 122639920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64MMFR2, VARANGE, 1); /* FEAT_LVA */ 1227e2862554SPeter Maydell t = FIELD_DP64(t, ID_AA64MMFR2, NV, 2); /* FEAT_NV2 */ 122839920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64MMFR2, ST, 1); /* FEAT_TTST */ 122959b6b42cSRichard Henderson t = FIELD_DP64(t, ID_AA64MMFR2, AT, 1); /* FEAT_LSE2 */ 123039920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64MMFR2, IDS, 1); /* FEAT_IDST */ 123139920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64MMFR2, FWB, 1); /* FEAT_S2FWB */ 123239920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64MMFR2, TTL, 1); /* FEAT_TTL */ 123339920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64MMFR2, BBM, 2); /* FEAT_BBM at level 2 */ 123439920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64MMFR2, EVT, 2); /* FEAT_EVT */ 123539920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64MMFR2, E0PD, 1); /* FEAT_E0PD */ 123639920a04SFabiano Rosas cpu->isar.id_aa64mmfr2 = t; 123739920a04SFabiano Rosas 1238663163f0SPeter Maydell t = cpu->isar.id_aa64mmfr3; 1239663163f0SPeter Maydell t = FIELD_DP64(t, ID_AA64MMFR3, SPEC_FPACC, 1); /* FEAT_FPACC_SPEC */ 1240663163f0SPeter Maydell cpu->isar.id_aa64mmfr3 = t; 1241663163f0SPeter Maydell 124239920a04SFabiano Rosas t = cpu->isar.id_aa64zfr0; 124339920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64ZFR0, SVEVER, 1); 124439920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64ZFR0, AES, 2); /* FEAT_SVE_PMULL128 */ 124539920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64ZFR0, BITPERM, 1); /* FEAT_SVE_BitPerm */ 124639920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64ZFR0, BFLOAT16, 1); /* FEAT_BF16 */ 124739920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64ZFR0, SHA3, 1); /* FEAT_SVE_SHA3 */ 124839920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64ZFR0, SM4, 1); /* FEAT_SVE_SM4 */ 124939920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64ZFR0, I8MM, 1); /* FEAT_I8MM */ 125039920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64ZFR0, F32MM, 1); /* FEAT_F32MM */ 125139920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64ZFR0, F64MM, 1); /* FEAT_F64MM */ 125239920a04SFabiano Rosas cpu->isar.id_aa64zfr0 = t; 125339920a04SFabiano Rosas 125439920a04SFabiano Rosas t = cpu->isar.id_aa64dfr0; 125539920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64DFR0, DEBUGVER, 9); /* FEAT_Debugv8p4 */ 125639920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64DFR0, PMUVER, 6); /* FEAT_PMUv3p5 */ 12573d80bbf1SPeter Maydell t = FIELD_DP64(t, ID_AA64DFR0, HPMN0, 1); /* FEAT_HPMN0 */ 125839920a04SFabiano Rosas cpu->isar.id_aa64dfr0 = t; 125939920a04SFabiano Rosas 126039920a04SFabiano Rosas t = cpu->isar.id_aa64smfr0; 126139920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64SMFR0, F32F32, 1); /* FEAT_SME */ 126239920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64SMFR0, B16F32, 1); /* FEAT_SME */ 126339920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64SMFR0, F16F32, 1); /* FEAT_SME */ 126439920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64SMFR0, I8I32, 0xf); /* FEAT_SME */ 126539920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64SMFR0, F64F64, 1); /* FEAT_SME_F64F64 */ 126639920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64SMFR0, I16I64, 0xf); /* FEAT_SME_I16I64 */ 126739920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64SMFR0, FA64, 1); /* FEAT_SME_FA64 */ 126839920a04SFabiano Rosas cpu->isar.id_aa64smfr0 = t; 126939920a04SFabiano Rosas 127039920a04SFabiano Rosas /* Replicate the same data to the 32-bit id registers. */ 127139920a04SFabiano Rosas aa32_max_features(cpu); 127239920a04SFabiano Rosas 127339920a04SFabiano Rosas #ifdef CONFIG_USER_ONLY 127439920a04SFabiano Rosas /* 127539920a04SFabiano Rosas * For usermode -cpu max we can use a larger and more efficient DCZ 127639920a04SFabiano Rosas * blocksize since we don't have to follow what the hardware does. 127739920a04SFabiano Rosas */ 127839920a04SFabiano Rosas cpu->ctr = 0x80038003; /* 32 byte I and D cacheline size, VIPT icache */ 127939920a04SFabiano Rosas cpu->dcz_blocksize = 7; /* 512 bytes */ 128039920a04SFabiano Rosas #endif 1281851ec6ebSRichard Henderson cpu->gm_blocksize = 6; /* 256 bytes */ 128239920a04SFabiano Rosas 128339920a04SFabiano Rosas cpu->sve_vq.supported = MAKE_64BIT_MASK(0, ARM_MAX_VQ); 128439920a04SFabiano Rosas cpu->sme_vq.supported = SVE_VQ_POW2_MAP; 128539920a04SFabiano Rosas 128639920a04SFabiano Rosas aarch64_add_pauth_properties(obj); 128739920a04SFabiano Rosas aarch64_add_sve_properties(obj); 128839920a04SFabiano Rosas aarch64_add_sme_properties(obj); 128939920a04SFabiano Rosas object_property_add(obj, "sve-max-vq", "uint32", cpu_max_get_sve_max_vq, 129039920a04SFabiano Rosas cpu_max_set_sve_max_vq, NULL, NULL); 1291a834d547SRichard Henderson object_property_add_bool(obj, "x-rme", cpu_arm_get_rme, cpu_arm_set_rme); 1292a834d547SRichard Henderson object_property_add(obj, "x-l0gptsz", "uint32", cpu_max_get_l0gptsz, 1293a834d547SRichard Henderson cpu_max_set_l0gptsz, NULL, NULL); 129439920a04SFabiano Rosas qdev_property_add_static(DEVICE(obj), &arm_cpu_lpa2_property); 129539920a04SFabiano Rosas } 129639920a04SFabiano Rosas 129739920a04SFabiano Rosas static const ARMCPUInfo aarch64_cpus[] = { 129839920a04SFabiano Rosas { .name = "cortex-a35", .initfn = aarch64_a35_initfn }, 129939920a04SFabiano Rosas { .name = "cortex-a55", .initfn = aarch64_a55_initfn }, 130039920a04SFabiano Rosas { .name = "cortex-a72", .initfn = aarch64_a72_initfn }, 130139920a04SFabiano Rosas { .name = "cortex-a76", .initfn = aarch64_a76_initfn }, 1302e3d45c0aSRichard Henderson { .name = "cortex-a710", .initfn = aarch64_a710_initfn }, 130339920a04SFabiano Rosas { .name = "a64fx", .initfn = aarch64_a64fx_initfn }, 130439920a04SFabiano Rosas { .name = "neoverse-n1", .initfn = aarch64_neoverse_n1_initfn }, 1305c74138c6SPeter Maydell { .name = "neoverse-v1", .initfn = aarch64_neoverse_v1_initfn }, 1306dfff1000SPeter Maydell { .name = "neoverse-n2", .initfn = aarch64_neoverse_n2_initfn }, 130739920a04SFabiano Rosas }; 130839920a04SFabiano Rosas 130939920a04SFabiano Rosas static void aarch64_cpu_register_types(void) 131039920a04SFabiano Rosas { 131139920a04SFabiano Rosas size_t i; 131239920a04SFabiano Rosas 131339920a04SFabiano Rosas for (i = 0; i < ARRAY_SIZE(aarch64_cpus); ++i) { 131439920a04SFabiano Rosas aarch64_cpu_register(&aarch64_cpus[i]); 131539920a04SFabiano Rosas } 131639920a04SFabiano Rosas } 131739920a04SFabiano Rosas 131839920a04SFabiano Rosas type_init(aarch64_cpu_register_types) 1319