Torsten Duwe d7b350
From 851ed498dba11b96d2f696e23f9084e0add1896f Mon Sep 17 00:00:00 2001
Torsten Duwe d7b350
From: Marco Chiappero <marco.chiappero@intel.com>
Torsten Duwe d7b350
Date: Thu, 16 Dec 2021 09:13:27 +0000
Torsten Duwe d7b350
Subject: [PATCH] crypto: qat - exchange device capabilities over PFVF
Torsten Duwe d7b350
Git-commit: 851ed498dba11b96d2f696e23f9084e0add1896f
Torsten Duwe d7b350
Patch-mainline: v5.17-rc1
Torsten Duwe d7b350
References: jsc#PED-1073
Torsten Duwe d7b350
Torsten Duwe d7b350
Allow the VF driver to get the supported device capabilities through PFVF,
Torsten Duwe d7b350
by adding a new block message, the Capability Summary.
Torsten Duwe d7b350
Torsten Duwe d7b350
This messages allows to exchange the capability through masks, which
Torsten Duwe d7b350
report, depending on the Capability Summary version, up to the following
Torsten Duwe d7b350
Information: 
Torsten Duwe d7b350
- algorithms and/or services that are supported by the device (e.g.
Torsten Duwe d7b350
  symmetric crypto, data compression, etc.)
Torsten Duwe d7b350
- (extended) compression capabilities, with details about the compression
Torsten Duwe d7b350
  service (e.g. if compress and verify is supported by this device)
Torsten Duwe d7b350
- the frequency of the device
Torsten Duwe d7b350
Torsten Duwe d7b350
This patch supports the latest Capabilities Summary version 3 for VFs,
Torsten Duwe d7b350
but will limit support for the PF driver to version 2. This change also
Torsten Duwe d7b350
increases the PFVF protocol to version 2.
Torsten Duwe d7b350
Torsten Duwe d7b350
Signed-off-by: Marco Chiappero <marco.chiappero@intel.com>
Torsten Duwe d7b350
Reviewed-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
Torsten Duwe d7b350
Reviewed-by: Fiona Trahe <fiona.trahe@intel.com>
Torsten Duwe d7b350
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Torsten Duwe d7b350
Signed-off-by: Torsten Duwe <duwe@suse.de>
Torsten Duwe d7b350
Torsten Duwe d7b350
---
Torsten Duwe d7b350
 .../crypto/qat/qat_common/adf_accel_devices.h |  1 +
Torsten Duwe d7b350
 drivers/crypto/qat/qat_common/adf_pfvf_msg.h  | 35 ++++++++++++--
Torsten Duwe d7b350
 .../crypto/qat/qat_common/adf_pfvf_pf_msg.c   | 18 ++++++++
Torsten Duwe d7b350
 .../crypto/qat/qat_common/adf_pfvf_pf_msg.h   |  3 ++
Torsten Duwe d7b350
 .../crypto/qat/qat_common/adf_pfvf_pf_proto.c |  1 +
Torsten Duwe d7b350
 .../crypto/qat/qat_common/adf_pfvf_vf_msg.c   | 46 +++++++++++++++++++
Torsten Duwe d7b350
 .../crypto/qat/qat_common/adf_pfvf_vf_msg.h   |  1 +
Torsten Duwe d7b350
 .../crypto/qat/qat_common/adf_pfvf_vf_proto.c | 11 ++++-
Torsten Duwe d7b350
 8 files changed, 112 insertions(+), 4 deletions(-)
