mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-03 15:53:54 -06:00
vfio queue:
* Preparatory changes for the introduction of CPR support * Automatic enablement of OpRegion for IGD device passthrough * Linux headers update * Preparatory changes for the introduction of vfio-user -----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEEoPZlSPBIlev+awtgUaNDx8/77KEFAmgd/0kACgkQUaNDx8/7 7KHRmRAArw1PXMCmoVBBeLcZ8BZPGjBZHtsvRzwS1yhVnNQadlpDlq4wd9HrfDFK BTr7//Ag2Q1dKgibesh0A8hSjorXHUGQCmdkcCuGGTFnEwC86q5jCH1lUxgI0cs5 3bVwc43zhXGoKqmo07g4f2UFbjDYHe89LgWz2c7TFFGz7Tda/LCOdhnmXlXcIwz+ v1ocutXd7VbDWvUzN7uZbf0SIH3Zj3p96dwmpLDtdzdliDA0JidNvS27+Z5gtvWe O+1NW9MDzNfd6zLXCxL3GLeT61WZCe1dRCHEPX4cBo+DhnrifsC25DtJwYlDFvi2 NMFfGzdKcEVSpeDp7WeM6MJgCZsGHC7ytmAKOKgN2M2kFSj3SI3sTFNlE1rzUhe6 yjjCa59HzNLIi7L7xYCrVtCLGC/VXOp9kh67Sjs7FY7v778QUEdiudFBdBki7Bwh bpRhdFJgCLHuKc6XrM7hsMnsRyM28MywyfHDo3M/pRSFNKfeImW6zSMXnyncZztK W8e8OIz2DBMfH8pIu8hPw9Gsm5VAAs4aVmVFNa0CLl0oBko0Ew2YXcA5pTK5gGqv x24uc/BhbLcfFUtK0OnP4N/B4rcoADebPV2u4eWoUK3aF5u4+7BY235bFuoTj+sb 55DPDyWm5cmkX58Tdq46tD39dbD1hlUYkcydPbANH51wYx/lPpc= =OqYP -----END PGP SIGNATURE----- Merge tag 'pull-vfio-20250509' of https://github.com/legoater/qemu into staging vfio queue: * Preparatory changes for the introduction of CPR support * Automatic enablement of OpRegion for IGD device passthrough * Linux headers update * Preparatory changes for the introduction of vfio-user # -----BEGIN PGP SIGNATURE----- # # iQIzBAABCAAdFiEEoPZlSPBIlev+awtgUaNDx8/77KEFAmgd/0kACgkQUaNDx8/7 # 7KHRmRAArw1PXMCmoVBBeLcZ8BZPGjBZHtsvRzwS1yhVnNQadlpDlq4wd9HrfDFK # BTr7//Ag2Q1dKgibesh0A8hSjorXHUGQCmdkcCuGGTFnEwC86q5jCH1lUxgI0cs5 # 3bVwc43zhXGoKqmo07g4f2UFbjDYHe89LgWz2c7TFFGz7Tda/LCOdhnmXlXcIwz+ # v1ocutXd7VbDWvUzN7uZbf0SIH3Zj3p96dwmpLDtdzdliDA0JidNvS27+Z5gtvWe # O+1NW9MDzNfd6zLXCxL3GLeT61WZCe1dRCHEPX4cBo+DhnrifsC25DtJwYlDFvi2 # NMFfGzdKcEVSpeDp7WeM6MJgCZsGHC7ytmAKOKgN2M2kFSj3SI3sTFNlE1rzUhe6 # yjjCa59HzNLIi7L7xYCrVtCLGC/VXOp9kh67Sjs7FY7v778QUEdiudFBdBki7Bwh # bpRhdFJgCLHuKc6XrM7hsMnsRyM28MywyfHDo3M/pRSFNKfeImW6zSMXnyncZztK # W8e8OIz2DBMfH8pIu8hPw9Gsm5VAAs4aVmVFNa0CLl0oBko0Ew2YXcA5pTK5gGqv # x24uc/BhbLcfFUtK0OnP4N/B4rcoADebPV2u4eWoUK3aF5u4+7BY235bFuoTj+sb # 55DPDyWm5cmkX58Tdq46tD39dbD1hlUYkcydPbANH51wYx/lPpc= # =OqYP # -----END PGP SIGNATURE----- # gpg: Signature made Fri 09 May 2025 09:12:41 EDT # gpg: using RSA key A0F66548F04895EBFE6B0B6051A343C7CFFBECA1 # gpg: Good signature from "Cédric Le Goater <clg@redhat.com>" [full] # gpg: aka "Cédric Le Goater <clg@kaod.org>" [full] # Primary key fingerprint: A0F6 6548 F048 95EB FE6B 0B60 51A3 43C7 CFFB ECA1 * tag 'pull-vfio-20250509' of https://github.com/legoater/qemu: (28 commits) vfio/container: pass listener_begin/commit callbacks vfio: add vfio-pci-base class vfio: add read/write to device IO ops vector vfio: add region info cache vfio: add device IO ops vector vfio: implement unmap all for DMA unmap callbacks vfio: add unmap_all flag to DMA unmap callback vfio: add vfio_pci_config_space_read/write() vfio: add strread/writeerror() vfio: consistently handle return value for helpers vfio: add vfio_device_get_irq_info() helper vfio: add vfio_attach_device_by_iommu_type() vfio: add vfio_device_unprepare() vfio: add vfio_device_prepare() linux-headers: Update to Linux v6.15-rc3 linux-header: update-linux-header script changes vfio/igd: Remove generation limitation for IGD passthrough vfio/igd: Only emulate GGC register when x-igd-gms is set vfio/igd: Allow overriding GMS with 0xf0 to 0xfe on Gen9+ vfio/igd: Enable OpRegion by default ... Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
commit
7be29f2f1a
50 changed files with 1083 additions and 405 deletions
|
@ -81,7 +81,7 @@ int vfio_container_dma_map(VFIOContainerBase *bcontainer,
|
|||
void *vaddr, bool readonly);
|
||||
int vfio_container_dma_unmap(VFIOContainerBase *bcontainer,
|
||||
hwaddr iova, ram_addr_t size,
|
||||
IOMMUTLBEntry *iotlb);
|
||||
IOMMUTLBEntry *iotlb, bool unmap_all);
|
||||
bool vfio_container_add_section_window(VFIOContainerBase *bcontainer,
|
||||
MemoryRegionSection *section,
|
||||
Error **errp);
|
||||
|
@ -117,12 +117,25 @@ struct VFIOIOMMUClass {
|
|||
|
||||
/* basic feature */
|
||||
bool (*setup)(VFIOContainerBase *bcontainer, Error **errp);
|
||||
void (*listener_begin)(VFIOContainerBase *bcontainer);
|
||||
void (*listener_commit)(VFIOContainerBase *bcontainer);
|
||||
int (*dma_map)(const VFIOContainerBase *bcontainer,
|
||||
hwaddr iova, ram_addr_t size,
|
||||
void *vaddr, bool readonly);
|
||||
/**
|
||||
* @dma_unmap
|
||||
*
|
||||
* Unmap an address range from the container.
|
||||
*
|
||||
* @bcontainer: #VFIOContainerBase to use for unmap
|
||||
* @iova: start address to unmap
|
||||
* @size: size of the range to unmap
|
||||
* @iotlb: The IOMMU TLB mapping entry (or NULL)
|
||||
* @unmap_all: if set, unmap the entire address space
|
||||
*/
|
||||
int (*dma_unmap)(const VFIOContainerBase *bcontainer,
|
||||
hwaddr iova, ram_addr_t size,
|
||||
IOMMUTLBEntry *iotlb);
|
||||
IOMMUTLBEntry *iotlb, bool unmap_all);
|
||||
bool (*attach_device)(const char *name, VFIODevice *vbasedev,
|
||||
AddressSpace *as, Error **errp);
|
||||
void (*detach_device)(VFIODevice *vbasedev);
|
||||
|
|
|
@ -41,6 +41,7 @@ enum {
|
|||
};
|
||||
|
||||
typedef struct VFIODeviceOps VFIODeviceOps;
|
||||
typedef struct VFIODeviceIOOps VFIODeviceIOOps;
|
||||
typedef struct VFIOMigration VFIOMigration;
|
||||
|
||||
typedef struct IOMMUFDBackend IOMMUFDBackend;
|
||||
|
@ -66,6 +67,7 @@ typedef struct VFIODevice {
|
|||
OnOffAuto migration_multifd_transfer;
|
||||
bool migration_events;
|
||||
VFIODeviceOps *ops;
|
||||
VFIODeviceIOOps *io_ops;
|
||||
unsigned int num_irqs;
|
||||
unsigned int num_regions;
|
||||
unsigned int flags;
|
||||
|
@ -81,6 +83,7 @@ typedef struct VFIODevice {
|
|||
IOMMUFDBackend *iommufd;
|
||||
VFIOIOASHwpt *hwpt;
|
||||
QLIST_ENTRY(VFIODevice) hwpt_next;
|
||||
struct vfio_region_info **reginfo;
|
||||
} VFIODevice;
|
||||
|
||||
struct VFIODeviceOps {
|
||||
|
@ -115,6 +118,20 @@ struct VFIODeviceOps {
|
|||
int (*vfio_load_config)(VFIODevice *vdev, QEMUFile *f);
|
||||
};
|
||||
|
||||
/*
|
||||
* Given a return value of either a short number of bytes read or -errno,
|
||||
* construct a meaningful error message.
|
||||
*/
|
||||
#define strreaderror(ret) \
|
||||
(ret < 0 ? strerror(-ret) : "short read")
|
||||
|
||||
/*
|
||||
* Given a return value of either a short number of bytes written or -errno,
|
||||
* construct a meaningful error message.
|
||||
*/
|
||||
#define strwriteerror(ret) \
|
||||
(ret < 0 ? strerror(-ret) : "short write")
|
||||
|
||||
void vfio_device_irq_disable(VFIODevice *vbasedev, int index);
|
||||
void vfio_device_irq_unmask(VFIODevice *vbasedev, int index);
|
||||
void vfio_device_irq_mask(VFIODevice *vbasedev, int index);
|
||||
|
@ -127,6 +144,9 @@ bool vfio_device_hiod_create_and_realize(VFIODevice *vbasedev,
|
|||
const char *typename, Error **errp);
|
||||
bool vfio_device_attach(char *name, VFIODevice *vbasedev,
|
||||
AddressSpace *as, Error **errp);
|
||||
bool vfio_device_attach_by_iommu_type(const char *iommu_type, char *name,
|
||||
VFIODevice *vbasedev, AddressSpace *as,
|
||||
Error **errp);
|
||||
void vfio_device_detach(VFIODevice *vbasedev);
|
||||
VFIODevice *vfio_get_vfio_device(Object *obj);
|
||||
|
||||
|
@ -134,11 +154,73 @@ typedef QLIST_HEAD(VFIODeviceList, VFIODevice) VFIODeviceList;
|
|||
extern VFIODeviceList vfio_device_list;
|
||||
|
||||
#ifdef CONFIG_LINUX
|
||||
/*
|
||||
* How devices communicate with the server. The default option is through
|
||||
* ioctl() to the kernel VFIO driver, but vfio-user can use a socket to a remote
|
||||
* process.
|
||||
*/
|
||||
struct VFIODeviceIOOps {
|
||||
/**
|
||||
* @device_feature
|
||||
*
|
||||
* Fill in feature info for the given device.
|
||||
*/
|
||||
int (*device_feature)(VFIODevice *vdev, struct vfio_device_feature *);
|
||||
|
||||
/**
|
||||
* @get_region_info
|
||||
*
|
||||
* Fill in @info with information on the region given by @info->index.
|
||||
*/
|
||||
int (*get_region_info)(VFIODevice *vdev,
|
||||
struct vfio_region_info *info);
|
||||
|
||||
/**
|
||||
* @get_irq_info
|
||||
*
|
||||
* Fill in @irq with information on the IRQ given by @info->index.
|
||||
*/
|
||||
int (*get_irq_info)(VFIODevice *vdev, struct vfio_irq_info *irq);
|
||||
|
||||
/**
|
||||
* @set_irqs
|
||||
*
|
||||
* Configure IRQs as defined by @irqs.
|
||||
*/
|
||||
int (*set_irqs)(VFIODevice *vdev, struct vfio_irq_set *irqs);
|
||||
|
||||
/**
|
||||
* @region_read
|
||||
*
|
||||
* Read @size bytes from the region @nr at offset @off into the buffer
|
||||
* @data.
|
||||
*/
|
||||
int (*region_read)(VFIODevice *vdev, uint8_t nr, off_t off, uint32_t size,
|
||||
void *data);
|
||||
|
||||
/**
|
||||
* @region_write
|
||||
*
|
||||
* Write @size bytes to the region @nr at offset @off from the buffer
|
||||
* @data.
|
||||
*/
|
||||
int (*region_write)(VFIODevice *vdev, uint8_t nr, off_t off, uint32_t size,
|
||||
void *data);
|
||||
};
|
||||
|
||||
void vfio_device_prepare(VFIODevice *vbasedev, VFIOContainerBase *bcontainer,
|
||||
struct vfio_device_info *info);
|
||||
|
||||
void vfio_device_unprepare(VFIODevice *vbasedev);
|
||||
|
||||
int vfio_device_get_region_info(VFIODevice *vbasedev, int index,
|
||||
struct vfio_region_info **info);
|
||||
int vfio_device_get_region_info_type(VFIODevice *vbasedev, uint32_t type,
|
||||
uint32_t subtype, struct vfio_region_info **info);
|
||||
bool vfio_device_has_region_cap(VFIODevice *vbasedev, int region, uint16_t cap_type);
|
||||
|
||||
int vfio_device_get_irq_info(VFIODevice *vbasedev, int index,
|
||||
struct vfio_irq_info *info);
|
||||
#endif
|
||||
|
||||
/* Returns 0 on success, or a negative errno. */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue