Torsten Duwe 84ac7d
From 0cec19c761e5cc8d6fa43df622791e941b7a8033 Mon Sep 17 00:00:00 2001
Torsten Duwe 84ac7d
From: Tomasz Kowalik <tomaszx.kowalik@intel.com>
Torsten Duwe 84ac7d
Date: Thu, 16 Dec 2021 09:13:34 +0000
Torsten Duwe 84ac7d
Subject: [PATCH] crypto: qat - add support for compression for 4xxx
Torsten Duwe 84ac7d
Git-commit: 0cec19c761e5cc8d6fa43df622791e941b7a8033
Torsten Duwe 84ac7d
Patch-mainline: v5.17-rc1
Torsten Duwe 84ac7d
References: jsc#PED-1073
Torsten Duwe 84ac7d
Torsten Duwe 84ac7d
Add the logic required to enable the compression service for 4xxx devices.
Torsten Duwe 84ac7d
This allows to load the compression firmware image and report
Torsten Duwe 84ac7d
the appropriate compression capabilities.
Torsten Duwe 84ac7d
Torsten Duwe 84ac7d
The firmware image selection for a given device is based on the
Torsten Duwe 84ac7d
'ServicesEnabled' key stored in the internal configuration, which is
Torsten Duwe 84ac7d
added statically at the probe of the device according to the following
Torsten Duwe 84ac7d
rule, by default:
Torsten Duwe 84ac7d
- odd numbered devices assigned to compression services
Torsten Duwe 84ac7d
- even numbered devices assigned to crypto services
Torsten Duwe 84ac7d
Torsten Duwe 84ac7d
In addition, restore the 'ServicesEnabled' key, if present, when SRIOV
Torsten Duwe 84ac7d
is enabled on the device.
Torsten Duwe 84ac7d
Torsten Duwe 84ac7d
Signed-off-by: Tomasz Kowalik <tomaszx.kowalik@intel.com>
Torsten Duwe 84ac7d
Co-developed-by: Mateuszx Potrola <mateuszx.potrola@intel.com>
Torsten Duwe 84ac7d
Signed-off-by: Mateuszx Potrola <mateuszx.potrola@intel.com>
Torsten Duwe 84ac7d
Co-developed-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
Torsten Duwe 84ac7d
Signed-off-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
Torsten Duwe 84ac7d
Signed-off-by: Marco Chiappero <marco.chiappero@intel.com>
Torsten Duwe 84ac7d
Reviewed-by: Fiona Trahe <fiona.trahe@intel.com>
Torsten Duwe 84ac7d
Reviewed-by: Marco Chiappero <marco.chiappero@intel.com>
Torsten Duwe 84ac7d
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Torsten Duwe 84ac7d
Signed-off-by: Torsten Duwe <duwe@suse.de>
Torsten Duwe 84ac7d
Torsten Duwe 84ac7d
---
Torsten Duwe 84ac7d
 .../crypto/qat/qat_4xxx/adf_4xxx_hw_data.c    | 79 +++++++++++++++++--
Torsten Duwe 84ac7d
 .../crypto/qat/qat_4xxx/adf_4xxx_hw_data.h    |  1 +
Torsten Duwe 84ac7d
 drivers/crypto/qat/qat_4xxx/adf_drv.c         | 33 ++++++++
Torsten Duwe 84ac7d
 .../crypto/qat/qat_common/adf_accel_devices.h |  4 +-
Torsten Duwe 84ac7d
 .../crypto/qat/qat_common/adf_accel_engine.c  |  8 +-
Torsten Duwe 84ac7d
 drivers/crypto/qat/qat_common/adf_cfg.c       |  1 +
Torsten Duwe 84ac7d
 .../crypto/qat/qat_common/adf_cfg_strings.h   |  3 +
Torsten Duwe 84ac7d
 drivers/crypto/qat/qat_common/adf_sriov.c     | 31 +++++++-
Torsten Duwe 84ac7d
 8 files changed, 147 insertions(+), 13 deletions(-)
