Skip to content

Commit 38077ec

Browse files
ConchuODAlexandre Ghiti
authored andcommitted
RISC-V: add vector crypto extension validation checks
Using Clement's new validation callbacks, support checking that dependencies have been satisfied for the vector crpyto extensions. Currently riscv_isa_extension_available(<vector crypto>) will return true on systems that support the extensions but vector itself has been disabled by the kernel, adding validation callbacks will prevent such a scenario from occuring and make the behaviour of the extension detection functions more consistent with user expectations - it's not expected to have to check for vector AND the specific crypto extension. The Unpriv spec states: | The Zvknhb and Zvbc Vector Crypto Extensions --and accordingly the | composite extensions Zvkn, Zvknc, Zvkng, and Zvksc-- require a Zve64x | base, or application ("V") base Vector Extension. All of the other | Vector Crypto Extensions can be built on any embedded (Zve*) or | application ("V") base Vector Extension. While this could be used as the basis for checking that the correct base for individual crypto extensions, but that's not really the kernel's job in my opinion and it is sufficient to leave that sort of precision to the dt-bindings. The kernel only needs to make sure that vector, in some form, is available. Link: https://github.com/riscv/riscv-isa-manual/blob/main/src/vector-crypto.adoc#extensions-overview Signed-off-by: Conor Dooley <conor.dooley@microchip.com> Link: https://lore.kernel.org/r/20250312-entertain-shaking-b664142c2f99@spud Signed-off-by: Alexandre Ghiti <alexghiti@rivosinc.com>
1 parent 9324571 commit 38077ec

File tree

1 file changed

+33
-16
lines changed

1 file changed

+33
-16
lines changed

arch/riscv/kernel/cpufeature.c

Lines changed: 33 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,23 @@ static int riscv_ext_vector_float_validate(const struct riscv_isa_ext_data *data
141141
return 0;
142142
}
143143

