Torsten Duwe f631a9
From 25110fd2e346449355cb795cd0d3e050ca5bdf11 Mon Sep 17 00:00:00 2001
Torsten Duwe f631a9
From: Marco Chiappero <marco.chiappero@intel.com>
Torsten Duwe f631a9
Date: Wed, 17 Nov 2021 14:30:54 +0000
Torsten Duwe f631a9
Subject: [PATCH] crypto: qat - pass the PF2VF responses back to the callers
Torsten Duwe f631a9
Git-commit: 25110fd2e346449355cb795cd0d3e050ca5bdf11
Torsten Duwe f631a9
Patch-mainline: v5.17-rc1
Torsten Duwe f631a9
References: jsc#PED-1073
Torsten Duwe f631a9
Torsten Duwe f631a9
Currently, any PF response to a VF request is fully parsed during the
Torsten Duwe f631a9
interrupt handling. This way the individual response values are stored
Torsten Duwe f631a9
into the accel_dev structure, preventing the caller to access and decode
Torsten Duwe f631a9
the full response message itself.
Torsten Duwe f631a9
Torsten Duwe f631a9
Change this behavior, by letting the API return back the entire message
Torsten Duwe f631a9
to the caller, in order to:
Torsten Duwe f631a9
  - keep correlated code together, that is, the (building of the)
Torsten Duwe f631a9
    request and the (decoding of the) response;
Torsten Duwe f631a9
  - avoid polluting the accel_dev data structure with unnecessary and at
Torsten Duwe f631a9
    times temporary values; only the entire message is stored in a
Torsten Duwe f631a9
    temporary buffer.
Torsten Duwe f631a9
Torsten Duwe f631a9
Signed-off-by: Marco Chiappero <marco.chiappero@intel.com>
Torsten Duwe f631a9
Reviewed-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
Torsten Duwe f631a9
Signed-off-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
Torsten Duwe f631a9
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Torsten Duwe f631a9
Signed-off-by: Torsten Duwe <duwe@suse.de>
Torsten Duwe f631a9
Torsten Duwe f631a9
---
Torsten Duwe f631a9
 drivers/crypto/qat/qat_c3xxxvf/adf_drv.c      |  2 +-
Torsten Duwe f631a9
 drivers/crypto/qat/qat_c62xvf/adf_drv.c       |  2 +-
Torsten Duwe f631a9
 .../crypto/qat/qat_common/adf_accel_devices.h |  4 ++--
Torsten Duwe f631a9
 .../crypto/qat/qat_common/adf_pfvf_vf_msg.c   | 23 +++++++++++-------
Torsten Duwe f631a9
 .../crypto/qat/qat_common/adf_pfvf_vf_proto.c | 24 +++++++++----------
Torsten Duwe f631a9
 .../crypto/qat/qat_common/adf_pfvf_vf_proto.h |  2 +-
Torsten Duwe f631a9
 drivers/crypto/qat/qat_dh895xccvf/adf_drv.c   |  2 +-
Torsten Duwe f631a9
 7 files changed, 33 insertions(+), 26 deletions(-)
Torsten Duwe f631a9
Torsten Duwe f631a9
diff --git a/drivers/crypto/qat/qat_c3xxxvf/adf_drv.c b/drivers/crypto/qat/qat_c3xxxvf/adf_drv.c
Torsten Duwe f631a9
index 1df1b868978d9..0ba1d293bb819 100644
Torsten Duwe f631a9
--- a/drivers/crypto/qat/qat_c3xxxvf/adf_drv.c
Torsten Duwe f631a9
+++ b/drivers/crypto/qat/qat_c3xxxvf/adf_drv.c
Torsten Duwe f631a9
@@ -171,7 +171,7 @@ static int adf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
Torsten Duwe f631a9
 	}
Torsten Duwe f631a9
 	pci_set_master(pdev);
Torsten Duwe f631a9
 	/* Completion for VF2PF request/response message exchange */
Torsten Duwe f631a9
-	init_completion(&accel_dev->vf.iov_msg_completion);
Torsten Duwe f631a9
+	init_completion(&accel_dev->vf.msg_received);
Torsten Duwe f631a9
 