Torsten Duwe 84ac7d
Torsten Duwe 84ac7d
diff --git a/drivers/crypto/qat/qat_4xxx/adf_4xxx_hw_data.c b/drivers/crypto/qat/qat_4xxx/adf_4xxx_hw_data.c
Torsten Duwe 84ac7d
index 40f684103b293..6d10edc40aca0 100644
Torsten Duwe 84ac7d
--- a/drivers/crypto/qat/qat_4xxx/adf_4xxx_hw_data.c
Torsten Duwe 84ac7d
+++ b/drivers/crypto/qat/qat_4xxx/adf_4xxx_hw_data.c
Torsten Duwe 84ac7d
@@ -2,6 +2,7 @@
Torsten Duwe 84ac7d
 /* Copyright(c) 2020 - 2021 Intel Corporation */
Torsten Duwe 84ac7d
 #include <linux/iopoll.h>
Torsten Duwe 84ac7d
 #include <adf_accel_devices.h>
Torsten Duwe 84ac7d
+#include <adf_cfg.h>
Torsten Duwe 84ac7d
 #include <adf_common_drv.h>
Torsten Duwe 84ac7d
 #include <adf_gen4_hw_data.h>
Torsten Duwe 84ac7d
 #include <adf_gen4_pfvf.h>
Torsten Duwe 84ac7d
@@ -13,12 +14,18 @@ struct adf_fw_config {
Torsten Duwe 84ac7d
 	char *obj_name;
Torsten Duwe 84ac7d
 };
Torsten Duwe 84ac7d
 
