Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

crypto: qat - add interface for live migration

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>

authored by

Xin Zeng and committed by
Herbert Xu
0fce55e5 bbfdde7d

+189 -1
+1 -1
drivers/crypto/intel/qat/qat_common/Makefile
··· 54 54 intel_qat-$(CONFIG_PCI_IOV) += adf_sriov.o adf_vf_isr.o adf_pfvf_utils.o \ 55 55 adf_pfvf_pf_msg.o adf_pfvf_pf_proto.o \ 56 56 adf_pfvf_vf_msg.o adf_pfvf_vf_proto.o \ 57 - adf_gen2_pfvf.o adf_gen4_pfvf.o 57 + adf_gen2_pfvf.o adf_gen4_pfvf.o qat_mig_dev.o 58 58 59 59 intel_qat-$(CONFIG_CRYPTO_DEV_QAT_ERROR_INJECTION) += adf_heartbeat_inject.o
+17
drivers/crypto/intel/qat/qat_common/adf_accel_devices.h
··· 9 9 #include <linux/pci.h> 10 10 #include <linux/ratelimit.h> 11 11 #include <linux/types.h> 12 + #include <linux/qat/qat_mig_dev.h> 12 13 #include "adf_cfg_common.h" 13 14 #include "adf_rl.h" 14 15 #include "adf_telemetry.h" ··· 259 258 void (*build_deflate_ctx)(void *ctx); 260 259 }; 261 260 261 + struct qat_migdev_ops { 262 + int (*init)(struct qat_mig_dev *mdev); 263 + void (*cleanup)(struct qat_mig_dev *mdev); 264 + void (*reset)(struct qat_mig_dev *mdev); 265 + int (*open)(struct qat_mig_dev *mdev); 266 + void (*close)(struct qat_mig_dev *mdev); 267 + int (*suspend)(struct qat_mig_dev *mdev); 268 + int (*resume)(struct qat_mig_dev *mdev); 269 + int (*save_state)(struct qat_mig_dev *mdev); 270 + int (*save_setup)(struct qat_mig_dev *mdev); 271 + int (*load_state)(struct qat_mig_dev *mdev); 272 + int (*load_setup)(struct qat_mig_dev *mdev, int size); 273 + }; 274 + 262 275 struct adf_dev_err_mask { 263 276 u32 cppagentcmdpar_mask; 264 277 u32 parerr_ath_cph_mask; ··· 340 325 struct adf_dev_err_mask dev_err_mask; 341 326 struct adf_rl_hw_data rl_data; 342 327 struct adf_tl_hw_data tl_data; 328 + struct qat_migdev_ops vfmig_ops; 343 329 const char *fw_name; 344 330 const char *fw_mmp_name; 345 331 u32 fuses; ··· 397 381 #define GET_CSR_OPS(accel_dev) (&(accel_dev)->hw_device->csr_ops) 398 382 #define GET_PFVF_OPS(accel_dev) (&(accel_dev)->hw_device->pfvf_ops) 399 383 #define GET_DC_OPS(accel_dev) (&(accel_dev)->hw_device->dc_ops) 384 + #define GET_VFMIG_OPS(accel_dev) (&(accel_dev)->hw_device->vfmig_ops) 400 385 #define GET_TL_DATA(accel_dev) GET_HW_DATA(accel_dev)->tl_data 401 386 #define accel_to_pci_dev(accel_ptr) accel_ptr->accel_pci_dev.pci_dev 402 387
+10
drivers/crypto/intel/qat/qat_common/adf_gen4_vf_mig.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0-only */ 2 + /* Copyright(c) 2024 Intel Corporation */ 3 + #ifndef ADF_GEN4_VF_MIG_H_ 4 + #define ADF_GEN4_VF_MIG_H_ 5 + 6 + #include "adf_accel_devices.h" 7 + 8 + void adf_gen4_init_vf_mig_ops(struct qat_migdev_ops *vfmig_ops); 9 + 10 + #endif
+130
drivers/crypto/intel/qat/qat_common/qat_mig_dev.c
··· 1 + // SPDX-License-Identifier: GPL-2.0-only 2 + /* Copyright(c) 2024 Intel Corporation */ 3 + #include <linux/dev_printk.h> 4 + #include <linux/export.h> 5 + #include <linux/pci.h> 6 + #include <linux/types.h> 7 + #include <linux/qat/qat_mig_dev.h> 8 + #include "adf_accel_devices.h" 9 + #include "adf_common_drv.h" 10 + 11 + struct qat_mig_dev *qat_vfmig_create(struct pci_dev *pdev, int vf_id) 12 + { 13 + struct adf_accel_dev *accel_dev; 14 + struct qat_migdev_ops *ops; 15 + struct qat_mig_dev *mdev; 16 + 17 + accel_dev = adf_devmgr_pci_to_accel_dev(pdev); 18 + if (!accel_dev) 19 + return ERR_PTR(-ENODEV); 20 + 21 + ops = GET_VFMIG_OPS(accel_dev); 22 + if (!ops || !ops->init || !ops->cleanup || !ops->reset || !ops->open || 23 + !ops->close || !ops->suspend || !ops->resume || !ops->save_state || 24 + !ops->load_state || !ops->save_setup || !ops->load_setup) 25 + return ERR_PTR(-EINVAL); 26 + 27 + mdev = kmalloc(sizeof(*mdev), GFP_KERNEL); 28 + if (!mdev) 29 + return ERR_PTR(-ENOMEM); 30 + 31 + mdev->vf_id = vf_id; 32 + mdev->parent_accel_dev = accel_dev; 33 + 34 + return mdev; 35 + } 36 + EXPORT_SYMBOL_GPL(qat_vfmig_create); 37 + 38 + int qat_vfmig_init(struct qat_mig_dev *mdev) 39 + { 40 + struct adf_accel_dev *accel_dev = mdev->parent_accel_dev; 41 + 42 + return GET_VFMIG_OPS(accel_dev)->init(mdev); 43 + } 44 + EXPORT_SYMBOL_GPL(qat_vfmig_init); 45 + 46 + void qat_vfmig_cleanup(struct qat_mig_dev *mdev) 47 + { 48 + struct adf_accel_dev *accel_dev = mdev->parent_accel_dev; 49 + 50 + return GET_VFMIG_OPS(accel_dev)->cleanup(mdev); 51 + } 52 + EXPORT_SYMBOL_GPL(qat_vfmig_cleanup); 53 + 54 + void qat_vfmig_reset(struct qat_mig_dev *mdev) 55 + { 56 + struct adf_accel_dev *accel_dev = mdev->parent_accel_dev; 57 + 58 + return GET_VFMIG_OPS(accel_dev)->reset(mdev); 59 + } 60 + EXPORT_SYMBOL_GPL(qat_vfmig_reset); 61 + 62 + int qat_vfmig_open(struct qat_mig_dev *mdev) 63 + { 64 + struct adf_accel_dev *accel_dev = mdev->parent_accel_dev; 65 + 66 + return GET_VFMIG_OPS(accel_dev)->open(mdev); 67 + } 68 + EXPORT_SYMBOL_GPL(qat_vfmig_open); 69 + 70 + void qat_vfmig_close(struct qat_mig_dev *mdev) 71 + { 72 + struct adf_accel_dev *accel_dev = mdev->parent_accel_dev; 73 + 74 + GET_VFMIG_OPS(accel_dev)->close(mdev); 75 + } 76 + EXPORT_SYMBOL_GPL(qat_vfmig_close); 77 + 78 + int qat_vfmig_suspend(struct qat_mig_dev *mdev) 79 + { 80 + struct adf_accel_dev *accel_dev = mdev->parent_accel_dev; 81 + 82 + return GET_VFMIG_OPS(accel_dev)->suspend(mdev); 83 + } 84 + EXPORT_SYMBOL_GPL(qat_vfmig_suspend); 85 + 86 + int qat_vfmig_resume(struct qat_mig_dev *mdev) 87 + { 88 + struct adf_accel_dev *accel_dev = mdev->parent_accel_dev; 89 + 90 + return GET_VFMIG_OPS(accel_dev)->resume(mdev); 91 + } 92 + EXPORT_SYMBOL_GPL(qat_vfmig_resume); 93 + 94 + int qat_vfmig_save_state(struct qat_mig_dev *mdev) 95 + { 96 + struct adf_accel_dev *accel_dev = mdev->parent_accel_dev; 97 + 98 + return GET_VFMIG_OPS(accel_dev)->save_state(mdev); 99 + } 100 + EXPORT_SYMBOL_GPL(qat_vfmig_save_state); 101 + 102 + int qat_vfmig_save_setup(struct qat_mig_dev *mdev) 103 + { 104 + struct adf_accel_dev *accel_dev = mdev->parent_accel_dev; 105 + 106 + return GET_VFMIG_OPS(accel_dev)->save_setup(mdev); 107 + } 108 + EXPORT_SYMBOL_GPL(qat_vfmig_save_setup); 109 + 110 + int qat_vfmig_load_state(struct qat_mig_dev *mdev) 111 + { 112 + struct adf_accel_dev *accel_dev = mdev->parent_accel_dev; 113 + 114 + return GET_VFMIG_OPS(accel_dev)->load_state(mdev); 115 + } 116 + EXPORT_SYMBOL_GPL(qat_vfmig_load_state); 117 + 118 + int qat_vfmig_load_setup(struct qat_mig_dev *mdev, int size) 119 + { 120 + struct adf_accel_dev *accel_dev = mdev->parent_accel_dev; 121 + 122 + return GET_VFMIG_OPS(accel_dev)->load_setup(mdev, size); 123 + } 124 + EXPORT_SYMBOL_GPL(qat_vfmig_load_setup); 125 + 126 + void qat_vfmig_destroy(struct qat_mig_dev *mdev) 127 + { 128 + kfree(mdev); 129 + } 130 + EXPORT_SYMBOL_GPL(qat_vfmig_destroy);
+31
include/linux/qat/qat_mig_dev.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0-only */ 2 + /* Copyright(c) 2024 Intel Corporation */ 3 + #ifndef QAT_MIG_DEV_H_ 4 + #define QAT_MIG_DEV_H_ 5 + 6 + struct pci_dev; 7 + 8 + struct qat_mig_dev { 9 + void *parent_accel_dev; 10 + u8 *state; 11 + u32 setup_size; 12 + u32 remote_setup_size; 13 + u32 state_size; 14 + s32 vf_id; 15 + }; 16 + 17 + struct qat_mig_dev *qat_vfmig_create(struct pci_dev *pdev, int vf_id); 18 + int qat_vfmig_init(struct qat_mig_dev *mdev); 19 + void qat_vfmig_cleanup(struct qat_mig_dev *mdev); 20 + void qat_vfmig_reset(struct qat_mig_dev *mdev); 21 + int qat_vfmig_open(struct qat_mig_dev *mdev); 22 + void qat_vfmig_close(struct qat_mig_dev *mdev); 23 + int qat_vfmig_suspend(struct qat_mig_dev *mdev); 24 + int qat_vfmig_resume(struct qat_mig_dev *mdev); 25 + int qat_vfmig_save_state(struct qat_mig_dev *mdev); 26 + int qat_vfmig_save_setup(struct qat_mig_dev *mdev); 27 + int qat_vfmig_load_state(struct qat_mig_dev *mdev); 28 + int qat_vfmig_load_setup(struct qat_mig_dev *mdev, int size); 29 + void qat_vfmig_destroy(struct qat_mig_dev *mdev); 30 + 31 + #endif /*QAT_MIG_DEV_H_*/