Torsten Duwe 93ce56
From 0bba03ce9739be004d7e7060a1a127418fd0055c Mon Sep 17 00:00:00 2001
Torsten Duwe 93ce56
From: Marco Chiappero <marco.chiappero@intel.com>
Torsten Duwe 93ce56
Date: Thu, 16 Dec 2021 09:13:32 +0000
Torsten Duwe 93ce56
Subject: [PATCH] crypto: qat - add PFVF support to enable the reset of ring
Torsten Duwe 93ce56
 pairs
Torsten Duwe 93ce56
Git-commit: 0bba03ce9739be004d7e7060a1a127418fd0055c
Torsten Duwe 93ce56
Patch-mainline: v5.17-rc1
Torsten Duwe 93ce56
References: jsc#PED-1073
Torsten Duwe 93ce56
Torsten Duwe 93ce56
Extend support for resetting ring pairs on the device to VFs. Such
Torsten Duwe 93ce56
reset happens by sending a request to the PF over the PFVF protocol.
Torsten Duwe 93ce56
Torsten Duwe 93ce56
This patch defines two new PFVF messages and adds the PFVF logic for
Torsten Duwe 93ce56
handling the request on PF, triggering the reset, and VFs, accepting the
Torsten Duwe 93ce56
'success'/'error' response.
Torsten Duwe 93ce56
Torsten Duwe 93ce56
This feature is GEN4 specific.
Torsten Duwe 93ce56
Torsten Duwe 93ce56
This patch is based on earlier work done by Zelin Deng.
Torsten Duwe 93ce56
Torsten Duwe 93ce56
Signed-off-by: Marco Chiappero <marco.chiappero@intel.com>
Torsten Duwe 93ce56
Reviewed-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
Torsten Duwe 93ce56
Reviewed-by: Fiona Trahe <fiona.trahe@intel.com>
Torsten Duwe 93ce56
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Torsten Duwe 93ce56
Signed-off-by: Torsten Duwe <duwe@suse.de>
Torsten Duwe 93ce56
Torsten Duwe 93ce56
---
Torsten Duwe 93ce56
 drivers/crypto/qat/qat_common/adf_pfvf_msg.h  | 14 +++++
Torsten Duwe 93ce56
 .../crypto/qat/qat_common/adf_pfvf_pf_proto.c | 52 +++++++++++++++++++
Torsten Duwe 93ce56
 .../crypto/qat/qat_common/adf_pfvf_vf_proto.c |  1 +
Torsten Duwe 93ce56
 3 files changed, 67 insertions(+)
Torsten Duwe 93ce56
Torsten Duwe 93ce56
diff --git a/drivers/crypto/qat/qat_common/adf_pfvf_msg.h b/drivers/crypto/qat/qat_common/adf_pfvf_msg.h
Torsten Duwe 93ce56
index f00e9e2c585b4..86b0e7baa4d3e 100644
Torsten Duwe 93ce56
--- a/drivers/crypto/qat/qat_common/adf_pfvf_msg.h
Torsten Duwe 93ce56
+++ b/drivers/crypto/qat/qat_common/adf_pfvf_msg.h
Torsten Duwe 93ce56
@@ -99,6 +99,8 @@ enum pf2vf_msgtype {
Torsten Duwe 93ce56
 	ADF_PF2VF_MSGTYPE_RESTARTING		= 0x01,
Torsten Duwe 93ce56
 	ADF_PF2VF_MSGTYPE_VERSION_RESP		= 0x02,
Torsten Duwe 93ce56
 	ADF_PF2VF_MSGTYPE_BLKMSG_RESP		= 0x03,
Torsten Duwe 93ce56
+/* Values from 0x10 are Gen4 specific, message type is only 4 bits in Gen2 devices. */
Torsten Duwe 93ce56
+	ADF_PF2VF_MSGTYPE_RP_RESET_RESP		= 0x10,
Torsten Duwe 93ce56
 };
Torsten Duwe 93ce56
 
Torsten Duwe 93ce56
 /* VF->PF messages */
Torsten Duwe 93ce56
@@ -110,6 +112,8 @@ enum vf2pf_msgtype {
Torsten Duwe 93ce56
 	ADF_VF2PF_MSGTYPE_LARGE_BLOCK_REQ	= 0x07,
Torsten Duwe 93ce56
 	ADF_VF2PF_MSGTYPE_MEDIUM_BLOCK_REQ	= 0x08,
Torsten Duwe 93ce56
 	ADF_VF2PF_MSGTYPE_SMALL_BLOCK_REQ	= 0x09,
Torsten Duwe 93ce56
+/* Values from 0x10 are Gen4 specific, message type is only 4 bits in Gen2 devices. */
Torsten Duwe 93ce56
+	ADF_VF2PF_MSGTYPE_RP_RESET		= 0x10,
Torsten Duwe 93ce56
 };
