162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/* Copyright(c) 2023 Advanced Micro Devices, Inc. */
362306a36Sopenharmony_ci
462306a36Sopenharmony_ci#ifndef _LM_H_
562306a36Sopenharmony_ci#define _LM_H_
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci#include <linux/fs.h>
862306a36Sopenharmony_ci#include <linux/mutex.h>
962306a36Sopenharmony_ci#include <linux/scatterlist.h>
1062306a36Sopenharmony_ci#include <linux/types.h>
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#include <linux/pds/pds_common.h>
1362306a36Sopenharmony_ci#include <linux/pds/pds_adminq.h>
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_cistruct pds_vfio_lm_file {
1662306a36Sopenharmony_ci	struct file *filep;
1762306a36Sopenharmony_ci	struct mutex lock;	/* protect live migration data file */
1862306a36Sopenharmony_ci	u64 size;		/* Size with valid data */
1962306a36Sopenharmony_ci	u64 alloc_size;		/* Total allocated size. Always >= len */
2062306a36Sopenharmony_ci	void *page_mem;		/* memory allocated for pages */
2162306a36Sopenharmony_ci	struct page **pages;	/* Backing pages for file */
2262306a36Sopenharmony_ci	unsigned long long npages;
2362306a36Sopenharmony_ci	struct sg_table sg_table;	/* SG table for backing pages */
2462306a36Sopenharmony_ci	struct pds_lm_sg_elem *sgl;	/* DMA mapping */
2562306a36Sopenharmony_ci	dma_addr_t sgl_addr;
2662306a36Sopenharmony_ci	u16 num_sge;
2762306a36Sopenharmony_ci	struct scatterlist *last_offset_sg;	/* Iterator */
2862306a36Sopenharmony_ci	unsigned int sg_last_entry;
2962306a36Sopenharmony_ci	unsigned long last_offset;
3062306a36Sopenharmony_ci};
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_cistruct pds_vfio_pci_device;
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_cistruct file *
3562306a36Sopenharmony_cipds_vfio_step_device_state_locked(struct pds_vfio_pci_device *pds_vfio,
3662306a36Sopenharmony_ci				  enum vfio_device_mig_state next);
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_civoid pds_vfio_put_save_file(struct pds_vfio_pci_device *pds_vfio);
3962306a36Sopenharmony_civoid pds_vfio_put_restore_file(struct pds_vfio_pci_device *pds_vfio);
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ci#endif /* _LM_H_ */
42