Torsten Duwe 74d1b5
From e1b176af3d7ecf9f9c0c0db374b37a40073ac960 Mon Sep 17 00:00:00 2001
Torsten Duwe 74d1b5
From: Marco Chiappero <marco.chiappero@intel.com>
Torsten Duwe 74d1b5
Date: Thu, 16 Dec 2021 09:13:29 +0000
Torsten Duwe 74d1b5
Subject: [PATCH] crypto: qat - exchange ring-to-service mappings over PFVF
Torsten Duwe 74d1b5
Git-commit: e1b176af3d7ecf9f9c0c0db374b37a40073ac960
Torsten Duwe 74d1b5
Patch-mainline: v5.17-rc1
Torsten Duwe 74d1b5
References: jsc#PED-1073
Torsten Duwe 74d1b5
Torsten Duwe 74d1b5
In addition to retrieving the device capabilities, a VF may also need to
Torsten Duwe 74d1b5
retrieve the mapping of its ring pairs to crypto and or compression
Torsten Duwe 74d1b5
services in order to work properly.
Torsten Duwe 74d1b5
Torsten Duwe 74d1b5
Make the VF receive the ring-to-service mappings from the PF by means of a
Torsten Duwe 74d1b5
new REQ_RING_SVC_MAP Block Message and add the request and response
Torsten Duwe 74d1b5
logic on VF and PF respectively. This change requires to bump the PFVF
Torsten Duwe 74d1b5
protocol to version 4.
Torsten Duwe 74d1b5
Torsten Duwe 74d1b5
Signed-off-by: Marco Chiappero <marco.chiappero@intel.com>
Torsten Duwe 74d1b5
Reviewed-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
Torsten Duwe 74d1b5
Reviewed-by: Fiona Trahe <fiona.trahe@intel.com>
Torsten Duwe 74d1b5
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Torsten Duwe 74d1b5
Signed-off-by: Torsten Duwe <duwe@suse.de>
Torsten Duwe 74d1b5
Torsten Duwe 74d1b5
---
Torsten Duwe 74d1b5
 drivers/crypto/qat/qat_common/adf_pfvf_msg.h  | 15 ++++++++++-
Torsten Duwe 74d1b5
 .../crypto/qat/qat_common/adf_pfvf_pf_msg.c   | 14 ++++++++++
Torsten Duwe 74d1b5
 .../crypto/qat/qat_common/adf_pfvf_pf_msg.h   |  2 ++
Torsten Duwe 74d1b5
 .../crypto/qat/qat_common/adf_pfvf_pf_proto.c |  1 +
Torsten Duwe 74d1b5
 .../crypto/qat/qat_common/adf_pfvf_vf_msg.c   | 27 +++++++++++++++++++
Torsten Duwe 74d1b5
 .../crypto/qat/qat_common/adf_pfvf_vf_msg.h   |  1 +
Torsten Duwe 74d1b5
 .../crypto/qat/qat_common/adf_pfvf_vf_proto.c |  4 +++
Torsten Duwe 74d1b5
 7 files changed, 63 insertions(+), 1 deletion(-)
Torsten Duwe 74d1b5
Torsten Duwe 74d1b5
diff --git a/drivers/crypto/qat/qat_common/adf_pfvf_msg.h b/drivers/crypto/qat/qat_common/adf_pfvf_msg.h
Torsten Duwe 74d1b5
index df052194ece7d..1d3cad7d49995 100644
Torsten Duwe 74d1b5
--- a/drivers/crypto/qat/qat_common/adf_pfvf_msg.h
Torsten Duwe 74d1b5
+++ b/drivers/crypto/qat/qat_common/adf_pfvf_msg.h
Torsten Duwe 74d1b5
@@ -91,8 +91,10 @@ enum pfvf_compatibility_version {
Torsten Duwe 74d1b5
 	ADF_PFVF_COMPAT_CAPABILITIES		= 0x02,
Torsten Duwe 74d1b5
 	/* In-use pattern cleared by receiver */
Torsten Duwe 74d1b5
 	ADF_PFVF_COMPAT_FAST_ACK		= 0x03,
Torsten Duwe 74d1b5
+	/* Ring to service mapping support for non-standard mappings */
Torsten Duwe 74d1b5
+	ADF_PFVF_COMPAT_RING_TO_SVC_MAP		= 0x04,
Torsten Duwe 74d1b5
 	/* Reference to the latest version */
Torsten Duwe 74d1b5
-	ADF_PFVF_COMPAT_THIS_VERSION		= 0x03,
Torsten Duwe 74d1b5
+	ADF_PFVF_COMPAT_THIS_VERSION		= 0x04,
Torsten Duwe 74d1b5
 };
