1f61dddd7SZhenzhong Duan /* 2f61dddd7SZhenzhong Duan * VFIO BASE CONTAINER 3f61dddd7SZhenzhong Duan * 4f61dddd7SZhenzhong Duan * Copyright (C) 2023 Intel Corporation. 5f61dddd7SZhenzhong Duan * Copyright Red Hat, Inc. 2023 6f61dddd7SZhenzhong Duan * 7f61dddd7SZhenzhong Duan * Authors: Yi Liu <yi.l.liu@intel.com> 8f61dddd7SZhenzhong Duan * Eric Auger <eric.auger@redhat.com> 9f61dddd7SZhenzhong Duan * 10f61dddd7SZhenzhong Duan * SPDX-License-Identifier: GPL-2.0-or-later 11f61dddd7SZhenzhong Duan */ 12f61dddd7SZhenzhong Duan 13f61dddd7SZhenzhong Duan #ifndef HW_VFIO_VFIO_CONTAINER_BASE_H 14f61dddd7SZhenzhong Duan #define HW_VFIO_VFIO_CONTAINER_BASE_H 15f61dddd7SZhenzhong Duan 16f61dddd7SZhenzhong Duan #include "exec/memory.h" 17f61dddd7SZhenzhong Duan 18f61dddd7SZhenzhong Duan typedef struct VFIODevice VFIODevice; 19f61dddd7SZhenzhong Duan typedef struct VFIOIOMMUOps VFIOIOMMUOps; 20f61dddd7SZhenzhong Duan 21f61dddd7SZhenzhong Duan typedef struct { 22f61dddd7SZhenzhong Duan unsigned long *bitmap; 23f61dddd7SZhenzhong Duan hwaddr size; 24f61dddd7SZhenzhong Duan hwaddr pages; 25f61dddd7SZhenzhong Duan } VFIOBitmap; 26f61dddd7SZhenzhong Duan 27e5597063SEric Auger typedef struct VFIOAddressSpace { 28e5597063SEric Auger AddressSpace *as; 29e5597063SEric Auger QLIST_HEAD(, VFIOContainerBase) containers; 30e5597063SEric Auger QLIST_ENTRY(VFIOAddressSpace) list; 31e5597063SEric Auger } VFIOAddressSpace; 32e5597063SEric Auger 33f61dddd7SZhenzhong Duan /* 34f61dddd7SZhenzhong Duan * This is the base object for vfio container backends 35f61dddd7SZhenzhong Duan */ 36f61dddd7SZhenzhong Duan typedef struct VFIOContainerBase { 37f61dddd7SZhenzhong Duan const VFIOIOMMUOps *ops; 38e5597063SEric Auger VFIOAddressSpace *space; 397ab1cb74SEric Auger unsigned long pgsizes; 407ab1cb74SEric Auger unsigned int dma_max_mappings; 41bb424490SEric Auger bool dirty_pages_supported; 42dddf83abSEric Auger QLIST_HEAD(, VFIOGuestIOMMU) giommu_list; 43*dc74a4b0SZhenzhong Duan QLIST_HEAD(, VFIORamDiscardListener) vrdl_list; 44e5597063SEric Auger QLIST_ENTRY(VFIOContainerBase) next; 453e6015d1SZhenzhong Duan QLIST_HEAD(, VFIODevice) device_list; 46f61dddd7SZhenzhong Duan } VFIOContainerBase; 47f61dddd7SZhenzhong Duan 48dddf83abSEric Auger typedef struct VFIOGuestIOMMU { 49dddf83abSEric Auger VFIOContainerBase *bcontainer; 50dddf83abSEric Auger IOMMUMemoryRegion *iommu_mr; 51dddf83abSEric Auger hwaddr iommu_offset; 52dddf83abSEric Auger IOMMUNotifier n; 53dddf83abSEric Auger QLIST_ENTRY(VFIOGuestIOMMU) giommu_next; 54dddf83abSEric Auger } VFIOGuestIOMMU; 55dddf83abSEric Auger 56*dc74a4b0SZhenzhong Duan typedef struct VFIORamDiscardListener { 57*dc74a4b0SZhenzhong Duan VFIOContainerBase *bcontainer; 58*dc74a4b0SZhenzhong Duan MemoryRegion *mr; 59*dc74a4b0SZhenzhong Duan hwaddr offset_within_address_space; 60*dc74a4b0SZhenzhong Duan hwaddr size; 61*dc74a4b0SZhenzhong Duan uint64_t granularity; 62*dc74a4b0SZhenzhong Duan RamDiscardListener listener; 63*dc74a4b0SZhenzhong Duan QLIST_ENTRY(VFIORamDiscardListener) next; 64*dc74a4b0SZhenzhong Duan } VFIORamDiscardListener; 65*dc74a4b0SZhenzhong Duan 66b08501a9SEric Auger int vfio_container_dma_map(VFIOContainerBase *bcontainer, 67b08501a9SEric Auger hwaddr iova, ram_addr_t size, 68b08501a9SEric Auger void *vaddr, bool readonly); 69b08501a9SEric Auger int vfio_container_dma_unmap(VFIOContainerBase *bcontainer, 70b08501a9SEric Auger hwaddr iova, ram_addr_t size, 71b08501a9SEric Auger IOMMUTLBEntry *iotlb); 72bb424490SEric Auger int vfio_container_set_dirty_page_tracking(VFIOContainerBase *bcontainer, 73bb424490SEric Auger bool start); 74bb424490SEric Auger int vfio_container_query_dirty_bitmap(VFIOContainerBase *bcontainer, 75bb424490SEric Auger VFIOBitmap *vbmap, 76bb424490SEric Auger hwaddr iova, hwaddr size); 77b08501a9SEric Auger 78ed2f7f80SZhenzhong Duan void vfio_container_init(VFIOContainerBase *bcontainer, 79e5597063SEric Auger VFIOAddressSpace *space, 80ed2f7f80SZhenzhong Duan const VFIOIOMMUOps *ops); 81ed2f7f80SZhenzhong Duan void vfio_container_destroy(VFIOContainerBase *bcontainer); 82ed2f7f80SZhenzhong Duan 83f61dddd7SZhenzhong Duan struct VFIOIOMMUOps { 84f61dddd7SZhenzhong Duan /* basic feature */ 85f61dddd7SZhenzhong Duan int (*dma_map)(VFIOContainerBase *bcontainer, 86f61dddd7SZhenzhong Duan hwaddr iova, ram_addr_t size, 87f61dddd7SZhenzhong Duan void *vaddr, bool readonly); 88f61dddd7SZhenzhong Duan int (*dma_unmap)(VFIOContainerBase *bcontainer, 89f61dddd7SZhenzhong Duan hwaddr iova, ram_addr_t size, 90f61dddd7SZhenzhong Duan IOMMUTLBEntry *iotlb); 91f61dddd7SZhenzhong Duan int (*attach_device)(const char *name, VFIODevice *vbasedev, 92f61dddd7SZhenzhong Duan AddressSpace *as, Error **errp); 93f61dddd7SZhenzhong Duan void (*detach_device)(VFIODevice *vbasedev); 94f61dddd7SZhenzhong Duan /* migration feature */ 95f61dddd7SZhenzhong Duan int (*set_dirty_page_tracking)(VFIOContainerBase *bcontainer, bool start); 96f61dddd7SZhenzhong Duan int (*query_dirty_bitmap)(VFIOContainerBase *bcontainer, VFIOBitmap *vbmap, 97f61dddd7SZhenzhong Duan hwaddr iova, hwaddr size); 98f61dddd7SZhenzhong Duan }; 99f61dddd7SZhenzhong Duan #endif /* HW_VFIO_VFIO_CONTAINER_BASE_H */ 100