qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v1 0/3] Allow user enable/disable LSX/LASX features
@ 2023-10-18  8:59 Song Gao
  2023-10-18  8:59 ` [PATCH v1 1/3] target/loongarch: Add cpu model 'max' Song Gao
                   ` (2 more replies)
  0 siblings, 3 replies; 7+ messages in thread
From: Song Gao @ 2023-10-18  8:59 UTC (permalink / raw)
  To: qemu-devel
  Cc: richard.henderson, philmd, peter.maydell, eblake, armbru, maobibo

Hi,

This series adds the cpu model 'max' support. and allow users
enable/disable LSX/LASX features.

Song Gao (3):
  target/loongarch: Add cpu model 'max'
  target/loongarch: Allow user enable/disable LSX/LASX features
  target/loongarch: Implement query-cpu-model-expansion

 qapi/machine-target.json              |  6 ++-
 target/loongarch/cpu.c                | 71 +++++++++++++++++++++++++++
 target/loongarch/cpu.h                |  7 +++
 target/loongarch/loongarch-qmp-cmds.c | 64 ++++++++++++++++++++++++
 4 files changed, 146 insertions(+), 2 deletions(-)

-- 
2.25.1



^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH v1 1/3] target/loongarch: Add cpu model 'max'
  2023-10-18  8:59 [PATCH v1 0/3] Allow user enable/disable LSX/LASX features Song Gao
@ 2023-10-18  8:59 ` Song Gao
  2023-10-18  8:59 ` [PATCH v1 2/3] target/loongarch: Allow user enable/disable LSX/LASX features Song Gao
  2023-10-18  8:59 ` [PATCH v1 3/3] target/loongarch: Implement query-cpu-model-expansion Song Gao
  2 siblings, 0 replies; 7+ messages in thread
From: Song Gao @ 2023-10-18  8:59 UTC (permalink / raw)
  To: qemu-devel
  Cc: richard.henderson, philmd, peter.maydell, eblake, armbru, maobibo

We use cpu la464 for the 'max' cpu.

Signed-off-by: Song Gao <gaosong@loongson.cn>
---
 target/loongarch/cpu.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/target/loongarch/cpu.c b/target/loongarch/cpu.c
index ef1bf89dac..ef6922e812 100644
--- a/target/loongarch/cpu.c
+++ b/target/loongarch/cpu.c
@@ -474,6 +474,12 @@ static void loongarch_la132_initfn(Object *obj)
     env->cpucfg[1] = data;
 }
 
+static void loongarch_max_initfn(Object *obj)
+{
+    /* '-cpu max' for TCG: we use cpu la464. */
+    loongarch_la464_initfn(obj);
+}
+
 static void loongarch_cpu_list_entry(gpointer data, gpointer user_data)
 {
     const char *typename = object_class_get_name(OBJECT_CLASS(data));
@@ -829,6 +835,7 @@ static const TypeInfo loongarch_cpu_type_infos[] = {
     },
     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),
 };
 
 DEFINE_TYPES(loongarch_cpu_type_infos)
-- 
2.25.1



^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH v1 2/3] target/loongarch: Allow user enable/disable LSX/LASX features
  2023-10-18  8:59 [PATCH v1 0/3] Allow user enable/disable LSX/LASX features Song Gao
  2023-10-18  8:59 ` [PATCH v1 1/3] target/loongarch: Add cpu model 'max' Song Gao