Torsten Duwe d7b350
Torsten Duwe d7b350
diff --git a/drivers/crypto/qat/qat_common/adf_accel_devices.h b/drivers/crypto/qat/qat_common/adf_accel_devices.h
Torsten Duwe d7b350
index 59f06e53d316b..55e8948a8c5e7 100644
Torsten Duwe d7b350
--- a/drivers/crypto/qat/qat_common/adf_accel_devices.h
Torsten Duwe d7b350
+++ b/drivers/crypto/qat/qat_common/adf_accel_devices.h
Torsten Duwe d7b350
@@ -203,6 +203,7 @@ struct adf_hw_device_data {
Torsten Duwe d7b350
 	u32 straps;
Torsten Duwe d7b350
 	u32 accel_capabilities_mask;
Torsten Duwe d7b350
 	u32 extended_dc_capabilities;
Torsten Duwe d7b350
+	u32 clock_frequency;
Torsten Duwe d7b350
 	u32 instance_id;
Torsten Duwe d7b350
 	u16 accel_mask;
Torsten Duwe d7b350
 	u32 ae_mask;
Torsten Duwe d7b350
diff --git a/drivers/crypto/qat/qat_common/adf_pfvf_msg.h b/drivers/crypto/qat/qat_common/adf_pfvf_msg.h
Torsten Duwe d7b350
index 6abbb5e05809f..f418dd26a7426 100644
Torsten Duwe d7b350
--- a/drivers/crypto/qat/qat_common/adf_pfvf_msg.h
Torsten Duwe d7b350
+++ b/drivers/crypto/qat/qat_common/adf_pfvf_msg.h
Torsten Duwe d7b350
@@ -87,8 +87,10 @@ enum vf2pf_msgtype {
Torsten Duwe d7b350
 
Torsten Duwe d7b350
 /* VF/PF compatibility version. */
Torsten Duwe d7b350
 enum pfvf_compatibility_version {
Torsten Duwe d7b350
-	/* Reference to the current version */
Torsten Duwe d7b350
-	ADF_PFVF_COMPAT_THIS_VERSION		= 0x01,
Torsten Duwe d7b350
+	/* Support for extended capabilities */
Torsten Duwe d7b350
+	ADF_PFVF_COMPAT_CAPABILITIES		= 0x02,
Torsten Duwe d7b350
+	/* Reference to the latest version */
Torsten Duwe d7b350
+	ADF_PFVF_COMPAT_THIS_VERSION		= 0x02,
Torsten Duwe d7b350
 };
Torsten Duwe d7b350
 
Torsten Duwe d7b350
 /* PF->VF Version Response */
Torsten Duwe d7b350
@@ -133,7 +135,9 @@ enum pf2vf_blkmsg_error {
Torsten Duwe d7b350
  * 16..23 - 64 byte message
Torsten Duwe d7b350
  * 24..27 - 128 byte message
Torsten Duwe d7b350
  */
Torsten Duwe d7b350
-/* No block messages as of yet */
Torsten Duwe d7b350
+enum vf2pf_blkmsg_req_type {
Torsten Duwe d7b350
+	ADF_VF2PF_BLKMSG_REQ_CAP_SUMMARY	= 0x02,
Torsten Duwe d7b350
+};
Torsten Duwe d7b350
 
Torsten Duwe d7b350
 #define ADF_VF2PF_SMALL_BLOCK_TYPE_MAX \
Torsten Duwe d7b350
 		(FIELD_MAX(ADF_VF2PF_SMALL_BLOCK_TYPE_MASK))
Torsten Duwe d7b350
@@ -171,4 +175,29 @@ struct pfvf_blkmsg_header {
Torsten Duwe d7b350
 #define ADF_PFVF_BLKMSG_VER_BYTE		0
Torsten Duwe d7b350
 #define ADF_PFVF_BLKMSG_LEN_BYTE		1
Torsten Duwe d7b350
 
Torsten Duwe d7b350
+/* PF/VF Capabilities message values */
Torsten Duwe d7b350
+enum blkmsg_capabilities_versions {
Torsten Duwe d7b350
+	ADF_PFVF_CAPABILITIES_V1_VERSION	= 0x01,
Torsten Duwe d7b350
+	ADF_PFVF_CAPABILITIES_V2_VERSION	= 0x02,
Torsten Duwe d7b350
+	ADF_PFVF_CAPABILITIES_V3_VERSION	= 0x03,
Torsten Duwe d7b350
+};
Torsten Duwe d7b350
+
Torsten Duwe d7b350
+struct capabilities_v1 {
Torsten Duwe d7b350
+	struct pfvf_blkmsg_header hdr;
Torsten Duwe d7b350
+	u32 ext_dc_caps;
Torsten Duwe d7b350
+} __packed;
Torsten Duwe d7b350
+
Torsten Duwe d7b350
+struct capabilities_v2 {
Torsten Duwe d7b350
+	struct pfvf_blkmsg_header hdr;
Torsten Duwe d7b350
+	u32 ext_dc_caps;
Torsten Duwe d7b350
+	u32 capabilities;
Torsten Duwe d7b350
+} __packed;
Torsten Duwe d7b350
+
Torsten Duwe d7b350
+struct capabilities_v3 {
Torsten Duwe d7b350
+	struct pfvf_blkmsg_header hdr;
Torsten Duwe d7b350
+	u32 ext_dc_caps;
Torsten Duwe d7b350
+	u32 capabilities;
Torsten Duwe d7b350
+	u32 frequency;
Torsten Duwe d7b350
+} __packed;
Torsten Duwe d7b350
+
Torsten Duwe d7b350
 #endif /* ADF_PFVF_MSG_H */
Torsten Duwe d7b350
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 d7b350
index ad198b624098e..5732cea1c7caa 100644
Torsten Duwe d7b350
--- a/drivers/crypto/qat/qat_common/adf_pfvf_pf_msg.c
Torsten Duwe d7b350
+++ b/drivers/crypto/qat/qat_common/adf_pfvf_pf_msg.c
Torsten Duwe d7b350
@@ -18,3 +18,21 @@ void adf_pf2vf_notify_restarting(struct adf_accel_dev *accel_dev)
Torsten Duwe d7b350
 				"Failed to send restarting msg to VF%d\n", i);
Torsten Duwe d7b350
 	}
Torsten Duwe d7b350
 }
Torsten Duwe d7b350
+
Torsten Duwe d7b350
+int adf_pf_capabilities_msg_provider(struct adf_accel_dev *accel_dev,
Torsten Duwe d7b350
+				     u8 *buffer, u8 compat)
Torsten Duwe d7b350
+{
Torsten Duwe d7b350
+	struct adf_hw_device_data *hw_data = accel_dev->hw_device;
Torsten Duwe d7b350
+	struct capabilities_v2 caps_msg;
Torsten Duwe d7b350
+
Torsten Duwe d7b350
+	caps_msg.ext_dc_caps = hw_data->extended_dc_capabilities;
Torsten Duwe d7b350
+	caps_msg.capabilities = hw_data->accel_capabilities_mask;
Torsten Duwe d7b350
+
Torsten Duwe d7b350
+	caps_msg.hdr.version = ADF_PFVF_CAPABILITIES_V2_VERSION;
Torsten Duwe d7b350
+	caps_msg.hdr.payload_size =
Torsten Duwe d7b350
+			ADF_PFVF_BLKMSG_PAYLOAD_SIZE(struct capabilities_v2);
Torsten Duwe d7b350
+
Torsten Duwe d7b350
+	memcpy(buffer, &caps_msg, sizeof(caps_msg));
Torsten Duwe d7b350
+
Torsten Duwe d7b350
+	return 0;
Torsten Duwe d7b350
+}
Torsten Duwe d7b350
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 d7b350
index 5c669f1de6e4c..401450bd30b02 100644
Torsten Duwe d7b350
--- a/drivers/crypto/qat/qat_common/adf_pfvf_pf_msg.h
Torsten Duwe d7b350
+++ b/drivers/crypto/qat/qat_common/adf_pfvf_pf_msg.h
Torsten Duwe d7b350
@@ -10,4 +10,7 @@ void adf_pf2vf_notify_restarting(struct adf_accel_dev *accel_dev);
Torsten Duwe d7b350
 typedef int (*adf_pf2vf_blkmsg_provider)(struct adf_accel_dev *accel_dev,
Torsten Duwe d7b350
 					 u8 *buffer, u8 compat);
Torsten Duwe d7b350
 
Torsten Duwe d7b350
+int adf_pf_capabilities_msg_provider(struct adf_accel_dev *accel_dev,
Torsten Duwe d7b350
+				     u8 *buffer, u8 comapt);
Torsten Duwe d7b350
+
Torsten Duwe d7b350
 #endif /* ADF_PFVF_PF_MSG_H */
Torsten Duwe d7b350
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 d7b350
index 850b5f4414a69..1256d68c3efde 100644
Torsten Duwe d7b350
--- a/drivers/crypto/qat/qat_common/adf_pfvf_pf_proto.c
Torsten Duwe d7b350
+++ b/drivers/crypto/qat/qat_common/adf_pfvf_pf_proto.c
Torsten Duwe d7b350
@@ -15,6 +15,7 @@ typedef u8 (*pf2vf_blkmsg_data_getter_fn)(u8 const *blkmsg, u8 byte);
Torsten Duwe d7b350
 static const adf_pf2vf_blkmsg_provider pf2vf_blkmsg_providers[] = {
Torsten Duwe d7b350
 	NULL,				  /* no message type defined for value 0 */
Torsten Duwe d7b350
 	NULL,				  /* no message type defined for value 1 */
Torsten Duwe d7b350
+	adf_pf_capabilities_msg_provider, /* ADF_VF2PF_BLKMSG_REQ_CAP_SUMMARY */
Torsten Duwe d7b350
 };
Torsten Duwe d7b350
 
Torsten Duwe d7b350
 /**
Torsten Duwe d7b350
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 d7b350
index 307d593042f3e..b08f8544991a0 100644
Torsten Duwe d7b350
--- a/drivers/crypto/qat/qat_common/adf_pfvf_vf_msg.c
Torsten Duwe d7b350
+++ b/drivers/crypto/qat/qat_common/adf_pfvf_vf_msg.c
Torsten Duwe d7b350
@@ -92,3 +92,49 @@ int adf_vf2pf_request_version(struct adf_accel_dev *accel_dev)
Torsten Duwe d7b350
 	accel_dev->vf.pf_compat_ver = pf_version;
Torsten Duwe d7b350
 	return 0;
Torsten Duwe d7b350
 }
Torsten Duwe d7b350
+
Torsten Duwe d7b350
+int adf_vf2pf_get_capabilities(struct adf_accel_dev *accel_dev)
Torsten Duwe d7b350
+{
Torsten Duwe d7b350
+	struct adf_hw_device_data *hw_data = accel_dev->hw_device;
Torsten Duwe d7b350
+	struct capabilities_v3 cap_msg = { { 0 }, };
Torsten Duwe d7b350
+	unsigned int len = sizeof(cap_msg);
Torsten Duwe d7b350
+
Torsten Duwe d7b350
+	if (accel_dev->vf.pf_compat_ver < ADF_PFVF_COMPAT_CAPABILITIES)
Torsten Duwe d7b350
+		/* The PF is too old to support the extended capabilities */
Torsten Duwe d7b350
+		return 0;
Torsten Duwe d7b350
+
Torsten Duwe d7b350
+	if (adf_send_vf2pf_blkmsg_req(accel_dev, ADF_VF2PF_BLKMSG_REQ_CAP_SUMMARY,
Torsten Duwe d7b350
+				      (u8 *)&cap_msg, &len)) {
Torsten Duwe d7b350
+		dev_err(&GET_DEV(accel_dev),
Torsten Duwe d7b350
+			"QAT: Failed to get block message response\n");
Torsten Duwe d7b350
+		return -EFAULT;
Torsten Duwe d7b350
+	}
Torsten Duwe d7b350
+
Torsten Duwe d7b350
+	switch (cap_msg.hdr.version) {
Torsten Duwe d7b350
+	default:
Torsten Duwe d7b350
+		/* Newer version received, handle only the know parts */
Torsten Duwe d7b350
+		fallthrough;
Torsten Duwe d7b350
+	case ADF_PFVF_CAPABILITIES_V3_VERSION:
Torsten Duwe d7b350
+		if (likely(len >= sizeof(struct capabilities_v3)))
Torsten Duwe d7b350
+			hw_data->clock_frequency = cap_msg.frequency;
Torsten Duwe d7b350
+		else
Torsten Duwe d7b350
+			dev_info(&GET_DEV(accel_dev), "Could not get frequency");
Torsten Duwe d7b350
+		fallthrough;
Torsten Duwe d7b350
+	case ADF_PFVF_CAPABILITIES_V2_VERSION:
Torsten Duwe d7b350
+		if (likely(len >= sizeof(struct capabilities_v2)))
Torsten Duwe d7b350
+			hw_data->accel_capabilities_mask = cap_msg.capabilities;
Torsten Duwe d7b350
+		else
Torsten Duwe d7b350
+			dev_info(&GET_DEV(accel_dev), "Could not get capabilities");
Torsten Duwe d7b350
+		fallthrough;
Torsten Duwe d7b350
+	case ADF_PFVF_CAPABILITIES_V1_VERSION:
Torsten Duwe d7b350
+		if (likely(len >= sizeof(struct capabilities_v1))) {
Torsten Duwe d7b350
+			hw_data->extended_dc_capabilities = cap_msg.ext_dc_caps;
Torsten Duwe d7b350
+		} else {
Torsten Duwe d7b350
+			dev_err(&GET_DEV(accel_dev),
Torsten Duwe d7b350
+				"Capabilities message truncated to %d bytes\n", len);
Torsten Duwe d7b350
+			return -EFAULT;
Torsten Duwe d7b350
+		}
Torsten Duwe d7b350
+	}
Torsten Duwe d7b350
+
Torsten Duwe d7b350
+	return 0;
Torsten Duwe d7b350
+}
Torsten Duwe d7b350
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 d7b350
index 5091b5b2fd8f3..c1f31354c1382 100644
Torsten Duwe d7b350
--- a/drivers/crypto/qat/qat_common/adf_pfvf_vf_msg.h
Torsten Duwe d7b350
+++ b/drivers/crypto/qat/qat_common/adf_pfvf_vf_msg.h
Torsten Duwe d7b350
@@ -7,6 +7,7 @@
Torsten Duwe d7b350
 int adf_vf2pf_notify_init(struct adf_accel_dev *accel_dev);
