Torsten Duwe f1f825
From 605b84ae0beb8eef078b3d55e548b1dd6e75aeb1 Mon Sep 17 00:00:00 2001
Torsten Duwe f1f825
From: Wojciech Ziemba <wojciech.ziemba@intel.com>
Torsten Duwe f1f825
Date: Thu, 10 Feb 2022 13:38:25 +0000
Torsten Duwe f1f825
Subject: [PATCH] crypto: qat - add misc workqueue
Torsten Duwe f1f825
Git-commit: 605b84ae0beb8eef078b3d55e548b1dd6e75aeb1
Torsten Duwe f1f825
Patch-mainline: v5.18-rc1
Torsten Duwe f1f825
References: jsc#PED-1073
Torsten Duwe f1f825
Torsten Duwe f1f825
In an effort to reduce the amount of workqueues, scattered across
Torsten Duwe f1f825
the QAT driver, introduce the misc workqueue. This queue will be used
Torsten Duwe f1f825
to handle bottom halves, Power Management and more in the future.
Torsten Duwe f1f825
Torsten Duwe f1f825
The function adf_misc_wq_queue_work() has been added to simplify
Torsten Duwe f1f825
the enqueuing of jobs.
Torsten Duwe f1f825
Torsten Duwe f1f825
Signed-off-by: Wojciech Ziemba <wojciech.ziemba@intel.com>
Torsten Duwe f1f825
Reviewed-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
Torsten Duwe f1f825
Reviewed-by: Marco Chiappero <marco.chiappero@intel.com>
Torsten Duwe f1f825
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Torsten Duwe f1f825
Signed-off-by: Torsten Duwe <duwe@suse.de>
Torsten Duwe f1f825
Torsten Duwe f1f825
---
Torsten Duwe f1f825
 .../crypto/qat/qat_common/adf_common_drv.h    |  3 ++
Torsten Duwe f1f825
 drivers/crypto/qat/qat_common/adf_ctl_drv.c   |  6 ++++
Torsten Duwe f1f825
 drivers/crypto/qat/qat_common/adf_isr.c       | 28 +++++++++++++++++++
Torsten Duwe f1f825
 3 files changed, 37 insertions(+)
Torsten Duwe f1f825
Torsten Duwe f1f825
diff --git a/drivers/crypto/qat/qat_common/adf_common_drv.h b/drivers/crypto/qat/qat_common/adf_common_drv.h
Torsten Duwe f1f825
index 76f4f96ec5eb0..0775491768797 100644
Torsten Duwe f1f825
--- a/drivers/crypto/qat/qat_common/adf_common_drv.h
Torsten Duwe f1f825
+++ b/drivers/crypto/qat/qat_common/adf_common_drv.h
Torsten Duwe f1f825
@@ -188,6 +188,9 @@ int qat_uclo_map_obj(struct icp_qat_fw_loader_handle *handle,
Torsten Duwe f1f825
 		     void *addr_ptr, u32 mem_size, char *obj_name);
Torsten Duwe f1f825
 int qat_uclo_set_cfg_ae_mask(struct icp_qat_fw_loader_handle *handle,
Torsten Duwe f1f825
 			     unsigned int cfg_ae_mask);
Torsten Duwe f1f825
+int adf_init_misc_wq(void);
Torsten Duwe f1f825
+void adf_exit_misc_wq(void);
Torsten Duwe f1f825
+bool adf_misc_wq_queue_work(struct work_struct *work);
Torsten Duwe f1f825
 #if defined(CONFIG_PCI_IOV)
Torsten Duwe f1f825
 int adf_sriov_configure(struct pci_dev *pdev, int numvfs);
Torsten Duwe f1f825
 void adf_disable_sriov(struct adf_accel_dev *accel_dev);
Torsten Duwe f1f825
diff --git a/drivers/crypto/qat/qat_common/adf_ctl_drv.c b/drivers/crypto/qat/qat_common/adf_ctl_drv.c
Torsten Duwe f1f825
index 6f64aa6931461..e8ac932bbaab6 100644
Torsten Duwe f1f825
--- a/drivers/crypto/qat/qat_common/adf_ctl_drv.c
Torsten Duwe f1f825
+++ b/drivers/crypto/qat/qat_common/adf_ctl_drv.c
Torsten Duwe f1f825
@@ -419,6 +419,9 @@ static int __init adf_register_ctl_device_driver(void)
Torsten Duwe f1f825
 	if (adf_chr_drv_create())
Torsten Duwe f1f825
 		goto err_chr_dev;
Torsten Duwe f1f825
 
