DPDK 23.11.0
Loading...
Searching...
No Matches
rte_vfio.h
Go to the documentation of this file.
1/* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2017 6WIND S.A.
3 */
4
5#ifndef _RTE_VFIO_H_
6#define _RTE_VFIO_H_
7
13#ifdef __cplusplus
14extern "C" {
15#endif
16
17#include <stdbool.h>
18#include <stdint.h>
19
20/*
21 * determine if VFIO is present on the system
22 */
23#if !defined(VFIO_PRESENT) && defined(RTE_EAL_VFIO)
24#include <linux/version.h>
25#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)
26#define VFIO_PRESENT
27#endif /* kernel version >= 3.6.0 */
28#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 0, 0)
29#define HAVE_VFIO_DEV_REQ_INTERFACE
30#endif /* kernel version >= 4.0.0 */
31#endif /* RTE_EAL_VFIO */
32
33#ifdef VFIO_PRESENT
34
35#include <linux/vfio.h>
36
37#define VFIO_DIR "/dev/vfio"
38#define VFIO_CONTAINER_PATH "/dev/vfio/vfio"
39#define VFIO_GROUP_FMT "/dev/vfio/%u"
40#define VFIO_NOIOMMU_GROUP_FMT "/dev/vfio/noiommu-%u"
41#define VFIO_GET_REGION_IDX(x) (x >> 40)
42#define VFIO_NOIOMMU_MODE \
43 "/sys/module/vfio/parameters/enable_unsafe_noiommu_mode"
44
45/* NOIOMMU is defined from kernel version 4.5 onwards */
46#ifdef VFIO_NOIOMMU_IOMMU
47#define RTE_VFIO_NOIOMMU VFIO_NOIOMMU_IOMMU
48#else
49#define RTE_VFIO_NOIOMMU 8
50#endif
51
52/*
53 * capabilities are only supported on kernel 4.6+. there were also some API
54 * changes as well, so add a macro to get cap offset.
55 */
56#ifdef VFIO_REGION_INFO_FLAG_CAPS
57#define RTE_VFIO_INFO_FLAG_CAPS VFIO_REGION_INFO_FLAG_CAPS
58#define VFIO_CAP_OFFSET(x) (x->cap_offset)
59#else
60#define RTE_VFIO_INFO_FLAG_CAPS (1 << 3)
61#define VFIO_CAP_OFFSET(x) (x->resv)
62struct vfio_info_cap_header {
63 uint16_t id;
64 uint16_t version;
65 uint32_t next;
66};
67#endif
68
69/* kernels 4.16+ can map BAR containing MSI-X table */
70#ifdef VFIO_REGION_INFO_CAP_MSIX_MAPPABLE
71#define RTE_VFIO_CAP_MSIX_MAPPABLE VFIO_REGION_INFO_CAP_MSIX_MAPPABLE
72#else
73#define RTE_VFIO_CAP_MSIX_MAPPABLE 3
74#endif
75
76/* VFIO_DEVICE_FEATURE is defined for kernel version 5.7 and newer. */
77#ifdef VFIO_DEVICE_FEATURE
78#define RTE_VFIO_DEVICE_FEATURE VFIO_DEVICE_FEATURE
79#else
80#define RTE_VFIO_DEVICE_FEATURE _IO(VFIO_TYPE, VFIO_BASE + 17)
81struct vfio_device_feature {
82 __u32 argsz;
83 __u32 flags;
84#define VFIO_DEVICE_FEATURE_MASK (0xffff) /* 16-bit feature index */
85#define VFIO_DEVICE_FEATURE_GET (1 << 16) /* Get feature into data[] */
86#define VFIO_DEVICE_FEATURE_SET (1 << 17) /* Set feature from data[] */
87#define VFIO_DEVICE_FEATURE_PROBE (1 << 18) /* Probe feature support */
88 __u8 data[];
89};
90#endif
91
92#ifdef VFIO_DEVICE_FEATURE_BUS_MASTER
93#define RTE_VFIO_DEVICE_FEATURE_BUS_MASTER VFIO_DEVICE_FEATURE_BUS_MASTER
94#else
95#define RTE_VFIO_DEVICE_FEATURE_BUS_MASTER 10
96struct vfio_device_feature_bus_master {
97 __u32 op;
98#define VFIO_DEVICE_FEATURE_CLEAR_MASTER 0 /* Clear Bus Master */
99#define VFIO_DEVICE_FEATURE_SET_MASTER 1 /* Set Bus Master */
100};
101#endif
102
103#else /* not VFIO_PRESENT */
104
105/* we don't need an actual definition, only pointer is used */
106struct vfio_device_info;
107
108#endif /* VFIO_PRESENT */
109
110#define RTE_VFIO_DEFAULT_CONTAINER_FD (-1)
111
137int rte_vfio_setup_device(const char *sysfs_base, const char *dev_addr,
138 int *vfio_dev_fd, struct vfio_device_info *device_info);
139
159int rte_vfio_release_device(const char *sysfs_base, const char *dev_addr, int fd);
160
174int rte_vfio_enable(const char *modname);
175
188int rte_vfio_is_enabled(const char *modname);
189
201
215int
216rte_vfio_clear_group(int vfio_group_fd);
217
238int
239rte_vfio_get_group_num(const char *sysfs_base,
240 const char *dev_addr, int *iommu_group_num);
241
252int
254
268int
269rte_vfio_get_group_fd(int iommu_group_num);
270
286int
288
299int
301
315int
316rte_vfio_container_group_bind(int container_fd, int iommu_group_num);
317
331int
332rte_vfio_container_group_unbind(int container_fd, int iommu_group_num);
333
354int
355rte_vfio_container_dma_map(int container_fd, uint64_t vaddr,
356 uint64_t iova, uint64_t len);
357
378int
379rte_vfio_container_dma_unmap(int container_fd, uint64_t vaddr,
380 uint64_t iova, uint64_t len);
381
382#ifdef __cplusplus
383}
384#endif
385
386#endif /* _RTE_VFIO_H_ */
int rte_vfio_clear_group(int vfio_group_fd)
int rte_vfio_setup_device(const char *sysfs_base, const char *dev_addr, int *vfio_dev_fd, struct vfio_device_info *device_info)
int rte_vfio_get_group_num(const char *sysfs_base, const char *dev_addr, int *iommu_group_num)
int rte_vfio_is_enabled(const char *modname)
int rte_vfio_container_group_bind(int container_fd, int iommu_group_num)
int rte_vfio_container_group_unbind(int container_fd, int iommu_group_num)
int rte_vfio_get_container_fd(void)
int rte_vfio_enable(const char *modname)
int rte_vfio_container_destroy(int container_fd)
int rte_vfio_container_dma_map(int container_fd, uint64_t vaddr, uint64_t iova, uint64_t len)
int rte_vfio_noiommu_is_enabled(void)
int rte_vfio_release_device(const char *sysfs_base, const char *dev_addr, int fd)
int rte_vfio_container_dma_unmap(int container_fd, uint64_t vaddr, uint64_t iova, uint64_t len)
int rte_vfio_container_create(void)
int rte_vfio_get_group_fd(int iommu_group_num)