1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #ifndef _LINUX_VHOST_IOTLB_H 3 #define _LINUX_VHOST_IOTLB_H 4 5 #include <linux/interval_tree_generic.h> 6 7 struct vhost_iotlb_map { 8 struct rb_node rb; 9 struct list_head link; 10 u64 start; 11 u64 last; 12 u64 size; 13 u64 addr; 14 #define VHOST_MAP_RO 0x1 15 #define VHOST_MAP_WO 0x2 16 #define VHOST_MAP_RW 0x3 17 u32 perm; 18 u32 flags_padding; 19 u64 __subtree_last; 20 }; 21 22 #define VHOST_IOTLB_FLAG_RETIRE 0x1 23 24 struct vhost_iotlb { 25 struct rb_root_cached root; 26 struct list_head list; 27 unsigned int limit; 28 unsigned int nmaps; 29 unsigned int flags; 30 }; 31 32 int vhost_iotlb_add_range(struct vhost_iotlb *iotlb, u64 start, u64 last, 33 u64 addr, unsigned int perm); 34 void vhost_iotlb_del_range(struct vhost_iotlb *iotlb, u64 start, u64 last); 35 36 struct vhost_iotlb *vhost_iotlb_alloc(unsigned int limit, unsigned int flags); 37 void vhost_iotlb_free(struct vhost_iotlb *iotlb); 38 void vhost_iotlb_reset(struct vhost_iotlb *iotlb); 39 40 struct vhost_iotlb_map * 41 vhost_iotlb_itree_first(struct vhost_iotlb *iotlb, u64 start, u64 last); 42 struct vhost_iotlb_map * 43 vhost_iotlb_itree_next(struct vhost_iotlb_map *map, u64 start, u64 last); 44 45 void vhost_iotlb_map_free(struct vhost_iotlb *iotlb, 46 struct vhost_iotlb_map *map); 47 #endif 48