@ 2023-10-18  8:59 ` Song Gao
  2023-10-18 23:47   ` Richard Henderson
  2023-10-18  8:59 ` [PATCH v1 3/3] target/loongarch: Implement query-cpu-model-expansion Song Gao
  2 siblings, 1 reply; 7+ messages in thread
From: Song Gao @ 2023-10-18  8:59 UTC (permalink / raw)
  To: qemu-devel
  Cc: richard.henderson, philmd, peter.maydell, eblake, armbru, maobibo

Some users may not need LSX/LASX, this patch allows the user
enable/disable LSX/LASX features.

 e.g
 '-cpu max,lsx=on,lasx=on'   (default);
 '-cpu max,lsx=on,lasx=off'  (enabled LSX);
 '-cpu max,lsx=off,lasx=on'  (error, need lsx=on);
 '-cpu max,lsx=off'          (disable LSX and LASX).

Signed-off-by: Song Gao <gaosong@loongson.cn>
---
 target/loongarch/cpu.c | 64 ++++++++++++++++++++++++++++++++++++++++++
 target/loongarch/cpu.h |  7 +++++
 2 files changed, 71 insertions(+)

diff --git a/target/loongarch/cpu.c b/target/loongarch/cpu.c
index ef6922e812..8a47d85d8a 100644
--- a/target/loongarch/cpu.c
+++ b/target/loongarch/cpu.c
@@ -478,6 +478,7 @@ static void loongarch_max_initfn(Object *obj)
 {
     /* '-cpu max' for TCG: we use cpu la464. */
     loongarch_la464_initfn(obj);
+    loongarch_cpu_post_init(obj);
 }
 
 static void loongarch_cpu_list_entry(gpointer data, gpointer user_data)
@@ -622,6 +623,69 @@ static const MemoryRegionOps loongarch_qemu_ops = {
 };
 #endif
 
+static bool loongarch_get_lsx(Object *obj, Error **errp)
+{
+    LoongArchCPU *cpu = LOONGARCH_CPU(obj);
+
+    if (FIELD_EX32(cpu->env.cpucfg[2], CPUCFG2, LSX)) {
+        cpu->has_lsx = true;
+    } else {
+        cpu->has_lsx = false;
+    }
+    return cpu->has_lsx;
+}
+
+static void loongarch_set_lsx(Object *obj, bool value, Error **errp)
+{
+    LoongArchCPU *cpu = LOONGARCH_CPU(obj);
+
+    if (value) {
+        cpu->env.cpucfg[2] = FIELD_DP32(cpu->env.cpucfg[2], CPUCFG2, LSX, 1);
+    } else {
+        cpu->env.cpucfg[2] = FIELD_DP32(cpu->env.cpucfg[2], CPUCFG2, LSX, 0);
+        cpu->env.cpucfg[2] = FIELD_DP32(cpu->env.cpucfg[2], CPUCFG2, LASX, 0);
+    }
+
+    cpu->has_lsx = value;
+}
+
+static bool loongarch_get_lasx(Object *obj, Error **errp)
+{
+    LoongArchCPU *cpu = LOONGARCH_CPU(obj);
+
+    if (FIELD_EX32(cpu->env.cpucfg[2], CPUCFG2, LASX)) {
+        cpu->has_lasx = true;
+    } else {
+        cpu->has_lasx = false;
+    }
+    return cpu->has_lasx;
+}
+
+static void loongarch_set_lasx(Object *obj, bool value, Error **errp)
+{
+    LoongArchCPU *cpu = LOONGARCH_CPU(obj);
+
+    if (value) {
+        if (!FIELD_EX32(cpu->env.cpucfg[2], CPUCFG2, LSX)) {
+            error_setg(errp, "Enabled LASX, need enabled LSX first!");
+            return;
+	}
+        cpu->env.cpucfg[2] = FIELD_DP32(cpu->env.cpucfg[2], CPUCFG2, LASX, 1);
+    } else {
+        cpu->env.cpucfg[2] = FIELD_DP32(cpu->env.cpucfg[2], CPUCFG2, LASX, 0);
+    }
+
+    cpu->has_lasx = value;
+}
+
+void loongarch_cpu_post_init(Object *obj)
+{
+    object_property_add_bool(obj, "lsx", loongarch_get_lsx,
+                             loongarch_set_lsx);
+    object_property_add_bool(obj, "lasx", loongarch_get_lasx,
+                             loongarch_set_lasx);
+}
+
 static void loongarch_cpu_init(Object *obj)
 {
 #ifndef CONFIG_USER_ONLY
diff --git a/target/loongarch/cpu.h b/target/loongarch/cpu.h
index 8b54cf109c..d927377c49 100644
--- a/target/loongarch/cpu.h
+++ b/target/loongarch/cpu.h
@@ -381,6 +381,11 @@ struct ArchCPU {
 
     /* 'compatible' string for this CPU for Linux device trees */
     const char *dtb_compatible;
+
+    /* CPU has LSX */
+    bool has_lsx;
+    /* CPU has  LASX */
+    bool has_lasx;
 };
 
 #define TYPE_LOONGARCH_CPU "loongarch-cpu"
@@ -486,4 +491,6 @@ void loongarch_cpu_list(void);
 #define LOONGARCH_CPU_TYPE_NAME(model) model LOONGARCH_CPU_TYPE_SUFFIX
 #define CPU_RESOLVING_TYPE TYPE_LOONGARCH_CPU
 
+void loongarch_cpu_post_init(Object *obj);
+
 #endif /* LOONGARCH_CPU_H */
-- 
2.25.1



^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH v1 3/3] target/loongarch: Implement query-cpu-model-expansion
  2023-10-18  8:59 [PATCH v1 0/3] Allow user enable/disable LSX/LASX features Song Gao
  2023-10-18  8:59 ` [PATCH v1 1/3] target/loongarch: Add cpu model 'max' Song Gao
  2023-10-18  8:59 ` [PATCH v1 2/3] target/loongarch: Allow user enable/disable LSX/LASX features Song Gao
@ 2023-10-18  8:59 ` Song Gao
  2023-10-18 10:47   ` Markus Armbruster
  2 siblings, 1 reply; 7+ messages in thread
From: Song Gao @ 2023-10-18  8:59 UTC (permalink / raw)
  To: qemu-devel
  Cc: richard.henderson, philmd, peter.maydell, eblake, armbru, maobibo

Add support for the query-cpu-model-expansion QMP command to LoongArch.
We only support query the 'max' cpu features.

  e.g
    start with '-cpu max,lasx=off'

    (QEMU) query-cpu-model-expansion type=static  model={"name":"max"}
    {"return": {"model": {"name": "max", "props": {"lasx": false, "lsx": true}}}}

Signed-off-by: Song Gao <gaosong@loongson.cn>
---
 qapi/machine-target.json              |  6 ++-
 target/loongarch/loongarch-qmp-cmds.c | 64 +++++++++++++++++++++++++++
 2 files changed, 68 insertions(+), 2 deletions(-)

diff --git a/qapi/machine-target.json b/qapi/machine-target.json
index f0a6b72414..752b18cced 100644
--- a/qapi/machine-target.json
+++ b/qapi/machine-target.json
@@ -228,7 +228,8 @@
   'data': { 'model': 'CpuModelInfo' },
   'if': { 'any': [ 'TARGET_S390X',
                    'TARGET_I386',
-                   'TARGET_ARM' ] } }
+                   'TARGET_ARM',
+                   'TARGET_LOONGARCH64' ] } }
 
 ##
 # @query-cpu-model-expansion:
@@ -273,7 +274,8 @@
   'returns': 'CpuModelExpansionInfo',
   'if': { 'any': [ 'TARGET_S390X',
                    'TARGET_I386',
-                   'TARGET_ARM' ] } }
+                   'TARGET_ARM',
+                   'TARGET_LOONGARCH64' ] } }
 
 ##
 # @CpuDefinitionInfo:
diff --git a/target/loongarch/loongarch-qmp-cmds.c b/target/loongarch/loongarch-qmp-cmds.c
index 6c25957881..645672ff59 100644
--- a/target/loongarch/loongarch-qmp-cmds.c
+++ b/target/loongarch/loongarch-qmp-cmds.c
@@ -7,8 +7,13 @@
  */
 
 #include "qemu/osdep.h"
+#include "qapi/error.h"
 #include "qapi/qapi-commands-machine-target.h"
 #include "cpu.h"
+#include "qapi/qmp/qerror.h"
+#include "qapi/qmp/qdict.h"
+#include "qapi/qobject-input-visitor.h"
+#include "qom/qom-qobject.h"
 
 static void loongarch_cpu_add_definition(gpointer data, gpointer user_data)
 {
@@ -35,3 +40,62 @@ CpuDefinitionInfoList *qmp_query_cpu_definitions(Error **errp)
 
     return cpu_list;
 }
+
+static const char *cpu_model_advertised_features[] = {
+    "lsx", "lasx", NULL
+};
+
+CpuModelExpansionInfo *qmp_query_cpu_model_expansion(CpuModelExpansionType type,
+                                                     CpuModelInfo *model,
+                                                     Error **errp)
+{
+    CpuModelExpansionInfo *expansion_info;
+    QDict *qdict_out;
+    ObjectClass *oc;
+    Object *obj;
+    const char *name;
+    int i;
+
+    if (type != CPU_MODEL_EXPANSION_TYPE_STATIC) {
+        error_setg(errp, "The requested expansion type is not supported");
+        return NULL;
+    }
+
+    oc = cpu_class_by_name(TYPE_LOONGARCH_CPU, model->name);
+    if (!oc) {
+        error_setg(errp, "The CPU type '%s' is not a recognized LoongArch CPU type",
+                   model->name);
+        return NULL;
+    }
+
+    obj = object_new(object_class_get_name(oc));
+
+    expansion_info = g_new0(CpuModelExpansionInfo, 1);
+    expansion_info->model = g_malloc0(sizeof(*expansion_info->model));
+    expansion_info->model->name = g_strdup(model->name);
+
+    qdict_out = qdict_new();
+
+    i = 0;
+    while ((name = cpu_model_advertised_features[i++]) != NULL) {
+        ObjectProperty *prop = object_property_find(obj, name);
+        if (prop) {
+            QObject *value;
+
+            assert(prop->get);
+            value = object_property_get_qobject(obj, name, &error_abort);
+
+            qdict_put_obj(qdict_out, name, value);
+        }
+    }
+
+    if (!qdict_size(qdict_out)) {
+        qobject_unref(qdict_out);
+    } else {
+        expansion_info->model->props = QOBJECT(qdict_out);
+    }
+
+    object_unref(obj);
+
+    return expansion_info;
+}
-- 
2.25.1



^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH v1 3/3] target/loongarch: Implement query-cpu-model-expansion
  2023-10-18  8:59 ` [PATCH v1 3/3] target/loongarch: Implement query-cpu-model-expansion Song Gao
