|
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 |
|