Torsten Duwe 84ac7d
-static struct adf_fw_config adf_4xxx_fw_config[] = {
Torsten Duwe 84ac7d
+static struct adf_fw_config adf_4xxx_fw_cy_config[] = {
Torsten Duwe 84ac7d
 	{0xF0, ADF_4XXX_SYM_OBJ},
Torsten Duwe 84ac7d
 	{0xF, ADF_4XXX_ASYM_OBJ},
Torsten Duwe 84ac7d
 	{0x100, ADF_4XXX_ADMIN_OBJ},
Torsten Duwe 84ac7d
 };
Torsten Duwe 84ac7d
 
Torsten Duwe 84ac7d
+static struct adf_fw_config adf_4xxx_fw_dc_config[] = {
Torsten Duwe 84ac7d
+	{0xF0, ADF_4XXX_DC_OBJ},
Torsten Duwe 84ac7d
+	{0xF, ADF_4XXX_DC_OBJ},
Torsten Duwe 84ac7d
+	{0x100, ADF_4XXX_ADMIN_OBJ},
Torsten Duwe 84ac7d
+};
Torsten Duwe 84ac7d
+
Torsten Duwe 84ac7d
 /* Worker thread to service arbiter mappings */
Torsten Duwe 84ac7d
 static const u32 thrd_to_arb_map[ADF_4XXX_MAX_ACCELENGINES] = {
Torsten Duwe 84ac7d
 	0x5555555, 0x5555555, 0x5555555, 0x5555555,
Torsten Duwe 84ac7d
@@ -32,6 +39,39 @@ static struct adf_hw_device_class adf_4xxx_class = {
Torsten Duwe 84ac7d
 	.instances = 0,
Torsten Duwe 84ac7d
 };
Torsten Duwe 84ac7d
 
Torsten Duwe 84ac7d
+enum dev_services {
Torsten Duwe 84ac7d
+	SVC_CY = 0,
Torsten Duwe 84ac7d
+	SVC_DC,
Torsten Duwe 84ac7d
+};
Torsten Duwe 84ac7d
+
Torsten Duwe 84ac7d
+static const char *const dev_cfg_services[] = {
Torsten Duwe 84ac7d
+	[SVC_CY] = ADF_CFG_CY,
Torsten Duwe 84ac7d
+	[SVC_DC] = ADF_CFG_DC,
Torsten Duwe 84ac7d
+};
Torsten Duwe 84ac7d
+
Torsten Duwe 84ac7d
+static int get_service_enabled(struct adf_accel_dev *accel_dev)
Torsten Duwe 84ac7d
+{
Torsten Duwe 84ac7d
+	char services[ADF_CFG_MAX_VAL_LEN_IN_BYTES] = {0};
Torsten Duwe 84ac7d
+	u32 ret;
Torsten Duwe 84ac7d
+
Torsten Duwe 84ac7d
+	ret = adf_cfg_get_param_value(accel_dev, ADF_GENERAL_SEC,
Torsten Duwe 84ac7d
+				      ADF_SERVICES_ENABLED, services);
Torsten Duwe 84ac7d
+	if (ret) {
Torsten Duwe 84ac7d
+		dev_err(&GET_DEV(accel_dev),
Torsten Duwe 84ac7d
+			ADF_SERVICES_ENABLED " param not found\n");
Torsten Duwe 84ac7d
+		return ret;
Torsten Duwe 84ac7d
+	}
Torsten Duwe 84ac7d
+
Torsten Duwe 84ac7d
+	ret = match_string(dev_cfg_services, ARRAY_SIZE(dev_cfg_services),
Torsten Duwe 84ac7d
+			   services);
Torsten Duwe 84ac7d
+	if (ret < 0)
Torsten Duwe 84ac7d
+		dev_err(&GET_DEV(accel_dev),
Torsten Duwe 84ac7d
+			"Invalid value of " ADF_SERVICES_ENABLED " param: %s\n",
Torsten Duwe 84ac7d
+			services);
Torsten Duwe 84ac7d
+
Torsten Duwe 84ac7d
+	return ret;
Torsten Duwe 84ac7d
+}
Torsten Duwe 84ac7d
+
Torsten Duwe 84ac7d
 static u32 get_accel_mask(struct adf_hw_device_data *self)
Torsten Duwe 84ac7d
 {
Torsten Duwe 84ac7d
 	return ADF_4XXX_ACCELERATORS_MASK;
Torsten Duwe 84ac7d
@@ -149,7 +189,14 @@ static u32 get_accel_cap(struct adf_accel_dev *accel_dev)
Torsten Duwe 84ac7d
 		capabilities_dc &= ~ICP_ACCEL_CAPABILITIES_CNV_INTEGRITY64;
Torsten Duwe 84ac7d
 	}
Torsten Duwe 84ac7d
 
Torsten Duwe 84ac7d
-	return capabilities_cy;
Torsten Duwe 84ac7d
+	switch (get_service_enabled(accel_dev)) {
Torsten Duwe 84ac7d
+	case SVC_CY:
Torsten Duwe 84ac7d
+		return capabilities_cy;
Torsten Duwe 84ac7d
+	case SVC_DC:
Torsten Duwe 84ac7d
+		return capabilities_dc;
Torsten Duwe 84ac7d
+	}
Torsten Duwe 84ac7d
+
Torsten Duwe 84ac7d
+	return 0;
Torsten Duwe 84ac7d
 }
Torsten Duwe 84ac7d
 
Torsten Duwe 84ac7d
 static enum dev_sku_info get_sku(struct adf_hw_device_data *self)
Torsten Duwe 84ac7d
@@ -230,17 +277,35 @@ static int adf_init_device(struct adf_accel_dev *accel_dev)
Torsten Duwe 84ac7d
 
Torsten Duwe 84ac7d
 static u32 uof_get_num_objs(void)
Torsten Duwe 84ac7d
 {
Torsten Duwe 84ac7d
-	return ARRAY_SIZE(adf_4xxx_fw_config);
Torsten Duwe 84ac7d
+	BUILD_BUG_ON_MSG(ARRAY_SIZE(adf_4xxx_fw_cy_config) !=
Torsten Duwe 84ac7d
+			 ARRAY_SIZE(adf_4xxx_fw_dc_config),
Torsten Duwe 84ac7d
+			 "Size mismatch between adf_4xxx_fw_*_config arrays");
Torsten Duwe 84ac7d
+
Torsten Duwe 84ac7d
+	return ARRAY_SIZE(adf_4xxx_fw_cy_config);
Torsten Duwe 84ac7d
 }
Torsten Duwe 84ac7d
 
Torsten Duwe 84ac7d
-static char *uof_get_name(u32 obj_num)
Torsten Duwe 84ac7d
+static char *uof_get_name(struct adf_accel_dev *accel_dev, u32 obj_num)
Torsten Duwe 84ac7d
 {
Torsten Duwe 84ac7d
-	return adf_4xxx_fw_config[obj_num].obj_name;
Torsten Duwe 84ac7d
+	switch (get_service_enabled(accel_dev)) {
Torsten Duwe 84ac7d
+	case SVC_CY:
Torsten Duwe 84ac7d
+		return adf_4xxx_fw_cy_config[obj_num].obj_name;
Torsten Duwe 84ac7d
+	case SVC_DC:
Torsten Duwe 84ac7d
+		return adf_4xxx_fw_dc_config[obj_num].obj_name;
Torsten Duwe 84ac7d
+	}
Torsten Duwe 84ac7d
+
Torsten Duwe 84ac7d
+	return NULL;
Torsten Duwe 84ac7d
 }
Torsten Duwe 84ac7d
 
Torsten Duwe 84ac7d
-static u32 uof_get_ae_mask(u32 obj_num)
Torsten Duwe 84ac7d
+static u32 uof_get_ae_mask(struct adf_accel_dev *accel_dev, u32 obj_num)
Torsten Duwe 84ac7d
 {
Torsten Duwe 84ac7d
-	return adf_4xxx_fw_config[obj_num].ae_mask;
Torsten Duwe 84ac7d
+	switch (get_service_enabled(accel_dev)) {
Torsten Duwe 84ac7d
+	case SVC_CY:
Torsten Duwe 84ac7d
+		return adf_4xxx_fw_cy_config[obj_num].ae_mask;
Torsten Duwe 84ac7d
+	case SVC_DC:
Torsten Duwe 84ac7d
+		return adf_4xxx_fw_dc_config[obj_num].ae_mask;
Torsten Duwe 84ac7d
+	}
Torsten Duwe 84ac7d
+
Torsten Duwe 84ac7d
+	return 0;
Torsten Duwe 84ac7d
 }
Torsten Duwe 84ac7d
 
Torsten Duwe 84ac7d
 void adf_init_hw_data_4xxx(struct adf_hw_device_data *hw_data)
Torsten Duwe 84ac7d
diff --git a/drivers/crypto/qat/qat_4xxx/adf_4xxx_hw_data.h b/drivers/crypto/qat/qat_4xxx/adf_4xxx_hw_data.h
Torsten Duwe 84ac7d
index a0c67752317f1..12e4fb9b40cef 100644
Torsten Duwe 84ac7d
--- a/drivers/crypto/qat/qat_4xxx/adf_4xxx_hw_data.h
Torsten Duwe 84ac7d
+++ b/drivers/crypto/qat/qat_4xxx/adf_4xxx_hw_data.h
Torsten Duwe 84ac7d
@@ -77,6 +77,7 @@
Torsten Duwe 84ac7d
 #define ADF_4XXX_FW		"qat_4xxx.bin"
Torsten Duwe 84ac7d
 #define ADF_4XXX_MMP		"qat_4xxx_mmp.bin"
Torsten Duwe 84ac7d
 #define ADF_4XXX_SYM_OBJ	"qat_4xxx_sym.bin"
Torsten Duwe 84ac7d
+#define ADF_4XXX_DC_OBJ		"qat_4xxx_dc.bin"
Torsten Duwe 84ac7d
 #define ADF_4XXX_ASYM_OBJ	"qat_4xxx_asym.bin"
Torsten Duwe 84ac7d
 #define ADF_4XXX_ADMIN_OBJ	"qat_4xxx_admin.bin"
Torsten Duwe 84ac7d
 
Torsten Duwe 84ac7d
diff --git a/drivers/crypto/qat/qat_4xxx/adf_drv.c b/drivers/crypto/qat/qat_4xxx/adf_drv.c
Torsten Duwe 84ac7d
index 71ef065914b22..a6c78b9c730bc 100644
Torsten Duwe 84ac7d
--- a/drivers/crypto/qat/qat_4xxx/adf_drv.c
Torsten Duwe 84ac7d
+++ b/drivers/crypto/qat/qat_4xxx/adf_drv.c
Torsten Duwe 84ac7d
@@ -29,6 +29,29 @@ static void adf_cleanup_accel(struct adf_accel_dev *accel_dev)
Torsten Duwe 84ac7d
 	adf_devmgr_rm_dev(accel_dev, NULL);
Torsten Duwe 84ac7d
 }
