crypto: qat - add interface for live migration
authorXin Zeng <xin.zeng@intel.com>
Wed, 6 Mar 2024 13:58:53 +0000 (21:58 +0800)
committerHerbert Xu <herbert@gondor.apana.org.au>
Tue, 2 Apr 2024 02:47:43 +0000 (10:47 +0800)
Extend the driver with a new interface to be used for VF live migration.
This allows to create and destroy a qat_mig_dev object that contains
a set of methods to allow to save and restore the state of QAT VF.
This interface will be used by the qat-vfio-pci module.

Signed-off-by: Xin Zeng <xin.zeng@intel.com>
Reviewed-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/intel/qat/qat_common/Makefile
drivers/crypto/intel/qat/qat_common/adf_accel_devices.h
drivers/crypto/intel/qat/qat_common/adf_gen4_vf_mig.h [new file with mode: 0644]
drivers/crypto/intel/qat/qat_common/qat_mig_dev.c [new file with mode: 0644]
include/linux/qat/qat_mig_dev.h [new file with mode: 0644]

index ceaa685352ed148eb71c337a4c509703ec601c23..9fba31d4ac7fce2c0bc25094110929b71261ece6 100644 (file)
@@ -54,6 +54,6 @@ intel_qat-$(CONFIG_DEBUG_FS) += adf_transport_debug.o \
 intel_qat-$(CONFIG_PCI_IOV) += adf_sriov.o adf_vf_isr.o adf_pfvf_utils.o \
                               adf_pfvf_pf_msg.o adf_pfvf_pf_proto.o \
                               adf_pfvf_vf_msg.o adf_pfvf_vf_proto.o \
-                              adf_gen2_pfvf.o adf_gen4_pfvf.o
+                              adf_gen2_pfvf.o adf_gen4_pfvf.o qat_mig_dev.o
 
 intel_qat-$(CONFIG_CRYPTO_DEV_QAT_ERROR_INJECTION) += adf_heartbeat_inject.o
index 986e63ec702de7573aa528c9437701a767703be8..b08fea10121ebc4122c1df3275c00851b27cd562 100644 (file)
@@ -9,6 +9,7 @@
 #include <linux/pci.h>
 #include <linux/ratelimit.h>
 #include <linux/types.h>
+#include <linux/qat/qat_mig_dev.h>
 #include "adf_cfg_common.h"
 #include "adf_rl.h"
 #include "adf_telemetry.h"
@@ -258,6 +259,20 @@ struct adf_dc_ops {
        void (*build_deflate_ctx)(void *ctx);
 };
 
