99#include <linux/pci.h>
1010#include <linux/ratelimit.h>
1111#include <linux/types.h>
12+ #include <linux/qat/qat_mig_dev.h>
1213#include "adf_cfg_common.h"
1314#include "adf_rl.h"
1415#include "adf_telemetry.h"
@@ -140,6 +141,40 @@ struct admin_info {
140141 u32 mailbox_offset ;
141142};
142143
144+ struct ring_config {
145+ u64 base ;
146+ u32 config ;
147+ u32 head ;
148+ u32 tail ;
149+ u32 reserved0 ;
150+ };
151+
152+ struct bank_state {
153+ u32 ringstat0 ;
154+ u32 ringstat1 ;
155+ u32 ringuostat ;
156+ u32 ringestat ;
157+ u32 ringnestat ;
158+ u32 ringnfstat ;
159+ u32 ringfstat ;
160+ u32 ringcstat0 ;
161+ u32 ringcstat1 ;
162+ u32 ringcstat2 ;
163+ u32 ringcstat3 ;
164+ u32 iaintflagen ;
165+ u32 iaintflagreg ;
166+ u32 iaintflagsrcsel0 ;
167+ u32 iaintflagsrcsel1 ;
168+ u32 iaintcolen ;
169+ u32 iaintcolctl ;
170+ u32 iaintflagandcolen ;
171+ u32 ringexpstat ;
172+ u32 ringexpintenable ;
173+ u32 ringsrvarben ;
174+ u32 reserved0 ;
175+ struct ring_config rings [ADF_ETR_MAX_RINGS_PER_BANK ];
176+ };
177+
143178struct adf_hw_csr_ops {
144179 u64 (* build_csr_ring_base_addr )(dma_addr_t addr , u32 size );
145180 u32 (* read_csr_ring_head )(void __iomem * csr_base_addr , u32 bank ,
@@ -150,22 +185,49 @@ struct adf_hw_csr_ops {
150185 u32 ring );
151186 void (* write_csr_ring_tail )(void __iomem * csr_base_addr , u32 bank ,
152187 u32 ring , u32 value );
188+ u32 (* read_csr_stat )(void __iomem * csr_base_addr , u32 bank );
189+ u32 (* read_csr_uo_stat )(void __iomem * csr_base_addr , u32 bank );
153190 u32 (* read_csr_e_stat )(void __iomem * csr_base_addr , u32 bank );
191+ u32 (* read_csr_ne_stat )(void __iomem * csr_base_addr , u32 bank );
192+ u32 (* read_csr_nf_stat )(void __iomem * csr_base_addr , u32 bank );
193+ u32 (* read_csr_f_stat )(void __iomem * csr_base_addr , u32 bank );
194+ u32 (* read_csr_c_stat )(void __iomem * csr_base_addr , u32 bank );
195+ u32 (* read_csr_exp_stat )(void __iomem * csr_base_addr , u32 bank );
196+ u32 (* read_csr_exp_int_en )(void __iomem * csr_base_addr , u32 bank );
197+ void (* write_csr_exp_int_en )(void __iomem * csr_base_addr , u32 bank ,
198+ u32 value );
199+ u32 (* read_csr_ring_config )(void __iomem * csr_base_addr , u32 bank ,
200+ u32 ring );
154201 void (* write_csr_ring_config )(void __iomem * csr_base_addr , u32 bank ,
155202 u32 ring , u32 value );
203+ dma_addr_t (* read_csr_ring_base )(void __iomem * csr_base_addr , u32 bank ,
204+ u32 ring );
156205 void (* write_csr_ring_base )(void __iomem * csr_base_addr , u32 bank ,
157206 u32 ring , dma_addr_t addr );
207+ u32 (* read_csr_int_en )(void __iomem * csr_base_addr , u32 bank );
208+ void (* write_csr_int_en )(void __iomem * csr_base_addr , u32 bank ,
209+ u32 value );
210+ u32 (* read_csr_int_flag )(void __iomem * csr_base_addr , u32 bank );
158211 void (* write_csr_int_flag )(void __iomem * csr_base_addr , u32 bank ,
159212 u32 value );
213+ u32 (* read_csr_int_srcsel )(void __iomem * csr_base_addr , u32 bank );
160214 void (* write_csr_int_srcsel )(void __iomem * csr_base_addr , u32 bank );
215+ void (* write_csr_int_srcsel_w_val )(void __iomem * csr_base_addr ,
216+ u32 bank , u32 value );
217+ u32 (* read_csr_int_col_en )(void __iomem * csr_base_addr , u32 bank );
161218 void (* write_csr_int_col_en )(void __iomem * csr_base_addr , u32 bank ,
162219 u32 value );
220+ u32 (* read_csr_int_col_ctl )(void __iomem * csr_base_addr , u32 bank );
163221 void (* write_csr_int_col_ctl )(void __iomem * csr_base_addr , u32 bank ,
164222 u32 value );
223+ u32 (* read_csr_int_flag_and_col )(void __iomem * csr_base_addr ,
224+ u32 bank );
165225 void (* write_csr_int_flag_and_col )(void __iomem * csr_base_addr ,
166226 u32 bank , u32 value );
227+ u32 (* read_csr_ring_srv_arb_en )(void __iomem * csr_base_addr , u32 bank );
167228 void (* write_csr_ring_srv_arb_en )(void __iomem * csr_base_addr , u32 bank ,
168229 u32 value );
230+ u32 (* get_int_col_ctl_enable_mask )(void );
169231};
170232
171233struct adf_cfg_device_data ;
@@ -197,6 +259,20 @@ struct adf_dc_ops {
197259 void (* build_deflate_ctx )(void * ctx );
198260};
199261
262+ struct qat_migdev_ops {
263+ int (* init )(struct qat_mig_dev * mdev );
264+ void (* cleanup )(struct qat_mig_dev * mdev );
265+ void (* reset )(struct qat_mig_dev * mdev );
266+ int (* open )(struct qat_mig_dev * mdev );
267+ void (* close )(struct qat_mig_dev * mdev );
268+ int (* suspend )(struct qat_mig_dev * mdev );
269+ int (* resume )(struct qat_mig_dev * mdev );
270+ int (* save_state )(struct qat_mig_dev * mdev );
271+ int (* save_setup )(struct qat_mig_dev * mdev );
272+ int (* load_state )(struct qat_mig_dev * mdev );
273+ int (* load_setup )(struct qat_mig_dev * mdev , int size );
274+ };
275+
200276struct adf_dev_err_mask {
201277 u32 cppagentcmdpar_mask ;
202278 u32 parerr_ath_cph_mask ;
@@ -244,6 +320,10 @@ struct adf_hw_device_data {
244320 void (* enable_ints )(struct adf_accel_dev * accel_dev );
245321 void (* set_ssm_wdtimer )(struct adf_accel_dev * accel_dev );
246322 int (* ring_pair_reset )(struct adf_accel_dev * accel_dev , u32 bank_nr );
323+ int (* bank_state_save )(struct adf_accel_dev * accel_dev , u32 bank_number ,
324+ struct bank_state * state );
325+ int (* bank_state_restore )(struct adf_accel_dev * accel_dev ,
326+ u32 bank_number , struct bank_state * state );
247327 void (* reset_device )(struct adf_accel_dev * accel_dev );
248328 void (* set_msix_rttable )(struct adf_accel_dev * accel_dev );
249329 const char * (* uof_get_name )(struct adf_accel_dev * accel_dev , u32 obj_num );
@@ -260,6 +340,7 @@ struct adf_hw_device_data {
260340 struct adf_dev_err_mask dev_err_mask ;
261341 struct adf_rl_hw_data rl_data ;
262342 struct adf_tl_hw_data tl_data ;
343+ struct qat_migdev_ops vfmig_ops ;
263344 const char * fw_name ;
264345 const char * fw_mmp_name ;
265346 u32 fuses ;
@@ -316,6 +397,7 @@ struct adf_hw_device_data {
316397#define GET_CSR_OPS (accel_dev ) (&(accel_dev)->hw_device->csr_ops)
317398#define GET_PFVF_OPS (accel_dev ) (&(accel_dev)->hw_device->pfvf_ops)
318399#define GET_DC_OPS (accel_dev ) (&(accel_dev)->hw_device->dc_ops)
400+ #define GET_VFMIG_OPS (accel_dev ) (&(accel_dev)->hw_device->vfmig_ops)
319401#define GET_TL_DATA (accel_dev ) GET_HW_DATA(accel_dev)->tl_data
320402#define accel_to_pci_dev (accel_ptr ) accel_ptr->accel_pci_dev.pci_dev
321403
@@ -330,11 +412,17 @@ struct adf_fw_loader_data {
330412struct adf_accel_vf_info {
331413 struct adf_accel_dev * accel_dev ;
332414 struct mutex pf2vf_lock ; /* protect CSR access for PF2VF messages */
415+ struct mutex pfvf_mig_lock ; /* protects PFVF state for migration */
333416 struct ratelimit_state vf2pf_ratelimit ;
334417 u32 vf_nr ;
335418 bool init ;
336419 bool restarting ;
337420 u8 vf_compat_ver ;
421+ /*
422+ * Private area used for device migration.
423+ * Memory allocation and free is managed by migration driver.
424+ */
425+ void * mig_priv ;
338426};
339427
340428struct adf_dc_data {
0 commit comments