Torsten Duwe 84ac7d
 
Torsten Duwe 84ac7d
+static int adf_cfg_dev_init(struct adf_accel_dev *accel_dev)
Torsten Duwe 84ac7d
+{
Torsten Duwe 84ac7d
+	const char *config;
Torsten Duwe 84ac7d
+	int ret;
Torsten Duwe 84ac7d
+
Torsten Duwe 84ac7d
+	config = accel_dev->accel_id % 2 ? ADF_CFG_DC : ADF_CFG_CY;
Torsten Duwe 84ac7d
+
Torsten Duwe 84ac7d
+	ret = adf_cfg_section_add(accel_dev, ADF_GENERAL_SEC);
Torsten Duwe 84ac7d
+	if (ret)
Torsten Duwe 84ac7d
+		return ret;
Torsten Duwe 84ac7d
+
Torsten Duwe 84ac7d
+	/* Default configuration is crypto only for even devices
Torsten Duwe 84ac7d
+	 * and compression for odd devices
Torsten Duwe 84ac7d
+	 */
Torsten Duwe 84ac7d
+	ret = adf_cfg_add_key_value_param(accel_dev, ADF_GENERAL_SEC,
Torsten Duwe 84ac7d
+					  ADF_SERVICES_ENABLED, config,
Torsten Duwe 84ac7d
+					  ADF_STR);
Torsten Duwe 84ac7d
+	if (ret)
Torsten Duwe 84ac7d
+		return ret;
Torsten Duwe 84ac7d
+
Torsten Duwe 84ac7d
+	return 0;
Torsten Duwe 84ac7d
+}
Torsten Duwe 84ac7d
+
Torsten Duwe 84ac7d
 static int adf_crypto_dev_config(struct adf_accel_dev *accel_dev)
