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