Re: [PATCH v2 10/10] RISC-V: provide a Kconfig option to disable parsing "riscv,isa"

From: Conor Dooley
Date: Thu Jun 29 2023 - 16:21:06 EST


On Thu, Jun 29, 2023 at 03:53:08PM +0200, Andrew Jones wrote:
> On Thu, Jun 29, 2023 at 12:39:51PM +0100, Conor Dooley wrote:
> > On Thu, Jun 29, 2023 at 11:31:33AM +0200, Andrew Jones wrote:
> > > On Thu, Jun 29, 2023 at 09:28:56AM +0100, Conor Dooley wrote:
> > > > As it says on the tin, provide a Kconfig option to disabling parsing the
> > > > "riscv,isa" devicetree property. Hide the option behind NONPORTABLE so
> > > > that only those willing to keep the pieces enable it, and make sure the
> > > > default kernel contains the fallback code.
> > > >
> > > > Suggested-by: Palmer Dabbelt <palmer@xxxxxxxxxxxx>
> > > > Signed-off-by: Conor Dooley <conor.dooley@xxxxxxxxxxxxx>
> > > > ---
> > > > arch/riscv/Kconfig | 16 ++++++++++++++++
> > > > arch/riscv/kernel/cpu.c | 3 +++
> > > > arch/riscv/kernel/cpufeature.c | 2 +-
> > > > 3 files changed, 20 insertions(+), 1 deletion(-)
> > > >
> > > > diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig
> > > > index 1d39efe2b940..0e1909ac5947 100644
> > > > --- a/arch/riscv/Kconfig
> > > > +++ b/arch/riscv/Kconfig
> > > > @@ -291,6 +291,22 @@ config NONPORTABLE
> > > >
> > > > If unsure, say N.
> > > >
> > > > +config NO_RISCV_ISA_FALLBACK
> > > > + bool "Permit falling back to parsing riscv,isa for extension support"
> > > > + depends on NONPORTABLE
> > > > + help
> > > > + Parsing the "riscv,isa" devicetree property has been deprecated and
> > > > + replaced by a list of explicitly defined strings. For compatibility
> > > > + with existing platforms, the kernel will fall back to parsing the
> > > > + "riscv,isa" property if the replacements are not found.
> > > > +
> > > > + Selecting Y here will result in a kernel without this fallback, and
> > > > + will not work on platforms where the devicetree does not contain the
> > > > + replacement properties of "riscv,isa-base" and
> > > ^ spacing issue
> >
> > Huh, weird. Given the tab followed by spaces, it must have snuck in
> > during reflow of the text after some rewording.
> > Wonder how I missed it, given that...
> >
> > > Should we also have a kernel command line option, 'isa_fallback', where
> > > without this config the command line option is not necessary to fallback,
> > > but, with this config, no fallback will be done unless 'isa_fallback' is
> > > provided?
> >
> > I don't know, maybe I have the wrong end of the stick but it feels a bit
> > premature for something that may never not be hidden behind NONPORTABLE?
> > Perhaps that could be left for a point in time where the default value
> > of the symbol changes, or the dependency on NONPORTABLE is removed?
> >
>
> With the command line option, we could consider dropping NONPORTABLE (but
> still default off this config). What I'm thinking is that if we want to
> encourage the adoption of the new format, then there should be a bit of
> pain when it's not used, but not enough pain to risk rebellion. So,
>
> * defconfig builds will silently/painlessly fallback
>
> * builds that want to encourage adoption enable this config and will
> fail to boot when they don't get what they want and don't have the
> command line option
>
> * users still working through the growing pains can manage when
> the boot fails, and when it doesn't, with the command line

So, something like the following squashed in? I inverted the config
option, seemed more natural that way.

diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt
index d910fba25f2c..6c0d0bc06048 100644
--- a/Documentation/admin-guide/kernel-parameters.txt
+++ b/Documentation/admin-guide/kernel-parameters.txt
@@ -5437,6 +5437,13 @@
[KNL] Disable ring 3 MONITOR/MWAIT feature on supported
CPUs.

+ riscv_isa_fallback [RISCV]
+ Fall back to detecting extension support using the
+ "riscv,isa" property on devicetree systems when the
+ replacement properties are not found, on kernels where
+ RISCV_ISA_FALLBACK is not enabled. See the Kconfig entry
+ for RISCV_ISA_FALLBACK.
+
ro [KNL] Mount root device read-only on boot

rodata= [KNL]
diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig
index 0370713ad965..a9a473b67182 100644
--- a/arch/riscv/Kconfig
+++ b/arch/riscv/Kconfig
@@ -291,22 +291,6 @@ config NONPORTABLE

