xref: /dpdk/drivers/bus/fslmc/mc/fsl_dpdmai.h (revision 2cb2abf304fcecc0e2804b8da61760d4f2cb9a7e)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright 2018-2021 NXP
3  */
4 
5 #ifndef __FSL_DPDMAI_H
6 #define __FSL_DPDMAI_H
7 
8 #include <rte_compat.h>
9 
10 struct fsl_mc_io;
11 
12 /* Data Path DMA Interface API
13  * Contains initialization APIs and runtime control APIs for DPDMAI
14  */
15 
16 /* General DPDMAI macros */
17 
18 /**
19  * Maximum number of Tx/Rx priorities per DPDMAI object
20  */
21 #define DPDMAI_PRIO_NUM		2
22 
23 /**
24  * All queues considered; see dpdmai_set_rx_queue()
25  */
26 #define DPDMAI_ALL_QUEUES	(uint8_t)(-1)
27 
28 __rte_internal
29 int dpdmai_open(struct fsl_mc_io *mc_io,
30 		uint32_t cmd_flags,
31 		int dpdmai_id,
32 		uint16_t *token);
33 
34 __rte_internal
35 int dpdmai_close(struct fsl_mc_io *mc_io,
36 		 uint32_t cmd_flags,
37 		 uint16_t token);
38 
39 /* DPDMAI options */
40 
41 /**
42  * Enable individual Congestion Groups usage per each priority queue
43  * If this option is not enabled then only one CG is used for all priority
44  * queues
45  * If this option is enabled then a separate specific CG is used for each
46  * individual priority queue.
47  * In this case the priority queue must be specified via congestion notification
48  * API
49  */
50 #define DPDMAI_OPT_CG_PER_PRIORITY		0x00000001
51 
52 /**
53  * struct dpdmai_cfg - Structure representing DPDMAI configuration
54  * @priorities: Priorities for the DMA hardware processing; valid priorities are
55  *	configured with values 1-8; the entry following last valid entry
56  *	should be configured with 0
57  *	@options: dpdmai options
58  */
59 struct dpdmai_cfg {
60 	uint8_t num_queues;
61 	uint8_t priorities[DPDMAI_PRIO_NUM];
62 	struct {
63 		uint32_t options;
64 	} adv;
65 };
66 
67 int dpdmai_create(struct fsl_mc_io *mc_io,
68 		  uint16_t dprc_token,
69 		  uint32_t cmd_flags,
70 		  const struct dpdmai_cfg *cfg,
71 		  uint32_t *obj_id);
72 
73 int dpdmai_destroy(struct fsl_mc_io *mc_io,
74 		   uint16_t dprc_token,
75 		   uint32_t cmd_flags,
76 		   uint32_t object_id);
77 
78 __rte_internal
79 int dpdmai_enable(struct fsl_mc_io *mc_io,
80 		  uint32_t cmd_flags,
81 		  uint16_t token);
82 
83 __rte_internal
84 int dpdmai_disable(struct fsl_mc_io *mc_io,
85 		   uint32_t cmd_flags,
86 		   uint16_t token);
87 
88 int dpdmai_is_enabled(struct fsl_mc_io *mc_io,
89 		      uint32_t cmd_flags,
90 		      uint16_t token,
91 		      int *en);
92 
93 int dpdmai_reset(struct fsl_mc_io *mc_io,
94 		 uint32_t cmd_flags,
95 		 uint16_t token);
96 
97 /**
98  * struct dpdmai_attr - Structure representing DPDMAI attributes
99  * @id: DPDMAI object ID
100  * @num_of_priorities: number of priorities
101  * @options: dpdmai options
102  */
103 struct dpdmai_attr {
104 	int id;
105 	uint8_t num_of_priorities;
106 	uint8_t num_of_queues;
107 	uint32_t options;
108 };
109 
110 __rte_internal
111 int dpdmai_get_attributes(struct fsl_mc_io *mc_io,
112 			  uint32_t cmd_flags,
113 			  uint16_t token,
114 			  struct dpdmai_attr *attr);
115 
116 /**
117  * enum dpdmai_dest - DPDMAI destination types
118  * @DPDMAI_DEST_NONE: Unassigned destination; The queue is set in parked mode
119  *	and does not generate FQDAN notifications; user is expected to dequeue
120  *	from the queue based on polling or other user-defined method
121  * @DPDMAI_DEST_DPIO: The queue is set in schedule mode and generates FQDAN
122  *	notifications to the specified DPIO; user is expected to dequeue
123  *	from the queue only after notification is received
124  * @DPDMAI_DEST_DPCON: The queue is set in schedule mode and does not generate
125  *	FQDAN notifications, but is connected to the specified DPCON object;
126  *	user is expected to dequeue from the DPCON channel
127  */
128 enum dpdmai_dest {
129 	DPDMAI_DEST_NONE = 0,
130 	DPDMAI_DEST_DPIO = 1,
131 	DPDMAI_DEST_DPCON = 2
132 };
133 
134 /**
135  * struct dpdmai_dest_cfg - Structure representing DPDMAI destination parameters
136  * @dest_type: Destination type
137  * @dest_id: Either DPIO ID or DPCON ID, depending on the destination type
138  * @priority: Priority selection within the DPIO or DPCON channel; valid values
139  *	are 0-1 or 0-7, depending on the number of priorities in that
140  *	channel; not relevant for 'DPDMAI_DEST_NONE' option
141  */
142 struct dpdmai_dest_cfg {
143 	enum dpdmai_dest dest_type;
144 	int dest_id;
145 	uint8_t priority;
146 };
147 
148 /* DPDMAI queue modification options */
149 
150 /**
151  * Select to modify the user's context associated with the queue
152  */
153 #define DPDMAI_QUEUE_OPT_USER_CTX	0x00000001
154 
155 /**
156  * Select to modify the queue's destination
157  */
158 #define DPDMAI_QUEUE_OPT_DEST		0x00000002
159 
160 /**
161  * struct dpdmai_rx_queue_cfg - DPDMAI RX queue configuration
162  * @options: Flags representing the suggested modifications to the queue;
163  *	Use any combination of 'DPDMAI_QUEUE_OPT_<X>' flags
164  * @user_ctx: User context value provided in the frame descriptor of each
165  *	dequeued frame;
166  *	valid only if 'DPDMAI_QUEUE_OPT_USER_CTX' is contained in 'options'
167  * @dest_cfg: Queue destination parameters;
168  *	valid only if 'DPDMAI_QUEUE_OPT_DEST' is contained in 'options'
169  */
170 struct dpdmai_rx_queue_cfg {
171 	uint32_t options;
172 	uint64_t user_ctx;
173 	struct dpdmai_dest_cfg dest_cfg;
174 
175 };
176 
177 __rte_internal
178 int dpdmai_set_rx_queue(struct fsl_mc_io *mc_io,
179 			uint32_t cmd_flags,
180 			uint16_t token,
181 			uint8_t queue_idx,
182 			uint8_t priority,
183 			const struct dpdmai_rx_queue_cfg *cfg);
184 
185 /**
186  * struct dpdmai_rx_queue_attr - Structure representing attributes of Rx queues
187  * @user_ctx:  User context value provided in the frame descriptor of each
188  *	 dequeued frame
189  * @dest_cfg: Queue destination configuration
190  * @fqid: Virtual FQID value to be used for dequeue operations
191  */
192 struct dpdmai_rx_queue_attr {
193 	uint64_t user_ctx;
194 	struct dpdmai_dest_cfg dest_cfg;
195 	uint32_t fqid;
196 };
197 
198 __rte_internal
199 int dpdmai_get_rx_queue(struct fsl_mc_io *mc_io,
200 			uint32_t cmd_flags,
201 			uint16_t token,
202 			uint8_t queue_idx,
203 			uint8_t priority,
204 			struct dpdmai_rx_queue_attr *attr);
205 
206 /**
207  * struct dpdmai_tx_queue_attr - Structure representing attributes of Tx queues
208  * @fqid: Virtual FQID to be used for sending frames to DMA hardware
209  */
210 
211 struct dpdmai_tx_queue_attr {
212 	uint32_t fqid;
213 };
214 
215 __rte_internal
216 int dpdmai_get_tx_queue(struct fsl_mc_io *mc_io,
217 			uint32_t cmd_flags,
218 			uint16_t token,
219 			uint8_t queue_idx,
220 			uint8_t priority,
221 			struct dpdmai_tx_queue_attr *attr);
222 
223 #endif /* __FSL_DPDMAI_H */
224