]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
crypto: qat - centralize bus master enable
authorAhsan Atta <ahsan.atta@intel.com>
Wed, 13 May 2026 15:16:56 +0000 (17:16 +0200)
committerHerbert Xu <herbert@gondor.apana.org.au>
Fri, 22 May 2026 12:25:29 +0000 (20:25 +0800)
QAT driver currently toggles PCI bus mastering in multiple places
(probe paths, and reset callbacks). This makes BME state depend on
call ordering and on what PCI command bits were captured in saved PCI
config state.

Make BME control explicit and deterministic:
- remove pci_set_master() from device-specific probe paths
- add adf_set_bme() and call it from adf_dev_init() so BME is enabled
  at one point before device bring-up
- drop redundant pci_set_master() and pci_clear_master from adf_aer.c
  and rely on the unified init path for BME enablement

This is in preparation for adding reset_prepare() and reset_done()
hooks. In the PCI reset callback flow, the PCI core saves and
restores device configuration state around reset_prepare() and
reset_done(). This change is needed to ensure that we are able to
properly shutdown or reinitialize the device post sysfs triggered
resets.

Cc: stable@vger.kernel.org
Signed-off-by: Ahsan Atta <ahsan.atta@intel.com>
Reviewed-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
Suggested-by: Andy Shevchenko <andriy.shevchenko@intel.com>
Reviewed-by: Andy Shevchenko <andriy.shevchenko@intel.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
12 files changed:
drivers/crypto/intel/qat/qat_420xx/adf_drv.c
drivers/crypto/intel/qat/qat_4xxx/adf_drv.c
drivers/crypto/intel/qat/qat_6xxx/adf_drv.c
drivers/crypto/intel/qat/qat_c3xxx/adf_drv.c
drivers/crypto/intel/qat/qat_c3xxxvf/adf_drv.c
drivers/crypto/intel/qat/qat_c62x/adf_drv.c
drivers/crypto/intel/qat/qat_c62xvf/adf_drv.c
drivers/crypto/intel/qat/qat_common/adf_aer.c
drivers/crypto/intel/qat/qat_common/adf_common_drv.h
drivers/crypto/intel/qat/qat_common/adf_init.c
drivers/crypto/intel/qat/qat_dh895xcc/adf_drv.c
drivers/crypto/intel/qat/qat_dh895xccvf/adf_drv.c

index 566adc0a2d11f2479dd1dc62c9de8392589c6674..265bd52778c57441c5b72f2b8533b70d04ab8730 100644 (file)
@@ -146,8 +146,6 @@ static int adf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
                }
        }
 
-       pci_set_master(pdev);
-
        if (pci_save_state(pdev)) {
                dev_err(&pdev->dev, "Failed to save pci state.\n");
                ret = -ENOMEM;
index daca73651c14892e4d09daec39f7d1f76201af20..681c4dd8f3d286ef6008c4f3343f3f60db9ecc26 100644 (file)
@@ -148,8 +148,6 @@ static int adf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
                }
        }
 
-       pci_set_master(pdev);
-
        if (pci_save_state(pdev)) {
                dev_err(&pdev->dev, "Failed to save pci state.\n");
                ret = -ENOMEM;
index c52462a48c340e6a7dc5a528d816122a88c3b291..ab62b91ecb5109bf18019ac67fac174f0816bd2c 100644 (file)
@@ -189,8 +189,6 @@ static int adf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
                }
        }
 
-       pci_set_master(pdev);
-
        /*
         * The PCI config space is saved at this point and will be restored
         * after a Function Level Reset (FLR) as the FLR does not completely
index 7a59bca3242f6e6818e4345ea2c6751621d03055..ded52744b4fc855fd1c9e7da57cf3fe36de312fb 100644 (file)
@@ -167,7 +167,6 @@ static int adf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
                        goto out_err_free_reg;
                }
        }
-       pci_set_master(pdev);
 
        if (pci_save_state(pdev)) {
                dev_err(&pdev->dev, "Failed to save pci state\n");
index 0881575f76700f10f58d788876a6237e914ea375..e7600d284ed3a571effbda14cfe9a49f3775720e 100644 (file)
@@ -163,7 +163,6 @@ static int adf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
                        goto out_err_free_reg;
                }
        }
-       pci_set_master(pdev);
        /* Completion for VF2PF request/response message exchange */
        init_completion(&accel_dev->vf.msg_received);
 
