Message ID | 20230809083258.1787464-12-c@jia.je (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Add la32 & va32 support for loongarch64-softmmu | expand |
On 8/9/23 01:26, Jiajie Chen wrote: > Add la132 as a loongarch32 cpu type and allow virt machine to be used > with la132 instead of la464. > > Due to lack of public documentation of la132, it is currently a > synthetic loongarch32 cpu model. Details need to be added in the future. > > Signed-off-by: Jiajie Chen<c@jia.je> > --- > hw/loongarch/virt.c | 5 ----- > target/loongarch/cpu.c | 29 +++++++++++++++++++++++++++++ > 2 files changed, 29 insertions(+), 5 deletions(-) Acked-by: Richard Henderson <richard.henderson@linaro.org> r~
Hi, Jiajie 在 2023/8/9 下午4:26, Jiajie Chen 写道: > Add la132 as a loongarch32 cpu type and allow virt machine to be used > with la132 instead of la464. > > Due to lack of public documentation of la132, it is currently a > synthetic loongarch32 cpu model. Details need to be added in the future. > > Signed-off-by: Jiajie Chen <c@jia.je> > --- > hw/loongarch/virt.c | 5 ----- > target/loongarch/cpu.c | 29 +++++++++++++++++++++++++++++ > 2 files changed, 29 insertions(+), 5 deletions(-) > > diff --git a/hw/loongarch/virt.c b/hw/loongarch/virt.c > index e19b042ce8..af15bf5aaa 100644 > --- a/hw/loongarch/virt.c > +++ b/hw/loongarch/virt.c > @@ -798,11 +798,6 @@ static void loongarch_init(MachineState *machine) > cpu_model = LOONGARCH_CPU_TYPE_NAME("la464"); > } > > - if (!strstr(cpu_model, "la464")) { > - error_report("LoongArch/TCG needs cpu type la464"); > - exit(1); > - } > - > if (ram_size < 1 * GiB) { > error_report("ram_size must be greater than 1G."); > exit(1); > diff --git a/target/loongarch/cpu.c b/target/loongarch/cpu.c > index bd980790f2..dd1cd7d7d2 100644 > --- a/target/loongarch/cpu.c > +++ b/target/loongarch/cpu.c > @@ -439,6 +439,34 @@ static void loongarch_la464_initfn(Object *obj) > env->CSR_ASID = FIELD_DP64(0, CSR_ASID, ASIDBITS, 0xa); > } > > +static void loongarch_la132_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-1C103"; > + > + uint32_t data = 0; > + data = FIELD_DP32(data, CPUCFG1, ARCH, 1); /* LA32 */ > + data = FIELD_DP32(data, CPUCFG1, PGMMU, 1); > + data = FIELD_DP32(data, CPUCFG1, IOCSR, 1); I confirmed with Shenjinyang that la32 don't support IOCSR instructions. Thanks. Song Gao > + data = FIELD_DP32(data, CPUCFG1, PALEN, 0x1f); /* 32 bits */ > + data = FIELD_DP32(data, CPUCFG1, VALEN, 0x1f); /* 32 bits */ > + data = FIELD_DP32(data, CPUCFG1, UAL, 1); > + data = FIELD_DP32(data, CPUCFG1, RI, 0); > + data = FIELD_DP32(data, CPUCFG1, EP, 0); > + data = FIELD_DP32(data, CPUCFG1, RPLV, 0); > + data = FIELD_DP32(data, CPUCFG1, HP, 1); > + data = FIELD_DP32(data, CPUCFG1, IOCSR_BRD, 1); > + env->cpucfg[1] = data; > +} > + > static void loongarch_cpu_list_entry(gpointer data, gpointer user_data) > { > const char *typename = object_class_get_name(OBJECT_CLASS(data)); > @@ -778,6 +806,7 @@ static const TypeInfo loongarch_cpu_type_infos[] = { > .class_init = loongarch32_cpu_class_init, > }, > DEFINE_LOONGARCH_CPU_TYPE("la464", loongarch_la464_initfn), > + DEFINE_LOONGARCH32_CPU_TYPE("la132", loongarch_la132_initfn), > }; > > DEFINE_TYPES(loongarch_cpu_type_infos) >
diff --git a/hw/loongarch/virt.c b/hw/loongarch/virt.c index e19b042ce8..af15bf5aaa 100644 --- a/hw/loongarch/virt.c +++ b/hw/loongarch/virt.c @@ -798,11 +798,6 @@ static void loongarch_init(MachineState *machine) cpu_model = LOONGARCH_CPU_TYPE_NAME("la464"); } - if (!strstr(cpu_model, "la464")) { - error_report("LoongArch/TCG needs cpu type la464"); - exit(1); - } - if (ram_size < 1 * GiB) { error_report("ram_size must be greater than 1G."); exit(1); diff --git a/target/loongarch/cpu.c b/target/loongarch/cpu.c index bd980790f2..dd1cd7d7d2 100644 --- a/target/loongarch/cpu.c +++ b/target/loongarch/cpu.c @@ -439,6 +439,34 @@ static void loongarch_la464_initfn(Object *obj) env->CSR_ASID = FIELD_DP64(0, CSR_ASID, ASIDBITS, 0xa); } +static void loongarch_la132_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-1C103"; + + uint32_t data = 0; + data = FIELD_DP32(data, CPUCFG1, ARCH, 1); /* LA32 */ + data = FIELD_DP32(data, CPUCFG1, PGMMU, 1); + data = FIELD_DP32(data, CPUCFG1, IOCSR, 1); + data = FIELD_DP32(data, CPUCFG1, PALEN, 0x1f); /* 32 bits */ + data = FIELD_DP32(data, CPUCFG1, VALEN, 0x1f); /* 32 bits */ + data = FIELD_DP32(data, CPUCFG1, UAL, 1); + data = FIELD_DP32(data, CPUCFG1, RI, 0); + data = FIELD_DP32(data, CPUCFG1, EP, 0); + data = FIELD_DP32(data, CPUCFG1, RPLV, 0); + data = FIELD_DP32(data, CPUCFG1, HP, 1); + data = FIELD_DP32(data, CPUCFG1, IOCSR_BRD, 1); + env->cpucfg[1] = data; +} + static void loongarch_cpu_list_entry(gpointer data, gpointer user_data) { const char *typename = object_class_get_name(OBJECT_CLASS(data)); @@ -778,6 +806,7 @@ static const TypeInfo loongarch_cpu_type_infos[] = { .class_init = loongarch32_cpu_class_init, }, DEFINE_LOONGARCH_CPU_TYPE("la464", loongarch_la464_initfn), + DEFINE_LOONGARCH32_CPU_TYPE("la132", loongarch_la132_initfn), }; DEFINE_TYPES(loongarch_cpu_type_infos)
Add la132 as a loongarch32 cpu type and allow virt machine to be used with la132 instead of la464. Due to lack of public documentation of la132, it is currently a synthetic loongarch32 cpu model. Details need to be added in the future. Signed-off-by: Jiajie Chen <c@jia.je> --- hw/loongarch/virt.c | 5 ----- target/loongarch/cpu.c | 29 +++++++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 5 deletions(-)