vdpa/mlx5: add task ring for multi-thread management
[dpdk.git] / lib / ethdev / rte_mtr.c
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2017 Intel Corporation
3  */
4
5 #include <stdint.h>
6
7 #include <rte_errno.h>
8 #include "rte_ethdev.h"
9 #include "rte_mtr_driver.h"
10 #include "rte_mtr.h"
11
12 /* Get generic traffic metering & policing operations structure from a port. */
13 const struct rte_mtr_ops *
14 rte_mtr_ops_get(uint16_t port_id, struct rte_mtr_error *error)
15 {
16         struct rte_eth_dev *dev = &rte_eth_devices[port_id];
17         const struct rte_mtr_ops *ops;
18
19         if (!rte_eth_dev_is_valid_port(port_id)) {
20                 rte_mtr_error_set(error,
21                         ENODEV,
22                         RTE_MTR_ERROR_TYPE_UNSPECIFIED,
23                         NULL,
24                         rte_strerror(ENODEV));
25                 return NULL;
26         }
27
28         if ((dev->dev_ops->mtr_ops_get == NULL) ||
29                 (dev->dev_ops->mtr_ops_get(dev, &ops) != 0) ||
30                 (ops == NULL)) {
31                 rte_mtr_error_set(error,
32                         ENOSYS,
33                         RTE_MTR_ERROR_TYPE_UNSPECIFIED,
34                         NULL,
35                         rte_strerror(ENOSYS));
36                 return NULL;
37         }
38
39         return ops;
40 }
41
42 #define RTE_MTR_FUNC(port_id, func)                     \
43 ({                                                      \
44         const struct rte_mtr_ops *ops =                 \
45                 rte_mtr_ops_get(port_id, error);                \
46         if (ops == NULL)                                        \
47                 return -rte_errno;                      \
48                                                         \
49         if (ops->func == NULL)                          \
50                 return -rte_mtr_error_set(error,                \
51                         ENOSYS,                         \
52                         RTE_MTR_ERROR_TYPE_UNSPECIFIED, \
53                         NULL,                           \
54                         rte_strerror(ENOSYS));          \
55                                                         \
56         ops->func;                                      \
57 })
58
59 /* MTR capabilities get */
60 int
61 rte_mtr_capabilities_get(uint16_t port_id,
62         struct rte_mtr_capabilities *cap,
63         struct rte_mtr_error *error)
64 {
65         struct rte_eth_dev *dev = &rte_eth_devices[port_id];
66         return RTE_MTR_FUNC(port_id, capabilities_get)(dev,
67                 cap, error);
68 }
69
70 /* MTR meter profile add */
71 int
72 rte_mtr_meter_profile_add(uint16_t port_id,
73         uint32_t meter_profile_id,
74         struct rte_mtr_meter_profile *profile,
75         struct rte_mtr_error *error)
76 {
77         struct rte_eth_dev *dev = &rte_eth_devices[port_id];
78         return RTE_MTR_FUNC(port_id, meter_profile_add)(dev,
79                 meter_profile_id, profile, error);
80 }
81
82 /** MTR meter profile delete */
83 int
84 rte_mtr_meter_profile_delete(uint16_t port_id,
85         uint32_t meter_profile_id,
86         struct rte_mtr_error *error)
87 {
88         struct rte_eth_dev *dev = &rte_eth_devices[port_id];
89         return RTE_MTR_FUNC(port_id, meter_profile_delete)(dev,
90                 meter_profile_id, error);
91 }
92
93 /* MTR meter policy validate */
94 int
95 rte_mtr_meter_policy_validate(uint16_t port_id,
96         struct rte_mtr_meter_policy_params *policy,
97         struct rte_mtr_error *error)
98 {
99         struct rte_eth_dev *dev = &rte_eth_devices[port_id];
100         return RTE_MTR_FUNC(port_id, meter_policy_validate)(dev,
101                 policy, error);
102 }
103
104 /* MTR meter policy add */
105 int
106 rte_mtr_meter_policy_add(uint16_t port_id,
107         uint32_t policy_id,
108         struct rte_mtr_meter_policy_params *policy,
109         struct rte_mtr_error *error)
110 {
111         struct rte_eth_dev *dev = &rte_eth_devices[port_id];
112         return RTE_MTR_FUNC(port_id, meter_policy_add)(dev,
113                 policy_id, policy, error);
114 }
115
116 /** MTR meter policy delete */
117 int
118 rte_mtr_meter_policy_delete(uint16_t port_id,
119         uint32_t policy_id,
120         struct rte_mtr_error *error)
121 {
122         struct rte_eth_dev *dev = &rte_eth_devices[port_id];
123         return RTE_MTR_FUNC(port_id, meter_policy_delete)(dev,
124                 policy_id, error);
125 }
126
127 /** MTR object create */
128 int
129 rte_mtr_create(uint16_t port_id,
130         uint32_t mtr_id,
131         struct rte_mtr_params *params,
132         int shared,
133         struct rte_mtr_error *error)
134 {
135         struct rte_eth_dev *dev = &rte_eth_devices[port_id];
136         return RTE_MTR_FUNC(port_id, create)(dev,
137                 mtr_id, params, shared, error);
138 }
139
140 /** MTR object destroy */
141 int
142 rte_mtr_destroy(uint16_t port_id,
143         uint32_t mtr_id,
144         struct rte_mtr_error *error)
145 {
146         struct rte_eth_dev *dev = &rte_eth_devices[port_id];
147         return RTE_MTR_FUNC(port_id, destroy)(dev,
148                 mtr_id, error);
149 }
150
151 /** MTR object meter enable */
152 int
153 rte_mtr_meter_enable(uint16_t port_id,
154         uint32_t mtr_id,
155         struct rte_mtr_error *error)
156 {
157         struct rte_eth_dev *dev = &rte_eth_devices[port_id];
158         return RTE_MTR_FUNC(port_id, meter_enable)(dev,
159                 mtr_id, error);
160 }
161
162 /** MTR object meter disable */
163 int
164 rte_mtr_meter_disable(uint16_t port_id,
165         uint32_t mtr_id,
166         struct rte_mtr_error *error)
167 {
168         struct rte_eth_dev *dev = &rte_eth_devices[port_id];
169         return RTE_MTR_FUNC(port_id, meter_disable)(dev,
170                 mtr_id, error);
171 }
172
173 /** MTR object meter profile update */
174 int
175 rte_mtr_meter_profile_update(uint16_t port_id,
176         uint32_t mtr_id,
177         uint32_t meter_profile_id,
178         struct rte_mtr_error *error)
179 {
180         struct rte_eth_dev *dev = &rte_eth_devices[port_id];
181         return RTE_MTR_FUNC(port_id, meter_profile_update)(dev,
182                 mtr_id, meter_profile_id, error);
183 }
184
185 /** MTR object meter policy update */
186 int
187 rte_mtr_meter_policy_update(uint16_t port_id,
188         uint32_t mtr_id,
189         uint32_t meter_policy_id,
190         struct rte_mtr_error *error)
191 {
192         struct rte_eth_dev *dev = &rte_eth_devices[port_id];
193         return RTE_MTR_FUNC(port_id, meter_policy_update)(dev,
194                 mtr_id, meter_policy_id, error);
195 }
196
197 /** MTR object meter DSCP table update */
198 int
199 rte_mtr_meter_dscp_table_update(uint16_t port_id,
200         uint32_t mtr_id,
201         enum rte_color *dscp_table,
202         struct rte_mtr_error *error)
203 {
204         struct rte_eth_dev *dev = &rte_eth_devices[port_id];
205         return RTE_MTR_FUNC(port_id, meter_dscp_table_update)(dev,
206                 mtr_id, dscp_table, error);
207 }
208
209 /** MTR object meter VLAN table update */
210 int
211 rte_mtr_meter_vlan_table_update(uint16_t port_id,
212         uint32_t mtr_id,
213         enum rte_color *vlan_table,
214         struct rte_mtr_error *error)
215 {
216         struct rte_eth_dev *dev = &rte_eth_devices[port_id];
217         return RTE_MTR_FUNC(port_id, meter_vlan_table_update)(dev,
218                 mtr_id, vlan_table, error);
219 }
220
221 /** Set the input color protocol on MTR object */
222 int
223 rte_mtr_color_in_protocol_set(uint16_t port_id,
224         uint32_t mtr_id,
225         enum rte_mtr_color_in_protocol proto,
226         uint32_t priority,
227         struct rte_mtr_error *error)
228 {
229         struct rte_eth_dev *dev = &rte_eth_devices[port_id];
230         return RTE_MTR_FUNC(port_id, in_proto_set)(dev,
231                 mtr_id, proto, priority, error);
232 }
233
234 /** Get input color protocols of MTR object */
235 int
236 rte_mtr_color_in_protocol_get(uint16_t port_id,
237         uint32_t mtr_id,
238         uint64_t *proto_mask,
239         struct rte_mtr_error *error)
240 {
241         struct rte_eth_dev *dev = &rte_eth_devices[port_id];
242         return RTE_MTR_FUNC(port_id, in_proto_get)(dev,
243                 mtr_id, proto_mask, error);
244 }
245
246 /** Get input color protocol priority of MTR object */
247 int
248 rte_mtr_color_in_protocol_priority_get(uint16_t port_id,
249         uint32_t mtr_id,
250         enum rte_mtr_color_in_protocol proto,
251         uint32_t *priority,
252         struct rte_mtr_error *error)
253 {
254         struct rte_eth_dev *dev = &rte_eth_devices[port_id];
255         return RTE_MTR_FUNC(port_id, in_proto_prio_get)(dev,
256                 mtr_id, proto, priority, error);
257 }
258
259 /** MTR object enabled stats update */
260 int
261 rte_mtr_stats_update(uint16_t port_id,
262         uint32_t mtr_id,
263         uint64_t stats_mask,
264         struct rte_mtr_error *error)
265 {
266         struct rte_eth_dev *dev = &rte_eth_devices[port_id];
267         return RTE_MTR_FUNC(port_id, stats_update)(dev,
268                 mtr_id, stats_mask, error);
269 }
270
271 /** MTR object stats read */
272 int
273 rte_mtr_stats_read(uint16_t port_id,
274         uint32_t mtr_id,
275         struct rte_mtr_stats *stats,
276         uint64_t *stats_mask,
277         int clear,
278         struct rte_mtr_error *error)
279 {
280         struct rte_eth_dev *dev = &rte_eth_devices[port_id];
281         return RTE_MTR_FUNC(port_id, stats_read)(dev,
282                 mtr_id, stats, stats_mask, clear, error);
283 }