Torsten Duwe 84ac7d
 {
Torsten Duwe 84ac7d
 	char key[ADF_CFG_MAX_KEY_LEN_IN_BYTES];
Torsten Duwe 84ac7d
@@ -227,8 +250,18 @@ static int adf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
Torsten Duwe 84ac7d
 		goto out_err;
Torsten Duwe 84ac7d
 	}
Torsten Duwe 84ac7d
 
Torsten Duwe 84ac7d
+	ret = adf_cfg_dev_init(accel_dev);
Torsten Duwe 84ac7d
+	if (ret) {
Torsten Duwe 84ac7d
+		dev_err(&pdev->dev, "Failed to initialize configuration.\n");
Torsten Duwe 84ac7d
+		goto out_err;
Torsten Duwe 84ac7d
+	}
Torsten Duwe 84ac7d
+
Torsten Duwe 84ac7d
 	/* Get accelerator capabilities mask */
Torsten Duwe 84ac7d
 	hw_data->accel_capabilities_mask = hw_data->get_accel_cap(accel_dev);
Torsten Duwe 84ac7d
+	if (!hw_data->accel_capabilities_mask) {
Torsten Duwe 84ac7d
+		dev_err(&pdev->dev, "Failed to get capabilities mask.\n");
Torsten Duwe 84ac7d
+		goto out_err;
Torsten Duwe 84ac7d
+	}
Torsten Duwe 84ac7d
 
Torsten Duwe 84ac7d
 	/* Find and map all the device's BARS */
Torsten Duwe 84ac7d
 	bar_mask = pci_select_bars(pdev, IORESOURCE_MEM) & ADF_4XXX_BAR_MASK;
