@@ -119,6 +119,82 @@ static int riscv_ext_zicboz_validate(const struct riscv_isa_ext_data *data,
119
119
return 0 ;
120
120
}
121
121
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
+
122
198
static int riscv_ext_zca_depends (const struct riscv_isa_ext_data * data ,
123
199
const unsigned long * isa_bitmap )
124
200
{
@@ -359,16 +435,14 @@ const struct riscv_isa_ext_data riscv_isa_ext[] = {
359
435
__RISCV_ISA_EXT_DATA (i , RISCV_ISA_EXT_i ),
360
436
__RISCV_ISA_EXT_DATA (m , RISCV_ISA_EXT_m ),
361
437
__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 ),
364
440
__RISCV_ISA_EXT_DATA (q , RISCV_ISA_EXT_q ),
365
441
__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 ),
367
443
__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 ),
372
446
__RISCV_ISA_EXT_DATA (ziccrse , RISCV_ISA_EXT_ZICCRSE ),
373
447
__RISCV_ISA_EXT_DATA (zicntr , RISCV_ISA_EXT_ZICNTR ),
374
448
__RISCV_ISA_EXT_DATA (zicond , RISCV_ISA_EXT_ZICOND ),
@@ -410,32 +484,31 @@ const struct riscv_isa_ext_data riscv_isa_ext[] = {
410
484
__RISCV_ISA_EXT_DATA (zksed , RISCV_ISA_EXT_ZKSED ),
411
485
__RISCV_ISA_EXT_DATA (zksh , RISCV_ISA_EXT_ZKSH ),
412
486
__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 ),
420
494
__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 ),
423
496
__RISCV_ISA_EXT_DATA (zvfh , RISCV_ISA_EXT_ZVFH ),
424
497
__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 ),
439
512
__RISCV_ISA_EXT_DATA (smaia , RISCV_ISA_EXT_SMAIA ),
440
513
__RISCV_ISA_EXT_DATA (smmpm , RISCV_ISA_EXT_SMMPM ),
441
514
__RISCV_ISA_EXT_SUPERSET (smnpm , RISCV_ISA_EXT_SMNPM , riscv_xlinuxenvcfg_exts ),
@@ -1003,16 +1076,6 @@ void __init riscv_fill_hwcap(void)
1003
1076
riscv_v_setup_vsize ();
1004
1077
}
1005
1078
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
-
1016
1079
memset (print_str , 0 , sizeof (print_str ));
1017
1080
for (i = 0 , j = 0 ; i < NUM_ALPHA_EXTS ; i ++ )
1018
1081
if (riscv_isa [0 ] & BIT_MASK (i ))
0 commit comments