Torsten Duwe 93ce56
 
Torsten Duwe 93ce56
 /* VF/PF compatibility version. */
Torsten Duwe 93ce56
@@ -134,6 +138,16 @@ enum pf2vf_compat_response {
Torsten Duwe 93ce56
 	ADF_PF2VF_VF_COMPAT_UNKNOWN		= 0x03,
Torsten Duwe 93ce56
 };
Torsten Duwe 93ce56
 
Torsten Duwe 93ce56
+enum ring_reset_result {
Torsten Duwe 93ce56
+	RPRESET_SUCCESS				= 0x01,
Torsten Duwe 93ce56
+	RPRESET_NOT_SUPPORTED			= 0x02,
Torsten Duwe 93ce56
+	RPRESET_INVAL_BANK			= 0x03,
Torsten Duwe 93ce56
+	RPRESET_TIMEOUT				= 0x04,
Torsten Duwe 93ce56
+};
Torsten Duwe 93ce56
+
Torsten Duwe 93ce56
+#define ADF_VF2PF_RNG_RESET_RP_MASK		GENMASK(1, 0)
Torsten Duwe 93ce56
+#define ADF_VF2PF_RNG_RESET_RSVD_MASK		GENMASK(25, 2)
Torsten Duwe 93ce56
+
Torsten Duwe 93ce56
 /* PF->VF Block Responses */
Torsten Duwe 93ce56
 #define ADF_PF2VF_BLKMSG_RESP_TYPE_MASK		GENMASK(1, 0)
Torsten Duwe 93ce56
 #define ADF_PF2VF_BLKMSG_RESP_DATA_MASK		GENMASK(9, 2)
Torsten Duwe 93ce56
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 93ce56
index 84230aac67e69..588352de1ef0e 100644
Torsten Duwe 93ce56
--- a/drivers/crypto/qat/qat_common/adf_pfvf_pf_proto.c
Torsten Duwe 93ce56
+++ b/drivers/crypto/qat/qat_common/adf_pfvf_pf_proto.c
Torsten Duwe 93ce56
@@ -178,6 +178,55 @@ static struct pfvf_message handle_blkmsg_req(struct adf_accel_vf_info *vf_info,
Torsten Duwe 93ce56
 	return resp;
Torsten Duwe 93ce56
 }
Torsten Duwe 93ce56
 
