|
Torsten Duwe |
ec2bc1 |
From db1c034801c402b1f600ef7f753494479950f78e Mon Sep 17 00:00:00 2001
|
|
Torsten Duwe |
ec2bc1 |
From: Marco Chiappero <marco.chiappero@intel.com>
|
|
Torsten Duwe |
ec2bc1 |
Date: Thu, 16 Dec 2021 09:13:20 +0000
|
|
Torsten Duwe |
ec2bc1 |
Subject: [PATCH] crypto: qat - abstract PFVF messages with struct pfvf_message
|
|
Torsten Duwe |
ec2bc1 |
Git-commit: db1c034801c402b1f600ef7f753494479950f78e
|
|
Torsten Duwe |
ec2bc1 |
Patch-mainline: v5.17-rc1
|
|
Torsten Duwe |
ec2bc1 |
References: jsc#PED-1073
|
|
Torsten Duwe |
ec2bc1 |
|
|
Torsten Duwe |
ec2bc1 |
This implementation of the PFVF protocol was designed around the GEN2
|
|
Torsten Duwe |
ec2bc1 |
devices and its CSR format. In order to support future generations,
|
|
Torsten Duwe |
ec2bc1 |
which come with differently sized fields, change the definition of the PFVF
|
|
Torsten Duwe |
ec2bc1 |
message and make it abstract by means of a new pfvf_message struct. Also,
|
|
Torsten Duwe |
ec2bc1 |
introduce some utilities to translate to and from the new message format
|
|
Torsten Duwe |
ec2bc1 |
and the device specific CSR format.
|
|
Torsten Duwe |
ec2bc1 |
|
|
Torsten Duwe |
ec2bc1 |
Signed-off-by: Marco Chiappero <marco.chiappero@intel.com>
|
|
Torsten Duwe |
ec2bc1 |
Reviewed-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
|
|
Torsten Duwe |
ec2bc1 |
Reviewed-by: Fiona Trahe <fiona.trahe@intel.com>
|
|
Torsten Duwe |
ec2bc1 |
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
|
|
Torsten Duwe |
ec2bc1 |
Signed-off-by: Torsten Duwe <duwe@suse.de>
|
|
Torsten Duwe |
ec2bc1 |
|
|
Torsten Duwe |
ec2bc1 |
---
|
|
Torsten Duwe |
ec2bc1 |
drivers/crypto/qat/qat_common/Makefile | 2 +-
|
|
Torsten Duwe |
ec2bc1 |
.../crypto/qat/qat_common/adf_accel_devices.h | 8 ++-
|
|
Torsten Duwe |
ec2bc1 |
drivers/crypto/qat/qat_common/adf_gen2_pfvf.c | 60 +++++++++++++------
|
|
Torsten Duwe |
ec2bc1 |
drivers/crypto/qat/qat_common/adf_pfvf_msg.h | 19 +++---
|
|
Torsten Duwe |
ec2bc1 |
.../crypto/qat/qat_common/adf_pfvf_pf_msg.c | 2 +-
|
|
Torsten Duwe |
ec2bc1 |
.../crypto/qat/qat_common/adf_pfvf_pf_proto.c | 51 +++++++---------
|
|
Torsten Duwe |
ec2bc1 |
.../crypto/qat/qat_common/adf_pfvf_pf_proto.h | 2 +-
|
|
Torsten Duwe |
ec2bc1 |
.../crypto/qat/qat_common/adf_pfvf_utils.c | 50 ++++++++++++++++
|
|
Torsten Duwe |
ec2bc1 |
.../crypto/qat/qat_common/adf_pfvf_utils.h | 24 ++++++++
|
|
Torsten Duwe |
ec2bc1 |
.../crypto/qat/qat_common/adf_pfvf_vf_msg.c | 18 +++---
|
|
Torsten Duwe |
ec2bc1 |
.../crypto/qat/qat_common/adf_pfvf_vf_proto.c | 26 ++++----
|
|
Torsten Duwe |
ec2bc1 |
.../crypto/qat/qat_common/adf_pfvf_vf_proto.h | 5 +-
|
|
Torsten Duwe |
ec2bc1 |
12 files changed, 184 insertions(+), 83 deletions(-)
|
|
Torsten Duwe |
ec2bc1 |
create mode 100644 drivers/crypto/qat/qat_common/adf_pfvf_utils.c
|
|
Torsten Duwe |
ec2bc1 |
create mode 100644 drivers/crypto/qat/qat_common/adf_pfvf_utils.h
|
|
Torsten Duwe |
ec2bc1 |
|
|
Torsten Duwe |
ec2bc1 |
diff --git a/drivers/crypto/qat/qat_common/Makefile b/drivers/crypto/qat/qat_common/Makefile
|
|
Torsten Duwe |
ec2bc1 |
index 1376504d16ff7..80f6cb424753c 100644
|
|
Torsten Duwe |
ec2bc1 |
--- a/drivers/crypto/qat/qat_common/Makefile
|
|
Torsten Duwe |
ec2bc1 |
+++ b/drivers/crypto/qat/qat_common/Makefile
|
|
Torsten Duwe |
ec2bc1 |
@@ -19,7 +19,7 @@ intel_qat-objs := adf_cfg.o \
|
|
Torsten Duwe |
ec2bc1 |
qat_hal.o
|
|
Torsten Duwe |
ec2bc1 |
|
|
Torsten Duwe |
ec2bc1 |
intel_qat-$(CONFIG_DEBUG_FS) += adf_transport_debug.o
|
|
Torsten Duwe |
ec2bc1 |
-intel_qat-$(CONFIG_PCI_IOV) += adf_sriov.o adf_vf_isr.o \
|
|
Torsten Duwe |
ec2bc1 |
+intel_qat-$(CONFIG_PCI_IOV) += adf_sriov.o adf_vf_isr.o adf_pfvf_utils.o \
|
|
Torsten Duwe |
ec2bc1 |
adf_pfvf_pf_msg.o adf_pfvf_pf_proto.o \
|
|
Torsten Duwe |
ec2bc1 |
adf_pfvf_vf_msg.o adf_pfvf_vf_proto.o \
|
|
Torsten Duwe |
ec2bc1 |
adf_gen2_pfvf.o
|
|
Torsten Duwe |
ec2bc1 |
diff --git a/drivers/crypto/qat/qat_common/adf_accel_devices.h b/drivers/crypto/qat/qat_common/adf_accel_devices.h
|
|
Torsten Duwe |
ec2bc1 |
index d65d8dda8fdaa..d5ccefc041535 100644
|
|
Torsten Duwe |
ec2bc1 |
--- a/drivers/crypto/qat/qat_common/adf_accel_devices.h
|
|
Torsten Duwe |
ec2bc1 |
+++ b/drivers/crypto/qat/qat_common/adf_accel_devices.h
|
|
Torsten Duwe |
ec2bc1 |
@@ -8,6 +8,7 @@
|
|
Torsten Duwe |
ec2bc1 |
#include <linux/io.h>
|
|
Torsten Duwe |
ec2bc1 |
#include <linux/ratelimit.h>
|
|
Torsten Duwe |
ec2bc1 |
#include "adf_cfg_common.h"
|
|
Torsten Duwe |
ec2bc1 |
+#include "adf_pfvf_msg.h"
|
|
Torsten Duwe |
ec2bc1 |
|
|
Torsten Duwe |
ec2bc1 |
#define ADF_DH895XCC_DEVICE_NAME "dh895xcc"
|
|
Torsten Duwe |
ec2bc1 |
#define ADF_DH895XCCVF_DEVICE_NAME "dh895xccvf"
|
|
Torsten Duwe |
ec2bc1 |
@@ -154,9 +155,10 @@ struct adf_pfvf_ops {
|
|
Torsten Duwe |
ec2bc1 |
u32 (*get_vf2pf_sources)(void __iomem *pmisc_addr);
|
|
Torsten Duwe |
ec2bc1 |
void (*enable_vf2pf_interrupts)(void __iomem *pmisc_addr, u32 vf_mask);
|
|
Torsten Duwe |
ec2bc1 |
void (*disable_vf2pf_interrupts)(void __iomem *pmisc_addr, u32 vf_mask);
|
|
Torsten Duwe |
ec2bc1 |
- int (*send_msg)(struct adf_accel_dev *accel_dev, u32 msg,
|
|
Torsten Duwe |
ec2bc1 |
+ int (*send_msg)(struct adf_accel_dev *accel_dev, struct pfvf_message msg,
|
|
Torsten Duwe |
ec2bc1 |
u32 pfvf_offset, struct mutex *csr_lock);
|
|
Torsten Duwe |
ec2bc1 |
- u32 (*recv_msg)(struct adf_accel_dev *accel_dev, u32 pfvf_offset);
|
|
Torsten Duwe |
ec2bc1 |
+ struct pfvf_message (*recv_msg)(struct adf_accel_dev *accel_dev,
|
|
Torsten Duwe |
ec2bc1 |
+ u32 pfvf_offset);
|
|
Torsten Duwe |
ec2bc1 |
};
|
|
Torsten Duwe |
ec2bc1 |
|
|
Torsten Duwe |
ec2bc1 |
struct adf_hw_device_data {
|
|
Torsten Duwe |
ec2bc1 |
@@ -275,7 +277,7 @@ struct adf_accel_dev {
|
|
Torsten Duwe |
ec2bc1 |
struct tasklet_struct pf2vf_bh_tasklet;
|
|
Torsten Duwe |
ec2bc1 |
struct mutex vf2pf_lock; /* protect CSR access */
|
|
Torsten Duwe |
ec2bc1 |
struct completion msg_received;
|
|
Torsten Duwe |
ec2bc1 |
- u32 response; /* temp field holding pf2vf response */
|
|
Torsten Duwe |
ec2bc1 |
+ struct pfvf_message response; /* temp field holding pf2vf response */
|
|
Torsten Duwe |
ec2bc1 |
u8 pf_version;
|
|
Torsten Duwe |
ec2bc1 |
} vf;
|
|
Torsten Duwe |
ec2bc1 |
};
|
|
Torsten Duwe |
ec2bc1 |
diff --git a/drivers/crypto/qat/qat_common/adf_gen2_pfvf.c b/drivers/crypto/qat/qat_common/adf_gen2_pfvf.c
|
|
Torsten Duwe |
ec2bc1 |
index 97bef41ddc474..7a927bea4ac67 100644
|
|
Torsten Duwe |
ec2bc1 |
--- a/drivers/crypto/qat/qat_common/adf_gen2_pfvf.c
|
|
Torsten Duwe |
ec2bc1 |
+++ b/drivers/crypto/qat/qat_common/adf_gen2_pfvf.c
|
|
Torsten Duwe |
ec2bc1 |
@@ -9,6 +9,7 @@
|
|
Torsten Duwe |
ec2bc1 |
#include "adf_pfvf_msg.h"
|
|
Torsten Duwe |
ec2bc1 |
#include "adf_pfvf_pf_proto.h"
|
|
Torsten Duwe |
ec2bc1 |
#include "adf_pfvf_vf_proto.h"
|
|
Torsten Duwe |
ec2bc1 |
+#include "adf_pfvf_utils.h"
|
|
Torsten Duwe |
ec2bc1 |
|
|
Torsten Duwe |
ec2bc1 |
/* VF2PF interrupts */
|
|
Torsten Duwe |
ec2bc1 |
#define ADF_GEN2_ERR_REG_VF2PF(vf_src) (((vf_src) & 0x01FFFE00) >> 9)
|
|
Torsten Duwe |
ec2bc1 |
@@ -25,6 +26,16 @@ enum gen2_csr_pos {
|
|
Torsten Duwe |
ec2bc1 |
ADF_GEN2_CSR_VF2PF_OFFSET = 16,
|
|
Torsten Duwe |
ec2bc1 |
};
|
|
Torsten Duwe |
ec2bc1 |
|
|
Torsten Duwe |
ec2bc1 |
+#define ADF_PFVF_GEN2_MSGTYPE_SHIFT 2
|
|
Torsten Duwe |
ec2bc1 |
+#define ADF_PFVF_GEN2_MSGTYPE_MASK 0x0F
|
|
Torsten Duwe |
ec2bc1 |
+#define ADF_PFVF_GEN2_MSGDATA_SHIFT 6
|
|
Torsten Duwe |
ec2bc1 |
+#define ADF_PFVF_GEN2_MSGDATA_MASK 0x3FF
|
|
Torsten Duwe |
ec2bc1 |
+
|
|
Torsten Duwe |
ec2bc1 |
+static const struct pfvf_csr_format csr_gen2_fmt = {
|
|
Torsten Duwe |
ec2bc1 |
+ { ADF_PFVF_GEN2_MSGTYPE_SHIFT, ADF_PFVF_GEN2_MSGTYPE_MASK },
|
|
Torsten Duwe |
ec2bc1 |
+ { ADF_PFVF_GEN2_MSGDATA_SHIFT, ADF_PFVF_GEN2_MSGDATA_MASK },
|
|
Torsten Duwe |
ec2bc1 |
+};
|
|
Torsten Duwe |
ec2bc1 |
+
|
|
Torsten Duwe |
ec2bc1 |
#define ADF_PFVF_MSG_ACK_DELAY 2
|
|
Torsten Duwe |
ec2bc1 |
#define ADF_PFVF_MSG_ACK_MAX_RETRY 100
|
|
Torsten Duwe |
ec2bc1 |
|
|
Torsten Duwe |
ec2bc1 |
@@ -122,7 +133,8 @@ struct pfvf_gen2_params {
|
|
Torsten Duwe |
ec2bc1 |
enum gen2_csr_pos remote_offset;
|
|
Torsten Duwe |
ec2bc1 |
};
|
|
Torsten Duwe |
ec2bc1 |
|
|
Torsten Duwe |
ec2bc1 |
-static int adf_gen2_pfvf_send(struct adf_accel_dev *accel_dev, u32 msg,
|
|
Torsten Duwe |
ec2bc1 |
+static int adf_gen2_pfvf_send(struct adf_accel_dev *accel_dev,
|
|
Torsten Duwe |
ec2bc1 |
+ struct pfvf_message msg,
|
|
Torsten Duwe |
ec2bc1 |
struct pfvf_gen2_params *params)
|
|
Torsten Duwe |
ec2bc1 |
{
|
|
Torsten Duwe |
ec2bc1 |
void __iomem *pmisc_addr = adf_get_pmisc_base(accel_dev);
|
|
Torsten Duwe |
ec2bc1 |
@@ -134,6 +146,7 @@ static int adf_gen2_pfvf_send(struct adf_accel_dev *accel_dev, u32 msg,
|
|
Torsten Duwe |
ec2bc1 |
u32 count = 0;
|
|
Torsten Duwe |
ec2bc1 |
u32 int_bit;
|
|
Torsten Duwe |
ec2bc1 |
u32 csr_val;
|
|
Torsten Duwe |
ec2bc1 |
+ u32 csr_msg;
|
|
Torsten Duwe |
ec2bc1 |
int ret;
|
|
Torsten Duwe |
ec2bc1 |
|
|
Torsten Duwe |
ec2bc1 |
/* Gen2 messages, both PF->VF and VF->PF, are all 16 bits long. This
|
|
Torsten Duwe |
ec2bc1 |
@@ -146,12 +159,15 @@ static int adf_gen2_pfvf_send(struct adf_accel_dev *accel_dev, u32 msg,
|
|
Torsten Duwe |
ec2bc1 |
|
|
Torsten Duwe |
ec2bc1 |
int_bit = gen2_csr_get_int_bit(local_offset);
|
|
Torsten Duwe |
ec2bc1 |
|
|
Torsten Duwe |
ec2bc1 |
- /* Pre-calculate message, shifting it in place and setting
|
|
Torsten Duwe |
ec2bc1 |
- * the in use pattern
|
|
Torsten Duwe |
ec2bc1 |
+ csr_msg = adf_pfvf_csr_msg_of(accel_dev, msg, &csr_gen2_fmt);
|
|
Torsten Duwe |
ec2bc1 |
+ if (unlikely(!csr_msg))
|
|
Torsten Duwe |
ec2bc1 |
+ return -EINVAL;
|
|
Torsten Duwe |
ec2bc1 |
+
|
|
Torsten Duwe |
ec2bc1 |
+ /* Prepare for CSR format, shifting the wire message in place and
|
|
Torsten Duwe |
ec2bc1 |
+ * setting the in use pattern
|
|
Torsten Duwe |
ec2bc1 |
*/
|
|
Torsten Duwe |
ec2bc1 |
- msg |= ADF_PFVF_MSGORIGIN_SYSTEM;
|
|
Torsten Duwe |
ec2bc1 |
- msg = gen2_csr_msg_to_position(msg, local_offset);
|
|
Torsten Duwe |
ec2bc1 |
- gen2_csr_set_in_use(&msg, remote_offset);
|
|
Torsten Duwe |
ec2bc1 |
+ csr_msg = gen2_csr_msg_to_position(csr_msg, local_offset);
|
|
Torsten Duwe |
ec2bc1 |
+ gen2_csr_set_in_use(&csr_msg, remote_offset);
|
|
Torsten Duwe |
ec2bc1 |
|
|
Torsten Duwe |
ec2bc1 |
mutex_lock(lock);
|
|
Torsten Duwe |
ec2bc1 |
|
|
Torsten Duwe |
ec2bc1 |
@@ -167,7 +183,7 @@ start:
|
|
Torsten Duwe |
ec2bc1 |
}
|
|
Torsten Duwe |
ec2bc1 |
|
|
Torsten Duwe |
ec2bc1 |
/* Attempt to get ownership of the PFVF CSR */
|
|
Torsten Duwe |
ec2bc1 |
- ADF_CSR_WR(pmisc_addr, pfvf_offset, msg | int_bit);
|
|
Torsten Duwe |
ec2bc1 |
+ ADF_CSR_WR(pmisc_addr, pfvf_offset, csr_msg | int_bit);
|
|
Torsten Duwe |
ec2bc1 |
|
|
Torsten Duwe |
ec2bc1 |
/* Wait for confirmation from remote func it received the message */
|
|
Torsten Duwe |
ec2bc1 |
do {
|
|
Torsten Duwe |
ec2bc1 |
@@ -181,7 +197,7 @@ start:
|
|
Torsten Duwe |
ec2bc1 |
ret = -EIO;
|
|
Torsten Duwe |
ec2bc1 |
}
|
|
Torsten Duwe |
ec2bc1 |
|
|
Torsten Duwe |
ec2bc1 |
- if (csr_val != msg) {
|
|
Torsten Duwe |
ec2bc1 |
+ if (csr_val != csr_msg) {
|
|
Torsten Duwe |
ec2bc1 |
dev_dbg(&GET_DEV(accel_dev),
|
|
Torsten Duwe |
ec2bc1 |
"Collision - PFVF CSR overwritten by remote function\n");
|
|
Torsten Duwe |
ec2bc1 |
goto retry;
|
|
Torsten Duwe |
ec2bc1 |
@@ -205,15 +221,16 @@ retry:
|
|
Torsten Duwe |
ec2bc1 |
}
|
|
Torsten Duwe |
ec2bc1 |
}
|
|
Torsten Duwe |
ec2bc1 |
|
|
Torsten Duwe |
ec2bc1 |
-static u32 adf_gen2_pfvf_recv(struct adf_accel_dev *accel_dev,
|
|
Torsten Duwe |
ec2bc1 |
- struct pfvf_gen2_params *params)
|
|
Torsten Duwe |
ec2bc1 |
+static struct pfvf_message adf_gen2_pfvf_recv(struct adf_accel_dev *accel_dev,
|
|
Torsten Duwe |
ec2bc1 |
+ struct pfvf_gen2_params *params)
|
|
Torsten Duwe |
ec2bc1 |
{
|
|
Torsten Duwe |
ec2bc1 |
void __iomem *pmisc_addr = adf_get_pmisc_base(accel_dev);
|
|
Torsten Duwe |
ec2bc1 |
enum gen2_csr_pos local_offset = params->local_offset;
|
|
Torsten Duwe |
ec2bc1 |
u32 pfvf_offset = params->pfvf_offset;
|
|
Torsten Duwe |
ec2bc1 |
+ struct pfvf_message msg = { 0 };
|
|
Torsten Duwe |
ec2bc1 |
u32 int_bit;
|
|
Torsten Duwe |
ec2bc1 |
u32 csr_val;
|
|
Torsten Duwe |
ec2bc1 |
- u32 msg;
|
|
Torsten Duwe |
ec2bc1 |
+ u16 csr_msg;
|
|
Torsten Duwe |
ec2bc1 |
|
|
Torsten Duwe |
ec2bc1 |
int_bit = gen2_csr_get_int_bit(local_offset);
|
|
Torsten Duwe |
ec2bc1 |
|
|
Torsten Duwe |
ec2bc1 |
@@ -222,19 +239,22 @@ static u32 adf_gen2_pfvf_recv(struct adf_accel_dev *accel_dev,
|
|
Torsten Duwe |
ec2bc1 |
if (!(csr_val & int_bit)) {
|
|
Torsten Duwe |
ec2bc1 |
dev_info(&GET_DEV(accel_dev),
|
|
Torsten Duwe |
ec2bc1 |
"Spurious PFVF interrupt, msg 0x%.8x. Ignored\n", csr_val);
|
|
Torsten Duwe |
ec2bc1 |
- return 0;
|
|
Torsten Duwe |
ec2bc1 |
+ return msg;
|
|
Torsten Duwe |
ec2bc1 |
}
|
|
Torsten Duwe |
ec2bc1 |
|
|
Torsten Duwe |
ec2bc1 |
/* Extract the message from the CSR */
|
|
Torsten Duwe |
ec2bc1 |
- msg = gen2_csr_msg_from_position(csr_val, local_offset);
|
|
Torsten Duwe |
ec2bc1 |
+ csr_msg = gen2_csr_msg_from_position(csr_val, local_offset);
|
|
Torsten Duwe |
ec2bc1 |
|
|
Torsten Duwe |
ec2bc1 |
/* Ignore legacy non-system (non-kernel) messages */
|
|
Torsten Duwe |
ec2bc1 |
- if (unlikely(is_legacy_user_pfvf_message(msg))) {
|
|
Torsten Duwe |
ec2bc1 |
+ if (unlikely(is_legacy_user_pfvf_message(csr_msg))) {
|
|
Torsten Duwe |
ec2bc1 |
dev_dbg(&GET_DEV(accel_dev),
|
|
Torsten Duwe |
ec2bc1 |
"Ignored non-system message (0x%.8x);\n", csr_val);
|
|
Torsten Duwe |
ec2bc1 |
- return 0;
|
|
Torsten Duwe |
ec2bc1 |
+ return msg;
|
|
Torsten Duwe |
ec2bc1 |
}
|
|
Torsten Duwe |
ec2bc1 |
|
|
Torsten Duwe |
ec2bc1 |
+ /* Return the pfvf_message format */
|
|
Torsten Duwe |
ec2bc1 |
+ msg = adf_pfvf_message_of(accel_dev, csr_msg, &csr_gen2_fmt);
|
|
Torsten Duwe |
ec2bc1 |
+
|
|
Torsten Duwe |
ec2bc1 |
/* To ACK, clear the INT bit */
|
|
Torsten Duwe |
ec2bc1 |
csr_val &= ~int_bit;
|
|
Torsten Duwe |
ec2bc1 |
ADF_CSR_WR(pmisc_addr, pfvf_offset, csr_val);
|
|
Torsten Duwe |
ec2bc1 |
@@ -242,7 +262,7 @@ static u32 adf_gen2_pfvf_recv(struct adf_accel_dev *accel_dev,
|
|
Torsten Duwe |
ec2bc1 |
return msg;
|
|
Torsten Duwe |
ec2bc1 |
}
|
|
Torsten Duwe |
ec2bc1 |
|
|
Torsten Duwe |
ec2bc1 |
-static int adf_gen2_pf2vf_send(struct adf_accel_dev *accel_dev, u32 msg,
|
|
Torsten Duwe |
ec2bc1 |
+static int adf_gen2_pf2vf_send(struct adf_accel_dev *accel_dev, struct pfvf_message msg,
|
|
Torsten Duwe |
ec2bc1 |
u32 pfvf_offset, struct mutex *csr_lock)
|
|
Torsten Duwe |
ec2bc1 |
{
|
|
Torsten Duwe |
ec2bc1 |
struct pfvf_gen2_params params = {
|
|
Torsten Duwe |
ec2bc1 |
@@ -255,7 +275,7 @@ static int adf_gen2_pf2vf_send(struct adf_accel_dev *accel_dev, u32 msg,
|
|
Torsten Duwe |
ec2bc1 |
return adf_gen2_pfvf_send(accel_dev, msg, ¶ms);
|
|
Torsten Duwe |
ec2bc1 |
}
|
|
Torsten Duwe |
ec2bc1 |
|
|
Torsten Duwe |
ec2bc1 |
-static int adf_gen2_vf2pf_send(struct adf_accel_dev *accel_dev, u32 msg,
|
|
Torsten Duwe |
ec2bc1 |
+static int adf_gen2_vf2pf_send(struct adf_accel_dev *accel_dev, struct pfvf_message msg,
|
|
Torsten Duwe |
ec2bc1 |
u32 pfvf_offset, struct mutex *csr_lock)
|
|
Torsten Duwe |
ec2bc1 |
{
|
|
Torsten Duwe |
ec2bc1 |
struct pfvf_gen2_params params = {
|
|
Torsten Duwe |
ec2bc1 |
@@ -268,7 +288,8 @@ static int adf_gen2_vf2pf_send(struct adf_accel_dev *accel_dev, u32 msg,
|
|
Torsten Duwe |
ec2bc1 |
return adf_gen2_pfvf_send(accel_dev, msg, ¶ms);
|
|
Torsten Duwe |
ec2bc1 |
}
|
|
Torsten Duwe |
ec2bc1 |
|
|
Torsten Duwe |
ec2bc1 |
-static u32 adf_gen2_pf2vf_recv(struct adf_accel_dev *accel_dev, u32 pfvf_offset)
|
|
Torsten Duwe |
ec2bc1 |
+static struct pfvf_message adf_gen2_pf2vf_recv(struct adf_accel_dev *accel_dev,
|
|
Torsten Duwe |
ec2bc1 |
+ u32 pfvf_offset)
|
|
Torsten Duwe |
ec2bc1 |
{
|
|
Torsten Duwe |
ec2bc1 |
struct pfvf_gen2_params params = {
|
|
Torsten Duwe |
ec2bc1 |
.pfvf_offset = pfvf_offset,
|
|
Torsten Duwe |
ec2bc1 |
@@ -279,7 +300,8 @@ static u32 adf_gen2_pf2vf_recv(struct adf_accel_dev *accel_dev, u32 pfvf_offset)
|
|
Torsten Duwe |
ec2bc1 |
return adf_gen2_pfvf_recv(accel_dev, ¶ms);
|
|
Torsten Duwe |
ec2bc1 |
}
|
|
Torsten Duwe |
ec2bc1 |
|
|
Torsten Duwe |
ec2bc1 |
-static u32 adf_gen2_vf2pf_recv(struct adf_accel_dev *accel_dev, u32 pfvf_offset)
|
|
Torsten Duwe |
ec2bc1 |
+static struct pfvf_message adf_gen2_vf2pf_recv(struct adf_accel_dev *accel_dev,
|
|
Torsten Duwe |
ec2bc1 |
+ u32 pfvf_offset)
|
|
Torsten Duwe |
ec2bc1 |
{
|
|
Torsten Duwe |
ec2bc1 |
struct pfvf_gen2_params params = {
|
|
Torsten Duwe |
ec2bc1 |
.pfvf_offset = pfvf_offset,
|
|
Torsten Duwe |
ec2bc1 |
diff --git a/drivers/crypto/qat/qat_common/adf_pfvf_msg.h b/drivers/crypto/qat/qat_common/adf_pfvf_msg.h
|
|
Torsten Duwe |
ec2bc1 |
index 3ba88bcd07269..26eb27853e834 100644
|
|
Torsten Duwe |
ec2bc1 |
--- a/drivers/crypto/qat/qat_common/adf_pfvf_msg.h
|
|
Torsten Duwe |
ec2bc1 |
+++ b/drivers/crypto/qat/qat_common/adf_pfvf_msg.h
|
|
Torsten Duwe |
ec2bc1 |
@@ -56,8 +56,14 @@
|
|
Torsten Duwe |
ec2bc1 |
/* PFVF message common bits */
|
|
Torsten Duwe |
ec2bc1 |
#define ADF_PFVF_INT BIT(0)
|
|
Torsten Duwe |
ec2bc1 |
#define ADF_PFVF_MSGORIGIN_SYSTEM BIT(1)
|
|
Torsten Duwe |
ec2bc1 |
-#define ADF_PFVF_MSGTYPE_SHIFT 2
|
|
Torsten Duwe |
ec2bc1 |
-#define ADF_PFVF_MSGTYPE_MASK 0x0F
|
|
Torsten Duwe |
ec2bc1 |
+
|
|
Torsten Duwe |
ec2bc1 |
+/* Different generations have different CSR layouts, use this struct
|
|
Torsten Duwe |
ec2bc1 |
+ * to abstract these differences away
|
|
Torsten Duwe |
ec2bc1 |
+ */
|
|
Torsten Duwe |
ec2bc1 |
+struct pfvf_message {
|
|
Torsten Duwe |
ec2bc1 |
+ u8 type;
|
|
Torsten Duwe |
ec2bc1 |
+ u32 data;
|
|
Torsten Duwe |
ec2bc1 |
+};
|
|
Torsten Duwe |
ec2bc1 |
|
|
Torsten Duwe |
ec2bc1 |
/* PF->VF messages */
|
|
Torsten Duwe |
ec2bc1 |
enum pf2vf_msgtype {
|
|
Torsten Duwe |
ec2bc1 |
@@ -80,11 +86,9 @@ enum pfvf_compatibility_version {
|
|
Torsten Duwe |
ec2bc1 |
};
|
|
Torsten Duwe |
ec2bc1 |
|
|
Torsten Duwe |
ec2bc1 |
/* PF->VF Version Response */
|
|
Torsten Duwe |
ec2bc1 |
-#define ADF_PF2VF_MINORVERSION_SHIFT 6
|
|
Torsten Duwe |
ec2bc1 |
-#define ADF_PF2VF_MAJORVERSION_SHIFT 10
|
|
Torsten Duwe |
ec2bc1 |
-#define ADF_PF2VF_VERSION_RESP_VERS_SHIFT 6
|
|
Torsten Duwe |
ec2bc1 |
+#define ADF_PF2VF_VERSION_RESP_VERS_SHIFT 0
|
|
Torsten Duwe |
ec2bc1 |
#define ADF_PF2VF_VERSION_RESP_VERS_MASK 0xFF
|
|
Torsten Duwe |
ec2bc1 |
-#define ADF_PF2VF_VERSION_RESP_RESULT_SHIFT 14
|
|
Torsten Duwe |
ec2bc1 |
+#define ADF_PF2VF_VERSION_RESP_RESULT_SHIFT 8
|
|
Torsten Duwe |
ec2bc1 |
#define ADF_PF2VF_VERSION_RESP_RESULT_MASK 0x03
|
|
Torsten Duwe |
ec2bc1 |
|
|
Torsten Duwe |
ec2bc1 |
enum pf2vf_compat_response {
|
|
Torsten Duwe |
ec2bc1 |
@@ -93,7 +97,4 @@ enum pf2vf_compat_response {
|
|
Torsten Duwe |
ec2bc1 |
ADF_PF2VF_VF_COMPAT_UNKNOWN = 0x03,
|
|
Torsten Duwe |
ec2bc1 |
};
|
|
Torsten Duwe |
ec2bc1 |
|
|
Torsten Duwe |
ec2bc1 |
-/* VF->PF Compatible Version Request */
|
|
Torsten Duwe |
ec2bc1 |
-#define ADF_VF2PF_COMPAT_VER_REQ_SHIFT 6
|
|
Torsten Duwe |
ec2bc1 |
-
|
|
Torsten Duwe |
ec2bc1 |
#endif /* ADF_PFVF_MSG_H */
|
|
Torsten Duwe |
ec2bc1 |
diff --git a/drivers/crypto/qat/qat_common/adf_pfvf_pf_msg.c b/drivers/crypto/qat/qat_common/adf_pfvf_pf_msg.c
|
|
Torsten Duwe |
ec2bc1 |
index f6d05cd29a823..ad198b624098e 100644
|
|
Torsten Duwe |
ec2bc1 |
--- a/drivers/crypto/qat/qat_common/adf_pfvf_pf_msg.c
|
|
Torsten Duwe |
ec2bc1 |
+++ b/drivers/crypto/qat/qat_common/adf_pfvf_pf_msg.c
|
|
Torsten Duwe |
ec2bc1 |
@@ -9,7 +9,7 @@
|
|
Torsten Duwe |
ec2bc1 |
void adf_pf2vf_notify_restarting(struct adf_accel_dev *accel_dev)
|
|
Torsten Duwe |
ec2bc1 |
{
|
|
Torsten Duwe |
ec2bc1 |
struct adf_accel_vf_info *vf;
|
|
Torsten Duwe |
ec2bc1 |
- u32 msg = ADF_PF2VF_MSGTYPE_RESTARTING << ADF_PFVF_MSGTYPE_SHIFT;
|
|
Torsten Duwe |
ec2bc1 |
+ struct pfvf_message msg = { .type = ADF_PF2VF_MSGTYPE_RESTARTING };
|
|
Torsten Duwe |
ec2bc1 |
int i, num_vfs = pci_num_vf(accel_to_pci_dev(accel_dev));
|
|
Torsten Duwe |
ec2bc1 |
|
|
Torsten Duwe |
ec2bc1 |
for (i = 0, vf = accel_dev->pf.vf_info; i < num_vfs; i++, vf++) {
|
|
Torsten Duwe |
ec2bc1 |
diff --git a/drivers/crypto/qat/qat_common/adf_pfvf_pf_proto.c b/drivers/crypto/qat/qat_common/adf_pfvf_pf_proto.c
|
|
Torsten Duwe |
ec2bc1 |
index 9f4baa9b14fc3..bb4d7db68579a 100644
|
|
Torsten Duwe |
ec2bc1 |
--- a/drivers/crypto/qat/qat_common/adf_pfvf_pf_proto.c
|
|
Torsten Duwe |
ec2bc1 |
+++ b/drivers/crypto/qat/qat_common/adf_pfvf_pf_proto.c
|
|
Torsten Duwe |
ec2bc1 |
@@ -17,7 +17,7 @@
|
|
Torsten Duwe |
ec2bc1 |
*
|
|
Torsten Duwe |
ec2bc1 |
* Return: 0 on success, error code otherwise.
|
|
Torsten Duwe |
ec2bc1 |
*/
|
|
Torsten Duwe |
ec2bc1 |
-int adf_send_pf2vf_msg(struct adf_accel_dev *accel_dev, u8 vf_nr, u32 msg)
|
|
Torsten Duwe |
ec2bc1 |
+int adf_send_pf2vf_msg(struct adf_accel_dev *accel_dev, u8 vf_nr, struct pfvf_message msg)
|
|
Torsten Duwe |
ec2bc1 |
{
|
|
Torsten Duwe |
ec2bc1 |
struct adf_pfvf_ops *pfvf_ops = GET_PFVF_OPS(accel_dev);
|
|
Torsten Duwe |
ec2bc1 |
u32 pfvf_offset = pfvf_ops->get_pf2vf_offset(vf_nr);
|
|
Torsten Duwe |
ec2bc1 |
@@ -35,7 +35,7 @@ int adf_send_pf2vf_msg(struct adf_accel_dev *accel_dev, u8 vf_nr, u32 msg)
|
|
Torsten Duwe |
ec2bc1 |
*
|
|
Torsten Duwe |
ec2bc1 |
* Return: a valid message on success, zero otherwise.
|
|
Torsten Duwe |
ec2bc1 |
*/
|
|
Torsten Duwe |
ec2bc1 |
-static u32 adf_recv_vf2pf_msg(struct adf_accel_dev *accel_dev, u8 vf_nr)
|
|
Torsten Duwe |
ec2bc1 |
+static struct pfvf_message adf_recv_vf2pf_msg(struct adf_accel_dev *accel_dev, u8 vf_nr)
|
|
Torsten Duwe |
ec2bc1 |
{
|
|
Torsten Duwe |
ec2bc1 |
struct adf_pfvf_ops *pfvf_ops = GET_PFVF_OPS(accel_dev);
|
|
Torsten Duwe |
ec2bc1 |
u32 pfvf_offset = pfvf_ops->get_vf2pf_offset(vf_nr);
|
|
Torsten Duwe |
ec2bc1 |
@@ -43,16 +43,15 @@ static u32 adf_recv_vf2pf_msg(struct adf_accel_dev *accel_dev, u8 vf_nr)
|
|
Torsten Duwe |
ec2bc1 |
return pfvf_ops->recv_msg(accel_dev, pfvf_offset);
|
|
Torsten Duwe |
ec2bc1 |
}
|
|
Torsten Duwe |
ec2bc1 |
|
|
Torsten Duwe |
ec2bc1 |
-static int adf_handle_vf2pf_msg(struct adf_accel_dev *accel_dev, u32 vf_nr,
|
|
Torsten Duwe |
ec2bc1 |
- u32 msg, u32 *response)
|
|
Torsten Duwe |
ec2bc1 |
+static int adf_handle_vf2pf_msg(struct adf_accel_dev *accel_dev, u8 vf_nr,
|
|
Torsten Duwe |
ec2bc1 |
+ struct pfvf_message msg, struct pfvf_message *resp)
|
|
Torsten Duwe |
ec2bc1 |
{
|
|
Torsten Duwe |
ec2bc1 |
struct adf_accel_vf_info *vf_info = &accel_dev->pf.vf_info[vf_nr];
|
|
Torsten Duwe |
ec2bc1 |
- u32 resp = 0;
|
|
Torsten Duwe |
ec2bc1 |
|
|
Torsten Duwe |
ec2bc1 |
- switch ((msg >> ADF_PFVF_MSGTYPE_SHIFT) & ADF_PFVF_MSGTYPE_MASK) {
|
|
Torsten Duwe |
ec2bc1 |
+ switch (msg.type) {
|
|
Torsten Duwe |
ec2bc1 |
case ADF_VF2PF_MSGTYPE_COMPAT_VER_REQ:
|
|
Torsten Duwe |
ec2bc1 |
{
|
|
Torsten Duwe |
ec2bc1 |
- u8 vf_compat_ver = msg >> ADF_VF2PF_COMPAT_VER_REQ_SHIFT;
|
|
Torsten Duwe |
ec2bc1 |
+ u8 vf_compat_ver = msg.data;
|
|
Torsten Duwe |
ec2bc1 |
u8 compat;
|
|
Torsten Duwe |
ec2bc1 |
|
|
Torsten Duwe |
ec2bc1 |
dev_dbg(&GET_DEV(accel_dev),
|
|
Torsten Duwe |
ec2bc1 |
@@ -64,11 +63,10 @@ static int adf_handle_vf2pf_msg(struct adf_accel_dev *accel_dev, u32 vf_nr,
|
|
Torsten Duwe |
ec2bc1 |
else
|
|
Torsten Duwe |
ec2bc1 |
compat = ADF_PF2VF_VF_COMPAT_UNKNOWN;
|
|
Torsten Duwe |
ec2bc1 |
|
|
Torsten Duwe |
ec2bc1 |
- resp |= ADF_PF2VF_MSGTYPE_VERSION_RESP <<
|
|
Torsten Duwe |
ec2bc1 |
- ADF_PFVF_MSGTYPE_SHIFT;
|
|
Torsten Duwe |
ec2bc1 |
- resp |= ADF_PFVF_COMPAT_THIS_VERSION <<
|
|
Torsten Duwe |
ec2bc1 |
- ADF_PF2VF_VERSION_RESP_VERS_SHIFT;
|
|
Torsten Duwe |
ec2bc1 |
- resp |= compat << ADF_PF2VF_VERSION_RESP_RESULT_SHIFT;
|
|
Torsten Duwe |
ec2bc1 |
+ resp->type = ADF_PF2VF_MSGTYPE_VERSION_RESP;
|
|
Torsten Duwe |
ec2bc1 |
+ resp->data = ADF_PFVF_COMPAT_THIS_VERSION <<
|
|
Torsten Duwe |
ec2bc1 |
+ ADF_PF2VF_VERSION_RESP_VERS_SHIFT;
|
|
Torsten Duwe |
ec2bc1 |
+ resp->data |= compat << ADF_PF2VF_VERSION_RESP_RESULT_SHIFT;
|
|
Torsten Duwe |
ec2bc1 |
}
|
|
Torsten Duwe |
ec2bc1 |
break;
|
|
Torsten Duwe |
ec2bc1 |
case ADF_VF2PF_MSGTYPE_VERSION_REQ:
|
|
Torsten Duwe |
ec2bc1 |
@@ -82,12 +80,10 @@ static int adf_handle_vf2pf_msg(struct adf_accel_dev *accel_dev, u32 vf_nr,
|
|
Torsten Duwe |
ec2bc1 |
/* PF always newer than legacy VF */
|
|
Torsten Duwe |
ec2bc1 |
compat = ADF_PF2VF_VF_COMPATIBLE;
|
|
Torsten Duwe |
ec2bc1 |
|
|
Torsten Duwe |
ec2bc1 |
- resp |= ADF_PF2VF_MSGTYPE_VERSION_RESP <<
|
|
Torsten Duwe |
ec2bc1 |
- ADF_PFVF_MSGTYPE_SHIFT;
|
|
Torsten Duwe |
ec2bc1 |
- /* Set legacy major and minor version num */
|
|
Torsten Duwe |
ec2bc1 |
- resp |= 1 << ADF_PF2VF_MAJORVERSION_SHIFT |
|
|
Torsten Duwe |
ec2bc1 |
- 1 << ADF_PF2VF_MINORVERSION_SHIFT;
|
|
Torsten Duwe |
ec2bc1 |
- resp |= compat << ADF_PF2VF_VERSION_RESP_RESULT_SHIFT;
|
|
Torsten Duwe |
ec2bc1 |
+ resp->type = ADF_PF2VF_MSGTYPE_VERSION_RESP;
|
|
Torsten Duwe |
ec2bc1 |
+ /* Set legacy major and minor version to the latest, 1.1 */
|
|
Torsten Duwe |
ec2bc1 |
+ resp->data |= 0x11;
|
|
Torsten Duwe |
ec2bc1 |
+ resp->data |= compat << ADF_PF2VF_VERSION_RESP_RESULT_SHIFT;
|
|
Torsten Duwe |
ec2bc1 |
}
|
|
Torsten Duwe |
ec2bc1 |
break;
|
|
Torsten Duwe |
ec2bc1 |
case ADF_VF2PF_MSGTYPE_INIT:
|
|
Torsten Duwe |
ec2bc1 |
@@ -105,29 +101,28 @@ static int adf_handle_vf2pf_msg(struct adf_accel_dev *accel_dev, u32 vf_nr,
|
|
Torsten Duwe |
ec2bc1 |
}
|
|
Torsten Duwe |
ec2bc1 |
break;
|
|
Torsten Duwe |
ec2bc1 |
default:
|
|
Torsten Duwe |
ec2bc1 |
- dev_dbg(&GET_DEV(accel_dev), "Unknown message from VF%d (0x%.8x)\n",
|
|
Torsten Duwe |
ec2bc1 |
- vf_nr, msg);
|
|
Torsten Duwe |
ec2bc1 |
+ dev_dbg(&GET_DEV(accel_dev),
|
|
Torsten Duwe |
ec2bc1 |
+ "Unknown message from VF%d (type 0x%.4x, data: 0x%.4x)\n",
|
|
Torsten Duwe |
ec2bc1 |
+ vf_nr, msg.type, msg.data);
|
|
Torsten Duwe |
ec2bc1 |
return -ENOMSG;
|
|
Torsten Duwe |
ec2bc1 |
}
|
|
Torsten Duwe |
ec2bc1 |
|
|
Torsten Duwe |
ec2bc1 |
- *response = resp;
|
|
Torsten Duwe |
ec2bc1 |
-
|
|
Torsten Duwe |
ec2bc1 |
return 0;
|
|
Torsten Duwe |
ec2bc1 |
}
|
|
Torsten Duwe |
ec2bc1 |
|
|
Torsten Duwe |
ec2bc1 |
bool adf_recv_and_handle_vf2pf_msg(struct adf_accel_dev *accel_dev, u32 vf_nr)
|
|
Torsten Duwe |
ec2bc1 |
{
|
|
Torsten Duwe |
ec2bc1 |
- u32 resp = 0;
|
|
Torsten Duwe |
ec2bc1 |
- u32 msg;
|
|
Torsten Duwe |
ec2bc1 |
+ struct pfvf_message req;
|
|
Torsten Duwe |
ec2bc1 |
+ struct pfvf_message resp = {0};
|
|
Torsten Duwe |
ec2bc1 |
|
|
Torsten Duwe |
ec2bc1 |
- msg = adf_recv_vf2pf_msg(accel_dev, vf_nr);
|
|
Torsten Duwe |
ec2bc1 |
- if (!msg)
|
|
Torsten Duwe |
ec2bc1 |
+ req = adf_recv_vf2pf_msg(accel_dev, vf_nr);
|
|
Torsten Duwe |
ec2bc1 |
+ if (!req.type) /* Legacy or no message */
|
|
Torsten Duwe |
ec2bc1 |
return true;
|
|
Torsten Duwe |
ec2bc1 |
|
|
Torsten Duwe |
ec2bc1 |
- if (adf_handle_vf2pf_msg(accel_dev, vf_nr, msg, &resp))
|
|
Torsten Duwe |
ec2bc1 |
+ if (adf_handle_vf2pf_msg(accel_dev, vf_nr, req, &resp))
|
|
Torsten Duwe |
ec2bc1 |
return false;
|
|
Torsten Duwe |
ec2bc1 |
|
|
Torsten Duwe |
ec2bc1 |
- if (resp && adf_send_pf2vf_msg(accel_dev, vf_nr, resp))
|
|
Torsten Duwe |
ec2bc1 |
+ if (resp.type && adf_send_pf2vf_msg(accel_dev, vf_nr, resp))
|
|
Torsten Duwe |
ec2bc1 |
dev_err(&GET_DEV(accel_dev),
|
|
Torsten Duwe |
ec2bc1 |
"Failed to send response to VF%d\n", vf_nr);
|
|
Torsten Duwe |
ec2bc1 |
|
|
Torsten Duwe |
ec2bc1 |
diff --git a/drivers/crypto/qat/qat_common/adf_pfvf_pf_proto.h b/drivers/crypto/qat/qat_common/adf_pfvf_pf_proto.h
|
|
Torsten Duwe |
ec2bc1 |
index 63245407bfb6f..165d266d023d1 100644
|
|
Torsten Duwe |
ec2bc1 |
--- a/drivers/crypto/qat/qat_common/adf_pfvf_pf_proto.h
|
|
Torsten Duwe |
ec2bc1 |
+++ b/drivers/crypto/qat/qat_common/adf_pfvf_pf_proto.h
|
|
Torsten Duwe |
ec2bc1 |
@@ -6,7 +6,7 @@
|
|
Torsten Duwe |
ec2bc1 |
#include <linux/types.h>
|
|
Torsten Duwe |
ec2bc1 |
#include "adf_accel_devices.h"
|
|
Torsten Duwe |
ec2bc1 |
|
|
Torsten Duwe |
ec2bc1 |
-int adf_send_pf2vf_msg(struct adf_accel_dev *accel_dev, u8 vf_nr, u32 msg);
|
|
Torsten Duwe |
ec2bc1 |
+int adf_send_pf2vf_msg(struct adf_accel_dev *accel_dev, u8 vf_nr, struct pfvf_message msg);
|
|
Torsten Duwe |
ec2bc1 |
|
|
Torsten Duwe |
ec2bc1 |
int adf_enable_pf2vf_comms(struct adf_accel_dev *accel_dev);
|
|
Torsten Duwe |
ec2bc1 |
|
|
Torsten Duwe |
ec2bc1 |
diff --git a/drivers/crypto/qat/qat_common/adf_pfvf_utils.c b/drivers/crypto/qat/qat_common/adf_pfvf_utils.c
|
|
Torsten Duwe |
ec2bc1 |
new file mode 100644
|
|
Torsten Duwe |
ec2bc1 |
index 0000000000000..494da89e20487
|
|
Torsten Duwe |
ec2bc1 |
--- /dev/null
|
|
Torsten Duwe |
ec2bc1 |
+++ b/drivers/crypto/qat/qat_common/adf_pfvf_utils.c
|
|
Torsten Duwe |
ec2bc1 |
@@ -0,0 +1,50 @@
|
|
Torsten Duwe |
ec2bc1 |
+// SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0-only)
|
|
Torsten Duwe |
ec2bc1 |
+/* Copyright(c) 2021 Intel Corporation */
|
|
Torsten Duwe |
ec2bc1 |
+#include <linux/pci.h>
|
|
Torsten Duwe |
ec2bc1 |
+#include <linux/types.h>
|
|
Torsten Duwe |
ec2bc1 |
+#include "adf_accel_devices.h"
|
|
Torsten Duwe |
ec2bc1 |
+#include "adf_pfvf_msg.h"
|
|
Torsten Duwe |
ec2bc1 |
+#include "adf_pfvf_utils.h"
|
|
Torsten Duwe |
ec2bc1 |
+
|
|
Torsten Duwe |
ec2bc1 |
+static bool set_value_on_csr_msg(struct adf_accel_dev *accel_dev, u32 *csr_msg,
|
|
Torsten Duwe |
ec2bc1 |
+ u32 value, const struct pfvf_field_format *fmt)
|
|
Torsten Duwe |
ec2bc1 |
+{
|
|
Torsten Duwe |
ec2bc1 |
+ if (unlikely((value & fmt->mask) != value)) {
|
|
Torsten Duwe |
ec2bc1 |
+ dev_err(&GET_DEV(accel_dev),
|
|
Torsten Duwe |
ec2bc1 |
+ "PFVF message value 0x%X out of range, %u max allowed\n",
|
|
Torsten Duwe |
ec2bc1 |
+ value, fmt->mask);
|
|
Torsten Duwe |
ec2bc1 |
+ return false;
|
|
Torsten Duwe |
ec2bc1 |
+ }
|
|
Torsten Duwe |
ec2bc1 |
+
|
|
Torsten Duwe |
ec2bc1 |
+ *csr_msg |= value << fmt->offset;
|
|
Torsten Duwe |
ec2bc1 |
+
|
|
Torsten Duwe |
ec2bc1 |
+ return true;
|
|
Torsten Duwe |
ec2bc1 |
+}
|
|
Torsten Duwe |
ec2bc1 |
+
|
|
Torsten Duwe |
ec2bc1 |
+u32 adf_pfvf_csr_msg_of(struct adf_accel_dev *accel_dev,
|
|
Torsten Duwe |
ec2bc1 |
+ struct pfvf_message msg,
|
|
Torsten Duwe |
ec2bc1 |
+ const struct pfvf_csr_format *fmt)
|
|
Torsten Duwe |
ec2bc1 |
+{
|
|
Torsten Duwe |
ec2bc1 |
+ u32 csr_msg = 0;
|
|
Torsten Duwe |
ec2bc1 |
+
|
|
Torsten Duwe |
ec2bc1 |
+ if (!set_value_on_csr_msg(accel_dev, &csr_msg, msg.type, &fmt->type) ||
|
|
Torsten Duwe |
ec2bc1 |
+ !set_value_on_csr_msg(accel_dev, &csr_msg, msg.data, &fmt->data))
|
|
Torsten Duwe |
ec2bc1 |
+ return 0;
|
|
Torsten Duwe |
ec2bc1 |
+
|
|
Torsten Duwe |
ec2bc1 |
+ return csr_msg | ADF_PFVF_MSGORIGIN_SYSTEM;
|
|
Torsten Duwe |
ec2bc1 |
+}
|
|
Torsten Duwe |
ec2bc1 |
+
|
|
Torsten Duwe |
ec2bc1 |
+struct pfvf_message adf_pfvf_message_of(struct adf_accel_dev *accel_dev, u32 csr_msg,
|
|
Torsten Duwe |
ec2bc1 |
+ const struct pfvf_csr_format *fmt)
|
|
Torsten Duwe |
ec2bc1 |
+{
|
|
Torsten Duwe |
ec2bc1 |
+ struct pfvf_message msg = { 0 };
|
|
Torsten Duwe |
ec2bc1 |
+
|
|
Torsten Duwe |
ec2bc1 |
+ msg.type = (csr_msg >> fmt->type.offset) & fmt->type.mask;
|
|
Torsten Duwe |
ec2bc1 |
+ msg.data = (csr_msg >> fmt->data.offset) & fmt->data.mask;
|
|
Torsten Duwe |
ec2bc1 |
+
|
|
Torsten Duwe |
ec2bc1 |
+ if (unlikely(!msg.type))
|
|
Torsten Duwe |
ec2bc1 |
+ dev_err(&GET_DEV(accel_dev),
|
|
Torsten Duwe |
ec2bc1 |
+ "Invalid PFVF msg with no type received\n");
|
|
Torsten Duwe |
ec2bc1 |
+
|
|
Torsten Duwe |
ec2bc1 |
+ return msg;
|
|
Torsten Duwe |
ec2bc1 |
+}
|
|
Torsten Duwe |
ec2bc1 |
diff --git a/drivers/crypto/qat/qat_common/adf_pfvf_utils.h b/drivers/crypto/qat/qat_common/adf_pfvf_utils.h
|
|
Torsten Duwe |
ec2bc1 |
new file mode 100644
|
|
Torsten Duwe |
ec2bc1 |
index 0000000000000..7b73b5992d031
|
|
Torsten Duwe |
ec2bc1 |
--- /dev/null
|
|
Torsten Duwe |
ec2bc1 |
+++ b/drivers/crypto/qat/qat_common/adf_pfvf_utils.h
|
|
Torsten Duwe |
ec2bc1 |
@@ -0,0 +1,24 @@
|
|
Torsten Duwe |
ec2bc1 |
+/* SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0-only) */
|
|
Torsten Duwe |
ec2bc1 |
+/* Copyright(c) 2021 Intel Corporation */
|
|
Torsten Duwe |
ec2bc1 |
+#ifndef ADF_PFVF_UTILS_H
|
|
Torsten Duwe |
ec2bc1 |
+#define ADF_PFVF_UTILS_H
|
|
Torsten Duwe |
ec2bc1 |
+
|
|
Torsten Duwe |
ec2bc1 |
+#include <linux/types.h>
|
|
Torsten Duwe |
ec2bc1 |
+#include "adf_pfvf_msg.h"
|
|
Torsten Duwe |
ec2bc1 |
+
|
|
Torsten Duwe |
ec2bc1 |
+struct pfvf_field_format {
|
|
Torsten Duwe |
ec2bc1 |
+ u8 offset;
|
|
Torsten Duwe |
ec2bc1 |
+ u32 mask;
|
|
Torsten Duwe |
ec2bc1 |
+};
|
|
Torsten Duwe |
ec2bc1 |
+
|
|
Torsten Duwe |
ec2bc1 |
+struct pfvf_csr_format {
|
|
Torsten Duwe |
ec2bc1 |
+ struct pfvf_field_format type;
|
|
Torsten Duwe |
ec2bc1 |
+ struct pfvf_field_format data;
|
|
Torsten Duwe |
ec2bc1 |
+};
|
|
Torsten Duwe |
ec2bc1 |
+
|
|
Torsten Duwe |
ec2bc1 |
+u32 adf_pfvf_csr_msg_of(struct adf_accel_dev *accel_dev, struct pfvf_message msg,
|
|
Torsten Duwe |
ec2bc1 |
+ const struct pfvf_csr_format *fmt);
|
|
Torsten Duwe |
ec2bc1 |
+struct pfvf_message adf_pfvf_message_of(struct adf_accel_dev *accel_dev, u32 raw_msg,
|
|
Torsten Duwe |
ec2bc1 |
+ const struct pfvf_csr_format *fmt);
|
|
Torsten Duwe |
ec2bc1 |
+
|
|
Torsten Duwe |
ec2bc1 |
+#endif /* ADF_PFVF_UTILS_H */
|
|
Torsten Duwe |
ec2bc1 |
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 |
ec2bc1 |
index 0463743a8d43f..5184a77598d2e 100644
|
|
Torsten Duwe |
ec2bc1 |
--- a/drivers/crypto/qat/qat_common/adf_pfvf_vf_msg.c
|
|
Torsten Duwe |
ec2bc1 |
+++ b/drivers/crypto/qat/qat_common/adf_pfvf_vf_msg.c
|
|
Torsten Duwe |
ec2bc1 |
@@ -16,7 +16,7 @@
|
|
Torsten Duwe |
ec2bc1 |
*/
|
|
Torsten Duwe |
ec2bc1 |
int adf_vf2pf_notify_init(struct adf_accel_dev *accel_dev)
|
|
Torsten Duwe |
ec2bc1 |
{
|
|
Torsten Duwe |
ec2bc1 |
- u32 msg = ADF_VF2PF_MSGTYPE_INIT << ADF_PFVF_MSGTYPE_SHIFT;
|
|
Torsten Duwe |
ec2bc1 |
+ struct pfvf_message msg = { .type = ADF_VF2PF_MSGTYPE_INIT };
|
|
Torsten Duwe |
ec2bc1 |
|
|
Torsten Duwe |
ec2bc1 |
if (adf_send_vf2pf_msg(accel_dev, msg)) {
|
|
Torsten Duwe |
ec2bc1 |
dev_err(&GET_DEV(accel_dev),
|
|
Torsten Duwe |
ec2bc1 |
@@ -38,7 +38,7 @@ EXPORT_SYMBOL_GPL(adf_vf2pf_notify_init);
|
|
Torsten Duwe |
ec2bc1 |
*/
|
|
Torsten Duwe |
ec2bc1 |
void adf_vf2pf_notify_shutdown(struct adf_accel_dev *accel_dev)
|
|
Torsten Duwe |
ec2bc1 |
{
|
|
Torsten Duwe |
ec2bc1 |
- u32 msg = ADF_VF2PF_MSGTYPE_SHUTDOWN << ADF_PFVF_MSGTYPE_SHIFT;
|
|
Torsten Duwe |
ec2bc1 |
+ struct pfvf_message msg = { .type = ADF_VF2PF_MSGTYPE_SHUTDOWN };
|
|
Torsten Duwe |
ec2bc1 |
|
|
Torsten Duwe |
ec2bc1 |
if (test_bit(ADF_STATUS_PF_RUNNING, &accel_dev->status))
|
|
Torsten Duwe |
ec2bc1 |
if (adf_send_vf2pf_msg(accel_dev, msg))
|
|
Torsten Duwe |
ec2bc1 |
@@ -50,13 +50,13 @@ EXPORT_SYMBOL_GPL(adf_vf2pf_notify_shutdown);
|
|
Torsten Duwe |
ec2bc1 |
int adf_vf2pf_request_version(struct adf_accel_dev *accel_dev)
|
|
Torsten Duwe |
ec2bc1 |
{
|
|
Torsten Duwe |
ec2bc1 |
u8 pf_version;
|
|
Torsten Duwe |
ec2bc1 |
- u32 msg = 0;
|
|
Torsten Duwe |
ec2bc1 |
int compat;
|
|
Torsten Duwe |
ec2bc1 |
- u32 resp;
|
|
Torsten Duwe |
ec2bc1 |
int ret;
|
|
Torsten Duwe |
ec2bc1 |
-
|
|
Torsten Duwe |
ec2bc1 |
- msg = ADF_VF2PF_MSGTYPE_COMPAT_VER_REQ << ADF_PFVF_MSGTYPE_SHIFT |
|
|
Torsten Duwe |
ec2bc1 |
- ADF_PFVF_COMPAT_THIS_VERSION << ADF_VF2PF_COMPAT_VER_REQ_SHIFT;
|
|
Torsten Duwe |
ec2bc1 |
+ struct pfvf_message resp;
|
|
Torsten Duwe |
ec2bc1 |
+ struct pfvf_message msg = {
|
|
Torsten Duwe |
ec2bc1 |
+ .type = ADF_VF2PF_MSGTYPE_COMPAT_VER_REQ,
|
|
Torsten Duwe |
ec2bc1 |
+ .data = ADF_PFVF_COMPAT_THIS_VERSION,
|
|
Torsten Duwe |
ec2bc1 |
+ };
|
|
Torsten Duwe |
ec2bc1 |
|
|
Torsten Duwe |
ec2bc1 |
BUILD_BUG_ON(ADF_PFVF_COMPAT_THIS_VERSION > 255);
|
|
Torsten Duwe |
ec2bc1 |
|
|
Torsten Duwe |
ec2bc1 |
@@ -67,9 +67,9 @@ int adf_vf2pf_request_version(struct adf_accel_dev *accel_dev)
|
|
Torsten Duwe |
ec2bc1 |
return ret;
|
|
Torsten Duwe |
ec2bc1 |
}
|
|
Torsten Duwe |
ec2bc1 |
|
|
Torsten Duwe |
ec2bc1 |
- pf_version = (resp >> ADF_PF2VF_VERSION_RESP_VERS_SHIFT)
|
|
Torsten Duwe |
ec2bc1 |
+ pf_version = (resp.data >> ADF_PF2VF_VERSION_RESP_VERS_SHIFT)
|
|
Torsten Duwe |
ec2bc1 |
& ADF_PF2VF_VERSION_RESP_VERS_MASK;
|
|
Torsten Duwe |
ec2bc1 |
- compat = (resp >> ADF_PF2VF_VERSION_RESP_RESULT_SHIFT)
|
|
Torsten Duwe |
ec2bc1 |
+ compat = (resp.data >> ADF_PF2VF_VERSION_RESP_RESULT_SHIFT)
|
|
Torsten Duwe |
ec2bc1 |
& ADF_PF2VF_VERSION_RESP_RESULT_MASK;
|
|
Torsten Duwe |
ec2bc1 |
|
|
Torsten Duwe |
ec2bc1 |
/* Response from PF received, check compatibility */
|
|
Torsten Duwe |
ec2bc1 |
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 |
ec2bc1 |
index 56e8185a9630a..729c00c0d2549 100644
|
|
Torsten Duwe |
ec2bc1 |
--- a/drivers/crypto/qat/qat_common/adf_pfvf_vf_proto.c
|
|
Torsten Duwe |
ec2bc1 |
+++ b/drivers/crypto/qat/qat_common/adf_pfvf_vf_proto.c
|
|
Torsten Duwe |
ec2bc1 |
@@ -25,7 +25,7 @@
|
|
Torsten Duwe |
ec2bc1 |
*
|
|
Torsten Duwe |
ec2bc1 |
* Return: 0 on success, error code otherwise.
|
|
Torsten Duwe |
ec2bc1 |
*/
|
|
Torsten Duwe |
ec2bc1 |
-int adf_send_vf2pf_msg(struct adf_accel_dev *accel_dev, u32 msg)
|
|
Torsten Duwe |
ec2bc1 |
+int adf_send_vf2pf_msg(struct adf_accel_dev *accel_dev, struct pfvf_message msg)
|
|
Torsten Duwe |
ec2bc1 |
{
|
|
Torsten Duwe |
ec2bc1 |
struct adf_pfvf_ops *pfvf_ops = GET_PFVF_OPS(accel_dev);
|
|
Torsten Duwe |
ec2bc1 |
u32 pfvf_offset = pfvf_ops->get_vf2pf_offset(0);
|
|
Torsten Duwe |
ec2bc1 |
@@ -42,7 +42,7 @@ int adf_send_vf2pf_msg(struct adf_accel_dev *accel_dev, u32 msg)
|
|
Torsten Duwe |
ec2bc1 |
*
|
|
Torsten Duwe |
ec2bc1 |
* Return: a valid message on success, zero otherwise.
|
|
Torsten Duwe |
ec2bc1 |
*/
|
|
Torsten Duwe |
ec2bc1 |
-static u32 adf_recv_pf2vf_msg(struct adf_accel_dev *accel_dev)
|
|
Torsten Duwe |
ec2bc1 |
+static struct pfvf_message adf_recv_pf2vf_msg(struct adf_accel_dev *accel_dev)
|
|
Torsten Duwe |
ec2bc1 |
{
|
|
Torsten Duwe |
ec2bc1 |
struct adf_pfvf_ops *pfvf_ops = GET_PFVF_OPS(accel_dev);
|
|
Torsten Duwe |
ec2bc1 |
u32 pfvf_offset = pfvf_ops->get_pf2vf_offset(0);
|
|
Torsten Duwe |
ec2bc1 |
@@ -61,7 +61,8 @@ static u32 adf_recv_pf2vf_msg(struct adf_accel_dev *accel_dev)
|
|
Torsten Duwe |
ec2bc1 |
*
|
|
Torsten Duwe |
ec2bc1 |
* Return: 0 on success, error code otherwise.
|
|
Torsten Duwe |
ec2bc1 |
*/
|
|
Torsten Duwe |
ec2bc1 |
-int adf_send_vf2pf_req(struct adf_accel_dev *accel_dev, u32 msg, u32 *resp)
|
|
Torsten Duwe |
ec2bc1 |
+int adf_send_vf2pf_req(struct adf_accel_dev *accel_dev, struct pfvf_message msg,
|
|
Torsten Duwe |
ec2bc1 |
+ struct pfvf_message *resp)
|
|
Torsten Duwe |
ec2bc1 |
{
|
|
Torsten Duwe |
ec2bc1 |
unsigned long timeout = msecs_to_jiffies(ADF_PFVF_MSG_RESP_TIMEOUT);
|
|
Torsten Duwe |
ec2bc1 |
int ret;
|
|
Torsten Duwe |
ec2bc1 |
@@ -88,14 +89,15 @@ int adf_send_vf2pf_req(struct adf_accel_dev *accel_dev, u32 msg, u32 *resp)
|
|
Torsten Duwe |
ec2bc1 |
*resp = accel_dev->vf.response;
|
|
Torsten Duwe |
ec2bc1 |
|
|
Torsten Duwe |
ec2bc1 |
/* Once copied, set to an invalid value */
|
|
Torsten Duwe |
ec2bc1 |
- accel_dev->vf.response = 0;
|
|
Torsten Duwe |
ec2bc1 |
+ accel_dev->vf.response.type = 0;
|
|
Torsten Duwe |
ec2bc1 |
|
|
Torsten Duwe |
ec2bc1 |
return 0;
|
|
Torsten Duwe |
ec2bc1 |
}
|
|
Torsten Duwe |
ec2bc1 |
|
|
Torsten Duwe |
ec2bc1 |
-static bool adf_handle_pf2vf_msg(struct adf_accel_dev *accel_dev, u32 msg)
|
|
Torsten Duwe |
ec2bc1 |
+static bool adf_handle_pf2vf_msg(struct adf_accel_dev *accel_dev,
|
|
Torsten Duwe |
ec2bc1 |
+ struct pfvf_message msg)
|
|
Torsten Duwe |
ec2bc1 |
{
|
|
Torsten Duwe |
ec2bc1 |
- switch ((msg >> ADF_PFVF_MSGTYPE_SHIFT) & ADF_PFVF_MSGTYPE_MASK) {
|
|
Torsten Duwe |
ec2bc1 |
+ switch (msg.type) {
|
|
Torsten Duwe |
ec2bc1 |
case ADF_PF2VF_MSGTYPE_RESTARTING:
|
|
Torsten Duwe |
ec2bc1 |
dev_dbg(&GET_DEV(accel_dev), "Restarting message received from PF\n");
|
|
Torsten Duwe |
ec2bc1 |
|
|
Torsten Duwe |
ec2bc1 |
@@ -103,13 +105,15 @@ static bool adf_handle_pf2vf_msg(struct adf_accel_dev *accel_dev, u32 msg)
|
|
Torsten Duwe |
ec2bc1 |
return false;
|
|
Torsten Duwe |
ec2bc1 |
case ADF_PF2VF_MSGTYPE_VERSION_RESP:
|
|
Torsten Duwe |
ec2bc1 |
dev_dbg(&GET_DEV(accel_dev),
|
|
Torsten Duwe |
ec2bc1 |
- "Response message received from PF (0x%.8x)\n", msg);
|
|
Torsten Duwe |
ec2bc1 |
+ "Response Message received from PF (type 0x%.4x, data 0x%.4x)\n",
|
|
Torsten Duwe |
ec2bc1 |
+ msg.type, msg.data);
|
|
Torsten Duwe |
ec2bc1 |
accel_dev->vf.response = msg;
|
|
Torsten Duwe |
ec2bc1 |
complete(&accel_dev->vf.msg_received);
|
|
Torsten Duwe |
ec2bc1 |
return true;
|
|
Torsten Duwe |
ec2bc1 |
default:
|
|
Torsten Duwe |
ec2bc1 |
dev_err(&GET_DEV(accel_dev),
|
|
Torsten Duwe |
ec2bc1 |
- "Unknown PF2VF message (0x%.8x) from PF\n", msg);
|
|
Torsten Duwe |
ec2bc1 |
+ "Unknown message from PF (type 0x%.4x, data: 0x%.4x)\n",
|
|
Torsten Duwe |
ec2bc1 |
+ msg.type, msg.data);
|
|
Torsten Duwe |
ec2bc1 |
}
|
|
Torsten Duwe |
ec2bc1 |
|
|
Torsten Duwe |
ec2bc1 |
return false;
|
|
Torsten Duwe |
ec2bc1 |
@@ -117,12 +121,14 @@ static bool adf_handle_pf2vf_msg(struct adf_accel_dev *accel_dev, u32 msg)
|
|
Torsten Duwe |
ec2bc1 |
|
|
Torsten Duwe |
ec2bc1 |
bool adf_recv_and_handle_pf2vf_msg(struct adf_accel_dev *accel_dev)
|
|
Torsten Duwe |
ec2bc1 |
{
|
|
Torsten Duwe |
ec2bc1 |
- u32 msg;
|
|
Torsten Duwe |
ec2bc1 |
+ struct pfvf_message msg;
|
|
Torsten Duwe |
ec2bc1 |
|
|
Torsten Duwe |
ec2bc1 |
msg = adf_recv_pf2vf_msg(accel_dev);
|
|
Torsten Duwe |
ec2bc1 |
- if (msg)
|
|
Torsten Duwe |
ec2bc1 |
+ if (msg.type) /* Invalid or no message */
|
|
Torsten Duwe |
ec2bc1 |
return adf_handle_pf2vf_msg(accel_dev, msg);
|
|
Torsten Duwe |
ec2bc1 |
|
|
Torsten Duwe |
ec2bc1 |
+ /* No replies for PF->VF messages at present */
|
|
Torsten Duwe |
ec2bc1 |
+
|
|
Torsten Duwe |
ec2bc1 |
return true;
|
|
Torsten Duwe |
ec2bc1 |
}
|
|
Torsten Duwe |
ec2bc1 |
|
|
Torsten Duwe |
ec2bc1 |
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 |
ec2bc1 |
index 6226d4d9d520f..e32d1bc3a7404 100644
|
|
Torsten Duwe |
ec2bc1 |
--- a/drivers/crypto/qat/qat_common/adf_pfvf_vf_proto.h
|
|
Torsten Duwe |
ec2bc1 |
+++ b/drivers/crypto/qat/qat_common/adf_pfvf_vf_proto.h
|
|
Torsten Duwe |
ec2bc1 |
@@ -6,8 +6,9 @@
|
|
Torsten Duwe |
ec2bc1 |
#include <linux/types.h>
|
|
Torsten Duwe |
ec2bc1 |
#include "adf_accel_devices.h"
|
|
Torsten Duwe |
ec2bc1 |
|
|
Torsten Duwe |
ec2bc1 |
-int adf_send_vf2pf_msg(struct adf_accel_dev *accel_dev, u32 msg);
|
|
Torsten Duwe |
ec2bc1 |
-int adf_send_vf2pf_req(struct adf_accel_dev *accel_dev, u32 msg, u32 *resp);
|
|
Torsten Duwe |
ec2bc1 |
+int adf_send_vf2pf_msg(struct adf_accel_dev *accel_dev, struct pfvf_message msg);
|
|
Torsten Duwe |
ec2bc1 |
+int adf_send_vf2pf_req(struct adf_accel_dev *accel_dev, struct pfvf_message msg,
|
|
Torsten Duwe |
ec2bc1 |
+ struct pfvf_message *resp);
|
|
Torsten Duwe |
ec2bc1 |
|
|
Torsten Duwe |
ec2bc1 |
int adf_enable_vf2pf_comms(struct adf_accel_dev *accel_dev);
|
|
Torsten Duwe |
ec2bc1 |
|
|
Torsten Duwe |
ec2bc1 |
--
|
|
Torsten Duwe |
ec2bc1 |
2.35.3
|
|
Torsten Duwe |
ec2bc1 |
|