Torsten Duwe e0f1f6
From e0441e2be1553d34341bc5b60d279f3561d1b8b7 Mon Sep 17 00:00:00 2001
Torsten Duwe e0f1f6
From: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
Torsten Duwe e0f1f6
Date: Thu, 16 Dec 2021 09:13:11 +0000
Torsten Duwe e0f1f6
Subject: [PATCH] crypto: qat - get compression extended capabilities
Torsten Duwe e0f1f6
Git-commit: e0441e2be1553d34341bc5b60d279f3561d1b8b7
Torsten Duwe e0f1f6
Patch-mainline: v5.17-rc1
Torsten Duwe e0f1f6
References: jsc#PED-1073
Torsten Duwe e0f1f6
Torsten Duwe e0f1f6
Get compression extended capabilities mask from firmware through the
Torsten Duwe e0f1f6
init/admin channel.
Torsten Duwe e0f1f6
These capabilities are stored in the accel_dev structure and will be
Torsten Duwe e0f1f6
communicated to VF through the PFVF channel.
Torsten Duwe e0f1f6
Torsten Duwe e0f1f6
Signed-off-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
Torsten Duwe e0f1f6
Signed-off-by: Marco Chiappero <marco.chiappero@intel.com>
Torsten Duwe e0f1f6
Reviewed-by: Fiona Trahe <fiona.trahe@intel.com>
Torsten Duwe e0f1f6
Reviewed-by: Marco Chiappero <marco.chiappero@intel.com>
Torsten Duwe e0f1f6
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Torsten Duwe e0f1f6
Signed-off-by: Torsten Duwe <duwe@suse.de>
Torsten Duwe e0f1f6
Torsten Duwe e0f1f6
---
Torsten Duwe e0f1f6
 .../crypto/qat/qat_common/adf_accel_devices.h |  1 +
Torsten Duwe e0f1f6
 drivers/crypto/qat/qat_common/adf_admin.c     | 37 +++++++++++++++++++
Torsten Duwe e0f1f6
 .../qat/qat_common/icp_qat_fw_init_admin.h    |  4 +-
Torsten Duwe e0f1f6
 3 files changed, 41 insertions(+), 1 deletion(-)
Torsten Duwe e0f1f6
Torsten Duwe e0f1f6
diff --git a/drivers/crypto/qat/qat_common/adf_accel_devices.h b/drivers/crypto/qat/qat_common/adf_accel_devices.h
Torsten Duwe e0f1f6
index a1809a7d1c90d..2c380fa10a094 100644
Torsten Duwe e0f1f6
--- a/drivers/crypto/qat/qat_common/adf_accel_devices.h
Torsten Duwe e0f1f6
+++ b/drivers/crypto/qat/qat_common/adf_accel_devices.h
Torsten Duwe e0f1f6
@@ -198,6 +198,7 @@ struct adf_hw_device_data {
Torsten Duwe e0f1f6
 	u32 fuses;
Torsten Duwe e0f1f6
 	u32 straps;
Torsten Duwe e0f1f6
 	u32 accel_capabilities_mask;
Torsten Duwe e0f1f6
+	u32 extended_dc_capabilities;
Torsten Duwe e0f1f6
 	u32 instance_id;
Torsten Duwe e0f1f6
 	u16 accel_mask;
Torsten Duwe e0f1f6
 	u32 ae_mask;
Torsten Duwe e0f1f6
diff --git a/drivers/crypto/qat/qat_common/adf_admin.c b/drivers/crypto/qat/qat_common/adf_admin.c
Torsten Duwe e0f1f6
index 43680e1782427..c381b89d548d1 100644
Torsten Duwe e0f1f6
--- a/drivers/crypto/qat/qat_common/adf_admin.c
Torsten Duwe e0f1f6
+++ b/drivers/crypto/qat/qat_common/adf_admin.c
Torsten Duwe e0f1f6
@@ -194,6 +194,35 @@ static int adf_set_fw_constants(struct adf_accel_dev *accel_dev)
Torsten Duwe e0f1f6
 	return adf_send_admin(accel_dev, &req, &resp, ae_mask);
Torsten Duwe e0f1f6
 }
Torsten Duwe e0f1f6
 
