Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause
2 : : * Copyright 2018-2021 NXP
3 : : */
4 : :
5 : : #include <fsl_mc_sys.h>
6 : : #include <fsl_mc_cmd.h>
7 : : #include <fsl_dpdmai.h>
8 : : #include <fsl_dpdmai_cmd.h>
9 : :
10 : : /**
11 : : * dpdmai_open() - Open a control session for the specified object
12 : : * @mc_io: Pointer to MC portal's I/O object
13 : : * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
14 : : * @dpdmai_id: DPDMAI unique ID
15 : : * @token: Returned token; use in subsequent API calls
16 : : *
17 : : * This function can be used to open a control session for an
18 : : * already created object; an object may have been declared in
19 : : * the DPL or by calling the dpdmai_create() function.
20 : : * This function returns a unique authentication token,
21 : : * associated with the specific object ID and the specific MC
22 : : * portal; this token must be used in all subsequent commands for
23 : : * this specific object.
24 : : *
25 : : * Return: '0' on Success; Error code otherwise.
26 : : */
27 : 0 : int dpdmai_open(struct fsl_mc_io *mc_io,
28 : : uint32_t cmd_flags,
29 : : int dpdmai_id,
30 : : uint16_t *token)
31 : : {
32 : : struct dpdmai_cmd_open *cmd_params;
33 : 0 : struct mc_command cmd = { 0 };
34 : : int err;
35 : :
36 : : /* prepare command */
37 : 0 : cmd.header = mc_encode_cmd_header(DPDMAI_CMDID_OPEN,
38 : : cmd_flags,
39 : : 0);
40 : : cmd_params = (struct dpdmai_cmd_open *)cmd.params;
41 : 0 : cmd_params->dpdmai_id = cpu_to_le32(dpdmai_id);
42 : :
43 : : /* send command to mc*/
44 : 0 : err = mc_send_command(mc_io, &cmd);
45 [ # # ]: 0 : if (err)
46 : : return err;
47 : :
48 : : /* retrieve response parameters */
49 : 0 : *token = mc_cmd_hdr_read_token(&cmd);
50 : :
51 : 0 : return 0;
52 : : }
53 : :
54 : : /**
55 : : * dpdmai_close() - Close the control session of the object
56 : : * @mc_io: Pointer to MC portal's I/O object
57 : : * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
58 : : * @token: Token of DPDMAI object
59 : : *
60 : : * After this function is called, no further operations are
61 : : * allowed on the object without opening a new control session.
62 : : *
63 : : * Return: '0' on Success; Error code otherwise.
64 : : */
65 : 0 : int dpdmai_close(struct fsl_mc_io *mc_io,
66 : : uint32_t cmd_flags,
67 : : uint16_t token)
68 : : {
69 : 0 : struct mc_command cmd = { 0 };
70 : :
71 : : /* prepare command */
72 : 0 : cmd.header = mc_encode_cmd_header(DPDMAI_CMDID_CLOSE,
73 : : cmd_flags, token);
74 : :
75 : : /* send command to mc*/
76 : 0 : return mc_send_command(mc_io, &cmd);
77 : : }
78 : :
79 : : /**
80 : : * dpdmai_create() - Create the DPDMAI object
81 : : * @mc_io: Pointer to MC portal's I/O object
82 : : * @dprc_token: Parent container token; '0' for default container
83 : : * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
84 : : * @cfg: Configuration structure
85 : : * @obj_id: Returned object id
86 : : *
87 : : * Create the DPDMAI object, allocate required resources and
88 : : * perform required initialization.
89 : : *
90 : : * The object can be created either by declaring it in the
91 : : * DPL file, or by calling this function.
92 : : *
93 : : * The function accepts an authentication token of a parent
94 : : * container that this object should be assigned to. The token
95 : : * can be '0' so the object will be assigned to the default container.
96 : : * The newly created object can be opened with the returned
97 : : * object id and using the container's associated tokens and MC portals.
98 : : *
99 : : * Return: '0' on Success; Error code otherwise.
100 : : */
101 : 0 : int dpdmai_create(struct fsl_mc_io *mc_io,
102 : : uint16_t dprc_token,
103 : : uint32_t cmd_flags,
104 : : const struct dpdmai_cfg *cfg,
105 : : uint32_t *obj_id)
106 : : {
107 : : struct dpdmai_cmd_create *cmd_params;
108 : 0 : struct mc_command cmd = { 0 };
109 : : int err;
110 : :
111 : : /* prepare command */
112 : 0 : cmd.header = mc_encode_cmd_header(DPDMAI_CMDID_CREATE,
113 : : cmd_flags,
114 : : dprc_token);
115 : : cmd_params = (struct dpdmai_cmd_create *)cmd.params;
116 : 0 : cmd_params->num_queues = cfg->num_queues;
117 : 0 : cmd_params->priorities[0] = cfg->priorities[0];
118 : 0 : cmd_params->priorities[1] = cfg->priorities[1];
119 : 0 : cmd_params->options = cpu_to_le32(cfg->adv.options);
120 : :
121 : : /* send command to mc*/
122 : 0 : err = mc_send_command(mc_io, &cmd);
123 [ # # ]: 0 : if (err)
124 : : return err;
125 : :
126 : : /* retrieve response parameters */
127 : 0 : *obj_id = mc_cmd_read_object_id(&cmd);
128 : :
129 : 0 : return 0;
130 : : }
131 : :
132 : : /**
133 : : * dpdmai_destroy() - Destroy the DPDMAI object and release all its resources.
134 : : * @mc_io: Pointer to MC portal's I/O object
135 : : * @dprc_token: Parent container token; '0' for default container
136 : : * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
137 : : * @object_id: The object id; it must be a valid id within the container that
138 : : * created this object;
139 : : *
140 : : * The function accepts the authentication token of the parent container that
141 : : * created the object (not the one that currently owns the object). The object
142 : : * is searched within parent using the provided 'object_id'.
143 : : * All tokens to the object must be closed before calling destroy.
144 : : *
145 : : * Return: '0' on Success; error code otherwise.
146 : : */
147 : 0 : int dpdmai_destroy(struct fsl_mc_io *mc_io,
148 : : uint16_t dprc_token,
149 : : uint32_t cmd_flags,
150 : : uint32_t object_id)
151 : : {
152 : : struct dpdmai_cmd_destroy *cmd_params;
153 : 0 : struct mc_command cmd = { 0 };
154 : :
155 : : /* prepare command */
156 : 0 : cmd.header = mc_encode_cmd_header(DPDMAI_CMDID_DESTROY,
157 : : cmd_flags,
158 : : dprc_token);
159 : : cmd_params = (struct dpdmai_cmd_destroy *)cmd.params;
160 : 0 : cmd_params->dpdmai_id = cpu_to_le32(object_id);
161 : :
162 : : /* send command to mc*/
163 : 0 : return mc_send_command(mc_io, &cmd);
164 : : }
165 : :
166 : : /**
167 : : * dpdmai_enable() - Enable the DPDMAI, allow sending and receiving frames.
168 : : * @mc_io: Pointer to MC portal's I/O object
169 : : * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
170 : : * @token: Token of DPDMAI object
171 : : *
172 : : * Return: '0' on Success; Error code otherwise.
173 : : */
174 : 0 : int dpdmai_enable(struct fsl_mc_io *mc_io,
175 : : uint32_t cmd_flags,
176 : : uint16_t token)
177 : : {
178 : 0 : struct mc_command cmd = { 0 };
179 : :
180 : : /* prepare command */
181 : 0 : cmd.header = mc_encode_cmd_header(DPDMAI_CMDID_ENABLE,
182 : : cmd_flags,
183 : : token);
184 : :
185 : : /* send command to mc*/
186 : 0 : return mc_send_command(mc_io, &cmd);
187 : : }
188 : :
189 : : /**
190 : : * dpdmai_disable() - Disable the DPDMAI, stop sending and receiving frames.
191 : : * @mc_io: Pointer to MC portal's I/O object
192 : : * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
193 : : * @token: Token of DPDMAI object
194 : : *
195 : : * Return: '0' on Success; Error code otherwise.
196 : : */
197 : 0 : int dpdmai_disable(struct fsl_mc_io *mc_io,
198 : : uint32_t cmd_flags,
199 : : uint16_t token)
200 : : {
201 : 0 : struct mc_command cmd = { 0 };
202 : :
203 : : /* prepare command */
204 : 0 : cmd.header = mc_encode_cmd_header(DPDMAI_CMDID_DISABLE,
205 : : cmd_flags,
206 : : token);
207 : :
208 : : /* send command to mc*/
209 : 0 : return mc_send_command(mc_io, &cmd);
210 : : }
211 : :
212 : : /**
213 : : * dpdmai_is_enabled() - Check if the DPDMAI is enabled.
214 : : * @mc_io: Pointer to MC portal's I/O object
215 : : * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
216 : : * @token: Token of DPDMAI object
217 : : * @en: Returns '1' if object is enabled; '0' otherwise
218 : : *
219 : : * Return: '0' on Success; Error code otherwise.
220 : : */
221 : 0 : int dpdmai_is_enabled(struct fsl_mc_io *mc_io,
222 : : uint32_t cmd_flags,
223 : : uint16_t token,
224 : : int *en)
225 : : {
226 : : struct dpdmai_rsp_is_enabled *rsp_params;
227 : 0 : struct mc_command cmd = { 0 };
228 : : int err;
229 : :
230 : : /* prepare command */
231 : 0 : cmd.header = mc_encode_cmd_header(DPDMAI_CMDID_IS_ENABLED,
232 : : cmd_flags,
233 : : token);
234 : :
235 : : /* send command to mc*/
236 : 0 : err = mc_send_command(mc_io, &cmd);
237 [ # # ]: 0 : if (err)
238 : : return err;
239 : :
240 : : /* retrieve response parameters */
241 : : rsp_params = (struct dpdmai_rsp_is_enabled *)cmd.params;
242 : 0 : *en = dpdmai_get_field(rsp_params->en, ENABLE);
243 : :
244 : 0 : return 0;
245 : : }
246 : :
247 : : /**
248 : : * dpdmai_reset() - Reset the DPDMAI, returns the object to initial state.
249 : : * @mc_io: Pointer to MC portal's I/O object
250 : : * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
251 : : * @token: Token of DPDMAI object
252 : : *
253 : : * Return: '0' on Success; Error code otherwise.
254 : : */
255 : 0 : int dpdmai_reset(struct fsl_mc_io *mc_io,
256 : : uint32_t cmd_flags,
257 : : uint16_t token)
258 : : {
259 : 0 : struct mc_command cmd = { 0 };
260 : :
261 : : /* prepare command */
262 : 0 : cmd.header = mc_encode_cmd_header(DPDMAI_CMDID_RESET,
263 : : cmd_flags,
264 : : token);
265 : :
266 : : /* send command to mc*/
267 : 0 : return mc_send_command(mc_io, &cmd);
268 : : }
269 : :
270 : : /**
271 : : * dpdmai_get_attributes() - Retrieve DPDMAI attributes.
272 : : * @mc_io: Pointer to MC portal's I/O object
273 : : * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
274 : : * @token: Token of DPDMAI object
275 : : * @attr: Returned object's attributes
276 : : *
277 : : * Return: '0' on Success; Error code otherwise.
278 : : */
279 : 0 : int dpdmai_get_attributes(struct fsl_mc_io *mc_io,
280 : : uint32_t cmd_flags,
281 : : uint16_t token,
282 : : struct dpdmai_attr *attr)
283 : : {
284 : : struct dpdmai_rsp_get_attr *rsp_params;
285 : 0 : struct mc_command cmd = { 0 };
286 : : int err;
287 : :
288 : : /* prepare command */
289 : 0 : cmd.header = mc_encode_cmd_header(DPDMAI_CMDID_GET_ATTR,
290 : : cmd_flags,
291 : : token);
292 : :
293 : : /* send command to mc*/
294 : 0 : err = mc_send_command(mc_io, &cmd);
295 [ # # ]: 0 : if (err)
296 : : return err;
297 : :
298 : : /* retrieve response parameters */
299 : : rsp_params = (struct dpdmai_rsp_get_attr *)cmd.params;
300 : 0 : attr->id = le32_to_cpu(rsp_params->id);
301 : 0 : attr->num_of_priorities = rsp_params->num_of_priorities;
302 : 0 : attr->num_of_queues = rsp_params->num_of_queues;
303 : 0 : attr->options = le32_to_cpu(rsp_params->options);
304 : :
305 : 0 : return 0;
306 : : }
307 : :
308 : : /**
309 : : * dpdmai_set_rx_queue() - Set Rx queue configuration
310 : : * @mc_io: Pointer to MC portal's I/O object
311 : : * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
312 : : * @token: Token of DPDMAI object
313 : : * @queue_idx: Rx queue index. Accepted values are form 0 to num_queues
314 : : * parameter provided in dpdmai_create
315 : : * @priority: Select the queue relative to number of
316 : : * priorities configured at DPDMAI creation; use
317 : : * DPDMAI_ALL_QUEUES to configure all Rx queues
318 : : * identically.
319 : : * @cfg: Rx queue configuration
320 : : *
321 : : * Return: '0' on Success; Error code otherwise.
322 : : */
323 : 0 : int dpdmai_set_rx_queue(struct fsl_mc_io *mc_io,
324 : : uint32_t cmd_flags,
325 : : uint16_t token,
326 : : uint8_t queue_idx,
327 : : uint8_t priority,
328 : : const struct dpdmai_rx_queue_cfg *cfg)
329 : : {
330 : : struct dpdmai_cmd_set_rx_queue *cmd_params;
331 : 0 : struct mc_command cmd = { 0 };
332 : :
333 : : /* prepare command */
334 : 0 : cmd.header = mc_encode_cmd_header(DPDMAI_CMDID_SET_RX_QUEUE,
335 : : cmd_flags,
336 : : token);
337 : : cmd_params = (struct dpdmai_cmd_set_rx_queue *)cmd.params;
338 : 0 : cmd_params->dest_id = cpu_to_le32(cfg->dest_cfg.dest_id);
339 : 0 : cmd_params->dest_priority = cfg->dest_cfg.priority;
340 : 0 : cmd_params->priority = priority;
341 : 0 : cmd_params->queue_idx = queue_idx;
342 : 0 : cmd_params->user_ctx = cpu_to_le64(cfg->user_ctx);
343 : 0 : cmd_params->options = cpu_to_le32(cfg->options);
344 : 0 : dpdmai_set_field(cmd_params->dest_type,
345 : : DEST_TYPE,
346 : : cfg->dest_cfg.dest_type);
347 : :
348 : : /* send command to mc*/
349 : 0 : return mc_send_command(mc_io, &cmd);
350 : : }
351 : :
352 : : /**
353 : : * dpdmai_get_rx_queue() - Retrieve Rx queue attributes.
354 : : * @mc_io: Pointer to MC portal's I/O object
355 : : * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
356 : : * @token: Token of DPDMAI object
357 : : * @queue_idx: Rx queue index. Accepted values are form 0 to num_queues
358 : : * parameter provided in dpdmai_create
359 : : * @priority: Select the queue relative to number of
360 : : * priorities configured at DPDMAI creation
361 : : * @attr: Returned Rx queue attributes
362 : : *
363 : : * Return: '0' on Success; Error code otherwise.
364 : : */
365 : 0 : int dpdmai_get_rx_queue(struct fsl_mc_io *mc_io,
366 : : uint32_t cmd_flags,
367 : : uint16_t token,
368 : : uint8_t queue_idx,
369 : : uint8_t priority,
370 : : struct dpdmai_rx_queue_attr *attr)
371 : : {
372 : : struct dpdmai_cmd_get_queue *cmd_params;
373 : : struct dpdmai_rsp_get_rx_queue *rsp_params;
374 : 0 : struct mc_command cmd = { 0 };
375 : : int err;
376 : :
377 : : /* prepare command */
378 : 0 : cmd.header = mc_encode_cmd_header(DPDMAI_CMDID_GET_RX_QUEUE,
379 : : cmd_flags,
380 : : token);
381 : : cmd_params = (struct dpdmai_cmd_get_queue *)cmd.params;
382 : 0 : cmd_params->priority = priority;
383 : 0 : cmd_params->queue_idx = queue_idx;
384 : :
385 : : /* send command to mc*/
386 : 0 : err = mc_send_command(mc_io, &cmd);
387 [ # # ]: 0 : if (err)
388 : : return err;
389 : :
390 : : /* retrieve response parameters */
391 : : rsp_params = (struct dpdmai_rsp_get_rx_queue *)cmd.params;
392 : 0 : attr->user_ctx = le64_to_cpu(rsp_params->user_ctx);
393 : 0 : attr->fqid = le32_to_cpu(rsp_params->fqid);
394 : 0 : attr->dest_cfg.dest_id = le32_to_cpu(rsp_params->dest_id);
395 : 0 : attr->dest_cfg.priority = le32_to_cpu(rsp_params->dest_priority);
396 : 0 : attr->dest_cfg.dest_type = dpdmai_get_field(rsp_params->dest_type,
397 : : DEST_TYPE);
398 : :
399 : 0 : return 0;
400 : : }
401 : :
402 : : /**
403 : : * dpdmai_get_tx_queue() - Retrieve Tx queue attributes.
404 : : * @mc_io: Pointer to MC portal's I/O object
405 : : * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
406 : : * @token: Token of DPDMAI object
407 : : * @queue_idx: Tx queue index. Accepted values are form 0 to num_queues
408 : : * parameter provided in dpdmai_create
409 : : * @priority: Select the queue relative to number of
410 : : * priorities configured at DPDMAI creation
411 : : * @attr: Returned Tx queue attributes
412 : : *
413 : : * Return: '0' on Success; Error code otherwise.
414 : : */
415 : 0 : int dpdmai_get_tx_queue(struct fsl_mc_io *mc_io,
416 : : uint32_t cmd_flags,
417 : : uint16_t token,
418 : : uint8_t queue_idx,
419 : : uint8_t priority,
420 : : struct dpdmai_tx_queue_attr *attr)
421 : : {
422 : : struct dpdmai_cmd_get_queue *cmd_params;
423 : : struct dpdmai_rsp_get_tx_queue *rsp_params;
424 : 0 : struct mc_command cmd = { 0 };
425 : : int err;
426 : :
427 : : /* prepare command */
428 : 0 : cmd.header = mc_encode_cmd_header(DPDMAI_CMDID_GET_TX_QUEUE,
429 : : cmd_flags,
430 : : token);
431 : : cmd_params = (struct dpdmai_cmd_get_queue *)cmd.params;
432 : 0 : cmd_params->priority = priority;
433 : 0 : cmd_params->queue_idx = queue_idx;
434 : :
435 : : /* send command to mc*/
436 : 0 : err = mc_send_command(mc_io, &cmd);
437 [ # # ]: 0 : if (err)
438 : : return err;
439 : :
440 : : /* retrieve response parameters */
441 : : rsp_params = (struct dpdmai_rsp_get_tx_queue *)cmd.params;
442 : 0 : attr->fqid = le32_to_cpu(rsp_params->fqid);
443 : :
444 : 0 : return 0;
445 : : }
|