Torsten Duwe 588782
From 642a7d49c249f04007e68c124a148847471dd476 Mon Sep 17 00:00:00 2001
Torsten Duwe 588782
From: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
Torsten Duwe 588782
Date: Tue, 18 Jan 2022 10:35:15 +0000
Torsten Duwe 588782
Subject: [PATCH] crypto: qat - fix access to PFVF interrupt registers for GEN4
Torsten Duwe 588782
Git-commit: 642a7d49c249f04007e68c124a148847471dd476
Torsten Duwe 588782
Patch-mainline: v5.18-rc1
Torsten Duwe 588782
References: jsc#PED-1073
Torsten Duwe 588782
Torsten Duwe 588782
The logic that detects, enables and disables pfvf interrupts was
Torsten Duwe 588782
expecting a single CSR per VF. Instead, the source and mask register are
Torsten Duwe 588782
two registers with a bit per VF.
Torsten Duwe 588782
Due to this, the driver is reading and setting reserved CSRs and not
Torsten Duwe 588782
masking the correct source of interrupts.
Torsten Duwe 588782
Torsten Duwe 588782
Fix the access to the source and mask register for QAT GEN4 devices by
Torsten Duwe 588782
removing the outer loop in adf_gen4_get_vf2pf_sources(),
Torsten Duwe 588782
adf_gen4_enable_vf2pf_interrupts() and
Torsten Duwe 588782
adf_gen4_disable_vf2pf_interrupts() and changing the helper macros
Torsten Duwe 588782
ADF_4XXX_VM2PF_SOU and ADF_4XXX_VM2PF_MSK.
Torsten Duwe 588782
Torsten Duwe 588782
Fixes: a9dc0d966605 ("crypto: qat - add PFVF support to the GEN4 host driver")
Torsten Duwe 588782
Signed-off-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
Torsten Duwe 588782
Co-developed-by: Siming Wan <siming.wan@intel.com>
Torsten Duwe 588782
Signed-off-by: Siming Wan <siming.wan@intel.com>
Torsten Duwe 588782
Reviewed-by: Xin Zeng <xin.zeng@intel.com>
Torsten Duwe 588782
Reviewed-by: Wojciech Ziemba <wojciech.ziemba@intel.com>
Torsten Duwe 588782
Reviewed-by: Marco Chiappero <marco.chiappero@intel.com>
Torsten Duwe 588782
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Torsten Duwe 588782
Signed-off-by: Torsten Duwe <duwe@suse.de>
Torsten Duwe 588782
Torsten Duwe 588782
---
Torsten Duwe 588782
 drivers/crypto/qat/qat_common/adf_gen4_pfvf.c | 42 ++++---------------
Torsten Duwe 588782
 1 file changed, 9 insertions(+), 33 deletions(-)
Torsten Duwe 588782
Torsten Duwe 588782
diff --git a/drivers/crypto/qat/qat_common/adf_gen4_pfvf.c b/drivers/crypto/qat/qat_common/adf_gen4_pfvf.c
Torsten Duwe 588782
index 8efbedf63bc80..3b3ea849c5e53 100644
Torsten Duwe 588782
--- a/drivers/crypto/qat/qat_common/adf_gen4_pfvf.c
Torsten Duwe 588782
+++ b/drivers/crypto/qat/qat_common/adf_gen4_pfvf.c
Torsten Duwe 588782
@@ -9,15 +9,12 @@
Torsten Duwe 588782
 #include "adf_pfvf_pf_proto.h"
Torsten Duwe 588782
 #include "adf_pfvf_utils.h"
Torsten Duwe 588782
 
Torsten Duwe 588782
-#define ADF_4XXX_MAX_NUM_VFS		16
Torsten Duwe 588782
-
Torsten Duwe 588782
 #define ADF_4XXX_PF2VM_OFFSET(i)	(0x40B010 + ((i) * 0x20))
Torsten Duwe 588782
 #define ADF_4XXX_VM2PF_OFFSET(i)	(0x40B014 + ((i) * 0x20))
Torsten Duwe 588782
 
Torsten Duwe 588782
 /* VF2PF interrupt source registers */
Torsten Duwe 588782
-#define ADF_4XXX_VM2PF_SOU(i)		(0x41A180 + ((i) * 4))
Torsten Duwe 588782
-#define ADF_4XXX_VM2PF_MSK(i)		(0x41A1C0 + ((i) * 4))
Torsten Duwe 588782
-#define ADF_4XXX_VM2PF_INT_EN_MSK	BIT(0)
Torsten Duwe 588782
+#define ADF_4XXX_VM2PF_SOU		0x41A180
Torsten Duwe 588782
+#define ADF_4XXX_VM2PF_MSK		0x41A1C0
Torsten Duwe 588782
 
Torsten Duwe 588782
 #define ADF_PFVF_GEN4_MSGTYPE_SHIFT	2