Torsten Duwe f631a9
 	ret = qat_crypto_dev_config(accel_dev);
Torsten Duwe f631a9
 	if (ret)
Torsten Duwe f631a9
diff --git a/drivers/crypto/qat/qat_c62xvf/adf_drv.c b/drivers/crypto/qat/qat_c62xvf/adf_drv.c
Torsten Duwe f631a9
index 8103bd81d617a..176d8e2786f47 100644
Torsten Duwe f631a9
--- a/drivers/crypto/qat/qat_c62xvf/adf_drv.c
Torsten Duwe f631a9
+++ b/drivers/crypto/qat/qat_c62xvf/adf_drv.c
Torsten Duwe f631a9
@@ -171,7 +171,7 @@ static int adf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
Torsten Duwe f631a9
 	}
Torsten Duwe f631a9
 	pci_set_master(pdev);
Torsten Duwe f631a9
 	/* Completion for VF2PF request/response message exchange */
Torsten Duwe f631a9
-	init_completion(&accel_dev->vf.iov_msg_completion);
Torsten Duwe f631a9
+	init_completion(&accel_dev->vf.msg_received);
Torsten Duwe f631a9
 
Torsten Duwe f631a9
 	ret = qat_crypto_dev_config(accel_dev);
Torsten Duwe f631a9
 	if (ret)
Torsten Duwe f631a9
diff --git a/drivers/crypto/qat/qat_common/adf_accel_devices.h b/drivers/crypto/qat/qat_common/adf_accel_devices.h
Torsten Duwe f631a9
index 35e62a73f9fa8..b05b217df24c4 100644
Torsten Duwe f631a9
--- a/drivers/crypto/qat/qat_common/adf_accel_devices.h
Torsten Duwe f631a9
+++ b/drivers/crypto/qat/qat_common/adf_accel_devices.h
Torsten Duwe f631a9
@@ -271,8 +271,8 @@ struct adf_accel_dev {
Torsten Duwe f631a9
 			char irq_name[ADF_MAX_MSIX_VECTOR_NAME];
Torsten Duwe f631a9
 			struct tasklet_struct pf2vf_bh_tasklet;
Torsten Duwe f631a9
 			struct mutex vf2pf_lock; /* protect CSR access */
Torsten Duwe f631a9
-			struct completion iov_msg_completion;
Torsten Duwe f631a9
-			u8 compatible;
Torsten Duwe f631a9
+			struct completion msg_received;
Torsten Duwe f631a9
+			u32 response; /* temp field holding pf2vf response */
Torsten Duwe f631a9
 			u8 pf_version;
Torsten Duwe f631a9
 		} vf;
Torsten Duwe f631a9
 	};
Torsten Duwe f631a9
diff --git a/drivers/crypto/qat/qat_common/adf_pfvf_vf_msg.c b/drivers/crypto/qat/qat_common/adf_pfvf_vf_msg.c
Torsten Duwe f631a9
index 7969a644e24b7..d5cccec03a3b3 100644
Torsten Duwe f631a9
--- a/drivers/crypto/qat/qat_common/adf_pfvf_vf_msg.c
Torsten Duwe f631a9
+++ b/drivers/crypto/qat/qat_common/adf_pfvf_vf_msg.c
Torsten Duwe f631a9
@@ -52,7 +52,10 @@ EXPORT_SYMBOL_GPL(adf_vf2pf_notify_shutdown);
Torsten Duwe f631a9
 int adf_vf2pf_request_version(struct adf_accel_dev *accel_dev)
