xref: /linux-6.15/include/linux/vhost_iotlb.h (revision 1cb10899)
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