@ 2023-10-18 10:47   ` Markus Armbruster
  0 siblings, 0 replies; 7+ messages in thread
From: Markus Armbruster @ 2023-10-18 10:47 UTC (permalink / raw)
  To: Song Gao
  Cc: qemu-devel, richard.henderson, philmd, peter.maydell, eblake,
	maobibo

Song Gao <gaosong@loongson.cn> writes:

> Add support for the query-cpu-model-expansion QMP command to LoongArch.
> We only support query the 'max' cpu features.
>
>   e.g
>     start with '-cpu max,lasx=off'
>
>     (QEMU) query-cpu-model-expansion type=static  model={"name":"max"}
>     {"return": {"model": {"name": "max", "props": {"lasx": false, "lsx": true}}}}

Suggest to show what happens when you try to query something else.

> Signed-off-by: Song Gao <gaosong@loongson.cn>
> ---
>  qapi/machine-target.json              |  6 ++-
>  target/loongarch/loongarch-qmp-cmds.c | 64 +++++++++++++++++++++++++++
>  2 files changed, 68 insertions(+), 2 deletions(-)
>
> diff --git a/qapi/machine-target.json b/qapi/machine-target.json
> index f0a6b72414..752b18cced 100644
> --- a/qapi/machine-target.json
> +++ b/qapi/machine-target.json
> @@ -228,7 +228,8 @@
>    'data': { 'model': 'CpuModelInfo' },
>    'if': { 'any': [ 'TARGET_S390X',
>                     'TARGET_I386',
> -                   'TARGET_ARM' ] } }
> +                   'TARGET_ARM',
> +                   'TARGET_LOONGARCH64' ] } }
>  
>  ##
>  # @query-cpu-model-expansion:
> @@ -273,7 +274,8 @@
>    'returns': 'CpuModelExpansionInfo',
>    'if': { 'any': [ 'TARGET_S390X',
>                     'TARGET_I386',
> -                   'TARGET_ARM' ] } }
> +                   'TARGET_ARM',
> +                   'TARGET_LOONGARCH64' ] } }
>  
>  ##
>  # @CpuDefinitionInfo:

QAPI schema
Acked-by: Markus Armbruster <armbru@redhat.com>

[...]



^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v1 2/3] target/loongarch: Allow user enable/disable LSX/LASX features
  2023-10-18  8:59 ` [PATCH v1 2/3] target/loongarch: Allow user enable/disable LSX/LASX features Song Gao
