xref: /spdk/lib/vfio_user/host/vfio_user_internal.h (revision 73fe04a8198479b2e7c1fde69fb4e5cceb7b954c)
1488570ebSJim Harris /*   SPDX-License-Identifier: BSD-3-Clause
2a6dbe372Spaul luse  *   Copyright (C) 2020 Intel Corporation. All rights reserved.
370b31195SChangpeng Liu  */
470b31195SChangpeng Liu 
570b31195SChangpeng Liu #ifndef _VFIO_INTERNAL_H
670b31195SChangpeng Liu #define _VFIO_INTERNAL_H
770b31195SChangpeng Liu 
870b31195SChangpeng Liu #include <linux/vfio.h>
970b31195SChangpeng Liu #include "spdk/vfio_user_spec.h"
1070b31195SChangpeng Liu 
1170b31195SChangpeng Liu #define VFIO_USER_MAJOR_VER			0
1270b31195SChangpeng Liu #define VFIO_USER_MINOR_VER			1
1370b31195SChangpeng Liu 
1470b31195SChangpeng Liu /* Maximum memory regions supported */
15*73fe04a8SSebastian Brzezinka #define VFIO_MAXIMUM_MEMORY_REGIONS		16
1670b31195SChangpeng Liu /* Maximum sparse memory regions in one BAR region */
1770b31195SChangpeng Liu #define VFIO_MAXIMUM_SPARSE_MMAP_REGIONS	8
1870b31195SChangpeng Liu 
1970b31195SChangpeng Liu struct vfio_memory_region {
2070b31195SChangpeng Liu 	uint64_t iova;
2170b31195SChangpeng Liu 	uint64_t size; /* bytes */
2270b31195SChangpeng Liu 	uint64_t vaddr;
2370b31195SChangpeng Liu 	uint64_t offset;
2470b31195SChangpeng Liu 	int fd;
2570b31195SChangpeng Liu 	TAILQ_ENTRY(vfio_memory_region) link;
2670b31195SChangpeng Liu };
2770b31195SChangpeng Liu 
2870b31195SChangpeng Liu struct vfio_sparse_mmaps {
2970b31195SChangpeng Liu 	void *mem;
3070b31195SChangpeng Liu 	uint64_t offset;
3170b31195SChangpeng Liu 	size_t size;
3270b31195SChangpeng Liu };
3370b31195SChangpeng Liu 
3470b31195SChangpeng Liu struct vfio_pci_region {
3570b31195SChangpeng Liu 	uint64_t offset;
3670b31195SChangpeng Liu 	size_t size;
3770b31195SChangpeng Liu 	uint64_t flags;
3870b31195SChangpeng Liu 	uint32_t nr_mmaps;
3970b31195SChangpeng Liu 	struct vfio_sparse_mmaps mmaps[VFIO_MAXIMUM_SPARSE_MMAP_REGIONS];
4070b31195SChangpeng Liu };
4170b31195SChangpeng Liu 
4270b31195SChangpeng Liu struct vfio_device {
4370b31195SChangpeng Liu 	int fd;
4470b31195SChangpeng Liu 
4570b31195SChangpeng Liu 	char name[64];
4670b31195SChangpeng Liu 	char path[PATH_MAX];
4770b31195SChangpeng Liu 
4870b31195SChangpeng Liu 	TAILQ_ENTRY(vfio_device) link;
4970b31195SChangpeng Liu 
5070b31195SChangpeng Liu 	/* PCI Regions */
5170b31195SChangpeng Liu 	uint32_t pci_regions;
5270b31195SChangpeng Liu 	struct vfio_pci_region regions[VFIO_PCI_NUM_REGIONS + 1];
5370b31195SChangpeng Liu 	uint64_t flags;
5470b31195SChangpeng Liu 
5570b31195SChangpeng Liu 	struct spdk_mem_map *map;
5670b31195SChangpeng Liu 	TAILQ_HEAD(, vfio_memory_region) mrs_head;
5770b31195SChangpeng Liu 	uint32_t nr_mrs;
5870b31195SChangpeng Liu };
5970b31195SChangpeng Liu 
6070b31195SChangpeng Liu int vfio_user_dev_setup(struct vfio_device *dev);
6170b31195SChangpeng Liu int vfio_user_get_dev_info(struct vfio_device *dev, struct vfio_user_device_info *dev_info,
6270b31195SChangpeng Liu 			   size_t buf_len);
6370b31195SChangpeng Liu int vfio_user_get_dev_region_info(struct vfio_device *dev, struct vfio_region_info *region_info,
6470b31195SChangpeng Liu 				  size_t buf_len, int *fds, int num_fds);
6570b31195SChangpeng Liu int vfio_user_dev_dma_map_unmap(struct vfio_device *dev, struct vfio_memory_region *mr, bool map);
6670b31195SChangpeng Liu int vfio_user_dev_mmio_access(struct vfio_device *dev, uint32_t index, uint64_t offset, size_t len,
6770b31195SChangpeng Liu 			      void *buf, bool is_write);
685fb57441SSebastian Brzezinka /* For fuzzing only */
695fb57441SSebastian Brzezinka int vfio_user_dev_send_request(struct vfio_device *dev, enum vfio_user_command command,
705fb57441SSebastian Brzezinka 			       void *arg, size_t arg_len, size_t buf_len, int *fds,
715fb57441SSebastian Brzezinka 			       int max_fds);
7270b31195SChangpeng Liu 
7370b31195SChangpeng Liu #endif
74