Torsten Duwe 1c74ed
From ba79a32acfde1ffdaefc05b02420c4124b60dbd3 Mon Sep 17 00:00:00 2001
Torsten Duwe 1c74ed
From: Wojciech Ziemba <wojciech.ziemba@intel.com>
Torsten Duwe 1c74ed
Date: Wed, 1 Sep 2021 18:36:05 +0100
Torsten Duwe 1c74ed
Subject: [PATCH] crypto: qat - replace deprecated MSI API
Torsten Duwe 1c74ed
Git-commit: ba79a32acfde1ffdaefc05b02420c4124b60dbd3
Torsten Duwe 1c74ed
Patch-mainline: v5.16-rc1
Torsten Duwe 1c74ed
References: jsc#PED-1073
Torsten Duwe 1c74ed
Torsten Duwe 1c74ed
Replace deprecated MSI enable and disable respectively and update
Torsten Duwe 1c74ed
handling of return values.
Torsten Duwe 1c74ed
Torsten Duwe 1c74ed
Signed-off-by: Wojciech Ziemba <wojciech.ziemba@intel.com>
Torsten Duwe 1c74ed
Co-developed-by: Gupta Shashank <shashank.gupta@intel.com>
Torsten Duwe 1c74ed
Signed-off-by: Gupta Shashank <shashank.gupta@intel.com>
Torsten Duwe 1c74ed
Reviewed-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
Torsten Duwe 1c74ed
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Torsten Duwe 1c74ed
Signed-off-by: Torsten Duwe <duwe@suse.de>
Torsten Duwe 1c74ed
Torsten Duwe 1c74ed
---
Torsten Duwe 1c74ed
 .../crypto/qat/qat_common/adf_accel_devices.h |   1 -
Torsten Duwe 1c74ed
 drivers/crypto/qat/qat_common/adf_isr.c       | 102 +++++++++---------
Torsten Duwe 1c74ed
 drivers/crypto/qat/qat_common/adf_vf_isr.c    |  12 +--
Torsten Duwe 1c74ed
 3 files changed, 55 insertions(+), 60 deletions(-)
Torsten Duwe 1c74ed
Torsten Duwe 1c74ed
diff --git a/drivers/crypto/qat/qat_common/adf_accel_devices.h b/drivers/crypto/qat/qat_common/adf_accel_devices.h
Torsten Duwe 1c74ed
index 38c0af6d4e43e..87de40d6c9a5f 100644
Torsten Duwe 1c74ed
--- a/drivers/crypto/qat/qat_common/adf_accel_devices.h
Torsten Duwe 1c74ed
+++ b/drivers/crypto/qat/qat_common/adf_accel_devices.h
Torsten Duwe 1c74ed
@@ -45,7 +45,6 @@ struct adf_bar {
Torsten Duwe 1c74ed
 } __packed;
Torsten Duwe 1c74ed
 
Torsten Duwe 1c74ed
 struct adf_accel_msix {
Torsten Duwe 1c74ed
-	struct msix_entry *entries;
Torsten Duwe 1c74ed
 	char **names;
Torsten Duwe 1c74ed
 	u32 num_entries;
Torsten Duwe 1c74ed
 } __packed;