@ 2023-10-18 23:47   ` Richard Henderson
  2023-10-19  3:27     ` gaosong
  0 siblings, 1 reply; 7+ messages in thread
From: Richard Henderson @ 2023-10-18 23:47 UTC (permalink / raw)
  To: Song Gao, qemu-devel; +Cc: philmd, peter.maydell, eblake, armbru, maobibo

On 10/18/23 01:59, Song Gao wrote:
> Some users may not need LSX/LASX, this patch allows the user
> enable/disable LSX/LASX features.
> 
>   e.g
>   '-cpu max,lsx=on,lasx=on'   (default);
>   '-cpu max,lsx=on,lasx=off'  (enabled LSX);
>   '-cpu max,lsx=off,lasx=on'  (error, need lsx=on);
>   '-cpu max,lsx=off'          (disable LSX and LASX).

...

> +    /* CPU has LSX */
> +    bool has_lsx;
> +    /* CPU has  LASX */
> +    bool has_lasx;

Why do you need these variables?

I suspect that you've copied them from one of the more complex Arm cases where we need to 
resolve multiple properties simultaneously during realize.

You'll get identical behaviour in your current code if you drop these and rely only on the 
CPUCFG2 bits.

If you wanted to do something more complex, you could use OnOffAuto, so that you can 
detect conflicting settings (such as #3 above), but not generate an error for

   -cpu foo,lasx=on

where 'foo' is some cpu model which does *no* default lsx=on.  You would see that 
has_lsx==AUTO && has_lasx==ON and then set lsx=ON.


r~


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v1 2/3] target/loongarch: Allow user enable/disable LSX/LASX features
  2023-10-18 23:47   ` Richard Henderson
@ 2023-10-19  3:27     ` gaosong
  0 siblings, 0 replies; 7+ messages in thread
