134bfe467SFabiano Rosas /*
234bfe467SFabiano Rosas * ARM Cortex-A registers
334bfe467SFabiano Rosas *
434bfe467SFabiano Rosas * This code is licensed under the GNU GPL v2 or later.
534bfe467SFabiano Rosas *
634bfe467SFabiano Rosas * SPDX-License-Identifier: GPL-2.0-or-later
734bfe467SFabiano Rosas */
834bfe467SFabiano Rosas
934bfe467SFabiano Rosas #include "qemu/osdep.h"
1034bfe467SFabiano Rosas #include "cpu.h"
1134bfe467SFabiano Rosas #include "cpregs.h"
1234bfe467SFabiano Rosas
1334bfe467SFabiano Rosas
l2ctlr_read(CPUARMState * env,const ARMCPRegInfo * ri)1434bfe467SFabiano Rosas static uint64_t l2ctlr_read(CPUARMState *env, const ARMCPRegInfo *ri)
1534bfe467SFabiano Rosas {
1634bfe467SFabiano Rosas ARMCPU *cpu = env_archcpu(env);
1734bfe467SFabiano Rosas
18*1aa4512eSPeter Maydell /*
19*1aa4512eSPeter Maydell * Number of cores is in [25:24]; otherwise we RAZ.
20*1aa4512eSPeter Maydell * If the board didn't configure the CPUs into clusters,
21*1aa4512eSPeter Maydell * we default to "all CPUs in one cluster", which might be
22*1aa4512eSPeter Maydell * more than the 4 that the hardware permits and which is
23*1aa4512eSPeter Maydell * all you can report in this two-bit field. Saturate to
24*1aa4512eSPeter Maydell * 0b11 (== 4 CPUs) rather than overflowing the field.
25*1aa4512eSPeter Maydell */
26*1aa4512eSPeter Maydell return MIN(cpu->core_count - 1, 3) << 24;
2734bfe467SFabiano Rosas }
2834bfe467SFabiano Rosas
2934bfe467SFabiano Rosas static const ARMCPRegInfo cortex_a72_a57_a53_cp_reginfo[] = {
3034bfe467SFabiano Rosas { .name = "L2CTLR_EL1", .state = ARM_CP_STATE_AA64,
3134bfe467SFabiano Rosas .opc0 = 3, .opc1 = 1, .crn = 11, .crm = 0, .opc2 = 2,
3234bfe467SFabiano Rosas .access = PL1_RW, .readfn = l2ctlr_read,
3334bfe467SFabiano Rosas .writefn = arm_cp_write_ignore },
3434bfe467SFabiano Rosas { .name = "L2CTLR",
3534bfe467SFabiano Rosas .cp = 15, .opc1 = 1, .crn = 9, .crm = 0, .opc2 = 2,
3634bfe467SFabiano Rosas .access = PL1_RW, .readfn = l2ctlr_read,
3734bfe467SFabiano Rosas .writefn = arm_cp_write_ignore },
3834bfe467SFabiano Rosas { .name = "L2ECTLR_EL1", .state = ARM_CP_STATE_AA64,
3934bfe467SFabiano Rosas .opc0 = 3, .opc1 = 1, .crn = 11, .crm = 0, .opc2 = 3,
4034bfe467SFabiano Rosas .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
4134bfe467SFabiano Rosas { .name = "L2ECTLR",
4234bfe467SFabiano Rosas .cp = 15, .opc1 = 1, .crn = 9, .crm = 0, .opc2 = 3,
4334bfe467SFabiano Rosas .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
4434bfe467SFabiano Rosas { .name = "L2ACTLR", .state = ARM_CP_STATE_BOTH,
4534bfe467SFabiano Rosas .opc0 = 3, .opc1 = 1, .crn = 15, .crm = 0, .opc2 = 0,
4634bfe467SFabiano Rosas .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
4734bfe467SFabiano Rosas { .name = "CPUACTLR_EL1", .state = ARM_CP_STATE_AA64,
4834bfe467SFabiano Rosas .opc0 = 3, .opc1 = 1, .crn = 15, .crm = 2, .opc2 = 0,
4934bfe467SFabiano Rosas .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
5034bfe467SFabiano Rosas { .name = "CPUACTLR",
5134bfe467SFabiano Rosas .cp = 15, .opc1 = 0, .crm = 15,
5234bfe467SFabiano Rosas .access = PL1_RW, .type = ARM_CP_CONST | ARM_CP_64BIT, .resetvalue = 0 },
5334bfe467SFabiano Rosas { .name = "CPUECTLR_EL1", .state = ARM_CP_STATE_AA64,
5434bfe467SFabiano Rosas .opc0 = 3, .opc1 = 1, .crn = 15, .crm = 2, .opc2 = 1,
5534bfe467SFabiano Rosas .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
5634bfe467SFabiano Rosas { .name = "CPUECTLR",
5734bfe467SFabiano Rosas .cp = 15, .opc1 = 1, .crm = 15,
5834bfe467SFabiano Rosas .access = PL1_RW, .type = ARM_CP_CONST | ARM_CP_64BIT, .resetvalue = 0 },
5934bfe467SFabiano Rosas { .name = "CPUMERRSR_EL1", .state = ARM_CP_STATE_AA64,
6034bfe467SFabiano Rosas .opc0 = 3, .opc1 = 1, .crn = 15, .crm = 2, .opc2 = 2,
6134bfe467SFabiano Rosas .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
6234bfe467SFabiano Rosas { .name = "CPUMERRSR",
6334bfe467SFabiano Rosas .cp = 15, .opc1 = 2, .crm = 15,
6434bfe467SFabiano Rosas .access = PL1_RW, .type = ARM_CP_CONST | ARM_CP_64BIT, .resetvalue = 0 },
6534bfe467SFabiano Rosas { .name = "L2MERRSR_EL1", .state = ARM_CP_STATE_AA64,
6634bfe467SFabiano Rosas .opc0 = 3, .opc1 = 1, .crn = 15, .crm = 2, .opc2 = 3,
6734bfe467SFabiano Rosas .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
6834bfe467SFabiano Rosas { .name = "L2MERRSR",
6934bfe467SFabiano Rosas .cp = 15, .opc1 = 3, .crm = 15,
7034bfe467SFabiano Rosas .access = PL1_RW, .type = ARM_CP_CONST | ARM_CP_64BIT, .resetvalue = 0 },
7134bfe467SFabiano Rosas };
7234bfe467SFabiano Rosas
define_cortex_a72_a57_a53_cp_reginfo(ARMCPU * cpu)7334bfe467SFabiano Rosas void define_cortex_a72_a57_a53_cp_reginfo(ARMCPU *cpu)
7434bfe467SFabiano Rosas {
7534bfe467SFabiano Rosas define_arm_cp_regs(cpu, cortex_a72_a57_a53_cp_reginfo);
7634bfe467SFabiano Rosas }
77