+struct qat_migdev_ops {
+       int (*init)(struct qat_mig_dev *mdev);
+       void (*cleanup)(struct qat_mig_dev *mdev);
+       void (*reset)(struct qat_mig_dev *mdev);
+       int (*open)(struct qat_mig_dev *mdev);
+       void (*close)(struct qat_mig_dev *mdev);
+       int (*suspend)(struct qat_mig_dev *mdev);
+       int (*resume)(struct qat_mig_dev *mdev);
+       int (*save_state)(struct qat_mig_dev *mdev);
+       int (*save_setup)(struct qat_mig_dev *mdev);
+       int (*load_state)(struct qat_mig_dev *mdev);
+       int (*load_setup)(struct qat_mig_dev *mdev, int size);
+};
+
 struct adf_dev_err_mask {
        u32 cppagentcmdpar_mask;
        u32 parerr_ath_cph_mask;
@@ -325,6 +340,7 @@ struct adf_hw_device_data {
        struct adf_dev_err_mask dev_err_mask;
        struct adf_rl_hw_data rl_data;
        struct adf_tl_hw_data tl_data;
+       struct qat_migdev_ops vfmig_ops;
        const char *fw_name;
        const char *fw_mmp_name;
        u32 fuses;
@@ -381,6 +397,7 @@ struct adf_hw_device_data {
 #define GET_CSR_OPS(accel_dev) (&(accel_dev)->hw_device->csr_ops)
 #define GET_PFVF_OPS(accel_dev) (&(accel_dev)->hw_device->pfvf_ops)
 #define GET_DC_OPS(accel_dev) (&(accel_dev)->hw_device->dc_ops)
+#define GET_VFMIG_OPS(accel_dev) (&(accel_dev)->hw_device->vfmig_ops)
 #define GET_TL_DATA(accel_dev) GET_HW_DATA(accel_dev)->tl_data
 #define accel_to_pci_dev(accel_ptr) accel_ptr->accel_pci_dev.pci_dev
 
diff --git a/drivers/crypto/intel/qat/qat_common/adf_gen4_vf_mig.h b/drivers/crypto/intel/qat/qat_common/adf_gen4_vf_mig.h
new file mode 100644 (file)
index 0000000..72216d0
--- /dev/null
@@ -0,0 +1,10 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/* Copyright(c) 2024 Intel Corporation */
+#ifndef ADF_GEN4_VF_MIG_H_
+#define ADF_GEN4_VF_MIG_H_
+
+#include "adf_accel_devices.h"
+
+void adf_gen4_init_vf_mig_ops(struct qat_migdev_ops *vfmig_ops);
+
+#endif
diff --git a/drivers/crypto/intel/qat/qat_common/qat_mig_dev.c b/drivers/crypto/intel/qat/qat_common/qat_mig_dev.c
new file mode 100644 (file)
index 0000000..892c228
--- /dev/null
@@ -0,0 +1,130 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/* Copyright(c) 2024 Intel Corporation */
+#include <linux/dev_printk.h>
+#include <linux/export.h>
+#include <linux/pci.h>
+#include <linux/types.h>
+#include <linux/qat/qat_mig_dev.h>
+#include "adf_accel_devices.h"
+#include "adf_common_drv.h"
+
+struct qat_mig_dev *qat_vfmig_create(struct pci_dev *pdev, int vf_id)
+{
+       struct adf_accel_dev *accel_dev;
+       struct qat_migdev_ops *ops;
+       struct qat_mig_dev *mdev;
+
+       accel_dev = adf_devmgr_pci_to_accel_dev(pdev);
+       if (!accel_dev)
+               return ERR_PTR(-ENODEV);
+
+       ops = GET_VFMIG_OPS(accel_dev);
+       if (!ops || !ops->init || !ops->cleanup || !ops->reset || !ops->open ||
+           !ops->close || !ops->suspend || !ops->resume || !ops->save_state ||
+           !ops->load_state || !ops->save_setup || !ops->load_setup)
+               return ERR_PTR(-EINVAL);
+
+       mdev = kmalloc(sizeof(*mdev), GFP_KERNEL);
+       if (!mdev)
+               return ERR_PTR(-ENOMEM);
+
+       mdev->vf_id = vf_id;
+       mdev->parent_accel_dev = accel_dev;
+
+       return mdev;
+}
+EXPORT_SYMBOL_GPL(qat_vfmig_create);
+
+int qat_vfmig_init(struct qat_mig_dev *mdev)
+{
+       struct adf_accel_dev *accel_dev = mdev->parent_accel_dev;
+
+       return GET_VFMIG_OPS(accel_dev)->init(mdev);
+}
+EXPORT_SYMBOL_GPL(qat_vfmig_init);
+
+void qat_vfmig_cleanup(struct qat_mig_dev *mdev)
+{
+       struct adf_accel_dev *accel_dev = mdev->parent_accel_dev;
+
+       return GET_VFMIG_OPS(accel_dev)->cleanup(mdev);
+}
+EXPORT_SYMBOL_GPL(qat_vfmig_cleanup);
+
+void qat_vfmig_reset(struct qat_mig_dev *mdev)
+{
+       struct adf_accel_dev *accel_dev = mdev->parent_accel_dev;
+
+       return GET_VFMIG_OPS(accel_dev)->reset(mdev);
+}
+EXPORT_SYMBOL_GPL(qat_vfmig_reset);
+
+int qat_vfmig_open(struct qat_mig_dev *mdev)
+{
+       struct adf_accel_dev *accel_dev = mdev->parent_accel_dev;
+
+       return GET_VFMIG_OPS(accel_dev)->open(mdev);
+}
+EXPORT_SYMBOL_GPL(qat_vfmig_open);
+
+void qat_vfmig_close(struct qat_mig_dev *mdev)
+{
+       struct adf_accel_dev *accel_dev = mdev->parent_accel_dev;
+
+       GET_VFMIG_OPS(accel_dev)->close(mdev);
+}
+EXPORT_SYMBOL_GPL(qat_vfmig_close);
+
+int qat_vfmig_suspend(struct qat_mig_dev *mdev)
+{
+       struct adf_accel_dev *accel_dev = mdev->parent_accel_dev;
+
+       return GET_VFMIG_OPS(accel_dev)->suspend(mdev);
+}
+EXPORT_SYMBOL_GPL(qat_vfmig_suspend);
+
+int qat_vfmig_resume(struct qat_mig_dev *mdev)
+{
+       struct adf_accel_dev *accel_dev = mdev->parent_accel_dev;
+
+       return GET_VFMIG_OPS(accel_dev)->resume(mdev);
+}
+EXPORT_SYMBOL_GPL(qat_vfmig_resume);
+
+int qat_vfmig_save_state(struct qat_mig_dev *mdev)
+{
+       struct adf_accel_dev *accel_dev = mdev->parent_accel_dev;
+
+       return GET_VFMIG_OPS(accel_dev)->save_state(mdev);
+}
+EXPORT_SYMBOL_GPL(qat_vfmig_save_state);
+
+int qat_vfmig_save_setup(struct qat_mig_dev *mdev)
+{
+       struct adf_accel_dev *accel_dev = mdev->parent_accel_dev;
+
+       return GET_VFMIG_OPS(accel_dev)->save_setup(mdev);
+}
+EXPORT_SYMBOL_GPL(qat_vfmig_save_setup);
+
+int qat_vfmig_load_state(struct qat_mig_dev *mdev)
+{
+       struct adf_accel_dev *accel_dev = mdev->parent_accel_dev;
+
+       return GET_VFMIG_OPS(accel_dev)->load_state(mdev);
+}
+EXPORT_SYMBOL_GPL(qat_vfmig_load_state);
+
+int qat_vfmig_load_setup(struct qat_mig_dev *mdev, int size)
+{
+       struct adf_accel_dev *accel_dev = mdev->parent_accel_dev;
+
+       return GET_VFMIG_OPS(accel_dev)->load_setup(mdev, size);
+}
+EXPORT_SYMBOL_GPL(qat_vfmig_load_setup);
+
+void qat_vfmig_destroy(struct qat_mig_dev *mdev)
+{
+       kfree(mdev);
+}
+EXPORT_SYMBOL_GPL(qat_vfmig_destroy);
diff --git a/include/linux/qat/qat_mig_dev.h b/include/linux/qat/qat_mig_dev.h
new file mode 100644 (file)
index 0000000..dbbb6a0
--- /dev/null
@@ -0,0 +1,31 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/* Copyright(c) 2024 Intel Corporation */
+#ifndef QAT_MIG_DEV_H_
+#define QAT_MIG_DEV_H_
+
+struct pci_dev;
+
+struct qat_mig_dev {
+       void *parent_accel_dev;
+       u8 *state;
+       u32 setup_size;
+       u32 remote_setup_size;
+       u32 state_size;
+       s32 vf_id;
+};
+
+struct qat_mig_dev *qat_vfmig_create(struct pci_dev *pdev, int vf_id);
+int qat_vfmig_init(struct qat_mig_dev *mdev);
+void qat_vfmig_cleanup(struct qat_mig_dev *mdev);
+void qat_vfmig_reset(struct qat_mig_dev *mdev);
+int qat_vfmig_open(struct qat_mig_dev *mdev);
+void qat_vfmig_close(struct qat_mig_dev *mdev);
+int qat_vfmig_suspend(struct qat_mig_dev *mdev);
+int qat_vfmig_resume(struct qat_mig_dev *mdev);
+int qat_vfmig_save_state(struct qat_mig_dev *mdev);
+int qat_vfmig_save_setup(struct qat_mig_dev *mdev);
+int qat_vfmig_load_state(struct qat_mig_dev *mdev);
+int qat_vfmig_load_setup(struct qat_mig_dev *mdev, int size);
+void qat_vfmig_destroy(struct qat_mig_dev *mdev);
+
+#endif /*QAT_MIG_DEV_H_*/