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, &params);
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, &params);
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, &params);
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