New upstream version 17.11-rc3
[deb_dpdk.git] / lib / librte_eal / linuxapp / eal / eal_vfio.h
1 /*-
2  *   BSD LICENSE
3  *
4  *   Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
5  *   All rights reserved.
6  *
7  *   Redistribution and use in source and binary forms, with or without
8  *   modification, are permitted provided that the following conditions
9  *   are met:
10  *
11  *     * Redistributions of source code must retain the above copyright
12  *       notice, this list of conditions and the following disclaimer.
13  *     * Redistributions in binary form must reproduce the above copyright
14  *       notice, this list of conditions and the following disclaimer in
15  *       the documentation and/or other materials provided with the
16  *       distribution.
17  *     * Neither the name of Intel Corporation nor the names of its
18  *       contributors may be used to endorse or promote products derived
19  *       from this software without specific prior written permission.
20  *
21  *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22  *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23  *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24  *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25  *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26  *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27  *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28  *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29  *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30  *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31  *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32  */
33
34 #ifndef EAL_VFIO_H_
35 #define EAL_VFIO_H_
36
37 /*
38  * determine if VFIO is present on the system
39  */
40 #if !defined(VFIO_PRESENT) && defined(RTE_EAL_VFIO)
41 #include <linux/version.h>
42 #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)
43 #define VFIO_PRESENT
44 #else
45 #pragma message("VFIO configured but not supported by this kernel, disabling.")
46 #endif /* kernel version >= 3.6.0 */
47 #endif /* RTE_EAL_VFIO */
48
49 #ifdef VFIO_PRESENT
50
51 #include <linux/vfio.h>
52
53 #define RTE_VFIO_TYPE1 VFIO_TYPE1_IOMMU
54
55 #ifndef VFIO_SPAPR_TCE_v2_IOMMU
56 #define RTE_VFIO_SPAPR 7
57 #define VFIO_IOMMU_SPAPR_REGISTER_MEMORY _IO(VFIO_TYPE, VFIO_BASE + 17)
58 #define VFIO_IOMMU_SPAPR_TCE_CREATE _IO(VFIO_TYPE, VFIO_BASE + 19)
59 #define VFIO_IOMMU_SPAPR_TCE_REMOVE _IO(VFIO_TYPE, VFIO_BASE + 20)
60
61 struct vfio_iommu_spapr_register_memory {
62         uint32_t argsz;
63         uint32_t flags;
64         uint64_t vaddr;
65         uint64_t size;
66 };
67
68 struct vfio_iommu_spapr_tce_create {
69         uint32_t argsz;
70         uint32_t flags;
71         /* in */
72         uint32_t page_shift;
73         uint32_t __resv1;
74         uint64_t window_size;
75         uint32_t levels;
76         uint32_t __resv2;
77         /* out */
78         uint64_t start_addr;
79 };
80
81 struct vfio_iommu_spapr_tce_remove {
82         uint32_t argsz;
83         uint32_t flags;
84         /* in */
85         uint64_t start_addr;
86 };
87
88 struct vfio_iommu_spapr_tce_ddw_info {
89         uint64_t pgsizes;
90         uint32_t max_dynamic_windows_supported;
91         uint32_t levels;
92 };
93
94 /* SPAPR_v2 is not present, but SPAPR might be */
95 #ifndef VFIO_SPAPR_TCE_IOMMU
96 #define VFIO_IOMMU_SPAPR_TCE_GET_INFO _IO(VFIO_TYPE, VFIO_BASE + 12)
97
98 struct vfio_iommu_spapr_tce_info {
99         uint32_t argsz;
100         uint32_t flags;
101         uint32_t dma32_window_start;
102         uint32_t dma32_window_size;
103         struct vfio_iommu_spapr_tce_ddw_info ddw;
104 };
105 #endif /* VFIO_SPAPR_TCE_IOMMU */
106
107 #else /* VFIO_SPAPR_TCE_v2_IOMMU */
108 #define RTE_VFIO_SPAPR VFIO_SPAPR_TCE_v2_IOMMU
109 #endif
110
111 #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 5, 0)
112 #define RTE_VFIO_NOIOMMU 8
113 #else
114 #define RTE_VFIO_NOIOMMU VFIO_NOIOMMU_IOMMU
115 #endif
116
117 #define VFIO_MAX_GROUPS 64
118
119 /*
120  * Function prototypes for VFIO multiprocess sync functions
121  */
122 int vfio_mp_sync_send_request(int socket, int req);
123 int vfio_mp_sync_receive_request(int socket);
124 int vfio_mp_sync_send_fd(int socket, int fd);
125 int vfio_mp_sync_receive_fd(int socket);
126 int vfio_mp_sync_connect_to_primary(void);
127
128 /*
129  * we don't need to store device fd's anywhere since they can be obtained from
130  * the group fd via an ioctl() call.
131  */
132 struct vfio_group {
133         int group_no;
134         int fd;
135         int devices;
136 };
137
138 struct vfio_config {
139         int vfio_enabled;
140         int vfio_container_fd;
141         int vfio_active_groups;
142         struct vfio_group vfio_groups[VFIO_MAX_GROUPS];
143 };
144
145 /* DMA mapping function prototype.
146  * Takes VFIO container fd as a parameter.
147  * Returns 0 on success, -1 on error.
148  * */
149 typedef int (*vfio_dma_func_t)(int);
150
151 struct vfio_iommu_type {
152         int type_id;
153         const char *name;
154         vfio_dma_func_t dma_map_func;
155 };
156
157 /* pick IOMMU type. returns a pointer to vfio_iommu_type or NULL for error */
158 const struct vfio_iommu_type *
159 vfio_set_iommu_type(int vfio_container_fd);
160
161 /* check if we have any supported extensions */
162 int
163 vfio_has_supported_extensions(int vfio_container_fd);
164
165 /* open container fd or get an existing one */
166 int
167 vfio_get_container_fd(void);
168
169 /* parse IOMMU group number for a device
170  * returns 1 on success, -1 for errors, 0 for non-existent group
171  */
172 int
173 vfio_get_group_no(const char *sysfs_base,
174                 const char *dev_addr, int *iommu_group_no);
175
176 /* open group fd or get an existing one */
177 int
178 vfio_get_group_fd(int iommu_group_no);
179
180 /* remove group fd from internal VFIO group fd array */
181 int
182 clear_group(int vfio_group_fd);
183
184 int vfio_mp_sync_setup(void);
185
186 #define SOCKET_REQ_CONTAINER 0x100
187 #define SOCKET_REQ_GROUP 0x200
188 #define SOCKET_CLR_GROUP 0x300
189 #define SOCKET_OK 0x0
190 #define SOCKET_NO_FD 0x1
191 #define SOCKET_ERR 0xFF
192
193 #endif /* VFIO_PRESENT */
194
195 #endif /* EAL_VFIO_H_ */