Torsten Duwe 1c74ed
diff --git a/drivers/crypto/qat/qat_common/adf_isr.c b/drivers/crypto/qat/qat_common/adf_isr.c
Torsten Duwe 1c74ed
index c678d5c531aa9..a2ab16651a561 100644
Torsten Duwe 1c74ed
--- a/drivers/crypto/qat/qat_common/adf_isr.c
Torsten Duwe 1c74ed
+++ b/drivers/crypto/qat/qat_common/adf_isr.c
Torsten Duwe 1c74ed
@@ -27,35 +27,26 @@ static int adf_enable_msix(struct adf_accel_dev *accel_dev)
Torsten Duwe 1c74ed
 {
Torsten Duwe 1c74ed
 	struct adf_accel_pci *pci_dev_info = &accel_dev->accel_pci_dev;
Torsten Duwe 1c74ed
 	struct adf_hw_device_data *hw_data = accel_dev->hw_device;
Torsten Duwe 1c74ed
-	u32 msix_num_entries = 1;
Torsten Duwe 1c74ed
+	u32 msix_num_entries = hw_data->num_banks + 1;
Torsten Duwe 1c74ed
+	int ret;
Torsten Duwe 1c74ed
 
Torsten Duwe 1c74ed
 	if (hw_data->set_msix_rttable)
Torsten Duwe 1c74ed
 		hw_data->set_msix_rttable(accel_dev);
Torsten Duwe 1c74ed
 
Torsten Duwe 1c74ed
-	/* If SR-IOV is disabled, add entries for each bank */
Torsten Duwe 1c74ed
-	if (!accel_dev->pf.vf_info) {
Torsten Duwe 1c74ed
-		int i;
Torsten Duwe 1c74ed
-
Torsten Duwe 1c74ed
-		msix_num_entries += hw_data->num_banks;
Torsten Duwe 1c74ed
-		for (i = 0; i < msix_num_entries; i++)
Torsten Duwe 1c74ed
-			pci_dev_info->msix_entries.entries[i].entry = i;
Torsten Duwe 1c74ed
-	} else {
Torsten Duwe 1c74ed
-		pci_dev_info->msix_entries.entries[0].entry =
Torsten Duwe 1c74ed
-			hw_data->num_banks;
Torsten Duwe 1c74ed
-	}
Torsten Duwe 1c74ed
-
Torsten Duwe 1c74ed
-	if (pci_enable_msix_exact(pci_dev_info->pci_dev,
Torsten Duwe 1c74ed
-				  pci_dev_info->msix_entries.entries,
Torsten Duwe 1c74ed
-				  msix_num_entries)) {
Torsten Duwe 1c74ed
-		dev_err(&GET_DEV(accel_dev), "Failed to enable MSI-X IRQ(s)\n");
Torsten Duwe 1c74ed
-		return -EFAULT;
Torsten Duwe 1c74ed
+	ret = pci_alloc_irq_vectors(pci_dev_info->pci_dev, msix_num_entries,
Torsten Duwe 1c74ed
+				    msix_num_entries, PCI_IRQ_MSIX);
Torsten Duwe 1c74ed
+	if (unlikely(ret < 0)) {
Torsten Duwe 1c74ed
+		dev_err(&GET_DEV(accel_dev),
Torsten Duwe 1c74ed
+			"Failed to allocate %d MSI-X vectors\n",
Torsten Duwe 1c74ed
+			msix_num_entries);
Torsten Duwe 1c74ed
+		return ret;
Torsten Duwe 1c74ed
 	}
Torsten Duwe 1c74ed
 	return 0;
Torsten Duwe 1c74ed
 }
Torsten Duwe 1c74ed
 
Torsten Duwe 1c74ed
 static void adf_disable_msix(struct adf_accel_pci *pci_dev_info)
Torsten Duwe 1c74ed
 {
Torsten Duwe 1c74ed
-	pci_disable_msix(pci_dev_info->pci_dev);
Torsten Duwe 1c74ed
+	pci_free_irq_vectors(pci_dev_info->pci_dev);
Torsten Duwe 1c74ed
 }
Torsten Duwe 1c74ed
 
Torsten Duwe 1c74ed
 static irqreturn_t adf_msix_isr_bundle(int irq, void *bank_ptr)
Torsten Duwe 1c74ed
@@ -139,9 +130,9 @@ static int adf_request_irqs(struct adf_accel_dev *accel_dev)
Torsten Duwe 1c74ed
 {
Torsten Duwe 1c74ed
 	struct adf_accel_pci *pci_dev_info = &accel_dev->accel_pci_dev;
Torsten Duwe 1c74ed
 	struct adf_hw_device_data *hw_data = accel_dev->hw_device;
Torsten Duwe 1c74ed
-	struct msix_entry *msixe = pci_dev_info->msix_entries.entries;
Torsten Duwe 1c74ed
 	struct adf_etr_data *etr_data = accel_dev->transport;
Torsten Duwe 1c74ed
-	int ret, i = 0;
Torsten Duwe 1c74ed
+	int clust_irq = hw_data->num_banks;
Torsten Duwe 1c74ed
+	int ret, irq, i = 0;
Torsten Duwe 1c74ed
 	char *name;
Torsten Duwe 1c74ed
 
Torsten Duwe 1c74ed
 	/* Request msix irq for all banks unless SR-IOV enabled */
Torsten Duwe 1c74ed
@@ -153,19 +144,25 @@ static int adf_request_irqs(struct adf_accel_dev *accel_dev)
Torsten Duwe 1c74ed
 			name = *(pci_dev_info->msix_entries.names + i);
Torsten Duwe 1c74ed
 			snprintf(name, ADF_MAX_MSIX_VECTOR_NAME,
Torsten Duwe 1c74ed
 				 "qat%d-bundle%d", accel_dev->accel_id, i);
Torsten Duwe 1c74ed
-			ret = request_irq(msixe[i].vector,
Torsten Duwe 1c74ed
-					  adf_msix_isr_bundle, 0, name, bank);
Torsten Duwe 1c74ed
+			irq = pci_irq_vector(pci_dev_info->pci_dev, i);
Torsten Duwe 1c74ed
+			if (unlikely(irq < 0)) {
Torsten Duwe 1c74ed
+				dev_err(&GET_DEV(accel_dev),
Torsten Duwe 1c74ed
+					"Failed to get IRQ number of device vector %d - %s\n",
Torsten Duwe 1c74ed
+					i, name);
Torsten Duwe 1c74ed
+				return irq;
Torsten Duwe 1c74ed
+			}
Torsten Duwe 1c74ed
+			ret = request_irq(irq, adf_msix_isr_bundle, 0,
Torsten Duwe 1c74ed
+					  &name[0], bank);
Torsten Duwe 1c74ed
 			if (ret) {
Torsten Duwe 1c74ed
 				dev_err(&GET_DEV(accel_dev),
Torsten Duwe 1c74ed
-					"failed to enable irq %d for %s\n",
Torsten Duwe 1c74ed
-					msixe[i].vector, name);
Torsten Duwe 1c74ed
+					"Failed to allocate IRQ %d for %s\n",
Torsten Duwe 1c74ed
+					irq, name);
Torsten Duwe 1c74ed
 				return ret;
Torsten Duwe 1c74ed
 			}
Torsten Duwe 1c74ed
 
Torsten Duwe 1c74ed
 			cpu = ((accel_dev->accel_id * hw_data->num_banks) +
Torsten Duwe 1c74ed
 			       i) % cpus;
Torsten Duwe 1c74ed
-			irq_set_affinity_hint(msixe[i].vector,
Torsten Duwe 1c74ed
-					      get_cpu_mask(cpu));
Torsten Duwe 1c74ed
+			irq_set_affinity_hint(irq, get_cpu_mask(cpu));
Torsten Duwe 1c74ed
 		}