If unsure, say N.

-config NO_RISCV_ISA_FALLBACK
- bool "Permit falling back to parsing riscv,isa for extension support"
- depends on NONPORTABLE
- help
- Parsing the "riscv,isa" devicetree property has been deprecated and
- replaced by a list of explicitly defined strings. For compatibility
- with existing platforms, the kernel will fall back to parsing the
- "riscv,isa" property if the replacements are not found.
-
- Selecting Y here will result in a kernel without this fallback, and
- will not work on platforms where the devicetree does not contain the
- replacement properties of "riscv,isa-base" and "riscv,isa-extensions".
- Please see the dt-binding, located at
- Documentation/devicetree/bindings/riscv/extensions.yaml for details
- on the replacement properties.
-
choice
prompt "Base ISA"
default ARCH_RV64I
@@ -857,6 +841,24 @@ config XIP_PHYS_ADDR
be linked for and stored to. This address is dependent on your
own flash usage.

+config RISCV_ISA_FALLBACK
+ bool "Permit falling back to parsing riscv,isa for extension support by default"
+ default y
+ help
+ Parsing the "riscv,isa" devicetree property has been deprecated and
+ replaced by a list of explicitly defined strings. For compatibility
+ with existing platforms, the kernel will fall back to parsing the
+ "riscv,isa" property if the replacements are not found.
+
+ Selecting N here will result in a kernel that does not use the
+ fallback, unless the commandline "riscv_isa_fallback" parameter is
+ present.
+
+ Please see the dt-binding, located at
+ Documentation/devicetree/bindings/riscv/extensions.yaml for details
+ on the replacement properties of "riscv,isa-base" and
+ "riscv,isa-extensions".
+
endmenu # "Boot options"

config BUILTIN_DTB
diff --git a/arch/riscv/include/asm/hwcap.h b/arch/riscv/include/asm/hwcap.h
index e3cda14a486b..52fa607a1691 100644
--- a/arch/riscv/include/asm/hwcap.h
+++ b/arch/riscv/include/asm/hwcap.h
@@ -81,6 +81,7 @@ struct riscv_isa_ext_data {

extern const struct riscv_isa_ext_data riscv_isa_ext[];
extern const size_t riscv_isa_ext_count;
+extern bool riscv_isa_fallback_cmdline;

unsigned long riscv_isa_extension_base(const unsigned long *isa_bitmap);

diff --git a/arch/riscv/kernel/cpu.c b/arch/riscv/kernel/cpu.c
index 86a1d98b8b3b..1e4cbdedc7fc 100644
--- a/arch/riscv/kernel/cpu.c
+++ b/arch/riscv/kernel/cpu.c
@@ -81,7 +81,7 @@ int riscv_early_of_processor_hartid(struct device_node *node, unsigned long *har
return 0;

old_interface:
- if (IS_ENABLED(CONFIG_NO_RISCV_ISA_FALLBACK))
+ if (!IS_ENABLED(CONFIG_RISCV_ISA_FALLBACK) && !riscv_isa_fallback_cmdline)
return -ENODEV;

if (of_property_read_string(node, "riscv,isa", &isa)) {
diff --git a/arch/riscv/kernel/cpufeature.c b/arch/riscv/kernel/cpufeature.c
index f6fb18d2af84..5d848b7c1dde 100644
--- a/arch/riscv/kernel/cpufeature.c
+++ b/arch/riscv/kernel/cpufeature.c
@@ -471,6 +471,14 @@ static int __init riscv_fill_hwcap_from_ext_list(unsigned long *isa2hwcap)
return 0;
}

+bool __initdata riscv_isa_fallback_cmdline = false;
+static int __init riscv_isa_fallback_setup(char *__unused)
+{
+ riscv_isa_fallback_cmdline = true;
+ return 1;
+}
+early_param("riscv_isa_fallback", riscv_isa_fallback_setup);
+
void __init riscv_fill_hwcap(void)
{
char print_str[NUM_ALPHA_EXTS + 1];
@@ -490,7 +498,7 @@ void __init riscv_fill_hwcap(void)
} else {
int ret = riscv_fill_hwcap_from_ext_list(isa2hwcap);

- if (ret && !IS_ENABLED(CONFIG_NO_RISCV_ISA_FALLBACK)) {
+ if (ret && (IS_ENABLED(CONFIG_RISCV_ISA_FALLBACK) || riscv_isa_fallback_cmdline)) {
pr_info("Falling back to deprecated \"riscv,isa\"\n");
riscv_fill_hwcap_from_isa_string(isa2hwcap);
}

Attachment: signature.asc
Description: PGP signature