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