Torsten Duwe 93ce56
+static struct pfvf_message handle_rp_reset_req(struct adf_accel_dev *accel_dev, u8 vf_nr,
Torsten Duwe 93ce56
+					       struct pfvf_message req)
Torsten Duwe 93ce56
+{
Torsten Duwe 93ce56
+	struct adf_hw_device_data *hw_data = accel_dev->hw_device;
Torsten Duwe 93ce56
+	struct pfvf_message resp = {
Torsten Duwe 93ce56
+		.type = ADF_PF2VF_MSGTYPE_RP_RESET_RESP,
Torsten Duwe 93ce56
+		.data = RPRESET_SUCCESS
Torsten Duwe 93ce56
+	};
Torsten Duwe 93ce56
+	u32 bank_number;
Torsten Duwe 93ce56
+	u32 rsvd_field;
Torsten Duwe 93ce56
+
Torsten Duwe 93ce56
+	bank_number = FIELD_GET(ADF_VF2PF_RNG_RESET_RP_MASK, req.data);
Torsten Duwe 93ce56
+	rsvd_field = FIELD_GET(ADF_VF2PF_RNG_RESET_RSVD_MASK, req.data);
Torsten Duwe 93ce56
+
Torsten Duwe 93ce56
+	dev_dbg(&GET_DEV(accel_dev),
Torsten Duwe 93ce56
+		"Ring Pair Reset Message received from VF%d for bank 0x%x\n",
Torsten Duwe 93ce56
+		vf_nr, bank_number);
Torsten Duwe 93ce56
+
Torsten Duwe 93ce56
+	if (!hw_data->ring_pair_reset || rsvd_field) {
Torsten Duwe 93ce56
+		dev_dbg(&GET_DEV(accel_dev),
Torsten Duwe 93ce56
+			"Ring Pair Reset for VF%d is not supported\n", vf_nr);
Torsten Duwe 93ce56
+		resp.data = RPRESET_NOT_SUPPORTED;
Torsten Duwe 93ce56
+		goto out;
Torsten Duwe 93ce56
+	}
Torsten Duwe 93ce56
+
Torsten Duwe 93ce56
+	if (bank_number >= hw_data->num_banks_per_vf) {
Torsten Duwe 93ce56
+		dev_err(&GET_DEV(accel_dev),
Torsten Duwe 93ce56
+			"Invalid bank number (0x%x) from VF%d for Ring Reset\n",
Torsten Duwe 93ce56
+			bank_number, vf_nr);
Torsten Duwe 93ce56
+		resp.data = RPRESET_INVAL_BANK;
Torsten Duwe 93ce56
+		goto out;
Torsten Duwe 93ce56
+	}
Torsten Duwe 93ce56
+
Torsten Duwe 93ce56
+	/* Convert the VF provided value to PF bank number */
Torsten Duwe 93ce56
+	bank_number = vf_nr * hw_data->num_banks_per_vf + bank_number;
Torsten Duwe 93ce56
+	if (hw_data->ring_pair_reset(accel_dev, bank_number)) {
Torsten Duwe 93ce56
+		dev_dbg(&GET_DEV(accel_dev),
Torsten Duwe 93ce56
+			"Ring pair reset for VF%d failure\n", vf_nr);
Torsten Duwe 93ce56
+		resp.data = RPRESET_TIMEOUT;
Torsten Duwe 93ce56
+		goto out;
Torsten Duwe 93ce56
+	}
Torsten Duwe 93ce56
+
Torsten Duwe 93ce56
+	dev_dbg(&GET_DEV(accel_dev),
Torsten Duwe 93ce56
+		"Ring pair reset for VF%d successfully\n", vf_nr);
Torsten Duwe 93ce56
+
Torsten Duwe 93ce56
+out:
Torsten Duwe 93ce56
+	return resp;
Torsten Duwe 93ce56
+}
Torsten Duwe 93ce56
+
Torsten Duwe 93ce56
 static int adf_handle_vf2pf_msg(struct adf_accel_dev *accel_dev, u8 vf_nr,
Torsten Duwe 93ce56
 				struct pfvf_message msg, struct pfvf_message *resp)
Torsten Duwe 93ce56
 {
Torsten Duwe 93ce56
@@ -245,6 +294,9 @@ static int adf_handle_vf2pf_msg(struct adf_accel_dev *accel_dev, u8 vf_nr,
Torsten Duwe 93ce56
 	case ADF_VF2PF_MSGTYPE_SMALL_BLOCK_REQ:
Torsten Duwe 93ce56
 		*resp = handle_blkmsg_req(vf_info, msg);
Torsten Duwe 93ce56
 		break;
Torsten Duwe 93ce56
+	case ADF_VF2PF_MSGTYPE_RP_RESET:
Torsten Duwe 93ce56
+		*resp = handle_rp_reset_req(accel_dev, vf_nr, msg);
Torsten Duwe 93ce56
+		break;
Torsten Duwe 93ce56
 	default:
Torsten Duwe 93ce56
 		dev_dbg(&GET_DEV(accel_dev),
Torsten Duwe 93ce56
 			"Unknown message from VF%d (type 0x%.4x, data: 0x%.4x)\n",
Torsten Duwe 93ce56
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 93ce56
index 0e4b8397cbe34..1015155b63749 100644
Torsten Duwe 93ce56
--- a/drivers/crypto/qat/qat_common/adf_pfvf_vf_proto.c
Torsten Duwe 93ce56
+++ b/drivers/crypto/qat/qat_common/adf_pfvf_vf_proto.c
Torsten Duwe 93ce56
@@ -310,6 +310,7 @@ static bool adf_handle_pf2vf_msg(struct adf_accel_dev *accel_dev,
Torsten Duwe 93ce56
 		return false;
Torsten Duwe 93ce56
 	case ADF_PF2VF_MSGTYPE_VERSION_RESP:
Torsten Duwe 93ce56
 	case ADF_PF2VF_MSGTYPE_BLKMSG_RESP:
Torsten Duwe 93ce56
+	case ADF_PF2VF_MSGTYPE_RP_RESET_RESP:
Torsten Duwe 93ce56
 		dev_dbg(&GET_DEV(accel_dev),
Torsten Duwe 93ce56
 			"Response Message received from PF (type 0x%.4x, data 0x%.4x)\n",
Torsten Duwe 93ce56
 			msg.type, msg.data);
Torsten Duwe 93ce56
-- 
Torsten Duwe 93ce56
2.35.3
Torsten Duwe 93ce56