Torsten Duwe 1c74ed
 	}
Torsten Duwe 1c74ed
 
Torsten Duwe 1c74ed
@@ -173,11 +170,17 @@ static int adf_request_irqs(struct adf_accel_dev *accel_dev)
Torsten Duwe 1c74ed
 	name = *(pci_dev_info->msix_entries.names + i);
Torsten Duwe 1c74ed
 	snprintf(name, ADF_MAX_MSIX_VECTOR_NAME,
Torsten Duwe 1c74ed
 		 "qat%d-ae-cluster", accel_dev->accel_id);
Torsten Duwe 1c74ed
-	ret = request_irq(msixe[i].vector, adf_msix_isr_ae, 0, name, accel_dev);
Torsten Duwe 1c74ed
+	irq = pci_irq_vector(pci_dev_info->pci_dev, clust_irq);
Torsten Duwe 1c74ed
+	if (unlikely(irq < 0)) {
Torsten Duwe 1c74ed
+		dev_err(&GET_DEV(accel_dev),
Torsten Duwe 1c74ed
+			"Failed to get IRQ number of device vector %d - %s\n",
Torsten Duwe 1c74ed
+			i, name);
Torsten Duwe 1c74ed
+		return irq;
Torsten Duwe 1c74ed
+	}
Torsten Duwe 1c74ed
+	ret = request_irq(irq, adf_msix_isr_ae, 0, &name[0], accel_dev);
Torsten Duwe 1c74ed
 	if (ret) {
Torsten Duwe 1c74ed
 		dev_err(&GET_DEV(accel_dev),
Torsten Duwe 1c74ed
-			"failed to enable irq %d, for %s\n",
Torsten Duwe 1c74ed
-			msixe[i].vector, name);
Torsten Duwe 1c74ed
+			"Failed to allocate IRQ %d for %s\n", irq, name);
Torsten Duwe 1c74ed
 		return ret;
