Torsten Duwe d9293d
From 95b4d40ed256c5d36b1dee979b65c04c3edd2b23 Mon Sep 17 00:00:00 2001
Torsten Duwe d9293d
From: Marco Chiappero <marco.chiappero@intel.com>
Torsten Duwe d9293d
Date: Wed, 17 Nov 2021 14:30:36 +0000
Torsten Duwe d9293d
Subject: [PATCH] crypto: qat - refactor PF top half for PFVF
Torsten Duwe d9293d
Git-commit: 95b4d40ed256c5d36b1dee979b65c04c3edd2b23
Torsten Duwe d9293d
Patch-mainline: v5.17-rc1
Torsten Duwe d9293d
References: jsc#PED-1073
Torsten Duwe d9293d
Torsten Duwe d9293d
Move logic associated to handling VF2PF interrupt to its own function.
Torsten Duwe d9293d
This will simplify the handling of multiple interrupt sources in the
Torsten Duwe d9293d
function adf_msix_isr_ae() in the future.
Torsten Duwe d9293d
Torsten Duwe d9293d
Signed-off-by: Marco Chiappero <marco.chiappero@intel.com>
Torsten Duwe d9293d
Co-developed-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
Torsten Duwe d9293d
Signed-off-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
Torsten Duwe d9293d
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Torsten Duwe d9293d
Signed-off-by: Torsten Duwe <duwe@suse.de>
Torsten Duwe d9293d
Torsten Duwe d9293d
---
Torsten Duwe d9293d
 drivers/crypto/qat/qat_common/adf_isr.c | 84 +++++++++++++------------
Torsten Duwe d9293d
 1 file changed, 44 insertions(+), 40 deletions(-)
Torsten Duwe d9293d
Torsten Duwe d9293d
diff --git a/drivers/crypto/qat/qat_common/adf_isr.c b/drivers/crypto/qat/qat_common/adf_isr.c
Torsten Duwe d9293d
index 40593c9449a20..5dfc534f1bf01 100644
Torsten Duwe d9293d
--- a/drivers/crypto/qat/qat_common/adf_isr.c
Torsten Duwe d9293d
+++ b/drivers/crypto/qat/qat_common/adf_isr.c
Torsten Duwe d9293d
@@ -54,52 +54,56 @@ static irqreturn_t adf_msix_isr_bundle(int irq, void *bank_ptr)
Torsten Duwe d9293d
 	return IRQ_HANDLED;
Torsten Duwe d9293d
 }
Torsten Duwe d9293d
 
Torsten Duwe d9293d
+#ifdef CONFIG_PCI_IOV
Torsten Duwe d9293d
+static bool adf_handle_vf2pf_int(struct adf_accel_dev *accel_dev)
Torsten Duwe d9293d
+{
Torsten Duwe d9293d
+	struct adf_hw_device_data *hw_data = accel_dev->hw_device;
Torsten Duwe d9293d
+	int bar_id = hw_data->get_misc_bar_id(hw_data);
Torsten Duwe d9293d
+	struct adf_bar *pmisc = &GET_BARS(accel_dev)[bar_id];
Torsten Duwe d9293d
+	void __iomem *pmisc_addr = pmisc->virt_addr;
Torsten Duwe d9293d
+	bool irq_handled = false;
Torsten Duwe d9293d
+	unsigned long vf_mask;
Torsten Duwe d9293d
+
Torsten Duwe d9293d
+	/* Get the interrupt sources triggered by VFs */
Torsten Duwe d9293d
+	vf_mask = hw_data->get_vf2pf_sources(pmisc_addr);
Torsten Duwe d9293d
+
Torsten Duwe d9293d
+	if (vf_mask) {
Torsten Duwe d9293d
+		struct adf_accel_vf_info *vf_info;
Torsten Duwe d9293d
+		int i;
Torsten Duwe d9293d
+
Torsten Duwe d9293d
+		/* Disable VF2PF interrupts for VFs with pending ints */
Torsten Duwe d9293d
+		adf_disable_vf2pf_interrupts_irq(accel_dev, vf_mask);
Torsten Duwe d9293d
+
Torsten Duwe d9293d
+		/*
Torsten Duwe d9293d
+		 * Handle VF2PF interrupt unless the VF is malicious and
Torsten Duwe d9293d
+		 * is attempting to flood the host OS with VF2PF interrupts.
Torsten Duwe d9293d
+		 */
Torsten Duwe d9293d
+		for_each_set_bit(i, &vf_mask, ADF_MAX_NUM_VFS) {
Torsten Duwe d9293d
+			vf_info = accel_dev->pf.vf_info + i;
Torsten Duwe d9293d
+
Torsten Duwe d9293d
+			if (!__ratelimit(&vf_info->vf2pf_ratelimit)) {
Torsten Duwe d9293d
+				dev_info(&GET_DEV(accel_dev),
Torsten Duwe d9293d
+					 "Too many ints from VF%d\n",
Torsten Duwe d9293d
+					  vf_info->vf_nr + 1);
Torsten Duwe d9293d
+				continue;
Torsten Duwe d9293d
+			}
Torsten Duwe d9293d
+
Torsten Duwe d9293d
+			adf_schedule_vf2pf_handler(vf_info);
Torsten Duwe d9293d
+			irq_handled = true;
Torsten Duwe d9293d
+		}
Torsten Duwe d9293d
+	}
Torsten Duwe d9293d
+	return irq_handled;
Torsten Duwe d9293d
+}
Torsten Duwe d9293d
+#endif /* CONFIG_PCI_IOV */
Torsten Duwe d9293d
+
Torsten Duwe d9293d
 static irqreturn_t adf_msix_isr_ae(int irq, void *dev_ptr)
