Jinjie Ruan <[email protected]> writes:

> From: Jonathan Cameron <[email protected]>
>
> Add the MPAM system registers for TCG: MPAMIDR_EL1 (RO) reporting 64
> PARTIDs and 4 PMGs, and MPAM0_EL1/MPAM1_EL1 (RW, of which only
> MPAM1_EL1.MPAMEN is architecturally reset). Advertise FEAT_MPAM via
> ID_AA64PFR0.MPAM for TCG CPUs.
>
> It is common to support MPAM on CPU cores, but not in the rest of the
> system, so there is little disadvantage in always enabling these.
>
> Based on an RFC series by Jonathan Cameron, adapted to the current
> idregs[] storage and access_tid3() naming.
>
> Signed-off-by: Jonathan Cameron <[email protected]>
> Signed-off-by: Jinjie Ruan <[email protected]>

Something is wrong with this thread, when I was reading the cover letter
I couldn't find the rest of the thread. How did you post this series? It
looks like the cover letter, first 16 and remaining patches where sent
in separate batches?

> ---
>  target/arm/cpu-features.h | 11 +++++++++++
>  target/arm/cpu.c          | 10 +++++++++-
>  target/arm/cpu.h          |  3 +++
>  target/arm/helper.c       | 17 +++++++++++++++++
>  4 files changed, 40 insertions(+), 1 deletion(-)
>
> diff --git a/target/arm/cpu-features.h b/target/arm/cpu-features.h
> index a9eebb4..4b7d47b 100644
> --- a/target/arm/cpu-features.h
> +++ b/target/arm/cpu-features.h
> @@ -459,6 +459,17 @@ FIELD(DBGDEVID, DOUBLELOCK, 20, 4)
>  FIELD(DBGDEVID, AUXREGS, 24, 4)
>  FIELD(DBGDEVID, CIDMASK, 28, 4)
>  
> +FIELD(MPAMIDR, PARTID_MAX, 0, 16)
> +FIELD(MPAMIDR, HAS_HCR, 17, 1)
> +FIELD(MPAMIDR, VMR_MAX, 18, 3)
> +FIELD(MPAMIDR, PMG_MAX, 32, 8)
> +FIELD(MPAMIDR, HAS_ALTSP, 57, 1)
> +FIELD(MPAMIDR, HAS_TIDR, 58, 1)
> +FIELD(MPAMIDR, SP4, 59, 1)
> +FIELD(MPAMIDR, HAS_FORCE_NS, 60, 1)
> +FIELD(MPAMIDR, HAS_SDEFLT, 61, 1)
> +FIELD(MPAM1_EL1, MPAMEN, 63, 1)
> +
>  FIELD(DBGDEVID1, PCSROFFSET, 0, 4)
>  
>  FIELD(MVFR0, SIMDREG, 0, 4)
> diff --git a/target/arm/cpu.c b/target/arm/cpu.c
> index 10ac6c9..e7529d5 100644
> --- a/target/arm/cpu.c
> +++ b/target/arm/cpu.c
> @@ -439,6 +439,8 @@ static void arm_cpu_reset_hold(Object *obj, ResetType 
> type)
>          /* Sample rvbar at reset.  */
>          env->cp15.rvbar = cpu->rvbar_prop;
>          env->pc = env->cp15.rvbar;
> +
> +        env->mpam1_el1 = R_MPAM1_EL1_MPAMEN_MASK;
>  #endif
>      } else {
>  #if defined(CONFIG_USER_ONLY)
> @@ -452,6 +454,8 @@ static void arm_cpu_reset_hold(Object *obj, ResetType 
> type)
>              env->cp15.rvbar = cpu->rvbar_prop;
>              env->regs[15] = cpu->rvbar_prop;
>          }
> +
> +        env->mpam1_el1 = R_MPAM1_EL1_MPAMEN_MASK;
>      }
>  
>  #if defined(CONFIG_USER_ONLY)
> @@ -2333,7 +2337,11 @@ static void arm_cpu_realizefn(DeviceState *dev, Error 
> **errp)
>          FIELD_DP64_IDREG(isar, ID_AA64PFR0, AMU, 0);
>          FIELD_DP32_IDREG(isar, ID_PFR0, AMU, 0);
>          /* FEAT_MPAM (Memory Partitioning and Monitoring Extension) */
> -        FIELD_DP64_IDREG(isar, ID_AA64PFR0, MPAM, 0);
> +        FIELD_DP64_IDREG(isar, ID_AA64PFR0, MPAM, 1);
> +        cpu->isar.mpamidr_el1 =
> +            FIELD_DP64(cpu->isar.mpamidr_el1, MPAMIDR, PARTID_MAX, 63);
> +        cpu->isar.mpamidr_el1 =
> +            FIELD_DP64(cpu->isar.mpamidr_el1, MPAMIDR, PMG_MAX, 3);
>      }
>  
>      /* MPU can be configured out of a PMSA CPU either by setting has-mpu
> diff --git a/target/arm/cpu.h b/target/arm/cpu.h
> index 06ebed4..51a36fa 100644
> --- a/target/arm/cpu.h
> +++ b/target/arm/cpu.h
> @@ -757,6 +757,8 @@ typedef struct CPUArchState {
>      struct CPUBreakpoint *cpu_breakpoint[16];
>      struct CPUWatchpoint *cpu_watchpoint[16];
>  
> +    uint64_t mpam0_el1;
> +    uint64_t mpam1_el1;
>      /* Optional fault info across tlb lookup. */
>      ARMMMUFaultInfo *tlb_fi;
>  
> @@ -1121,6 +1123,7 @@ struct ArchCPU {
>          uint32_t dbgdevid;
>          uint32_t dbgdevid1;
>          uint64_t reset_pmcr_el0;
> +        uint64_t mpamidr_el1;
>          uint64_t idregs[NUM_ID_IDX];
>      } isar;
>      uint64_t midr;
> diff --git a/target/arm/helper.c b/target/arm/helper.c
> index ff0b766..896ac0e 100644
> --- a/target/arm/helper.c
> +++ b/target/arm/helper.c
> @@ -6907,6 +6907,23 @@ void register_cp_regs_for_features(ARMCPU *cpu)
>                .access = PL1_R, .type = ARM_CP_CONST,
>                .accessfn = access_tid3,
>                .resetvalue = cpu->isar.mvfr0 },
> +            { .name = "MPAMIDR_EL1", .state = ARM_CP_STATE_AA64,
> +              .opc0 = 3, .opc1 = 0, .crn = 0xa, .crm = 4, .opc2 = 4,
> +              .access = PL1_R, .type = ARM_CP_CONST,
> +              .accessfn = access_tid3,
> +              .resetvalue = cpu->isar.mpamidr_el1 },
> +            { .name = "MPAM0_EL1", .state = ARM_CP_STATE_AA64,
> +              .opc0 = 3, .opc1 = 0, .crn = 0xa, .crm = 5, .opc2 = 1,
> +              .access = PL1_RW, .type = ARM_CP_ALIAS,
> +              .accessfn = access_tid3,
> +              .fieldoffset = offsetof(CPUARMState, mpam0_el1),
> +            },
> +            { .name = "MPAM1_EL1", .state = ARM_CP_STATE_AA64,
> +              .opc0 = 3, .opc1 = 0, .crn = 0xa, .crm = 5, .opc2 = 0,
> +              .access = PL1_RW, .type = ARM_CP_ALIAS,
> +              .accessfn = access_tid3,
> +              .fieldoffset = offsetof(CPUARMState, mpam1_el1),
> +            },
>              { .name = "MVFR1_EL1", .state = ARM_CP_STATE_AA64,
>                .opc0 = 3, .opc1 = 0, .crn = 0, .crm = 3, .opc2 = 1,
>                .access = PL1_R, .type = ARM_CP_CONST,

-- 
Alex Bennée
Virtualisation Tech Lead @ Linaro

Reply via email to