@@ -119,6 +119,82 @@ static int riscv_ext_zicboz_validate(const struct riscv_isa_ext_data *data,
119119 return 0 ;
120120}
121121
122+ static int riscv_ext_f_validate (const struct riscv_isa_ext_data * data ,
123+ const unsigned long * isa_bitmap )
124+ {
125+ if (!IS_ENABLED (CONFIG_FPU ))
126+ return - EINVAL ;
127+
128+ /*
129+ * Due to extension ordering, d is checked before f, so no deferral
130+ * is required.
131+ */
132+ if (!__riscv_isa_extension_available (isa_bitmap , RISCV_ISA_EXT_d )) {
133+ pr_warn_once ("This kernel does not support systems with F but not D\n" );
134+ return - EINVAL ;
135+ }
136+
137+ return 0 ;
138+ }
139+
140+ static int riscv_ext_d_validate (const struct riscv_isa_ext_data * data ,
141+ const unsigned long * isa_bitmap )
142+ {
143+ if (!IS_ENABLED (CONFIG_FPU ))
144+ return - EINVAL ;
145+
146+ return 0 ;
147+ }
148+
149+ static int riscv_ext_vector_x_validate (const struct riscv_isa_ext_data * data ,
150+ const unsigned long * isa_bitmap )
151+ {
152+ if (!IS_ENABLED (CONFIG_RISCV_ISA_V ))
153+ return - EINVAL ;
154+
155+ return 0 ;
156+ }
157+
158+ static int riscv_ext_vector_float_validate (const struct riscv_isa_ext_data * data ,
159+ const unsigned long * isa_bitmap )
160+ {
161+ if (!IS_ENABLED (CONFIG_RISCV_ISA_V ))
162+ return - EINVAL ;
163+
164+ if (!IS_ENABLED (CONFIG_FPU ))
165+ return - EINVAL ;
166+
167+ /*
168+ * The kernel doesn't support systems that don't implement both of
169+ * F and D, so if any of the vector extensions that do floating point
170+ * are to be usable, both floating point extensions need to be usable.
171+ *
172+ * Since this function validates vector only, and v/Zve* are probed
173+ * after f/d, there's no need for a deferral here.
174+ */
175+ if (!__riscv_isa_extension_available (isa_bitmap , RISCV_ISA_EXT_d ))
176+ return - EINVAL ;
177+
178+ return 0 ;
179+ }
180+
181+ static int riscv_ext_vector_crypto_validate (const struct riscv_isa_ext_data * data ,
182+ const unsigned long * isa_bitmap )
183+ {
184+ if (!IS_ENABLED (CONFIG_RISCV_ISA_V ))
185+ return - EINVAL ;
186+
187+ /*
188+ * It isn't the kernel's job to check that the binding is correct, so
189+ * it should be enough to check that any of the vector extensions are
190+ * enabled, which in-turn means that vector is usable in this kernel
191+ */
192+ if (!__riscv_isa_extension_available (isa_bitmap , RISCV_ISA_EXT_ZVE32X ))
193+ return - EPROBE_DEFER ;
194+
195+ return 0 ;
196+ }
197+
122198static int riscv_ext_zca_depends (const struct riscv_isa_ext_data * data ,
123199 const unsigned long * isa_bitmap )
124200{
@@ -359,16 +435,14 @@ const struct riscv_isa_ext_data riscv_isa_ext[] = {
359435 __RISCV_ISA_EXT_DATA (i , RISCV_ISA_EXT_i ),
360436 __RISCV_ISA_EXT_DATA (m , RISCV_ISA_EXT_m ),
361437 __RISCV_ISA_EXT_SUPERSET (a , RISCV_ISA_EXT_a , riscv_a_exts ),
362- __RISCV_ISA_EXT_DATA (f , RISCV_ISA_EXT_f ),
363- __RISCV_ISA_EXT_DATA (d , RISCV_ISA_EXT_d ),
438+ __RISCV_ISA_EXT_DATA_VALIDATE (f , RISCV_ISA_EXT_f , riscv_ext_f_validate ),
439+ __RISCV_ISA_EXT_DATA_VALIDATE (d , RISCV_ISA_EXT_d , riscv_ext_d_validate ),
364440 __RISCV_ISA_EXT_DATA (q , RISCV_ISA_EXT_q ),
365441 __RISCV_ISA_EXT_SUPERSET (c , RISCV_ISA_EXT_c , riscv_c_exts ),
366- __RISCV_ISA_EXT_SUPERSET (v , RISCV_ISA_EXT_v , riscv_v_exts ),
442+ __RISCV_ISA_EXT_SUPERSET_VALIDATE (v , RISCV_ISA_EXT_v , riscv_v_exts , riscv_ext_vector_float_validate ),
367443 __RISCV_ISA_EXT_DATA (h , RISCV_ISA_EXT_h ),
368- __RISCV_ISA_EXT_SUPERSET_VALIDATE (zicbom , RISCV_ISA_EXT_ZICBOM , riscv_xlinuxenvcfg_exts ,
369- riscv_ext_zicbom_validate ),
370- __RISCV_ISA_EXT_SUPERSET_VALIDATE (zicboz , RISCV_ISA_EXT_ZICBOZ , riscv_xlinuxenvcfg_exts ,
371- riscv_ext_zicboz_validate ),
444+ __RISCV_ISA_EXT_SUPERSET_VALIDATE (zicbom , RISCV_ISA_EXT_ZICBOM , riscv_xlinuxenvcfg_exts , riscv_ext_zicbom_validate ),
445+ __RISCV_ISA_EXT_SUPERSET_VALIDATE (zicboz , RISCV_ISA_EXT_ZICBOZ , riscv_xlinuxenvcfg_exts , riscv_ext_zicboz_validate ),
372446 __RISCV_ISA_EXT_DATA (ziccrse , RISCV_ISA_EXT_ZICCRSE ),
373447 __RISCV_ISA_EXT_DATA (zicntr , RISCV_ISA_EXT_ZICNTR ),
374448 __RISCV_ISA_EXT_DATA (zicond , RISCV_ISA_EXT_ZICOND ),
@@ -410,32 +484,31 @@ const struct riscv_isa_ext_data riscv_isa_ext[] = {
410484 __RISCV_ISA_EXT_DATA (zksed , RISCV_ISA_EXT_ZKSED ),
411485 __RISCV_ISA_EXT_DATA (zksh , RISCV_ISA_EXT_ZKSH ),
412486 __RISCV_ISA_EXT_DATA (ztso , RISCV_ISA_EXT_ZTSO ),
413- __RISCV_ISA_EXT_SUPERSET (zvbb , RISCV_ISA_EXT_ZVBB , riscv_zvbb_exts ),
414- __RISCV_ISA_EXT_DATA (zvbc , RISCV_ISA_EXT_ZVBC ),
415- __RISCV_ISA_EXT_SUPERSET (zve32f , RISCV_ISA_EXT_ZVE32F , riscv_zve32f_exts ),
416- __RISCV_ISA_EXT_DATA (zve32x , RISCV_ISA_EXT_ZVE32X ),
417- __RISCV_ISA_EXT_SUPERSET (zve64d , RISCV_ISA_EXT_ZVE64D , riscv_zve64d_exts ),
418- __RISCV_ISA_EXT_SUPERSET (zve64f , RISCV_ISA_EXT_ZVE64F , riscv_zve64f_exts ),
419- __RISCV_ISA_EXT_SUPERSET (zve64x , RISCV_ISA_EXT_ZVE64X , riscv_zve64x_exts ),
487+ __RISCV_ISA_EXT_SUPERSET_VALIDATE (zvbb , RISCV_ISA_EXT_ZVBB , riscv_zvbb_exts , riscv_ext_vector_crypto_validate ),
488+ __RISCV_ISA_EXT_DATA_VALIDATE (zvbc , RISCV_ISA_EXT_ZVBC , riscv_ext_vector_crypto_validate ),
489+ __RISCV_ISA_EXT_SUPERSET_VALIDATE (zve32f , RISCV_ISA_EXT_ZVE32F , riscv_zve32f_exts , riscv_ext_vector_float_validate ),
490+ __RISCV_ISA_EXT_DATA_VALIDATE (zve32x , RISCV_ISA_EXT_ZVE32X , riscv_ext_vector_x_validate ),
491+ __RISCV_ISA_EXT_SUPERSET_VALIDATE (zve64d , RISCV_ISA_EXT_ZVE64D , riscv_zve64d_exts , riscv_ext_vector_float_validate ),
492+ __RISCV_ISA_EXT_SUPERSET_VALIDATE (zve64f , RISCV_ISA_EXT_ZVE64F , riscv_zve64f_exts , riscv_ext_vector_float_validate ),
493+ __RISCV_ISA_EXT_SUPERSET_VALIDATE (zve64x , RISCV_ISA_EXT_ZVE64X , riscv_zve64x_exts , riscv_ext_vector_x_validate ),
420494 __RISCV_ISA_EXT_DATA_VALIDATE (zvfbfmin , RISCV_ISA_EXT_ZVFBFMIN , riscv_vector_f_validate ),
421- __RISCV_ISA_EXT_DATA_VALIDATE (zvfbfwma , RISCV_ISA_EXT_ZVFBFWMA ,
422- riscv_ext_zvfbfwma_validate ),
495+ __RISCV_ISA_EXT_DATA_VALIDATE (zvfbfwma , RISCV_ISA_EXT_ZVFBFWMA , riscv_ext_zvfbfwma_validate ),
423496 __RISCV_ISA_EXT_DATA (zvfh , RISCV_ISA_EXT_ZVFH ),
424497 __RISCV_ISA_EXT_DATA (zvfhmin , RISCV_ISA_EXT_ZVFHMIN ),
425- __RISCV_ISA_EXT_DATA (zvkb , RISCV_ISA_EXT_ZVKB ),
426- __RISCV_ISA_EXT_DATA (zvkg , RISCV_ISA_EXT_ZVKG ),
427- __RISCV_ISA_EXT_BUNDLE (zvkn , riscv_zvkn_bundled_exts ),
428- __RISCV_ISA_EXT_BUNDLE (zvknc , riscv_zvknc_bundled_exts ),
429- __RISCV_ISA_EXT_DATA (zvkned , RISCV_ISA_EXT_ZVKNED ),
430- __RISCV_ISA_EXT_BUNDLE (zvkng , riscv_zvkng_bundled_exts ),
431- __RISCV_ISA_EXT_DATA (zvknha , RISCV_ISA_EXT_ZVKNHA ),
432- __RISCV_ISA_EXT_DATA (zvknhb , RISCV_ISA_EXT_ZVKNHB ),
433- __RISCV_ISA_EXT_BUNDLE (zvks , riscv_zvks_bundled_exts ),
434- __RISCV_ISA_EXT_BUNDLE (zvksc , riscv_zvksc_bundled_exts ),
435- __RISCV_ISA_EXT_DATA (zvksed , RISCV_ISA_EXT_ZVKSED ),
436- __RISCV_ISA_EXT_DATA (zvksh , RISCV_ISA_EXT_ZVKSH ),
437- __RISCV_ISA_EXT_BUNDLE (zvksg , riscv_zvksg_bundled_exts ),
438- __RISCV_ISA_EXT_DATA (zvkt , RISCV_ISA_EXT_ZVKT ),
498+ __RISCV_ISA_EXT_DATA_VALIDATE (zvkb , RISCV_ISA_EXT_ZVKB , riscv_ext_vector_crypto_validate ),
499+ __RISCV_ISA_EXT_DATA_VALIDATE (zvkg , RISCV_ISA_EXT_ZVKG , riscv_ext_vector_crypto_validate ),
500+ __RISCV_ISA_EXT_BUNDLE_VALIDATE (zvkn , riscv_zvkn_bundled_exts , riscv_ext_vector_crypto_validate ),
501+ __RISCV_ISA_EXT_BUNDLE_VALIDATE (zvknc , riscv_zvknc_bundled_exts , riscv_ext_vector_crypto_validate ),
502+ __RISCV_ISA_EXT_DATA_VALIDATE (zvkned , RISCV_ISA_EXT_ZVKNED , riscv_ext_vector_crypto_validate ),
503+ __RISCV_ISA_EXT_BUNDLE_VALIDATE (zvkng , riscv_zvkng_bundled_exts , riscv_ext_vector_crypto_validate ),
504+ __RISCV_ISA_EXT_DATA_VALIDATE (zvknha , RISCV_ISA_EXT_ZVKNHA , riscv_ext_vector_crypto_validate ),
505+ __RISCV_ISA_EXT_DATA_VALIDATE (zvknhb , RISCV_ISA_EXT_ZVKNHB , riscv_ext_vector_crypto_validate ),
506+ __RISCV_ISA_EXT_BUNDLE_VALIDATE (zvks , riscv_zvks_bundled_exts , riscv_ext_vector_crypto_validate ),
507+ __RISCV_ISA_EXT_BUNDLE_VALIDATE (zvksc , riscv_zvksc_bundled_exts , riscv_ext_vector_crypto_validate ),
508+ __RISCV_ISA_EXT_DATA_VALIDATE (zvksed , RISCV_ISA_EXT_ZVKSED , riscv_ext_vector_crypto_validate ),
509+ __RISCV_ISA_EXT_DATA_VALIDATE (zvksh , RISCV_ISA_EXT_ZVKSH , riscv_ext_vector_crypto_validate ),
510+ __RISCV_ISA_EXT_BUNDLE_VALIDATE (zvksg , riscv_zvksg_bundled_exts , riscv_ext_vector_crypto_validate ),
511+ __RISCV_ISA_EXT_DATA_VALIDATE (zvkt , RISCV_ISA_EXT_ZVKT , riscv_ext_vector_crypto_validate ),
439512 __RISCV_ISA_EXT_DATA (smaia , RISCV_ISA_EXT_SMAIA ),
440513 __RISCV_ISA_EXT_DATA (smmpm , RISCV_ISA_EXT_SMMPM ),
441514 __RISCV_ISA_EXT_SUPERSET (smnpm , RISCV_ISA_EXT_SMNPM , riscv_xlinuxenvcfg_exts ),
@@ -1003,16 +1076,6 @@ void __init riscv_fill_hwcap(void)
10031076 riscv_v_setup_vsize ();
10041077 }
10051078
1006- if (elf_hwcap & COMPAT_HWCAP_ISA_V ) {
1007- /*
1008- * ISA string in device tree might have 'v' flag, but
1009- * CONFIG_RISCV_ISA_V is disabled in kernel.
1010- * Clear V flag in elf_hwcap if CONFIG_RISCV_ISA_V is disabled.
1011- */
1012- if (!IS_ENABLED (CONFIG_RISCV_ISA_V ))
1013- elf_hwcap &= ~COMPAT_HWCAP_ISA_V ;
1014- }
1015-
10161079 memset (print_str , 0 , sizeof (print_str ));
10171080 for (i = 0 , j = 0 ; i < NUM_ALPHA_EXTS ; i ++ )
10181081 if (riscv_isa [0 ] & BIT_MASK (i ))
0 commit comments