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 VFIOIOMMUOps VFIOIOMMUOps
;
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 VFIOIOMMUOps
*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
;
54 typedef struct VFIOGuestIOMMU
{
55 VFIOContainerBase
*bcontainer
;
56 IOMMUMemoryRegion
*iommu_mr
;
59 QLIST_ENTRY(VFIOGuestIOMMU
) giommu_next
;
62 typedef struct VFIORamDiscardListener
{
63 VFIOContainerBase
*bcontainer
;
65 hwaddr offset_within_address_space
;
68 RamDiscardListener listener
;
69 QLIST_ENTRY(VFIORamDiscardListener
) next
;
70 } VFIORamDiscardListener
;
72 int vfio_container_dma_map(VFIOContainerBase
*bcontainer
,
73 hwaddr iova
, ram_addr_t size
,
74 void *vaddr
, bool readonly
);
75 int vfio_container_dma_unmap(VFIOContainerBase
*bcontainer
,
76 hwaddr iova
, ram_addr_t size
,
77 IOMMUTLBEntry
*iotlb
);
78 int vfio_container_set_dirty_page_tracking(VFIOContainerBase
*bcontainer
,
80 int vfio_container_query_dirty_bitmap(VFIOContainerBase
*bcontainer
,
82 hwaddr iova
, hwaddr size
);
84 void vfio_container_init(VFIOContainerBase
*bcontainer
,
85 VFIOAddressSpace
*space
,
86 const VFIOIOMMUOps
*ops
);
87 void vfio_container_destroy(VFIOContainerBase
*bcontainer
);
91 int (*dma_map
)(VFIOContainerBase
*bcontainer
,
92 hwaddr iova
, ram_addr_t size
,
93 void *vaddr
, bool readonly
);
94 int (*dma_unmap
)(VFIOContainerBase
*bcontainer
,
95 hwaddr iova
, ram_addr_t size
,
96 IOMMUTLBEntry
*iotlb
);
97 int (*attach_device
)(const char *name
, VFIODevice
*vbasedev
,
98 AddressSpace
*as
, Error
**errp
);
99 void (*detach_device
)(VFIODevice
*vbasedev
);
100 /* migration feature */
101 int (*set_dirty_page_tracking
)(VFIOContainerBase
*bcontainer
, bool start
);
102 int (*query_dirty_bitmap
)(VFIOContainerBase
*bcontainer
, VFIOBitmap
*vbmap
,
103 hwaddr iova
, hwaddr size
);
105 int (*add_window
)(VFIOContainerBase
*bcontainer
,
106 MemoryRegionSection
*section
,
108 void (*del_window
)(VFIOContainerBase
*bcontainer
,
109 MemoryRegionSection
*section
);
111 #endif /* HW_VFIO_VFIO_CONTAINER_BASE_H */