#ifndef VFIO_USER_PROTOCOL_H #define VFIO_USER_PROTOCOL_H /* * vfio protocol over a UNIX socket. * * Copyright © 2018, 2021 Oracle and/or its affiliates. * * Each message has a standard header that describes the command * being sent, which is almost always a VFIO ioctl(). * * The header may be followed by command-specific data, such as the * region and offset info for read and write commands. * * SPDX-License-Identifier: GPL-2.0-or-later */ typedef struct { uint16_t id; uint16_t command; uint32_t size; uint32_t flags; uint32_t error_reply; } VFIOUserHdr; /* VFIOUserHdr commands */ enum vfio_user_command { VFIO_USER_VERSION = 1, VFIO_USER_DMA_MAP = 2, VFIO_USER_DMA_UNMAP = 3, VFIO_USER_DEVICE_GET_INFO = 4, VFIO_USER_DEVICE_GET_REGION_INFO = 5, VFIO_USER_DEVICE_GET_REGION_IO_FDS = 6, VFIO_USER_DEVICE_GET_IRQ_INFO = 7, VFIO_USER_DEVICE_SET_IRQS = 8, VFIO_USER_REGION_READ = 9, VFIO_USER_REGION_WRITE = 10, VFIO_USER_DMA_READ = 11, VFIO_USER_DMA_WRITE = 12, VFIO_USER_DEVICE_RESET = 13, VFIO_USER_DIRTY_PAGES = 14, VFIO_USER_REGION_WRITE_MULTI = 15, VFIO_USER_MAX, }; /* VFIOUserHdr flags */ #define VFIO_USER_REQUEST 0x0 #define VFIO_USER_REPLY 0x1 #define VFIO_USER_TYPE 0xF #define VFIO_USER_NO_REPLY 0x10 #define VFIO_USER_ERROR 0x20 /* * VFIO_USER_VERSION */ typedef struct { VFIOUserHdr hdr; uint16_t major; uint16_t minor; char capabilities[]; } VFIOUserVersion; #define VFIO_USER_MAJOR_VER 0 #define VFIO_USER_MINOR_VER 0 #define VFIO_USER_CAP "capabilities" /* "capabilities" members */ #define VFIO_USER_CAP_MAX_FDS "max_msg_fds" #define VFIO_USER_CAP_MAX_XFER "max_data_xfer_size" #define VFIO_USER_CAP_PGSIZES "pgsizes" #define VFIO_USER_CAP_MAP_MAX "max_dma_maps" #define VFIO_USER_CAP_MIGR "migration" #define VFIO_USER_CAP_MULTI "write_multiple" /* "migration" members */ #define VFIO_USER_CAP_PGSIZE "pgsize" #define VFIO_USER_CAP_MAX_BITMAP "max_bitmap_size" /* * Max FDs mainly comes into play when a device supports multiple interrupts * where each ones uses an eventfd to inject it into the guest. * It is clamped by the the number of FDs the qio channel supports in a * single message. */ #define VFIO_USER_DEF_MAX_FDS 8 #define VFIO_USER_MAX_MAX_FDS 16 /* * Max transfer limits the amount of data in region and DMA messages. * Region R/W will be very small (limited by how much a single instruction * can process) so just use a reasonable limit here. */ #define VFIO_USER_DEF_MAX_XFER (1024 * 1024) #define VFIO_USER_MAX_MAX_XFER (64 * 1024 * 1024) /* * Default pagesizes supported is 4k. */ #define VFIO_USER_DEF_PGSIZE 4096 /* * Default max number of DMA mappings is stolen from the * linux kernel "dma_entry_limit" */ #define VFIO_USER_DEF_MAP_MAX 65535 /* * Default max bitmap size is also take from the linux kernel, * where usage of signed ints limits the VA range to 2^31 bytes. * Dividing that by the number of bits per byte yields 256MB */ #define VFIO_USER_DEF_MAX_BITMAP (256 * 1024 * 1024) /* * VFIO_USER_DMA_MAP * imported from struct vfio_iommu_type1_dma_map */ typedef struct { VFIOUserHdr hdr; uint32_t argsz; uint32_t flags; uint64_t offset; /* FD offset */ uint64_t iova; uint64_t size; } VFIOUserDMAMap; /* * VFIO_USER_DMA_UNMAP * imported from struct vfio_iommu_type1_dma_unmap */ typedef struct { VFIOUserHdr hdr; uint32_t argsz; uint32_t flags; uint64_t iova; uint64_t size; } VFIOUserDMAUnmap; /* * VFIO_USER_DEVICE_GET_INFO * imported from struct vfio_device_info */ typedef struct { VFIOUserHdr hdr; uint32_t argsz; uint32_t flags; uint32_t num_regions; uint32_t num_irqs; } VFIOUserDeviceInfo; /* * VFIO_USER_DEVICE_GET_REGION_INFO * imported from struct vfio_region_info */ typedef struct { VFIOUserHdr hdr; uint32_t argsz; uint32_t flags; uint32_t index; uint32_t cap_offset; uint64_t size; uint64_t offset; } VFIOUserRegionInfo; /* * VFIO_USER_DEVICE_GET_IRQ_INFO * imported from struct vfio_irq_info */ typedef struct { VFIOUserHdr hdr; uint32_t argsz; uint32_t flags; uint32_t index; uint32_t count; } VFIOUserIRQInfo; /* * VFIO_USER_DEVICE_SET_IRQS * imported from struct vfio_irq_set */ typedef struct { VFIOUserHdr hdr; uint32_t argsz; uint32_t flags; uint32_t index; uint32_t start; uint32_t count; } VFIOUserIRQSet; /* * VFIO_USER_REGION_READ * VFIO_USER_REGION_WRITE */ typedef struct { VFIOUserHdr hdr; uint64_t offset; uint32_t region; uint32_t count; char data[]; } VFIOUserRegionRW; /* * VFIO_USER_DMA_READ * VFIO_USER_DMA_WRITE */ typedef struct { VFIOUserHdr hdr; uint64_t offset; uint32_t count; char data[]; } VFIOUserDMARW; /* imported from struct vfio_bitmap */ typedef struct { uint64_t pgsize; uint64_t size; char data[]; } VFIOUserBitmap; /* * VFIO_USER_REGION_WRITE_MULTI */ #define VFIO_USER_MULTI_DATA 8 #define VFIO_USER_MULTI_MAX 200 typedef struct { uint64_t offset; uint32_t region; uint32_t count; char data[VFIO_USER_MULTI_DATA]; } VFIOUserWROne; typedef struct { VFIOUserHdr hdr; uint64_t wr_cnt; VFIOUserWROne wrs[VFIO_USER_MULTI_MAX]; } VFIOUserWRMulti; #endif /* VFIO_USER_PROTOCOL_H */