You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
qemu/hw/vfio-user/protocol.h

243 lines
5.5 KiB
C

#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 */