]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
Merge patch series "Add some validation for vector, vector crypto and fp stuff"
authorAlexandre Ghiti <alexghiti@rivosinc.com>
Tue, 1 Apr 2025 07:06:41 +0000 (07:06 +0000)
committerAlexandre Ghiti <alexghiti@rivosinc.com>
Tue, 1 Apr 2025 07:06:41 +0000 (07:06 +0000)
Conor Dooley <conor@kernel.org> says:

From: Conor Dooley <conor.dooley@microchip.com>

Yo,

This series is partly leveraging Clement's work adding a validate
callback in the extension detection code so that things like checking
for whether a vector crypto extension is usable can be done like:
has_extension(<vector crypto>)
rather than
has_vector() && has_extension(<vector crypto>)
which Eric pointed out was a poor design some months ago.

The rest of this is adding some requirements to the bindings that
prevent combinations of extensions disallowed by the ISA.

There's a bunch of over-long lines in here, but I thought that the
over-long lines were clearer than breaking them up.

Cheers,
Conor.

* patches from https://lore.kernel.org/r/20250312-abide-pancreas-3576b8c44d2c@spud:
  dt-bindings: riscv: document vector crypto requirements
  dt-bindings: riscv: add vector sub-extension dependencies
  dt-bindings: riscv: d requires f
  RISC-V: add f & d extension validation checks
  RISC-V: add vector crypto extension validation checks
  RISC-V: add vector extension validation checks

Link: https://lore.kernel.org/r/20250312-abide-pancreas-3576b8c44d2c@spud
Signed-off-by: Alexandre Ghiti <alexghiti@rivosinc.com>
1  2 
Documentation/devicetree/bindings/riscv/extensions.yaml
arch/riscv/include/asm/cpufeature.h
arch/riscv/kernel/cpufeature.c

index 73d8fec29ec2ccc0308934e52266bc42ad81975a,9aeb9d4731cac2b4fc98de06d447553053d36c4c..bcab59e0cc2e1d90e1bbc939422fbe1d8f3643e8
@@@ -703,41 -679,86 +709,120 @@@ properties
          then:
            contains:
              const: zca
 +      # Zfbfmin depends on F
 +      - if:
 +          contains:
 +            const: zfbfmin
 +        then:
 +          contains:
 +            const: f
 +      # Zvfbfmin depends on V or Zve32f
 +      - if:
 +          contains:
 +            const: zvfbfmin
 +        then:
 +          oneOf:
 +            - contains:
 +                const: v
 +            - contains:
 +                const: zve32f
 +      # Zvfbfwma depends on Zfbfmin and Zvfbfmin
 +      - if:
 +          contains:
 +            const: zvfbfwma
 +        then:
 +          allOf:
 +            - contains:
 +                const: zfbfmin
 +            - contains:
 +                const: zvfbfmin
 +      # Zacas depends on Zaamo
 +      - if:
 +          contains:
 +            const: zacas
 +        then:
 +          contains:
 +            const: zaamo
  
+       - if:
+           contains:
+             const: zve32x
+         then:
+           contains:
+             const: zicsr
+       - if:
+           contains:
+             const: zve32f
+         then:
+           allOf:
+             - contains:
+                 const: f
+             - contains:
+                 const: zve32x
+       - if:
+           contains:
+             const: zve64x
+         then:
+           contains:
+             const: zve32x
+       - if:
+           contains:
+             const: zve64f
+         then:
+           allOf:
+             - contains:
+                 const: f
+             - contains:
+                 const: zve32f
+             - contains:
+                 const: zve64x
+       - if:
+           contains:
+             const: zve64d
+         then:
+           allOf:
+             - contains:
+                 const: d
+             - contains:
+                 const: zve64f
+       - if:
+           contains:
+             anyOf:
+               - const: zvbc
+               - const: zvkn
+               - const: zvknc
+               - const: zvkng
+               - const: zvknhb
+               - const: zvksc
+         then:
+           contains:
+             anyOf:
+               - const: v
+               - const: zve64x
+       - if:
+           contains:
+             anyOf:
+               - const: zvbb
+               - const: zvkb
+               - const: zvkg
+               - const: zvkned
+               - const: zvknha
+               - const: zvksed
+               - const: zvksh
+               - const: zvks
+               - const: zvkt
+         then:
+           contains:
+             anyOf:
+               - const: v
+               - const: zve32x
  allOf:
    # Zcf extension does not exist on rv64
    - if:
Simple merge
index af9c346da96e94508fbb0ff6ff86f94f5d45a8c5,4024da3fc1ddf376fd17ac4b499d003e1472f44c..2054f6c4b0ae1fd27a160e64a452cd755d7852c0
@@@ -358,17 -397,15 +434,15 @@@ static const unsigned int riscv_c_exts[
  const struct riscv_isa_ext_data riscv_isa_ext[] = {
        __RISCV_ISA_EXT_DATA(i, RISCV_ISA_EXT_i),
        __RISCV_ISA_EXT_DATA(m, RISCV_ISA_EXT_m),
 -      __RISCV_ISA_EXT_DATA(a, RISCV_ISA_EXT_a),
 +      __RISCV_ISA_EXT_SUPERSET(a, RISCV_ISA_EXT_a, riscv_a_exts),
-       __RISCV_ISA_EXT_DATA(f, RISCV_ISA_EXT_f),
-       __RISCV_ISA_EXT_DATA(d, RISCV_ISA_EXT_d),
+       __RISCV_ISA_EXT_DATA_VALIDATE(f, RISCV_ISA_EXT_f, riscv_ext_f_validate),
+       __RISCV_ISA_EXT_DATA_VALIDATE(d, RISCV_ISA_EXT_d, riscv_ext_d_validate),
        __RISCV_ISA_EXT_DATA(q, RISCV_ISA_EXT_q),
        __RISCV_ISA_EXT_SUPERSET(c, RISCV_ISA_EXT_c, riscv_c_exts),
-       __RISCV_ISA_EXT_SUPERSET(v, RISCV_ISA_EXT_v, riscv_v_exts),
+       __RISCV_ISA_EXT_SUPERSET_VALIDATE(v, RISCV_ISA_EXT_v, riscv_v_exts, riscv_ext_vector_float_validate),
        __RISCV_ISA_EXT_DATA(h, RISCV_ISA_EXT_h),
-       __RISCV_ISA_EXT_SUPERSET_VALIDATE(zicbom, RISCV_ISA_EXT_ZICBOM, riscv_xlinuxenvcfg_exts,
-                                         riscv_ext_zicbom_validate),
-       __RISCV_ISA_EXT_SUPERSET_VALIDATE(zicboz, RISCV_ISA_EXT_ZICBOZ, riscv_xlinuxenvcfg_exts,
-                                         riscv_ext_zicboz_validate),
+       __RISCV_ISA_EXT_SUPERSET_VALIDATE(zicbom, RISCV_ISA_EXT_ZICBOM, riscv_xlinuxenvcfg_exts, riscv_ext_zicbom_validate),
+       __RISCV_ISA_EXT_SUPERSET_VALIDATE(zicboz, RISCV_ISA_EXT_ZICBOZ, riscv_xlinuxenvcfg_exts, riscv_ext_zicboz_validate),
        __RISCV_ISA_EXT_DATA(ziccrse, RISCV_ISA_EXT_ZICCRSE),
        __RISCV_ISA_EXT_DATA(zicntr, RISCV_ISA_EXT_ZICNTR),
        __RISCV_ISA_EXT_DATA(zicond, RISCV_ISA_EXT_ZICOND),
        __RISCV_ISA_EXT_DATA(zksed, RISCV_ISA_EXT_ZKSED),
        __RISCV_ISA_EXT_DATA(zksh, RISCV_ISA_EXT_ZKSH),
        __RISCV_ISA_EXT_DATA(ztso, RISCV_ISA_EXT_ZTSO),
-       __RISCV_ISA_EXT_SUPERSET(zvbb, RISCV_ISA_EXT_ZVBB, riscv_zvbb_exts),
-       __RISCV_ISA_EXT_DATA(zvbc, RISCV_ISA_EXT_ZVBC),
-       __RISCV_ISA_EXT_SUPERSET(zve32f, RISCV_ISA_EXT_ZVE32F, riscv_zve32f_exts),
-       __RISCV_ISA_EXT_DATA(zve32x, RISCV_ISA_EXT_ZVE32X),
-       __RISCV_ISA_EXT_SUPERSET(zve64d, RISCV_ISA_EXT_ZVE64D, riscv_zve64d_exts),
-       __RISCV_ISA_EXT_SUPERSET(zve64f, RISCV_ISA_EXT_ZVE64F, riscv_zve64f_exts),
-       __RISCV_ISA_EXT_SUPERSET(zve64x, RISCV_ISA_EXT_ZVE64X, riscv_zve64x_exts),
+       __RISCV_ISA_EXT_SUPERSET_VALIDATE(zvbb, RISCV_ISA_EXT_ZVBB, riscv_zvbb_exts, riscv_ext_vector_crypto_validate),
+       __RISCV_ISA_EXT_DATA_VALIDATE(zvbc, RISCV_ISA_EXT_ZVBC, riscv_ext_vector_crypto_validate),
+       __RISCV_ISA_EXT_SUPERSET_VALIDATE(zve32f, RISCV_ISA_EXT_ZVE32F, riscv_zve32f_exts, riscv_ext_vector_float_validate),
+       __RISCV_ISA_EXT_DATA_VALIDATE(zve32x, RISCV_ISA_EXT_ZVE32X, riscv_ext_vector_x_validate),
+       __RISCV_ISA_EXT_SUPERSET_VALIDATE(zve64d, RISCV_ISA_EXT_ZVE64D, riscv_zve64d_exts, riscv_ext_vector_float_validate),
+       __RISCV_ISA_EXT_SUPERSET_VALIDATE(zve64f, RISCV_ISA_EXT_ZVE64F, riscv_zve64f_exts, riscv_ext_vector_float_validate),
+       __RISCV_ISA_EXT_SUPERSET_VALIDATE(zve64x, RISCV_ISA_EXT_ZVE64X, riscv_zve64x_exts, riscv_ext_vector_x_validate),
 +      __RISCV_ISA_EXT_DATA_VALIDATE(zvfbfmin, RISCV_ISA_EXT_ZVFBFMIN, riscv_vector_f_validate),
-       __RISCV_ISA_EXT_DATA_VALIDATE(zvfbfwma, RISCV_ISA_EXT_ZVFBFWMA,
-                                     riscv_ext_zvfbfwma_validate),
++      __RISCV_ISA_EXT_DATA_VALIDATE(zvfbfwma, RISCV_ISA_EXT_ZVFBFWMA, riscv_ext_zvfbfwma_validate),
        __RISCV_ISA_EXT_DATA(zvfh, RISCV_ISA_EXT_ZVFH),
        __RISCV_ISA_EXT_DATA(zvfhmin, RISCV_ISA_EXT_ZVFHMIN),
-       __RISCV_ISA_EXT_DATA(zvkb, RISCV_ISA_EXT_ZVKB),
-       __RISCV_ISA_EXT_DATA(zvkg, RISCV_ISA_EXT_ZVKG),
-       __RISCV_ISA_EXT_BUNDLE(zvkn, riscv_zvkn_bundled_exts),
-       __RISCV_ISA_EXT_BUNDLE(zvknc, riscv_zvknc_bundled_exts),
-       __RISCV_ISA_EXT_DATA(zvkned, RISCV_ISA_EXT_ZVKNED),
-       __RISCV_ISA_EXT_BUNDLE(zvkng, riscv_zvkng_bundled_exts),
-       __RISCV_ISA_EXT_DATA(zvknha, RISCV_ISA_EXT_ZVKNHA),
-       __RISCV_ISA_EXT_DATA(zvknhb, RISCV_ISA_EXT_ZVKNHB),
-       __RISCV_ISA_EXT_BUNDLE(zvks, riscv_zvks_bundled_exts),
-       __RISCV_ISA_EXT_BUNDLE(zvksc, riscv_zvksc_bundled_exts),
-       __RISCV_ISA_EXT_DATA(zvksed, RISCV_ISA_EXT_ZVKSED),
-       __RISCV_ISA_EXT_DATA(zvksh, RISCV_ISA_EXT_ZVKSH),
-       __RISCV_ISA_EXT_BUNDLE(zvksg, riscv_zvksg_bundled_exts),
-       __RISCV_ISA_EXT_DATA(zvkt, RISCV_ISA_EXT_ZVKT),
+       __RISCV_ISA_EXT_DATA_VALIDATE(zvkb, RISCV_ISA_EXT_ZVKB, riscv_ext_vector_crypto_validate),
+       __RISCV_ISA_EXT_DATA_VALIDATE(zvkg, RISCV_ISA_EXT_ZVKG, riscv_ext_vector_crypto_validate),
+       __RISCV_ISA_EXT_BUNDLE_VALIDATE(zvkn, riscv_zvkn_bundled_exts, riscv_ext_vector_crypto_validate),
+       __RISCV_ISA_EXT_BUNDLE_VALIDATE(zvknc, riscv_zvknc_bundled_exts, riscv_ext_vector_crypto_validate),
+       __RISCV_ISA_EXT_DATA_VALIDATE(zvkned, RISCV_ISA_EXT_ZVKNED, riscv_ext_vector_crypto_validate),
+       __RISCV_ISA_EXT_BUNDLE_VALIDATE(zvkng, riscv_zvkng_bundled_exts, riscv_ext_vector_crypto_validate),
+       __RISCV_ISA_EXT_DATA_VALIDATE(zvknha, RISCV_ISA_EXT_ZVKNHA, riscv_ext_vector_crypto_validate),
+       __RISCV_ISA_EXT_DATA_VALIDATE(zvknhb, RISCV_ISA_EXT_ZVKNHB, riscv_ext_vector_crypto_validate),
+       __RISCV_ISA_EXT_BUNDLE_VALIDATE(zvks, riscv_zvks_bundled_exts, riscv_ext_vector_crypto_validate),
+       __RISCV_ISA_EXT_BUNDLE_VALIDATE(zvksc, riscv_zvksc_bundled_exts, riscv_ext_vector_crypto_validate),
+       __RISCV_ISA_EXT_DATA_VALIDATE(zvksed, RISCV_ISA_EXT_ZVKSED, riscv_ext_vector_crypto_validate),
+       __RISCV_ISA_EXT_DATA_VALIDATE(zvksh, RISCV_ISA_EXT_ZVKSH, riscv_ext_vector_crypto_validate),
+       __RISCV_ISA_EXT_BUNDLE_VALIDATE(zvksg, riscv_zvksg_bundled_exts, riscv_ext_vector_crypto_validate),
+       __RISCV_ISA_EXT_DATA_VALIDATE(zvkt, RISCV_ISA_EXT_ZVKT, riscv_ext_vector_crypto_validate),
        __RISCV_ISA_EXT_DATA(smaia, RISCV_ISA_EXT_SMAIA),
        __RISCV_ISA_EXT_DATA(smmpm, RISCV_ISA_EXT_SMMPM),
        __RISCV_ISA_EXT_SUPERSET(smnpm, RISCV_ISA_EXT_SMNPM, riscv_xlinuxenvcfg_exts),