|
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 |
|