aboutsummaryrefslogtreecommitdiffstats
path: root/lib/librte_vhost/rte_vdpa.h
blob: a418da47cb290f6d6ac9acf2860c9e61bbd5b836 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
/* SPDX-License-Identifier: BSD-3-Clause
 * Copyright(c) 2018 Intel Corporation
 */

#ifndef _RTE_VDPA_H_
#define _RTE_VDPA_H_

/**
 * @file
 *
 * Device specific vhost lib
 */

#include <rte_pci.h>
#include "rte_vhost.h"

#define MAX_VDPA_NAME_LEN 128

enum vdpa_addr_type {
	PCI_ADDR,
	VDPA_ADDR_MAX
};

/**
 * vdpa device address
 */
struct rte_vdpa_dev_addr {
	/** vdpa address type */
	enum vdpa_addr_type type;

	/** vdpa pci address */
	union {
		uint8_t __dummy[64];
		struct rte_pci_addr pci_addr;
	};
};

/**
 * vdpa device operations
 */
struct rte_vdpa_dev_ops {
	/** Get capabilities of this device */
	int (*get_queue_num)(int did, uint32_t *queue_num);

	/** Get supported features of this device */
	int (*get_features)(int did, uint64_t *features);

	/** Get supported protocol features of this device */
	int (*get_protocol_features)(int did, uint64_t *protocol_features);

	/** Driver configure/close the device */
	int (*dev_conf)(int vid);
	int (*dev_close)(int vid);

	/** Enable/disable this vring */
	int (*set_vring_state)(int vid, int vring, int state);

	/** Set features when changed */
	int (*set_features)(int vid);

	/** Destination operations when migration done */
	int (*migration_done)(int vid);

	/** Get the vfio group fd */
	int (*get_vfio_group_fd)(int vid);

	/** Get the vfio device fd */
	int (*get_vfio_device_fd)(int vid);

	/** Get the notify area info of the queue */
	int (*get_notify_area)(int vid, int qid,
			uint64_t *offset, uint64_t *size);

	/** Reserved for future extension */
	void *reserved[5];
};

/**
 * vdpa device structure includes device address and device operations.
 */
struct rte_vdpa_device {
	/** vdpa device address */
	struct rte_vdpa_dev_addr addr;
	/** vdpa device operations */
	struct rte_vdpa_dev_ops *ops;
} __rte_cache_aligned;

/**
 * @warning
 * @b EXPERIMENTAL: this API may change without prior notice
 *
 * Register a vdpa device
 *
 * @param addr
 *  the vdpa device address
 * @param ops
 *  the vdpa device operations
 * @return
 *  device id on success, -1 on failure
 */
int __rte_experimental
rte_vdpa_register_device(struct rte_vdpa_dev_addr *addr,
		struct rte_vdpa_dev_ops *ops);

/**
 * @warning
 * @b EXPERIMENTAL: this API may change without prior notice
 *
 * Unregister a vdpa device
 *
 * @param did
 *  vdpa device id
 * @return
 *  device id on success, -1 on failure
 */
int __rte_experimental
rte_vdpa_unregister_device(int did);

/**
 * @warning
 * @b EXPERIMENTAL: this API may change without prior notice
 *
 * Find the device id of a vdpa device
 *
 * @param addr
 *  the vdpa device address
 * @return
 *  device id on success, -1 on failure
 */
int __rte_experimental
rte_vdpa_find_device_id(struct rte_vdpa_dev_addr *addr);

/**
 * @warning
 * @b EXPERIMENTAL: this API may change without prior notice
 *
 * Find a vdpa device based on device id
 *
 * @param did
 *  device id
 * @return
 *  rte_vdpa_device on success, NULL on failure
 */
struct rte_vdpa_device * __rte_experimental
rte_vdpa_get_device(int did);

/**
 * @warning
 * @b EXPERIMENTAL: this API may change without prior notice
 *
 * Get current available vdpa device number
 *
 * @return
 *  available vdpa device number
 */
int __rte_experimental
rte_vdpa_get_device_num(void);
#endif /* _RTE_VDPA_H_ */