Torsten Duwe 84ac7d
diff --git a/drivers/crypto/qat/qat_common/adf_accel_devices.h b/drivers/crypto/qat/qat_common/adf_accel_devices.h
Torsten Duwe 84ac7d
index 1b9d4ed03dd07..2d4cd7c7cf33b 100644
Torsten Duwe 84ac7d
--- a/drivers/crypto/qat/qat_common/adf_accel_devices.h
Torsten Duwe 84ac7d
+++ b/drivers/crypto/qat/qat_common/adf_accel_devices.h
Torsten Duwe 84ac7d
@@ -192,9 +192,9 @@ struct adf_hw_device_data {
Torsten Duwe 84ac7d
 	int (*ring_pair_reset)(struct adf_accel_dev *accel_dev, u32 bank_nr);
Torsten Duwe 84ac7d
 	void (*reset_device)(struct adf_accel_dev *accel_dev);
Torsten Duwe 84ac7d
 	void (*set_msix_rttable)(struct adf_accel_dev *accel_dev);
Torsten Duwe 84ac7d
-	char *(*uof_get_name)(u32 obj_num);
Torsten Duwe 84ac7d
+	char *(*uof_get_name)(struct adf_accel_dev *accel_dev, u32 obj_num);
Torsten Duwe 84ac7d
 	u32 (*uof_get_num_objs)(void);
Torsten Duwe 84ac7d
-	u32 (*uof_get_ae_mask)(u32 obj_num);
Torsten Duwe 84ac7d
+	u32 (*uof_get_ae_mask)(struct adf_accel_dev *accel_dev, u32 obj_num);
Torsten Duwe 84ac7d
 	struct adf_pfvf_ops pfvf_ops;
Torsten Duwe 84ac7d
 	struct adf_hw_csr_ops csr_ops;
Torsten Duwe 84ac7d
 	const char *fw_name;
Torsten Duwe 84ac7d
diff --git a/drivers/crypto/qat/qat_common/adf_accel_engine.c b/drivers/crypto/qat/qat_common/adf_accel_engine.c
Torsten Duwe 84ac7d
index ca4eae8cdd0b3..4ce2b666929e6 100644
Torsten Duwe 84ac7d
--- a/drivers/crypto/qat/qat_common/adf_accel_engine.c
Torsten Duwe 84ac7d
+++ b/drivers/crypto/qat/qat_common/adf_accel_engine.c
Torsten Duwe 84ac7d
@@ -22,8 +22,12 @@ static int adf_ae_fw_load_images(struct adf_accel_dev *accel_dev, void *fw_addr,
Torsten Duwe 84ac7d
 	num_objs = hw_device->uof_get_num_objs();
Torsten Duwe 84ac7d
 
Torsten Duwe 84ac7d
 	for (i = 0; i < num_objs; i++) {
Torsten Duwe 84ac7d
-		obj_name = hw_device->uof_get_name(i);
Torsten Duwe 84ac7d
-		ae_mask = hw_device->uof_get_ae_mask(i);
Torsten Duwe 84ac7d
+		obj_name = hw_device->uof_get_name(accel_dev, i);
Torsten Duwe 84ac7d
+		ae_mask = hw_device->uof_get_ae_mask(accel_dev, i);
Torsten Duwe 84ac7d
+		if (!obj_name || !ae_mask) {
Torsten Duwe 84ac7d
+			dev_err(&GET_DEV(accel_dev), "Invalid UOF image\n");
Torsten Duwe 84ac7d
+			goto out_err;
Torsten Duwe 84ac7d
+		}
Torsten Duwe 84ac7d
 
Torsten Duwe 84ac7d
 		if (qat_uclo_set_cfg_ae_mask(loader, ae_mask)) {
Torsten Duwe 84ac7d
 			dev_err(&GET_DEV(accel_dev),
Torsten Duwe 84ac7d
diff --git a/drivers/crypto/qat/qat_common/adf_cfg.c b/drivers/crypto/qat/qat_common/adf_cfg.c
Torsten Duwe 84ac7d
index 575b6f002303a..b5b208cbe5a12 100644
Torsten Duwe 84ac7d
--- a/drivers/crypto/qat/qat_common/adf_cfg.c
Torsten Duwe 84ac7d
+++ b/drivers/crypto/qat/qat_common/adf_cfg.c
Torsten Duwe 84ac7d
@@ -297,3 +297,4 @@ int adf_cfg_get_param_value(struct adf_accel_dev *accel_dev,
Torsten Duwe 84ac7d
 	up_read(&cfg->lock);
Torsten Duwe 84ac7d
 	return ret;
Torsten Duwe 84ac7d
 }
Torsten Duwe 84ac7d
+EXPORT_SYMBOL_GPL(adf_cfg_get_param_value);
Torsten Duwe 84ac7d
diff --git a/drivers/crypto/qat/qat_common/adf_cfg_strings.h b/drivers/crypto/qat/qat_common/adf_cfg_strings.h
Torsten Duwe 84ac7d
index 09651e1f937a7..655248dbf962d 100644
Torsten Duwe 84ac7d
--- a/drivers/crypto/qat/qat_common/adf_cfg_strings.h
Torsten Duwe 84ac7d
+++ b/drivers/crypto/qat/qat_common/adf_cfg_strings.h
Torsten Duwe 84ac7d
@@ -22,6 +22,9 @@
Torsten Duwe 84ac7d
 #define ADF_RING_ASYM_BANK_NUM "BankAsymNumber"
Torsten Duwe 84ac7d
 #define ADF_CY "Cy"
Torsten Duwe 84ac7d
 #define ADF_DC "Dc"
Torsten Duwe 84ac7d
+#define ADF_CFG_DC "dc"
Torsten Duwe 84ac7d
+#define ADF_CFG_CY "sym;asym"
Torsten Duwe 84ac7d
+#define ADF_SERVICES_ENABLED "ServicesEnabled"
Torsten Duwe 84ac7d
 #define ADF_ETRMGR_COALESCING_ENABLED "InterruptCoalescingEnabled"
Torsten Duwe 84ac7d
 #define ADF_ETRMGR_COALESCING_ENABLED_FORMAT \
Torsten Duwe 84ac7d
 	ADF_ETRMGR_BANK "%d" ADF_ETRMGR_COALESCING_ENABLED
Torsten Duwe 84ac7d
diff --git a/drivers/crypto/qat/qat_common/adf_sriov.c b/drivers/crypto/qat/qat_common/adf_sriov.c
Torsten Duwe 84ac7d
index 971a05d624181..b960bca1f9d2f 100644
Torsten Duwe 84ac7d
--- a/drivers/crypto/qat/qat_common/adf_sriov.c
Torsten Duwe 84ac7d
+++ b/drivers/crypto/qat/qat_common/adf_sriov.c
Torsten Duwe 84ac7d
@@ -126,6 +126,32 @@ void adf_disable_sriov(struct adf_accel_dev *accel_dev)
Torsten Duwe 84ac7d
 }
Torsten Duwe 84ac7d
 EXPORT_SYMBOL_GPL(adf_disable_sriov);
Torsten Duwe 84ac7d
 
Torsten Duwe 84ac7d
+static int adf_sriov_prepare_restart(struct adf_accel_dev *accel_dev)
Torsten Duwe 84ac7d
+{
Torsten Duwe 84ac7d
+	char services[ADF_CFG_MAX_VAL_LEN_IN_BYTES] = {0};
Torsten Duwe 84ac7d
+	int ret;
Torsten Duwe 84ac7d
+
Torsten Duwe 84ac7d
+	ret = adf_cfg_get_param_value(accel_dev, ADF_GENERAL_SEC,
Torsten Duwe 84ac7d
+				      ADF_SERVICES_ENABLED, services);
Torsten Duwe 84ac7d
+
Torsten Duwe 84ac7d
+	adf_dev_stop(accel_dev);
Torsten Duwe 84ac7d
+	adf_dev_shutdown(accel_dev);
Torsten Duwe 84ac7d
+
Torsten Duwe 84ac7d
+	if (!ret) {
Torsten Duwe 84ac7d
+		ret = adf_cfg_section_add(accel_dev, ADF_GENERAL_SEC);
Torsten Duwe 84ac7d
+		if (ret)
Torsten Duwe 84ac7d
+			return ret;
Torsten Duwe 84ac7d
+
Torsten Duwe 84ac7d
+		ret = adf_cfg_add_key_value_param(accel_dev, ADF_GENERAL_SEC,
Torsten Duwe 84ac7d
+						  ADF_SERVICES_ENABLED,
Torsten Duwe 84ac7d
+						  services, ADF_STR);
Torsten Duwe 84ac7d
+		if (ret)
Torsten Duwe 84ac7d
+			return ret;
Torsten Duwe 84ac7d
+	}
Torsten Duwe 84ac7d
+
Torsten Duwe 84ac7d
+	return 0;
Torsten Duwe 84ac7d
+}
Torsten Duwe 84ac7d
+
Torsten Duwe 84ac7d
 /**
Torsten Duwe 84ac7d
  * adf_sriov_configure() - Enable SRIOV for the device
Torsten Duwe 84ac7d
  * @pdev:  Pointer to PCI device.
Torsten Duwe 84ac7d
@@ -165,8 +191,9 @@ int adf_sriov_configure(struct pci_dev *pdev, int numvfs)
Torsten Duwe 84ac7d
 			return -EBUSY;
Torsten Duwe 84ac7d
 		}
Torsten Duwe 84ac7d
 
Torsten Duwe 84ac7d
-		adf_dev_stop(accel_dev);
Torsten Duwe 84ac7d
-		adf_dev_shutdown(accel_dev);
Torsten Duwe 84ac7d
+		ret = adf_sriov_prepare_restart(accel_dev);
Torsten Duwe 84ac7d
+		if (ret)
Torsten Duwe 84ac7d
+			return ret;
Torsten Duwe 84ac7d
 	}
Torsten Duwe 84ac7d
 
Torsten Duwe 84ac7d
 	if (adf_cfg_section_add(accel_dev, ADF_KERNEL_SEC))
Torsten Duwe 84ac7d
-- 
Torsten Duwe 84ac7d
2.35.3
Torsten Duwe 84ac7d