Torsten Duwe f631a9
 {
Torsten Duwe f631a9
 	struct adf_hw_device_data *hw_data = accel_dev->hw_device;
Torsten Duwe f631a9
+	u8 pf_version;
Torsten Duwe f631a9
 	u32 msg = 0;
Torsten Duwe f631a9
+	int compat;
Torsten Duwe f631a9
+	u32 resp;
Torsten Duwe f631a9
 	int ret;
Torsten Duwe f631a9
 
Torsten Duwe f631a9
 	msg = ADF_VF2PF_MSGORIGIN_SYSTEM;
Torsten Duwe f631a9
@@ -60,34 +63,38 @@ int adf_vf2pf_request_version(struct adf_accel_dev *accel_dev)
Torsten Duwe f631a9
 	msg |= ADF_PFVF_COMPAT_THIS_VERSION << ADF_VF2PF_COMPAT_VER_REQ_SHIFT;
Torsten Duwe f631a9
 	BUILD_BUG_ON(ADF_PFVF_COMPAT_THIS_VERSION > 255);
Torsten Duwe f631a9
 
Torsten Duwe f631a9
-	ret = adf_send_vf2pf_req(accel_dev, msg);
Torsten Duwe f631a9
+	ret = adf_send_vf2pf_req(accel_dev, msg, &resp);
Torsten Duwe f631a9
 	if (ret) {
Torsten Duwe f631a9
 		dev_err(&GET_DEV(accel_dev),
Torsten Duwe f631a9
 			"Failed to send Compatibility Version Request.\n");
Torsten Duwe f631a9
 		return ret;
Torsten Duwe f631a9
 	}
Torsten Duwe f631a9
 
Torsten Duwe f631a9
+	pf_version = (resp & ADF_PF2VF_VERSION_RESP_VERS_MASK)
Torsten Duwe f631a9
+		     >> ADF_PF2VF_VERSION_RESP_VERS_SHIFT;
Torsten Duwe f631a9
+	compat = (resp & ADF_PF2VF_VERSION_RESP_RESULT_MASK)
Torsten Duwe f631a9
+		 >> ADF_PF2VF_VERSION_RESP_RESULT_SHIFT;
Torsten Duwe f631a9
+
Torsten Duwe f631a9
 	/* Response from PF received, check compatibility */
Torsten Duwe f631a9
-	switch (accel_dev->vf.compatible) {
Torsten Duwe f631a9
+	switch (compat) {
Torsten Duwe f631a9
 	case ADF_PF2VF_VF_COMPATIBLE:
Torsten Duwe f631a9
 		break;
Torsten Duwe f631a9
 	case ADF_PF2VF_VF_COMPAT_UNKNOWN:
Torsten Duwe f631a9
 		/* VF is newer than PF and decides whether it is compatible */
Torsten Duwe f631a9
-		if (accel_dev->vf.pf_version >= hw_data->min_iov_compat_ver) {
Torsten Duwe f631a9
-			accel_dev->vf.compatible = ADF_PF2VF_VF_COMPATIBLE;
Torsten Duwe f631a9
+		if (pf_version >= hw_data->min_iov_compat_ver)
Torsten Duwe f631a9
 			break;
Torsten Duwe f631a9
-		}
Torsten Duwe f631a9
 		fallthrough;
Torsten Duwe f631a9
 	case ADF_PF2VF_VF_INCOMPATIBLE:
Torsten Duwe f631a9
 		dev_err(&GET_DEV(accel_dev),
Torsten Duwe f631a9
 			"PF (vers %d) and VF (vers %d) are not compatible\n",
Torsten Duwe f631a9
-			accel_dev->vf.pf_version,
Torsten Duwe f631a9
-			ADF_PFVF_COMPAT_THIS_VERSION);
Torsten Duwe f631a9
+			pf_version, ADF_PFVF_COMPAT_THIS_VERSION);
Torsten Duwe f631a9
 		return -EINVAL;
Torsten Duwe f631a9
 	default:
Torsten Duwe f631a9
 		dev_err(&GET_DEV(accel_dev),
Torsten Duwe f631a9
 			"Invalid response from PF; assume not compatible\n");
Torsten Duwe f631a9
 		return -EINVAL;
Torsten Duwe f631a9
 	}
Torsten Duwe f631a9
-	return ret;
Torsten Duwe f631a9
+
Torsten Duwe f631a9
+	accel_dev->vf.pf_version = pf_version;
Torsten Duwe f631a9
+	return 0;
Torsten Duwe f631a9
 }