Torsten Duwe d9293d
 {
Torsten Duwe d9293d
 	struct adf_accel_dev *accel_dev = dev_ptr;
Torsten Duwe d9293d
 
Torsten Duwe d9293d
 #ifdef CONFIG_PCI_IOV
Torsten Duwe d9293d
 	/* If SR-IOV is enabled (vf_info is non-NULL), check for VF->PF ints */
Torsten Duwe d9293d
-	if (accel_dev->pf.vf_info) {
Torsten Duwe d9293d
-		struct adf_hw_device_data *hw_data = accel_dev->hw_device;
Torsten Duwe d9293d
-		struct adf_bar *pmisc =
Torsten Duwe d9293d
-			&GET_BARS(accel_dev)[hw_data->get_misc_bar_id(hw_data)];
Torsten Duwe d9293d
-		void __iomem *pmisc_addr = pmisc->virt_addr;
Torsten Duwe d9293d
-		unsigned long vf_mask;
Torsten Duwe d9293d
-
Torsten Duwe d9293d
-		/* Get the interrupt sources triggered by VFs */
Torsten Duwe d9293d
-		vf_mask = hw_data->get_vf2pf_sources(pmisc_addr);
Torsten Duwe d9293d
-
Torsten Duwe d9293d
-		if (vf_mask) {
Torsten Duwe d9293d
-			struct adf_accel_vf_info *vf_info;
Torsten Duwe d9293d
-			bool irq_handled = false;
Torsten Duwe d9293d
-			int i;
Torsten Duwe d9293d
-
Torsten Duwe d9293d
-			/* Disable VF2PF interrupts for VFs with pending ints */
Torsten Duwe d9293d
-			adf_disable_vf2pf_interrupts_irq(accel_dev, vf_mask);
Torsten Duwe d9293d
-
Torsten Duwe d9293d
-			/*
Torsten Duwe d9293d
-			 * Handle VF2PF interrupt unless the VF is malicious and
Torsten Duwe d9293d
-			 * is attempting to flood the host OS with VF2PF interrupts.
Torsten Duwe d9293d
-			 */
Torsten Duwe d9293d
-			for_each_set_bit(i, &vf_mask, ADF_MAX_NUM_VFS) {
Torsten Duwe d9293d
-				vf_info = accel_dev->pf.vf_info + i;
Torsten Duwe d9293d
-
Torsten Duwe d9293d
-				if (!__ratelimit(&vf_info->vf2pf_ratelimit)) {
Torsten Duwe d9293d
-					dev_info(&GET_DEV(accel_dev),
Torsten Duwe d9293d
-						 "Too many ints from VF%d\n",
Torsten Duwe d9293d
-						  vf_info->vf_nr + 1);
Torsten Duwe d9293d
-					continue;
Torsten Duwe d9293d
-				}
Torsten Duwe d9293d
-
Torsten Duwe d9293d
-				adf_schedule_vf2pf_handler(vf_info);
Torsten Duwe d9293d
-				irq_handled = true;
Torsten Duwe d9293d
-			}
Torsten Duwe d9293d
-
Torsten Duwe d9293d
-			if (irq_handled)
Torsten Duwe d9293d
-				return IRQ_HANDLED;
Torsten Duwe d9293d
-		}
Torsten Duwe d9293d
-	}
Torsten Duwe d9293d
+	if (accel_dev->pf.vf_info && adf_handle_vf2pf_int(accel_dev))
Torsten Duwe d9293d
+		return IRQ_HANDLED;
Torsten Duwe d9293d
 #endif /* CONFIG_PCI_IOV */
Torsten Duwe d9293d
 
Torsten Duwe d9293d
 	dev_dbg(&GET_DEV(accel_dev), "qat_dev%d spurious AE interrupt\n",
Torsten Duwe d9293d
-- 
Torsten Duwe d9293d
2.35.3
Torsten Duwe d9293d