144+
static int riscv_ext_vector_crypto_validate(const struct riscv_isa_ext_data *data,
145+
const unsigned long *isa_bitmap)
146+
{
147+
if (!IS_ENABLED(CONFIG_RISCV_ISA_V))
148+
return -EINVAL;
149+
150+
/*
151+
* It isn't the kernel's job to check that the binding is correct, so
152+
* it should be enough to check that any of the vector extensions are
153+
* enabled, which in-turn means that vector is usable in this kernel
154+
*/
155+
if (!__riscv_isa_extension_available(isa_bitmap, RISCV_ISA_EXT_ZVE32X))
156+
return -EPROBE_DEFER;
157+
158+
return 0;
159+
}
160+
144161
static int riscv_ext_zca_depends(const struct riscv_isa_ext_data *data,
145162
const unsigned long *isa_bitmap)
146163
{
@@ -400,29 +417,29 @@ const struct riscv_isa_ext_data riscv_isa_ext[] = {
400417
__RISCV_ISA_EXT_DATA(zksed, RISCV_ISA_EXT_ZKSED),
401418
__RISCV_ISA_EXT_DATA(zksh, RISCV_ISA_EXT_ZKSH),
402419
__RISCV_ISA_EXT_DATA(ztso, RISCV_ISA_EXT_ZTSO),
403-
__RISCV_ISA_EXT_SUPERSET(zvbb, RISCV_ISA_EXT_ZVBB, riscv_zvbb_exts),
404-
__RISCV_ISA_EXT_DATA(zvbc, RISCV_ISA_EXT_ZVBC),
420+
__RISCV_ISA_EXT_SUPERSET_VALIDATE(zvbb, RISCV_ISA_EXT_ZVBB, riscv_zvbb_exts, riscv_ext_vector_crypto_validate),
421+
__RISCV_ISA_EXT_DATA_VALIDATE(zvbc, RISCV_ISA_EXT_ZVBC, riscv_ext_vector_crypto_validate),
405422
__RISCV_ISA_EXT_SUPERSET_VALIDATE(zve32f, RISCV_ISA_EXT_ZVE32F, riscv_zve32f_exts, riscv_ext_vector_float_validate),
406423
__RISCV_ISA_EXT_DATA_VALIDATE(zve32x, RISCV_ISA_EXT_ZVE32X, riscv_ext_vector_x_validate),
407424
__RISCV_ISA_EXT_SUPERSET_VALIDATE(zve64d, RISCV_ISA_EXT_ZVE64D, riscv_zve64d_exts, riscv_ext_vector_float_validate),
408425
__RISCV_ISA_EXT_SUPERSET_VALIDATE(zve64f, RISCV_ISA_EXT_ZVE64F, riscv_zve64f_exts, riscv_ext_vector_float_validate),
409426
__RISCV_ISA_EXT_SUPERSET_VALIDATE(zve64x, RISCV_ISA_EXT_ZVE64X, riscv_zve64x_exts, riscv_ext_vector_x_validate),
410427
__RISCV_ISA_EXT_DATA(zvfh, RISCV_ISA_EXT_ZVFH),
411428
__RISCV_ISA_EXT_DATA(zvfhmin, RISCV_ISA_EXT_ZVFHMIN),
412-
__RISCV_ISA_EXT_DATA(zvkb, RISCV_ISA_EXT_ZVKB),
413-
__RISCV_ISA_EXT_DATA(zvkg, RISCV_ISA_EXT_ZVKG),
414-
__RISCV_ISA_EXT_BUNDLE(zvkn, riscv_zvkn_bundled_exts),
415-
__RISCV_ISA_EXT_BUNDLE(zvknc, riscv_zvknc_bundled_exts),
416-
__RISCV_ISA_EXT_DATA(zvkned, RISCV_ISA_EXT_ZVKNED),
417-
__RISCV_ISA_EXT_BUNDLE(zvkng, riscv_zvkng_bundled_exts),
418-
__RISCV_ISA_EXT_DATA(zvknha, RISCV_ISA_EXT_ZVKNHA),
419-
__RISCV_ISA_EXT_DATA(zvknhb, RISCV_ISA_EXT_ZVKNHB),
420-
__RISCV_ISA_EXT_BUNDLE(zvks, riscv_zvks_bundled_exts),
421-
__RISCV_ISA_EXT_BUNDLE(zvksc, riscv_zvksc_bundled_exts),
422-
__RISCV_ISA_EXT_DATA(zvksed, RISCV_ISA_EXT_ZVKSED),
423-
__RISCV_ISA_EXT_DATA(zvksh, RISCV_ISA_EXT_ZVKSH),
424-
__RISCV_ISA_EXT_BUNDLE(zvksg, riscv_zvksg_bundled_exts),
425-
__RISCV_ISA_EXT_DATA(zvkt, RISCV_ISA_EXT_ZVKT),
429+
__RISCV_ISA_EXT_DATA_VALIDATE(zvkb, RISCV_ISA_EXT_ZVKB, riscv_ext_vector_crypto_validate),
430+
__RISCV_ISA_EXT_DATA_VALIDATE(zvkg, RISCV_ISA_EXT_ZVKG, riscv_ext_vector_crypto_validate),
431+
__RISCV_ISA_EXT_BUNDLE_VALIDATE(zvkn, riscv_zvkn_bundled_exts, riscv_ext_vector_crypto_validate),
432+
__RISCV_ISA_EXT_BUNDLE_VALIDATE(zvknc, riscv_zvknc_bundled_exts, riscv_ext_vector_crypto_validate),
433+
__RISCV_ISA_EXT_DATA_VALIDATE(zvkned, RISCV_ISA_EXT_ZVKNED, riscv_ext_vector_crypto_validate),
434+
__RISCV_ISA_EXT_BUNDLE_VALIDATE(zvkng, riscv_zvkng_bundled_exts, riscv_ext_vector_crypto_validate),
435+
__RISCV_ISA_EXT_DATA_VALIDATE(zvknha, RISCV_ISA_EXT_ZVKNHA, riscv_ext_vector_crypto_validate),
436+
__RISCV_ISA_EXT_DATA_VALIDATE(zvknhb, RISCV_ISA_EXT_ZVKNHB, riscv_ext_vector_crypto_validate),
437+
__RISCV_ISA_EXT_BUNDLE_VALIDATE(zvks, riscv_zvks_bundled_exts, riscv_ext_vector_crypto_validate),
438+
__RISCV_ISA_EXT_BUNDLE_VALIDATE(zvksc, riscv_zvksc_bundled_exts, riscv_ext_vector_crypto_validate),
439+
__RISCV_ISA_EXT_DATA_VALIDATE(zvksed, RISCV_ISA_EXT_ZVKSED, riscv_ext_vector_crypto_validate),
440+
__RISCV_ISA_EXT_DATA_VALIDATE(zvksh, RISCV_ISA_EXT_ZVKSH, riscv_ext_vector_crypto_validate),
441+
__RISCV_ISA_EXT_BUNDLE_VALIDATE(zvksg, riscv_zvksg_bundled_exts, riscv_ext_vector_crypto_validate),
442+
__RISCV_ISA_EXT_DATA_VALIDATE(zvkt, RISCV_ISA_EXT_ZVKT, riscv_ext_vector_crypto_validate),
426443
__RISCV_ISA_EXT_DATA(smaia, RISCV_ISA_EXT_SMAIA),
427444
__RISCV_ISA_EXT_DATA(smmpm, RISCV_ISA_EXT_SMMPM),
428445
__RISCV_ISA_EXT_SUPERSET(smnpm, RISCV_ISA_EXT_SMNPM, riscv_xlinuxenvcfg_exts),

0 commit comments

Comments
 (0)