Torsten Duwe 74d1b5
 
Torsten Duwe 74d1b5
 /* PF->VF Version Response */
Torsten Duwe 74d1b5
@@ -139,6 +141,7 @@ enum pf2vf_blkmsg_error {
Torsten Duwe 74d1b5
  */
Torsten Duwe 74d1b5
 enum vf2pf_blkmsg_req_type {
Torsten Duwe 74d1b5
 	ADF_VF2PF_BLKMSG_REQ_CAP_SUMMARY	= 0x02,
Torsten Duwe 74d1b5
+	ADF_VF2PF_BLKMSG_REQ_RING_SVC_MAP	= 0x03,
Torsten Duwe 74d1b5
 };
Torsten Duwe 74d1b5
 
Torsten Duwe 74d1b5
 #define ADF_VF2PF_SMALL_BLOCK_TYPE_MAX \
Torsten Duwe 74d1b5
@@ -202,4 +205,14 @@ struct capabilities_v3 {
Torsten Duwe 74d1b5
 	u32 frequency;
Torsten Duwe 74d1b5
 } __packed;
Torsten Duwe 74d1b5
 
Torsten Duwe 74d1b5
+/* PF/VF Ring to service mapping values */
Torsten Duwe 74d1b5
+enum blkmsg_ring_to_svc_versions {
Torsten Duwe 74d1b5
+	ADF_PFVF_RING_TO_SVC_VERSION		= 0x01,
Torsten Duwe 74d1b5
+};
Torsten Duwe 74d1b5
+
Torsten Duwe 74d1b5
+struct ring_to_svc_map_v1 {
Torsten Duwe 74d1b5
+	struct pfvf_blkmsg_header hdr;
Torsten Duwe 74d1b5
+	u16 map;
Torsten Duwe 74d1b5
+} __packed;
Torsten Duwe 74d1b5
+
Torsten Duwe 74d1b5
 #endif /* ADF_PFVF_MSG_H */
Torsten Duwe 74d1b5
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 74d1b5
index 5732cea1c7caa..14c069f0d71a5 100644
Torsten Duwe 74d1b5
--- a/drivers/crypto/qat/qat_common/adf_pfvf_pf_msg.c
Torsten Duwe 74d1b5
+++ b/drivers/crypto/qat/qat_common/adf_pfvf_pf_msg.c
Torsten Duwe 74d1b5
@@ -36,3 +36,17 @@ int adf_pf_capabilities_msg_provider(struct adf_accel_dev *accel_dev,
Torsten Duwe 74d1b5
 
Torsten Duwe 74d1b5
 	return 0;
Torsten Duwe 74d1b5
 }
Torsten Duwe 74d1b5
+
Torsten Duwe 74d1b5
+int adf_pf_ring_to_svc_msg_provider(struct adf_accel_dev *accel_dev,
Torsten Duwe 74d1b5
+				    u8 *buffer, u8 compat)
Torsten Duwe 74d1b5
+{
Torsten Duwe 74d1b5
+	struct ring_to_svc_map_v1 rts_map_msg;
Torsten Duwe 74d1b5
+
Torsten Duwe 74d1b5
+	rts_map_msg.map = accel_dev->hw_device->ring_to_svc_map;
Torsten Duwe 74d1b5
+	rts_map_msg.hdr.version = ADF_PFVF_RING_TO_SVC_VERSION;
Torsten Duwe 74d1b5
+	rts_map_msg.hdr.payload_size = ADF_PFVF_BLKMSG_PAYLOAD_SIZE(rts_map_msg);
Torsten Duwe 74d1b5
+
Torsten Duwe 74d1b5
+	memcpy(buffer, &rts_map_msg, sizeof(rts_map_msg));
Torsten Duwe 74d1b5
+
Torsten Duwe 74d1b5
+	return 0;
Torsten Duwe 74d1b5
+}
Torsten Duwe 74d1b5
diff --git a/drivers/crypto/qat/qat_common/adf_pfvf_pf_msg.h b/drivers/crypto/qat/qat_common/adf_pfvf_pf_msg.h
Torsten Duwe 74d1b5
index 401450bd30b02..e8982d1ac8962 100644
Torsten Duwe 74d1b5
--- a/drivers/crypto/qat/qat_common/adf_pfvf_pf_msg.h
Torsten Duwe 74d1b5
+++ b/drivers/crypto/qat/qat_common/adf_pfvf_pf_msg.h
Torsten Duwe 74d1b5
@@ -12,5 +12,7 @@ typedef int (*adf_pf2vf_blkmsg_provider)(struct adf_accel_dev *accel_dev,
Torsten Duwe 74d1b5
 
Torsten Duwe 74d1b5
 int adf_pf_capabilities_msg_provider(struct adf_accel_dev *accel_dev,
Torsten Duwe 74d1b5
 				     u8 *buffer, u8 comapt);
Torsten Duwe 74d1b5
+int adf_pf_ring_to_svc_msg_provider(struct adf_accel_dev *accel_dev,
Torsten Duwe 74d1b5
+				    u8 *buffer, u8 comapt);
Torsten Duwe 74d1b5
 
Torsten Duwe 74d1b5
 #endif /* ADF_PFVF_PF_MSG_H */
Torsten Duwe 74d1b5
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 74d1b5
index cd728d5ac9ab2..84230aac67e69 100644
Torsten Duwe 74d1b5
--- a/drivers/crypto/qat/qat_common/adf_pfvf_pf_proto.c
Torsten Duwe 74d1b5
+++ b/drivers/crypto/qat/qat_common/adf_pfvf_pf_proto.c
Torsten Duwe 74d1b5
@@ -16,6 +16,7 @@ static const adf_pf2vf_blkmsg_provider pf2vf_blkmsg_providers[] = {
Torsten Duwe 74d1b5
 	NULL,				  /* no message type defined for value 0 */
Torsten Duwe 74d1b5
 	NULL,				  /* no message type defined for value 1 */
Torsten Duwe 74d1b5
 	adf_pf_capabilities_msg_provider, /* ADF_VF2PF_BLKMSG_REQ_CAP_SUMMARY */
Torsten Duwe 74d1b5
+	adf_pf_ring_to_svc_msg_provider,  /* ADF_VF2PF_BLKMSG_REQ_RING_SVC_MAP */
Torsten Duwe 74d1b5
 };
Torsten Duwe 74d1b5
 
Torsten Duwe 74d1b5
 /**
Torsten Duwe 74d1b5
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 74d1b5
index b08f8544991a0..14b222691c9c2 100644
Torsten Duwe 74d1b5
--- a/drivers/crypto/qat/qat_common/adf_pfvf_vf_msg.c
Torsten Duwe 74d1b5
+++ b/drivers/crypto/qat/qat_common/adf_pfvf_vf_msg.c
Torsten Duwe 74d1b5
@@ -138,3 +138,30 @@ int adf_vf2pf_get_capabilities(struct adf_accel_dev *accel_dev)
Torsten Duwe 74d1b5
 
Torsten Duwe 74d1b5
 	return 0;
Torsten Duwe 74d1b5
 }
Torsten Duwe 74d1b5
+
Torsten Duwe 74d1b5
+int adf_vf2pf_get_ring_to_svc(struct adf_accel_dev *accel_dev)
Torsten Duwe 74d1b5
+{
Torsten Duwe 74d1b5
+	struct ring_to_svc_map_v1 rts_map_msg = { { 0 }, };
Torsten Duwe 74d1b5
+	unsigned int len = sizeof(rts_map_msg);
Torsten Duwe 74d1b5
+
Torsten Duwe 74d1b5
+	if (accel_dev->vf.pf_compat_ver < ADF_PFVF_COMPAT_RING_TO_SVC_MAP)
Torsten Duwe 74d1b5
+		/* Use already set default mappings */
Torsten Duwe 74d1b5
+		return 0;
Torsten Duwe 74d1b5
+
Torsten Duwe 74d1b5
+	if (adf_send_vf2pf_blkmsg_req(accel_dev, ADF_VF2PF_BLKMSG_REQ_RING_SVC_MAP,
Torsten Duwe 74d1b5
+				      (u8 *)&rts_map_msg, &len)) {
Torsten Duwe 74d1b5
+		dev_err(&GET_DEV(accel_dev),
Torsten Duwe 74d1b5
+			"QAT: Failed to get block message response\n");
Torsten Duwe 74d1b5
+		return -EFAULT;
Torsten Duwe 74d1b5
+	}
Torsten Duwe 74d1b5
+
Torsten Duwe 74d1b5
+	if (unlikely(len < sizeof(struct ring_to_svc_map_v1))) {
Torsten Duwe 74d1b5
+		dev_err(&GET_DEV(accel_dev),
Torsten Duwe 74d1b5
+			"RING_TO_SVC message truncated to %d bytes\n", len);
Torsten Duwe 74d1b5
+		return -EFAULT;
Torsten Duwe 74d1b5
+	}
Torsten Duwe 74d1b5
+
Torsten Duwe 74d1b5
+	/* Only v1 at present */
Torsten Duwe 74d1b5
+	accel_dev->hw_device->ring_to_svc_map = rts_map_msg.map;
Torsten Duwe 74d1b5
+	return 0;
Torsten Duwe 74d1b5
+}
Torsten Duwe 74d1b5
diff --git a/drivers/crypto/qat/qat_common/adf_pfvf_vf_msg.h b/drivers/crypto/qat/qat_common/adf_pfvf_vf_msg.h
Torsten Duwe 74d1b5
index c1f31354c1382..71bc0e3f1d933 100644
Torsten Duwe 74d1b5
--- a/drivers/crypto/qat/qat_common/adf_pfvf_vf_msg.h
Torsten Duwe 74d1b5
+++ b/drivers/crypto/qat/qat_common/adf_pfvf_vf_msg.h
Torsten Duwe 74d1b5
@@ -8,6 +8,7 @@ int adf_vf2pf_notify_init(struct adf_accel_dev *accel_dev);
Torsten Duwe 74d1b5
 void adf_vf2pf_notify_shutdown(struct adf_accel_dev *accel_dev);
Torsten Duwe 74d1b5
 int adf_vf2pf_request_version(struct adf_accel_dev *accel_dev);
Torsten Duwe 74d1b5
 int adf_vf2pf_get_capabilities(struct adf_accel_dev *accel_dev);
Torsten Duwe 74d1b5
+int adf_vf2pf_get_ring_to_svc(struct adf_accel_dev *accel_dev);
Torsten Duwe 74d1b5
 #else
Torsten Duwe 74d1b5
 static inline int adf_vf2pf_notify_init(struct adf_accel_dev *accel_dev)
Torsten Duwe 74d1b5
 {
Torsten Duwe 74d1b5
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 74d1b5
index b9a1cf5d58a95..0e4b8397cbe34 100644
Torsten Duwe 74d1b5
--- a/drivers/crypto/qat/qat_common/adf_pfvf_vf_proto.c
Torsten Duwe 74d1b5
+++ b/drivers/crypto/qat/qat_common/adf_pfvf_vf_proto.c
Torsten Duwe 74d1b5
@@ -357,6 +357,10 @@ int adf_enable_vf2pf_comms(struct adf_accel_dev *accel_dev)
Torsten Duwe 74d1b5
 		return ret;
Torsten Duwe 74d1b5
 
Torsten Duwe 74d1b5
 	ret = adf_vf2pf_get_capabilities(accel_dev);
Torsten Duwe 74d1b5
+	if (ret)
Torsten Duwe 74d1b5
+		return ret;
Torsten Duwe 74d1b5
+
Torsten Duwe 74d1b5
+	ret = adf_vf2pf_get_ring_to_svc(accel_dev);
Torsten Duwe 74d1b5
 
Torsten Duwe 74d1b5
 	return ret;
Torsten Duwe 74d1b5
 }
Torsten Duwe 74d1b5
-- 
Torsten Duwe 74d1b5
2.35.3
Torsten Duwe 74d1b5