]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
crypto: qat - fix virtual channel configuration for GEN6 devices
authorSuman Kumar Chakraborty <suman.kumar.chakraborty@intel.com>
Mon, 7 Jul 2025 08:54:17 +0000 (09:54 +0100)
committerHerbert Xu <herbert@gondor.apana.org.au>
Fri, 18 Jul 2025 10:51:59 +0000 (20:51 +1000)
The TCVCMAP (Traffic Class to Virtual Channel Mapping) field in the
PVC0CTL and PVC1CTL register controls how traffic classes are mapped to
virtual channels in QAT GEN6 hardware.

The driver previously wrote a default TCVCMAP value to this register, but
this configuration was incorrect.

Modify the TCVCMAP configuration to explicitly enable both VC0 and VC1,
and map Traffic Classes 0 to 7 → VC0 and Traffic Class 8 → VC1.
Replace FIELD_PREP() with FIELD_MODIFY() to ensure that only the intended
TCVCMAP field is updated, preserving other bits in the register. This
prevents unintended overwrites of unrelated configuration fields when
modifying TC to VC mappings.

Fixes: 17fd7514ae68 ("crypto: qat - add qat_6xxx driver")
Signed-off-by: Suman Kumar Chakraborty <suman.kumar.chakraborty@intel.com>
Reviewed-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/intel/qat/qat_6xxx/adf_6xxx_hw_data.c
drivers/crypto/intel/qat/qat_6xxx/adf_6xxx_hw_data.h

index 4d93d5a56ba33cf9e12f3e4ff48491873983dbe6..a21a10a8338f2fe7990148d7d7216c88eb3772b9 100644 (file)
@@ -532,8 +532,8 @@ static void set_vc_csr_for_bank(void __iomem *csr, u32 bank_number)
         * driver must program the ringmodectl CSRs.
         */
        value = ADF_CSR_RD(csr, ADF_GEN6_CSR_RINGMODECTL(bank_number));
-       value |= FIELD_PREP(ADF_GEN6_RINGMODECTL_TC_MASK, ADF_GEN6_RINGMODECTL_TC_DEFAULT);
-       value |= FIELD_PREP(ADF_GEN6_RINGMODECTL_TC_EN_MASK, ADF_GEN6_RINGMODECTL_TC_EN_OP1);
+       FIELD_MODIFY(ADF_GEN6_RINGMODECTL_TC_MASK, &value, ADF_GEN6_RINGMODECTL_TC_DEFAULT);
+       FIELD_MODIFY(ADF_GEN6_RINGMODECTL_TC_EN_MASK, &value, ADF_GEN6_RINGMODECTL_TC_EN_OP1);
        ADF_CSR_WR(csr, ADF_GEN6_CSR_RINGMODECTL(bank_number), value);
 }
 
@@ -549,7 +549,7 @@ static int set_vc_config(struct adf_accel_dev *accel_dev)
         * Read PVC0CTL then write the masked values.
         */
        pci_read_config_dword(pdev, ADF_GEN6_PVC0CTL_OFFSET, &value);
-       value |= FIELD_PREP(ADF_GEN6_PVC0CTL_TCVCMAP_MASK, ADF_GEN6_PVC0CTL_TCVCMAP_DEFAULT);
+       FIELD_MODIFY(ADF_GEN6_PVC0CTL_TCVCMAP_MASK, &value, ADF_GEN6_PVC0CTL_TCVCMAP_DEFAULT);
        err = pci_write_config_dword(pdev, ADF_GEN6_PVC0CTL_OFFSET, value);
        if (err) {
                dev_err(&GET_DEV(accel_dev), "pci write to PVC0CTL failed\n");
@@ -558,8 +558,8 @@ static int set_vc_config(struct adf_accel_dev *accel_dev)
 
        /* Read PVC1CTL then write masked values */
        pci_read_config_dword(pdev, ADF_GEN6_PVC1CTL_OFFSET, &value);
-       value |= FIELD_PREP(ADF_GEN6_PVC1CTL_TCVCMAP_MASK, ADF_GEN6_PVC1CTL_TCVCMAP_DEFAULT);
-       value |= FIELD_PREP(ADF_GEN6_PVC1CTL_VCEN_MASK, ADF_GEN6_PVC1CTL_VCEN_ON);
+       FIELD_MODIFY(ADF_GEN6_PVC1CTL_TCVCMAP_MASK, &value, ADF_GEN6_PVC1CTL_TCVCMAP_DEFAULT);
+       FIELD_MODIFY(ADF_GEN6_PVC1CTL_VCEN_MASK, &value, ADF_GEN6_PVC1CTL_VCEN_ON);
        err = pci_write_config_dword(pdev, ADF_GEN6_PVC1CTL_OFFSET, value);
        if (err)
                dev_err(&GET_DEV(accel_dev), "pci write to PVC1CTL failed\n");
index 78e2e2c5816e5496fda4f19cfebec8df2b7d0281..8824958527c4bdc280ac1574f0cfa512c91b67f4 100644 (file)
@@ -99,7 +99,7 @@
 #define ADF_GEN6_PVC0CTL_OFFSET                        0x204
 #define ADF_GEN6_PVC0CTL_TCVCMAP_OFFSET                1
 #define ADF_GEN6_PVC0CTL_TCVCMAP_MASK          GENMASK(7, 1)
-#define ADF_GEN6_PVC0CTL_TCVCMAP_DEFAULT       0x7F
+#define ADF_GEN6_PVC0CTL_TCVCMAP_DEFAULT       0x3F
 
 /* VC1 Resource Control Register */
 #define ADF_GEN6_PVC1CTL_OFFSET                        0x210