Torsten Duwe d7b350
 void adf_vf2pf_notify_shutdown(struct adf_accel_dev *accel_dev);
Torsten Duwe d7b350
 int adf_vf2pf_request_version(struct adf_accel_dev *accel_dev);
Torsten Duwe d7b350
+int adf_vf2pf_get_capabilities(struct adf_accel_dev *accel_dev);
Torsten Duwe d7b350
 #else
Torsten Duwe d7b350
 static inline int adf_vf2pf_notify_init(struct adf_accel_dev *accel_dev)
Torsten Duwe d7b350
 {
Torsten Duwe d7b350
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 d7b350
index 0fdd6b9892d38..a85bd6dcb62a8 100644
Torsten Duwe d7b350
--- a/drivers/crypto/qat/qat_common/adf_pfvf_vf_proto.c
Torsten Duwe d7b350
+++ b/drivers/crypto/qat/qat_common/adf_pfvf_vf_proto.c
Torsten Duwe d7b350
@@ -341,8 +341,17 @@ bool adf_recv_and_handle_pf2vf_msg(struct adf_accel_dev *accel_dev)
Torsten Duwe d7b350
  */
Torsten Duwe d7b350
 int adf_enable_vf2pf_comms(struct adf_accel_dev *accel_dev)
Torsten Duwe d7b350
 {
Torsten Duwe d7b350
+	int ret;
Torsten Duwe d7b350
+
Torsten Duwe d7b350
 	adf_pfvf_crc_init();
Torsten Duwe d7b350
 	adf_enable_pf2vf_interrupts(accel_dev);
Torsten Duwe d7b350
-	return adf_vf2pf_request_version(accel_dev);
Torsten Duwe d7b350
+
Torsten Duwe d7b350
+	ret = adf_vf2pf_request_version(accel_dev);
Torsten Duwe d7b350
+	if (ret)
Torsten Duwe d7b350
+		return ret;
Torsten Duwe d7b350
+
Torsten Duwe d7b350
+	ret = adf_vf2pf_get_capabilities(accel_dev);
Torsten Duwe d7b350
+
Torsten Duwe d7b350
+	return ret;
Torsten Duwe d7b350
 }
Torsten Duwe d7b350
 EXPORT_SYMBOL_GPL(adf_enable_vf2pf_comms);
Torsten Duwe d7b350
-- 
Torsten Duwe d7b350
2.35.3
Torsten Duwe d7b350