10bbe3066SJason Wang /* SPDX-License-Identifier: GPL-2.0 */ 20bbe3066SJason Wang #ifndef _LINUX_VHOST_IOTLB_H 30bbe3066SJason Wang #define _LINUX_VHOST_IOTLB_H 40bbe3066SJason Wang 50bbe3066SJason Wang #include <linux/interval_tree_generic.h> 60bbe3066SJason Wang 70bbe3066SJason Wang struct vhost_iotlb_map { 80bbe3066SJason Wang struct rb_node rb; 90bbe3066SJason Wang struct list_head link; 100bbe3066SJason Wang u64 start; 110bbe3066SJason Wang u64 last; 120bbe3066SJason Wang u64 size; 130bbe3066SJason Wang u64 addr; 140bbe3066SJason Wang #define VHOST_MAP_RO 0x1 150bbe3066SJason Wang #define VHOST_MAP_WO 0x2 160bbe3066SJason Wang #define VHOST_MAP_RW 0x3 170bbe3066SJason Wang u32 perm; 180bbe3066SJason Wang u32 flags_padding; 190bbe3066SJason Wang u64 __subtree_last; 2059dfe4f1SXie Yongji void *opaque; 210bbe3066SJason Wang }; 220bbe3066SJason Wang 230bbe3066SJason Wang #define VHOST_IOTLB_FLAG_RETIRE 0x1 240bbe3066SJason Wang 250bbe3066SJason Wang struct vhost_iotlb { 260bbe3066SJason Wang struct rb_root_cached root; 270bbe3066SJason Wang struct list_head list; 280bbe3066SJason Wang unsigned int limit; 290bbe3066SJason Wang unsigned int nmaps; 300bbe3066SJason Wang unsigned int flags; 310bbe3066SJason Wang }; 320bbe3066SJason Wang 3359dfe4f1SXie Yongji int vhost_iotlb_add_range_ctx(struct vhost_iotlb *iotlb, u64 start, u64 last, 3459dfe4f1SXie Yongji u64 addr, unsigned int perm, void *opaque); 350bbe3066SJason Wang int vhost_iotlb_add_range(struct vhost_iotlb *iotlb, u64 start, u64 last, 360bbe3066SJason Wang u64 addr, unsigned int perm); 370bbe3066SJason Wang void vhost_iotlb_del_range(struct vhost_iotlb *iotlb, u64 start, u64 last); 380bbe3066SJason Wang 39*1cb10899SGautam Dawar void vhost_iotlb_init(struct vhost_iotlb *iotlb, unsigned int limit, 40*1cb10899SGautam Dawar unsigned int flags); 410bbe3066SJason Wang struct vhost_iotlb *vhost_iotlb_alloc(unsigned int limit, unsigned int flags); 420bbe3066SJason Wang void vhost_iotlb_free(struct vhost_iotlb *iotlb); 430bbe3066SJason Wang void vhost_iotlb_reset(struct vhost_iotlb *iotlb); 440bbe3066SJason Wang 450bbe3066SJason Wang struct vhost_iotlb_map * 460bbe3066SJason Wang vhost_iotlb_itree_first(struct vhost_iotlb *iotlb, u64 start, u64 last); 470bbe3066SJason Wang struct vhost_iotlb_map * 480bbe3066SJason Wang vhost_iotlb_itree_next(struct vhost_iotlb_map *map, u64 start, u64 last); 490bbe3066SJason Wang 500bbe3066SJason Wang void vhost_iotlb_map_free(struct vhost_iotlb *iotlb, 510bbe3066SJason Wang struct vhost_iotlb_map *map); 520bbe3066SJason Wang #endif 53