Torsten Duwe e0f1f6
+static int adf_get_dc_capabilities(struct adf_accel_dev *accel_dev,
Torsten Duwe e0f1f6
+				   u32 *capabilities)
Torsten Duwe e0f1f6
+{
Torsten Duwe e0f1f6
+	struct adf_hw_device_data *hw_device = accel_dev->hw_device;
Torsten Duwe e0f1f6
+	struct icp_qat_fw_init_admin_resp resp;
Torsten Duwe e0f1f6
+	struct icp_qat_fw_init_admin_req req;
Torsten Duwe e0f1f6
+	unsigned long ae_mask;
Torsten Duwe e0f1f6
+	unsigned long ae;
Torsten Duwe e0f1f6
+	int ret;
Torsten Duwe e0f1f6
+
Torsten Duwe e0f1f6
+	/* Target only service accelerator engines */
Torsten Duwe e0f1f6
+	ae_mask = hw_device->ae_mask & ~hw_device->admin_ae_mask;
Torsten Duwe e0f1f6
+
Torsten Duwe e0f1f6
+	memset(&req, 0, sizeof(req));
Torsten Duwe e0f1f6
+	memset(&resp, 0, sizeof(resp));
Torsten Duwe e0f1f6
+	req.cmd_id = ICP_QAT_FW_COMP_CAPABILITY_GET;
Torsten Duwe e0f1f6
+
Torsten Duwe e0f1f6
+	*capabilities = 0;
Torsten Duwe e0f1f6
+	for_each_set_bit(ae, &ae_mask, GET_MAX_ACCELENGINES(accel_dev)) {
Torsten Duwe e0f1f6
+		ret = adf_send_admin(accel_dev, &req, &resp, 1ULL << ae);
Torsten Duwe e0f1f6
+		if (ret)
Torsten Duwe e0f1f6
+			return ret;
Torsten Duwe e0f1f6
+
Torsten Duwe e0f1f6
+		*capabilities |= resp.extended_features;
Torsten Duwe e0f1f6
+	}
Torsten Duwe e0f1f6
+
Torsten Duwe e0f1f6
+	return 0;
Torsten Duwe e0f1f6
+}
Torsten Duwe e0f1f6
+
Torsten Duwe e0f1f6
 /**
Torsten Duwe e0f1f6
  * adf_send_admin_init() - Function sends init message to FW
Torsten Duwe e0f1f6
  * @accel_dev: Pointer to acceleration device.
Torsten Duwe e0f1f6
@@ -204,8 +233,16 @@ static int adf_set_fw_constants(struct adf_accel_dev *accel_dev)
Torsten Duwe e0f1f6
  */
Torsten Duwe e0f1f6
 int adf_send_admin_init(struct adf_accel_dev *accel_dev)
Torsten Duwe e0f1f6
 {
Torsten Duwe e0f1f6
+	u32 dc_capabilities = 0;
Torsten Duwe e0f1f6
 	int ret;
Torsten Duwe e0f1f6
 
Torsten Duwe e0f1f6
+	ret = adf_get_dc_capabilities(accel_dev, &dc_capabilities);
Torsten Duwe e0f1f6
+	if (ret) {
Torsten Duwe e0f1f6
+		dev_err(&GET_DEV(accel_dev), "Cannot get dc capabilities\n");
Torsten Duwe e0f1f6
+		return ret;
Torsten Duwe e0f1f6
+	}
Torsten Duwe e0f1f6
+	accel_dev->hw_device->extended_dc_capabilities = dc_capabilities;
Torsten Duwe e0f1f6
+
Torsten Duwe e0f1f6
 	ret = adf_set_fw_constants(accel_dev);
Torsten Duwe e0f1f6
 	if (ret)
Torsten Duwe e0f1f6
 		return ret;
Torsten Duwe e0f1f6
diff --git a/drivers/crypto/qat/qat_common/icp_qat_fw_init_admin.h b/drivers/crypto/qat/qat_common/icp_qat_fw_init_admin.h
Torsten Duwe e0f1f6
index f05ad17fbdd6b..afe59a7684ac5 100644
Torsten Duwe e0f1f6
--- a/drivers/crypto/qat/qat_common/icp_qat_fw_init_admin.h
Torsten Duwe e0f1f6
+++ b/drivers/crypto/qat/qat_common/icp_qat_fw_init_admin.h
Torsten Duwe e0f1f6
@@ -14,7 +14,8 @@ enum icp_qat_fw_init_admin_cmd_id {
Torsten Duwe e0f1f6
 	ICP_QAT_FW_COUNTERS_GET = 5,
Torsten Duwe e0f1f6
 	ICP_QAT_FW_LOOPBACK = 6,
Torsten Duwe e0f1f6
 	ICP_QAT_FW_HEARTBEAT_SYNC = 7,
Torsten Duwe e0f1f6
-	ICP_QAT_FW_HEARTBEAT_GET = 8
Torsten Duwe e0f1f6
+	ICP_QAT_FW_HEARTBEAT_GET = 8,
Torsten Duwe e0f1f6
+	ICP_QAT_FW_COMP_CAPABILITY_GET = 9,
Torsten Duwe e0f1f6
 };
Torsten Duwe e0f1f6
 
Torsten Duwe e0f1f6
 enum icp_qat_fw_init_admin_resp_status {
Torsten Duwe e0f1f6
@@ -52,6 +53,7 @@ struct icp_qat_fw_init_admin_resp {
Torsten Duwe e0f1f6
 			__u16 version_minor_num;
Torsten Duwe e0f1f6
 			__u16 version_major_num;
Torsten Duwe e0f1f6
 		};
Torsten Duwe e0f1f6
+		__u32 extended_features;
Torsten Duwe e0f1f6
 	};
Torsten Duwe e0f1f6
 	__u64 opaque_data;
Torsten Duwe e0f1f6
 	union {
Torsten Duwe e0f1f6
-- 
Torsten Duwe e0f1f6
2.35.3
Torsten Duwe e0f1f6