Torsten Duwe f631a9
diff --git a/drivers/crypto/qat/qat_common/adf_pfvf_vf_proto.c b/drivers/crypto/qat/qat_common/adf_pfvf_vf_proto.c
Torsten Duwe f631a9
index 62817bcec121e..ea1a00e746ff5 100644
Torsten Duwe f631a9
--- a/drivers/crypto/qat/qat_common/adf_pfvf_vf_proto.c
Torsten Duwe f631a9
+++ b/drivers/crypto/qat/qat_common/adf_pfvf_vf_proto.c
Torsten Duwe f631a9
@@ -47,18 +47,19 @@ static u32 adf_recv_pf2vf_msg(struct adf_accel_dev *accel_dev)
Torsten Duwe f631a9
  * adf_send_vf2pf_req() - send VF2PF request message
Torsten Duwe f631a9
  * @accel_dev:	Pointer to acceleration device.
Torsten Duwe f631a9
  * @msg:	Request message to send
Torsten Duwe f631a9
+ * @resp:	Returned PF response
Torsten Duwe f631a9
  *
Torsten Duwe f631a9
  * This function sends a message that requires a response from the VF to the PF
Torsten Duwe f631a9
  * and waits for a reply.
Torsten Duwe f631a9
  *
Torsten Duwe f631a9
  * Return: 0 on success, error code otherwise.
Torsten Duwe f631a9
  */
Torsten Duwe f631a9
-int adf_send_vf2pf_req(struct adf_accel_dev *accel_dev, u32 msg)
Torsten Duwe f631a9
+int adf_send_vf2pf_req(struct adf_accel_dev *accel_dev, u32 msg, u32 *resp)
Torsten Duwe f631a9
 {
Torsten Duwe f631a9
 	unsigned long timeout = msecs_to_jiffies(ADF_PFVF_MSG_RESP_TIMEOUT);
Torsten Duwe f631a9
 	int ret;
Torsten Duwe f631a9
 
Torsten Duwe f631a9
-	reinit_completion(&accel_dev->vf.iov_msg_completion);
Torsten Duwe f631a9
+	reinit_completion(&accel_dev->vf.msg_received);
Torsten Duwe f631a9
 
Torsten Duwe f631a9
 	/* Send request from VF to PF */
Torsten Duwe f631a9
 	ret = adf_send_vf2pf_msg(accel_dev, msg);
Torsten Duwe f631a9
@@ -69,13 +70,19 @@ int adf_send_vf2pf_req(struct adf_accel_dev *accel_dev, u32 msg)
Torsten Duwe f631a9
 	}
Torsten Duwe f631a9
 
Torsten Duwe f631a9
 	/* Wait for response */
