|
Torsten Duwe |
0bc641 |
From 1ea7c2beca5b200240f6480d36ebd6ca775a5fca Mon Sep 17 00:00:00 2001
|
|
Torsten Duwe |
0bc641 |
From: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
|
|
Torsten Duwe |
0bc641 |
Date: Wed, 17 Nov 2021 14:30:50 +0000
|
|
Torsten Duwe |
0bc641 |
Subject: [PATCH] crypto: qat - abstract PFVF receive logic
|
|
Torsten Duwe |
0bc641 |
Git-commit: 1ea7c2beca5b200240f6480d36ebd6ca775a5fca
|
|
Torsten Duwe |
0bc641 |
Patch-mainline: v5.17-rc1
|
|
Torsten Duwe |
0bc641 |
References: jsc#PED-1073
|
|
Torsten Duwe |
0bc641 |
|
|
Torsten Duwe |
0bc641 |
Refactor the PFVF receive logic so it is common between PF and VF and
|
|
Torsten Duwe |
0bc641 |
make it device specific.
|
|
Torsten Duwe |
0bc641 |
|
|
Torsten Duwe |
0bc641 |
This is in preparation for the introduction of PFVF support in the
|
|
Torsten Duwe |
0bc641 |
qat_4xxx driver since the receive logic differs between QAT GEN2 and
|
|
Torsten Duwe |
0bc641 |
QAT GEN4 devices.
|
|
Torsten Duwe |
0bc641 |
|
|
Torsten Duwe |
0bc641 |
Signed-off-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
|
|
Torsten Duwe |
0bc641 |
Co-developed-by: Marco Chiappero <marco.chiappero@intel.com>
|
|
Torsten Duwe |
0bc641 |
Signed-off-by: Marco Chiappero <marco.chiappero@intel.com>
|
|
Torsten Duwe |
0bc641 |
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
|
|
Torsten Duwe |
0bc641 |
Signed-off-by: Torsten Duwe <duwe@suse.de>
|
|
Torsten Duwe |
0bc641 |
|
|
Torsten Duwe |
0bc641 |
---
|
|
Torsten Duwe |
0bc641 |
.../crypto/qat/qat_common/adf_accel_devices.h | 1 +
|
|
Torsten Duwe |
0bc641 |
drivers/crypto/qat/qat_common/adf_gen2_pfvf.c | 45 +++++++++++++++++++
|
|
Torsten Duwe |
0bc641 |
drivers/crypto/qat/qat_common/adf_pf2vf_msg.c | 41 ++++++++---------
|
|
Torsten Duwe |
0bc641 |
drivers/crypto/qat/qat_common/adf_vf2pf_msg.c | 38 +++++++---------
|
|
Torsten Duwe |
0bc641 |
4 files changed, 81 insertions(+), 44 deletions(-)
|
|
Torsten Duwe |
0bc641 |
|
|
Torsten Duwe |
0bc641 |
diff --git a/drivers/crypto/qat/qat_common/adf_accel_devices.h b/drivers/crypto/qat/qat_common/adf_accel_devices.h
|
|
Torsten Duwe |
0bc641 |
index 8938149590833..35e62a73f9fa8 100644
|
|
Torsten Duwe |
0bc641 |
--- a/drivers/crypto/qat/qat_common/adf_accel_devices.h
|
|
Torsten Duwe |
0bc641 |
+++ b/drivers/crypto/qat/qat_common/adf_accel_devices.h
|
|
Torsten Duwe |
0bc641 |
@@ -155,6 +155,7 @@ struct adf_pfvf_ops {
|
|
Torsten Duwe |
0bc641 |
void (*enable_vf2pf_interrupts)(void __iomem *pmisc_addr, u32 vf_mask);
|
|
Torsten Duwe |
0bc641 |
void (*disable_vf2pf_interrupts)(void __iomem *pmisc_addr, u32 vf_mask);
|
|
Torsten Duwe |
0bc641 |
int (*send_msg)(struct adf_accel_dev *accel_dev, u32 msg, u8 vf_nr);
|
|
Torsten Duwe |
0bc641 |
+ u32 (*recv_msg)(struct adf_accel_dev *accel_dev, u8 vf_nr);
|
|
Torsten Duwe |
0bc641 |
};
|
|
Torsten Duwe |
0bc641 |
|
|
Torsten Duwe |
0bc641 |
struct adf_hw_device_data {
|
|
Torsten Duwe |
0bc641 |
diff --git a/drivers/crypto/qat/qat_common/adf_gen2_pfvf.c b/drivers/crypto/qat/qat_common/adf_gen2_pfvf.c
|
|
Torsten Duwe |
0bc641 |
index 5eba042d453b7..f79c3ca28283a 100644
|
|
Torsten Duwe |
0bc641 |
--- a/drivers/crypto/qat/qat_common/adf_gen2_pfvf.c
|
|
Torsten Duwe |
0bc641 |
+++ b/drivers/crypto/qat/qat_common/adf_gen2_pfvf.c
|
|
Torsten Duwe |
0bc641 |
@@ -156,6 +156,49 @@ retry:
|
|
Torsten Duwe |
0bc641 |
}
|
|
Torsten Duwe |
0bc641 |
}
|
|
Torsten Duwe |
0bc641 |
|
|
Torsten Duwe |
0bc641 |
+static u32 adf_gen2_pfvf_recv(struct adf_accel_dev *accel_dev, u8 vf_nr)
|
|
Torsten Duwe |
0bc641 |
+{
|
|
Torsten Duwe |
0bc641 |
+ struct adf_accel_pci *pci_info = &accel_dev->accel_pci_dev;
|
|
Torsten Duwe |
0bc641 |
+ struct adf_hw_device_data *hw_data = accel_dev->hw_device;
|
|
Torsten Duwe |
0bc641 |
+ void __iomem *pmisc_addr =
|
|
Torsten Duwe |
0bc641 |
+ pci_info->pci_bars[hw_data->get_misc_bar_id(hw_data)].virt_addr;
|
|
Torsten Duwe |
0bc641 |
+ u32 pfvf_offset;
|
|
Torsten Duwe |
0bc641 |
+ u32 msg_origin;
|
|
Torsten Duwe |
0bc641 |
+ u32 int_bit;
|
|
Torsten Duwe |
0bc641 |
+ u32 msg;
|
|
Torsten Duwe |
0bc641 |
+
|
|
Torsten Duwe |
0bc641 |
+ if (accel_dev->is_vf) {
|
|
Torsten Duwe |
0bc641 |
+ pfvf_offset = GET_PFVF_OPS(accel_dev)->get_pf2vf_offset(0);
|
|
Torsten Duwe |
0bc641 |
+ int_bit = ADF_PF2VF_INT;
|
|
Torsten Duwe |
0bc641 |
+ msg_origin = ADF_PF2VF_MSGORIGIN_SYSTEM;
|
|
Torsten Duwe |
0bc641 |
+ } else {
|
|
Torsten Duwe |
0bc641 |
+ pfvf_offset = GET_PFVF_OPS(accel_dev)->get_vf2pf_offset(vf_nr);
|
|
Torsten Duwe |
0bc641 |
+ int_bit = ADF_VF2PF_INT;
|
|
Torsten Duwe |
0bc641 |
+ msg_origin = ADF_VF2PF_MSGORIGIN_SYSTEM;
|
|
Torsten Duwe |
0bc641 |
+ }
|
|
Torsten Duwe |
0bc641 |
+
|
|
Torsten Duwe |
0bc641 |
+ /* Read message */
|
|
Torsten Duwe |
0bc641 |
+ msg = ADF_CSR_RD(pmisc_addr, pfvf_offset);
|
|
Torsten Duwe |
0bc641 |
+ if (!(msg & int_bit)) {
|
|
Torsten Duwe |
0bc641 |
+ dev_info(&GET_DEV(accel_dev),
|
|
Torsten Duwe |
0bc641 |
+ "Spurious PFVF interrupt, msg %X. Ignored\n", msg);
|
|
Torsten Duwe |
0bc641 |
+ return 0;
|
|
Torsten Duwe |
0bc641 |
+ }
|
|
Torsten Duwe |
0bc641 |
+
|
|
Torsten Duwe |
0bc641 |
+ /* Ignore legacy non-system (non-kernel) VF2PF messages */
|
|
Torsten Duwe |
0bc641 |
+ if (!(msg & msg_origin)) {
|
|
Torsten Duwe |
0bc641 |
+ dev_dbg(&GET_DEV(accel_dev),
|
|
Torsten Duwe |
0bc641 |
+ "Ignored non-system message (0x%x);\n", msg);
|
|
Torsten Duwe |
0bc641 |
+ return 0;
|
|
Torsten Duwe |
0bc641 |
+ }
|
|
Torsten Duwe |
0bc641 |
+
|
|
Torsten Duwe |
0bc641 |
+ /* To ACK, clear the INT bit */
|
|
Torsten Duwe |
0bc641 |
+ msg &= ~int_bit;
|
|
Torsten Duwe |
0bc641 |
+ ADF_CSR_WR(pmisc_addr, pfvf_offset, msg);
|
|
Torsten Duwe |
0bc641 |
+
|
|
Torsten Duwe |
0bc641 |
+ return msg;
|
|
Torsten Duwe |
0bc641 |
+}
|
|
Torsten Duwe |
0bc641 |
+
|
|
Torsten Duwe |
0bc641 |
void adf_gen2_init_pf_pfvf_ops(struct adf_pfvf_ops *pfvf_ops)
|
|
Torsten Duwe |
0bc641 |
{
|
|
Torsten Duwe |
0bc641 |
pfvf_ops->enable_comms = adf_enable_pf2vf_comms;
|
|
Torsten Duwe |
0bc641 |
@@ -165,6 +208,7 @@ void adf_gen2_init_pf_pfvf_ops(struct adf_pfvf_ops *pfvf_ops)
|
|
Torsten Duwe |
0bc641 |
pfvf_ops->enable_vf2pf_interrupts = adf_gen2_enable_vf2pf_interrupts;
|
|
Torsten Duwe |
0bc641 |
pfvf_ops->disable_vf2pf_interrupts = adf_gen2_disable_vf2pf_interrupts;
|
|
Torsten Duwe |
0bc641 |
pfvf_ops->send_msg = adf_gen2_pfvf_send;
|
|
Torsten Duwe |
0bc641 |
+ pfvf_ops->recv_msg = adf_gen2_pfvf_recv;
|
|
Torsten Duwe |
0bc641 |
}
|
|
Torsten Duwe |
0bc641 |
EXPORT_SYMBOL_GPL(adf_gen2_init_pf_pfvf_ops);
|
|
Torsten Duwe |
0bc641 |
|
|
Torsten Duwe |
0bc641 |
@@ -174,5 +218,6 @@ void adf_gen2_init_vf_pfvf_ops(struct adf_pfvf_ops *pfvf_ops)
|
|
Torsten Duwe |
0bc641 |
pfvf_ops->get_pf2vf_offset = adf_gen2_vf_get_pfvf_offset;
|
|
Torsten Duwe |
0bc641 |
pfvf_ops->get_vf2pf_offset = adf_gen2_vf_get_pfvf_offset;
|
|
Torsten Duwe |
0bc641 |
pfvf_ops->send_msg = adf_gen2_pfvf_send;
|
|
Torsten Duwe |
0bc641 |
+ pfvf_ops->recv_msg = adf_gen2_pfvf_recv;
|
|
Torsten Duwe |
0bc641 |
}
|
|
Torsten Duwe |
0bc641 |
EXPORT_SYMBOL_GPL(adf_gen2_init_vf_pfvf_ops);
|
|
Torsten Duwe |
0bc641 |
diff --git a/drivers/crypto/qat/qat_common/adf_pf2vf_msg.c b/drivers/crypto/qat/qat_common/adf_pf2vf_msg.c
|
|
Torsten Duwe |
0bc641 |
index 074e521ed9e88..c064e8bab50dd 100644
|
|
Torsten Duwe |
0bc641 |
--- a/drivers/crypto/qat/qat_common/adf_pf2vf_msg.c
|
|
Torsten Duwe |
0bc641 |
+++ b/drivers/crypto/qat/qat_common/adf_pf2vf_msg.c
|
|
Torsten Duwe |
0bc641 |
@@ -40,6 +40,20 @@ int adf_send_vf2pf_msg(struct adf_accel_dev *accel_dev, u32 msg)
|
|
Torsten Duwe |
0bc641 |
return GET_PFVF_OPS(accel_dev)->send_msg(accel_dev, msg, 0);
|
|
Torsten Duwe |
0bc641 |
}
|
|
Torsten Duwe |
0bc641 |
|
|
Torsten Duwe |
0bc641 |
+/**
|
|
Torsten Duwe |
0bc641 |
+ * adf_recv_vf2pf_msg() - receive a VF to PF message
|
|
Torsten Duwe |
0bc641 |
+ * @accel_dev: Pointer to acceleration device
|
|
Torsten Duwe |
0bc641 |
+ * @vf_nr: Number of the VF from where the message will be received
|
|
Torsten Duwe |
0bc641 |
+ *
|
|
Torsten Duwe |
0bc641 |
+ * This function allows the PF to receive a message from a specific VF.
|
|
Torsten Duwe |
0bc641 |
+ *
|
|
Torsten Duwe |
0bc641 |
+ * Return: a valid message on success, zero otherwise.
|
|
Torsten Duwe |
0bc641 |
+ */
|
|
Torsten Duwe |
0bc641 |
+static u32 adf_recv_vf2pf_msg(struct adf_accel_dev *accel_dev, u8 vf_nr)
|
|
Torsten Duwe |
0bc641 |
+{
|
|
Torsten Duwe |
0bc641 |
+ return GET_PFVF_OPS(accel_dev)->recv_msg(accel_dev, vf_nr);
|
|
Torsten Duwe |
0bc641 |
+}
|
|
Torsten Duwe |
0bc641 |
+
|
|
Torsten Duwe |
0bc641 |
/**
|
|
Torsten Duwe |
0bc641 |
* adf_send_vf2pf_req() - send VF2PF request message
|
|
Torsten Duwe |
0bc641 |
* @accel_dev: Pointer to acceleration device.
|
|
Torsten Duwe |
0bc641 |
@@ -163,31 +177,12 @@ static int adf_handle_vf2pf_msg(struct adf_accel_dev *accel_dev, u32 vf_nr,
|
|
Torsten Duwe |
0bc641 |
|
|
Torsten Duwe |
0bc641 |
bool adf_recv_and_handle_vf2pf_msg(struct adf_accel_dev *accel_dev, u32 vf_nr)
|
|
Torsten Duwe |
0bc641 |
{
|
|
Torsten Duwe |
0bc641 |
- struct adf_hw_device_data *hw_data = accel_dev->hw_device;
|
|
Torsten Duwe |
0bc641 |
- int bar_id = hw_data->get_misc_bar_id(hw_data);
|
|
Torsten Duwe |
0bc641 |
- struct adf_bar *pmisc = &GET_BARS(accel_dev)[bar_id];
|
|
Torsten Duwe |
0bc641 |
- void __iomem *pmisc_addr = pmisc->virt_addr;
|
|
Torsten Duwe |
0bc641 |
- u32 msg, resp = 0;
|
|
Torsten Duwe |
0bc641 |
-
|
|
Torsten Duwe |
0bc641 |
- /* Read message from the VF */
|
|
Torsten Duwe |
0bc641 |
- msg = ADF_CSR_RD(pmisc_addr, hw_data->pfvf_ops.get_vf2pf_offset(vf_nr));
|
|
Torsten Duwe |
0bc641 |
- if (!(msg & ADF_VF2PF_INT)) {
|
|
Torsten Duwe |
0bc641 |
- dev_info(&GET_DEV(accel_dev),
|
|
Torsten Duwe |
0bc641 |
- "Spurious VF2PF interrupt, msg %X. Ignored\n", msg);
|
|
Torsten Duwe |
0bc641 |
- return true;
|
|
Torsten Duwe |
0bc641 |
- }
|
|
Torsten Duwe |
0bc641 |
+ u32 resp = 0;
|
|
Torsten Duwe |
0bc641 |
+ u32 msg;
|
|
Torsten Duwe |
0bc641 |
|
|
Torsten Duwe |
0bc641 |
- /* Ignore legacy non-system (non-kernel) VF2PF messages */
|
|
Torsten Duwe |
0bc641 |
- if (!(msg & ADF_VF2PF_MSGORIGIN_SYSTEM)) {
|
|
Torsten Duwe |
0bc641 |
- dev_dbg(&GET_DEV(accel_dev),
|
|
Torsten Duwe |
0bc641 |
- "Ignored non-system message from VF%d (0x%x);\n",
|
|
Torsten Duwe |
0bc641 |
- vf_nr + 1, msg);
|
|
Torsten Duwe |
0bc641 |
+ msg = adf_recv_vf2pf_msg(accel_dev, vf_nr);
|
|
Torsten Duwe |
0bc641 |
+ if (!msg)
|
|
Torsten Duwe |
0bc641 |
return true;
|
|
Torsten Duwe |
0bc641 |
- }
|
|
Torsten Duwe |
0bc641 |
-
|
|
Torsten Duwe |
0bc641 |
- /* To ACK, clear the VF2PFINT bit */
|
|
Torsten Duwe |
0bc641 |
- msg &= ~ADF_VF2PF_INT;
|
|
Torsten Duwe |
0bc641 |
- ADF_CSR_WR(pmisc_addr, hw_data->pfvf_ops.get_vf2pf_offset(vf_nr), msg);
|
|
Torsten Duwe |
0bc641 |
|
|
Torsten Duwe |
0bc641 |
if (adf_handle_vf2pf_msg(accel_dev, vf_nr, msg, &resp))
|
|
Torsten Duwe |
0bc641 |
return false;
|
|
Torsten Duwe |
0bc641 |
diff --git a/drivers/crypto/qat/qat_common/adf_vf2pf_msg.c b/drivers/crypto/qat/qat_common/adf_vf2pf_msg.c
|
|
Torsten Duwe |
0bc641 |
index d11eb60b3e867..f3660981ad6aa 100644
|
|
Torsten Duwe |
0bc641 |
--- a/drivers/crypto/qat/qat_common/adf_vf2pf_msg.c
|
|
Torsten Duwe |
0bc641 |
+++ b/drivers/crypto/qat/qat_common/adf_vf2pf_msg.c
|
|
Torsten Duwe |
0bc641 |
@@ -47,6 +47,19 @@ void adf_vf2pf_notify_shutdown(struct adf_accel_dev *accel_dev)
|
|
Torsten Duwe |
0bc641 |
}
|
|
Torsten Duwe |
0bc641 |
EXPORT_SYMBOL_GPL(adf_vf2pf_notify_shutdown);
|
|
Torsten Duwe |
0bc641 |
|
|
Torsten Duwe |
0bc641 |
+/**
|
|
Torsten Duwe |
0bc641 |
+ * adf_recv_pf2vf_msg() - receive a PF to VF message
|
|
Torsten Duwe |
0bc641 |
+ * @accel_dev: Pointer to acceleration device
|
|
Torsten Duwe |
0bc641 |
+ *
|
|
Torsten Duwe |
0bc641 |
+ * This function allows the VF to receive a message from the PF.
|
|
Torsten Duwe |
0bc641 |
+ *
|
|
Torsten Duwe |
0bc641 |
+ * Return: a valid message on success, zero otherwise.
|
|
Torsten Duwe |
0bc641 |
+ */
|
|
Torsten Duwe |
0bc641 |
+static u32 adf_recv_pf2vf_msg(struct adf_accel_dev *accel_dev)
|
|
Torsten Duwe |
0bc641 |
+{
|
|
Torsten Duwe |
0bc641 |
+ return GET_PFVF_OPS(accel_dev)->recv_msg(accel_dev, 0);
|
|
Torsten Duwe |
0bc641 |
+}
|
|
Torsten Duwe |
0bc641 |
+
|
|
Torsten Duwe |
0bc641 |
static bool adf_handle_pf2vf_msg(struct adf_accel_dev *accel_dev, u32 msg)
|
|
Torsten Duwe |
0bc641 |
{
|
|
Torsten Duwe |
0bc641 |
switch ((msg & ADF_PF2VF_MSGTYPE_MASK) >> ADF_PF2VF_MSGTYPE_SHIFT) {
|
|
Torsten Duwe |
0bc641 |
@@ -77,28 +90,11 @@ static bool adf_handle_pf2vf_msg(struct adf_accel_dev *accel_dev, u32 msg)
|
|
Torsten Duwe |
0bc641 |
|
|
Torsten Duwe |
0bc641 |
bool adf_recv_and_handle_pf2vf_msg(struct adf_accel_dev *accel_dev)
|
|
Torsten Duwe |
0bc641 |
{
|
|
Torsten Duwe |
0bc641 |
- struct adf_hw_device_data *hw_data = accel_dev->hw_device;
|
|
Torsten Duwe |
0bc641 |
- struct adf_bar *pmisc =
|
|
Torsten Duwe |
0bc641 |
- &GET_BARS(accel_dev)[hw_data->get_misc_bar_id(hw_data)];
|
|
Torsten Duwe |
0bc641 |
- void __iomem *pmisc_bar_addr = pmisc->virt_addr;
|
|
Torsten Duwe |
0bc641 |
- u32 offset = hw_data->pfvf_ops.get_pf2vf_offset(0);
|
|
Torsten Duwe |
0bc641 |
u32 msg;
|
|
Torsten Duwe |
0bc641 |
|
|
Torsten Duwe |
0bc641 |
- /* Read the message from PF */
|
|
Torsten Duwe |
0bc641 |
- msg = ADF_CSR_RD(pmisc_bar_addr, offset);
|
|
Torsten Duwe |
0bc641 |
- if (!(msg & ADF_PF2VF_INT)) {
|
|
Torsten Duwe |
0bc641 |
- dev_info(&GET_DEV(accel_dev),
|
|
Torsten Duwe |
0bc641 |
- "Spurious PF2VF interrupt, msg %X. Ignored\n", msg);
|
|
Torsten Duwe |
0bc641 |
- return true;
|
|
Torsten Duwe |
0bc641 |
- }
|
|
Torsten Duwe |
0bc641 |
-
|
|
Torsten Duwe |
0bc641 |
- if (!(msg & ADF_PF2VF_MSGORIGIN_SYSTEM))
|
|
Torsten Duwe |
0bc641 |
- /* Ignore legacy non-system (non-kernel) PF2VF messages */
|
|
Torsten Duwe |
0bc641 |
- return true;
|
|
Torsten Duwe |
0bc641 |
-
|
|
Torsten Duwe |
0bc641 |
- /* To ack, clear the PF2VFINT bit */
|
|
Torsten Duwe |
0bc641 |
- msg &= ~ADF_PF2VF_INT;
|
|
Torsten Duwe |
0bc641 |
- ADF_CSR_WR(pmisc_bar_addr, offset, msg);
|
|
Torsten Duwe |
0bc641 |
+ msg = adf_recv_pf2vf_msg(accel_dev);
|
|
Torsten Duwe |
0bc641 |
+ if (msg)
|
|
Torsten Duwe |
0bc641 |
+ return adf_handle_pf2vf_msg(accel_dev, msg);
|
|
Torsten Duwe |
0bc641 |
|
|
Torsten Duwe |
0bc641 |
- return adf_handle_pf2vf_msg(accel_dev, msg);
|
|
Torsten Duwe |
0bc641 |
+ return true;
|
|
Torsten Duwe |
0bc641 |
}
|
|
Torsten Duwe |
0bc641 |
--
|
|
Torsten Duwe |
0bc641 |
2.35.3
|
|
Torsten Duwe |
0bc641 |
|