From: gaosong @ 2023-10-19  3:27 UTC (permalink / raw)
  To: Richard Henderson, qemu-devel
  Cc: philmd, peter.maydell, eblake, armbru, maobibo

在 2023/10/19 上午7:47, Richard Henderson 写道:
> On 10/18/23 01:59, Song Gao wrote:
>> Some users may not need LSX/LASX, this patch allows the user
>> enable/disable LSX/LASX features.
>>
>>   e.g
>>   '-cpu max,lsx=on,lasx=on'   (default);
>>   '-cpu max,lsx=on,lasx=off'  (enabled LSX);
>>   '-cpu max,lsx=off,lasx=on'  (error, need lsx=on);
>>   '-cpu max,lsx=off'          (disable LSX and LASX).
>
> ...
>
>> +    /* CPU has LSX */
>> +    bool has_lsx;
>> +    /* CPU has  LASX */
>> +    bool has_lasx;
>
> Why do you need these variables?
>
> I suspect that you've copied them from one of the more complex Arm 
> cases where we need to resolve multiple properties simultaneously 
> during realize.
>
> You'll get identical behaviour in your current code if you drop these 
> and rely only on the CPUCFG2 bits.
>
> If you wanted to do something more complex, you could use OnOffAuto, 
> so that you can detect conflicting settings (such as #3 above), but 
> not generate an error for
>
>   -cpu foo,lasx=on
>
Got it, thanks for you suggestion.
> where 'foo' is some cpu model which does *no* default lsx=on.  You 
> would see that has_lsx==AUTO && has_lasx==ON and then set lsx=ON.
>
Some cpu model not support lasx or lsx feature,  we should't allow user 
set lsx=on or lasx=on.

I think we need env->features. set the feature when the cpu model 
support this feature.
If the cpu model support the feature,  we allow user set CPUCFG to 
enable/disable this feature.

Do you have more suggestion?

Thanks.
Song Gao



^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2023-10-19  3:27 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-10-18  8:59 [PATCH v1 0/3] Allow user enable/disable LSX/LASX features Song Gao
2023-10-18  8:59 ` [PATCH v1 1/3] target/loongarch: Add cpu model 'max' Song Gao
2023-10-18  8:59 ` [PATCH v1 2/3] target/loongarch: Allow user enable/disable LSX/LASX features Song Gao
2023-10-18 23:47   ` Richard Henderson
2023-10-19  3:27     ` gaosong
2023-10-18  8:59 ` [PATCH v1 3/3] target/loongarch: Implement query-cpu-model-expansion Song Gao
2023-10-18 10:47   ` Markus Armbruster

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).