index 4972e52dd94481dc6cc3596f9a42e1ea7e2589c4..2ebff5855b0170b127cdf8a9cb977430d7725af1 100644 (file)
@@ -167,7 +167,6 @@ static int adf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
                        goto out_err_free_reg;
                }
        }
-       pci_set_master(pdev);
 
        if (pci_save_state(pdev)) {
                dev_err(&pdev->dev, "Failed to save pci state\n");
index d3f728b9f2f2cd9bd93b9a7d2db9631bd7bc20e3..91e148bb487061ae7d2f55457c8bb2c9dc9a35bb 100644 (file)
@@ -163,7 +163,6 @@ static int adf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
                        goto out_err_free_reg;
                }
        }
-       pci_set_master(pdev);
        /* Completion for VF2PF request/response message exchange */
        init_completion(&accel_dev->vf.msg_received);
 
index 9c6bfb9fef8015147ecaa70cf9c3f9873bc3a74d..365637e40439dfc9e97e417f1c0ca37cb20f27e6 100644 (file)
@@ -41,7 +41,6 @@ static pci_ers_result_t adf_error_detected(struct pci_dev *pdev,
                accel_dev->hw_device->exit_arb(accel_dev);
        }
        adf_dev_restarting_notify(accel_dev);
-       pci_clear_master(pdev);
        adf_dev_down(accel_dev);
 
        return PCI_ERS_RESULT_NEED_RESET;
@@ -106,6 +105,13 @@ void adf_dev_restore(struct adf_accel_dev *accel_dev)
        }
 }
 
+void adf_set_bme(struct adf_accel_dev *accel_dev)
+{
+       struct pci_dev *pdev = accel_to_pci_dev(accel_dev);
+
+       pci_set_master(pdev);
+}
+
 static void adf_device_sriov_worker(struct work_struct *work)
 {
        struct adf_sriov_dev_data *sriov_data =
@@ -198,8 +204,6 @@ static pci_ers_result_t adf_slot_reset(struct pci_dev *pdev)
                return PCI_ERS_RESULT_DISCONNECT;
        }
 
-       if (!pdev->is_busmaster)
-               pci_set_master(pdev);
        pci_restore_state(pdev);
        res = adf_dev_up(accel_dev, false);
        if (res && res != -EALREADY)
index b9188ea9aa729758531eebd382e69d6972736c85..762a0b5e774a5623ee50b6b0de49cacfcb5b21f0 100644 (file)
@@ -77,6 +77,7 @@ extern const struct pci_error_handlers adf_err_handler;
 void adf_reset_sbr(struct adf_accel_dev *accel_dev);
 void adf_reset_flr(struct adf_accel_dev *accel_dev);
 void adf_dev_restore(struct adf_accel_dev *accel_dev);
+void adf_set_bme(struct adf_accel_dev *accel_dev);
 int adf_init_aer(void);
 void adf_exit_aer(void);
 int adf_init_arb(struct adf_accel_dev *accel_dev);
index f8088388cf12d8a6d490f28ff5052e1e30f16950..f9f5696ed476bc6c9d74a8ed6daf9431025fca18 100644 (file)
@@ -74,6 +74,8 @@ static int adf_dev_init(struct adf_accel_dev *accel_dev)
                return -EFAULT;
        }
 
+       adf_set_bme(accel_dev);
+
        if (!test_bit(ADF_STATUS_CONFIGURED, &accel_dev->status) &&
            !accel_dev->is_vf) {
                dev_err(&GET_DEV(accel_dev), "Device not configured\n");
index 8a863d7d86d7a0c5bed0f56bb6ece38515adf605..97ad53eef38f14ab7bb13b7b25d5cd3b33eddf23 100644 (file)
@@ -167,7 +167,6 @@ static int adf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
                        goto out_err_free_reg;
                }
        }
-       pci_set_master(pdev);
 
        if (pci_save_state(pdev)) {
                dev_err(&pdev->dev, "Failed to save pci state\n");
index f8a6e10a1de7aa90d16264769c03a21085f9ba82..a5edda8bad3279fc43c38f765a4e457aaa1ffc00 100644 (file)
@@ -163,7 +163,6 @@ static int adf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
                        goto out_err_free_reg;
                }
        }
-       pci_set_master(pdev);
        /* Completion for VF2PF request/response message exchange */
        init_completion(&accel_dev->vf.msg_received);