Torsten Duwe 1c74ed
 	}
Torsten Duwe 1c74ed
 	return ret;
Torsten Duwe 1c74ed
@@ -187,25 +190,27 @@ static void adf_free_irqs(struct adf_accel_dev *accel_dev)
Torsten Duwe 1c74ed
 {
Torsten Duwe 1c74ed
 	struct adf_accel_pci *pci_dev_info = &accel_dev->accel_pci_dev;
Torsten Duwe 1c74ed
 	struct adf_hw_device_data *hw_data = accel_dev->hw_device;
Torsten Duwe 1c74ed
-	struct msix_entry *msixe = pci_dev_info->msix_entries.entries;
Torsten Duwe 1c74ed
 	struct adf_etr_data *etr_data = accel_dev->transport;
Torsten Duwe 1c74ed
-	int i = 0;
Torsten Duwe 1c74ed
+	int clust_irq = hw_data->num_banks;
Torsten Duwe 1c74ed
+	int irq, i = 0;
Torsten Duwe 1c74ed
 
Torsten Duwe 1c74ed
 	if (pci_dev_info->msix_entries.num_entries > 1) {
Torsten Duwe 1c74ed
 		for (i = 0; i < hw_data->num_banks; i++) {
Torsten Duwe 1c74ed
-			irq_set_affinity_hint(msixe[i].vector, NULL);
Torsten Duwe 1c74ed
-			free_irq(msixe[i].vector, &etr_data->banks[i]);
Torsten Duwe 1c74ed
+			irq = pci_irq_vector(pci_dev_info->pci_dev, i);
Torsten Duwe 1c74ed
+			irq_set_affinity_hint(irq, NULL);
Torsten Duwe 1c74ed
+			free_irq(irq, &etr_data->banks[i]);
Torsten Duwe 1c74ed
 		}
Torsten Duwe 1c74ed
 	}
Torsten Duwe 1c74ed
-	irq_set_affinity_hint(msixe[i].vector, NULL);
Torsten Duwe 1c74ed
-	free_irq(msixe[i].vector, accel_dev);
Torsten Duwe 1c74ed
+
Torsten Duwe 1c74ed
+	irq = pci_irq_vector(pci_dev_info->pci_dev, clust_irq);
Torsten Duwe 1c74ed
+	irq_set_affinity_hint(irq, NULL);
Torsten Duwe 1c74ed
+	free_irq(irq, accel_dev);
Torsten Duwe 1c74ed
 }
Torsten Duwe 1c74ed
 
