1 /*
2  * This file is auto-generated. Modifications will be lost.
3  *
4  * See https://android.googlesource.com/platform/bionic/+/master/libc/kernel/
5  * for more information.
6  */
7 #ifndef _UAPI_VDUSE_H_
8 #define _UAPI_VDUSE_H_
9 #include <linux/types.h>
10 #define VDUSE_BASE 0x81
11 #define VDUSE_API_VERSION 0
12 #define VDUSE_GET_API_VERSION _IOR(VDUSE_BASE, 0x00, __u64)
13 #define VDUSE_SET_API_VERSION _IOW(VDUSE_BASE, 0x01, __u64)
14 struct vduse_dev_config {
15 #define VDUSE_NAME_MAX 256
16   char name[VDUSE_NAME_MAX];
17   __u32 vendor_id;
18   __u32 device_id;
19   __u64 features;
20   __u32 vq_num;
21   __u32 vq_align;
22   __u32 reserved[13];
23   __u32 config_size;
24   __u8 config[];
25 };
26 #define VDUSE_CREATE_DEV _IOW(VDUSE_BASE, 0x02, struct vduse_dev_config)
27 #define VDUSE_DESTROY_DEV _IOW(VDUSE_BASE, 0x03, char[VDUSE_NAME_MAX])
28 struct vduse_iotlb_entry {
29   __u64 offset;
30   __u64 start;
31   __u64 last;
32 #define VDUSE_ACCESS_RO 0x1
33 #define VDUSE_ACCESS_WO 0x2
34 #define VDUSE_ACCESS_RW 0x3
35   __u8 perm;
36 };
37 #define VDUSE_IOTLB_GET_FD _IOWR(VDUSE_BASE, 0x10, struct vduse_iotlb_entry)
38 #define VDUSE_DEV_GET_FEATURES _IOR(VDUSE_BASE, 0x11, __u64)
39 struct vduse_config_data {
40   __u32 offset;
41   __u32 length;
42   __u8 buffer[];
43 };
44 #define VDUSE_DEV_SET_CONFIG _IOW(VDUSE_BASE, 0x12, struct vduse_config_data)
45 #define VDUSE_DEV_INJECT_CONFIG_IRQ _IO(VDUSE_BASE, 0x13)
46 struct vduse_vq_config {
47   __u32 index;
48   __u16 max_size;
49   __u16 reserved[13];
50 };
51 #define VDUSE_VQ_SETUP _IOW(VDUSE_BASE, 0x14, struct vduse_vq_config)
52 struct vduse_vq_state_split {
53   __u16 avail_index;
54 };
55 struct vduse_vq_state_packed {
56   __u16 last_avail_counter;
57   __u16 last_avail_idx;
58   __u16 last_used_counter;
59   __u16 last_used_idx;
60 };
61 struct vduse_vq_info {
62   __u32 index;
63   __u32 num;
64   __u64 desc_addr;
65   __u64 driver_addr;
66   __u64 device_addr;
67   union {
68     struct vduse_vq_state_split split;
69     struct vduse_vq_state_packed packed;
70   };
71   __u8 ready;
72 };
73 #define VDUSE_VQ_GET_INFO _IOWR(VDUSE_BASE, 0x15, struct vduse_vq_info)
74 struct vduse_vq_eventfd {
75   __u32 index;
76 #define VDUSE_EVENTFD_DEASSIGN - 1
77   int fd;
78 };
79 #define VDUSE_VQ_SETUP_KICKFD _IOW(VDUSE_BASE, 0x16, struct vduse_vq_eventfd)
80 #define VDUSE_VQ_INJECT_IRQ _IOW(VDUSE_BASE, 0x17, __u32)
81 struct vduse_iova_umem {
82   __u64 uaddr;
83   __u64 iova;
84   __u64 size;
85   __u64 reserved[3];
86 };
87 #define VDUSE_IOTLB_REG_UMEM _IOW(VDUSE_BASE, 0x18, struct vduse_iova_umem)
88 #define VDUSE_IOTLB_DEREG_UMEM _IOW(VDUSE_BASE, 0x19, struct vduse_iova_umem)
89 struct vduse_iova_info {
90   __u64 start;
91   __u64 last;
92 #define VDUSE_IOVA_CAP_UMEM (1 << 0)
93   __u64 capability;
94   __u64 reserved[3];
95 };
96 #define VDUSE_IOTLB_GET_INFO _IOWR(VDUSE_BASE, 0x1a, struct vduse_iova_info)
97 enum vduse_req_type {
98   VDUSE_GET_VQ_STATE,
99   VDUSE_SET_STATUS,
100   VDUSE_UPDATE_IOTLB,
101 };
102 struct vduse_vq_state {
103   __u32 index;
104   union {
105     struct vduse_vq_state_split split;
106     struct vduse_vq_state_packed packed;
107   };
108 };
109 struct vduse_dev_status {
110   __u8 status;
111 };
112 struct vduse_iova_range {
113   __u64 start;
114   __u64 last;
115 };
116 struct vduse_dev_request {
117   __u32 type;
118   __u32 request_id;
119   __u32 reserved[4];
120   union {
121     struct vduse_vq_state vq_state;
122     struct vduse_dev_status s;
123     struct vduse_iova_range iova;
124     __u32 padding[32];
125   };
126 };
127 struct vduse_dev_response {
128   __u32 request_id;
129 #define VDUSE_REQ_RESULT_OK 0x00
130 #define VDUSE_REQ_RESULT_FAILED 0x01
131   __u32 result;
132   __u32 reserved[4];
133   union {
134     struct vduse_vq_state vq_state;
135     __u32 padding[32];
136   };
137 };
138 #endif
139