4 * Copyright (C) 2023 Intel Corporation.
5 * Copyright Red Hat, Inc. 2023
7 * Authors: Yi Liu <yi.l.liu@intel.com>
8 * Eric Auger <eric.auger@redhat.com>
10 * SPDX-License-Identifier: GPL-2.0-or-later
13 #ifndef HW_VFIO_VFIO_CONTAINER_BASE_H
14 #define HW_VFIO_VFIO_CONTAINER_BASE_H
16 #include "exec/memory.h"
18 typedef struct VFIODevice VFIODevice
;
19 typedef struct VFIOIOMMUClass VFIOIOMMUClass
;
22 unsigned long *bitmap
;
27 typedef struct VFIOAddressSpace
{
29 QLIST_HEAD(, VFIOContainerBase
) containers
;
30 QLIST_ENTRY(VFIOAddressSpace
) list
;
34 * This is the base object for vfio container backends
36 typedef struct VFIOContainerBase
{
37 const VFIOIOMMUClass
*ops
;
38 VFIOAddressSpace
*space
;
39 MemoryListener listener
;
42 uint64_t dirty_pgsizes
;
43 uint64_t max_dirty_bitmap_size
;
44 unsigned long pgsizes
;
45 unsigned int dma_max_mappings
;
46 bool dirty_pages_supported
;
47 QLIST_HEAD(, VFIOGuestIOMMU
) giommu_list
;
48 QLIST_HEAD(, VFIORamDiscardListener
) vrdl_list
;
49 QLIST_ENTRY(VFIOContainerBase
) next
;
50 QLIST_HEAD(, VFIODevice
) device_list
;
52 NotifierWithReturn cpr_reboot_notifier
;
55 typedef struct VFIOGuestIOMMU
{
56 VFIOContainerBase
*bcontainer
;
57 IOMMUMemoryRegion
*iommu_mr
;
60 QLIST_ENTRY(VFIOGuestIOMMU
) giommu_next
;
63 typedef struct VFIORamDiscardListener
{
64 VFIOContainerBase
*bcontainer
;
66 hwaddr offset_within_address_space
;
69 RamDiscardListener listener
;
70 QLIST_ENTRY(VFIORamDiscardListener
) next
;
71 } VFIORamDiscardListener
;
73 int vfio_container_dma_map(VFIOContainerBase
*bcontainer
,
74 hwaddr iova
, ram_addr_t size
,
75 void *vaddr
, bool readonly
);
76 int vfio_container_dma_unmap(VFIOContainerBase
*bcontainer
,
77 hwaddr iova
, ram_addr_t size
,
78 IOMMUTLBEntry
*iotlb
);
79 bool vfio_container_add_section_window(VFIOContainerBase
*bcontainer
,
80 MemoryRegionSection
*section
,
82 void vfio_container_del_section_window(VFIOContainerBase
*bcontainer
,
83 MemoryRegionSection
*section
);
84 int vfio_container_set_dirty_page_tracking(VFIOContainerBase
*bcontainer
,
85 bool start
, Error
**errp
);
86 int vfio_container_query_dirty_bitmap(const VFIOContainerBase
*bcontainer
,
87 VFIOBitmap
*vbmap
, hwaddr iova
, hwaddr size
, Error
**errp
);
89 void vfio_container_init(VFIOContainerBase
*bcontainer
,
90 VFIOAddressSpace
*space
,
91 const VFIOIOMMUClass
*ops
);
92 void vfio_container_destroy(VFIOContainerBase
*bcontainer
);
95 #define TYPE_VFIO_IOMMU "vfio-iommu"
96 #define TYPE_VFIO_IOMMU_LEGACY TYPE_VFIO_IOMMU "-legacy"
97 #define TYPE_VFIO_IOMMU_SPAPR TYPE_VFIO_IOMMU "-spapr"
98 #define TYPE_VFIO_IOMMU_IOMMUFD TYPE_VFIO_IOMMU "-iommufd"
101 * VFIOContainerBase is not an abstract QOM object because it felt
102 * unnecessary to expose all the IOMMU backends to the QEMU machine
103 * and human interface. However, we can still abstract the IOMMU
104 * backend handlers using a QOM interface class. This provides more
105 * flexibility when referencing the various implementations.
107 DECLARE_CLASS_CHECKERS(VFIOIOMMUClass
, VFIO_IOMMU
, TYPE_VFIO_IOMMU
)
109 struct VFIOIOMMUClass
{
110 InterfaceClass parent_class
;
113 const char *hiod_typename
;
116 bool (*setup
)(VFIOContainerBase
*bcontainer
, Error
**errp
);
117 int (*dma_map
)(const VFIOContainerBase
*bcontainer
,
118 hwaddr iova
, ram_addr_t size
,
119 void *vaddr
, bool readonly
);
120 int (*dma_unmap
)(const VFIOContainerBase
*bcontainer
,
121 hwaddr iova
, ram_addr_t size
,
122 IOMMUTLBEntry
*iotlb
);
123 bool (*attach_device
)(const char *name
, VFIODevice
*vbasedev
,
124 AddressSpace
*as
, Error
**errp
);
125 void (*detach_device
)(VFIODevice
*vbasedev
);
127 /* migration feature */
130 * @set_dirty_page_tracking
132 * Start or stop dirty pages tracking on VFIO container
134 * @bcontainer: #VFIOContainerBase on which to de/activate dirty
136 * @start: indicates whether to start or stop dirty pages tracking
137 * @errp: pointer to Error*, to store an error if it happens.
139 * Returns zero to indicate success and negative for error
141 int (*set_dirty_page_tracking
)(const VFIOContainerBase
*bcontainer
,
142 bool start
, Error
**errp
);
144 * @query_dirty_bitmap
146 * Get bitmap of dirty pages from container
148 * @bcontainer: #VFIOContainerBase from which to get dirty pages
149 * @vbmap: #VFIOBitmap internal bitmap structure
150 * @iova: iova base address
151 * @size: size of iova range
152 * @errp: pointer to Error*, to store an error if it happens.
154 * Returns zero to indicate success and negative for error
156 int (*query_dirty_bitmap
)(const VFIOContainerBase
*bcontainer
,
157 VFIOBitmap
*vbmap
, hwaddr iova
, hwaddr size
, Error
**errp
);
159 int (*pci_hot_reset
)(VFIODevice
*vbasedev
, bool single
);
162 bool (*add_window
)(VFIOContainerBase
*bcontainer
,
163 MemoryRegionSection
*section
,
165 void (*del_window
)(VFIOContainerBase
*bcontainer
,
166 MemoryRegionSection
*section
);
167 void (*release
)(VFIOContainerBase
*bcontainer
);
169 #endif /* HW_VFIO_VFIO_CONTAINER_BASE_H */