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