Torsten Duwe 1c74ed
-static int adf_isr_alloc_msix_entry_table(struct adf_accel_dev *accel_dev)
Torsten Duwe 1c74ed
+static int adf_isr_alloc_msix_vectors_data(struct adf_accel_dev *accel_dev)
Torsten Duwe 1c74ed
 {
Torsten Duwe 1c74ed
 	int i;
Torsten Duwe 1c74ed
 	char **names;
Torsten Duwe 1c74ed
-	struct msix_entry *entries;
Torsten Duwe 1c74ed
 	struct adf_hw_device_data *hw_data = accel_dev->hw_device;
Torsten Duwe 1c74ed
 	u32 msix_num_entries = 1;
Torsten Duwe 1c74ed
 
Torsten Duwe 1c74ed
@@ -213,39 +218,30 @@ static int adf_isr_alloc_msix_entry_table(struct adf_accel_dev *accel_dev)
Torsten Duwe 1c74ed
 	if (!accel_dev->pf.vf_info)
Torsten Duwe 1c74ed
 		msix_num_entries += hw_data->num_banks;
Torsten Duwe 1c74ed
 
Torsten Duwe 1c74ed
-	entries = kcalloc_node(msix_num_entries, sizeof(*entries),
Torsten Duwe 1c74ed
-			       GFP_KERNEL, dev_to_node(&GET_DEV(accel_dev)));
Torsten Duwe 1c74ed
-	if (!entries)
Torsten Duwe 1c74ed
-		return -ENOMEM;
Torsten Duwe 1c74ed
-
Torsten Duwe 1c74ed
 	names = kcalloc(msix_num_entries, sizeof(char *), GFP_KERNEL);
Torsten Duwe 1c74ed
-	if (!names) {
Torsten Duwe 1c74ed
-		kfree(entries);
Torsten Duwe 1c74ed
+	if (!names)
Torsten Duwe 1c74ed
 		return -ENOMEM;
Torsten Duwe 1c74ed
-	}
Torsten Duwe 1c74ed
+
Torsten Duwe 1c74ed
 	for (i = 0; i < msix_num_entries; i++) {
Torsten Duwe 1c74ed
 		*(names + i) = kzalloc(ADF_MAX_MSIX_VECTOR_NAME, GFP_KERNEL);
Torsten Duwe 1c74ed
 		if (!(*(names + i)))
Torsten Duwe 1c74ed
 			goto err;
Torsten Duwe 1c74ed
 	}
Torsten Duwe 1c74ed
 	accel_dev->accel_pci_dev.msix_entries.num_entries = msix_num_entries;
Torsten Duwe 1c74ed
-	accel_dev->accel_pci_dev.msix_entries.entries = entries;
Torsten Duwe 1c74ed
 	accel_dev->accel_pci_dev.msix_entries.names = names;
Torsten Duwe 1c74ed
 	return 0;
Torsten Duwe 1c74ed
 err:
Torsten Duwe 1c74ed
 	for (i = 0; i < msix_num_entries; i++)
Torsten Duwe 1c74ed
 		kfree(*(names + i));
Torsten Duwe 1c74ed
-	kfree(entries);
Torsten Duwe 1c74ed
 	kfree(names);
Torsten Duwe 1c74ed
 	return -ENOMEM;
Torsten Duwe 1c74ed
 }
Torsten Duwe 1c74ed
 
Torsten Duwe 1c74ed
-static void adf_isr_free_msix_entry_table(struct adf_accel_dev *accel_dev)
Torsten Duwe 1c74ed
+static void adf_isr_free_msix_vectors_data(struct adf_accel_dev *accel_dev)
Torsten Duwe 1c74ed
 {
Torsten Duwe 1c74ed
 	char **names = accel_dev->accel_pci_dev.msix_entries.names;
Torsten Duwe 1c74ed
 	int i;
Torsten Duwe 1c74ed
 
Torsten Duwe 1c74ed
-	kfree(accel_dev->accel_pci_dev.msix_entries.entries);
Torsten Duwe 1c74ed
 	for (i = 0; i < accel_dev->accel_pci_dev.msix_entries.num_entries; i++)
Torsten Duwe 1c74ed
 		kfree(*(names + i));
Torsten Duwe 1c74ed
 	kfree(names);
Torsten Duwe 1c74ed
@@ -287,7 +283,7 @@ void adf_isr_resource_free(struct adf_accel_dev *accel_dev)
Torsten Duwe 1c74ed
 	adf_free_irqs(accel_dev);
Torsten Duwe 1c74ed
 	adf_cleanup_bh(accel_dev);
Torsten Duwe 1c74ed
 	adf_disable_msix(&accel_dev->accel_pci_dev);
Torsten Duwe 1c74ed
-	adf_isr_free_msix_entry_table(accel_dev);
Torsten Duwe 1c74ed
+	adf_isr_free_msix_vectors_data(accel_dev);
Torsten Duwe 1c74ed
 }
Torsten Duwe 1c74ed
 EXPORT_SYMBOL_GPL(adf_isr_resource_free);
Torsten Duwe 1c74ed
 
