Message ID | 20240729013939.1807982-2-gaosong@loongson.cn (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | LoongArch/tcg: Add hardware page table walker support | expand |
Hi, On 29/7/24 03:39, Song Gao wrote: > Add a new LoongArch cpu type la664. The la664 has many new features, > such as new atomic instructions, hardware page table walk, etc. > We will implement them later. > > Signed-off-by: Song Gao <gaosong@loongson.cn> > --- > target/loongarch/cpu.c | 48 +++++++++++++++++++++++++++++++----------- > 1 file changed, 36 insertions(+), 12 deletions(-) > +static void loongarch_la664_initfn(Object *obj) > +{ > + LoongArchCPU *cpu = LOONGARCH_CPU(obj); > + CPULoongArchState *env = &cpu->env; > + int i; > + > + for (i = 0; i < 21; i++) { In order to remove the '21' magic value, can we use: for (unsigned i = 0; i < ARRAY_SIZE(env->cpucfg); i++) { > + env->cpucfg[i] = 0x0; > + } > + > + cpu->dtb_compatible = "loongarch,Loongson-3A6000"; > + env->cpucfg[0] = 0x14d000; /* PRID */ > + > + loongarch_common_initfn(env, obj); > +} > + > +static void loongarch_la464_initfn(Object *obj) > +{ > + LoongArchCPU *cpu = LOONGARCH_CPU(obj); > + CPULoongArchState *env = &cpu->env; > + int i; > + > + for (i = 0; i < 21; i++) { Ditto. > + env->cpucfg[i] = 0x0; > + } > + > + cpu->dtb_compatible = "loongarch,Loongson-3A5000"; > + env->cpucfg[0] = 0x14c010; /* PRID */ > + > + loongarch_common_initfn(env, obj); > +}
在 2024/9/5 下午6:32, Philippe Mathieu-Daudé 写道: > Hi, > > On 29/7/24 03:39, Song Gao wrote: >> Add a new LoongArch cpu type la664. The la664 has many new features, >> such as new atomic instructions, hardware page table walk, etc. >> We will implement them later. >> >> Signed-off-by: Song Gao <gaosong@loongson.cn> >> --- >> target/loongarch/cpu.c | 48 +++++++++++++++++++++++++++++++----------- >> 1 file changed, 36 insertions(+), 12 deletions(-) > > >> +static void loongarch_la664_initfn(Object *obj) >> +{ >> + LoongArchCPU *cpu = LOONGARCH_CPU(obj); >> + CPULoongArchState *env = &cpu->env; >> + int i; >> + >> + for (i = 0; i < 21; i++) { > > In order to remove the '21' magic value, can we use: > > for (unsigned i = 0; i < ARRAY_SIZE(env->cpucfg); i++) { Thank you, I will correct it on v2. Thanks. Song Gao > >> + env->cpucfg[i] = 0x0; >> + } >> + >> + cpu->dtb_compatible = "loongarch,Loongson-3A6000"; >> + env->cpucfg[0] = 0x14d000; /* PRID */ >> + >> + loongarch_common_initfn(env, obj); >> +} >> + >> +static void loongarch_la464_initfn(Object *obj) >> +{ >> + LoongArchCPU *cpu = LOONGARCH_CPU(obj); >> + CPULoongArchState *env = &cpu->env; >> + int i; >> + >> + for (i = 0; i < 21; i++) { > > Ditto. > >> + env->cpucfg[i] = 0x0; >> + } >> + >> + cpu->dtb_compatible = "loongarch,Loongson-3A5000"; >> + env->cpucfg[0] = 0x14c010; /* PRID */ >> + >> + loongarch_common_initfn(env, obj); >> +}
diff --git a/target/loongarch/cpu.c b/target/loongarch/cpu.c index 5e85b9dbef..1b975f1de8 100644 --- a/target/loongarch/cpu.c +++ b/target/loongarch/cpu.c @@ -374,20 +374,11 @@ static int loongarch_cpu_mmu_index(CPUState *cs, bool ifetch) return MMU_DA_IDX; } -static void loongarch_la464_initfn(Object *obj) +static void loongarch_common_initfn(CPULoongArchState *env, Object *obj) { - LoongArchCPU *cpu = LOONGARCH_CPU(obj); - CPULoongArchState *env = &cpu->env; - int i; - - for (i = 0; i < 21; i++) { - env->cpucfg[i] = 0x0; - } - - cpu->dtb_compatible = "loongarch,Loongson-3A5000"; - env->cpucfg[0] = 0x14c010; /* PRID */ + uint32_t data; - uint32_t data = 0; + data = 0; data = FIELD_DP32(data, CPUCFG1, ARCH, 2); data = FIELD_DP32(data, CPUCFG1, PGMMU, 1); data = FIELD_DP32(data, CPUCFG1, IOCSR, 1); @@ -472,6 +463,38 @@ static void loongarch_la464_initfn(Object *obj) loongarch_cpu_post_init(obj); } +static void loongarch_la664_initfn(Object *obj) +{ + LoongArchCPU *cpu = LOONGARCH_CPU(obj); + CPULoongArchState *env = &cpu->env; + int i; + + for (i = 0; i < 21; i++) { + env->cpucfg[i] = 0x0; + } + + cpu->dtb_compatible = "loongarch,Loongson-3A6000"; + env->cpucfg[0] = 0x14d000; /* PRID */ + + loongarch_common_initfn(env, obj); +} + +static void loongarch_la464_initfn(Object *obj) +{ + LoongArchCPU *cpu = LOONGARCH_CPU(obj); + CPULoongArchState *env = &cpu->env; + int i; + + for (i = 0; i < 21; i++) { + env->cpucfg[i] = 0x0; + } + + cpu->dtb_compatible = "loongarch,Loongson-3A5000"; + env->cpucfg[0] = 0x14c010; /* PRID */ + + loongarch_common_initfn(env, obj); +} + static void loongarch_la132_initfn(Object *obj) { LoongArchCPU *cpu = LOONGARCH_CPU(obj); @@ -857,6 +880,7 @@ static const TypeInfo loongarch_cpu_type_infos[] = { .abstract = true, .class_init = loongarch64_cpu_class_init, }, + DEFINE_LOONGARCH_CPU_TYPE(64, "la664", loongarch_la664_initfn), DEFINE_LOONGARCH_CPU_TYPE(64, "la464", loongarch_la464_initfn), DEFINE_LOONGARCH_CPU_TYPE(32, "la132", loongarch_la132_initfn), DEFINE_LOONGARCH_CPU_TYPE(64, "max", loongarch_max_initfn),
Add a new LoongArch cpu type la664. The la664 has many new features, such as new atomic instructions, hardware page table walk, etc. We will implement them later. Signed-off-by: Song Gao <gaosong@loongson.cn> --- target/loongarch/cpu.c | 48 +++++++++++++++++++++++++++++++----------- 1 file changed, 36 insertions(+), 12 deletions(-)