Torsten Duwe f1f825
+	if (adf_init_misc_wq())
Torsten Duwe f1f825
+		goto err_misc_wq;
Torsten Duwe f1f825
+
Torsten Duwe f1f825
 	if (adf_init_aer())
Torsten Duwe f1f825
 		goto err_aer;
Torsten Duwe f1f825
 
Torsten Duwe f1f825
@@ -440,6 +443,8 @@ err_vf_wq:
Torsten Duwe f1f825
 err_pf_wq:
Torsten Duwe f1f825
 	adf_exit_aer();
Torsten Duwe f1f825
 err_aer:
Torsten Duwe f1f825
+	adf_exit_misc_wq();
Torsten Duwe f1f825
+err_misc_wq:
Torsten Duwe f1f825
 	adf_chr_drv_destroy();
Torsten Duwe f1f825
 err_chr_dev:
Torsten Duwe f1f825
 	mutex_destroy(&adf_ctl_lock);
Torsten Duwe f1f825
@@ -449,6 +454,7 @@ err_chr_dev:
Torsten Duwe f1f825
 static void __exit adf_unregister_ctl_device_driver(void)
Torsten Duwe f1f825
 {
Torsten Duwe f1f825
 	adf_chr_drv_destroy();
Torsten Duwe f1f825
+	adf_exit_misc_wq();
Torsten Duwe f1f825
 	adf_exit_aer();
Torsten Duwe f1f825
 	adf_exit_vf_wq();
Torsten Duwe f1f825
 	adf_exit_pf_wq();
Torsten Duwe f1f825
diff --git a/drivers/crypto/qat/qat_common/adf_isr.c b/drivers/crypto/qat/qat_common/adf_isr.c
Torsten Duwe f1f825
index 4ca482aa69f7c..803b89ba9670c 100644
Torsten Duwe f1f825
--- a/drivers/crypto/qat/qat_common/adf_isr.c
Torsten Duwe f1f825
+++ b/drivers/crypto/qat/qat_common/adf_isr.c
Torsten Duwe f1f825
@@ -16,6 +16,7 @@
Torsten Duwe f1f825
 #include "adf_transport_internal.h"
Torsten Duwe f1f825
 
Torsten Duwe f1f825
 #define ADF_MAX_NUM_VFS	32
Torsten Duwe f1f825
+static struct workqueue_struct *adf_misc_wq;
Torsten Duwe f1f825
 
Torsten Duwe f1f825
 static int adf_enable_msix(struct adf_accel_dev *accel_dev)
Torsten Duwe f1f825
 {
Torsten Duwe f1f825
@@ -341,3 +342,30 @@ err_out:
Torsten Duwe f1f825
 	return ret;
Torsten Duwe f1f825
 }
Torsten Duwe f1f825
 EXPORT_SYMBOL_GPL(adf_isr_resource_alloc);
Torsten Duwe f1f825
+
Torsten Duwe f1f825
+/**
Torsten Duwe f1f825
+ * adf_init_misc_wq() - Init misc workqueue
Torsten Duwe f1f825
+ *
Torsten Duwe f1f825
+ * Function init workqueue 'qat_misc_wq' for general purpose.
Torsten Duwe f1f825
+ *
Torsten Duwe f1f825
+ * Return: 0 on success, error code otherwise.
Torsten Duwe f1f825
+ */
Torsten Duwe f1f825
+int __init adf_init_misc_wq(void)
Torsten Duwe f1f825
+{
Torsten Duwe f1f825
+	adf_misc_wq = alloc_workqueue("qat_misc_wq", WQ_MEM_RECLAIM, 0);
Torsten Duwe f1f825
+
Torsten Duwe f1f825
+	return !adf_misc_wq ? -ENOMEM : 0;
Torsten Duwe f1f825
+}
Torsten Duwe f1f825
+
Torsten Duwe f1f825
+void adf_exit_misc_wq(void)
Torsten Duwe f1f825
+{
Torsten Duwe f1f825
+	if (adf_misc_wq)
Torsten Duwe f1f825
+		destroy_workqueue(adf_misc_wq);
Torsten Duwe f1f825
+
Torsten Duwe f1f825
+	adf_misc_wq = NULL;
Torsten Duwe f1f825
+}
Torsten Duwe f1f825
+
Torsten Duwe f1f825
+bool adf_misc_wq_queue_work(struct work_struct *work)
Torsten Duwe f1f825
+{
Torsten Duwe f1f825
+	return queue_work(adf_misc_wq, work);
Torsten Duwe f1f825
+}
Torsten Duwe f1f825
-- 
Torsten Duwe f1f825
2.35.3
Torsten Duwe f1f825