From: "Heiko Stübner" <heiko@sntech.de>
To: Paul Walmsley <paul.walmsley@sifive.com>,
Palmer Dabbelt <palmer@dabbelt.com>,
Albert Ou <aou@eecs.berkeley.edu>,
linux-riscv@lists.infradead.org
Cc: linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org,
Jisheng Zhang <jszhang@kernel.org>
Subject: Re: [PATCH 4/8] riscv: cpufeature: extend riscv_cpufeature_patch_func to all ISA extensions
Date: Fri, 07 Oct 2022 13:54:31 +0200 [thread overview]
Message-ID: <3185764.oiGErgHkdL@diego> (raw)
In-Reply-To: <20221006070818.3616-5-jszhang@kernel.org>
Am Donnerstag, 6. Oktober 2022, 09:08:14 CEST schrieb Jisheng Zhang:
> make the riscv_cpufeature_patch_func() scan all ISA extensions rather
> than limited feature macros.
>
> Signed-off-by: Jisheng Zhang <jszhang@kernel.org>
> ---
> arch/riscv/include/asm/errata_list.h | 9 ++--
> arch/riscv/kernel/cpufeature.c | 61 +++-------------------------
> 2 files changed, 9 insertions(+), 61 deletions(-)
>
> diff --git a/arch/riscv/include/asm/errata_list.h b/arch/riscv/include/asm/errata_list.h
> index 19a771085781..722525f4fc96 100644
> --- a/arch/riscv/include/asm/errata_list.h
> +++ b/arch/riscv/include/asm/errata_list.h
> @@ -6,6 +6,7 @@
> #define ASM_ERRATA_LIST_H
>
> #include <asm/alternative.h>
> +#include <asm/hwcap.h>
> #include <asm/vendorid_list.h>
>
> #ifdef CONFIG_ERRATA_SIFIVE
> @@ -20,10 +21,6 @@
> #define ERRATA_THEAD_NUMBER 2
> #endif
>
> -#define CPUFEATURE_SVPBMT 0
> -#define CPUFEATURE_ZICBOM 1
> -#define CPUFEATURE_NUMBER 2
> -
> #ifdef __ASSEMBLY__
>
> #define ALT_INSN_FAULT(x) \
> @@ -53,7 +50,7 @@ asm(ALTERNATIVE("sfence.vma %0", "sfence.vma", SIFIVE_VENDOR_ID, \
> #define ALT_SVPBMT(_val, prot) \
> asm(ALTERNATIVE_2("li %0, 0\t\nnop", \
> "li %0, %1\t\nslli %0,%0,%3", 0, \
> - CPUFEATURE_SVPBMT, CONFIG_RISCV_ISA_SVPBMT, \
> + RISCV_ISA_EXT_SVPBMT, CONFIG_RISCV_ISA_SVPBMT, \
> "li %0, %2\t\nslli %0,%0,%4", THEAD_VENDOR_ID, \
> ERRATA_THEAD_PBMT, CONFIG_ERRATA_THEAD_PBMT) \
> : "=r"(_val) \
> @@ -127,7 +124,7 @@ asm volatile(ALTERNATIVE_2( \
> "add a0, a0, %0\n\t" \
> "2:\n\t" \
> "bltu a0, %2, 3b\n\t" \
> - "nop", 0, CPUFEATURE_ZICBOM, CONFIG_RISCV_ISA_ZICBOM, \
> + "nop", 0, RISCV_ISA_EXT_ZICBOM, CONFIG_RISCV_ISA_ZICBOM, \
hmm, would it make sense to also at the same time extend the errata_id
in the alternatives struct to unsigned long?
Right now it's a unsigned int, and we're already at bit30 with the current extensions.
Otherwise the idea is pretty neat of allowing easy handling for all extensions
Reviewed-by: Heiko Stuebner <heiko@sntech.de>
> "mv a0, %1\n\t" \
> "j 2f\n\t" \
> "3:\n\t" \
> diff --git a/arch/riscv/kernel/cpufeature.c b/arch/riscv/kernel/cpufeature.c
> index afa54635c180..2b1f18f97253 100644
> --- a/arch/riscv/kernel/cpufeature.c
> +++ b/arch/riscv/kernel/cpufeature.c
> @@ -251,61 +251,11 @@ void __init riscv_fill_hwcap(void)
> }
>
> #ifdef CONFIG_RISCV_ALTERNATIVE
> -static bool __init_or_module cpufeature_probe_svpbmt(unsigned int stage)
> -{
> -#ifdef CONFIG_RISCV_ISA_SVPBMT
> - switch (stage) {
> - case RISCV_ALTERNATIVES_EARLY_BOOT:
> - return false;
> - default:
> - return riscv_isa_extension_available(NULL, SVPBMT);
> - }
> -#endif
> -
> - return false;
> -}
> -
> -static bool __init_or_module cpufeature_probe_zicbom(unsigned int stage)
> -{
> -#ifdef CONFIG_RISCV_ISA_ZICBOM
> - switch (stage) {
> - case RISCV_ALTERNATIVES_EARLY_BOOT:
> - return false;
> - default:
> - return riscv_isa_extension_available(NULL, ZICBOM);
> - }
> -#endif
> -
> - return false;
> -}
> -
> -/*
> - * Probe presence of individual extensions.
> - *
> - * This code may also be executed before kernel relocation, so we cannot use
> - * addresses generated by the address-of operator as they won't be valid in
> - * this context.
> - */
> -static u32 __init_or_module cpufeature_probe(unsigned int stage)
> -{
> - u32 cpu_req_feature = 0;
> -
> - if (cpufeature_probe_svpbmt(stage))
> - cpu_req_feature |= (1U << CPUFEATURE_SVPBMT);
> -
> - if (cpufeature_probe_zicbom(stage))
> - cpu_req_feature |= (1U << CPUFEATURE_ZICBOM);
> -
> - return cpu_req_feature;
> -}
> -
> void __init_or_module riscv_cpufeature_patch_func(struct alt_entry *begin,
> struct alt_entry *end,
> unsigned int stage)
> {
> - u32 cpu_req_feature = cpufeature_probe(stage);
> struct alt_entry *alt;
> - u32 tmp;
>
> if (stage == RISCV_ALTERNATIVES_EARLY_BOOT)
> return;
> @@ -313,15 +263,16 @@ void __init_or_module riscv_cpufeature_patch_func(struct alt_entry *begin,
> for (alt = begin; alt < end; alt++) {
> if (alt->vendor_id != 0)
> continue;
> - if (alt->errata_id >= CPUFEATURE_NUMBER) {
> - WARN(1, "This feature id:%d is not in kernel cpufeature list",
> + if (alt->errata_id >= RISCV_ISA_EXT_ID_MAX) {
> + WARN(1, "This extension id:%d is not in ISA extension list",
> alt->errata_id);
> continue;
> }
>
> - tmp = (1U << alt->errata_id);
> - if (cpu_req_feature & tmp)
> - patch_text_nosync(alt->old_ptr, alt->alt_ptr, alt->alt_len);
> + if (!test_bit(alt->errata_id, riscv_isa))
> + continue;
> +
> + patch_text_nosync(alt->old_ptr, alt->alt_ptr, alt->alt_len);
> }
> }
> #endif
>
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
WARNING: multiple messages have this Message-ID (diff)
From: "Heiko Stübner" <heiko@sntech.de>
To: Paul Walmsley <paul.walmsley@sifive.com>,
Palmer Dabbelt <palmer@dabbelt.com>,
Albert Ou <aou@eecs.berkeley.edu>,
linux-riscv@lists.infradead.org
Cc: linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org,
Jisheng Zhang <jszhang@kernel.org>
Subject: Re: [PATCH 4/8] riscv: cpufeature: extend riscv_cpufeature_patch_func to all ISA extensions
Date: Fri, 07 Oct 2022 13:54:31 +0200 [thread overview]
Message-ID: <3185764.oiGErgHkdL@diego> (raw)
In-Reply-To: <20221006070818.3616-5-jszhang@kernel.org>
Am Donnerstag, 6. Oktober 2022, 09:08:14 CEST schrieb Jisheng Zhang:
> make the riscv_cpufeature_patch_func() scan all ISA extensions rather
> than limited feature macros.
>
> Signed-off-by: Jisheng Zhang <jszhang@kernel.org>
> ---
> arch/riscv/include/asm/errata_list.h | 9 ++--
> arch/riscv/kernel/cpufeature.c | 61 +++-------------------------
> 2 files changed, 9 insertions(+), 61 deletions(-)
>
> diff --git a/arch/riscv/include/asm/errata_list.h b/arch/riscv/include/asm/errata_list.h
> index 19a771085781..722525f4fc96 100644
> --- a/arch/riscv/include/asm/errata_list.h
> +++ b/arch/riscv/include/asm/errata_list.h
> @@ -6,6 +6,7 @@
> #define ASM_ERRATA_LIST_H
>
> #include <asm/alternative.h>
> +#include <asm/hwcap.h>
> #include <asm/vendorid_list.h>
>
> #ifdef CONFIG_ERRATA_SIFIVE
> @@ -20,10 +21,6 @@
> #define ERRATA_THEAD_NUMBER 2
> #endif
>
> -#define CPUFEATURE_SVPBMT 0
> -#define CPUFEATURE_ZICBOM 1
> -#define CPUFEATURE_NUMBER 2
> -
> #ifdef __ASSEMBLY__
>
> #define ALT_INSN_FAULT(x) \
> @@ -53,7 +50,7 @@ asm(ALTERNATIVE("sfence.vma %0", "sfence.vma", SIFIVE_VENDOR_ID, \
> #define ALT_SVPBMT(_val, prot) \
> asm(ALTERNATIVE_2("li %0, 0\t\nnop", \
> "li %0, %1\t\nslli %0,%0,%3", 0, \
> - CPUFEATURE_SVPBMT, CONFIG_RISCV_ISA_SVPBMT, \
> + RISCV_ISA_EXT_SVPBMT, CONFIG_RISCV_ISA_SVPBMT, \
> "li %0, %2\t\nslli %0,%0,%4", THEAD_VENDOR_ID, \
> ERRATA_THEAD_PBMT, CONFIG_ERRATA_THEAD_PBMT) \
> : "=r"(_val) \
> @@ -127,7 +124,7 @@ asm volatile(ALTERNATIVE_2( \
> "add a0, a0, %0\n\t" \
> "2:\n\t" \
> "bltu a0, %2, 3b\n\t" \
> - "nop", 0, CPUFEATURE_ZICBOM, CONFIG_RISCV_ISA_ZICBOM, \
> + "nop", 0, RISCV_ISA_EXT_ZICBOM, CONFIG_RISCV_ISA_ZICBOM, \
hmm, would it make sense to also at the same time extend the errata_id
in the alternatives struct to unsigned long?
Right now it's a unsigned int, and we're already at bit30 with the current extensions.
Otherwise the idea is pretty neat of allowing easy handling for all extensions
Reviewed-by: Heiko Stuebner <heiko@sntech.de>
> "mv a0, %1\n\t" \
> "j 2f\n\t" \
> "3:\n\t" \
> diff --git a/arch/riscv/kernel/cpufeature.c b/arch/riscv/kernel/cpufeature.c
> index afa54635c180..2b1f18f97253 100644
> --- a/arch/riscv/kernel/cpufeature.c
> +++ b/arch/riscv/kernel/cpufeature.c
> @@ -251,61 +251,11 @@ void __init riscv_fill_hwcap(void)
> }
>
> #ifdef CONFIG_RISCV_ALTERNATIVE
> -static bool __init_or_module cpufeature_probe_svpbmt(unsigned int stage)
> -{
> -#ifdef CONFIG_RISCV_ISA_SVPBMT
> - switch (stage) {
> - case RISCV_ALTERNATIVES_EARLY_BOOT:
> - return false;
> - default:
> - return riscv_isa_extension_available(NULL, SVPBMT);
> - }
> -#endif
> -
> - return false;
> -}
> -
> -static bool __init_or_module cpufeature_probe_zicbom(unsigned int stage)
> -{
> -#ifdef CONFIG_RISCV_ISA_ZICBOM
> - switch (stage) {
> - case RISCV_ALTERNATIVES_EARLY_BOOT:
> - return false;
> - default:
> - return riscv_isa_extension_available(NULL, ZICBOM);
> - }
> -#endif
> -
> - return false;
> -}
> -
> -/*
> - * Probe presence of individual extensions.
> - *
> - * This code may also be executed before kernel relocation, so we cannot use
> - * addresses generated by the address-of operator as they won't be valid in
> - * this context.
> - */
> -static u32 __init_or_module cpufeature_probe(unsigned int stage)
> -{
> - u32 cpu_req_feature = 0;
> -
> - if (cpufeature_probe_svpbmt(stage))
> - cpu_req_feature |= (1U << CPUFEATURE_SVPBMT);
> -
> - if (cpufeature_probe_zicbom(stage))
> - cpu_req_feature |= (1U << CPUFEATURE_ZICBOM);
> -
> - return cpu_req_feature;
> -}
> -
> void __init_or_module riscv_cpufeature_patch_func(struct alt_entry *begin,
> struct alt_entry *end,
> unsigned int stage)
> {
> - u32 cpu_req_feature = cpufeature_probe(stage);
> struct alt_entry *alt;
> - u32 tmp;
>
> if (stage == RISCV_ALTERNATIVES_EARLY_BOOT)
> return;
> @@ -313,15 +263,16 @@ void __init_or_module riscv_cpufeature_patch_func(struct alt_entry *begin,
> for (alt = begin; alt < end; alt++) {
> if (alt->vendor_id != 0)
> continue;
> - if (alt->errata_id >= CPUFEATURE_NUMBER) {
> - WARN(1, "This feature id:%d is not in kernel cpufeature list",
> + if (alt->errata_id >= RISCV_ISA_EXT_ID_MAX) {
> + WARN(1, "This extension id:%d is not in ISA extension list",
> alt->errata_id);
> continue;
> }
>
> - tmp = (1U << alt->errata_id);
> - if (cpu_req_feature & tmp)
> - patch_text_nosync(alt->old_ptr, alt->alt_ptr, alt->alt_len);
> + if (!test_bit(alt->errata_id, riscv_isa))
> + continue;
> +
> + patch_text_nosync(alt->old_ptr, alt->alt_ptr, alt->alt_len);
> }
> }
> #endif
>
next prev parent reply other threads:[~2022-10-07 11:54 UTC|newest]
Thread overview: 70+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-10-06 7:08 [PATCH 0/8] riscv: improve boot time isa extensions handling Jisheng Zhang
2022-10-06 7:08 ` Jisheng Zhang
2022-10-06 7:08 ` [PATCH 1/8] riscv: move riscv_noncoherent_supported() out of ZICBOM probe Jisheng Zhang
2022-10-06 7:08 ` Jisheng Zhang
2022-10-06 13:10 ` Andrew Jones
2022-10-06 13:10 ` Andrew Jones
2022-10-06 17:44 ` Andrew Jones
2022-10-06 17:44 ` Andrew Jones
2022-10-07 9:18 ` Heiko Stübner
2022-10-07 9:18 ` Heiko Stübner
2022-10-08 13:06 ` Conor Dooley
2022-10-08 13:06 ` Conor Dooley
2022-10-08 13:59 ` Jisheng Zhang
2022-10-08 13:59 ` Jisheng Zhang
2022-10-13 5:37 ` Conor Dooley
2022-10-13 5:37 ` Conor Dooley
2022-10-06 7:08 ` [PATCH 2/8] riscv: cpufeature: detect RISCV_ALTERNATIVES_EARLY_BOOT earlier Jisheng Zhang
2022-10-06 7:08 ` Jisheng Zhang
2022-10-06 13:12 ` Andrew Jones
2022-10-06 13:12 ` Andrew Jones
2022-10-07 9:38 ` Heiko Stübner
2022-10-07 9:38 ` Heiko Stübner
2022-10-06 7:08 ` [PATCH 3/8] riscv: hwcap: make ISA extension ids can be used in asm Jisheng Zhang
2022-10-06 7:08 ` Jisheng Zhang
2022-10-06 13:15 ` Andrew Jones
2022-10-06 13:15 ` Andrew Jones
2022-10-07 9:22 ` Heiko Stübner
2022-10-07 9:22 ` Heiko Stübner
2022-10-06 7:08 ` [PATCH 4/8] riscv: cpufeature: extend riscv_cpufeature_patch_func to all ISA extensions Jisheng Zhang
2022-10-06 7:08 ` Jisheng Zhang
2022-10-06 13:31 ` Andrew Jones
2022-10-06 13:31 ` Andrew Jones
2022-10-07 11:54 ` Heiko Stübner [this message]
2022-10-07 11:54 ` Heiko Stübner
2022-10-13 13:28 ` Heiko Stuebner
2022-10-13 13:28 ` Heiko Stuebner
2022-10-06 7:08 ` [PATCH 5/8] riscv: introduce riscv_has_extension_[un]likely() Jisheng Zhang
2022-10-06 7:08 ` Jisheng Zhang
2022-10-06 13:36 ` Andrew Jones
2022-10-06 13:36 ` Andrew Jones
2022-10-06 7:08 ` [PATCH 6/8] riscv: fpu: switch has_fpu() to riscv_has_extension_likely() Jisheng Zhang
2022-10-06 7:08 ` Jisheng Zhang
2022-10-06 13:36 ` Andrew Jones
2022-10-06 13:36 ` Andrew Jones
2022-10-07 15:11 ` Heiko Stübner
2022-10-07 15:11 ` Heiko Stübner
2022-10-06 7:08 ` [PATCH 7/8] riscv: cpu_relax: switch " Jisheng Zhang
2022-10-06 7:08 ` Jisheng Zhang
2022-10-06 13:28 ` kernel test robot
2022-10-06 13:28 ` kernel test robot
2022-10-06 13:37 ` Andrew Jones
2022-10-06 13:37 ` Andrew Jones
2022-10-07 15:12 ` Heiko Stübner
2022-10-07 15:12 ` Heiko Stübner
2022-10-07 18:14 ` kernel test robot
2022-10-07 18:14 ` kernel test robot
2022-10-06 7:08 ` [PATCH 8/8] riscv: remove riscv_isa_ext_keys[] array and related usage Jisheng Zhang
2022-10-06 7:08 ` Jisheng Zhang
2022-10-06 13:38 ` Andrew Jones
2022-10-06 13:38 ` Andrew Jones
2022-10-07 15:12 ` Heiko Stübner
2022-10-07 15:12 ` Heiko Stübner
2022-10-13 16:20 ` [PATCH 0/8] riscv: improve boot time isa extensions handling Andrew Jones
2022-10-13 16:20 ` Andrew Jones
2022-10-29 9:56 ` Andrew Jones
2022-10-29 9:56 ` Andrew Jones
2022-10-29 11:38 ` Jisheng Zhang
2022-10-29 11:38 ` Jisheng Zhang
2022-10-30 16:03 ` Jisheng Zhang
2022-10-30 16:03 ` Jisheng Zhang
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=3185764.oiGErgHkdL@diego \
--to=heiko@sntech.de \
--cc=aou@eecs.berkeley.edu \
--cc=jszhang@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-riscv@lists.infradead.org \
--cc=palmer@dabbelt.com \
--cc=paul.walmsley@sifive.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.