[PATCH 1/5] target/loongarch: Add a new cpu_type la664

Song Gao posted 5 patches 3 months, 4 weeks ago
There is a newer version of this series
[PATCH 1/5] target/loongarch: Add a new cpu_type la664
Posted by Song Gao 3 months, 4 weeks ago
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(-)

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),
-- 
2.33.0
Re: [PATCH 1/5] target/loongarch: Add a new cpu_type la664
Posted by Philippe Mathieu-Daudé 2 months, 2 weeks ago
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);
> +}
Re: [PATCH 1/5] target/loongarch: Add a new cpu_type la664
Posted by gaosong 2 months, 2 weeks ago
在 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);
>> +}