Torsten Duwe 588782
 #define ADF_PFVF_GEN4_MSGTYPE_MASK	0x3F
Torsten Duwe 588782
@@ -41,51 +38,30 @@ static u32 adf_gen4_pf_get_vf2pf_offset(u32 i)
Torsten Duwe 588782
 
Torsten Duwe 588782
 static u32 adf_gen4_get_vf2pf_sources(void __iomem *pmisc_addr)
Torsten Duwe 588782
 {
Torsten Duwe 588782
-	int i;
Torsten Duwe 588782
 	u32 sou, mask;
Torsten Duwe 588782
-	int num_csrs = ADF_4XXX_MAX_NUM_VFS;
Torsten Duwe 588782
-	u32 vf_mask = 0;
Torsten Duwe 588782
 
Torsten Duwe 588782
-	for (i = 0; i < num_csrs; i++) {
Torsten Duwe 588782
-		sou = ADF_CSR_RD(pmisc_addr, ADF_4XXX_VM2PF_SOU(i));
Torsten Duwe 588782
-		mask = ADF_CSR_RD(pmisc_addr, ADF_4XXX_VM2PF_MSK(i));
Torsten Duwe 588782
-		sou &= ~mask;
Torsten Duwe 588782
-		vf_mask |= sou << i;
Torsten Duwe 588782
-	}
Torsten Duwe 588782
+	sou = ADF_CSR_RD(pmisc_addr, ADF_4XXX_VM2PF_SOU);
Torsten Duwe 588782
+	mask = ADF_CSR_RD(pmisc_addr, ADF_4XXX_VM2PF_MSK);
Torsten Duwe 588782
 
Torsten Duwe 588782
-	return vf_mask;
Torsten Duwe 588782
+	return sou &= ~mask;
Torsten Duwe 588782
 }
Torsten Duwe 588782
 
Torsten Duwe 588782
 static void adf_gen4_enable_vf2pf_interrupts(void __iomem *pmisc_addr,
Torsten Duwe 588782
 					     u32 vf_mask)
Torsten Duwe 588782
 {
Torsten Duwe 588782
-	int num_csrs = ADF_4XXX_MAX_NUM_VFS;
Torsten Duwe 588782
-	unsigned long mask = vf_mask;
Torsten Duwe 588782
 	unsigned int val;
Torsten Duwe 588782
-	int i;
Torsten Duwe 588782
-
Torsten Duwe 588782
-	for_each_set_bit(i, &mask, num_csrs) {
Torsten Duwe 588782
-		unsigned int offset = ADF_4XXX_VM2PF_MSK(i);
Torsten Duwe 588782
 
Torsten Duwe 588782
-		val = ADF_CSR_RD(pmisc_addr, offset) & ~ADF_4XXX_VM2PF_INT_EN_MSK;
Torsten Duwe 588782
-		ADF_CSR_WR(pmisc_addr, offset, val);
Torsten Duwe 588782
-	}
Torsten Duwe 588782
+	val = ADF_CSR_RD(pmisc_addr, ADF_4XXX_VM2PF_MSK) & ~vf_mask;
Torsten Duwe 588782
+	ADF_CSR_WR(pmisc_addr, ADF_4XXX_VM2PF_MSK, val);
Torsten Duwe 588782
 }
Torsten Duwe 588782
 
Torsten Duwe 588782
 static void adf_gen4_disable_vf2pf_interrupts(void __iomem *pmisc_addr,
Torsten Duwe 588782
 					      u32 vf_mask)
Torsten Duwe 588782
 {
Torsten Duwe 588782
-	int num_csrs = ADF_4XXX_MAX_NUM_VFS;
Torsten Duwe 588782
-	unsigned long mask = vf_mask;
Torsten Duwe 588782
 	unsigned int val;
Torsten Duwe 588782
-	int i;
Torsten Duwe 588782
-
Torsten Duwe 588782
-	for_each_set_bit(i, &mask, num_csrs) {
Torsten Duwe 588782
-		unsigned int offset = ADF_4XXX_VM2PF_MSK(i);
Torsten Duwe 588782
 
Torsten Duwe 588782
-		val = ADF_CSR_RD(pmisc_addr, offset) | ADF_4XXX_VM2PF_INT_EN_MSK;
Torsten Duwe 588782
-		ADF_CSR_WR(pmisc_addr, offset, val);
Torsten Duwe 588782
-	}
Torsten Duwe 588782
+	val = ADF_CSR_RD(pmisc_addr, ADF_4XXX_VM2PF_MSK) | vf_mask;
Torsten Duwe 588782
+	ADF_CSR_WR(pmisc_addr, ADF_4XXX_VM2PF_MSK, val);
Torsten Duwe 588782
 }
Torsten Duwe 588782
 
Torsten Duwe 588782
 static int adf_gen4_pfvf_send(struct adf_accel_dev *accel_dev,
Torsten Duwe 588782
-- 
Torsten Duwe 588782
2.35.3
Torsten Duwe 588782