* [PATCH v3] target/riscv: Add isa extenstion strings to the device tree
@ 2022-02-22 22:38 Atish Patra
2022-02-23 6:44 ` Anup Patel
` (2 more replies)
0 siblings, 3 replies; 15+ messages in thread
From: Atish Patra @ 2022-02-22 22:38 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-riscv, Heiko Stubner, Bin Meng, Atish Patra,
Alistair Francis, Palmer Dabbelt
The Linux kernel parses the ISA extensions from "riscv,isa" DT
property. It used to parse only the single letter base extensions
until now. A generic ISA extension parsing framework was proposed[1]
recently that can parse multi-letter ISA extensions as well.
Generate the extended ISA string by appending the available ISA extensions
to the "riscv,isa" string if it is enabled so that kernel can process it.
[1] https://lkml.org/lkml/2022/2/15/263
Suggested-by: Heiko Stubner <heiko@sntech.de>
Signed-off-by: Atish Patra <atishp@rivosinc.com>
---
Changes from v2->v3:
1. Used g_strconcat to replace snprintf & a max isa string length as
suggested by Anup.
2. I have not included the Tested-by Tag from Heiko because the
implementation changed from v2 to v3.
Changes from v1->v2:
1. Improved the code redability by using arrays instead of individual check
---
target/riscv/cpu.c | 29 +++++++++++++++++++++++++++++
1 file changed, 29 insertions(+)
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
index b0a40b83e7a8..2c7ff6ef555a 100644
--- a/target/riscv/cpu.c
+++ b/target/riscv/cpu.c
@@ -34,6 +34,12 @@
/* RISC-V CPU definitions */
+/* This includes the null terminated character '\0' */
+struct isa_ext_data {
+ const char *name;
+ bool enabled;
+};
+
static const char riscv_exts[26] = "IEMAFDQCLBJTPVNSUHKORWXYZG";
const char * const riscv_int_regnames[] = {
@@ -881,6 +887,28 @@ static void riscv_cpu_class_init(ObjectClass *c, void *data)
device_class_set_props(dc, riscv_cpu_properties);
}
+static void riscv_isa_string_ext(RISCVCPU *cpu, char **isa_str, int max_str_len)
+{
+ char *old = *isa_str;
+ char *new = *isa_str;
+ int i;
+ struct isa_ext_data isa_edata_arr[] = {
+ { "svpbmt", cpu->cfg.ext_svpbmt },
+ { "svinval", cpu->cfg.ext_svinval },
+ { "svnapot", cpu->cfg.ext_svnapot },
+ };
+
+ for (i = 0; i < ARRAY_SIZE(isa_edata_arr); i++) {
+ if (isa_edata_arr[i].enabled) {
+ new = g_strconcat(old, "_", isa_edata_arr[i].name, NULL);
+ g_free(old);
+ old = new;
+ }
+ }
+
+ *isa_str = new;
+}
+
char *riscv_isa_string(RISCVCPU *cpu)
{
int i;
@@ -893,6 +921,7 @@ char *riscv_isa_string(RISCVCPU *cpu)
}
}
*p = '\0';
+ riscv_isa_string_ext(cpu, &isa_str, maxlen);
return isa_str;
}
--
2.30.2
^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH v3] target/riscv: Add isa extenstion strings to the device tree
2022-02-22 22:38 [PATCH v3] target/riscv: Add isa extenstion strings to the device tree Atish Patra
@ 2022-02-23 6:44 ` Anup Patel
2022-02-24 5:16 ` Alistair Francis
2022-02-26 7:45 ` Frank Chang
2 siblings, 0 replies; 15+ messages in thread
From: Anup Patel @ 2022-02-23 6:44 UTC (permalink / raw)
To: Atish Patra
Cc: open list:RISC-V, Heiko Stubner, Bin Meng, QEMU Developers,
Alistair Francis, Palmer Dabbelt
On Wed, Feb 23, 2022 at 4:09 AM Atish Patra <atishp@rivosinc.com> wrote:
>
> The Linux kernel parses the ISA extensions from "riscv,isa" DT
> property. It used to parse only the single letter base extensions
> until now. A generic ISA extension parsing framework was proposed[1]
> recently that can parse multi-letter ISA extensions as well.
>
> Generate the extended ISA string by appending the available ISA extensions
> to the "riscv,isa" string if it is enabled so that kernel can process it.
>
> [1] https://lkml.org/lkml/2022/2/15/263
>
> Suggested-by: Heiko Stubner <heiko@sntech.de>
> Signed-off-by: Atish Patra <atishp@rivosinc.com>
Looks good to me.
Reviewed-by: Anup Patel <anup@brainfault.org>
Regards,
Anup
> ---
> Changes from v2->v3:
> 1. Used g_strconcat to replace snprintf & a max isa string length as
> suggested by Anup.
> 2. I have not included the Tested-by Tag from Heiko because the
> implementation changed from v2 to v3.
>
> Changes from v1->v2:
> 1. Improved the code redability by using arrays instead of individual check
> ---
> target/riscv/cpu.c | 29 +++++++++++++++++++++++++++++
> 1 file changed, 29 insertions(+)
>
> diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
> index b0a40b83e7a8..2c7ff6ef555a 100644
> --- a/target/riscv/cpu.c
> +++ b/target/riscv/cpu.c
> @@ -34,6 +34,12 @@
>
> /* RISC-V CPU definitions */
>
> +/* This includes the null terminated character '\0' */
> +struct isa_ext_data {
> + const char *name;
> + bool enabled;
> +};
> +
> static const char riscv_exts[26] = "IEMAFDQCLBJTPVNSUHKORWXYZG";
>
> const char * const riscv_int_regnames[] = {
> @@ -881,6 +887,28 @@ static void riscv_cpu_class_init(ObjectClass *c, void *data)
> device_class_set_props(dc, riscv_cpu_properties);
> }
>
> +static void riscv_isa_string_ext(RISCVCPU *cpu, char **isa_str, int max_str_len)
> +{
> + char *old = *isa_str;
> + char *new = *isa_str;
> + int i;
> + struct isa_ext_data isa_edata_arr[] = {
> + { "svpbmt", cpu->cfg.ext_svpbmt },
> + { "svinval", cpu->cfg.ext_svinval },
> + { "svnapot", cpu->cfg.ext_svnapot },
> + };
> +
> + for (i = 0; i < ARRAY_SIZE(isa_edata_arr); i++) {
> + if (isa_edata_arr[i].enabled) {
> + new = g_strconcat(old, "_", isa_edata_arr[i].name, NULL);
> + g_free(old);
> + old = new;
> + }
> + }
> +
> + *isa_str = new;
> +}
> +
> char *riscv_isa_string(RISCVCPU *cpu)
> {
> int i;
> @@ -893,6 +921,7 @@ char *riscv_isa_string(RISCVCPU *cpu)
> }
> }
> *p = '\0';
> + riscv_isa_string_ext(cpu, &isa_str, maxlen);
> return isa_str;
> }
>
> --
> 2.30.2
>
>
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v3] target/riscv: Add isa extenstion strings to the device tree
2022-02-22 22:38 [PATCH v3] target/riscv: Add isa extenstion strings to the device tree Atish Patra
2022-02-23 6:44 ` Anup Patel
@ 2022-02-24 5:16 ` Alistair Francis
2022-02-26 7:45 ` Frank Chang
2 siblings, 0 replies; 15+ messages in thread
From: Alistair Francis @ 2022-02-24 5:16 UTC (permalink / raw)
To: Atish Patra
Cc: open list:RISC-V, Heiko Stubner, Bin Meng,
qemu-devel@nongnu.org Developers, Alistair Francis,
Palmer Dabbelt
On Wed, Feb 23, 2022 at 8:39 AM Atish Patra <atishp@rivosinc.com> wrote:
>
> The Linux kernel parses the ISA extensions from "riscv,isa" DT
> property. It used to parse only the single letter base extensions
> until now. A generic ISA extension parsing framework was proposed[1]
> recently that can parse multi-letter ISA extensions as well.
>
> Generate the extended ISA string by appending the available ISA extensions
> to the "riscv,isa" string if it is enabled so that kernel can process it.
>
> [1] https://lkml.org/lkml/2022/2/15/263
>
> Suggested-by: Heiko Stubner <heiko@sntech.de>
> Signed-off-by: Atish Patra <atishp@rivosinc.com>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Alistair
> ---
> Changes from v2->v3:
> 1. Used g_strconcat to replace snprintf & a max isa string length as
> suggested by Anup.
> 2. I have not included the Tested-by Tag from Heiko because the
> implementation changed from v2 to v3.
>
> Changes from v1->v2:
> 1. Improved the code redability by using arrays instead of individual check
> ---
> target/riscv/cpu.c | 29 +++++++++++++++++++++++++++++
> 1 file changed, 29 insertions(+)
>
> diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
> index b0a40b83e7a8..2c7ff6ef555a 100644
> --- a/target/riscv/cpu.c
> +++ b/target/riscv/cpu.c
> @@ -34,6 +34,12 @@
>
> /* RISC-V CPU definitions */
>
> +/* This includes the null terminated character '\0' */
> +struct isa_ext_data {
> + const char *name;
> + bool enabled;
> +};
> +
> static const char riscv_exts[26] = "IEMAFDQCLBJTPVNSUHKORWXYZG";
>
> const char * const riscv_int_regnames[] = {
> @@ -881,6 +887,28 @@ static void riscv_cpu_class_init(ObjectClass *c, void *data)
> device_class_set_props(dc, riscv_cpu_properties);
> }
>
> +static void riscv_isa_string_ext(RISCVCPU *cpu, char **isa_str, int max_str_len)
> +{
> + char *old = *isa_str;
> + char *new = *isa_str;
> + int i;
> + struct isa_ext_data isa_edata_arr[] = {
> + { "svpbmt", cpu->cfg.ext_svpbmt },
> + { "svinval", cpu->cfg.ext_svinval },
> + { "svnapot", cpu->cfg.ext_svnapot },
> + };
> +
> + for (i = 0; i < ARRAY_SIZE(isa_edata_arr); i++) {
> + if (isa_edata_arr[i].enabled) {
> + new = g_strconcat(old, "_", isa_edata_arr[i].name, NULL);
> + g_free(old);
> + old = new;
> + }
> + }
> +
> + *isa_str = new;
> +}
> +
> char *riscv_isa_string(RISCVCPU *cpu)
> {
> int i;
> @@ -893,6 +921,7 @@ char *riscv_isa_string(RISCVCPU *cpu)
> }
> }
> *p = '\0';
> + riscv_isa_string_ext(cpu, &isa_str, maxlen);
> return isa_str;
> }
>
> --
> 2.30.2
>
>
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v3] target/riscv: Add isa extenstion strings to the device tree
2022-02-22 22:38 [PATCH v3] target/riscv: Add isa extenstion strings to the device tree Atish Patra
2022-02-23 6:44 ` Anup Patel
2022-02-24 5:16 ` Alistair Francis
@ 2022-02-26 7:45 ` Frank Chang
2022-03-03 18:58 ` Atish Patra
2022-03-06 6:47 ` Frank Chang
2 siblings, 2 replies; 15+ messages in thread
From: Frank Chang @ 2022-02-26 7:45 UTC (permalink / raw)
To: Atish Patra
Cc: open list:RISC-V, Heiko Stubner, Bin Meng,
qemu-devel@nongnu.org Developers, Alistair Francis,
Palmer Dabbelt
[-- Attachment #1: Type: text/plain, Size: 2999 bytes --]
Atish Patra <atishp@rivosinc.com> 於 2022年2月23日 週三 上午6:39寫道:
> The Linux kernel parses the ISA extensions from "riscv,isa" DT
> property. It used to parse only the single letter base extensions
> until now. A generic ISA extension parsing framework was proposed[1]
> recently that can parse multi-letter ISA extensions as well.
>
> Generate the extended ISA string by appending the available ISA extensions
> to the "riscv,isa" string if it is enabled so that kernel can process it.
>
> [1] https://lkml.org/lkml/2022/2/15/263
>
> Suggested-by: Heiko Stubner <heiko@sntech.de>
> Signed-off-by: Atish Patra <atishp@rivosinc.com>
> ---
> Changes from v2->v3:
> 1. Used g_strconcat to replace snprintf & a max isa string length as
> suggested by Anup.
> 2. I have not included the Tested-by Tag from Heiko because the
> implementation changed from v2 to v3.
>
> Changes from v1->v2:
> 1. Improved the code redability by using arrays instead of individual check
> ---
> target/riscv/cpu.c | 29 +++++++++++++++++++++++++++++
> 1 file changed, 29 insertions(+)
>
> diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
> index b0a40b83e7a8..2c7ff6ef555a 100644
> --- a/target/riscv/cpu.c
> +++ b/target/riscv/cpu.c
> @@ -34,6 +34,12 @@
>
> /* RISC-V CPU definitions */
>
> +/* This includes the null terminated character '\0' */
> +struct isa_ext_data {
> + const char *name;
> + bool enabled;
> +};
> +
> static const char riscv_exts[26] = "IEMAFDQCLBJTPVNSUHKORWXYZG";
>
> const char * const riscv_int_regnames[] = {
> @@ -881,6 +887,28 @@ static void riscv_cpu_class_init(ObjectClass *c, void
> *data)
> device_class_set_props(dc, riscv_cpu_properties);
> }
>
> +static void riscv_isa_string_ext(RISCVCPU *cpu, char **isa_str, int
> max_str_len)
> +{
> + char *old = *isa_str;
> + char *new = *isa_str;
> + int i;
> + struct isa_ext_data isa_edata_arr[] = {
> + { "svpbmt", cpu->cfg.ext_svpbmt },
> + { "svinval", cpu->cfg.ext_svinval },
> + { "svnapot", cpu->cfg.ext_svnapot },
>
We still have other sub-extensions, e.g. Zfh, Zba, Zbb, Zbc, Zbs... etc.
Do you mind adding them as well?
Also, I think the order of ISA strings should be alphabetical as described:
https://github.com/riscv/riscv-isa-manual/blob/master/src/naming.tex#L96
Regards,
Frank Chang
> + };
> +
> + for (i = 0; i < ARRAY_SIZE(isa_edata_arr); i++) {
> + if (isa_edata_arr[i].enabled) {
> + new = g_strconcat(old, "_", isa_edata_arr[i].name, NULL);
> + g_free(old);
> + old = new;
> + }
> + }
> +
> + *isa_str = new;
> +}
> +
> char *riscv_isa_string(RISCVCPU *cpu)
> {
> int i;
> @@ -893,6 +921,7 @@ char *riscv_isa_string(RISCVCPU *cpu)
> }
> }
> *p = '\0';
> + riscv_isa_string_ext(cpu, &isa_str, maxlen);
> return isa_str;
> }
>
> --
> 2.30.2
>
>
[-- Attachment #2: Type: text/html, Size: 4205 bytes --]
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v3] target/riscv: Add isa extenstion strings to the device tree
2022-02-26 7:45 ` Frank Chang
@ 2022-03-03 18:58 ` Atish Patra
2022-03-05 17:26 ` Heiko Stuebner
2022-03-06 6:47 ` Frank Chang
1 sibling, 1 reply; 15+ messages in thread
From: Atish Patra @ 2022-03-03 18:58 UTC (permalink / raw)
To: Frank Chang
Cc: open list:RISC-V, Heiko Stubner, Bin Meng, Atish Patra,
qemu-devel@nongnu.org Developers, Alistair Francis,
Palmer Dabbelt
On Fri, Feb 25, 2022 at 11:46 PM Frank Chang <frank.chang@sifive.com> wrote:
>
>
>
> Atish Patra <atishp@rivosinc.com> 於 2022年2月23日 週三 上午6:39寫道:
>>
>> The Linux kernel parses the ISA extensions from "riscv,isa" DT
>> property. It used to parse only the single letter base extensions
>> until now. A generic ISA extension parsing framework was proposed[1]
>> recently that can parse multi-letter ISA extensions as well.
>>
>> Generate the extended ISA string by appending the available ISA extensions
>> to the "riscv,isa" string if it is enabled so that kernel can process it.
>>
>> [1] https://lkml.org/lkml/2022/2/15/263
>>
>> Suggested-by: Heiko Stubner <heiko@sntech.de>
>> Signed-off-by: Atish Patra <atishp@rivosinc.com>
>> ---
>> Changes from v2->v3:
>> 1. Used g_strconcat to replace snprintf & a max isa string length as
>> suggested by Anup.
>> 2. I have not included the Tested-by Tag from Heiko because the
>> implementation changed from v2 to v3.
>>
>> Changes from v1->v2:
>> 1. Improved the code redability by using arrays instead of individual check
>> ---
>> target/riscv/cpu.c | 29 +++++++++++++++++++++++++++++
>> 1 file changed, 29 insertions(+)
>>
>> diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
>> index b0a40b83e7a8..2c7ff6ef555a 100644
>> --- a/target/riscv/cpu.c
>> +++ b/target/riscv/cpu.c
>> @@ -34,6 +34,12 @@
>>
>> /* RISC-V CPU definitions */
>>
>> +/* This includes the null terminated character '\0' */
>> +struct isa_ext_data {
>> + const char *name;
>> + bool enabled;
>> +};
>> +
>> static const char riscv_exts[26] = "IEMAFDQCLBJTPVNSUHKORWXYZG";
>>
>> const char * const riscv_int_regnames[] = {
>> @@ -881,6 +887,28 @@ static void riscv_cpu_class_init(ObjectClass *c, void *data)
>> device_class_set_props(dc, riscv_cpu_properties);
>> }
>>
>> +static void riscv_isa_string_ext(RISCVCPU *cpu, char **isa_str, int max_str_len)
>> +{
>> + char *old = *isa_str;
>> + char *new = *isa_str;
>> + int i;
>> + struct isa_ext_data isa_edata_arr[] = {
>> + { "svpbmt", cpu->cfg.ext_svpbmt },
>> + { "svinval", cpu->cfg.ext_svinval },
>> + { "svnapot", cpu->cfg.ext_svnapot },
>
>
> We still have other sub-extensions, e.g. Zfh, Zba, Zbb, Zbc, Zbs... etc.
> Do you mind adding them as well?
>
Do we really need it ? Does any OS actually parse it from the device tree ?
AFAIK, Linux kernel doesn't use them. As the device tree is intended
to keep the information useful
for supervisor software, I prefer to avoid bloating if possible.
> Also, I think the order of ISA strings should be alphabetical as described:
> https://github.com/riscv/riscv-isa-manual/blob/master/src/naming.tex#L96
>
Ahh yes. I will order them in alphabetical order and leave a big
comment for future reference as well.
> Regards,
> Frank Chang
>
>>
>> + };
>> +
>> + for (i = 0; i < ARRAY_SIZE(isa_edata_arr); i++) {
>> + if (isa_edata_arr[i].enabled) {
>> + new = g_strconcat(old, "_", isa_edata_arr[i].name, NULL);
>> + g_free(old);
>> + old = new;
>> + }
>> + }
>> +
>> + *isa_str = new;
>> +}
>> +
>> char *riscv_isa_string(RISCVCPU *cpu)
>> {
>> int i;
>> @@ -893,6 +921,7 @@ char *riscv_isa_string(RISCVCPU *cpu)
>> }
>> }
>> *p = '\0';
>> + riscv_isa_string_ext(cpu, &isa_str, maxlen);
>> return isa_str;
>> }
>>
>> --
>> 2.30.2
>>
--
Regards,
Atish
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v3] target/riscv: Add isa extenstion strings to the device tree
2022-03-03 18:58 ` Atish Patra
@ 2022-03-05 17:26 ` Heiko Stuebner
2022-03-05 23:42 ` Atish Kumar Patra
0 siblings, 1 reply; 15+ messages in thread
From: Heiko Stuebner @ 2022-03-05 17:26 UTC (permalink / raw)
To: Frank Chang, Atish Patra
Cc: Atish Patra, open list:RISC-V, Bin Meng,
qemu-devel@nongnu.org Developers, Alistair Francis,
Palmer Dabbelt
Hi,
Am Donnerstag, 3. März 2022, 19:58:38 CET schrieb Atish Patra:
> On Fri, Feb 25, 2022 at 11:46 PM Frank Chang <frank.chang@sifive.com> wrote:
> > Atish Patra <atishp@rivosinc.com> 於 2022年2月23日 週三 上午6:39寫道:
> >>
> >> The Linux kernel parses the ISA extensions from "riscv,isa" DT
> >> property. It used to parse only the single letter base extensions
> >> until now. A generic ISA extension parsing framework was proposed[1]
> >> recently that can parse multi-letter ISA extensions as well.
> >>
> >> Generate the extended ISA string by appending the available ISA extensions
> >> to the "riscv,isa" string if it is enabled so that kernel can process it.
> >>
> >> [1] https://lkml.org/lkml/2022/2/15/263
> >>
> >> Suggested-by: Heiko Stubner <heiko@sntech.de>
> >> Signed-off-by: Atish Patra <atishp@rivosinc.com>
> >> ---
> >> Changes from v2->v3:
> >> 1. Used g_strconcat to replace snprintf & a max isa string length as
> >> suggested by Anup.
> >> 2. I have not included the Tested-by Tag from Heiko because the
> >> implementation changed from v2 to v3.
> >>
> >> Changes from v1->v2:
> >> 1. Improved the code redability by using arrays instead of individual check
> >> ---
> >> target/riscv/cpu.c | 29 +++++++++++++++++++++++++++++
> >> 1 file changed, 29 insertions(+)
> >>
> >> diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
> >> index b0a40b83e7a8..2c7ff6ef555a 100644
> >> --- a/target/riscv/cpu.c
> >> +++ b/target/riscv/cpu.c
> >> @@ -34,6 +34,12 @@
> >>
> >> /* RISC-V CPU definitions */
> >>
> >> +/* This includes the null terminated character '\0' */
> >> +struct isa_ext_data {
> >> + const char *name;
> >> + bool enabled;
> >> +};
> >> +
> >> static const char riscv_exts[26] = "IEMAFDQCLBJTPVNSUHKORWXYZG";
> >>
> >> const char * const riscv_int_regnames[] = {
> >> @@ -881,6 +887,28 @@ static void riscv_cpu_class_init(ObjectClass *c, void *data)
> >> device_class_set_props(dc, riscv_cpu_properties);
> >> }
> >>
> >> +static void riscv_isa_string_ext(RISCVCPU *cpu, char **isa_str, int max_str_len)
> >> +{
> >> + char *old = *isa_str;
> >> + char *new = *isa_str;
> >> + int i;
> >> + struct isa_ext_data isa_edata_arr[] = {
> >> + { "svpbmt", cpu->cfg.ext_svpbmt },
> >> + { "svinval", cpu->cfg.ext_svinval },
> >> + { "svnapot", cpu->cfg.ext_svnapot },
> >
> >
> > We still have other sub-extensions, e.g. Zfh, Zba, Zbb, Zbc, Zbs... etc.
> > Do you mind adding them as well?
> >
>
> Do we really need it ? Does any OS actually parse it from the device tree ?
> AFAIK, Linux kernel doesn't use them. As the device tree is intended
> to keep the information useful
> for supervisor software,
That actually isn't true ;-) .
The devicetree is intended to _describe_ the hardware present in full
and has really nothing to do with what the userspace needs.
So the argument "Linux doesn't need this" is never true when talking
about devicetrees ;-) .
On the other hand the devicetree user doesn't need to parse everything
from DT. So adding code to parse things only really is needed if you
need that information.
So if some part of the kernel needs to know about those additional
extensions, the array entries for them can also be added in a later patch.
Heiko
> > Also, I think the order of ISA strings should be alphabetical as described:
> > https://github.com/riscv/riscv-isa-manual/blob/master/src/naming.tex#L96
> >
>
> Ahh yes. I will order them in alphabetical order and leave a big
> comment for future reference as well.
>
> > Regards,
> > Frank Chang
> >
> >>
> >> + };
> >> +
> >> + for (i = 0; i < ARRAY_SIZE(isa_edata_arr); i++) {
> >> + if (isa_edata_arr[i].enabled) {
> >> + new = g_strconcat(old, "_", isa_edata_arr[i].name, NULL);
> >> + g_free(old);
> >> + old = new;
> >> + }
> >> + }
> >> +
> >> + *isa_str = new;
> >> +}
> >> +
> >> char *riscv_isa_string(RISCVCPU *cpu)
> >> {
> >> int i;
> >> @@ -893,6 +921,7 @@ char *riscv_isa_string(RISCVCPU *cpu)
> >> }
> >> }
> >> *p = '\0';
> >> + riscv_isa_string_ext(cpu, &isa_str, maxlen);
> >> return isa_str;
> >> }
> >>
> >> --
> >> 2.30.2
> >>
>
>
>
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v3] target/riscv: Add isa extenstion strings to the device tree
2022-03-05 17:26 ` Heiko Stuebner
@ 2022-03-05 23:42 ` Atish Kumar Patra
2022-03-06 5:35 ` Frank Chang
0 siblings, 1 reply; 15+ messages in thread
From: Atish Kumar Patra @ 2022-03-05 23:42 UTC (permalink / raw)
To: Heiko Stuebner
Cc: open list:RISC-V, Frank Chang, Bin Meng,
qemu-devel@nongnu.org Developers, Palmer Dabbelt, Atish Patra,
Alistair Francis
[-- Attachment #1: Type: text/plain, Size: 5313 bytes --]
On Sat, Mar 5, 2022 at 10:05 AM Heiko Stuebner <heiko@sntech.de> wrote:
> Hi,
>
> Am Donnerstag, 3. März 2022, 19:58:38 CET schrieb Atish Patra:
> > On Fri, Feb 25, 2022 at 11:46 PM Frank Chang <frank.chang@sifive.com>
> wrote:
> > > Atish Patra <atishp@rivosinc.com> 於 2022年2月23日 週三 上午6:39寫道:
> > >>
> > >> The Linux kernel parses the ISA extensions from "riscv,isa" DT
> > >> property. It used to parse only the single letter base extensions
> > >> until now. A generic ISA extension parsing framework was proposed[1]
> > >> recently that can parse multi-letter ISA extensions as well.
> > >>
> > >> Generate the extended ISA string by appending the available ISA
> extensions
> > >> to the "riscv,isa" string if it is enabled so that kernel can process
> it.
> > >>
> > >> [1] https://lkml.org/lkml/2022/2/15/263
> > >>
> > >> Suggested-by: Heiko Stubner <heiko@sntech.de>
> > >> Signed-off-by: Atish Patra <atishp@rivosinc.com>
> > >> ---
> > >> Changes from v2->v3:
> > >> 1. Used g_strconcat to replace snprintf & a max isa string length as
> > >> suggested by Anup.
> > >> 2. I have not included the Tested-by Tag from Heiko because the
> > >> implementation changed from v2 to v3.
> > >>
> > >> Changes from v1->v2:
> > >> 1. Improved the code redability by using arrays instead of individual
> check
> > >> ---
> > >> target/riscv/cpu.c | 29 +++++++++++++++++++++++++++++
> > >> 1 file changed, 29 insertions(+)
> > >>
> > >> diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
> > >> index b0a40b83e7a8..2c7ff6ef555a 100644
> > >> --- a/target/riscv/cpu.c
> > >> +++ b/target/riscv/cpu.c
> > >> @@ -34,6 +34,12 @@
> > >>
> > >> /* RISC-V CPU definitions */
> > >>
> > >> +/* This includes the null terminated character '\0' */
> > >> +struct isa_ext_data {
> > >> + const char *name;
> > >> + bool enabled;
> > >> +};
> > >> +
> > >> static const char riscv_exts[26] = "IEMAFDQCLBJTPVNSUHKORWXYZG";
> > >>
> > >> const char * const riscv_int_regnames[] = {
> > >> @@ -881,6 +887,28 @@ static void riscv_cpu_class_init(ObjectClass *c,
> void *data)
> > >> device_class_set_props(dc, riscv_cpu_properties);
> > >> }
> > >>
> > >> +static void riscv_isa_string_ext(RISCVCPU *cpu, char **isa_str, int
> max_str_len)
> > >> +{
> > >> + char *old = *isa_str;
> > >> + char *new = *isa_str;
> > >> + int i;
> > >> + struct isa_ext_data isa_edata_arr[] = {
> > >> + { "svpbmt", cpu->cfg.ext_svpbmt },
> > >> + { "svinval", cpu->cfg.ext_svinval },
> > >> + { "svnapot", cpu->cfg.ext_svnapot },
> > >
> > >
> > > We still have other sub-extensions, e.g. Zfh, Zba, Zbb, Zbc, Zbs...
> etc.
> > > Do you mind adding them as well?
> > >
> >
> > Do we really need it ? Does any OS actually parse it from the device
> tree ?
> > AFAIK, Linux kernel doesn't use them. As the device tree is intended
> > to keep the information useful
> > for supervisor software,
>
> That actually isn't true ;-) .
>
> The devicetree is intended to _describe_ the hardware present in full
> and has really nothing to do with what the userspace needs.
> So the argument "Linux doesn't need this" is never true when talking
> about devicetrees ;-) .
>
Yes. I didn’t mean that way. I was simply asking if these extensions
currently in use. I just mentioned Linux as an example.
The larger point I was trying to make if we should add all the supported
extensions when they are added to Qemu or on a need basis.
I don’t feel strongly either way. So I am okay with the former approach if
that’s what everyone prefers!
>
> On the other hand the devicetree user doesn't need to parse everything
> from DT. So adding code to parse things only really is needed if you
> need that information.
>
Agreed.
> So if some part of the kernel needs to know about those additional
> extensions, the array entries for them can also be added in a later patch.
>
Yes. That was the idea in isa extension framework series where the
extension specific array entries will only be added when support for that
extension is enabled.
>
>
> Heiko
>
> > > Also, I think the order of ISA strings should be alphabetical as
> described:
> > >
> https://github.com/riscv/riscv-isa-manual/blob/master/src/naming.tex#L96
> > >
> >
> > Ahh yes. I will order them in alphabetical order and leave a big
> > comment for future reference as well.
> >
> > > Regards,
> > > Frank Chang
> > >
> > >>
> > >> + };
> > >> +
> > >> + for (i = 0; i < ARRAY_SIZE(isa_edata_arr); i++) {
> > >> + if (isa_edata_arr[i].enabled) {
> > >> + new = g_strconcat(old, "_", isa_edata_arr[i].name, NULL);
> > >> + g_free(old);
> > >> + old = new;
> > >> + }
> > >> + }
> > >> +
> > >> + *isa_str = new;
> > >> +}
> > >> +
> > >> char *riscv_isa_string(RISCVCPU *cpu)
> > >> {
> > >> int i;
> > >> @@ -893,6 +921,7 @@ char *riscv_isa_string(RISCVCPU *cpu)
> > >> }
> > >> }
> > >> *p = '\0';
> > >> + riscv_isa_string_ext(cpu, &isa_str, maxlen);
> > >> return isa_str;
> > >> }
> > >>
> > >> --
> > >> 2.30.2
> > >>
> >
> >
> >
>
>
>
>
>
[-- Attachment #2: Type: text/html, Size: 7960 bytes --]
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v3] target/riscv: Add isa extenstion strings to the device tree
2022-03-05 23:42 ` Atish Kumar Patra
@ 2022-03-06 5:35 ` Frank Chang
2022-03-06 5:51 ` Anup Patel
2022-03-06 6:11 ` Atish Kumar Patra
0 siblings, 2 replies; 15+ messages in thread
From: Frank Chang @ 2022-03-06 5:35 UTC (permalink / raw)
To: Atish Kumar Patra
Cc: open list:RISC-V, Heiko Stuebner, Bin Meng,
qemu-devel@nongnu.org Developers, Palmer Dabbelt, Atish Patra,
Alistair Francis
[-- Attachment #1: Type: text/plain, Size: 5996 bytes --]
On Sun, Mar 6, 2022 at 7:42 AM Atish Kumar Patra <atishp@rivosinc.com>
wrote:
>
>
> On Sat, Mar 5, 2022 at 10:05 AM Heiko Stuebner <heiko@sntech.de> wrote:
>
>> Hi,
>>
>> Am Donnerstag, 3. März 2022, 19:58:38 CET schrieb Atish Patra:
>> > On Fri, Feb 25, 2022 at 11:46 PM Frank Chang <frank.chang@sifive.com>
>> wrote:
>> > > Atish Patra <atishp@rivosinc.com> 於 2022年2月23日 週三 上午6:39寫道:
>> > >>
>> > >> The Linux kernel parses the ISA extensions from "riscv,isa" DT
>> > >> property. It used to parse only the single letter base extensions
>> > >> until now. A generic ISA extension parsing framework was proposed[1]
>> > >> recently that can parse multi-letter ISA extensions as well.
>> > >>
>> > >> Generate the extended ISA string by appending the available ISA
>> extensions
>> > >> to the "riscv,isa" string if it is enabled so that kernel can
>> process it.
>> > >>
>> > >> [1] https://lkml.org/lkml/2022/2/15/263
>> > >>
>> > >> Suggested-by: Heiko Stubner <heiko@sntech.de>
>> > >> Signed-off-by: Atish Patra <atishp@rivosinc.com>
>> > >> ---
>> > >> Changes from v2->v3:
>> > >> 1. Used g_strconcat to replace snprintf & a max isa string length as
>> > >> suggested by Anup.
>> > >> 2. I have not included the Tested-by Tag from Heiko because the
>> > >> implementation changed from v2 to v3.
>> > >>
>> > >> Changes from v1->v2:
>> > >> 1. Improved the code redability by using arrays instead of
>> individual check
>> > >> ---
>> > >> target/riscv/cpu.c | 29 +++++++++++++++++++++++++++++
>> > >> 1 file changed, 29 insertions(+)
>> > >>
>> > >> diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
>> > >> index b0a40b83e7a8..2c7ff6ef555a 100644
>> > >> --- a/target/riscv/cpu.c
>> > >> +++ b/target/riscv/cpu.c
>> > >> @@ -34,6 +34,12 @@
>> > >>
>> > >> /* RISC-V CPU definitions */
>> > >>
>> > >> +/* This includes the null terminated character '\0' */
>> > >> +struct isa_ext_data {
>> > >> + const char *name;
>> > >> + bool enabled;
>> > >> +};
>> > >> +
>> > >> static const char riscv_exts[26] = "IEMAFDQCLBJTPVNSUHKORWXYZG";
>> > >>
>> > >> const char * const riscv_int_regnames[] = {
>> > >> @@ -881,6 +887,28 @@ static void riscv_cpu_class_init(ObjectClass
>> *c, void *data)
>> > >> device_class_set_props(dc, riscv_cpu_properties);
>> > >> }
>> > >>
>> > >> +static void riscv_isa_string_ext(RISCVCPU *cpu, char **isa_str, int
>> max_str_len)
>> > >> +{
>> > >> + char *old = *isa_str;
>> > >> + char *new = *isa_str;
>> > >> + int i;
>> > >> + struct isa_ext_data isa_edata_arr[] = {
>> > >> + { "svpbmt", cpu->cfg.ext_svpbmt },
>> > >> + { "svinval", cpu->cfg.ext_svinval },
>> > >> + { "svnapot", cpu->cfg.ext_svnapot },
>> > >
>> > >
>> > > We still have other sub-extensions, e.g. Zfh, Zba, Zbb, Zbc, Zbs...
>> etc.
>> > > Do you mind adding them as well?
>> > >
>> >
>> > Do we really need it ? Does any OS actually parse it from the device
>> tree ?
>> > AFAIK, Linux kernel doesn't use them. As the device tree is intended
>> > to keep the information useful
>> > for supervisor software,
>>
>> That actually isn't true ;-) .
>>
>> The devicetree is intended to _describe_ the hardware present in full
>> and has really nothing to do with what the userspace needs.
>> So the argument "Linux doesn't need this" is never true when talking
>> about devicetrees ;-) .
>>
>
> Yes. I didn’t mean that way. I was simply asking if these extensions
> currently in use. I just mentioned Linux as an example.
>
> The larger point I was trying to make if we should add all the supported
> extensions when they are added to Qemu or on a need basis.
>
> I don’t feel strongly either way. So I am okay with the former approach if
> that’s what everyone prefers!
>
Linux Kernel itself might not,
but userspace applications may query /proc/cpuinfo to get core's
capabilities, e.g. for those vector applications.
It really depends on how the application is written.
I still think adding all the enabled extensions into the isa string would
be a proper solution, no matter they are used or not.
However, we can leave that beyond this patch.
Regards,
Frank Chang
>
>> On the other hand the devicetree user doesn't need to parse everything
>> from DT. So adding code to parse things only really is needed if you
>> need that information.
>>
>
> Agreed.
>
>
>> So if some part of the kernel needs to know about those additional
>> extensions, the array entries for them can also be added in a later patch.
>>
>
> Yes. That was the idea in isa extension framework series where the
> extension specific array entries will only be added when support for that
> extension is enabled.
>
>>
>>
>> Heiko
>>
>> > > Also, I think the order of ISA strings should be alphabetical as
>> described:
>> > >
>> https://github.com/riscv/riscv-isa-manual/blob/master/src/naming.tex#L96
>> > >
>> >
>> > Ahh yes. I will order them in alphabetical order and leave a big
>> > comment for future reference as well.
>> >
>> > > Regards,
>> > > Frank Chang
>> > >
>> > >>
>> > >> + };
>> > >> +
>> > >> + for (i = 0; i < ARRAY_SIZE(isa_edata_arr); i++) {
>> > >> + if (isa_edata_arr[i].enabled) {
>> > >> + new = g_strconcat(old, "_", isa_edata_arr[i].name,
>> NULL);
>> > >> + g_free(old);
>> > >> + old = new;
>> > >> + }
>> > >> + }
>> > >> +
>> > >> + *isa_str = new;
>> > >> +}
>> > >> +
>> > >> char *riscv_isa_string(RISCVCPU *cpu)
>> > >> {
>> > >> int i;
>> > >> @@ -893,6 +921,7 @@ char *riscv_isa_string(RISCVCPU *cpu)
>> > >> }
>> > >> }
>> > >> *p = '\0';
>> > >> + riscv_isa_string_ext(cpu, &isa_str, maxlen);
>> > >> return isa_str;
>> > >> }
>> > >>
>> > >> --
>> > >> 2.30.2
>> > >>
>> >
>> >
>> >
>>
>>
>>
>>
>>
[-- Attachment #2: Type: text/html, Size: 9092 bytes --]
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v3] target/riscv: Add isa extenstion strings to the device tree
2022-03-06 5:35 ` Frank Chang
@ 2022-03-06 5:51 ` Anup Patel
2022-03-06 6:11 ` Atish Kumar Patra
1 sibling, 0 replies; 15+ messages in thread
From: Anup Patel @ 2022-03-06 5:51 UTC (permalink / raw)
To: Frank Chang
Cc: open list:RISC-V, Heiko Stuebner, Bin Meng, Atish Kumar Patra,
qemu-devel@nongnu.org Developers, Palmer Dabbelt, Atish Patra,
Alistair Francis
On Sun, Mar 6, 2022 at 11:06 AM Frank Chang <frank.chang@sifive.com> wrote:
>
> On Sun, Mar 6, 2022 at 7:42 AM Atish Kumar Patra <atishp@rivosinc.com> wrote:
>>
>>
>>
>> On Sat, Mar 5, 2022 at 10:05 AM Heiko Stuebner <heiko@sntech.de> wrote:
>>>
>>> Hi,
>>>
>>> Am Donnerstag, 3. März 2022, 19:58:38 CET schrieb Atish Patra:
>>> > On Fri, Feb 25, 2022 at 11:46 PM Frank Chang <frank.chang@sifive.com> wrote:
>>> > > Atish Patra <atishp@rivosinc.com> 於 2022年2月23日 週三 上午6:39寫道:
>>> > >>
>>> > >> The Linux kernel parses the ISA extensions from "riscv,isa" DT
>>> > >> property. It used to parse only the single letter base extensions
>>> > >> until now. A generic ISA extension parsing framework was proposed[1]
>>> > >> recently that can parse multi-letter ISA extensions as well.
>>> > >>
>>> > >> Generate the extended ISA string by appending the available ISA extensions
>>> > >> to the "riscv,isa" string if it is enabled so that kernel can process it.
>>> > >>
>>> > >> [1] https://lkml.org/lkml/2022/2/15/263
>>> > >>
>>> > >> Suggested-by: Heiko Stubner <heiko@sntech.de>
>>> > >> Signed-off-by: Atish Patra <atishp@rivosinc.com>
>>> > >> ---
>>> > >> Changes from v2->v3:
>>> > >> 1. Used g_strconcat to replace snprintf & a max isa string length as
>>> > >> suggested by Anup.
>>> > >> 2. I have not included the Tested-by Tag from Heiko because the
>>> > >> implementation changed from v2 to v3.
>>> > >>
>>> > >> Changes from v1->v2:
>>> > >> 1. Improved the code redability by using arrays instead of individual check
>>> > >> ---
>>> > >> target/riscv/cpu.c | 29 +++++++++++++++++++++++++++++
>>> > >> 1 file changed, 29 insertions(+)
>>> > >>
>>> > >> diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
>>> > >> index b0a40b83e7a8..2c7ff6ef555a 100644
>>> > >> --- a/target/riscv/cpu.c
>>> > >> +++ b/target/riscv/cpu.c
>>> > >> @@ -34,6 +34,12 @@
>>> > >>
>>> > >> /* RISC-V CPU definitions */
>>> > >>
>>> > >> +/* This includes the null terminated character '\0' */
>>> > >> +struct isa_ext_data {
>>> > >> + const char *name;
>>> > >> + bool enabled;
>>> > >> +};
>>> > >> +
>>> > >> static const char riscv_exts[26] = "IEMAFDQCLBJTPVNSUHKORWXYZG";
>>> > >>
>>> > >> const char * const riscv_int_regnames[] = {
>>> > >> @@ -881,6 +887,28 @@ static void riscv_cpu_class_init(ObjectClass *c, void *data)
>>> > >> device_class_set_props(dc, riscv_cpu_properties);
>>> > >> }
>>> > >>
>>> > >> +static void riscv_isa_string_ext(RISCVCPU *cpu, char **isa_str, int max_str_len)
>>> > >> +{
>>> > >> + char *old = *isa_str;
>>> > >> + char *new = *isa_str;
>>> > >> + int i;
>>> > >> + struct isa_ext_data isa_edata_arr[] = {
>>> > >> + { "svpbmt", cpu->cfg.ext_svpbmt },
>>> > >> + { "svinval", cpu->cfg.ext_svinval },
>>> > >> + { "svnapot", cpu->cfg.ext_svnapot },
>>> > >
>>> > >
>>> > > We still have other sub-extensions, e.g. Zfh, Zba, Zbb, Zbc, Zbs... etc.
>>> > > Do you mind adding them as well?
>>> > >
>>> >
>>> > Do we really need it ? Does any OS actually parse it from the device tree ?
>>> > AFAIK, Linux kernel doesn't use them. As the device tree is intended
>>> > to keep the information useful
>>> > for supervisor software,
>>>
>>> That actually isn't true ;-) .
>>>
>>> The devicetree is intended to _describe_ the hardware present in full
>>> and has really nothing to do with what the userspace needs.
>>> So the argument "Linux doesn't need this" is never true when talking
>>> about devicetrees ;-) .
>>
>>
>> Yes. I didn’t mean that way. I was simply asking if these extensions currently in use. I just mentioned Linux as an example.
>>
>> The larger point I was trying to make if we should add all the supported extensions when they are added to Qemu or on a need basis.
>>
>> I don’t feel strongly either way. So I am okay with the former approach if that’s what everyone prefers!
>
>
> Linux Kernel itself might not,
> but userspace applications may query /proc/cpuinfo to get core's capabilities, e.g. for those vector applications.
> It really depends on how the application is written.
>
> I still think adding all the enabled extensions into the isa string would be a proper solution, no matter they are used or not.
> However, we can leave that beyond this patch.
I agree. Adding all enabled extensions in ISA string is aligned with
what this patch is doing so no harm in updating this patch.
Regards,
Anup
>
> Regards,
> Frank Chang
>
>>>
>>>
>>> On the other hand the devicetree user doesn't need to parse everything
>>> from DT. So adding code to parse things only really is needed if you
>>> need that information.
>>
>>
>> Agreed.
>>
>>>
>>> So if some part of the kernel needs to know about those additional
>>> extensions, the array entries for them can also be added in a later patch.
>>
>>
>> Yes. That was the idea in isa extension framework series where the extension specific array entries will only be added when support for that extension is enabled.
>>>
>>>
>>>
>>> Heiko
>>>
>>> > > Also, I think the order of ISA strings should be alphabetical as described:
>>> > > https://github.com/riscv/riscv-isa-manual/blob/master/src/naming.tex#L96
>>> > >
>>> >
>>> > Ahh yes. I will order them in alphabetical order and leave a big
>>> > comment for future reference as well.
>>> >
>>> > > Regards,
>>> > > Frank Chang
>>> > >
>>> > >>
>>> > >> + };
>>> > >> +
>>> > >> + for (i = 0; i < ARRAY_SIZE(isa_edata_arr); i++) {
>>> > >> + if (isa_edata_arr[i].enabled) {
>>> > >> + new = g_strconcat(old, "_", isa_edata_arr[i].name, NULL);
>>> > >> + g_free(old);
>>> > >> + old = new;
>>> > >> + }
>>> > >> + }
>>> > >> +
>>> > >> + *isa_str = new;
>>> > >> +}
>>> > >> +
>>> > >> char *riscv_isa_string(RISCVCPU *cpu)
>>> > >> {
>>> > >> int i;
>>> > >> @@ -893,6 +921,7 @@ char *riscv_isa_string(RISCVCPU *cpu)
>>> > >> }
>>> > >> }
>>> > >> *p = '\0';
>>> > >> + riscv_isa_string_ext(cpu, &isa_str, maxlen);
>>> > >> return isa_str;
>>> > >> }
>>> > >>
>>> > >> --
>>> > >> 2.30.2
>>> > >>
>>> >
>>> >
>>> >
>>>
>>>
>>>
>>>
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v3] target/riscv: Add isa extenstion strings to the device tree
2022-03-06 5:35 ` Frank Chang
2022-03-06 5:51 ` Anup Patel
@ 2022-03-06 6:11 ` Atish Kumar Patra
2022-03-06 6:43 ` Frank Chang
1 sibling, 1 reply; 15+ messages in thread
From: Atish Kumar Patra @ 2022-03-06 6:11 UTC (permalink / raw)
To: Frank Chang
Cc: open list:RISC-V, Heiko Stuebner, Bin Meng,
qemu-devel@nongnu.org Developers, Palmer Dabbelt, Atish Patra,
Alistair Francis
[-- Attachment #1: Type: text/plain, Size: 6364 bytes --]
On Sat, Mar 5, 2022 at 9:36 PM Frank Chang <frank.chang@sifive.com> wrote:
> On Sun, Mar 6, 2022 at 7:42 AM Atish Kumar Patra <atishp@rivosinc.com>
> wrote:
>
>>
>>
>> On Sat, Mar 5, 2022 at 10:05 AM Heiko Stuebner <heiko@sntech.de> wrote:
>>
>>> Hi,
>>>
>>> Am Donnerstag, 3. März 2022, 19:58:38 CET schrieb Atish Patra:
>>> > On Fri, Feb 25, 2022 at 11:46 PM Frank Chang <frank.chang@sifive.com>
>>> wrote:
>>> > > Atish Patra <atishp@rivosinc.com> 於 2022年2月23日 週三 上午6:39寫道:
>>> > >>
>>> > >> The Linux kernel parses the ISA extensions from "riscv,isa" DT
>>> > >> property. It used to parse only the single letter base extensions
>>> > >> until now. A generic ISA extension parsing framework was proposed[1]
>>> > >> recently that can parse multi-letter ISA extensions as well.
>>> > >>
>>> > >> Generate the extended ISA string by appending the available ISA
>>> extensions
>>> > >> to the "riscv,isa" string if it is enabled so that kernel can
>>> process it.
>>> > >>
>>> > >> [1] https://lkml.org/lkml/2022/2/15/263
>>> > >>
>>> > >> Suggested-by: Heiko Stubner <heiko@sntech.de>
>>> > >> Signed-off-by: Atish Patra <atishp@rivosinc.com>
>>> > >> ---
>>> > >> Changes from v2->v3:
>>> > >> 1. Used g_strconcat to replace snprintf & a max isa string length as
>>> > >> suggested by Anup.
>>> > >> 2. I have not included the Tested-by Tag from Heiko because the
>>> > >> implementation changed from v2 to v3.
>>> > >>
>>> > >> Changes from v1->v2:
>>> > >> 1. Improved the code redability by using arrays instead of
>>> individual check
>>> > >> ---
>>> > >> target/riscv/cpu.c | 29 +++++++++++++++++++++++++++++
>>> > >> 1 file changed, 29 insertions(+)
>>> > >>
>>> > >> diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
>>> > >> index b0a40b83e7a8..2c7ff6ef555a 100644
>>> > >> --- a/target/riscv/cpu.c
>>> > >> +++ b/target/riscv/cpu.c
>>> > >> @@ -34,6 +34,12 @@
>>> > >>
>>> > >> /* RISC-V CPU definitions */
>>> > >>
>>> > >> +/* This includes the null terminated character '\0' */
>>> > >> +struct isa_ext_data {
>>> > >> + const char *name;
>>> > >> + bool enabled;
>>> > >> +};
>>> > >> +
>>> > >> static const char riscv_exts[26] = "IEMAFDQCLBJTPVNSUHKORWXYZG";
>>> > >>
>>> > >> const char * const riscv_int_regnames[] = {
>>> > >> @@ -881,6 +887,28 @@ static void riscv_cpu_class_init(ObjectClass
>>> *c, void *data)
>>> > >> device_class_set_props(dc, riscv_cpu_properties);
>>> > >> }
>>> > >>
>>> > >> +static void riscv_isa_string_ext(RISCVCPU *cpu, char **isa_str,
>>> int max_str_len)
>>> > >> +{
>>> > >> + char *old = *isa_str;
>>> > >> + char *new = *isa_str;
>>> > >> + int i;
>>> > >> + struct isa_ext_data isa_edata_arr[] = {
>>> > >> + { "svpbmt", cpu->cfg.ext_svpbmt },
>>> > >> + { "svinval", cpu->cfg.ext_svinval },
>>> > >> + { "svnapot", cpu->cfg.ext_svnapot },
>>> > >
>>> > >
>>> > > We still have other sub-extensions, e.g. Zfh, Zba, Zbb, Zbc, Zbs...
>>> etc.
>>> > > Do you mind adding them as well?
>>> > >
>>> >
>>> > Do we really need it ? Does any OS actually parse it from the device
>>> tree ?
>>> > AFAIK, Linux kernel doesn't use them. As the device tree is intended
>>> > to keep the information useful
>>> > for supervisor software,
>>>
>>> That actually isn't true ;-) .
>>>
>>> The devicetree is intended to _describe_ the hardware present in full
>>> and has really nothing to do with what the userspace needs.
>>> So the argument "Linux doesn't need this" is never true when talking
>>> about devicetrees ;-) .
>>>
>>
>> Yes. I didn’t mean that way. I was simply asking if these extensions
>> currently in use. I just mentioned Linux as an example.
>>
>> The larger point I was trying to make if we should add all the supported
>> extensions when they are added to Qemu or on a need basis.
>>
>> I don’t feel strongly either way. So I am okay with the former approach
>> if that’s what everyone prefers!
>>
>
> Linux Kernel itself might not,
> but userspace applications may query /proc/cpuinfo to get core's
> capabilities, e.g. for those vector applications.
> It really depends on how the application is written.
>
> I still think adding all the enabled extensions into the isa string would
> be a proper solution, no matter they are used or not.
> However, we can leave that beyond this patch.
>
Fair enough. I will update the patch to include all the extension available.
> Regards,
> Frank Chang
>
>
>>
>>> On the other hand the devicetree user doesn't need to parse everything
>>> from DT. So adding code to parse things only really is needed if you
>>> need that information.
>>>
>>
>> Agreed.
>>
>>
>>> So if some part of the kernel needs to know about those additional
>>> extensions, the array entries for them can also be added in a later
>>> patch.
>>>
>>
>> Yes. That was the idea in isa extension framework series where the
>> extension specific array entries will only be added when support for that
>> extension is enabled.
>>
>>>
>>>
>>> Heiko
>>>
>>> > > Also, I think the order of ISA strings should be alphabetical as
>>> described:
>>> > >
>>> https://github.com/riscv/riscv-isa-manual/blob/master/src/naming.tex#L96
>>> > >
>>> >
>>> > Ahh yes. I will order them in alphabetical order and leave a big
>>> > comment for future reference as well.
>>> >
>>> > > Regards,
>>> > > Frank Chang
>>> > >
>>> > >>
>>> > >> + };
>>> > >> +
>>> > >> + for (i = 0; i < ARRAY_SIZE(isa_edata_arr); i++) {
>>> > >> + if (isa_edata_arr[i].enabled) {
>>> > >> + new = g_strconcat(old, "_", isa_edata_arr[i].name,
>>> NULL);
>>> > >> + g_free(old);
>>> > >> + old = new;
>>> > >> + }
>>> > >> + }
>>> > >> +
>>> > >> + *isa_str = new;
>>> > >> +}
>>> > >> +
>>> > >> char *riscv_isa_string(RISCVCPU *cpu)
>>> > >> {
>>> > >> int i;
>>> > >> @@ -893,6 +921,7 @@ char *riscv_isa_string(RISCVCPU *cpu)
>>> > >> }
>>> > >> }
>>> > >> *p = '\0';
>>> > >> + riscv_isa_string_ext(cpu, &isa_str, maxlen);
>>> > >> return isa_str;
>>> > >> }
>>> > >>
>>> > >> --
>>> > >> 2.30.2
>>> > >>
>>> >
>>> >
>>> >
>>>
>>>
>>>
>>>
>>>
[-- Attachment #2: Type: text/html, Size: 10380 bytes --]
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v3] target/riscv: Add isa extenstion strings to the device tree
2022-03-06 6:11 ` Atish Kumar Patra
@ 2022-03-06 6:43 ` Frank Chang
2022-03-08 22:53 ` Atish Patra
0 siblings, 1 reply; 15+ messages in thread
From: Frank Chang @ 2022-03-06 6:43 UTC (permalink / raw)
To: Atish Kumar Patra
Cc: open list:RISC-V, Heiko Stuebner, Bin Meng,
qemu-devel@nongnu.org Developers, Palmer Dabbelt, Atish Patra,
Alistair Francis
[-- Attachment #1: Type: text/plain, Size: 6977 bytes --]
On Sun, Mar 6, 2022 at 2:12 PM Atish Kumar Patra <atishp@rivosinc.com>
wrote:
>
>
> On Sat, Mar 5, 2022 at 9:36 PM Frank Chang <frank.chang@sifive.com> wrote:
>
>> On Sun, Mar 6, 2022 at 7:42 AM Atish Kumar Patra <atishp@rivosinc.com>
>> wrote:
>>
>>>
>>>
>>> On Sat, Mar 5, 2022 at 10:05 AM Heiko Stuebner <heiko@sntech.de> wrote:
>>>
>>>> Hi,
>>>>
>>>> Am Donnerstag, 3. März 2022, 19:58:38 CET schrieb Atish Patra:
>>>> > On Fri, Feb 25, 2022 at 11:46 PM Frank Chang <frank.chang@sifive.com>
>>>> wrote:
>>>> > > Atish Patra <atishp@rivosinc.com> 於 2022年2月23日 週三 上午6:39寫道:
>>>> > >>
>>>> > >> The Linux kernel parses the ISA extensions from "riscv,isa" DT
>>>> > >> property. It used to parse only the single letter base extensions
>>>> > >> until now. A generic ISA extension parsing framework was
>>>> proposed[1]
>>>> > >> recently that can parse multi-letter ISA extensions as well.
>>>> > >>
>>>> > >> Generate the extended ISA string by appending the available ISA
>>>> extensions
>>>> > >> to the "riscv,isa" string if it is enabled so that kernel can
>>>> process it.
>>>> > >>
>>>> > >> [1] https://lkml.org/lkml/2022/2/15/263
>>>> > >>
>>>> > >> Suggested-by: Heiko Stubner <heiko@sntech.de>
>>>> > >> Signed-off-by: Atish Patra <atishp@rivosinc.com>
>>>> > >> ---
>>>> > >> Changes from v2->v3:
>>>> > >> 1. Used g_strconcat to replace snprintf & a max isa string length
>>>> as
>>>> > >> suggested by Anup.
>>>> > >> 2. I have not included the Tested-by Tag from Heiko because the
>>>> > >> implementation changed from v2 to v3.
>>>> > >>
>>>> > >> Changes from v1->v2:
>>>> > >> 1. Improved the code redability by using arrays instead of
>>>> individual check
>>>> > >> ---
>>>> > >> target/riscv/cpu.c | 29 +++++++++++++++++++++++++++++
>>>> > >> 1 file changed, 29 insertions(+)
>>>> > >>
>>>> > >> diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
>>>> > >> index b0a40b83e7a8..2c7ff6ef555a 100644
>>>> > >> --- a/target/riscv/cpu.c
>>>> > >> +++ b/target/riscv/cpu.c
>>>> > >> @@ -34,6 +34,12 @@
>>>> > >>
>>>> > >> /* RISC-V CPU definitions */
>>>> > >>
>>>> > >> +/* This includes the null terminated character '\0' */
>>>> > >> +struct isa_ext_data {
>>>> > >> + const char *name;
>>>> > >> + bool enabled;
>>>> > >> +};
>>>> > >> +
>>>> > >> static const char riscv_exts[26] = "IEMAFDQCLBJTPVNSUHKORWXYZG";
>>>> > >>
>>>> > >> const char * const riscv_int_regnames[] = {
>>>> > >> @@ -881,6 +887,28 @@ static void riscv_cpu_class_init(ObjectClass
>>>> *c, void *data)
>>>> > >> device_class_set_props(dc, riscv_cpu_properties);
>>>> > >> }
>>>> > >>
>>>> > >> +static void riscv_isa_string_ext(RISCVCPU *cpu, char **isa_str,
>>>> int max_str_len)
>>>> > >> +{
>>>> > >> + char *old = *isa_str;
>>>> > >> + char *new = *isa_str;
>>>> > >> + int i;
>>>> > >> + struct isa_ext_data isa_edata_arr[] = {
>>>> > >> + { "svpbmt", cpu->cfg.ext_svpbmt },
>>>> > >> + { "svinval", cpu->cfg.ext_svinval },
>>>> > >> + { "svnapot", cpu->cfg.ext_svnapot },
>>>> > >
>>>> > >
>>>> > > We still have other sub-extensions, e.g. Zfh, Zba, Zbb, Zbc, Zbs...
>>>> etc.
>>>> > > Do you mind adding them as well?
>>>> > >
>>>> >
>>>> > Do we really need it ? Does any OS actually parse it from the device
>>>> tree ?
>>>> > AFAIK, Linux kernel doesn't use them. As the device tree is intended
>>>> > to keep the information useful
>>>> > for supervisor software,
>>>>
>>>> That actually isn't true ;-) .
>>>>
>>>> The devicetree is intended to _describe_ the hardware present in full
>>>> and has really nothing to do with what the userspace needs.
>>>> So the argument "Linux doesn't need this" is never true when talking
>>>> about devicetrees ;-) .
>>>>
>>>
>>> Yes. I didn’t mean that way. I was simply asking if these extensions
>>> currently in use. I just mentioned Linux as an example.
>>>
>>> The larger point I was trying to make if we should add all the supported
>>> extensions when they are added to Qemu or on a need basis.
>>>
>>> I don’t feel strongly either way. So I am okay with the former approach
>>> if that’s what everyone prefers!
>>>
>>
>> Linux Kernel itself might not,
>> but userspace applications may query /proc/cpuinfo to get core's
>> capabilities, e.g. for those vector applications.
>> It really depends on how the application is written.
>>
>> I still think adding all the enabled extensions into the isa string would
>> be a proper solution, no matter they are used or not.
>> However, we can leave that beyond this patch.
>>
>
>
> Fair enough. I will update the patch to include all the extension
> available.
>
Thanks, that would be great.
BTW, I think current QEMU RISC-V isa string includes both "s" and "u":
https://github.com/qemu/qemu/blob/master/target/riscv/cpu.c#L37
But in fact, they should not be presented in the DTS isa string.
Do you think we should exclude them as well?
Regards,
Frank Chang
>
>> Regards,
>> Frank Chang
>>
>>
>>>
>>>> On the other hand the devicetree user doesn't need to parse everything
>>>> from DT. So adding code to parse things only really is needed if you
>>>> need that information.
>>>>
>>>
>>> Agreed.
>>>
>>>
>>>> So if some part of the kernel needs to know about those additional
>>>> extensions, the array entries for them can also be added in a later
>>>> patch.
>>>>
>>>
>>> Yes. That was the idea in isa extension framework series where the
>>> extension specific array entries will only be added when support for that
>>> extension is enabled.
>>>
>>>>
>>>>
>>>> Heiko
>>>>
>>>> > > Also, I think the order of ISA strings should be alphabetical as
>>>> described:
>>>> > >
>>>> https://github.com/riscv/riscv-isa-manual/blob/master/src/naming.tex#L96
>>>> > >
>>>> >
>>>> > Ahh yes. I will order them in alphabetical order and leave a big
>>>> > comment for future reference as well.
>>>> >
>>>> > > Regards,
>>>> > > Frank Chang
>>>> > >
>>>> > >>
>>>> > >> + };
>>>> > >> +
>>>> > >> + for (i = 0; i < ARRAY_SIZE(isa_edata_arr); i++) {
>>>> > >> + if (isa_edata_arr[i].enabled) {
>>>> > >> + new = g_strconcat(old, "_", isa_edata_arr[i].name,
>>>> NULL);
>>>> > >> + g_free(old);
>>>> > >> + old = new;
>>>> > >> + }
>>>> > >> + }
>>>> > >> +
>>>> > >> + *isa_str = new;
>>>> > >> +}
>>>> > >> +
>>>> > >> char *riscv_isa_string(RISCVCPU *cpu)
>>>> > >> {
>>>> > >> int i;
>>>> > >> @@ -893,6 +921,7 @@ char *riscv_isa_string(RISCVCPU *cpu)
>>>> > >> }
>>>> > >> }
>>>> > >> *p = '\0';
>>>> > >> + riscv_isa_string_ext(cpu, &isa_str, maxlen);
>>>> > >> return isa_str;
>>>> > >> }
>>>> > >>
>>>> > >> --
>>>> > >> 2.30.2
>>>> > >>
>>>> >
>>>> >
>>>> >
>>>>
>>>>
>>>>
>>>>
>>>>
[-- Attachment #2: Type: text/html, Size: 11101 bytes --]
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v3] target/riscv: Add isa extenstion strings to the device tree
2022-02-26 7:45 ` Frank Chang
2022-03-03 18:58 ` Atish Patra
@ 2022-03-06 6:47 ` Frank Chang
2022-03-08 22:52 ` Atish Patra
1 sibling, 1 reply; 15+ messages in thread
From: Frank Chang @ 2022-03-06 6:47 UTC (permalink / raw)
To: Atish Patra
Cc: open list:RISC-V, Heiko Stubner, Bin Meng,
qemu-devel@nongnu.org Developers, Alistair Francis,
Palmer Dabbelt
[-- Attachment #1: Type: text/plain, Size: 3273 bytes --]
Typo in patch title:
s/extenstion/extension/g
Regards,
Frank Chang
On Sat, Feb 26, 2022 at 3:45 PM Frank Chang <frank.chang@sifive.com> wrote:
>
>
> Atish Patra <atishp@rivosinc.com> 於 2022年2月23日 週三 上午6:39寫道:
>
>> The Linux kernel parses the ISA extensions from "riscv,isa" DT
>> property. It used to parse only the single letter base extensions
>> until now. A generic ISA extension parsing framework was proposed[1]
>> recently that can parse multi-letter ISA extensions as well.
>>
>> Generate the extended ISA string by appending the available ISA
>> extensions
>> to the "riscv,isa" string if it is enabled so that kernel can process it.
>>
>> [1] https://lkml.org/lkml/2022/2/15/263
>>
>> Suggested-by: Heiko Stubner <heiko@sntech.de>
>> Signed-off-by: Atish Patra <atishp@rivosinc.com>
>> ---
>> Changes from v2->v3:
>> 1. Used g_strconcat to replace snprintf & a max isa string length as
>> suggested by Anup.
>> 2. I have not included the Tested-by Tag from Heiko because the
>> implementation changed from v2 to v3.
>>
>> Changes from v1->v2:
>> 1. Improved the code redability by using arrays instead of individual
>> check
>> ---
>> target/riscv/cpu.c | 29 +++++++++++++++++++++++++++++
>> 1 file changed, 29 insertions(+)
>>
>> diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
>> index b0a40b83e7a8..2c7ff6ef555a 100644
>> --- a/target/riscv/cpu.c
>> +++ b/target/riscv/cpu.c
>> @@ -34,6 +34,12 @@
>>
>> /* RISC-V CPU definitions */
>>
>> +/* This includes the null terminated character '\0' */
>> +struct isa_ext_data {
>> + const char *name;
>> + bool enabled;
>> +};
>> +
>> static const char riscv_exts[26] = "IEMAFDQCLBJTPVNSUHKORWXYZG";
>>
>> const char * const riscv_int_regnames[] = {
>> @@ -881,6 +887,28 @@ static void riscv_cpu_class_init(ObjectClass *c,
>> void *data)
>> device_class_set_props(dc, riscv_cpu_properties);
>> }
>>
>> +static void riscv_isa_string_ext(RISCVCPU *cpu, char **isa_str, int
>> max_str_len)
>> +{
>> + char *old = *isa_str;
>> + char *new = *isa_str;
>> + int i;
>> + struct isa_ext_data isa_edata_arr[] = {
>> + { "svpbmt", cpu->cfg.ext_svpbmt },
>> + { "svinval", cpu->cfg.ext_svinval },
>> + { "svnapot", cpu->cfg.ext_svnapot },
>>
>
> We still have other sub-extensions, e.g. Zfh, Zba, Zbb, Zbc, Zbs... etc.
> Do you mind adding them as well?
>
> Also, I think the order of ISA strings should be alphabetical as described:
> https://github.com/riscv/riscv-isa-manual/blob/master/src/naming.tex#L96
>
> Regards,
> Frank Chang
>
>
>> + };
>> +
>> + for (i = 0; i < ARRAY_SIZE(isa_edata_arr); i++) {
>> + if (isa_edata_arr[i].enabled) {
>> + new = g_strconcat(old, "_", isa_edata_arr[i].name, NULL);
>> + g_free(old);
>> + old = new;
>> + }
>> + }
>> +
>> + *isa_str = new;
>> +}
>> +
>> char *riscv_isa_string(RISCVCPU *cpu)
>> {
>> int i;
>> @@ -893,6 +921,7 @@ char *riscv_isa_string(RISCVCPU *cpu)
>> }
>> }
>> *p = '\0';
>> + riscv_isa_string_ext(cpu, &isa_str, maxlen);
>> return isa_str;
>> }
>>
>> --
>> 2.30.2
>>
>>
[-- Attachment #2: Type: text/html, Size: 4722 bytes --]
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v3] target/riscv: Add isa extenstion strings to the device tree
2022-03-06 6:47 ` Frank Chang
@ 2022-03-08 22:52 ` Atish Patra
0 siblings, 0 replies; 15+ messages in thread
From: Atish Patra @ 2022-03-08 22:52 UTC (permalink / raw)
To: Frank Chang
Cc: open list:RISC-V, Heiko Stubner, Bin Meng, Atish Patra,
qemu-devel@nongnu.org Developers, Alistair Francis,
Palmer Dabbelt
On Sat, Mar 5, 2022 at 10:47 PM Frank Chang <frank.chang@sifive.com> wrote:
>
> Typo in patch title:
> s/extenstion/extension/g
>
Thanks for catching it. Will fix it.
> Regards,
> Frank Chang
>
> On Sat, Feb 26, 2022 at 3:45 PM Frank Chang <frank.chang@sifive.com> wrote:
>>
>>
>>
>> Atish Patra <atishp@rivosinc.com> 於 2022年2月23日 週三 上午6:39寫道:
>>>
>>> The Linux kernel parses the ISA extensions from "riscv,isa" DT
>>> property. It used to parse only the single letter base extensions
>>> until now. A generic ISA extension parsing framework was proposed[1]
>>> recently that can parse multi-letter ISA extensions as well.
>>>
>>> Generate the extended ISA string by appending the available ISA extensions
>>> to the "riscv,isa" string if it is enabled so that kernel can process it.
>>>
>>> [1] https://lkml.org/lkml/2022/2/15/263
>>>
>>> Suggested-by: Heiko Stubner <heiko@sntech.de>
>>> Signed-off-by: Atish Patra <atishp@rivosinc.com>
>>> ---
>>> Changes from v2->v3:
>>> 1. Used g_strconcat to replace snprintf & a max isa string length as
>>> suggested by Anup.
>>> 2. I have not included the Tested-by Tag from Heiko because the
>>> implementation changed from v2 to v3.
>>>
>>> Changes from v1->v2:
>>> 1. Improved the code redability by using arrays instead of individual check
>>> ---
>>> target/riscv/cpu.c | 29 +++++++++++++++++++++++++++++
>>> 1 file changed, 29 insertions(+)
>>>
>>> diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
>>> index b0a40b83e7a8..2c7ff6ef555a 100644
>>> --- a/target/riscv/cpu.c
>>> +++ b/target/riscv/cpu.c
>>> @@ -34,6 +34,12 @@
>>>
>>> /* RISC-V CPU definitions */
>>>
>>> +/* This includes the null terminated character '\0' */
>>> +struct isa_ext_data {
>>> + const char *name;
>>> + bool enabled;
>>> +};
>>> +
>>> static const char riscv_exts[26] = "IEMAFDQCLBJTPVNSUHKORWXYZG";
>>>
>>> const char * const riscv_int_regnames[] = {
>>> @@ -881,6 +887,28 @@ static void riscv_cpu_class_init(ObjectClass *c, void *data)
>>> device_class_set_props(dc, riscv_cpu_properties);
>>> }
>>>
>>> +static void riscv_isa_string_ext(RISCVCPU *cpu, char **isa_str, int max_str_len)
>>> +{
>>> + char *old = *isa_str;
>>> + char *new = *isa_str;
>>> + int i;
>>> + struct isa_ext_data isa_edata_arr[] = {
>>> + { "svpbmt", cpu->cfg.ext_svpbmt },
>>> + { "svinval", cpu->cfg.ext_svinval },
>>> + { "svnapot", cpu->cfg.ext_svnapot },
>>
>>
>> We still have other sub-extensions, e.g. Zfh, Zba, Zbb, Zbc, Zbs... etc.
>> Do you mind adding them as well?
>>
>> Also, I think the order of ISA strings should be alphabetical as described:
>> https://github.com/riscv/riscv-isa-manual/blob/master/src/naming.tex#L96
>>
>> Regards,
>> Frank Chang
>>
>>>
>>> + };
>>> +
>>> + for (i = 0; i < ARRAY_SIZE(isa_edata_arr); i++) {
>>> + if (isa_edata_arr[i].enabled) {
>>> + new = g_strconcat(old, "_", isa_edata_arr[i].name, NULL);
>>> + g_free(old);
>>> + old = new;
>>> + }
>>> + }
>>> +
>>> + *isa_str = new;
>>> +}
>>> +
>>> char *riscv_isa_string(RISCVCPU *cpu)
>>> {
>>> int i;
>>> @@ -893,6 +921,7 @@ char *riscv_isa_string(RISCVCPU *cpu)
>>> }
>>> }
>>> *p = '\0';
>>> + riscv_isa_string_ext(cpu, &isa_str, maxlen);
>>> return isa_str;
>>> }
>>>
>>> --
>>> 2.30.2
>>>
--
Regards,
Atish
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v3] target/riscv: Add isa extenstion strings to the device tree
2022-03-06 6:43 ` Frank Chang
@ 2022-03-08 22:53 ` Atish Patra
2022-03-08 22:56 ` Atish Patra
0 siblings, 1 reply; 15+ messages in thread
From: Atish Patra @ 2022-03-08 22:53 UTC (permalink / raw)
To: Frank Chang
Cc: open list:RISC-V, Heiko Stuebner, Bin Meng, Atish Kumar Patra,
qemu-devel@nongnu.org Developers, Alistair Francis,
Palmer Dabbelt
On Sat, Mar 5, 2022 at 10:43 PM Frank Chang <frank.chang@sifive.com> wrote:
>
> On Sun, Mar 6, 2022 at 2:12 PM Atish Kumar Patra <atishp@rivosinc.com> wrote:
>>
>>
>>
>> On Sat, Mar 5, 2022 at 9:36 PM Frank Chang <frank.chang@sifive.com> wrote:
>>>
>>> On Sun, Mar 6, 2022 at 7:42 AM Atish Kumar Patra <atishp@rivosinc.com> wrote:
>>>>
>>>>
>>>>
>>>> On Sat, Mar 5, 2022 at 10:05 AM Heiko Stuebner <heiko@sntech.de> wrote:
>>>>>
>>>>> Hi,
>>>>>
>>>>> Am Donnerstag, 3. März 2022, 19:58:38 CET schrieb Atish Patra:
>>>>> > On Fri, Feb 25, 2022 at 11:46 PM Frank Chang <frank.chang@sifive.com> wrote:
>>>>> > > Atish Patra <atishp@rivosinc.com> 於 2022年2月23日 週三 上午6:39寫道:
>>>>> > >>
>>>>> > >> The Linux kernel parses the ISA extensions from "riscv,isa" DT
>>>>> > >> property. It used to parse only the single letter base extensions
>>>>> > >> until now. A generic ISA extension parsing framework was proposed[1]
>>>>> > >> recently that can parse multi-letter ISA extensions as well.
>>>>> > >>
>>>>> > >> Generate the extended ISA string by appending the available ISA extensions
>>>>> > >> to the "riscv,isa" string if it is enabled so that kernel can process it.
>>>>> > >>
>>>>> > >> [1] https://lkml.org/lkml/2022/2/15/263
>>>>> > >>
>>>>> > >> Suggested-by: Heiko Stubner <heiko@sntech.de>
>>>>> > >> Signed-off-by: Atish Patra <atishp@rivosinc.com>
>>>>> > >> ---
>>>>> > >> Changes from v2->v3:
>>>>> > >> 1. Used g_strconcat to replace snprintf & a max isa string length as
>>>>> > >> suggested by Anup.
>>>>> > >> 2. I have not included the Tested-by Tag from Heiko because the
>>>>> > >> implementation changed from v2 to v3.
>>>>> > >>
>>>>> > >> Changes from v1->v2:
>>>>> > >> 1. Improved the code redability by using arrays instead of individual check
>>>>> > >> ---
>>>>> > >> target/riscv/cpu.c | 29 +++++++++++++++++++++++++++++
>>>>> > >> 1 file changed, 29 insertions(+)
>>>>> > >>
>>>>> > >> diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
>>>>> > >> index b0a40b83e7a8..2c7ff6ef555a 100644
>>>>> > >> --- a/target/riscv/cpu.c
>>>>> > >> +++ b/target/riscv/cpu.c
>>>>> > >> @@ -34,6 +34,12 @@
>>>>> > >>
>>>>> > >> /* RISC-V CPU definitions */
>>>>> > >>
>>>>> > >> +/* This includes the null terminated character '\0' */
>>>>> > >> +struct isa_ext_data {
>>>>> > >> + const char *name;
>>>>> > >> + bool enabled;
>>>>> > >> +};
>>>>> > >> +
>>>>> > >> static const char riscv_exts[26] = "IEMAFDQCLBJTPVNSUHKORWXYZG";
>>>>> > >>
>>>>> > >> const char * const riscv_int_regnames[] = {
>>>>> > >> @@ -881,6 +887,28 @@ static void riscv_cpu_class_init(ObjectClass *c, void *data)
>>>>> > >> device_class_set_props(dc, riscv_cpu_properties);
>>>>> > >> }
>>>>> > >>
>>>>> > >> +static void riscv_isa_string_ext(RISCVCPU *cpu, char **isa_str, int max_str_len)
>>>>> > >> +{
>>>>> > >> + char *old = *isa_str;
>>>>> > >> + char *new = *isa_str;
>>>>> > >> + int i;
>>>>> > >> + struct isa_ext_data isa_edata_arr[] = {
>>>>> > >> + { "svpbmt", cpu->cfg.ext_svpbmt },
>>>>> > >> + { "svinval", cpu->cfg.ext_svinval },
>>>>> > >> + { "svnapot", cpu->cfg.ext_svnapot },
>>>>> > >
>>>>> > >
>>>>> > > We still have other sub-extensions, e.g. Zfh, Zba, Zbb, Zbc, Zbs... etc.
>>>>> > > Do you mind adding them as well?
>>>>> > >
>>>>> >
>>>>> > Do we really need it ? Does any OS actually parse it from the device tree ?
>>>>> > AFAIK, Linux kernel doesn't use them. As the device tree is intended
>>>>> > to keep the information useful
>>>>> > for supervisor software,
>>>>>
>>>>> That actually isn't true ;-) .
>>>>>
>>>>> The devicetree is intended to _describe_ the hardware present in full
>>>>> and has really nothing to do with what the userspace needs.
>>>>> So the argument "Linux doesn't need this" is never true when talking
>>>>> about devicetrees ;-) .
>>>>
>>>>
>>>> Yes. I didn’t mean that way. I was simply asking if these extensions currently in use. I just mentioned Linux as an example.
>>>>
>>>> The larger point I was trying to make if we should add all the supported extensions when they are added to Qemu or on a need basis.
>>>>
>>>> I don’t feel strongly either way. So I am okay with the former approach if that’s what everyone prefers!
>>>
>>>
>>> Linux Kernel itself might not,
>>> but userspace applications may query /proc/cpuinfo to get core's capabilities, e.g. for those vector applications.
>>> It really depends on how the application is written.
>>>
>>> I still think adding all the enabled extensions into the isa string would be a proper solution, no matter they are used or not.
>>> However, we can leave that beyond this patch.
>>
>>
>>
>> Fair enough. I will update the patch to include all the extension available.
>
>
> Thanks, that would be great.
>
> BTW, I think current QEMU RISC-V isa string includes both "s" and "u":
> https://github.com/qemu/qemu/blob/master/target/riscv/cpu.c#L37
> But in fact, they should not be presented in the DTS isa string.
> Do you think we should exclude them as well?
>
There is a patch in the mailing list fixing that issue
https://lists.nongnu.org/archive/html/qemu-riscv/2022-02/msg00099.html
> Regards,
> Frank Chang
>
>>
>>>
>>> Regards,
>>> Frank Chang
>>>
>>>>>
>>>>>
>>>>> On the other hand the devicetree user doesn't need to parse everything
>>>>> from DT. So adding code to parse things only really is needed if you
>>>>> need that information.
>>>>
>>>>
>>>> Agreed.
>>>>
>>>>>
>>>>> So if some part of the kernel needs to know about those additional
>>>>> extensions, the array entries for them can also be added in a later patch.
>>>>
>>>>
>>>> Yes. That was the idea in isa extension framework series where the extension specific array entries will only be added when support for that extension is enabled.
>>>>>
>>>>>
>>>>>
>>>>> Heiko
>>>>>
>>>>> > > Also, I think the order of ISA strings should be alphabetical as described:
>>>>> > > https://github.com/riscv/riscv-isa-manual/blob/master/src/naming.tex#L96
>>>>> > >
>>>>> >
>>>>> > Ahh yes. I will order them in alphabetical order and leave a big
>>>>> > comment for future reference as well.
>>>>> >
>>>>> > > Regards,
>>>>> > > Frank Chang
>>>>> > >
>>>>> > >>
>>>>> > >> + };
>>>>> > >> +
>>>>> > >> + for (i = 0; i < ARRAY_SIZE(isa_edata_arr); i++) {
>>>>> > >> + if (isa_edata_arr[i].enabled) {
>>>>> > >> + new = g_strconcat(old, "_", isa_edata_arr[i].name, NULL);
>>>>> > >> + g_free(old);
>>>>> > >> + old = new;
>>>>> > >> + }
>>>>> > >> + }
>>>>> > >> +
>>>>> > >> + *isa_str = new;
>>>>> > >> +}
>>>>> > >> +
>>>>> > >> char *riscv_isa_string(RISCVCPU *cpu)
>>>>> > >> {
>>>>> > >> int i;
>>>>> > >> @@ -893,6 +921,7 @@ char *riscv_isa_string(RISCVCPU *cpu)
>>>>> > >> }
>>>>> > >> }
>>>>> > >> *p = '\0';
>>>>> > >> + riscv_isa_string_ext(cpu, &isa_str, maxlen);
>>>>> > >> return isa_str;
>>>>> > >> }
>>>>> > >>
>>>>> > >> --
>>>>> > >> 2.30.2
>>>>> > >>
>>>>> >
>>>>> >
>>>>> >
>>>>>
>>>>>
>>>>>
>>>>>
--
Regards,
Atish
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v3] target/riscv: Add isa extenstion strings to the device tree
2022-03-08 22:53 ` Atish Patra
@ 2022-03-08 22:56 ` Atish Patra
0 siblings, 0 replies; 15+ messages in thread
From: Atish Patra @ 2022-03-08 22:56 UTC (permalink / raw)
To: Frank Chang, Alistair Francis, Tsukasa OI
Cc: open list:RISC-V, Bin Meng, Palmer Dabbelt, Heiko Stuebner,
qemu-devel@nongnu.org Developers
On Tue, Mar 8, 2022 at 2:53 PM Atish Patra <atishp@atishpatra.org> wrote:
>
> On Sat, Mar 5, 2022 at 10:43 PM Frank Chang <frank.chang@sifive.com> wrote:
> >
> > On Sun, Mar 6, 2022 at 2:12 PM Atish Kumar Patra <atishp@rivosinc.com> wrote:
> >>
> >>
> >>
> >> On Sat, Mar 5, 2022 at 9:36 PM Frank Chang <frank.chang@sifive.com> wrote:
> >>>
> >>> On Sun, Mar 6, 2022 at 7:42 AM Atish Kumar Patra <atishp@rivosinc.com> wrote:
> >>>>
> >>>>
> >>>>
> >>>> On Sat, Mar 5, 2022 at 10:05 AM Heiko Stuebner <heiko@sntech.de> wrote:
> >>>>>
> >>>>> Hi,
> >>>>>
> >>>>> Am Donnerstag, 3. März 2022, 19:58:38 CET schrieb Atish Patra:
> >>>>> > On Fri, Feb 25, 2022 at 11:46 PM Frank Chang <frank.chang@sifive.com> wrote:
> >>>>> > > Atish Patra <atishp@rivosinc.com> 於 2022年2月23日 週三 上午6:39寫道:
> >>>>> > >>
> >>>>> > >> The Linux kernel parses the ISA extensions from "riscv,isa" DT
> >>>>> > >> property. It used to parse only the single letter base extensions
> >>>>> > >> until now. A generic ISA extension parsing framework was proposed[1]
> >>>>> > >> recently that can parse multi-letter ISA extensions as well.
> >>>>> > >>
> >>>>> > >> Generate the extended ISA string by appending the available ISA extensions
> >>>>> > >> to the "riscv,isa" string if it is enabled so that kernel can process it.
> >>>>> > >>
> >>>>> > >> [1] https://lkml.org/lkml/2022/2/15/263
> >>>>> > >>
> >>>>> > >> Suggested-by: Heiko Stubner <heiko@sntech.de>
> >>>>> > >> Signed-off-by: Atish Patra <atishp@rivosinc.com>
> >>>>> > >> ---
> >>>>> > >> Changes from v2->v3:
> >>>>> > >> 1. Used g_strconcat to replace snprintf & a max isa string length as
> >>>>> > >> suggested by Anup.
> >>>>> > >> 2. I have not included the Tested-by Tag from Heiko because the
> >>>>> > >> implementation changed from v2 to v3.
> >>>>> > >>
> >>>>> > >> Changes from v1->v2:
> >>>>> > >> 1. Improved the code redability by using arrays instead of individual check
> >>>>> > >> ---
> >>>>> > >> target/riscv/cpu.c | 29 +++++++++++++++++++++++++++++
> >>>>> > >> 1 file changed, 29 insertions(+)
> >>>>> > >>
> >>>>> > >> diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
> >>>>> > >> index b0a40b83e7a8..2c7ff6ef555a 100644
> >>>>> > >> --- a/target/riscv/cpu.c
> >>>>> > >> +++ b/target/riscv/cpu.c
> >>>>> > >> @@ -34,6 +34,12 @@
> >>>>> > >>
> >>>>> > >> /* RISC-V CPU definitions */
> >>>>> > >>
> >>>>> > >> +/* This includes the null terminated character '\0' */
> >>>>> > >> +struct isa_ext_data {
> >>>>> > >> + const char *name;
> >>>>> > >> + bool enabled;
> >>>>> > >> +};
> >>>>> > >> +
> >>>>> > >> static const char riscv_exts[26] = "IEMAFDQCLBJTPVNSUHKORWXYZG";
> >>>>> > >>
> >>>>> > >> const char * const riscv_int_regnames[] = {
> >>>>> > >> @@ -881,6 +887,28 @@ static void riscv_cpu_class_init(ObjectClass *c, void *data)
> >>>>> > >> device_class_set_props(dc, riscv_cpu_properties);
> >>>>> > >> }
> >>>>> > >>
> >>>>> > >> +static void riscv_isa_string_ext(RISCVCPU *cpu, char **isa_str, int max_str_len)
> >>>>> > >> +{
> >>>>> > >> + char *old = *isa_str;
> >>>>> > >> + char *new = *isa_str;
> >>>>> > >> + int i;
> >>>>> > >> + struct isa_ext_data isa_edata_arr[] = {
> >>>>> > >> + { "svpbmt", cpu->cfg.ext_svpbmt },
> >>>>> > >> + { "svinval", cpu->cfg.ext_svinval },
> >>>>> > >> + { "svnapot", cpu->cfg.ext_svnapot },
> >>>>> > >
> >>>>> > >
> >>>>> > > We still have other sub-extensions, e.g. Zfh, Zba, Zbb, Zbc, Zbs... etc.
> >>>>> > > Do you mind adding them as well?
> >>>>> > >
> >>>>> >
> >>>>> > Do we really need it ? Does any OS actually parse it from the device tree ?
> >>>>> > AFAIK, Linux kernel doesn't use them. As the device tree is intended
> >>>>> > to keep the information useful
> >>>>> > for supervisor software,
> >>>>>
> >>>>> That actually isn't true ;-) .
> >>>>>
> >>>>> The devicetree is intended to _describe_ the hardware present in full
> >>>>> and has really nothing to do with what the userspace needs.
> >>>>> So the argument "Linux doesn't need this" is never true when talking
> >>>>> about devicetrees ;-) .
> >>>>
> >>>>
> >>>> Yes. I didn’t mean that way. I was simply asking if these extensions currently in use. I just mentioned Linux as an example.
> >>>>
> >>>> The larger point I was trying to make if we should add all the supported extensions when they are added to Qemu or on a need basis.
> >>>>
> >>>> I don’t feel strongly either way. So I am okay with the former approach if that’s what everyone prefers!
> >>>
> >>>
> >>> Linux Kernel itself might not,
> >>> but userspace applications may query /proc/cpuinfo to get core's capabilities, e.g. for those vector applications.
> >>> It really depends on how the application is written.
> >>>
> >>> I still think adding all the enabled extensions into the isa string would be a proper solution, no matter they are used or not.
> >>> However, we can leave that beyond this patch.
> >>
> >>
> >>
> >> Fair enough. I will update the patch to include all the extension available.
> >
> >
> > Thanks, that would be great.
> >
> > BTW, I think current QEMU RISC-V isa string includes both "s" and "u":
> > https://github.com/qemu/qemu/blob/master/target/riscv/cpu.c#L37
> > But in fact, they should not be presented in the DTS isa string.
> > Do you think we should exclude them as well?
> >
>
> There is a patch in the mailing list fixing that issue
>
> https://lists.nongnu.org/archive/html/qemu-riscv/2022-02/msg00099.html
>
I just realized that it was only sent to qemu-riscv@nongnu.org not qemu-devel.
@Tsukasa OI : Can you please send it again to both qemu-riscv &
qemu-devel so that it is accessible to the broader qemu community.
> > Regards,
> > Frank Chang
> >
> >>
> >>>
> >>> Regards,
> >>> Frank Chang
> >>>
> >>>>>
> >>>>>
> >>>>> On the other hand the devicetree user doesn't need to parse everything
> >>>>> from DT. So adding code to parse things only really is needed if you
> >>>>> need that information.
> >>>>
> >>>>
> >>>> Agreed.
> >>>>
> >>>>>
> >>>>> So if some part of the kernel needs to know about those additional
> >>>>> extensions, the array entries for them can also be added in a later patch.
> >>>>
> >>>>
> >>>> Yes. That was the idea in isa extension framework series where the extension specific array entries will only be added when support for that extension is enabled.
> >>>>>
> >>>>>
> >>>>>
> >>>>> Heiko
> >>>>>
> >>>>> > > Also, I think the order of ISA strings should be alphabetical as described:
> >>>>> > > https://github.com/riscv/riscv-isa-manual/blob/master/src/naming.tex#L96
> >>>>> > >
> >>>>> >
> >>>>> > Ahh yes. I will order them in alphabetical order and leave a big
> >>>>> > comment for future reference as well.
> >>>>> >
> >>>>> > > Regards,
> >>>>> > > Frank Chang
> >>>>> > >
> >>>>> > >>
> >>>>> > >> + };
> >>>>> > >> +
> >>>>> > >> + for (i = 0; i < ARRAY_SIZE(isa_edata_arr); i++) {
> >>>>> > >> + if (isa_edata_arr[i].enabled) {
> >>>>> > >> + new = g_strconcat(old, "_", isa_edata_arr[i].name, NULL);
> >>>>> > >> + g_free(old);
> >>>>> > >> + old = new;
> >>>>> > >> + }
> >>>>> > >> + }
> >>>>> > >> +
> >>>>> > >> + *isa_str = new;
> >>>>> > >> +}
> >>>>> > >> +
> >>>>> > >> char *riscv_isa_string(RISCVCPU *cpu)
> >>>>> > >> {
> >>>>> > >> int i;
> >>>>> > >> @@ -893,6 +921,7 @@ char *riscv_isa_string(RISCVCPU *cpu)
> >>>>> > >> }
> >>>>> > >> }
> >>>>> > >> *p = '\0';
> >>>>> > >> + riscv_isa_string_ext(cpu, &isa_str, maxlen);
> >>>>> > >> return isa_str;
> >>>>> > >> }
> >>>>> > >>
> >>>>> > >> --
> >>>>> > >> 2.30.2
> >>>>> > >>
> >>>>> >
> >>>>> >
> >>>>> >
> >>>>>
> >>>>>
> >>>>>
> >>>>>
>
>
> --
> Regards,
> Atish
--
Regards,
Atish
^ permalink raw reply [flat|nested] 15+ messages in thread
end of thread, other threads:[~2022-03-08 23:01 UTC | newest]
Thread overview: 15+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-02-22 22:38 [PATCH v3] target/riscv: Add isa extenstion strings to the device tree Atish Patra
2022-02-23 6:44 ` Anup Patel
2022-02-24 5:16 ` Alistair Francis
2022-02-26 7:45 ` Frank Chang
2022-03-03 18:58 ` Atish Patra
2022-03-05 17:26 ` Heiko Stuebner
2022-03-05 23:42 ` Atish Kumar Patra
2022-03-06 5:35 ` Frank Chang
2022-03-06 5:51 ` Anup Patel
2022-03-06 6:11 ` Atish Kumar Patra
2022-03-06 6:43 ` Frank Chang
2022-03-08 22:53 ` Atish Patra
2022-03-08 22:56 ` Atish Patra
2022-03-06 6:47 ` Frank Chang
2022-03-08 22:52 ` Atish Patra
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).