Torsten Duwe f631a9
-	if (!wait_for_completion_timeout(&accel_dev->vf.iov_msg_completion,
Torsten Duwe f631a9
+	if (!wait_for_completion_timeout(&accel_dev->vf.msg_received,
Torsten Duwe f631a9
 					 timeout)) {
Torsten Duwe f631a9
 		dev_err(&GET_DEV(accel_dev),
Torsten Duwe f631a9
 			"PFVF request/response message timeout expired\n");
Torsten Duwe f631a9
 		return -EIO;
Torsten Duwe f631a9
 	}
Torsten Duwe f631a9
 
Torsten Duwe f631a9
+	if (likely(resp))
Torsten Duwe f631a9
+		*resp = accel_dev->vf.response;
Torsten Duwe f631a9
+
Torsten Duwe f631a9
+	/* Once copied, set to an invalid value */
Torsten Duwe f631a9
+	accel_dev->vf.response = 0;
Torsten Duwe f631a9
+
Torsten Duwe f631a9
 	return 0;
Torsten Duwe f631a9
 }
Torsten Duwe f631a9
 
Torsten Duwe f631a9
@@ -89,15 +96,8 @@ static bool adf_handle_pf2vf_msg(struct adf_accel_dev *accel_dev, u32 msg)
Torsten Duwe f631a9
 		adf_pf2vf_handle_pf_restarting(accel_dev);
Torsten Duwe f631a9
 		return false;
Torsten Duwe f631a9
 	case ADF_PF2VF_MSGTYPE_VERSION_RESP:
Torsten Duwe f631a9
-		dev_dbg(&GET_DEV(accel_dev),
Torsten Duwe f631a9
-			"Version resp received from PF 0x%x\n", msg);
Torsten Duwe f631a9
-		accel_dev->vf.pf_version =
Torsten Duwe f631a9
-			(msg & ADF_PF2VF_VERSION_RESP_VERS_MASK) >>
Torsten Duwe f631a9
-			ADF_PF2VF_VERSION_RESP_VERS_SHIFT;
Torsten Duwe f631a9
-		accel_dev->vf.compatible =
Torsten Duwe f631a9
-			(msg & ADF_PF2VF_VERSION_RESP_RESULT_MASK) >>
Torsten Duwe f631a9
-			ADF_PF2VF_VERSION_RESP_RESULT_SHIFT;
Torsten Duwe f631a9
-		complete(&accel_dev->vf.iov_msg_completion);
Torsten Duwe f631a9
+		accel_dev->vf.response = msg;
Torsten Duwe f631a9
+		complete(&accel_dev->vf.msg_received);
Torsten Duwe f631a9
 		return true;
Torsten Duwe f631a9
 	default:
Torsten Duwe f631a9
 		dev_err(&GET_DEV(accel_dev),
Torsten Duwe f631a9
diff --git a/drivers/crypto/qat/qat_common/adf_pfvf_vf_proto.h b/drivers/crypto/qat/qat_common/adf_pfvf_vf_proto.h
Torsten Duwe f631a9
index a3ab24c7d18bd..6226d4d9d520f 100644
Torsten Duwe f631a9
--- a/drivers/crypto/qat/qat_common/adf_pfvf_vf_proto.h
Torsten Duwe f631a9
+++ b/drivers/crypto/qat/qat_common/adf_pfvf_vf_proto.h
Torsten Duwe f631a9
@@ -7,7 +7,7 @@
Torsten Duwe f631a9
 #include "adf_accel_devices.h"
Torsten Duwe f631a9
 
Torsten Duwe f631a9
 int adf_send_vf2pf_msg(struct adf_accel_dev *accel_dev, u32 msg);
Torsten Duwe f631a9
-int adf_send_vf2pf_req(struct adf_accel_dev *accel_dev, u32 msg);
Torsten Duwe f631a9
+int adf_send_vf2pf_req(struct adf_accel_dev *accel_dev, u32 msg, u32 *resp);
Torsten Duwe f631a9
 
Torsten Duwe f631a9
 int adf_enable_vf2pf_comms(struct adf_accel_dev *accel_dev);
Torsten Duwe f631a9
 
Torsten Duwe f631a9
diff --git a/drivers/crypto/qat/qat_dh895xccvf/adf_drv.c b/drivers/crypto/qat/qat_dh895xccvf/adf_drv.c
Torsten Duwe f631a9
index 99d90f3ea2b79..ee45d688b5d73 100644
Torsten Duwe f631a9
--- a/drivers/crypto/qat/qat_dh895xccvf/adf_drv.c
Torsten Duwe f631a9
+++ b/drivers/crypto/qat/qat_dh895xccvf/adf_drv.c
Torsten Duwe f631a9
@@ -171,7 +171,7 @@ static int adf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
Torsten Duwe f631a9
 	}
Torsten Duwe f631a9
 	pci_set_master(pdev);
Torsten Duwe f631a9
 	/* Completion for VF2PF request/response message exchange */
Torsten Duwe f631a9
-	init_completion(&accel_dev->vf.iov_msg_completion);
Torsten Duwe f631a9
+	init_completion(&accel_dev->vf.msg_received);
Torsten Duwe f631a9
 
Torsten Duwe f631a9
 	ret = qat_crypto_dev_config(accel_dev);
Torsten Duwe f631a9
 	if (ret)
Torsten Duwe f631a9
-- 
Torsten Duwe f631a9
2.35.3
Torsten Duwe f631a9