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