xref: /dpdk/drivers/bus/fslmc/mc/fsl_dpdmai.h (revision 2cb2abf304fcecc0e2804b8da61760d4f2cb9a7e)
123e8fcb0SNipun Gupta /* SPDX-License-Identifier: BSD-3-Clause
2*2cb2abf3SHemant Agrawal  * Copyright 2018-2021 NXP
323e8fcb0SNipun Gupta  */
423e8fcb0SNipun Gupta 
523e8fcb0SNipun Gupta #ifndef __FSL_DPDMAI_H
623e8fcb0SNipun Gupta #define __FSL_DPDMAI_H
723e8fcb0SNipun Gupta 
8c9da6cfaSHemant Agrawal #include <rte_compat.h>
9c9da6cfaSHemant Agrawal 
1023e8fcb0SNipun Gupta struct fsl_mc_io;
1123e8fcb0SNipun Gupta 
1223e8fcb0SNipun Gupta /* Data Path DMA Interface API
1323e8fcb0SNipun Gupta  * Contains initialization APIs and runtime control APIs for DPDMAI
1423e8fcb0SNipun Gupta  */
1523e8fcb0SNipun Gupta 
1623e8fcb0SNipun Gupta /* General DPDMAI macros */
1723e8fcb0SNipun Gupta 
1823e8fcb0SNipun Gupta /**
1923e8fcb0SNipun Gupta  * Maximum number of Tx/Rx priorities per DPDMAI object
2023e8fcb0SNipun Gupta  */
2123e8fcb0SNipun Gupta #define DPDMAI_PRIO_NUM		2
2223e8fcb0SNipun Gupta 
2323e8fcb0SNipun Gupta /**
2423e8fcb0SNipun Gupta  * All queues considered; see dpdmai_set_rx_queue()
2523e8fcb0SNipun Gupta  */
2623e8fcb0SNipun Gupta #define DPDMAI_ALL_QUEUES	(uint8_t)(-1)
2723e8fcb0SNipun Gupta 
28c9da6cfaSHemant Agrawal __rte_internal
2923e8fcb0SNipun Gupta int dpdmai_open(struct fsl_mc_io *mc_io,
3023e8fcb0SNipun Gupta 		uint32_t cmd_flags,
3123e8fcb0SNipun Gupta 		int dpdmai_id,
3223e8fcb0SNipun Gupta 		uint16_t *token);
3323e8fcb0SNipun Gupta 
34c9da6cfaSHemant Agrawal __rte_internal
3523e8fcb0SNipun Gupta int dpdmai_close(struct fsl_mc_io *mc_io,
3623e8fcb0SNipun Gupta 		 uint32_t cmd_flags,
3723e8fcb0SNipun Gupta 		 uint16_t token);
3823e8fcb0SNipun Gupta 
39*2cb2abf3SHemant Agrawal /* DPDMAI options */
40*2cb2abf3SHemant Agrawal 
41*2cb2abf3SHemant Agrawal /**
42*2cb2abf3SHemant Agrawal  * Enable individual Congestion Groups usage per each priority queue
43*2cb2abf3SHemant Agrawal  * If this option is not enabled then only one CG is used for all priority
44*2cb2abf3SHemant Agrawal  * queues
45*2cb2abf3SHemant Agrawal  * If this option is enabled then a separate specific CG is used for each
46*2cb2abf3SHemant Agrawal  * individual priority queue.
47*2cb2abf3SHemant Agrawal  * In this case the priority queue must be specified via congestion notification
48*2cb2abf3SHemant Agrawal  * API
49*2cb2abf3SHemant Agrawal  */
50*2cb2abf3SHemant Agrawal #define DPDMAI_OPT_CG_PER_PRIORITY		0x00000001
51*2cb2abf3SHemant Agrawal 
5223e8fcb0SNipun Gupta /**
5323e8fcb0SNipun Gupta  * struct dpdmai_cfg - Structure representing DPDMAI configuration
5423e8fcb0SNipun Gupta  * @priorities: Priorities for the DMA hardware processing; valid priorities are
5523e8fcb0SNipun Gupta  *	configured with values 1-8; the entry following last valid entry
5623e8fcb0SNipun Gupta  *	should be configured with 0
57*2cb2abf3SHemant Agrawal  *	@options: dpdmai options
5823e8fcb0SNipun Gupta  */
5923e8fcb0SNipun Gupta struct dpdmai_cfg {
60b4a63e60SHemant Agrawal 	uint8_t num_queues;
6123e8fcb0SNipun Gupta 	uint8_t priorities[DPDMAI_PRIO_NUM];
62*2cb2abf3SHemant Agrawal 	struct {
63*2cb2abf3SHemant Agrawal 		uint32_t options;
64*2cb2abf3SHemant Agrawal 	} adv;
6523e8fcb0SNipun Gupta };
6623e8fcb0SNipun Gupta 
6723e8fcb0SNipun Gupta int dpdmai_create(struct fsl_mc_io *mc_io,
6823e8fcb0SNipun Gupta 		  uint16_t dprc_token,
6923e8fcb0SNipun Gupta 		  uint32_t cmd_flags,
7023e8fcb0SNipun Gupta 		  const struct dpdmai_cfg *cfg,
7123e8fcb0SNipun Gupta 		  uint32_t *obj_id);
7223e8fcb0SNipun Gupta 
7323e8fcb0SNipun Gupta int dpdmai_destroy(struct fsl_mc_io *mc_io,
7423e8fcb0SNipun Gupta 		   uint16_t dprc_token,
7523e8fcb0SNipun Gupta 		   uint32_t cmd_flags,
7623e8fcb0SNipun Gupta 		   uint32_t object_id);
7723e8fcb0SNipun Gupta 
78c9da6cfaSHemant Agrawal __rte_internal
7923e8fcb0SNipun Gupta int dpdmai_enable(struct fsl_mc_io *mc_io,
8023e8fcb0SNipun Gupta 		  uint32_t cmd_flags,
8123e8fcb0SNipun Gupta 		  uint16_t token);
8223e8fcb0SNipun Gupta 
83c9da6cfaSHemant Agrawal __rte_internal
8423e8fcb0SNipun Gupta int dpdmai_disable(struct fsl_mc_io *mc_io,
8523e8fcb0SNipun Gupta 		   uint32_t cmd_flags,
8623e8fcb0SNipun Gupta 		   uint16_t token);
8723e8fcb0SNipun Gupta 
8823e8fcb0SNipun Gupta int dpdmai_is_enabled(struct fsl_mc_io *mc_io,
8923e8fcb0SNipun Gupta 		      uint32_t cmd_flags,
9023e8fcb0SNipun Gupta 		      uint16_t token,
9123e8fcb0SNipun Gupta 		      int *en);
9223e8fcb0SNipun Gupta 
9323e8fcb0SNipun Gupta int dpdmai_reset(struct fsl_mc_io *mc_io,
9423e8fcb0SNipun Gupta 		 uint32_t cmd_flags,
9523e8fcb0SNipun Gupta 		 uint16_t token);
9623e8fcb0SNipun Gupta 
9723e8fcb0SNipun Gupta /**
9823e8fcb0SNipun Gupta  * struct dpdmai_attr - Structure representing DPDMAI attributes
9923e8fcb0SNipun Gupta  * @id: DPDMAI object ID
10023e8fcb0SNipun Gupta  * @num_of_priorities: number of priorities
101*2cb2abf3SHemant Agrawal  * @options: dpdmai options
10223e8fcb0SNipun Gupta  */
10323e8fcb0SNipun Gupta struct dpdmai_attr {
10423e8fcb0SNipun Gupta 	int id;
10523e8fcb0SNipun Gupta 	uint8_t num_of_priorities;
106b4a63e60SHemant Agrawal 	uint8_t num_of_queues;
107*2cb2abf3SHemant Agrawal 	uint32_t options;
10823e8fcb0SNipun Gupta };
10923e8fcb0SNipun Gupta 
110c9da6cfaSHemant Agrawal __rte_internal
11123e8fcb0SNipun Gupta int dpdmai_get_attributes(struct fsl_mc_io *mc_io,
11223e8fcb0SNipun Gupta 			  uint32_t cmd_flags,
11323e8fcb0SNipun Gupta 			  uint16_t token,
11423e8fcb0SNipun Gupta 			  struct dpdmai_attr *attr);
11523e8fcb0SNipun Gupta 
11623e8fcb0SNipun Gupta /**
11723e8fcb0SNipun Gupta  * enum dpdmai_dest - DPDMAI destination types
11823e8fcb0SNipun Gupta  * @DPDMAI_DEST_NONE: Unassigned destination; The queue is set in parked mode
11923e8fcb0SNipun Gupta  *	and does not generate FQDAN notifications; user is expected to dequeue
12023e8fcb0SNipun Gupta  *	from the queue based on polling or other user-defined method
12123e8fcb0SNipun Gupta  * @DPDMAI_DEST_DPIO: The queue is set in schedule mode and generates FQDAN
12223e8fcb0SNipun Gupta  *	notifications to the specified DPIO; user is expected to dequeue
12323e8fcb0SNipun Gupta  *	from the queue only after notification is received
12423e8fcb0SNipun Gupta  * @DPDMAI_DEST_DPCON: The queue is set in schedule mode and does not generate
12523e8fcb0SNipun Gupta  *	FQDAN notifications, but is connected to the specified DPCON object;
12623e8fcb0SNipun Gupta  *	user is expected to dequeue from the DPCON channel
12723e8fcb0SNipun Gupta  */
12823e8fcb0SNipun Gupta enum dpdmai_dest {
12923e8fcb0SNipun Gupta 	DPDMAI_DEST_NONE = 0,
13023e8fcb0SNipun Gupta 	DPDMAI_DEST_DPIO = 1,
13123e8fcb0SNipun Gupta 	DPDMAI_DEST_DPCON = 2
13223e8fcb0SNipun Gupta };
13323e8fcb0SNipun Gupta 
13423e8fcb0SNipun Gupta /**
13523e8fcb0SNipun Gupta  * struct dpdmai_dest_cfg - Structure representing DPDMAI destination parameters
13623e8fcb0SNipun Gupta  * @dest_type: Destination type
13723e8fcb0SNipun Gupta  * @dest_id: Either DPIO ID or DPCON ID, depending on the destination type
13823e8fcb0SNipun Gupta  * @priority: Priority selection within the DPIO or DPCON channel; valid values
13923e8fcb0SNipun Gupta  *	are 0-1 or 0-7, depending on the number of priorities in that
14023e8fcb0SNipun Gupta  *	channel; not relevant for 'DPDMAI_DEST_NONE' option
14123e8fcb0SNipun Gupta  */
14223e8fcb0SNipun Gupta struct dpdmai_dest_cfg {
14323e8fcb0SNipun Gupta 	enum dpdmai_dest dest_type;
14423e8fcb0SNipun Gupta 	int dest_id;
14523e8fcb0SNipun Gupta 	uint8_t priority;
14623e8fcb0SNipun Gupta };
14723e8fcb0SNipun Gupta 
14823e8fcb0SNipun Gupta /* DPDMAI queue modification options */
14923e8fcb0SNipun Gupta 
15023e8fcb0SNipun Gupta /**
15123e8fcb0SNipun Gupta  * Select to modify the user's context associated with the queue
15223e8fcb0SNipun Gupta  */
15323e8fcb0SNipun Gupta #define DPDMAI_QUEUE_OPT_USER_CTX	0x00000001
15423e8fcb0SNipun Gupta 
15523e8fcb0SNipun Gupta /**
15623e8fcb0SNipun Gupta  * Select to modify the queue's destination
15723e8fcb0SNipun Gupta  */
15823e8fcb0SNipun Gupta #define DPDMAI_QUEUE_OPT_DEST		0x00000002
15923e8fcb0SNipun Gupta 
16023e8fcb0SNipun Gupta /**
16123e8fcb0SNipun Gupta  * struct dpdmai_rx_queue_cfg - DPDMAI RX queue configuration
16223e8fcb0SNipun Gupta  * @options: Flags representing the suggested modifications to the queue;
16323e8fcb0SNipun Gupta  *	Use any combination of 'DPDMAI_QUEUE_OPT_<X>' flags
16423e8fcb0SNipun Gupta  * @user_ctx: User context value provided in the frame descriptor of each
16523e8fcb0SNipun Gupta  *	dequeued frame;
16623e8fcb0SNipun Gupta  *	valid only if 'DPDMAI_QUEUE_OPT_USER_CTX' is contained in 'options'
16723e8fcb0SNipun Gupta  * @dest_cfg: Queue destination parameters;
16823e8fcb0SNipun Gupta  *	valid only if 'DPDMAI_QUEUE_OPT_DEST' is contained in 'options'
16923e8fcb0SNipun Gupta  */
17023e8fcb0SNipun Gupta struct dpdmai_rx_queue_cfg {
17123e8fcb0SNipun Gupta 	uint32_t options;
17223e8fcb0SNipun Gupta 	uint64_t user_ctx;
17323e8fcb0SNipun Gupta 	struct dpdmai_dest_cfg dest_cfg;
17423e8fcb0SNipun Gupta 
17523e8fcb0SNipun Gupta };
17623e8fcb0SNipun Gupta 
177c9da6cfaSHemant Agrawal __rte_internal
17823e8fcb0SNipun Gupta int dpdmai_set_rx_queue(struct fsl_mc_io *mc_io,
17923e8fcb0SNipun Gupta 			uint32_t cmd_flags,
18023e8fcb0SNipun Gupta 			uint16_t token,
181b4a63e60SHemant Agrawal 			uint8_t queue_idx,
18223e8fcb0SNipun Gupta 			uint8_t priority,
18323e8fcb0SNipun Gupta 			const struct dpdmai_rx_queue_cfg *cfg);
18423e8fcb0SNipun Gupta 
18523e8fcb0SNipun Gupta /**
18623e8fcb0SNipun Gupta  * struct dpdmai_rx_queue_attr - Structure representing attributes of Rx queues
18723e8fcb0SNipun Gupta  * @user_ctx:  User context value provided in the frame descriptor of each
18823e8fcb0SNipun Gupta  *	 dequeued frame
18923e8fcb0SNipun Gupta  * @dest_cfg: Queue destination configuration
19023e8fcb0SNipun Gupta  * @fqid: Virtual FQID value to be used for dequeue operations
19123e8fcb0SNipun Gupta  */
19223e8fcb0SNipun Gupta struct dpdmai_rx_queue_attr {
19323e8fcb0SNipun Gupta 	uint64_t user_ctx;
19423e8fcb0SNipun Gupta 	struct dpdmai_dest_cfg dest_cfg;
19523e8fcb0SNipun Gupta 	uint32_t fqid;
19623e8fcb0SNipun Gupta };
19723e8fcb0SNipun Gupta 
198c9da6cfaSHemant Agrawal __rte_internal
19923e8fcb0SNipun Gupta int dpdmai_get_rx_queue(struct fsl_mc_io *mc_io,
20023e8fcb0SNipun Gupta 			uint32_t cmd_flags,
20123e8fcb0SNipun Gupta 			uint16_t token,
202b4a63e60SHemant Agrawal 			uint8_t queue_idx,
20323e8fcb0SNipun Gupta 			uint8_t priority,
20423e8fcb0SNipun Gupta 			struct dpdmai_rx_queue_attr *attr);
20523e8fcb0SNipun Gupta 
20623e8fcb0SNipun Gupta /**
20723e8fcb0SNipun Gupta  * struct dpdmai_tx_queue_attr - Structure representing attributes of Tx queues
20823e8fcb0SNipun Gupta  * @fqid: Virtual FQID to be used for sending frames to DMA hardware
20923e8fcb0SNipun Gupta  */
21023e8fcb0SNipun Gupta 
21123e8fcb0SNipun Gupta struct dpdmai_tx_queue_attr {
21223e8fcb0SNipun Gupta 	uint32_t fqid;
21323e8fcb0SNipun Gupta };
21423e8fcb0SNipun Gupta 
215c9da6cfaSHemant Agrawal __rte_internal
21623e8fcb0SNipun Gupta int dpdmai_get_tx_queue(struct fsl_mc_io *mc_io,
21723e8fcb0SNipun Gupta 			uint32_t cmd_flags,
21823e8fcb0SNipun Gupta 			uint16_t token,
219b4a63e60SHemant Agrawal 			uint8_t queue_idx,
22023e8fcb0SNipun Gupta 			uint8_t priority,
22123e8fcb0SNipun Gupta 			struct dpdmai_tx_queue_attr *attr);
22223e8fcb0SNipun Gupta 
22323e8fcb0SNipun Gupta #endif /* __FSL_DPDMAI_H */
224