Torsten Duwe 1c74ed
@@ -303,7 +299,7 @@ int adf_isr_resource_alloc(struct adf_accel_dev *accel_dev)
Torsten Duwe 1c74ed
 {
Torsten Duwe 1c74ed
 	int ret;
Torsten Duwe 1c74ed
 
Torsten Duwe 1c74ed
-	ret = adf_isr_alloc_msix_entry_table(accel_dev);
Torsten Duwe 1c74ed
+	ret = adf_isr_alloc_msix_vectors_data(accel_dev);
Torsten Duwe 1c74ed
 	if (ret)
Torsten Duwe 1c74ed
 		goto err_out;
Torsten Duwe 1c74ed
 
Torsten Duwe 1c74ed
@@ -328,7 +324,7 @@ err_disable_msix:
Torsten Duwe 1c74ed
 	adf_disable_msix(&accel_dev->accel_pci_dev);
Torsten Duwe 1c74ed
 
Torsten Duwe 1c74ed
 err_free_msix_table:
Torsten Duwe 1c74ed
-	adf_isr_free_msix_entry_table(accel_dev);
Torsten Duwe 1c74ed
+	adf_isr_free_msix_vectors_data(accel_dev);
Torsten Duwe 1c74ed
 
Torsten Duwe 1c74ed
 err_out:
Torsten Duwe 1c74ed
 	return ret;
Torsten Duwe 1c74ed
diff --git a/drivers/crypto/qat/qat_common/adf_vf_isr.c b/drivers/crypto/qat/qat_common/adf_vf_isr.c
Torsten Duwe 1c74ed
index 7828a6573f3e2..695c5050b6f34 100644
Torsten Duwe 1c74ed
--- a/drivers/crypto/qat/qat_common/adf_vf_isr.c
Torsten Duwe 1c74ed
+++ b/drivers/crypto/qat/qat_common/adf_vf_isr.c
Torsten Duwe 1c74ed
@@ -53,11 +53,11 @@ EXPORT_SYMBOL_GPL(adf_disable_pf2vf_interrupts);
Torsten Duwe 1c74ed
 static int adf_enable_msi(struct adf_accel_dev *accel_dev)
Torsten Duwe 1c74ed
 {
Torsten Duwe 1c74ed
 	struct adf_accel_pci *pci_dev_info = &accel_dev->accel_pci_dev;
Torsten Duwe 1c74ed
-	int stat = pci_enable_msi(pci_dev_info->pci_dev);
Torsten Duwe 1c74ed
-
Torsten Duwe 1c74ed
-	if (stat) {
Torsten Duwe 1c74ed
+	int stat = pci_alloc_irq_vectors(pci_dev_info->pci_dev, 1, 1,
Torsten Duwe 1c74ed
+					 PCI_IRQ_MSI);
Torsten Duwe 1c74ed
+	if (unlikely(stat < 0)) {
Torsten Duwe 1c74ed
 		dev_err(&GET_DEV(accel_dev),
Torsten Duwe 1c74ed
-			"Failed to enable MSI interrupts\n");
Torsten Duwe 1c74ed
+			"Failed to enable MSI interrupt: %d\n", stat);
Torsten Duwe 1c74ed
 		return stat;
Torsten Duwe 1c74ed
 	}
Torsten Duwe 1c74ed
 
Torsten Duwe 1c74ed
@@ -65,7 +65,7 @@ static int adf_enable_msi(struct adf_accel_dev *accel_dev)
Torsten Duwe 1c74ed
 	if (!accel_dev->vf.irq_name)
Torsten Duwe 1c74ed
 		return -ENOMEM;
Torsten Duwe 1c74ed
 
Torsten Duwe 1c74ed
-	return stat;
Torsten Duwe 1c74ed
+	return 0;
Torsten Duwe 1c74ed
 }
Torsten Duwe 1c74ed
 
Torsten Duwe 1c74ed
 static void adf_disable_msi(struct adf_accel_dev *accel_dev)
Torsten Duwe 1c74ed
@@ -73,7 +73,7 @@ static void adf_disable_msi(struct adf_accel_dev *accel_dev)
Torsten Duwe 1c74ed
 	struct pci_dev *pdev = accel_to_pci_dev(accel_dev);
Torsten Duwe 1c74ed
 
Torsten Duwe 1c74ed
 	kfree(accel_dev->vf.irq_name);
Torsten Duwe 1c74ed
-	pci_disable_msi(pdev);
Torsten Duwe 1c74ed
+	pci_free_irq_vectors(pdev);
Torsten Duwe 1c74ed
 }
Torsten Duwe 1c74ed
 
Torsten Duwe 1c74ed
 static void adf_dev_stop_async(struct work_struct *work)
Torsten Duwe 1c74ed
-- 
Torsten Duwe 1c74ed
2.35.3
Torsten Duwe 1c74ed