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