xref: /dpdk/drivers/net/dpaa2/mc/dpni.c (revision 591200ef6f32b56adc367ebe3647cc3dbe9362db)
1131a75b6SHemant Agrawal /* SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0)
2e6b82573SHemant Agrawal  *
3e6b82573SHemant Agrawal  * Copyright 2013-2016 Freescale Semiconductor Inc.
4*591200efSGagandeep Singh  * Copyright 2016-2023 NXP
5e6b82573SHemant Agrawal  *
6e6b82573SHemant Agrawal  */
7e6b82573SHemant Agrawal #include <fsl_mc_sys.h>
8e6b82573SHemant Agrawal #include <fsl_mc_cmd.h>
9e6b82573SHemant Agrawal #include <fsl_dpni.h>
10e6b82573SHemant Agrawal #include <fsl_dpni_cmd.h>
11e6b82573SHemant Agrawal 
1216bbc98aSShreyansh Jain /**
1316bbc98aSShreyansh Jain  * dpni_open() - Open a control session for the specified object
1416bbc98aSShreyansh Jain  * @mc_io:	Pointer to MC portal's I/O object
1516bbc98aSShreyansh Jain  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1616bbc98aSShreyansh Jain  * @dpni_id:	DPNI unique ID
1716bbc98aSShreyansh Jain  * @token:	Returned token; use in subsequent API calls
1816bbc98aSShreyansh Jain  *
1916bbc98aSShreyansh Jain  * This function can be used to open a control session for an
2016bbc98aSShreyansh Jain  * already created object; an object may have been declared in
2116bbc98aSShreyansh Jain  * the DPL or by calling the dpni_create() function.
2216bbc98aSShreyansh Jain  * This function returns a unique authentication token,
2316bbc98aSShreyansh Jain  * associated with the specific object ID and the specific MC
2416bbc98aSShreyansh Jain  * portal; this token must be used in all subsequent commands for
2516bbc98aSShreyansh Jain  * this specific object.
2616bbc98aSShreyansh Jain  *
2716bbc98aSShreyansh Jain  * Return:	'0' on Success; Error code otherwise.
2816bbc98aSShreyansh Jain  */
29e6b82573SHemant Agrawal int dpni_open(struct fsl_mc_io *mc_io,
30e6b82573SHemant Agrawal 	      uint32_t cmd_flags,
31e6b82573SHemant Agrawal 	      int dpni_id,
32e6b82573SHemant Agrawal 	      uint16_t *token)
33e6b82573SHemant Agrawal {
34e6b82573SHemant Agrawal 	struct mc_command cmd = { 0 };
3516bbc98aSShreyansh Jain 	struct dpni_cmd_open *cmd_params;
3616bbc98aSShreyansh Jain 
37e6b82573SHemant Agrawal 	int err;
38e6b82573SHemant Agrawal 
39e6b82573SHemant Agrawal 	/* prepare command */
40e6b82573SHemant Agrawal 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_OPEN,
41e6b82573SHemant Agrawal 					  cmd_flags,
42e6b82573SHemant Agrawal 					  0);
4316bbc98aSShreyansh Jain 	cmd_params = (struct dpni_cmd_open *)cmd.params;
4416bbc98aSShreyansh Jain 	cmd_params->dpni_id = cpu_to_le32(dpni_id);
45e6b82573SHemant Agrawal 
46e6b82573SHemant Agrawal 	/* send command to mc*/
47e6b82573SHemant Agrawal 	err = mc_send_command(mc_io, &cmd);
48e6b82573SHemant Agrawal 	if (err)
49e6b82573SHemant Agrawal 		return err;
50e6b82573SHemant Agrawal 
51e6b82573SHemant Agrawal 	/* retrieve response parameters */
5216bbc98aSShreyansh Jain 	*token = mc_cmd_hdr_read_token(&cmd);
53e6b82573SHemant Agrawal 
54e6b82573SHemant Agrawal 	return 0;
55e6b82573SHemant Agrawal }
56e6b82573SHemant Agrawal 
5716bbc98aSShreyansh Jain /**
5816bbc98aSShreyansh Jain  * dpni_close() - Close the control session of the object
5916bbc98aSShreyansh Jain  * @mc_io:	Pointer to MC portal's I/O object
6016bbc98aSShreyansh Jain  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
6116bbc98aSShreyansh Jain  * @token:	Token of DPNI object
6216bbc98aSShreyansh Jain  *
6316bbc98aSShreyansh Jain  * After this function is called, no further operations are
6416bbc98aSShreyansh Jain  * allowed on the object without opening a new control session.
6516bbc98aSShreyansh Jain  *
6616bbc98aSShreyansh Jain  * Return:	'0' on Success; Error code otherwise.
6716bbc98aSShreyansh Jain  */
68e6b82573SHemant Agrawal int dpni_close(struct fsl_mc_io *mc_io,
69e6b82573SHemant Agrawal 	       uint32_t cmd_flags,
70e6b82573SHemant Agrawal 	       uint16_t token)
71e6b82573SHemant Agrawal {
72e6b82573SHemant Agrawal 	struct mc_command cmd = { 0 };
73e6b82573SHemant Agrawal 
74e6b82573SHemant Agrawal 	/* prepare command */
75e6b82573SHemant Agrawal 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_CLOSE,
76e6b82573SHemant Agrawal 					  cmd_flags,
77e6b82573SHemant Agrawal 					  token);
78e6b82573SHemant Agrawal 
79e6b82573SHemant Agrawal 	/* send command to mc*/
80e6b82573SHemant Agrawal 	return mc_send_command(mc_io, &cmd);
81e6b82573SHemant Agrawal }
82e6b82573SHemant Agrawal 
8316bbc98aSShreyansh Jain /**
8416bbc98aSShreyansh Jain  * dpni_create() - Create the DPNI object
8516bbc98aSShreyansh Jain  * @mc_io:	Pointer to MC portal's I/O object
8616bbc98aSShreyansh Jain  * @dprc_token:	Parent container token; '0' for default container
8716bbc98aSShreyansh Jain  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
8816bbc98aSShreyansh Jain  * @cfg:	Configuration structure
8916bbc98aSShreyansh Jain  * @obj_id:	Returned object id
9016bbc98aSShreyansh Jain  *
9116bbc98aSShreyansh Jain  * Create the DPNI object, allocate required resources and
9216bbc98aSShreyansh Jain  * perform required initialization.
9316bbc98aSShreyansh Jain  *
9416bbc98aSShreyansh Jain  * The object can be created either by declaring it in the
9516bbc98aSShreyansh Jain  * DPL file, or by calling this function.
9616bbc98aSShreyansh Jain  *
9716bbc98aSShreyansh Jain  * The function accepts an authentication token of a parent
9816bbc98aSShreyansh Jain  * container that this object should be assigned to. The token
9916bbc98aSShreyansh Jain  * can be '0' so the object will be assigned to the default container.
10016bbc98aSShreyansh Jain  * The newly created object can be opened with the returned
10116bbc98aSShreyansh Jain  * object id and using the container's associated tokens and MC portals.
10216bbc98aSShreyansh Jain  *
10316bbc98aSShreyansh Jain  * Return:	'0' on Success; Error code otherwise.
10416bbc98aSShreyansh Jain  */
105e6b82573SHemant Agrawal int dpni_create(struct fsl_mc_io *mc_io,
106e6b82573SHemant Agrawal 		uint16_t dprc_token,
107e6b82573SHemant Agrawal 		uint32_t cmd_flags,
108e6b82573SHemant Agrawal 		const struct dpni_cfg *cfg,
109e6b82573SHemant Agrawal 		uint32_t *obj_id)
110e6b82573SHemant Agrawal {
11116bbc98aSShreyansh Jain 	struct dpni_cmd_create *cmd_params;
112e6b82573SHemant Agrawal 	struct mc_command cmd = { 0 };
113e6b82573SHemant Agrawal 	int err;
114e6b82573SHemant Agrawal 
115e6b82573SHemant Agrawal 	/* prepare command */
116e6b82573SHemant Agrawal 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_CREATE,
117e6b82573SHemant Agrawal 					  cmd_flags,
118e6b82573SHemant Agrawal 					  dprc_token);
11916bbc98aSShreyansh Jain 	cmd_params = (struct dpni_cmd_create *)cmd.params;
12016bbc98aSShreyansh Jain 	cmd_params->options = cpu_to_le32(cfg->options);
12116bbc98aSShreyansh Jain 	cmd_params->num_queues = cfg->num_queues;
12216bbc98aSShreyansh Jain 	cmd_params->num_tcs = cfg->num_tcs;
12316bbc98aSShreyansh Jain 	cmd_params->mac_filter_entries = cfg->mac_filter_entries;
12425fea082SHemant Agrawal 	cmd_params->num_rx_tcs = cfg->num_rx_tcs;
12516bbc98aSShreyansh Jain 	cmd_params->vlan_filter_entries =  cfg->vlan_filter_entries;
12616bbc98aSShreyansh Jain 	cmd_params->qos_entries = cfg->qos_entries;
12716bbc98aSShreyansh Jain 	cmd_params->fs_entries = cpu_to_le16(cfg->fs_entries);
12855984a9bSShreyansh Jain 	cmd_params->num_cgs = cfg->num_cgs;
1292cb2abf3SHemant Agrawal 	cmd_params->num_opr = cfg->num_opr;
1302cb2abf3SHemant Agrawal 	cmd_params->dist_key_size = cfg->dist_key_size;
131f48cd6c6SNipun Gupta 	cmd_params->num_channels = cfg->num_channels;
132e6b82573SHemant Agrawal 
133e6b82573SHemant Agrawal 	/* send command to mc*/
134e6b82573SHemant Agrawal 	err = mc_send_command(mc_io, &cmd);
135e6b82573SHemant Agrawal 	if (err)
136e6b82573SHemant Agrawal 		return err;
137e6b82573SHemant Agrawal 
138e6b82573SHemant Agrawal 	/* retrieve response parameters */
13916bbc98aSShreyansh Jain 	*obj_id = mc_cmd_read_object_id(&cmd);
140e6b82573SHemant Agrawal 
141e6b82573SHemant Agrawal 	return 0;
142e6b82573SHemant Agrawal }
143e6b82573SHemant Agrawal 
14416bbc98aSShreyansh Jain /**
14516bbc98aSShreyansh Jain  * dpni_destroy() - Destroy the DPNI object and release all its resources.
14616bbc98aSShreyansh Jain  * @mc_io:	Pointer to MC portal's I/O object
14716bbc98aSShreyansh Jain  * @dprc_token: Parent container token; '0' for default container
14816bbc98aSShreyansh Jain  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
14916bbc98aSShreyansh Jain  * @object_id:	The object id; it must be a valid id within the container that
15016bbc98aSShreyansh Jain  * created this object;
15116bbc98aSShreyansh Jain  *
15216bbc98aSShreyansh Jain  * The function accepts the authentication token of the parent container that
15316bbc98aSShreyansh Jain  * created the object (not the one that currently owns the object). The object
15416bbc98aSShreyansh Jain  * is searched within parent using the provided 'object_id'.
15516bbc98aSShreyansh Jain  * All tokens to the object must be closed before calling destroy.
15616bbc98aSShreyansh Jain  *
15716bbc98aSShreyansh Jain  * Return:	'0' on Success; error code otherwise.
15816bbc98aSShreyansh Jain  */
159e6b82573SHemant Agrawal int dpni_destroy(struct fsl_mc_io *mc_io,
160e6b82573SHemant Agrawal 		 uint16_t dprc_token,
161e6b82573SHemant Agrawal 		 uint32_t cmd_flags,
162e6b82573SHemant Agrawal 		 uint32_t object_id)
163e6b82573SHemant Agrawal {
16416bbc98aSShreyansh Jain 	struct dpni_cmd_destroy *cmd_params;
165e6b82573SHemant Agrawal 	struct mc_command cmd = { 0 };
166e6b82573SHemant Agrawal 
167e6b82573SHemant Agrawal 	/* prepare command */
168e6b82573SHemant Agrawal 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_DESTROY,
169e6b82573SHemant Agrawal 					  cmd_flags,
170e6b82573SHemant Agrawal 					  dprc_token);
171e6b82573SHemant Agrawal 	/* set object id to destroy */
17216bbc98aSShreyansh Jain 	cmd_params = (struct dpni_cmd_destroy *)cmd.params;
17316bbc98aSShreyansh Jain 	cmd_params->dpsw_id = cpu_to_le32(object_id);
17416bbc98aSShreyansh Jain 
175e6b82573SHemant Agrawal 	/* send command to mc*/
176e6b82573SHemant Agrawal 	return mc_send_command(mc_io, &cmd);
177e6b82573SHemant Agrawal }
178e6b82573SHemant Agrawal 
17916bbc98aSShreyansh Jain /**
18016bbc98aSShreyansh Jain  * dpni_set_pools() - Set buffer pools configuration
18116bbc98aSShreyansh Jain  * @mc_io:	Pointer to MC portal's I/O object
18216bbc98aSShreyansh Jain  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
18316bbc98aSShreyansh Jain  * @token:	Token of DPNI object
18416bbc98aSShreyansh Jain  * @cfg:	Buffer pools configuration
18516bbc98aSShreyansh Jain  *
18616bbc98aSShreyansh Jain  * mandatory for DPNI operation
18716bbc98aSShreyansh Jain  * warning:Allowed only when DPNI is disabled
18816bbc98aSShreyansh Jain  *
18916bbc98aSShreyansh Jain  * Return:	'0' on Success; Error code otherwise.
19016bbc98aSShreyansh Jain  */
191e6b82573SHemant Agrawal int dpni_set_pools(struct fsl_mc_io *mc_io,
192e6b82573SHemant Agrawal 		   uint32_t cmd_flags,
193e6b82573SHemant Agrawal 		   uint16_t token,
194e6b82573SHemant Agrawal 		   const struct dpni_pools_cfg *cfg)
195e6b82573SHemant Agrawal {
196e6b82573SHemant Agrawal 	struct mc_command cmd = { 0 };
19716bbc98aSShreyansh Jain 	struct dpni_cmd_set_pools *cmd_params;
19816bbc98aSShreyansh Jain 	int i;
199e6b82573SHemant Agrawal 
200e6b82573SHemant Agrawal 	/* prepare command */
201e6b82573SHemant Agrawal 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_POOLS,
202e6b82573SHemant Agrawal 					  cmd_flags,
203e6b82573SHemant Agrawal 					  token);
20416bbc98aSShreyansh Jain 	cmd_params = (struct dpni_cmd_set_pools *)cmd.params;
20516bbc98aSShreyansh Jain 	cmd_params->num_dpbp = cfg->num_dpbp;
20696f7bfe8SSachin Saxena 	cmd_params->pool_options = cfg->pool_options;
207f48cd6c6SNipun Gupta 	for (i = 0; i < DPNI_MAX_DPBP; i++) {
20816bbc98aSShreyansh Jain 		cmd_params->pool[i].dpbp_id =
20916bbc98aSShreyansh Jain 			cpu_to_le16(cfg->pools[i].dpbp_id);
21016bbc98aSShreyansh Jain 		cmd_params->pool[i].priority_mask =
21116bbc98aSShreyansh Jain 			cfg->pools[i].priority_mask;
21216bbc98aSShreyansh Jain 		cmd_params->buffer_size[i] =
21316bbc98aSShreyansh Jain 			cpu_to_le16(cfg->pools[i].buffer_size);
21416bbc98aSShreyansh Jain 		cmd_params->backup_pool_mask |=
21516bbc98aSShreyansh Jain 			DPNI_BACKUP_POOL(cfg->pools[i].backup_pool, i);
21616bbc98aSShreyansh Jain 	}
217e6b82573SHemant Agrawal 
218e6b82573SHemant Agrawal 	/* send command to mc*/
219e6b82573SHemant Agrawal 	return mc_send_command(mc_io, &cmd);
220e6b82573SHemant Agrawal }
221e6b82573SHemant Agrawal 
22216bbc98aSShreyansh Jain /**
22316bbc98aSShreyansh Jain  * dpni_enable() - Enable the DPNI, allow sending and receiving frames.
22416bbc98aSShreyansh Jain  * @mc_io:	Pointer to MC portal's I/O object
22516bbc98aSShreyansh Jain  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
22616bbc98aSShreyansh Jain  * @token:	Token of DPNI object
22716bbc98aSShreyansh Jain  *
22816bbc98aSShreyansh Jain  * Return:	'0' on Success; Error code otherwise.
22916bbc98aSShreyansh Jain  */
230e6b82573SHemant Agrawal int dpni_enable(struct fsl_mc_io *mc_io,
231e6b82573SHemant Agrawal 		uint32_t cmd_flags,
232e6b82573SHemant Agrawal 		uint16_t token)
233e6b82573SHemant Agrawal {
234e6b82573SHemant Agrawal 	struct mc_command cmd = { 0 };
235e6b82573SHemant Agrawal 
236e6b82573SHemant Agrawal 	/* prepare command */
237e6b82573SHemant Agrawal 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_ENABLE,
238e6b82573SHemant Agrawal 					  cmd_flags,
239e6b82573SHemant Agrawal 					  token);
240e6b82573SHemant Agrawal 
241e6b82573SHemant Agrawal 	/* send command to mc*/
242e6b82573SHemant Agrawal 	return mc_send_command(mc_io, &cmd);
243e6b82573SHemant Agrawal }
244e6b82573SHemant Agrawal 
24516bbc98aSShreyansh Jain /**
24616bbc98aSShreyansh Jain  * dpni_disable() - Disable the DPNI, stop sending and receiving frames.
24716bbc98aSShreyansh Jain  * @mc_io:	Pointer to MC portal's I/O object
24816bbc98aSShreyansh Jain  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
24916bbc98aSShreyansh Jain  * @token:	Token of DPNI object
25016bbc98aSShreyansh Jain  *
25116bbc98aSShreyansh Jain  * Return:	'0' on Success; Error code otherwise.
25216bbc98aSShreyansh Jain  */
253e6b82573SHemant Agrawal int dpni_disable(struct fsl_mc_io *mc_io,
254e6b82573SHemant Agrawal 		 uint32_t cmd_flags,
255e6b82573SHemant Agrawal 		 uint16_t token)
256e6b82573SHemant Agrawal {
257e6b82573SHemant Agrawal 	struct mc_command cmd = { 0 };
258e6b82573SHemant Agrawal 
259e6b82573SHemant Agrawal 	/* prepare command */
260e6b82573SHemant Agrawal 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_DISABLE,
261e6b82573SHemant Agrawal 					  cmd_flags,
262e6b82573SHemant Agrawal 					  token);
263e6b82573SHemant Agrawal 
264e6b82573SHemant Agrawal 	/* send command to mc*/
265e6b82573SHemant Agrawal 	return mc_send_command(mc_io, &cmd);
266e6b82573SHemant Agrawal }
267e6b82573SHemant Agrawal 
26816bbc98aSShreyansh Jain /**
26916bbc98aSShreyansh Jain  * dpni_is_enabled() - Check if the DPNI is enabled.
27016bbc98aSShreyansh Jain  * @mc_io:	Pointer to MC portal's I/O object
27116bbc98aSShreyansh Jain  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
27216bbc98aSShreyansh Jain  * @token:	Token of DPNI object
27316bbc98aSShreyansh Jain  * @en:		Returns '1' if object is enabled; '0' otherwise
27416bbc98aSShreyansh Jain  *
27516bbc98aSShreyansh Jain  * Return:	'0' on Success; Error code otherwise.
27616bbc98aSShreyansh Jain  */
277e6b82573SHemant Agrawal int dpni_is_enabled(struct fsl_mc_io *mc_io,
278e6b82573SHemant Agrawal 		    uint32_t cmd_flags,
279e6b82573SHemant Agrawal 		    uint16_t token,
280e6b82573SHemant Agrawal 		    int *en)
281e6b82573SHemant Agrawal {
282e6b82573SHemant Agrawal 	struct mc_command cmd = { 0 };
28316bbc98aSShreyansh Jain 	struct dpni_rsp_is_enabled *rsp_params;
284e6b82573SHemant Agrawal 	int err;
28516bbc98aSShreyansh Jain 
286e6b82573SHemant Agrawal 	/* prepare command */
28716bbc98aSShreyansh Jain 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_IS_ENABLED,
28816bbc98aSShreyansh Jain 					  cmd_flags,
289e6b82573SHemant Agrawal 					  token);
290e6b82573SHemant Agrawal 
291e6b82573SHemant Agrawal 	/* send command to mc*/
292e6b82573SHemant Agrawal 	err = mc_send_command(mc_io, &cmd);
293e6b82573SHemant Agrawal 	if (err)
294e6b82573SHemant Agrawal 		return err;
295e6b82573SHemant Agrawal 
296e6b82573SHemant Agrawal 	/* retrieve response parameters */
29716bbc98aSShreyansh Jain 	rsp_params = (struct dpni_rsp_is_enabled *)cmd.params;
29816bbc98aSShreyansh Jain 	*en = dpni_get_field(rsp_params->enabled, ENABLE);
299e6b82573SHemant Agrawal 
300e6b82573SHemant Agrawal 	return 0;
301e6b82573SHemant Agrawal }
302e6b82573SHemant Agrawal 
30316bbc98aSShreyansh Jain /**
30416bbc98aSShreyansh Jain  * dpni_reset() - Reset the DPNI, returns the object to initial state.
30516bbc98aSShreyansh Jain  * @mc_io:	Pointer to MC portal's I/O object
30616bbc98aSShreyansh Jain  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
30716bbc98aSShreyansh Jain  * @token:	Token of DPNI object
30816bbc98aSShreyansh Jain  *
30916bbc98aSShreyansh Jain  * Return:	'0' on Success; Error code otherwise.
31016bbc98aSShreyansh Jain  */
311e6b82573SHemant Agrawal int dpni_reset(struct fsl_mc_io *mc_io,
312e6b82573SHemant Agrawal 	       uint32_t cmd_flags,
313e6b82573SHemant Agrawal 	       uint16_t token)
314e6b82573SHemant Agrawal {
315e6b82573SHemant Agrawal 	struct mc_command cmd = { 0 };
316e6b82573SHemant Agrawal 
317e6b82573SHemant Agrawal 	/* prepare command */
318e6b82573SHemant Agrawal 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_RESET,
319e6b82573SHemant Agrawal 					  cmd_flags,
320e6b82573SHemant Agrawal 					  token);
321e6b82573SHemant Agrawal 
322e6b82573SHemant Agrawal 	/* send command to mc*/
323e6b82573SHemant Agrawal 	return mc_send_command(mc_io, &cmd);
324e6b82573SHemant Agrawal }
325e6b82573SHemant Agrawal 
32616bbc98aSShreyansh Jain /**
327c5acbb5eSHemant Agrawal  * dpni_set_irq_enable() - Set overall interrupt state.
328c5acbb5eSHemant Agrawal  * @mc_io:	Pointer to MC portal's I/O object
329c5acbb5eSHemant Agrawal  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
330c5acbb5eSHemant Agrawal  * @token:	Token of DPNI object
331c5acbb5eSHemant Agrawal  * @irq_index:	The interrupt index to configure
332c5acbb5eSHemant Agrawal  * @en:		Interrupt state: - enable = 1, disable = 0
333c5acbb5eSHemant Agrawal  *
334c5acbb5eSHemant Agrawal  * Allows GPP software to control when interrupts are generated.
335c5acbb5eSHemant Agrawal  * Each interrupt can have up to 32 causes.  The enable/disable control's the
336c5acbb5eSHemant Agrawal  * overall interrupt state. if the interrupt is disabled no causes will cause
337c5acbb5eSHemant Agrawal  * an interrupt.
338c5acbb5eSHemant Agrawal  *
339c5acbb5eSHemant Agrawal  * Return:	'0' on Success; Error code otherwise.
340c5acbb5eSHemant Agrawal  */
341c5acbb5eSHemant Agrawal int dpni_set_irq_enable(struct fsl_mc_io *mc_io,
342c5acbb5eSHemant Agrawal 			uint32_t cmd_flags,
343c5acbb5eSHemant Agrawal 			uint16_t token,
344c5acbb5eSHemant Agrawal 			uint8_t irq_index,
345c5acbb5eSHemant Agrawal 			uint8_t en)
346c5acbb5eSHemant Agrawal {
347c5acbb5eSHemant Agrawal 	struct mc_command cmd = { 0 };
348c5acbb5eSHemant Agrawal 	struct dpni_cmd_set_irq_enable *cmd_params;
349c5acbb5eSHemant Agrawal 
350c5acbb5eSHemant Agrawal 	/* prepare command */
351c5acbb5eSHemant Agrawal 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_IRQ_ENABLE,
352c5acbb5eSHemant Agrawal 					  cmd_flags,
353c5acbb5eSHemant Agrawal 					  token);
354c5acbb5eSHemant Agrawal 	cmd_params = (struct dpni_cmd_set_irq_enable *)cmd.params;
355c5acbb5eSHemant Agrawal 	dpni_set_field(cmd_params->enable, ENABLE, en);
356c5acbb5eSHemant Agrawal 	cmd_params->irq_index = irq_index;
357c5acbb5eSHemant Agrawal 
358c5acbb5eSHemant Agrawal 	/* send command to mc*/
359c5acbb5eSHemant Agrawal 	return mc_send_command(mc_io, &cmd);
360c5acbb5eSHemant Agrawal }
361c5acbb5eSHemant Agrawal 
362c5acbb5eSHemant Agrawal /**
363c5acbb5eSHemant Agrawal  * dpni_get_irq_enable() - Get overall interrupt state
364c5acbb5eSHemant Agrawal  * @mc_io:	Pointer to MC portal's I/O object
365c5acbb5eSHemant Agrawal  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
366c5acbb5eSHemant Agrawal  * @token:	Token of DPNI object
367c5acbb5eSHemant Agrawal  * @irq_index:	The interrupt index to configure
368c5acbb5eSHemant Agrawal  * @en:		Returned interrupt state - enable = 1, disable = 0
369c5acbb5eSHemant Agrawal  *
370c5acbb5eSHemant Agrawal  * Return:	'0' on Success; Error code otherwise.
371c5acbb5eSHemant Agrawal  */
372c5acbb5eSHemant Agrawal int dpni_get_irq_enable(struct fsl_mc_io *mc_io,
373c5acbb5eSHemant Agrawal 			uint32_t cmd_flags,
374c5acbb5eSHemant Agrawal 			uint16_t token,
375c5acbb5eSHemant Agrawal 			uint8_t irq_index,
376c5acbb5eSHemant Agrawal 			uint8_t *en)
377c5acbb5eSHemant Agrawal {
378c5acbb5eSHemant Agrawal 	struct mc_command cmd = { 0 };
379c5acbb5eSHemant Agrawal 	struct dpni_cmd_get_irq_enable *cmd_params;
380c5acbb5eSHemant Agrawal 	struct dpni_rsp_get_irq_enable *rsp_params;
381c5acbb5eSHemant Agrawal 
382c5acbb5eSHemant Agrawal 	int err;
383c5acbb5eSHemant Agrawal 
384c5acbb5eSHemant Agrawal 	/* prepare command */
385c5acbb5eSHemant Agrawal 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_IRQ_ENABLE,
386c5acbb5eSHemant Agrawal 					  cmd_flags,
387c5acbb5eSHemant Agrawal 					  token);
388c5acbb5eSHemant Agrawal 	cmd_params = (struct dpni_cmd_get_irq_enable *)cmd.params;
389c5acbb5eSHemant Agrawal 	cmd_params->irq_index = irq_index;
390c5acbb5eSHemant Agrawal 
391c5acbb5eSHemant Agrawal 	/* send command to mc*/
392c5acbb5eSHemant Agrawal 	err = mc_send_command(mc_io, &cmd);
393c5acbb5eSHemant Agrawal 	if (err)
394c5acbb5eSHemant Agrawal 		return err;
395c5acbb5eSHemant Agrawal 
396c5acbb5eSHemant Agrawal 	/* retrieve response parameters */
397c5acbb5eSHemant Agrawal 	rsp_params = (struct dpni_rsp_get_irq_enable *)cmd.params;
398c5acbb5eSHemant Agrawal 	*en = dpni_get_field(rsp_params->enabled, ENABLE);
399c5acbb5eSHemant Agrawal 
400c5acbb5eSHemant Agrawal 	return 0;
401c5acbb5eSHemant Agrawal }
402c5acbb5eSHemant Agrawal 
403c5acbb5eSHemant Agrawal /**
404c5acbb5eSHemant Agrawal  * dpni_set_irq_mask() - Set interrupt mask.
405c5acbb5eSHemant Agrawal  * @mc_io:	Pointer to MC portal's I/O object
406c5acbb5eSHemant Agrawal  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
407c5acbb5eSHemant Agrawal  * @token:	Token of DPNI object
408c5acbb5eSHemant Agrawal  * @irq_index:	The interrupt index to configure
409c5acbb5eSHemant Agrawal  * @mask:	Event mask to trigger interrupt;
410c5acbb5eSHemant Agrawal  *		each bit:
411c5acbb5eSHemant Agrawal  *			0 = ignore event
412c5acbb5eSHemant Agrawal  *			1 = consider event for asserting IRQ
413c5acbb5eSHemant Agrawal  *
414c5acbb5eSHemant Agrawal  * Every interrupt can have up to 32 causes and the interrupt model supports
415c5acbb5eSHemant Agrawal  * masking/unmasking each cause independently
416c5acbb5eSHemant Agrawal  *
417c5acbb5eSHemant Agrawal  * Return:	'0' on Success; Error code otherwise.
418c5acbb5eSHemant Agrawal  */
419c5acbb5eSHemant Agrawal int dpni_set_irq_mask(struct fsl_mc_io *mc_io,
420c5acbb5eSHemant Agrawal 		      uint32_t cmd_flags,
421c5acbb5eSHemant Agrawal 		      uint16_t token,
422c5acbb5eSHemant Agrawal 		      uint8_t irq_index,
423c5acbb5eSHemant Agrawal 		      uint32_t mask)
424c5acbb5eSHemant Agrawal {
425c5acbb5eSHemant Agrawal 	struct mc_command cmd = { 0 };
426c5acbb5eSHemant Agrawal 	struct dpni_cmd_set_irq_mask *cmd_params;
427c5acbb5eSHemant Agrawal 
428c5acbb5eSHemant Agrawal 	/* prepare command */
429c5acbb5eSHemant Agrawal 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_IRQ_MASK,
430c5acbb5eSHemant Agrawal 					  cmd_flags,
431c5acbb5eSHemant Agrawal 					  token);
432c5acbb5eSHemant Agrawal 	cmd_params = (struct dpni_cmd_set_irq_mask *)cmd.params;
433c5acbb5eSHemant Agrawal 	cmd_params->mask = cpu_to_le32(mask);
434c5acbb5eSHemant Agrawal 	cmd_params->irq_index = irq_index;
435c5acbb5eSHemant Agrawal 
436c5acbb5eSHemant Agrawal 	/* send command to mc*/
437c5acbb5eSHemant Agrawal 	return mc_send_command(mc_io, &cmd);
438c5acbb5eSHemant Agrawal }
439c5acbb5eSHemant Agrawal 
440c5acbb5eSHemant Agrawal /**
441c5acbb5eSHemant Agrawal  * dpni_get_irq_mask() - Get interrupt mask.
442c5acbb5eSHemant Agrawal  * @mc_io:	Pointer to MC portal's I/O object
443c5acbb5eSHemant Agrawal  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
444c5acbb5eSHemant Agrawal  * @token:	Token of DPNI object
445c5acbb5eSHemant Agrawal  * @irq_index:	The interrupt index to configure
446c5acbb5eSHemant Agrawal  * @mask:	Returned event mask to trigger interrupt
447c5acbb5eSHemant Agrawal  *
448c5acbb5eSHemant Agrawal  * Every interrupt can have up to 32 causes and the interrupt model supports
449c5acbb5eSHemant Agrawal  * masking/unmasking each cause independently
450c5acbb5eSHemant Agrawal  *
451c5acbb5eSHemant Agrawal  * Return:	'0' on Success; Error code otherwise.
452c5acbb5eSHemant Agrawal  */
453c5acbb5eSHemant Agrawal int dpni_get_irq_mask(struct fsl_mc_io *mc_io,
454c5acbb5eSHemant Agrawal 		      uint32_t cmd_flags,
455c5acbb5eSHemant Agrawal 		      uint16_t token,
456c5acbb5eSHemant Agrawal 		      uint8_t irq_index,
457c5acbb5eSHemant Agrawal 		      uint32_t *mask)
458c5acbb5eSHemant Agrawal {
459c5acbb5eSHemant Agrawal 	struct mc_command cmd = { 0 };
460c5acbb5eSHemant Agrawal 	struct dpni_cmd_get_irq_mask *cmd_params;
461c5acbb5eSHemant Agrawal 	struct dpni_rsp_get_irq_mask *rsp_params;
462c5acbb5eSHemant Agrawal 	int err;
463c5acbb5eSHemant Agrawal 
464c5acbb5eSHemant Agrawal 	/* prepare command */
465c5acbb5eSHemant Agrawal 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_IRQ_MASK,
466c5acbb5eSHemant Agrawal 					  cmd_flags,
467c5acbb5eSHemant Agrawal 					  token);
468c5acbb5eSHemant Agrawal 	cmd_params = (struct dpni_cmd_get_irq_mask *)cmd.params;
469c5acbb5eSHemant Agrawal 	cmd_params->irq_index = irq_index;
470c5acbb5eSHemant Agrawal 
471c5acbb5eSHemant Agrawal 	/* send command to mc*/
472c5acbb5eSHemant Agrawal 	err = mc_send_command(mc_io, &cmd);
473c5acbb5eSHemant Agrawal 	if (err)
474c5acbb5eSHemant Agrawal 		return err;
475c5acbb5eSHemant Agrawal 
476c5acbb5eSHemant Agrawal 	/* retrieve response parameters */
477c5acbb5eSHemant Agrawal 	rsp_params = (struct dpni_rsp_get_irq_mask *)cmd.params;
478c5acbb5eSHemant Agrawal 	*mask = le32_to_cpu(rsp_params->mask);
479c5acbb5eSHemant Agrawal 
480c5acbb5eSHemant Agrawal 	return 0;
481c5acbb5eSHemant Agrawal }
482c5acbb5eSHemant Agrawal 
483c5acbb5eSHemant Agrawal /**
484c5acbb5eSHemant Agrawal  * dpni_get_irq_status() - Get the current status of any pending interrupts.
485c5acbb5eSHemant Agrawal  * @mc_io:	Pointer to MC portal's I/O object
486c5acbb5eSHemant Agrawal  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
487c5acbb5eSHemant Agrawal  * @token:	Token of DPNI object
488c5acbb5eSHemant Agrawal  * @irq_index:	The interrupt index to configure
489c5acbb5eSHemant Agrawal  * @status:	Returned interrupts status - one bit per cause:
490c5acbb5eSHemant Agrawal  *			0 = no interrupt pending
491c5acbb5eSHemant Agrawal  *			1 = interrupt pending
492c5acbb5eSHemant Agrawal  *
493c5acbb5eSHemant Agrawal  * Return:	'0' on Success; Error code otherwise.
494c5acbb5eSHemant Agrawal  */
495c5acbb5eSHemant Agrawal int dpni_get_irq_status(struct fsl_mc_io *mc_io,
496c5acbb5eSHemant Agrawal 			uint32_t cmd_flags,
497c5acbb5eSHemant Agrawal 			uint16_t token,
498c5acbb5eSHemant Agrawal 			uint8_t irq_index,
499c5acbb5eSHemant Agrawal 			uint32_t *status)
500c5acbb5eSHemant Agrawal {
501c5acbb5eSHemant Agrawal 	struct mc_command cmd = { 0 };
502c5acbb5eSHemant Agrawal 	struct dpni_cmd_get_irq_status *cmd_params;
503c5acbb5eSHemant Agrawal 	struct dpni_rsp_get_irq_status *rsp_params;
504c5acbb5eSHemant Agrawal 	int err;
505c5acbb5eSHemant Agrawal 
506c5acbb5eSHemant Agrawal 	/* prepare command */
507c5acbb5eSHemant Agrawal 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_IRQ_STATUS,
508c5acbb5eSHemant Agrawal 					  cmd_flags,
509c5acbb5eSHemant Agrawal 					  token);
510c5acbb5eSHemant Agrawal 	cmd_params = (struct dpni_cmd_get_irq_status *)cmd.params;
511c5acbb5eSHemant Agrawal 	cmd_params->status = cpu_to_le32(*status);
512c5acbb5eSHemant Agrawal 	cmd_params->irq_index = irq_index;
513c5acbb5eSHemant Agrawal 
514c5acbb5eSHemant Agrawal 	/* send command to mc*/
515c5acbb5eSHemant Agrawal 	err = mc_send_command(mc_io, &cmd);
516c5acbb5eSHemant Agrawal 	if (err)
517c5acbb5eSHemant Agrawal 		return err;
518c5acbb5eSHemant Agrawal 
519c5acbb5eSHemant Agrawal 	/* retrieve response parameters */
520c5acbb5eSHemant Agrawal 	rsp_params = (struct dpni_rsp_get_irq_status *)cmd.params;
521c5acbb5eSHemant Agrawal 	*status = le32_to_cpu(rsp_params->status);
522c5acbb5eSHemant Agrawal 
523c5acbb5eSHemant Agrawal 	return 0;
524c5acbb5eSHemant Agrawal }
525c5acbb5eSHemant Agrawal 
526c5acbb5eSHemant Agrawal /**
527c5acbb5eSHemant Agrawal  * dpni_clear_irq_status() - Clear a pending interrupt's status
528c5acbb5eSHemant Agrawal  * @mc_io:	Pointer to MC portal's I/O object
529c5acbb5eSHemant Agrawal  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
530c5acbb5eSHemant Agrawal  * @token:	Token of DPNI object
531c5acbb5eSHemant Agrawal  * @irq_index:	The interrupt index to configure
532c5acbb5eSHemant Agrawal  * @status:	bits to clear (W1C) - one bit per cause:
533c5acbb5eSHemant Agrawal  *			0 = don't change
534c5acbb5eSHemant Agrawal  *			1 = clear status bit
535c5acbb5eSHemant Agrawal  *
536c5acbb5eSHemant Agrawal  * Return:	'0' on Success; Error code otherwise.
537c5acbb5eSHemant Agrawal  */
538c5acbb5eSHemant Agrawal int dpni_clear_irq_status(struct fsl_mc_io *mc_io,
539c5acbb5eSHemant Agrawal 			  uint32_t cmd_flags,
540c5acbb5eSHemant Agrawal 			  uint16_t token,
541c5acbb5eSHemant Agrawal 			  uint8_t irq_index,
542c5acbb5eSHemant Agrawal 			  uint32_t status)
543c5acbb5eSHemant Agrawal {
544c5acbb5eSHemant Agrawal 	struct mc_command cmd = { 0 };
545c5acbb5eSHemant Agrawal 	struct dpni_cmd_clear_irq_status *cmd_params;
546c5acbb5eSHemant Agrawal 
547c5acbb5eSHemant Agrawal 	/* prepare command */
548c5acbb5eSHemant Agrawal 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_CLEAR_IRQ_STATUS,
549c5acbb5eSHemant Agrawal 					  cmd_flags,
550c5acbb5eSHemant Agrawal 					  token);
551c5acbb5eSHemant Agrawal 	cmd_params = (struct dpni_cmd_clear_irq_status *)cmd.params;
552c5acbb5eSHemant Agrawal 	cmd_params->irq_index = irq_index;
553c5acbb5eSHemant Agrawal 	cmd_params->status = cpu_to_le32(status);
554c5acbb5eSHemant Agrawal 
555c5acbb5eSHemant Agrawal 	/* send command to mc*/
556c5acbb5eSHemant Agrawal 	return mc_send_command(mc_io, &cmd);
557c5acbb5eSHemant Agrawal }
558c5acbb5eSHemant Agrawal 
559c5acbb5eSHemant Agrawal /**
56016bbc98aSShreyansh Jain  * dpni_get_attributes() - Retrieve DPNI attributes.
56116bbc98aSShreyansh Jain  * @mc_io:	Pointer to MC portal's I/O object
56216bbc98aSShreyansh Jain  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
56316bbc98aSShreyansh Jain  * @token:	Token of DPNI object
56416bbc98aSShreyansh Jain  * @attr:	Object's attributes
56516bbc98aSShreyansh Jain  *
56616bbc98aSShreyansh Jain  * Return:	'0' on Success; Error code otherwise.
56716bbc98aSShreyansh Jain  */
568e6b82573SHemant Agrawal int dpni_get_attributes(struct fsl_mc_io *mc_io,
569e6b82573SHemant Agrawal 			uint32_t cmd_flags,
570e6b82573SHemant Agrawal 			uint16_t token,
571e6b82573SHemant Agrawal 			struct dpni_attr *attr)
572e6b82573SHemant Agrawal {
573e6b82573SHemant Agrawal 	struct mc_command cmd = { 0 };
57416bbc98aSShreyansh Jain 	struct dpni_rsp_get_attr *rsp_params;
57516bbc98aSShreyansh Jain 
576e6b82573SHemant Agrawal 	int err;
577e6b82573SHemant Agrawal 
578e6b82573SHemant Agrawal 	/* prepare command */
579e6b82573SHemant Agrawal 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_ATTR,
580e6b82573SHemant Agrawal 					  cmd_flags,
581e6b82573SHemant Agrawal 					  token);
582e6b82573SHemant Agrawal 
583e6b82573SHemant Agrawal 	/* send command to mc*/
584e6b82573SHemant Agrawal 	err = mc_send_command(mc_io, &cmd);
585e6b82573SHemant Agrawal 	if (err)
586e6b82573SHemant Agrawal 		return err;
587e6b82573SHemant Agrawal 
588e6b82573SHemant Agrawal 	/* retrieve response parameters */
58916bbc98aSShreyansh Jain 	rsp_params = (struct dpni_rsp_get_attr *)cmd.params;
59016bbc98aSShreyansh Jain 	attr->options = le32_to_cpu(rsp_params->options);
59116bbc98aSShreyansh Jain 	attr->num_queues = rsp_params->num_queues;
59216bbc98aSShreyansh Jain 	attr->num_rx_tcs = rsp_params->num_rx_tcs;
59316bbc98aSShreyansh Jain 	attr->num_tx_tcs = rsp_params->num_tx_tcs;
59416bbc98aSShreyansh Jain 	attr->mac_filter_entries = rsp_params->mac_filter_entries;
59516bbc98aSShreyansh Jain 	attr->vlan_filter_entries = rsp_params->vlan_filter_entries;
596f48cd6c6SNipun Gupta 	attr->num_channels = rsp_params->num_channels;
59716bbc98aSShreyansh Jain 	attr->qos_entries = rsp_params->qos_entries;
59816bbc98aSShreyansh Jain 	attr->fs_entries = le16_to_cpu(rsp_params->fs_entries);
59901690f8fSRohit Raj 	attr->num_opr = le16_to_cpu(rsp_params->num_opr);
60016bbc98aSShreyansh Jain 	attr->qos_key_size = rsp_params->qos_key_size;
60116bbc98aSShreyansh Jain 	attr->fs_key_size = rsp_params->fs_key_size;
60216bbc98aSShreyansh Jain 	attr->wriop_version = le16_to_cpu(rsp_params->wriop_version);
60355984a9bSShreyansh Jain 	attr->num_cgs = rsp_params->num_cgs;
604e6b82573SHemant Agrawal 
605e6b82573SHemant Agrawal 	return 0;
606e6b82573SHemant Agrawal }
607e6b82573SHemant Agrawal 
60816bbc98aSShreyansh Jain /**
60916bbc98aSShreyansh Jain  * dpni_set_errors_behavior() - Set errors behavior
61016bbc98aSShreyansh Jain  * @mc_io:	Pointer to MC portal's I/O object
61116bbc98aSShreyansh Jain  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
61216bbc98aSShreyansh Jain  * @token:	Token of DPNI object
61316bbc98aSShreyansh Jain  * @cfg:	Errors configuration
61416bbc98aSShreyansh Jain  *
61516bbc98aSShreyansh Jain  * This function may be called numerous times with different
61616bbc98aSShreyansh Jain  * error masks
61716bbc98aSShreyansh Jain  *
61816bbc98aSShreyansh Jain  * Return:	'0' on Success; Error code otherwise.
61916bbc98aSShreyansh Jain  */
620e6b82573SHemant Agrawal int dpni_set_errors_behavior(struct fsl_mc_io *mc_io,
621e6b82573SHemant Agrawal 			     uint32_t cmd_flags,
622e6b82573SHemant Agrawal 			     uint16_t token,
623e6b82573SHemant Agrawal 			     struct dpni_error_cfg *cfg)
624e6b82573SHemant Agrawal {
625e6b82573SHemant Agrawal 	struct mc_command cmd = { 0 };
62616bbc98aSShreyansh Jain 	struct dpni_cmd_set_errors_behavior *cmd_params;
627e6b82573SHemant Agrawal 
628e6b82573SHemant Agrawal 	/* prepare command */
629e6b82573SHemant Agrawal 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_ERRORS_BEHAVIOR,
630e6b82573SHemant Agrawal 					  cmd_flags,
631e6b82573SHemant Agrawal 					  token);
63216bbc98aSShreyansh Jain 	cmd_params = (struct dpni_cmd_set_errors_behavior *)cmd.params;
63316bbc98aSShreyansh Jain 	cmd_params->errors = cpu_to_le32(cfg->errors);
63416bbc98aSShreyansh Jain 	dpni_set_field(cmd_params->flags, ERROR_ACTION, cfg->error_action);
63516bbc98aSShreyansh Jain 	dpni_set_field(cmd_params->flags, FRAME_ANN, cfg->set_frame_annotation);
636e6b82573SHemant Agrawal 
637e6b82573SHemant Agrawal 	/* send command to mc*/
638e6b82573SHemant Agrawal 	return mc_send_command(mc_io, &cmd);
639e6b82573SHemant Agrawal }
640e6b82573SHemant Agrawal 
64116bbc98aSShreyansh Jain /**
64216bbc98aSShreyansh Jain  * dpni_get_buffer_layout() - Retrieve buffer layout attributes.
64316bbc98aSShreyansh Jain  * @mc_io:	Pointer to MC portal's I/O object
64416bbc98aSShreyansh Jain  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
64516bbc98aSShreyansh Jain  * @token:	Token of DPNI object
64616bbc98aSShreyansh Jain  * @qtype:	Type of queue to retrieve configuration for
64716bbc98aSShreyansh Jain  * @layout:	Returns buffer layout attributes
64816bbc98aSShreyansh Jain  *
64916bbc98aSShreyansh Jain  * Return:	'0' on Success; Error code otherwise.
65016bbc98aSShreyansh Jain  */
651e6b82573SHemant Agrawal int dpni_get_buffer_layout(struct fsl_mc_io *mc_io,
652e6b82573SHemant Agrawal 			   uint32_t cmd_flags,
653e6b82573SHemant Agrawal 			   uint16_t token,
654e6b82573SHemant Agrawal 			   enum dpni_queue_type qtype,
655e6b82573SHemant Agrawal 			   struct dpni_buffer_layout *layout)
656e6b82573SHemant Agrawal {
657e6b82573SHemant Agrawal 	struct mc_command cmd = { 0 };
65816bbc98aSShreyansh Jain 	struct dpni_cmd_get_buffer_layout *cmd_params;
65916bbc98aSShreyansh Jain 	struct dpni_rsp_get_buffer_layout *rsp_params;
660e6b82573SHemant Agrawal 	int err;
661e6b82573SHemant Agrawal 
662e6b82573SHemant Agrawal 	/* prepare command */
663e6b82573SHemant Agrawal 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_BUFFER_LAYOUT,
664e6b82573SHemant Agrawal 					  cmd_flags,
665e6b82573SHemant Agrawal 					  token);
66616bbc98aSShreyansh Jain 	cmd_params = (struct dpni_cmd_get_buffer_layout *)cmd.params;
66716bbc98aSShreyansh Jain 	cmd_params->qtype = qtype;
668e6b82573SHemant Agrawal 
669e6b82573SHemant Agrawal 	/* send command to mc*/
670e6b82573SHemant Agrawal 	err = mc_send_command(mc_io, &cmd);
671e6b82573SHemant Agrawal 	if (err)
672e6b82573SHemant Agrawal 		return err;
673e6b82573SHemant Agrawal 
674e6b82573SHemant Agrawal 	/* retrieve response parameters */
67516bbc98aSShreyansh Jain 	rsp_params = (struct dpni_rsp_get_buffer_layout *)cmd.params;
67625fea082SHemant Agrawal 	layout->pass_timestamp =
67725fea082SHemant Agrawal 				(int)dpni_get_field(rsp_params->flags, PASS_TS);
67825fea082SHemant Agrawal 	layout->pass_parser_result =
67925fea082SHemant Agrawal 				(int)dpni_get_field(rsp_params->flags, PASS_PR);
68025fea082SHemant Agrawal 	layout->pass_frame_status =
68125fea082SHemant Agrawal 				(int)dpni_get_field(rsp_params->flags, PASS_FS);
68225fea082SHemant Agrawal 	layout->pass_sw_opaque =
68325fea082SHemant Agrawal 			(int)dpni_get_field(rsp_params->flags, PASS_SWO);
68416bbc98aSShreyansh Jain 	layout->private_data_size = le16_to_cpu(rsp_params->private_data_size);
68516bbc98aSShreyansh Jain 	layout->data_align = le16_to_cpu(rsp_params->data_align);
68616bbc98aSShreyansh Jain 	layout->data_head_room = le16_to_cpu(rsp_params->head_room);
68716bbc98aSShreyansh Jain 	layout->data_tail_room = le16_to_cpu(rsp_params->tail_room);
688e6b82573SHemant Agrawal 
689e6b82573SHemant Agrawal 	return 0;
690e6b82573SHemant Agrawal }
691e6b82573SHemant Agrawal 
69216bbc98aSShreyansh Jain /**
69316bbc98aSShreyansh Jain  * dpni_set_buffer_layout() - Set buffer layout configuration.
69416bbc98aSShreyansh Jain  * @mc_io:	Pointer to MC portal's I/O object
69516bbc98aSShreyansh Jain  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
69616bbc98aSShreyansh Jain  * @token:	Token of DPNI object
69716bbc98aSShreyansh Jain  * @qtype:	Type of queue this configuration applies to
69816bbc98aSShreyansh Jain  * @layout:	Buffer layout configuration
69916bbc98aSShreyansh Jain  *
70016bbc98aSShreyansh Jain  * Return:	'0' on Success; Error code otherwise.
70116bbc98aSShreyansh Jain  *
70216bbc98aSShreyansh Jain  * @warning	Allowed only when DPNI is disabled
70316bbc98aSShreyansh Jain  */
704e6b82573SHemant Agrawal int dpni_set_buffer_layout(struct fsl_mc_io *mc_io,
705e6b82573SHemant Agrawal 			   uint32_t cmd_flags,
706e6b82573SHemant Agrawal 			   uint16_t token,
707e6b82573SHemant Agrawal 			   enum dpni_queue_type qtype,
708e6b82573SHemant Agrawal 			   const struct dpni_buffer_layout *layout)
709e6b82573SHemant Agrawal {
710e6b82573SHemant Agrawal 	struct mc_command cmd = { 0 };
71116bbc98aSShreyansh Jain 	struct dpni_cmd_set_buffer_layout *cmd_params;
712e6b82573SHemant Agrawal 
713e6b82573SHemant Agrawal 	/* prepare command */
714e6b82573SHemant Agrawal 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_BUFFER_LAYOUT,
715e6b82573SHemant Agrawal 					  cmd_flags,
716e6b82573SHemant Agrawal 					  token);
71716bbc98aSShreyansh Jain 	cmd_params = (struct dpni_cmd_set_buffer_layout *)cmd.params;
71816bbc98aSShreyansh Jain 	cmd_params->qtype = qtype;
71925fea082SHemant Agrawal 	cmd_params->options = cpu_to_le16((uint16_t)layout->options);
72016bbc98aSShreyansh Jain 	dpni_set_field(cmd_params->flags, PASS_TS, layout->pass_timestamp);
72116bbc98aSShreyansh Jain 	dpni_set_field(cmd_params->flags, PASS_PR, layout->pass_parser_result);
72216bbc98aSShreyansh Jain 	dpni_set_field(cmd_params->flags, PASS_FS, layout->pass_frame_status);
72325fea082SHemant Agrawal 	dpni_set_field(cmd_params->flags, PASS_SWO, layout->pass_sw_opaque);
72416bbc98aSShreyansh Jain 	cmd_params->private_data_size = cpu_to_le16(layout->private_data_size);
72516bbc98aSShreyansh Jain 	cmd_params->data_align = cpu_to_le16(layout->data_align);
72616bbc98aSShreyansh Jain 	cmd_params->head_room = cpu_to_le16(layout->data_head_room);
72716bbc98aSShreyansh Jain 	cmd_params->tail_room = cpu_to_le16(layout->data_tail_room);
728e6b82573SHemant Agrawal 
729e6b82573SHemant Agrawal 	/* send command to mc*/
730e6b82573SHemant Agrawal 	return mc_send_command(mc_io, &cmd);
731e6b82573SHemant Agrawal }
732e6b82573SHemant Agrawal 
73316bbc98aSShreyansh Jain /**
73416bbc98aSShreyansh Jain  * dpni_set_offload() - Set DPNI offload configuration.
73516bbc98aSShreyansh Jain  * @mc_io:	Pointer to MC portal's I/O object
73616bbc98aSShreyansh Jain  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
73716bbc98aSShreyansh Jain  * @token:	Token of DPNI object
73816bbc98aSShreyansh Jain  * @type:	Type of DPNI offload
73916bbc98aSShreyansh Jain  * @config:	Offload configuration.
74016bbc98aSShreyansh Jain  *		For checksum offloads, non-zero value enables the offload
74116bbc98aSShreyansh Jain  *
74216bbc98aSShreyansh Jain  * Return:     '0' on Success; Error code otherwise.
74316bbc98aSShreyansh Jain  *
74416bbc98aSShreyansh Jain  * @warning    Allowed only when DPNI is disabled
74516bbc98aSShreyansh Jain  */
74616bbc98aSShreyansh Jain 
747e6b82573SHemant Agrawal int dpni_set_offload(struct fsl_mc_io *mc_io,
748e6b82573SHemant Agrawal 		     uint32_t cmd_flags,
749e6b82573SHemant Agrawal 		     uint16_t token,
750e6b82573SHemant Agrawal 		     enum dpni_offload type,
751e6b82573SHemant Agrawal 		     uint32_t config)
752e6b82573SHemant Agrawal {
753e6b82573SHemant Agrawal 	struct mc_command cmd = { 0 };
75416bbc98aSShreyansh Jain 	struct dpni_cmd_set_offload *cmd_params;
755e6b82573SHemant Agrawal 
756e6b82573SHemant Agrawal 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_OFFLOAD,
757e6b82573SHemant Agrawal 					  cmd_flags,
758e6b82573SHemant Agrawal 					  token);
75916bbc98aSShreyansh Jain 	cmd_params = (struct dpni_cmd_set_offload *)cmd.params;
76016bbc98aSShreyansh Jain 	cmd_params->dpni_offload = type;
76116bbc98aSShreyansh Jain 	cmd_params->config = cpu_to_le32(config);
762e6b82573SHemant Agrawal 
763e6b82573SHemant Agrawal 	return mc_send_command(mc_io, &cmd);
764e6b82573SHemant Agrawal }
765e6b82573SHemant Agrawal 
76616bbc98aSShreyansh Jain /**
76716bbc98aSShreyansh Jain  * dpni_get_offload() - Get DPNI offload configuration.
76816bbc98aSShreyansh Jain  * @mc_io:	Pointer to MC portal's I/O object
76916bbc98aSShreyansh Jain  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
77016bbc98aSShreyansh Jain  * @token:	Token of DPNI object
77116bbc98aSShreyansh Jain  * @type:	Type of DPNI offload
77216bbc98aSShreyansh Jain  * @config:	Offload configuration.
77316bbc98aSShreyansh Jain  *			For checksum offloads, a value of 1 indicates that the
77416bbc98aSShreyansh Jain  *			offload is enabled.
77516bbc98aSShreyansh Jain  *
77616bbc98aSShreyansh Jain  * Return:	'0' on Success; Error code otherwise.
77716bbc98aSShreyansh Jain  *
77816bbc98aSShreyansh Jain  * @warning	Allowed only when DPNI is disabled
77916bbc98aSShreyansh Jain  */
780e6b82573SHemant Agrawal int dpni_get_offload(struct fsl_mc_io *mc_io,
781e6b82573SHemant Agrawal 		     uint32_t cmd_flags,
782e6b82573SHemant Agrawal 		     uint16_t token,
783e6b82573SHemant Agrawal 		     enum dpni_offload type,
784e6b82573SHemant Agrawal 		     uint32_t *config)
785e6b82573SHemant Agrawal {
786e6b82573SHemant Agrawal 	struct mc_command cmd = { 0 };
78716bbc98aSShreyansh Jain 	struct dpni_cmd_get_offload *cmd_params;
78816bbc98aSShreyansh Jain 	struct dpni_rsp_get_offload *rsp_params;
789e6b82573SHemant Agrawal 	int err;
790e6b82573SHemant Agrawal 
791e6b82573SHemant Agrawal 	/* prepare command */
792e6b82573SHemant Agrawal 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_OFFLOAD,
793e6b82573SHemant Agrawal 					  cmd_flags,
794e6b82573SHemant Agrawal 					  token);
79516bbc98aSShreyansh Jain 	cmd_params = (struct dpni_cmd_get_offload *)cmd.params;
79616bbc98aSShreyansh Jain 	cmd_params->dpni_offload = type;
797e6b82573SHemant Agrawal 
798e6b82573SHemant Agrawal 	/* send command to mc*/
799e6b82573SHemant Agrawal 	err = mc_send_command(mc_io, &cmd);
800e6b82573SHemant Agrawal 	if (err)
801e6b82573SHemant Agrawal 		return err;
802e6b82573SHemant Agrawal 
803e6b82573SHemant Agrawal 	/* retrieve response parameters */
80416bbc98aSShreyansh Jain 	rsp_params = (struct dpni_rsp_get_offload *)cmd.params;
80516bbc98aSShreyansh Jain 	*config = le32_to_cpu(rsp_params->config);
806e6b82573SHemant Agrawal 
807e6b82573SHemant Agrawal 	return 0;
808e6b82573SHemant Agrawal }
809e6b82573SHemant Agrawal 
81016bbc98aSShreyansh Jain /**
81116bbc98aSShreyansh Jain  * dpni_get_qdid() - Get the Queuing Destination ID (QDID) that should be used
81216bbc98aSShreyansh Jain  *			for enqueue operations
81316bbc98aSShreyansh Jain  * @mc_io:	Pointer to MC portal's I/O object
81416bbc98aSShreyansh Jain  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
81516bbc98aSShreyansh Jain  * @token:	Token of DPNI object
81616bbc98aSShreyansh Jain  * @qtype:	Type of queue to receive QDID for
81716bbc98aSShreyansh Jain  * @qdid:	Returned virtual QDID value that should be used as an argument
81816bbc98aSShreyansh Jain  *			in all enqueue operations
81916bbc98aSShreyansh Jain  *
82016bbc98aSShreyansh Jain  * Return:	'0' on Success; Error code otherwise.
821f48cd6c6SNipun Gupta  *
822f48cd6c6SNipun Gupta  * If dpni object is created using multiple Tc channels this function will return
823f48cd6c6SNipun Gupta  * qdid value for the first channel
82416bbc98aSShreyansh Jain  */
825e6b82573SHemant Agrawal int dpni_get_qdid(struct fsl_mc_io *mc_io,
826e6b82573SHemant Agrawal 		  uint32_t cmd_flags,
827e6b82573SHemant Agrawal 		  uint16_t token,
828e6b82573SHemant Agrawal 		  enum dpni_queue_type qtype,
829e6b82573SHemant Agrawal 		  uint16_t *qdid)
830e6b82573SHemant Agrawal {
831e6b82573SHemant Agrawal 	struct mc_command cmd = { 0 };
83216bbc98aSShreyansh Jain 	struct dpni_cmd_get_qdid *cmd_params;
83316bbc98aSShreyansh Jain 	struct dpni_rsp_get_qdid *rsp_params;
834e6b82573SHemant Agrawal 	int err;
835e6b82573SHemant Agrawal 
836e6b82573SHemant Agrawal 	/* prepare command */
837e6b82573SHemant Agrawal 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_QDID,
838e6b82573SHemant Agrawal 					  cmd_flags,
839e6b82573SHemant Agrawal 					  token);
84016bbc98aSShreyansh Jain 	cmd_params = (struct dpni_cmd_get_qdid *)cmd.params;
84116bbc98aSShreyansh Jain 	cmd_params->qtype = qtype;
842e6b82573SHemant Agrawal 
843e6b82573SHemant Agrawal 	/* send command to mc*/
844e6b82573SHemant Agrawal 	err = mc_send_command(mc_io, &cmd);
845e6b82573SHemant Agrawal 	if (err)
846e6b82573SHemant Agrawal 		return err;
847e6b82573SHemant Agrawal 
848e6b82573SHemant Agrawal 	/* retrieve response parameters */
84916bbc98aSShreyansh Jain 	rsp_params = (struct dpni_rsp_get_qdid *)cmd.params;
85016bbc98aSShreyansh Jain 	*qdid = le16_to_cpu(rsp_params->qdid);
851e6b82573SHemant Agrawal 
852e6b82573SHemant Agrawal 	return 0;
853e6b82573SHemant Agrawal }
854977d0006SHemant Agrawal 
85516bbc98aSShreyansh Jain /**
856*591200efSGagandeep Singh  * dpni_get_qdid_ex() - Extension for the function to get the Queuing Destination ID (QDID)
857*591200efSGagandeep Singh  *			that should be used for enqueue operations.
858*591200efSGagandeep Singh  * @mc_io:	Pointer to MC portal's I/O object
859*591200efSGagandeep Singh  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
860*591200efSGagandeep Singh  * @token:	Token of DPNI object
861*591200efSGagandeep Singh  * @qtype:	Type of queue to receive QDID for
862*591200efSGagandeep Singh  * @qdid:	Array of virtual QDID value that should be used as an argument
863*591200efSGagandeep Singh  *			in all enqueue operations.
864*591200efSGagandeep Singh  *
865*591200efSGagandeep Singh  * Return:	'0' on Success; Error code otherwise.
866*591200efSGagandeep Singh  *
867*591200efSGagandeep Singh  * This function must be used when dpni is created using multiple Tx channels to return one
868*591200efSGagandeep Singh  * qdid for each channel.
869*591200efSGagandeep Singh  */
870*591200efSGagandeep Singh int dpni_get_qdid_ex(struct fsl_mc_io *mc_io,
871*591200efSGagandeep Singh 		  uint32_t cmd_flags,
872*591200efSGagandeep Singh 		  uint16_t token,
873*591200efSGagandeep Singh 		  enum dpni_queue_type qtype,
874*591200efSGagandeep Singh 		  uint16_t *qdid)
875*591200efSGagandeep Singh {
876*591200efSGagandeep Singh 	struct mc_command cmd = { 0 };
877*591200efSGagandeep Singh 	struct dpni_cmd_get_qdid *cmd_params;
878*591200efSGagandeep Singh 	struct dpni_rsp_get_qdid_ex *rsp_params;
879*591200efSGagandeep Singh 	int i;
880*591200efSGagandeep Singh 	int err;
881*591200efSGagandeep Singh 
882*591200efSGagandeep Singh 	/* prepare command */
883*591200efSGagandeep Singh 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_QDID_EX,
884*591200efSGagandeep Singh 					  cmd_flags,
885*591200efSGagandeep Singh 					  token);
886*591200efSGagandeep Singh 	cmd_params = (struct dpni_cmd_get_qdid *)cmd.params;
887*591200efSGagandeep Singh 	cmd_params->qtype = qtype;
888*591200efSGagandeep Singh 
889*591200efSGagandeep Singh 	/* send command to mc*/
890*591200efSGagandeep Singh 	err = mc_send_command(mc_io, &cmd);
891*591200efSGagandeep Singh 	if (err)
892*591200efSGagandeep Singh 		return err;
893*591200efSGagandeep Singh 
894*591200efSGagandeep Singh 	/* retrieve response parameters */
895*591200efSGagandeep Singh 	rsp_params = (struct dpni_rsp_get_qdid_ex *)cmd.params;
896*591200efSGagandeep Singh 	for (i = 0; i < DPNI_MAX_CHANNELS; i++)
897*591200efSGagandeep Singh 		qdid[i] = le16_to_cpu(rsp_params->qdid[i]);
898*591200efSGagandeep Singh 
899*591200efSGagandeep Singh 	return 0;
900*591200efSGagandeep Singh }
901*591200efSGagandeep Singh 
902*591200efSGagandeep Singh /**
903*591200efSGagandeep Singh  * dpni_get_sp_info() - Get the AIOP storage profile IDs associated
904*591200efSGagandeep Singh  *			with the DPNI
905*591200efSGagandeep Singh  * @mc_io:	Pointer to MC portal's I/O object
906*591200efSGagandeep Singh  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
907*591200efSGagandeep Singh  * @token:	Token of DPNI object
908*591200efSGagandeep Singh  * @sp_info:	Returned AIOP storage-profile information
909*591200efSGagandeep Singh  *
910*591200efSGagandeep Singh  * Return:	'0' on Success; Error code otherwise.
911*591200efSGagandeep Singh  *
912*591200efSGagandeep Singh  * @warning	Only relevant for DPNI that belongs to AIOP container.
913*591200efSGagandeep Singh  */
914*591200efSGagandeep Singh int dpni_get_sp_info(struct fsl_mc_io *mc_io,
915*591200efSGagandeep Singh 		     uint32_t cmd_flags,
916*591200efSGagandeep Singh 		     uint16_t token,
917*591200efSGagandeep Singh 		     struct dpni_sp_info *sp_info)
918*591200efSGagandeep Singh {
919*591200efSGagandeep Singh 	struct dpni_rsp_get_sp_info *rsp_params;
920*591200efSGagandeep Singh 	struct mc_command cmd = { 0 };
921*591200efSGagandeep Singh 	int err, i;
922*591200efSGagandeep Singh 
923*591200efSGagandeep Singh 	/* prepare command */
924*591200efSGagandeep Singh 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_SP_INFO,
925*591200efSGagandeep Singh 					  cmd_flags,
926*591200efSGagandeep Singh 					  token);
927*591200efSGagandeep Singh 
928*591200efSGagandeep Singh 	/* send command to mc*/
929*591200efSGagandeep Singh 	err = mc_send_command(mc_io, &cmd);
930*591200efSGagandeep Singh 	if (err)
931*591200efSGagandeep Singh 		return err;
932*591200efSGagandeep Singh 
933*591200efSGagandeep Singh 	/* retrieve response parameters */
934*591200efSGagandeep Singh 	rsp_params = (struct dpni_rsp_get_sp_info *)cmd.params;
935*591200efSGagandeep Singh 	for (i = 0; i < DPNI_MAX_SP; i++)
936*591200efSGagandeep Singh 		sp_info->spids[i] = le16_to_cpu(rsp_params->spids[i]);
937*591200efSGagandeep Singh 
938*591200efSGagandeep Singh 	return 0;
939*591200efSGagandeep Singh }
940*591200efSGagandeep Singh 
941*591200efSGagandeep Singh /**
94216bbc98aSShreyansh Jain  * dpni_get_tx_data_offset() - Get the Tx data offset (from start of buffer)
94316bbc98aSShreyansh Jain  * @mc_io:	Pointer to MC portal's I/O object
94416bbc98aSShreyansh Jain  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
94516bbc98aSShreyansh Jain  * @token:	Token of DPNI object
94616bbc98aSShreyansh Jain  * @data_offset: Tx data offset (from start of buffer)
94716bbc98aSShreyansh Jain  *
94816bbc98aSShreyansh Jain  * Return:	'0' on Success; Error code otherwise.
94916bbc98aSShreyansh Jain  */
95016bbc98aSShreyansh Jain int dpni_get_tx_data_offset(struct fsl_mc_io *mc_io,
95116bbc98aSShreyansh Jain 			    uint32_t cmd_flags,
95216bbc98aSShreyansh Jain 			    uint16_t token,
95316bbc98aSShreyansh Jain 			    uint16_t *data_offset)
95416bbc98aSShreyansh Jain {
95516bbc98aSShreyansh Jain 	struct mc_command cmd = { 0 };
95616bbc98aSShreyansh Jain 	struct dpni_rsp_get_tx_data_offset *rsp_params;
95716bbc98aSShreyansh Jain 	int err;
95816bbc98aSShreyansh Jain 
95916bbc98aSShreyansh Jain 	/* prepare command */
96016bbc98aSShreyansh Jain 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_TX_DATA_OFFSET,
96116bbc98aSShreyansh Jain 					  cmd_flags,
96216bbc98aSShreyansh Jain 					  token);
96316bbc98aSShreyansh Jain 
96416bbc98aSShreyansh Jain 	/* send command to mc*/
96516bbc98aSShreyansh Jain 	err = mc_send_command(mc_io, &cmd);
96616bbc98aSShreyansh Jain 	if (err)
96716bbc98aSShreyansh Jain 		return err;
96816bbc98aSShreyansh Jain 
96916bbc98aSShreyansh Jain 	/* retrieve response parameters */
97016bbc98aSShreyansh Jain 	rsp_params = (struct dpni_rsp_get_tx_data_offset *)cmd.params;
97116bbc98aSShreyansh Jain 	*data_offset = le16_to_cpu(rsp_params->data_offset);
97216bbc98aSShreyansh Jain 
97316bbc98aSShreyansh Jain 	return 0;
97416bbc98aSShreyansh Jain }
97516bbc98aSShreyansh Jain 
97616bbc98aSShreyansh Jain /**
97716bbc98aSShreyansh Jain  * dpni_set_link_cfg() - set the link configuration.
97816bbc98aSShreyansh Jain  * @mc_io:	Pointer to MC portal's I/O object
97916bbc98aSShreyansh Jain  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
98016bbc98aSShreyansh Jain  * @token:	Token of DPNI object
98116bbc98aSShreyansh Jain  * @cfg:	Link configuration
98216bbc98aSShreyansh Jain  *
98316bbc98aSShreyansh Jain  * Return:	'0' on Success; Error code otherwise.
98416bbc98aSShreyansh Jain  */
985977d0006SHemant Agrawal int dpni_set_link_cfg(struct fsl_mc_io *mc_io,
986977d0006SHemant Agrawal 		      uint32_t cmd_flags,
987977d0006SHemant Agrawal 		      uint16_t token,
988977d0006SHemant Agrawal 		      const struct dpni_link_cfg *cfg)
989977d0006SHemant Agrawal {
990977d0006SHemant Agrawal 	struct mc_command cmd = { 0 };
99116bbc98aSShreyansh Jain 	struct dpni_cmd_set_link_cfg *cmd_params;
992977d0006SHemant Agrawal 
993977d0006SHemant Agrawal 	/* prepare command */
994977d0006SHemant Agrawal 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_LINK_CFG,
995977d0006SHemant Agrawal 					  cmd_flags,
996977d0006SHemant Agrawal 					  token);
99716bbc98aSShreyansh Jain 	cmd_params = (struct dpni_cmd_set_link_cfg *)cmd.params;
99816bbc98aSShreyansh Jain 	cmd_params->rate = cpu_to_le32(cfg->rate);
99916bbc98aSShreyansh Jain 	cmd_params->options = cpu_to_le64(cfg->options);
100025fea082SHemant Agrawal 	cmd_params->advertising = cpu_to_le64(cfg->advertising);
1001977d0006SHemant Agrawal 
1002977d0006SHemant Agrawal 	/* send command to mc*/
1003977d0006SHemant Agrawal 	return mc_send_command(mc_io, &cmd);
1004977d0006SHemant Agrawal }
1005977d0006SHemant Agrawal 
100616bbc98aSShreyansh Jain /**
100772100f0dSGagandeep Singh  * dpni_get_link_cfg() - return the link configuration configured by
100872100f0dSGagandeep Singh  *			dpni_set_link_cfg().
100972100f0dSGagandeep Singh  * @mc_io:	Pointer to MC portal's I/O object
101072100f0dSGagandeep Singh  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
101172100f0dSGagandeep Singh  * @token:	Token of DPNI object
101272100f0dSGagandeep Singh  * @cfg:	Link configuration from dpni object
101372100f0dSGagandeep Singh  *
101472100f0dSGagandeep Singh  * Return:	'0' on Success; Error code otherwise.
101572100f0dSGagandeep Singh  */
101672100f0dSGagandeep Singh int dpni_get_link_cfg(struct fsl_mc_io *mc_io,
101772100f0dSGagandeep Singh 		      uint32_t cmd_flags,
101872100f0dSGagandeep Singh 		      uint16_t token,
101972100f0dSGagandeep Singh 		      struct dpni_link_cfg *cfg)
102072100f0dSGagandeep Singh {
102172100f0dSGagandeep Singh 	struct mc_command cmd = { 0 };
102272100f0dSGagandeep Singh 	struct dpni_cmd_set_link_cfg *rsp_params;
102372100f0dSGagandeep Singh 	int err;
102472100f0dSGagandeep Singh 
102572100f0dSGagandeep Singh 	/* prepare command */
102672100f0dSGagandeep Singh 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_LINK_CFG,
102772100f0dSGagandeep Singh 					  cmd_flags,
102872100f0dSGagandeep Singh 					  token);
102972100f0dSGagandeep Singh 
103072100f0dSGagandeep Singh 	/* send command to mc*/
103172100f0dSGagandeep Singh 	err = mc_send_command(mc_io, &cmd);
103272100f0dSGagandeep Singh 	if (err)
103372100f0dSGagandeep Singh 		return err;
103472100f0dSGagandeep Singh 
103572100f0dSGagandeep Singh 	/* retrieve response parameters */
103672100f0dSGagandeep Singh 	rsp_params = (struct dpni_cmd_set_link_cfg *)cmd.params;
103772100f0dSGagandeep Singh 	cfg->advertising	= le64_to_cpu(rsp_params->advertising);
103872100f0dSGagandeep Singh 	cfg->options		= le64_to_cpu(rsp_params->options);
103972100f0dSGagandeep Singh 	cfg->rate		= le32_to_cpu(rsp_params->rate);
104072100f0dSGagandeep Singh 
104172100f0dSGagandeep Singh 	return err;
104272100f0dSGagandeep Singh }
104372100f0dSGagandeep Singh 
104472100f0dSGagandeep Singh /**
104516bbc98aSShreyansh Jain  * dpni_get_link_state() - Return the link state (either up or down)
104616bbc98aSShreyansh Jain  * @mc_io:	Pointer to MC portal's I/O object
104716bbc98aSShreyansh Jain  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
104816bbc98aSShreyansh Jain  * @token:	Token of DPNI object
104916bbc98aSShreyansh Jain  * @state:	Returned link state;
105016bbc98aSShreyansh Jain  *
105116bbc98aSShreyansh Jain  * Return:	'0' on Success; Error code otherwise.
105216bbc98aSShreyansh Jain  */
1053e6b82573SHemant Agrawal int dpni_get_link_state(struct fsl_mc_io *mc_io,
1054e6b82573SHemant Agrawal 			uint32_t cmd_flags,
1055e6b82573SHemant Agrawal 			uint16_t token,
1056e6b82573SHemant Agrawal 			struct dpni_link_state *state)
1057e6b82573SHemant Agrawal {
1058e6b82573SHemant Agrawal 	struct mc_command cmd = { 0 };
105916bbc98aSShreyansh Jain 	struct dpni_rsp_get_link_state *rsp_params;
1060e6b82573SHemant Agrawal 	int err;
1061e6b82573SHemant Agrawal 
1062e6b82573SHemant Agrawal 	/* prepare command */
1063e6b82573SHemant Agrawal 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_LINK_STATE,
1064e6b82573SHemant Agrawal 					  cmd_flags,
1065e6b82573SHemant Agrawal 					  token);
1066e6b82573SHemant Agrawal 
1067e6b82573SHemant Agrawal 	/* send command to mc*/
1068e6b82573SHemant Agrawal 	err = mc_send_command(mc_io, &cmd);
1069e6b82573SHemant Agrawal 	if (err)
1070e6b82573SHemant Agrawal 		return err;
1071e6b82573SHemant Agrawal 
1072e6b82573SHemant Agrawal 	/* retrieve response parameters */
107316bbc98aSShreyansh Jain 	rsp_params = (struct dpni_rsp_get_link_state *)cmd.params;
107416bbc98aSShreyansh Jain 	state->up = dpni_get_field(rsp_params->flags, LINK_STATE);
107525fea082SHemant Agrawal 	state->state_valid = dpni_get_field(rsp_params->flags, STATE_VALID);
107616bbc98aSShreyansh Jain 	state->rate = le32_to_cpu(rsp_params->rate);
107716bbc98aSShreyansh Jain 	state->options = le64_to_cpu(rsp_params->options);
107825fea082SHemant Agrawal 	state->supported = le64_to_cpu(rsp_params->supported);
107925fea082SHemant Agrawal 	state->advertising = le64_to_cpu(rsp_params->advertising);
1080e6b82573SHemant Agrawal 
1081e6b82573SHemant Agrawal 	return 0;
1082e6b82573SHemant Agrawal }
1083e6b82573SHemant Agrawal 
108416bbc98aSShreyansh Jain /**
1085ac624068SGagandeep Singh  * dpni_set_tx_shaping() - Set the transmit shaping
1086ac624068SGagandeep Singh  * @mc_io:		Pointer to MC portal's I/O object
1087ac624068SGagandeep Singh  * @cmd_flags:		Command flags; one or more of 'MC_CMD_FLAG_'
1088ac624068SGagandeep Singh  * @token:		Token of DPNI object
1089ac624068SGagandeep Singh  * @tx_cr_shaper:	TX committed rate shaping configuration
1090ac624068SGagandeep Singh  * @tx_er_shaper:	TX excess rate shaping configuration
1091f48cd6c6SNipun Gupta  * @param:		Special parameters
1092f48cd6c6SNipun Gupta  *			bit0: Committed and excess rates are coupled
1093f48cd6c6SNipun Gupta  *			bit1: 1 modify LNI shaper, 0 modify channel shaper
1094f48cd6c6SNipun Gupta  *			bit8-15: Tx channel to be shaped. Used only if bit1 is set to zero
1095f48cd6c6SNipun Gupta  *			bits16-26: OAL (Overhead accounting length 11bit value). Used only
1096f48cd6c6SNipun Gupta  *			when bit1 is set.
1097ac624068SGagandeep Singh  *
1098ac624068SGagandeep Singh  * Return:	'0' on Success; Error code otherwise.
1099ac624068SGagandeep Singh  */
1100ac624068SGagandeep Singh int dpni_set_tx_shaping(struct fsl_mc_io *mc_io,
1101ac624068SGagandeep Singh 			uint32_t cmd_flags,
1102ac624068SGagandeep Singh 			uint16_t token,
1103ac624068SGagandeep Singh 			const struct dpni_tx_shaping_cfg *tx_cr_shaper,
1104ac624068SGagandeep Singh 			const struct dpni_tx_shaping_cfg *tx_er_shaper,
1105f48cd6c6SNipun Gupta 			uint32_t param)
1106ac624068SGagandeep Singh {
1107ac624068SGagandeep Singh 	struct dpni_cmd_set_tx_shaping *cmd_params;
1108ac624068SGagandeep Singh 	struct mc_command cmd = { 0 };
1109f48cd6c6SNipun Gupta 	int coupled, lni_shaper;
1110f48cd6c6SNipun Gupta 	uint8_t channel_id;
1111f48cd6c6SNipun Gupta 	uint16_t oal;
1112ac624068SGagandeep Singh 
1113ac624068SGagandeep Singh 	/* prepare command */
1114ac624068SGagandeep Singh 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_TX_SHAPING,
1115ac624068SGagandeep Singh 					  cmd_flags,
1116ac624068SGagandeep Singh 					  token);
1117ac624068SGagandeep Singh 	cmd_params = (struct dpni_cmd_set_tx_shaping *)cmd.params;
1118ac624068SGagandeep Singh 	cmd_params->tx_cr_max_burst_size =
1119ac624068SGagandeep Singh 		cpu_to_le16(tx_cr_shaper->max_burst_size);
1120ac624068SGagandeep Singh 	cmd_params->tx_er_max_burst_size =
1121ac624068SGagandeep Singh 		cpu_to_le16(tx_er_shaper->max_burst_size);
1122ac624068SGagandeep Singh 	cmd_params->tx_cr_rate_limit =
1123ac624068SGagandeep Singh 		cpu_to_le32(tx_cr_shaper->rate_limit);
1124ac624068SGagandeep Singh 	cmd_params->tx_er_rate_limit =
1125ac624068SGagandeep Singh 		cpu_to_le32(tx_er_shaper->rate_limit);
1126f48cd6c6SNipun Gupta 
1127f48cd6c6SNipun Gupta 	coupled = !!(param & 0x01);
1128f48cd6c6SNipun Gupta 	dpni_set_field(cmd_params->options, COUPLED, coupled);
1129f48cd6c6SNipun Gupta 
1130f48cd6c6SNipun Gupta 	lni_shaper = !!((param >> 1) & 0x01);
1131f48cd6c6SNipun Gupta 	dpni_set_field(cmd_params->options, LNI_SHAPER, lni_shaper);
1132f48cd6c6SNipun Gupta 
1133f48cd6c6SNipun Gupta 	channel_id = (param >> 8) & 0xff;
1134f48cd6c6SNipun Gupta 	cmd_params->channel_id = channel_id;
1135f48cd6c6SNipun Gupta 
1136f48cd6c6SNipun Gupta 	oal = (param >> 16) & 0x7FF;
1137f48cd6c6SNipun Gupta 	cmd_params->oal = cpu_to_le16(oal);
1138ac624068SGagandeep Singh 
1139ac624068SGagandeep Singh 	/* send command to mc*/
1140ac624068SGagandeep Singh 	return mc_send_command(mc_io, &cmd);
1141ac624068SGagandeep Singh }
1142ac624068SGagandeep Singh 
1143ac624068SGagandeep Singh /**
114416bbc98aSShreyansh Jain  * dpni_set_max_frame_length() - Set the maximum received frame length.
114516bbc98aSShreyansh Jain  * @mc_io:		Pointer to MC portal's I/O object
114616bbc98aSShreyansh Jain  * @cmd_flags:		Command flags; one or more of 'MC_CMD_FLAG_'
114716bbc98aSShreyansh Jain  * @token:		Token of DPNI object
114816bbc98aSShreyansh Jain  * @max_frame_length:	Maximum received frame length (in bytes);
114916bbc98aSShreyansh Jain  *			frame is discarded if its length exceeds this value
115016bbc98aSShreyansh Jain  *
115116bbc98aSShreyansh Jain  * Return:	'0' on Success; Error code otherwise.
115216bbc98aSShreyansh Jain  */
1153e6b82573SHemant Agrawal int dpni_set_max_frame_length(struct fsl_mc_io *mc_io,
1154e6b82573SHemant Agrawal 			      uint32_t cmd_flags,
1155e6b82573SHemant Agrawal 			      uint16_t token,
1156e6b82573SHemant Agrawal 			      uint16_t max_frame_length)
1157e6b82573SHemant Agrawal {
1158e6b82573SHemant Agrawal 	struct mc_command cmd = { 0 };
115916bbc98aSShreyansh Jain 	struct dpni_cmd_set_max_frame_length *cmd_params;
1160e6b82573SHemant Agrawal 
1161e6b82573SHemant Agrawal 	/* prepare command */
1162e6b82573SHemant Agrawal 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_MAX_FRAME_LENGTH,
1163e6b82573SHemant Agrawal 					  cmd_flags,
1164e6b82573SHemant Agrawal 					  token);
116516bbc98aSShreyansh Jain 	cmd_params = (struct dpni_cmd_set_max_frame_length *)cmd.params;
116616bbc98aSShreyansh Jain 	cmd_params->max_frame_length = cpu_to_le16(max_frame_length);
1167e6b82573SHemant Agrawal 
1168e6b82573SHemant Agrawal 	/* send command to mc*/
1169e6b82573SHemant Agrawal 	return mc_send_command(mc_io, &cmd);
1170e6b82573SHemant Agrawal }
1171e6b82573SHemant Agrawal 
117216bbc98aSShreyansh Jain /**
117316bbc98aSShreyansh Jain  * dpni_get_max_frame_length() - Get the maximum received frame length.
117416bbc98aSShreyansh Jain  * @mc_io:		Pointer to MC portal's I/O object
117516bbc98aSShreyansh Jain  * @cmd_flags:		Command flags; one or more of 'MC_CMD_FLAG_'
117616bbc98aSShreyansh Jain  * @token:		Token of DPNI object
117716bbc98aSShreyansh Jain  * @max_frame_length:	Maximum received frame length (in bytes);
117816bbc98aSShreyansh Jain  *			frame is discarded if its length exceeds this value
117916bbc98aSShreyansh Jain  *
118016bbc98aSShreyansh Jain  * Return:	'0' on Success; Error code otherwise.
118116bbc98aSShreyansh Jain  */
1182e6b82573SHemant Agrawal int dpni_get_max_frame_length(struct fsl_mc_io *mc_io,
1183e6b82573SHemant Agrawal 			      uint32_t cmd_flags,
1184e6b82573SHemant Agrawal 			      uint16_t token,
1185e6b82573SHemant Agrawal 			      uint16_t *max_frame_length)
1186e6b82573SHemant Agrawal {
1187e6b82573SHemant Agrawal 	struct mc_command cmd = { 0 };
118816bbc98aSShreyansh Jain 	struct dpni_rsp_get_max_frame_length *rsp_params;
1189e6b82573SHemant Agrawal 	int err;
1190e6b82573SHemant Agrawal 
1191e6b82573SHemant Agrawal 	/* prepare command */
1192e6b82573SHemant Agrawal 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_MAX_FRAME_LENGTH,
1193e6b82573SHemant Agrawal 					  cmd_flags,
1194e6b82573SHemant Agrawal 					  token);
1195e6b82573SHemant Agrawal 
1196e6b82573SHemant Agrawal 	/* send command to mc*/
1197e6b82573SHemant Agrawal 	err = mc_send_command(mc_io, &cmd);
1198e6b82573SHemant Agrawal 	if (err)
1199e6b82573SHemant Agrawal 		return err;
1200e6b82573SHemant Agrawal 
1201e6b82573SHemant Agrawal 	/* retrieve response parameters */
120216bbc98aSShreyansh Jain 	rsp_params = (struct dpni_rsp_get_max_frame_length *)cmd.params;
120316bbc98aSShreyansh Jain 	*max_frame_length = le16_to_cpu(rsp_params->max_frame_length);
1204e6b82573SHemant Agrawal 
1205e6b82573SHemant Agrawal 	return 0;
1206e6b82573SHemant Agrawal }
1207e6b82573SHemant Agrawal 
120816bbc98aSShreyansh Jain /**
120916bbc98aSShreyansh Jain  * dpni_set_multicast_promisc() - Enable/disable multicast promiscuous mode
121016bbc98aSShreyansh Jain  * @mc_io:	Pointer to MC portal's I/O object
121116bbc98aSShreyansh Jain  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
121216bbc98aSShreyansh Jain  * @token:	Token of DPNI object
121316bbc98aSShreyansh Jain  * @en:		Set to '1' to enable; '0' to disable
121416bbc98aSShreyansh Jain  *
121516bbc98aSShreyansh Jain  * Return:	'0' on Success; Error code otherwise.
121616bbc98aSShreyansh Jain  */
12175d5aeeedSHemant Agrawal int dpni_set_multicast_promisc(struct fsl_mc_io *mc_io,
12185d5aeeedSHemant Agrawal 			       uint32_t cmd_flags,
12195d5aeeedSHemant Agrawal 			       uint16_t token,
12205d5aeeedSHemant Agrawal 			       int en)
12215d5aeeedSHemant Agrawal {
12225d5aeeedSHemant Agrawal 	struct mc_command cmd = { 0 };
122316bbc98aSShreyansh Jain 	struct dpni_cmd_set_multicast_promisc *cmd_params;
12245d5aeeedSHemant Agrawal 
12255d5aeeedSHemant Agrawal 	/* prepare command */
12265d5aeeedSHemant Agrawal 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_MCAST_PROMISC,
12275d5aeeedSHemant Agrawal 					  cmd_flags,
12285d5aeeedSHemant Agrawal 					  token);
122916bbc98aSShreyansh Jain 	cmd_params = (struct dpni_cmd_set_multicast_promisc *)cmd.params;
123016bbc98aSShreyansh Jain 	dpni_set_field(cmd_params->enable, ENABLE, en);
12315d5aeeedSHemant Agrawal 
12325d5aeeedSHemant Agrawal 	/* send command to mc*/
12335d5aeeedSHemant Agrawal 	return mc_send_command(mc_io, &cmd);
12345d5aeeedSHemant Agrawal }
12355d5aeeedSHemant Agrawal 
123616bbc98aSShreyansh Jain /**
123716bbc98aSShreyansh Jain  * dpni_get_multicast_promisc() - Get multicast promiscuous mode
123816bbc98aSShreyansh Jain  * @mc_io:	Pointer to MC portal's I/O object
123916bbc98aSShreyansh Jain  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
124016bbc98aSShreyansh Jain  * @token:	Token of DPNI object
124116bbc98aSShreyansh Jain  * @en:		Returns '1' if enabled; '0' otherwise
124216bbc98aSShreyansh Jain  *
124316bbc98aSShreyansh Jain  * Return:	'0' on Success; Error code otherwise.
124416bbc98aSShreyansh Jain  */
12455d5aeeedSHemant Agrawal int dpni_get_multicast_promisc(struct fsl_mc_io *mc_io,
12465d5aeeedSHemant Agrawal 			       uint32_t cmd_flags,
12475d5aeeedSHemant Agrawal 			       uint16_t token,
12485d5aeeedSHemant Agrawal 			       int *en)
12495d5aeeedSHemant Agrawal {
12505d5aeeedSHemant Agrawal 	struct mc_command cmd = { 0 };
125116bbc98aSShreyansh Jain 	struct dpni_rsp_get_multicast_promisc *rsp_params;
12525d5aeeedSHemant Agrawal 	int err;
12535d5aeeedSHemant Agrawal 
12545d5aeeedSHemant Agrawal 	/* prepare command */
12555d5aeeedSHemant Agrawal 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_MCAST_PROMISC,
12565d5aeeedSHemant Agrawal 					  cmd_flags,
12575d5aeeedSHemant Agrawal 					  token);
12585d5aeeedSHemant Agrawal 
12595d5aeeedSHemant Agrawal 	/* send command to mc*/
12605d5aeeedSHemant Agrawal 	err = mc_send_command(mc_io, &cmd);
12615d5aeeedSHemant Agrawal 	if (err)
12625d5aeeedSHemant Agrawal 		return err;
12635d5aeeedSHemant Agrawal 
12645d5aeeedSHemant Agrawal 	/* retrieve response parameters */
126516bbc98aSShreyansh Jain 	rsp_params = (struct dpni_rsp_get_multicast_promisc *)cmd.params;
126616bbc98aSShreyansh Jain 	*en = dpni_get_field(rsp_params->enabled, ENABLE);
12675d5aeeedSHemant Agrawal 
12685d5aeeedSHemant Agrawal 	return 0;
12695d5aeeedSHemant Agrawal }
12705d5aeeedSHemant Agrawal 
127116bbc98aSShreyansh Jain /**
127216bbc98aSShreyansh Jain  * dpni_set_unicast_promisc() - Enable/disable unicast promiscuous mode
127316bbc98aSShreyansh Jain  * @mc_io:	Pointer to MC portal's I/O object
127416bbc98aSShreyansh Jain  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
127516bbc98aSShreyansh Jain  * @token:	Token of DPNI object
127616bbc98aSShreyansh Jain  * @en:		Set to '1' to enable; '0' to disable
127716bbc98aSShreyansh Jain  *
127816bbc98aSShreyansh Jain  * Return:	'0' on Success; Error code otherwise.
127916bbc98aSShreyansh Jain  */
1280e6b82573SHemant Agrawal int dpni_set_unicast_promisc(struct fsl_mc_io *mc_io,
1281e6b82573SHemant Agrawal 			     uint32_t cmd_flags,
1282e6b82573SHemant Agrawal 			     uint16_t token,
1283e6b82573SHemant Agrawal 			     int en)
1284e6b82573SHemant Agrawal {
1285e6b82573SHemant Agrawal 	struct mc_command cmd = { 0 };
128616bbc98aSShreyansh Jain 	struct dpni_cmd_set_unicast_promisc *cmd_params;
1287e6b82573SHemant Agrawal 
1288e6b82573SHemant Agrawal 	/* prepare command */
1289e6b82573SHemant Agrawal 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_UNICAST_PROMISC,
1290e6b82573SHemant Agrawal 					  cmd_flags,
1291e6b82573SHemant Agrawal 					  token);
129216bbc98aSShreyansh Jain 	cmd_params = (struct dpni_cmd_set_unicast_promisc *)cmd.params;
129316bbc98aSShreyansh Jain 	dpni_set_field(cmd_params->enable, ENABLE, en);
1294e6b82573SHemant Agrawal 
1295e6b82573SHemant Agrawal 	/* send command to mc*/
1296e6b82573SHemant Agrawal 	return mc_send_command(mc_io, &cmd);
1297e6b82573SHemant Agrawal }
1298e6b82573SHemant Agrawal 
129916bbc98aSShreyansh Jain /**
130016bbc98aSShreyansh Jain  * dpni_get_unicast_promisc() - Get unicast promiscuous mode
130116bbc98aSShreyansh Jain  * @mc_io:	Pointer to MC portal's I/O object
130216bbc98aSShreyansh Jain  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
130316bbc98aSShreyansh Jain  * @token:	Token of DPNI object
130416bbc98aSShreyansh Jain  * @en:		Returns '1' if enabled; '0' otherwise
130516bbc98aSShreyansh Jain  *
130616bbc98aSShreyansh Jain  * Return:	'0' on Success; Error code otherwise.
130716bbc98aSShreyansh Jain  */
1308e6b82573SHemant Agrawal int dpni_get_unicast_promisc(struct fsl_mc_io *mc_io,
1309e6b82573SHemant Agrawal 			     uint32_t cmd_flags,
1310e6b82573SHemant Agrawal 			     uint16_t token,
1311e6b82573SHemant Agrawal 			     int *en)
1312e6b82573SHemant Agrawal {
1313e6b82573SHemant Agrawal 	struct mc_command cmd = { 0 };
131416bbc98aSShreyansh Jain 	struct dpni_rsp_get_unicast_promisc *rsp_params;
1315e6b82573SHemant Agrawal 	int err;
1316e6b82573SHemant Agrawal 
1317e6b82573SHemant Agrawal 	/* prepare command */
1318e6b82573SHemant Agrawal 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_UNICAST_PROMISC,
1319e6b82573SHemant Agrawal 					  cmd_flags,
1320e6b82573SHemant Agrawal 					  token);
1321e6b82573SHemant Agrawal 
1322e6b82573SHemant Agrawal 	/* send command to mc*/
1323e6b82573SHemant Agrawal 	err = mc_send_command(mc_io, &cmd);
1324e6b82573SHemant Agrawal 	if (err)
1325e6b82573SHemant Agrawal 		return err;
1326e6b82573SHemant Agrawal 
1327e6b82573SHemant Agrawal 	/* retrieve response parameters */
132816bbc98aSShreyansh Jain 	rsp_params = (struct dpni_rsp_get_unicast_promisc *)cmd.params;
132916bbc98aSShreyansh Jain 	*en = dpni_get_field(rsp_params->enabled, ENABLE);
1330e6b82573SHemant Agrawal 
1331e6b82573SHemant Agrawal 	return 0;
1332e6b82573SHemant Agrawal }
1333e6b82573SHemant Agrawal 
133416bbc98aSShreyansh Jain /**
133516bbc98aSShreyansh Jain  * dpni_set_primary_mac_addr() - Set the primary MAC address
133616bbc98aSShreyansh Jain  * @mc_io:	Pointer to MC portal's I/O object
133716bbc98aSShreyansh Jain  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
133816bbc98aSShreyansh Jain  * @token:	Token of DPNI object
133916bbc98aSShreyansh Jain  * @mac_addr:	MAC address to set as primary address
134016bbc98aSShreyansh Jain  *
134116bbc98aSShreyansh Jain  * Return:	'0' on Success; Error code otherwise.
134216bbc98aSShreyansh Jain  */
1343e6b82573SHemant Agrawal int dpni_set_primary_mac_addr(struct fsl_mc_io *mc_io,
1344e6b82573SHemant Agrawal 			      uint32_t cmd_flags,
1345e6b82573SHemant Agrawal 			      uint16_t token,
1346e6b82573SHemant Agrawal 			      const uint8_t mac_addr[6])
1347e6b82573SHemant Agrawal {
1348e6b82573SHemant Agrawal 	struct mc_command cmd = { 0 };
134916bbc98aSShreyansh Jain 	struct dpni_cmd_set_primary_mac_addr *cmd_params;
135016bbc98aSShreyansh Jain 	int i;
1351e6b82573SHemant Agrawal 
1352e6b82573SHemant Agrawal 	/* prepare command */
1353e6b82573SHemant Agrawal 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_PRIM_MAC,
1354e6b82573SHemant Agrawal 					  cmd_flags,
1355e6b82573SHemant Agrawal 					  token);
135616bbc98aSShreyansh Jain 	cmd_params = (struct dpni_cmd_set_primary_mac_addr *)cmd.params;
135716bbc98aSShreyansh Jain 	for (i = 0; i < 6; i++)
135816bbc98aSShreyansh Jain 		cmd_params->mac_addr[i] = mac_addr[5 - i];
1359e6b82573SHemant Agrawal 
1360e6b82573SHemant Agrawal 	/* send command to mc*/
1361e6b82573SHemant Agrawal 	return mc_send_command(mc_io, &cmd);
1362e6b82573SHemant Agrawal }
1363e6b82573SHemant Agrawal 
136416bbc98aSShreyansh Jain /**
136516bbc98aSShreyansh Jain  * dpni_get_primary_mac_addr() - Get the primary MAC address
136616bbc98aSShreyansh Jain  * @mc_io:	Pointer to MC portal's I/O object
136716bbc98aSShreyansh Jain  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
136816bbc98aSShreyansh Jain  * @token:	Token of DPNI object
136916bbc98aSShreyansh Jain  * @mac_addr:	Returned MAC address
137016bbc98aSShreyansh Jain  *
137116bbc98aSShreyansh Jain  * Return:	'0' on Success; Error code otherwise.
137216bbc98aSShreyansh Jain  */
1373e6b82573SHemant Agrawal int dpni_get_primary_mac_addr(struct fsl_mc_io *mc_io,
1374e6b82573SHemant Agrawal 			      uint32_t cmd_flags,
1375e6b82573SHemant Agrawal 			      uint16_t token,
1376e6b82573SHemant Agrawal 			      uint8_t mac_addr[6])
1377e6b82573SHemant Agrawal {
1378e6b82573SHemant Agrawal 	struct mc_command cmd = { 0 };
137916bbc98aSShreyansh Jain 	struct dpni_rsp_get_primary_mac_addr *rsp_params;
138016bbc98aSShreyansh Jain 	int i, err;
1381e6b82573SHemant Agrawal 
1382e6b82573SHemant Agrawal 	/* prepare command */
1383e6b82573SHemant Agrawal 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_PRIM_MAC,
1384e6b82573SHemant Agrawal 					  cmd_flags,
1385e6b82573SHemant Agrawal 					  token);
1386e6b82573SHemant Agrawal 
1387e6b82573SHemant Agrawal 	/* send command to mc*/
1388e6b82573SHemant Agrawal 	err = mc_send_command(mc_io, &cmd);
1389e6b82573SHemant Agrawal 	if (err)
1390e6b82573SHemant Agrawal 		return err;
1391e6b82573SHemant Agrawal 
1392e6b82573SHemant Agrawal 	/* retrieve response parameters */
139316bbc98aSShreyansh Jain 	rsp_params = (struct dpni_rsp_get_primary_mac_addr *)cmd.params;
139416bbc98aSShreyansh Jain 	for (i = 0; i < 6; i++)
139516bbc98aSShreyansh Jain 		mac_addr[5 - i] = rsp_params->mac_addr[i];
1396e6b82573SHemant Agrawal 
1397e6b82573SHemant Agrawal 	return 0;
1398e6b82573SHemant Agrawal }
1399e6b82573SHemant Agrawal 
140016bbc98aSShreyansh Jain /**
140116bbc98aSShreyansh Jain  * dpni_add_mac_addr() - Add MAC address filter
140216bbc98aSShreyansh Jain  * @mc_io:	Pointer to MC portal's I/O object
140316bbc98aSShreyansh Jain  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
140416bbc98aSShreyansh Jain  * @token:	Token of DPNI object
140516bbc98aSShreyansh Jain  * @mac_addr:	MAC address to add
140696f7bfe8SSachin Saxena  * @flags :	0 - tc_id and flow_id will be ignored.
140796f7bfe8SSachin Saxena  *		  Pkt with this mac_id will be passed to the next
140896f7bfe8SSachin Saxena  *		  classification stages
140996f7bfe8SSachin Saxena  *		DPNI_MAC_SET_QUEUE_ACTION
141096f7bfe8SSachin Saxena  *		  Pkt with this mac will be forward directly to
141196f7bfe8SSachin Saxena  *		  queue defined by the tc_id and flow_id
141296f7bfe8SSachin Saxena  * @tc_id : Traffic class selection (0-7)
141396f7bfe8SSachin Saxena  * @flow_id : Selects the specific queue out of the set allocated for the
141496f7bfe8SSachin Saxena  *            same as tc_id. Value must be in range 0 to NUM_QUEUES - 1
141516bbc98aSShreyansh Jain  * Return:	'0' on Success; Error code otherwise.
141616bbc98aSShreyansh Jain  */
1417b4d97b7dSHemant Agrawal int dpni_add_mac_addr(struct fsl_mc_io *mc_io,
1418b4d97b7dSHemant Agrawal 		      uint32_t cmd_flags,
1419b4d97b7dSHemant Agrawal 		      uint16_t token,
142096f7bfe8SSachin Saxena 		      const uint8_t mac_addr[6],
142196f7bfe8SSachin Saxena 			  uint8_t flags,
142296f7bfe8SSachin Saxena 			  uint8_t tc_id,
142396f7bfe8SSachin Saxena 			  uint8_t flow_id)
1424b4d97b7dSHemant Agrawal {
1425b4d97b7dSHemant Agrawal 	struct mc_command cmd = { 0 };
142616bbc98aSShreyansh Jain 	struct dpni_cmd_add_mac_addr *cmd_params;
142716bbc98aSShreyansh Jain 	int i;
1428b4d97b7dSHemant Agrawal 
1429b4d97b7dSHemant Agrawal 	/* prepare command */
1430b4d97b7dSHemant Agrawal 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_ADD_MAC_ADDR,
1431b4d97b7dSHemant Agrawal 					  cmd_flags,
1432b4d97b7dSHemant Agrawal 					  token);
143316bbc98aSShreyansh Jain 	cmd_params = (struct dpni_cmd_add_mac_addr *)cmd.params;
143496f7bfe8SSachin Saxena 	cmd_params->flags = flags;
143596f7bfe8SSachin Saxena 	cmd_params->tc_id = tc_id;
143696f7bfe8SSachin Saxena 	cmd_params->fq_id = flow_id;
143796f7bfe8SSachin Saxena 
143816bbc98aSShreyansh Jain 	for (i = 0; i < 6; i++)
143916bbc98aSShreyansh Jain 		cmd_params->mac_addr[i] = mac_addr[5 - i];
1440b4d97b7dSHemant Agrawal 
1441b4d97b7dSHemant Agrawal 	/* send command to mc*/
1442b4d97b7dSHemant Agrawal 	return mc_send_command(mc_io, &cmd);
1443b4d97b7dSHemant Agrawal }
1444b4d97b7dSHemant Agrawal 
144516bbc98aSShreyansh Jain /**
144616bbc98aSShreyansh Jain  * dpni_remove_mac_addr() - Remove MAC address filter
144716bbc98aSShreyansh Jain  * @mc_io:	Pointer to MC portal's I/O object
144816bbc98aSShreyansh Jain  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
144916bbc98aSShreyansh Jain  * @token:	Token of DPNI object
145016bbc98aSShreyansh Jain  * @mac_addr:	MAC address to remove
145116bbc98aSShreyansh Jain  *
145216bbc98aSShreyansh Jain  * Return:	'0' on Success; Error code otherwise.
145316bbc98aSShreyansh Jain  */
1454b4d97b7dSHemant Agrawal int dpni_remove_mac_addr(struct fsl_mc_io *mc_io,
1455b4d97b7dSHemant Agrawal 			 uint32_t cmd_flags,
1456b4d97b7dSHemant Agrawal 			 uint16_t token,
1457b4d97b7dSHemant Agrawal 			 const uint8_t mac_addr[6])
1458b4d97b7dSHemant Agrawal {
1459b4d97b7dSHemant Agrawal 	struct mc_command cmd = { 0 };
146016bbc98aSShreyansh Jain 	struct dpni_cmd_remove_mac_addr *cmd_params;
146116bbc98aSShreyansh Jain 	int i;
1462b4d97b7dSHemant Agrawal 
1463b4d97b7dSHemant Agrawal 	/* prepare command */
1464b4d97b7dSHemant Agrawal 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_REMOVE_MAC_ADDR,
1465b4d97b7dSHemant Agrawal 					  cmd_flags,
1466b4d97b7dSHemant Agrawal 					  token);
146716bbc98aSShreyansh Jain 	cmd_params = (struct dpni_cmd_remove_mac_addr *)cmd.params;
146816bbc98aSShreyansh Jain 	for (i = 0; i < 6; i++)
146916bbc98aSShreyansh Jain 		cmd_params->mac_addr[i] = mac_addr[5 - i];
1470b4d97b7dSHemant Agrawal 
1471b4d97b7dSHemant Agrawal 	/* send command to mc*/
1472b4d97b7dSHemant Agrawal 	return mc_send_command(mc_io, &cmd);
1473b4d97b7dSHemant Agrawal }
1474b4d97b7dSHemant Agrawal 
147516bbc98aSShreyansh Jain /**
147616bbc98aSShreyansh Jain  * dpni_clear_mac_filters() - Clear all unicast and/or multicast MAC filters
147716bbc98aSShreyansh Jain  * @mc_io:	Pointer to MC portal's I/O object
147816bbc98aSShreyansh Jain  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
147916bbc98aSShreyansh Jain  * @token:	Token of DPNI object
148016bbc98aSShreyansh Jain  * @unicast:	Set to '1' to clear unicast addresses
148116bbc98aSShreyansh Jain  * @multicast:	Set to '1' to clear multicast addresses
148216bbc98aSShreyansh Jain  *
148316bbc98aSShreyansh Jain  * The primary MAC address is not cleared by this operation.
148416bbc98aSShreyansh Jain  *
148516bbc98aSShreyansh Jain  * Return:	'0' on Success; Error code otherwise.
148616bbc98aSShreyansh Jain  */
1487b4d97b7dSHemant Agrawal int dpni_clear_mac_filters(struct fsl_mc_io *mc_io,
1488b4d97b7dSHemant Agrawal 			   uint32_t cmd_flags,
1489b4d97b7dSHemant Agrawal 			   uint16_t token,
1490b4d97b7dSHemant Agrawal 			   int unicast,
1491b4d97b7dSHemant Agrawal 			   int multicast)
1492b4d97b7dSHemant Agrawal {
1493b4d97b7dSHemant Agrawal 	struct mc_command cmd = { 0 };
149416bbc98aSShreyansh Jain 	struct dpni_cmd_clear_mac_filters *cmd_params;
1495b4d97b7dSHemant Agrawal 
1496b4d97b7dSHemant Agrawal 	/* prepare command */
1497b4d97b7dSHemant Agrawal 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_CLR_MAC_FILTERS,
1498b4d97b7dSHemant Agrawal 					  cmd_flags,
1499b4d97b7dSHemant Agrawal 					  token);
150016bbc98aSShreyansh Jain 	cmd_params = (struct dpni_cmd_clear_mac_filters *)cmd.params;
150116bbc98aSShreyansh Jain 	dpni_set_field(cmd_params->flags, UNICAST_FILTERS, unicast);
150216bbc98aSShreyansh Jain 	dpni_set_field(cmd_params->flags, MULTICAST_FILTERS, multicast);
1503b4d97b7dSHemant Agrawal 
1504b4d97b7dSHemant Agrawal 	/* send command to mc*/
1505b4d97b7dSHemant Agrawal 	return mc_send_command(mc_io, &cmd);
1506b4d97b7dSHemant Agrawal }
1507b4d97b7dSHemant Agrawal 
150816bbc98aSShreyansh Jain /**
150916bbc98aSShreyansh Jain  * dpni_get_port_mac_addr() - Retrieve MAC address associated to the physical
151016bbc98aSShreyansh Jain  *			port the DPNI is attached to
151116bbc98aSShreyansh Jain  * @mc_io:	Pointer to MC portal's I/O object
151216bbc98aSShreyansh Jain  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
151316bbc98aSShreyansh Jain  * @token:	Token of DPNI object
151416bbc98aSShreyansh Jain  * @mac_addr:	MAC address of the physical port, if any, otherwise 0
151516bbc98aSShreyansh Jain  *
151616bbc98aSShreyansh Jain  * The primary MAC address is not cleared by this operation.
151716bbc98aSShreyansh Jain  *
151816bbc98aSShreyansh Jain  * Return:	'0' on Success; Error code otherwise.
151916bbc98aSShreyansh Jain  */
1520b4d97b7dSHemant Agrawal int dpni_get_port_mac_addr(struct fsl_mc_io *mc_io,
1521b4d97b7dSHemant Agrawal 			   uint32_t cmd_flags,
1522b4d97b7dSHemant Agrawal 			   uint16_t token,
1523b4d97b7dSHemant Agrawal 			   uint8_t mac_addr[6])
1524b4d97b7dSHemant Agrawal {
1525b4d97b7dSHemant Agrawal 	struct mc_command cmd = { 0 };
152616bbc98aSShreyansh Jain 	struct dpni_rsp_get_port_mac_addr *rsp_params;
152716bbc98aSShreyansh Jain 	int i, err;
1528b4d97b7dSHemant Agrawal 
1529b4d97b7dSHemant Agrawal 	/* prepare command */
1530b4d97b7dSHemant Agrawal 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_PORT_MAC_ADDR,
1531b4d97b7dSHemant Agrawal 					  cmd_flags,
1532b4d97b7dSHemant Agrawal 					  token);
1533b4d97b7dSHemant Agrawal 
1534b4d97b7dSHemant Agrawal 	/* send command to mc*/
1535b4d97b7dSHemant Agrawal 	err = mc_send_command(mc_io, &cmd);
1536b4d97b7dSHemant Agrawal 	if (err)
1537b4d97b7dSHemant Agrawal 		return err;
1538b4d97b7dSHemant Agrawal 
1539b4d97b7dSHemant Agrawal 	/* retrieve response parameters */
154016bbc98aSShreyansh Jain 	rsp_params = (struct dpni_rsp_get_port_mac_addr *)cmd.params;
154116bbc98aSShreyansh Jain 	for (i = 0; i < 6; i++)
154216bbc98aSShreyansh Jain 		mac_addr[5 - i] = rsp_params->mac_addr[i];
1543b4d97b7dSHemant Agrawal 
1544b4d97b7dSHemant Agrawal 	return 0;
1545b4d97b7dSHemant Agrawal }
1546b4d97b7dSHemant Agrawal 
154716bbc98aSShreyansh Jain /**
154816bbc98aSShreyansh Jain  * dpni_enable_vlan_filter() - Enable/disable VLAN filtering mode
154916bbc98aSShreyansh Jain  * @mc_io:	Pointer to MC portal's I/O object
155016bbc98aSShreyansh Jain  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
155116bbc98aSShreyansh Jain  * @token:	Token of DPNI object
155216bbc98aSShreyansh Jain  * @en:		Set to '1' to enable; '0' to disable
155316bbc98aSShreyansh Jain  *
155416bbc98aSShreyansh Jain  * Return:	'0' on Success; Error code otherwise.
155516bbc98aSShreyansh Jain  */
15563ce294f2SHemant Agrawal int dpni_enable_vlan_filter(struct fsl_mc_io *mc_io,
15573ce294f2SHemant Agrawal 			    uint32_t cmd_flags,
15583ce294f2SHemant Agrawal 			    uint16_t token,
15593ce294f2SHemant Agrawal 			    int en)
15603ce294f2SHemant Agrawal {
156116bbc98aSShreyansh Jain 	struct dpni_cmd_enable_vlan_filter *cmd_params;
15623ce294f2SHemant Agrawal 	struct mc_command cmd = { 0 };
15633ce294f2SHemant Agrawal 
15643ce294f2SHemant Agrawal 	/* prepare command */
15653ce294f2SHemant Agrawal 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_ENABLE_VLAN_FILTER,
15663ce294f2SHemant Agrawal 					  cmd_flags,
15673ce294f2SHemant Agrawal 					  token);
156816bbc98aSShreyansh Jain 	cmd_params = (struct dpni_cmd_enable_vlan_filter *)cmd.params;
156916bbc98aSShreyansh Jain 	dpni_set_field(cmd_params->en, ENABLE, en);
15703ce294f2SHemant Agrawal 
15713ce294f2SHemant Agrawal 	/* send command to mc*/
15723ce294f2SHemant Agrawal 	return mc_send_command(mc_io, &cmd);
15733ce294f2SHemant Agrawal }
15743ce294f2SHemant Agrawal 
157516bbc98aSShreyansh Jain /**
157616bbc98aSShreyansh Jain  * dpni_add_vlan_id() - Add VLAN ID filter
157716bbc98aSShreyansh Jain  * @mc_io:	Pointer to MC portal's I/O object
157816bbc98aSShreyansh Jain  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
157916bbc98aSShreyansh Jain  * @token:	Token of DPNI object
158016bbc98aSShreyansh Jain  * @vlan_id:	VLAN ID to add
158196f7bfe8SSachin Saxena  * @flags:	0 - tc_id and flow_id will be ignored.
158296f7bfe8SSachin Saxena  *		  Pkt with this vlan_id will be passed to the next
158396f7bfe8SSachin Saxena  *		  classification stages
158496f7bfe8SSachin Saxena  *		DPNI_VLAN_SET_QUEUE_ACTION
158596f7bfe8SSachin Saxena  *		  Pkt with this vlan_id will be forward directly to
158696f7bfe8SSachin Saxena  *		  queue defined by the tc_id and flow_id
158796f7bfe8SSachin Saxena  *
158896f7bfe8SSachin Saxena  * @tc_id: Traffic class selection (0-7)
158996f7bfe8SSachin Saxena  * @flow_id: Selects the specific queue out of the set allocated for the
159096f7bfe8SSachin Saxena  *           same as tc_id. Value must be in range 0 to NUM_QUEUES - 1
159116bbc98aSShreyansh Jain  *
159216bbc98aSShreyansh Jain  * Return:	'0' on Success; Error code otherwise.
159316bbc98aSShreyansh Jain  */
15943ce294f2SHemant Agrawal int dpni_add_vlan_id(struct fsl_mc_io *mc_io,
15953ce294f2SHemant Agrawal 		     uint32_t cmd_flags,
15963ce294f2SHemant Agrawal 		     uint16_t token,
159796f7bfe8SSachin Saxena 		     uint16_t vlan_id,
159896f7bfe8SSachin Saxena 			 uint8_t flags,
159996f7bfe8SSachin Saxena 			 uint8_t tc_id,
160096f7bfe8SSachin Saxena 			 uint8_t flow_id)
16013ce294f2SHemant Agrawal {
160216bbc98aSShreyansh Jain 	struct dpni_cmd_vlan_id *cmd_params;
16033ce294f2SHemant Agrawal 	struct mc_command cmd = { 0 };
16043ce294f2SHemant Agrawal 
16053ce294f2SHemant Agrawal 	/* prepare command */
16063ce294f2SHemant Agrawal 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_ADD_VLAN_ID,
16073ce294f2SHemant Agrawal 					  cmd_flags,
16083ce294f2SHemant Agrawal 					  token);
160916bbc98aSShreyansh Jain 	cmd_params = (struct dpni_cmd_vlan_id *)cmd.params;
161096f7bfe8SSachin Saxena 	cmd_params->flags = flags;
161196f7bfe8SSachin Saxena 	cmd_params->tc_id = tc_id;
161296f7bfe8SSachin Saxena 	cmd_params->flow_id =  flow_id;
161316bbc98aSShreyansh Jain 	cmd_params->vlan_id = cpu_to_le16(vlan_id);
16143ce294f2SHemant Agrawal 
16153ce294f2SHemant Agrawal 	/* send command to mc*/
16163ce294f2SHemant Agrawal 	return mc_send_command(mc_io, &cmd);
16173ce294f2SHemant Agrawal }
16183ce294f2SHemant Agrawal 
161916bbc98aSShreyansh Jain /**
162016bbc98aSShreyansh Jain  * dpni_remove_vlan_id() - Remove VLAN ID filter
162116bbc98aSShreyansh Jain  * @mc_io:	Pointer to MC portal's I/O object
162216bbc98aSShreyansh Jain  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
162316bbc98aSShreyansh Jain  * @token:	Token of DPNI object
162416bbc98aSShreyansh Jain  * @vlan_id:	VLAN ID to remove
162516bbc98aSShreyansh Jain  *
162616bbc98aSShreyansh Jain  * Return:	'0' on Success; Error code otherwise.
162716bbc98aSShreyansh Jain  */
16283ce294f2SHemant Agrawal int dpni_remove_vlan_id(struct fsl_mc_io *mc_io,
16293ce294f2SHemant Agrawal 			uint32_t cmd_flags,
16303ce294f2SHemant Agrawal 			uint16_t token,
16313ce294f2SHemant Agrawal 			uint16_t vlan_id)
16323ce294f2SHemant Agrawal {
163316bbc98aSShreyansh Jain 	struct dpni_cmd_vlan_id *cmd_params;
16343ce294f2SHemant Agrawal 	struct mc_command cmd = { 0 };
16353ce294f2SHemant Agrawal 
16363ce294f2SHemant Agrawal 	/* prepare command */
16373ce294f2SHemant Agrawal 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_REMOVE_VLAN_ID,
16383ce294f2SHemant Agrawal 					  cmd_flags,
16393ce294f2SHemant Agrawal 					  token);
164016bbc98aSShreyansh Jain 	cmd_params = (struct dpni_cmd_vlan_id *)cmd.params;
164116bbc98aSShreyansh Jain 	cmd_params->vlan_id = cpu_to_le16(vlan_id);
16423ce294f2SHemant Agrawal 
16433ce294f2SHemant Agrawal 	/* send command to mc*/
16443ce294f2SHemant Agrawal 	return mc_send_command(mc_io, &cmd);
16453ce294f2SHemant Agrawal }
16463ce294f2SHemant Agrawal 
164716bbc98aSShreyansh Jain /**
164816bbc98aSShreyansh Jain  * dpni_clear_vlan_filters() - Clear all VLAN filters
164916bbc98aSShreyansh Jain  * @mc_io:	Pointer to MC portal's I/O object
165016bbc98aSShreyansh Jain  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
165116bbc98aSShreyansh Jain  * @token:	Token of DPNI object
165216bbc98aSShreyansh Jain  *
165316bbc98aSShreyansh Jain  * Return:	'0' on Success; Error code otherwise.
165416bbc98aSShreyansh Jain  */
16553ce294f2SHemant Agrawal int dpni_clear_vlan_filters(struct fsl_mc_io *mc_io,
16563ce294f2SHemant Agrawal 			    uint32_t cmd_flags,
16573ce294f2SHemant Agrawal 			    uint16_t token)
16583ce294f2SHemant Agrawal {
16593ce294f2SHemant Agrawal 	struct mc_command cmd = { 0 };
16603ce294f2SHemant Agrawal 
16613ce294f2SHemant Agrawal 	/* prepare command */
16623ce294f2SHemant Agrawal 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_CLR_VLAN_FILTERS,
16633ce294f2SHemant Agrawal 					  cmd_flags,
16643ce294f2SHemant Agrawal 					  token);
16653ce294f2SHemant Agrawal 
16663ce294f2SHemant Agrawal 	/* send command to mc*/
16673ce294f2SHemant Agrawal 	return mc_send_command(mc_io, &cmd);
16683ce294f2SHemant Agrawal }
16693ce294f2SHemant Agrawal 
167016bbc98aSShreyansh Jain /**
1671ac624068SGagandeep Singh  * dpni_set_tx_priorities() - Set transmission TC priority configuration
1672ac624068SGagandeep Singh  * @mc_io:	Pointer to MC portal's I/O object
1673ac624068SGagandeep Singh  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1674ac624068SGagandeep Singh  * @token:	Token of DPNI object
1675ac624068SGagandeep Singh  * @cfg:	Transmission selection configuration
1676ac624068SGagandeep Singh  *
1677ac624068SGagandeep Singh  * warning:	Allowed only when DPNI is disabled
1678ac624068SGagandeep Singh  *
1679ac624068SGagandeep Singh  * Return:	'0' on Success; Error code otherwise.
1680ac624068SGagandeep Singh  */
1681ac624068SGagandeep Singh int dpni_set_tx_priorities(struct fsl_mc_io *mc_io,
1682ac624068SGagandeep Singh 			   uint32_t cmd_flags,
1683ac624068SGagandeep Singh 			   uint16_t token,
1684ac624068SGagandeep Singh 			   const struct dpni_tx_priorities_cfg *cfg)
1685ac624068SGagandeep Singh {
1686ac624068SGagandeep Singh 	struct dpni_cmd_set_tx_priorities *cmd_params;
1687ac624068SGagandeep Singh 	struct mc_command cmd = { 0 };
1688ac624068SGagandeep Singh 	int i;
1689ac624068SGagandeep Singh 
1690ac624068SGagandeep Singh 	/* prepare command */
1691ac624068SGagandeep Singh 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_TX_PRIORITIES,
1692ac624068SGagandeep Singh 					  cmd_flags,
1693ac624068SGagandeep Singh 					  token);
1694ac624068SGagandeep Singh 	cmd_params = (struct dpni_cmd_set_tx_priorities *)cmd.params;
1695f48cd6c6SNipun Gupta 	cmd_params->channel_idx = cfg->channel_idx;
1696ac624068SGagandeep Singh 	dpni_set_field(cmd_params->flags,
1697ac624068SGagandeep Singh 				SEPARATE_GRP,
1698ac624068SGagandeep Singh 				cfg->separate_groups);
1699ac624068SGagandeep Singh 	cmd_params->prio_group_A = cfg->prio_group_A;
1700ac624068SGagandeep Singh 	cmd_params->prio_group_B = cfg->prio_group_B;
1701ac624068SGagandeep Singh 
1702ac624068SGagandeep Singh 	for (i = 0; i + 1 < DPNI_MAX_TC; i = i + 2) {
1703ac624068SGagandeep Singh 		dpni_set_field(cmd_params->modes[i / 2],
1704ac624068SGagandeep Singh 			       MODE_1,
1705ac624068SGagandeep Singh 			       cfg->tc_sched[i].mode);
1706ac624068SGagandeep Singh 		dpni_set_field(cmd_params->modes[i / 2],
1707ac624068SGagandeep Singh 				   MODE_2,
1708ac624068SGagandeep Singh 				   cfg->tc_sched[i + 1].mode);
1709ac624068SGagandeep Singh 	}
1710ac624068SGagandeep Singh 
1711ac624068SGagandeep Singh 	for (i = 0; i < DPNI_MAX_TC; i++) {
1712ac624068SGagandeep Singh 		cmd_params->delta_bandwidth[i] =
1713ac624068SGagandeep Singh 				cpu_to_le16(cfg->tc_sched[i].delta_bandwidth);
1714ac624068SGagandeep Singh 	}
1715ac624068SGagandeep Singh 
1716ac624068SGagandeep Singh 	/* send command to mc*/
1717ac624068SGagandeep Singh 	return mc_send_command(mc_io, &cmd);
1718ac624068SGagandeep Singh }
1719ac624068SGagandeep Singh 
1720ac624068SGagandeep Singh /**
172116bbc98aSShreyansh Jain  * dpni_set_rx_tc_dist() - Set Rx traffic class distribution configuration
172216bbc98aSShreyansh Jain  * @mc_io:	Pointer to MC portal's I/O object
172316bbc98aSShreyansh Jain  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
172416bbc98aSShreyansh Jain  * @token:	Token of DPNI object
172516bbc98aSShreyansh Jain  * @tc_id:	Traffic class selection (0-7)
172616bbc98aSShreyansh Jain  * @cfg:	Traffic class distribution configuration
172716bbc98aSShreyansh Jain  *
172816bbc98aSShreyansh Jain  * warning: if 'dist_mode != DPNI_DIST_MODE_NONE', call dpkg_prepare_key_cfg()
172916bbc98aSShreyansh Jain  *			first to prepare the key_cfg_iova parameter
173016bbc98aSShreyansh Jain  *
173116bbc98aSShreyansh Jain  * Return:	'0' on Success; error code otherwise.
173216bbc98aSShreyansh Jain  */
1733e6b82573SHemant Agrawal int dpni_set_rx_tc_dist(struct fsl_mc_io *mc_io,
1734e6b82573SHemant Agrawal 			uint32_t cmd_flags,
1735e6b82573SHemant Agrawal 			uint16_t token,
1736e6b82573SHemant Agrawal 			uint8_t tc_id,
1737e6b82573SHemant Agrawal 			const struct dpni_rx_tc_dist_cfg *cfg)
1738e6b82573SHemant Agrawal {
1739e6b82573SHemant Agrawal 	struct mc_command cmd = { 0 };
174016bbc98aSShreyansh Jain 	struct dpni_cmd_set_rx_tc_dist *cmd_params;
1741e6b82573SHemant Agrawal 
1742e6b82573SHemant Agrawal 	/* prepare command */
1743e6b82573SHemant Agrawal 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_RX_TC_DIST,
1744e6b82573SHemant Agrawal 					  cmd_flags,
1745e6b82573SHemant Agrawal 					  token);
174616bbc98aSShreyansh Jain 	cmd_params = (struct dpni_cmd_set_rx_tc_dist *)cmd.params;
174716bbc98aSShreyansh Jain 	cmd_params->dist_size = cpu_to_le16(cfg->dist_size);
174816bbc98aSShreyansh Jain 	cmd_params->tc_id = tc_id;
174916bbc98aSShreyansh Jain 	cmd_params->default_flow_id = cpu_to_le16(cfg->fs_cfg.default_flow_id);
175016bbc98aSShreyansh Jain 	cmd_params->key_cfg_iova = cpu_to_le64(cfg->key_cfg_iova);
175116bbc98aSShreyansh Jain 	dpni_set_field(cmd_params->flags,
175216bbc98aSShreyansh Jain 		       DIST_MODE,
175316bbc98aSShreyansh Jain 		       cfg->dist_mode);
175416bbc98aSShreyansh Jain 	dpni_set_field(cmd_params->flags,
175516bbc98aSShreyansh Jain 		       MISS_ACTION,
175616bbc98aSShreyansh Jain 		       cfg->fs_cfg.miss_action);
175716bbc98aSShreyansh Jain 	dpni_set_field(cmd_params->keep_hash_key,
175816bbc98aSShreyansh Jain 		       KEEP_HASH_KEY,
175916bbc98aSShreyansh Jain 		       cfg->fs_cfg.keep_hash_key);
176025fea082SHemant Agrawal 	dpni_set_field(cmd_params->keep_hash_key,
176125fea082SHemant Agrawal 		       KEEP_ENTRIES,
176225fea082SHemant Agrawal 		       cfg->fs_cfg.keep_entries);
1763e6b82573SHemant Agrawal 
1764e6b82573SHemant Agrawal 	/* send command to mc*/
1765e6b82573SHemant Agrawal 	return mc_send_command(mc_io, &cmd);
1766e6b82573SHemant Agrawal }
1767e6b82573SHemant Agrawal 
176816bbc98aSShreyansh Jain /**
176916bbc98aSShreyansh Jain  * dpni_set_tx_confirmation_mode() - Tx confirmation mode
177016bbc98aSShreyansh Jain  * @mc_io:	Pointer to MC portal's I/O object
177116bbc98aSShreyansh Jain  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
177216bbc98aSShreyansh Jain  * @token:	Token of DPNI object
1773*591200efSGagandeep Singh  * @ceetm_ch_idx:	ceetm channel index
177416bbc98aSShreyansh Jain  * @mode:	Tx confirmation mode
177516bbc98aSShreyansh Jain  *
177616bbc98aSShreyansh Jain  * This function is useful only when 'DPNI_OPT_TX_CONF_DISABLED' is not
177716bbc98aSShreyansh Jain  * selected at DPNI creation.
177816bbc98aSShreyansh Jain  * Calling this function with 'mode' set to DPNI_CONF_DISABLE disables all
177916bbc98aSShreyansh Jain  * transmit confirmation (including the private confirmation queues), regardless
178016bbc98aSShreyansh Jain  * of previous settings; Note that in this case, Tx error frames are still
178116bbc98aSShreyansh Jain  * enqueued to the general transmit errors queue.
178216bbc98aSShreyansh Jain  * Calling this function with 'mode' set to DPNI_CONF_SINGLE switches all
178316bbc98aSShreyansh Jain  * Tx confirmations to a shared Tx conf queue. 'index' field in dpni_get_queue
178416bbc98aSShreyansh Jain  * command will be ignored.
178516bbc98aSShreyansh Jain  *
178616bbc98aSShreyansh Jain  * Return:	'0' on Success; Error code otherwise.
178716bbc98aSShreyansh Jain  */
1788e6b82573SHemant Agrawal int dpni_set_tx_confirmation_mode(struct fsl_mc_io *mc_io,
1789e6b82573SHemant Agrawal 				  uint32_t cmd_flags,
1790e6b82573SHemant Agrawal 				  uint16_t token,
1791*591200efSGagandeep Singh 				  uint8_t ceetm_ch_idx,
1792e6b82573SHemant Agrawal 				  enum dpni_confirmation_mode mode)
1793e6b82573SHemant Agrawal {
179416bbc98aSShreyansh Jain 	struct dpni_tx_confirmation_mode *cmd_params;
1795e6b82573SHemant Agrawal 	struct mc_command cmd = { 0 };
1796e6b82573SHemant Agrawal 
1797e6b82573SHemant Agrawal 	/* prepare command */
1798e6b82573SHemant Agrawal 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_TX_CONFIRMATION_MODE,
1799e6b82573SHemant Agrawal 					  cmd_flags,
1800e6b82573SHemant Agrawal 					  token);
180116bbc98aSShreyansh Jain 	cmd_params = (struct dpni_tx_confirmation_mode *)cmd.params;
1802*591200efSGagandeep Singh 	cmd_params->ceetm_ch_idx = ceetm_ch_idx;
180316bbc98aSShreyansh Jain 	cmd_params->confirmation_mode = mode;
1804e6b82573SHemant Agrawal 
1805e6b82573SHemant Agrawal 	/* send command to mc*/
1806e6b82573SHemant Agrawal 	return mc_send_command(mc_io, &cmd);
1807e6b82573SHemant Agrawal }
1808e6b82573SHemant Agrawal 
180916bbc98aSShreyansh Jain /**
181072100f0dSGagandeep Singh  * dpni_get_tx_confirmation_mode() - Get Tx confirmation mode
181172100f0dSGagandeep Singh  * @mc_io:	Pointer to MC portal's I/O object
181272100f0dSGagandeep Singh  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
181372100f0dSGagandeep Singh  * @token:	Token of DPNI object
1814*591200efSGagandeep Singh  * @ceetm_ch_idx:	ceetm channel index
181572100f0dSGagandeep Singh  * @mode:	Tx confirmation mode
181672100f0dSGagandeep Singh  *
181772100f0dSGagandeep Singh  * Return:  '0' on Success; Error code otherwise.
181872100f0dSGagandeep Singh  */
181972100f0dSGagandeep Singh int dpni_get_tx_confirmation_mode(struct fsl_mc_io *mc_io,
182072100f0dSGagandeep Singh 				  uint32_t cmd_flags,
182172100f0dSGagandeep Singh 				  uint16_t token,
1822*591200efSGagandeep Singh 				  uint8_t ceetm_ch_idx,
182372100f0dSGagandeep Singh 				  enum dpni_confirmation_mode *mode)
182472100f0dSGagandeep Singh {
1825*591200efSGagandeep Singh 	struct dpni_tx_confirmation_mode *cmd_params;
182672100f0dSGagandeep Singh 	struct dpni_tx_confirmation_mode *rsp_params;
182772100f0dSGagandeep Singh 	struct mc_command cmd = { 0 };
182872100f0dSGagandeep Singh 	int err;
182972100f0dSGagandeep Singh 
183072100f0dSGagandeep Singh 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_TX_CONFIRMATION_MODE,
183172100f0dSGagandeep Singh 					cmd_flags,
183272100f0dSGagandeep Singh 					token);
1833*591200efSGagandeep Singh 	cmd_params = (struct dpni_tx_confirmation_mode *)cmd.params;
1834*591200efSGagandeep Singh 	cmd_params->ceetm_ch_idx = ceetm_ch_idx;
183572100f0dSGagandeep Singh 
183672100f0dSGagandeep Singh 	err = mc_send_command(mc_io, &cmd);
183772100f0dSGagandeep Singh 	if (err)
183872100f0dSGagandeep Singh 		return err;
183972100f0dSGagandeep Singh 
184072100f0dSGagandeep Singh 	rsp_params = (struct dpni_tx_confirmation_mode *)cmd.params;
184172100f0dSGagandeep Singh 	*mode =  rsp_params->confirmation_mode;
184272100f0dSGagandeep Singh 
184372100f0dSGagandeep Singh 	return 0;
184472100f0dSGagandeep Singh }
184572100f0dSGagandeep Singh 
184672100f0dSGagandeep Singh /**
1847*591200efSGagandeep Singh  * dpni_set_queue_tx_confirmation_mode() - Set Tx confirmation mode
1848*591200efSGagandeep Singh  * @mc_io:	Pointer to MC portal's I/O object
1849*591200efSGagandeep Singh  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1850*591200efSGagandeep Singh  * @token:	Token of DPNI object
1851*591200efSGagandeep Singh  * @ceetm_ch_idx:	ceetm channel index
1852*591200efSGagandeep Singh  * @index:	queue index
1853*591200efSGagandeep Singh  * @mode:	Tx confirmation mode
1854*591200efSGagandeep Singh  *
1855*591200efSGagandeep Singh  * Return:	'0' on Success; Error code otherwise.
1856*591200efSGagandeep Singh  */
1857*591200efSGagandeep Singh int dpni_set_queue_tx_confirmation_mode(struct fsl_mc_io *mc_io,
1858*591200efSGagandeep Singh 				  uint32_t cmd_flags,
1859*591200efSGagandeep Singh 				  uint16_t token,
1860*591200efSGagandeep Singh 				  uint8_t ceetm_ch_idx, uint8_t index,
1861*591200efSGagandeep Singh 				  enum dpni_confirmation_mode mode)
1862*591200efSGagandeep Singh {
1863*591200efSGagandeep Singh 	struct dpni_queue_tx_confirmation_mode *cmd_params;
1864*591200efSGagandeep Singh 	struct mc_command cmd = { 0 };
1865*591200efSGagandeep Singh 
1866*591200efSGagandeep Singh 	/* prepare command */
1867*591200efSGagandeep Singh 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_QUEUE_TX_CONFIRMATION_MODE,
1868*591200efSGagandeep Singh 					  cmd_flags,
1869*591200efSGagandeep Singh 					  token);
1870*591200efSGagandeep Singh 	cmd_params = (struct dpni_queue_tx_confirmation_mode *)cmd.params;
1871*591200efSGagandeep Singh 	cmd_params->ceetm_ch_idx = ceetm_ch_idx;
1872*591200efSGagandeep Singh 	cmd_params->index = index;
1873*591200efSGagandeep Singh 	cmd_params->confirmation_mode = mode;
1874*591200efSGagandeep Singh 
1875*591200efSGagandeep Singh 	/* send command to mc*/
1876*591200efSGagandeep Singh 	return mc_send_command(mc_io, &cmd);
1877*591200efSGagandeep Singh }
1878*591200efSGagandeep Singh 
1879*591200efSGagandeep Singh /**
1880*591200efSGagandeep Singh  * dpni_get_queue_tx_confirmation_mode() - Get Tx confirmation mode
1881*591200efSGagandeep Singh  * @mc_io:	Pointer to MC portal's I/O object
1882*591200efSGagandeep Singh  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1883*591200efSGagandeep Singh  * @token:	Token of DPNI object
1884*591200efSGagandeep Singh  * @ceetm_ch_idx:	ceetm channel index
1885*591200efSGagandeep Singh  * @index:	queue index
1886*591200efSGagandeep Singh  * @mode:	Tx confirmation mode
1887*591200efSGagandeep Singh  *
1888*591200efSGagandeep Singh  * Return:  '0' on Success; Error code otherwise.
1889*591200efSGagandeep Singh  */
1890*591200efSGagandeep Singh int dpni_get_queue_tx_confirmation_mode(struct fsl_mc_io *mc_io,
1891*591200efSGagandeep Singh 				  uint32_t cmd_flags,
1892*591200efSGagandeep Singh 				  uint16_t token,
1893*591200efSGagandeep Singh 				  uint8_t ceetm_ch_idx, uint8_t index,
1894*591200efSGagandeep Singh 				  enum dpni_confirmation_mode *mode)
1895*591200efSGagandeep Singh {
1896*591200efSGagandeep Singh 	struct dpni_queue_tx_confirmation_mode *cmd_params;
1897*591200efSGagandeep Singh 	struct dpni_queue_tx_confirmation_mode *rsp_params;
1898*591200efSGagandeep Singh 	struct mc_command cmd = { 0 };
1899*591200efSGagandeep Singh 	int err;
1900*591200efSGagandeep Singh 
1901*591200efSGagandeep Singh 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_QUEUE_TX_CONFIRMATION_MODE,
1902*591200efSGagandeep Singh 					cmd_flags,
1903*591200efSGagandeep Singh 					token);
1904*591200efSGagandeep Singh 	cmd_params = (struct dpni_queue_tx_confirmation_mode *)cmd.params;
1905*591200efSGagandeep Singh 	cmd_params->ceetm_ch_idx = ceetm_ch_idx;
1906*591200efSGagandeep Singh 	cmd_params->index = index;
1907*591200efSGagandeep Singh 
1908*591200efSGagandeep Singh 	err = mc_send_command(mc_io, &cmd);
1909*591200efSGagandeep Singh 	if (err)
1910*591200efSGagandeep Singh 		return err;
1911*591200efSGagandeep Singh 
1912*591200efSGagandeep Singh 	rsp_params = (struct dpni_queue_tx_confirmation_mode *)cmd.params;
1913*591200efSGagandeep Singh 	*mode =  rsp_params->confirmation_mode;
1914*591200efSGagandeep Singh 
1915*591200efSGagandeep Singh 	return 0;
1916*591200efSGagandeep Singh }
1917*591200efSGagandeep Singh 
1918*591200efSGagandeep Singh /**
1919fe2b986aSSunil Kumar Kori  * dpni_set_qos_table() - Set QoS mapping table
1920fe2b986aSSunil Kumar Kori  * @mc_io:	Pointer to MC portal's I/O object
1921fe2b986aSSunil Kumar Kori  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1922fe2b986aSSunil Kumar Kori  * @token:	Token of DPNI object
1923fe2b986aSSunil Kumar Kori  * @cfg:	QoS table configuration
1924fe2b986aSSunil Kumar Kori  *
1925fe2b986aSSunil Kumar Kori  * This function and all QoS-related functions require that
1926fe2b986aSSunil Kumar Kori  *'max_tcs > 1' was set at DPNI creation.
1927fe2b986aSSunil Kumar Kori  *
1928fe2b986aSSunil Kumar Kori  * warning: Before calling this function, call dpkg_prepare_key_cfg() to
1929fe2b986aSSunil Kumar Kori  *			prepare the key_cfg_iova parameter
1930fe2b986aSSunil Kumar Kori  *
1931fe2b986aSSunil Kumar Kori  * Return:	'0' on Success; Error code otherwise.
1932fe2b986aSSunil Kumar Kori  */
1933fe2b986aSSunil Kumar Kori int dpni_set_qos_table(struct fsl_mc_io *mc_io,
1934fe2b986aSSunil Kumar Kori 		       uint32_t cmd_flags,
1935fe2b986aSSunil Kumar Kori 		       uint16_t token,
1936fe2b986aSSunil Kumar Kori 		       const struct dpni_qos_tbl_cfg *cfg)
1937fe2b986aSSunil Kumar Kori {
1938fe2b986aSSunil Kumar Kori 	struct dpni_cmd_set_qos_table *cmd_params;
1939fe2b986aSSunil Kumar Kori 	struct mc_command cmd = { 0 };
1940fe2b986aSSunil Kumar Kori 
1941fe2b986aSSunil Kumar Kori 	/* prepare command */
1942fe2b986aSSunil Kumar Kori 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_QOS_TBL,
1943fe2b986aSSunil Kumar Kori 					  cmd_flags,
1944fe2b986aSSunil Kumar Kori 					  token);
1945fe2b986aSSunil Kumar Kori 	cmd_params = (struct dpni_cmd_set_qos_table *)cmd.params;
1946fe2b986aSSunil Kumar Kori 	cmd_params->default_tc = cfg->default_tc;
1947fe2b986aSSunil Kumar Kori 	cmd_params->key_cfg_iova = cpu_to_le64(cfg->key_cfg_iova);
1948fe2b986aSSunil Kumar Kori 	dpni_set_field(cmd_params->discard_on_miss,
1949fe2b986aSSunil Kumar Kori 		       ENABLE,
1950fe2b986aSSunil Kumar Kori 		       cfg->discard_on_miss);
1951fe2b986aSSunil Kumar Kori 	dpni_set_field(cmd_params->discard_on_miss,
1952fe2b986aSSunil Kumar Kori 					KEEP_QOS_ENTRIES,
1953fe2b986aSSunil Kumar Kori 			       cfg->keep_entries);
1954fe2b986aSSunil Kumar Kori 
1955fe2b986aSSunil Kumar Kori 	/* send command to mc*/
1956fe2b986aSSunil Kumar Kori 	return mc_send_command(mc_io, &cmd);
1957fe2b986aSSunil Kumar Kori }
1958fe2b986aSSunil Kumar Kori 
1959fe2b986aSSunil Kumar Kori /**
1960fe2b986aSSunil Kumar Kori  * dpni_add_qos_entry() - Add QoS mapping entry (to select a traffic class)
1961fe2b986aSSunil Kumar Kori  * @mc_io:	Pointer to MC portal's I/O object
1962fe2b986aSSunil Kumar Kori  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1963fe2b986aSSunil Kumar Kori  * @token:	Token of DPNI object
1964fe2b986aSSunil Kumar Kori  * @cfg:	QoS rule to add
1965fe2b986aSSunil Kumar Kori  * @tc_id:	Traffic class selection (0-7)
1966fe2b986aSSunil Kumar Kori  * @index:	Location in the QoS table where to insert the entry.
1967fe2b986aSSunil Kumar Kori  *		Only relevant if MASKING is enabled for QoS classification on
1968fe2b986aSSunil Kumar Kori  *		this DPNI, it is ignored for exact match.
1969fe2b986aSSunil Kumar Kori  *
1970fe2b986aSSunil Kumar Kori  * Return:	'0' on Success; Error code otherwise.
1971fe2b986aSSunil Kumar Kori  */
1972fe2b986aSSunil Kumar Kori int dpni_add_qos_entry(struct fsl_mc_io *mc_io,
1973fe2b986aSSunil Kumar Kori 		       uint32_t cmd_flags,
1974fe2b986aSSunil Kumar Kori 		       uint16_t token,
1975fe2b986aSSunil Kumar Kori 		       const struct dpni_rule_cfg *cfg,
1976fe2b986aSSunil Kumar Kori 		       uint8_t tc_id,
197796f7bfe8SSachin Saxena 		       uint16_t index,
197896f7bfe8SSachin Saxena 			   uint8_t flags,
197996f7bfe8SSachin Saxena 			   uint8_t flow_id)
1980fe2b986aSSunil Kumar Kori {
1981fe2b986aSSunil Kumar Kori 	struct dpni_cmd_add_qos_entry *cmd_params;
1982fe2b986aSSunil Kumar Kori 	struct mc_command cmd = { 0 };
1983fe2b986aSSunil Kumar Kori 
1984fe2b986aSSunil Kumar Kori 	/* prepare command */
1985fe2b986aSSunil Kumar Kori 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_ADD_QOS_ENT,
1986fe2b986aSSunil Kumar Kori 					  cmd_flags,
1987fe2b986aSSunil Kumar Kori 					  token);
1988fe2b986aSSunil Kumar Kori 	cmd_params = (struct dpni_cmd_add_qos_entry *)cmd.params;
198996f7bfe8SSachin Saxena 	cmd_params->flags = flags;
199096f7bfe8SSachin Saxena 	cmd_params->flow_id = flow_id;
1991fe2b986aSSunil Kumar Kori 	cmd_params->tc_id = tc_id;
1992fe2b986aSSunil Kumar Kori 	cmd_params->key_size = cfg->key_size;
1993fe2b986aSSunil Kumar Kori 	cmd_params->index = cpu_to_le16(index);
1994fe2b986aSSunil Kumar Kori 	cmd_params->key_iova = cpu_to_le64(cfg->key_iova);
1995fe2b986aSSunil Kumar Kori 	cmd_params->mask_iova = cpu_to_le64(cfg->mask_iova);
1996fe2b986aSSunil Kumar Kori 
1997fe2b986aSSunil Kumar Kori 	/* send command to mc*/
1998fe2b986aSSunil Kumar Kori 	return mc_send_command(mc_io, &cmd);
1999fe2b986aSSunil Kumar Kori }
2000fe2b986aSSunil Kumar Kori 
2001fe2b986aSSunil Kumar Kori /**
2002fe2b986aSSunil Kumar Kori  * dpni_remove_qos_entry() - Remove QoS mapping entry
2003fe2b986aSSunil Kumar Kori  * @mc_io:	Pointer to MC portal's I/O object
2004fe2b986aSSunil Kumar Kori  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
2005fe2b986aSSunil Kumar Kori  * @token:	Token of DPNI object
2006fe2b986aSSunil Kumar Kori  * @cfg:	QoS rule to remove
2007fe2b986aSSunil Kumar Kori  *
2008fe2b986aSSunil Kumar Kori  * Return:	'0' on Success; Error code otherwise.
2009fe2b986aSSunil Kumar Kori  */
2010fe2b986aSSunil Kumar Kori int dpni_remove_qos_entry(struct fsl_mc_io *mc_io,
2011fe2b986aSSunil Kumar Kori 			  uint32_t cmd_flags,
2012fe2b986aSSunil Kumar Kori 			  uint16_t token,
2013fe2b986aSSunil Kumar Kori 			  const struct dpni_rule_cfg *cfg)
2014fe2b986aSSunil Kumar Kori {
2015fe2b986aSSunil Kumar Kori 	struct dpni_cmd_remove_qos_entry *cmd_params;
2016fe2b986aSSunil Kumar Kori 	struct mc_command cmd = { 0 };
2017fe2b986aSSunil Kumar Kori 
2018fe2b986aSSunil Kumar Kori 	/* prepare command */
2019fe2b986aSSunil Kumar Kori 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_REMOVE_QOS_ENT,
2020fe2b986aSSunil Kumar Kori 					  cmd_flags,
2021fe2b986aSSunil Kumar Kori 					  token);
2022fe2b986aSSunil Kumar Kori 	cmd_params = (struct dpni_cmd_remove_qos_entry *)cmd.params;
2023fe2b986aSSunil Kumar Kori 	cmd_params->key_size = cfg->key_size;
2024fe2b986aSSunil Kumar Kori 	cmd_params->key_iova = cpu_to_le64(cfg->key_iova);
2025fe2b986aSSunil Kumar Kori 	cmd_params->mask_iova = cpu_to_le64(cfg->mask_iova);
2026fe2b986aSSunil Kumar Kori 
2027fe2b986aSSunil Kumar Kori 	/* send command to mc*/
2028fe2b986aSSunil Kumar Kori 	return mc_send_command(mc_io, &cmd);
2029fe2b986aSSunil Kumar Kori }
2030fe2b986aSSunil Kumar Kori 
2031fe2b986aSSunil Kumar Kori /**
2032fe2b986aSSunil Kumar Kori  * dpni_clear_qos_table() - Clear all QoS mapping entries
2033fe2b986aSSunil Kumar Kori  * @mc_io:	Pointer to MC portal's I/O object
2034fe2b986aSSunil Kumar Kori  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
2035fe2b986aSSunil Kumar Kori  * @token:	Token of DPNI object
2036fe2b986aSSunil Kumar Kori  *
2037fe2b986aSSunil Kumar Kori  * Following this function call, all frames are directed to
2038fe2b986aSSunil Kumar Kori  * the default traffic class (0)
2039fe2b986aSSunil Kumar Kori  *
2040fe2b986aSSunil Kumar Kori  * Return:	'0' on Success; Error code otherwise.
2041fe2b986aSSunil Kumar Kori  */
2042fe2b986aSSunil Kumar Kori int dpni_clear_qos_table(struct fsl_mc_io *mc_io,
2043fe2b986aSSunil Kumar Kori 			 uint32_t cmd_flags,
2044fe2b986aSSunil Kumar Kori 			 uint16_t token)
2045fe2b986aSSunil Kumar Kori {
2046fe2b986aSSunil Kumar Kori 	struct mc_command cmd = { 0 };
2047fe2b986aSSunil Kumar Kori 
2048fe2b986aSSunil Kumar Kori 	/* prepare command */
2049fe2b986aSSunil Kumar Kori 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_CLR_QOS_TBL,
2050fe2b986aSSunil Kumar Kori 					  cmd_flags,
2051fe2b986aSSunil Kumar Kori 					  token);
2052fe2b986aSSunil Kumar Kori 
2053fe2b986aSSunil Kumar Kori 	/* send command to mc*/
2054fe2b986aSSunil Kumar Kori 	return mc_send_command(mc_io, &cmd);
2055fe2b986aSSunil Kumar Kori }
2056fe2b986aSSunil Kumar Kori 
2057fe2b986aSSunil Kumar Kori /**
2058fe2b986aSSunil Kumar Kori  * dpni_add_fs_entry() - Add Flow Steering entry for a specific traffic class
2059fe2b986aSSunil Kumar Kori  *			(to select a flow ID)
2060fe2b986aSSunil Kumar Kori  * @mc_io:	Pointer to MC portal's I/O object
2061fe2b986aSSunil Kumar Kori  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
2062fe2b986aSSunil Kumar Kori  * @token:	Token of DPNI object
2063fe2b986aSSunil Kumar Kori  * @tc_id:	Traffic class selection (0-7)
2064fe2b986aSSunil Kumar Kori  * @index:	Location in the QoS table where to insert the entry.
2065fe2b986aSSunil Kumar Kori  *		Only relevant if MASKING is enabled for QoS classification
2066fe2b986aSSunil Kumar Kori  *		on this DPNI, it is ignored for exact match.
2067fe2b986aSSunil Kumar Kori  * @cfg:	Flow steering rule to add
2068fe2b986aSSunil Kumar Kori  * @action:	Action to be taken as result of a classification hit
2069fe2b986aSSunil Kumar Kori  *
2070fe2b986aSSunil Kumar Kori  * Return:	'0' on Success; Error code otherwise.
2071fe2b986aSSunil Kumar Kori  */
2072fe2b986aSSunil Kumar Kori int dpni_add_fs_entry(struct fsl_mc_io *mc_io,
2073fe2b986aSSunil Kumar Kori 		      uint32_t cmd_flags,
2074fe2b986aSSunil Kumar Kori 		      uint16_t token,
2075fe2b986aSSunil Kumar Kori 		      uint8_t tc_id,
2076fe2b986aSSunil Kumar Kori 		      uint16_t index,
2077fe2b986aSSunil Kumar Kori 		      const struct dpni_rule_cfg *cfg,
2078fe2b986aSSunil Kumar Kori 		      const struct dpni_fs_action_cfg *action)
2079fe2b986aSSunil Kumar Kori {
2080fe2b986aSSunil Kumar Kori 	struct dpni_cmd_add_fs_entry *cmd_params;
2081fe2b986aSSunil Kumar Kori 	struct mc_command cmd = { 0 };
2082fe2b986aSSunil Kumar Kori 
2083fe2b986aSSunil Kumar Kori 	/* prepare command */
2084fe2b986aSSunil Kumar Kori 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_ADD_FS_ENT,
2085fe2b986aSSunil Kumar Kori 					  cmd_flags,
2086fe2b986aSSunil Kumar Kori 					  token);
2087fe2b986aSSunil Kumar Kori 	cmd_params = (struct dpni_cmd_add_fs_entry *)cmd.params;
2088fe2b986aSSunil Kumar Kori 	cmd_params->tc_id = tc_id;
2089fe2b986aSSunil Kumar Kori 	cmd_params->key_size = cfg->key_size;
2090fe2b986aSSunil Kumar Kori 	cmd_params->index = cpu_to_le16(index);
2091fe2b986aSSunil Kumar Kori 	cmd_params->key_iova = cpu_to_le64(cfg->key_iova);
2092fe2b986aSSunil Kumar Kori 	cmd_params->mask_iova = cpu_to_le64(cfg->mask_iova);
2093fe2b986aSSunil Kumar Kori 	cmd_params->options = cpu_to_le16(action->options);
2094fe2b986aSSunil Kumar Kori 	cmd_params->flow_id = cpu_to_le16(action->flow_id);
2095fe2b986aSSunil Kumar Kori 	cmd_params->flc = cpu_to_le64(action->flc);
20962cb2abf3SHemant Agrawal 	cmd_params->redir_token = cpu_to_le16(action->redirect_obj_token);
2097fe2b986aSSunil Kumar Kori 
2098fe2b986aSSunil Kumar Kori 	/* send command to mc*/
2099fe2b986aSSunil Kumar Kori 	return mc_send_command(mc_io, &cmd);
2100fe2b986aSSunil Kumar Kori }
2101fe2b986aSSunil Kumar Kori 
2102fe2b986aSSunil Kumar Kori /**
2103fe2b986aSSunil Kumar Kori  * dpni_remove_fs_entry() - Remove Flow Steering entry from a specific
2104fe2b986aSSunil Kumar Kori  *			traffic class
2105fe2b986aSSunil Kumar Kori  * @mc_io:	Pointer to MC portal's I/O object
2106fe2b986aSSunil Kumar Kori  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
2107fe2b986aSSunil Kumar Kori  * @token:	Token of DPNI object
2108fe2b986aSSunil Kumar Kori  * @tc_id:	Traffic class selection (0-7)
2109fe2b986aSSunil Kumar Kori  * @cfg:	Flow steering rule to remove
2110fe2b986aSSunil Kumar Kori  *
2111fe2b986aSSunil Kumar Kori  * Return:	'0' on Success; Error code otherwise.
2112fe2b986aSSunil Kumar Kori  */
2113fe2b986aSSunil Kumar Kori int dpni_remove_fs_entry(struct fsl_mc_io *mc_io,
2114fe2b986aSSunil Kumar Kori 			 uint32_t cmd_flags,
2115fe2b986aSSunil Kumar Kori 			 uint16_t token,
2116fe2b986aSSunil Kumar Kori 			 uint8_t tc_id,
2117fe2b986aSSunil Kumar Kori 			 const struct dpni_rule_cfg *cfg)
2118fe2b986aSSunil Kumar Kori {
2119fe2b986aSSunil Kumar Kori 	struct dpni_cmd_remove_fs_entry *cmd_params;
2120fe2b986aSSunil Kumar Kori 	struct mc_command cmd = { 0 };
2121fe2b986aSSunil Kumar Kori 
2122fe2b986aSSunil Kumar Kori 	/* prepare command */
2123fe2b986aSSunil Kumar Kori 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_REMOVE_FS_ENT,
2124fe2b986aSSunil Kumar Kori 					  cmd_flags,
2125fe2b986aSSunil Kumar Kori 					  token);
2126fe2b986aSSunil Kumar Kori 	cmd_params = (struct dpni_cmd_remove_fs_entry *)cmd.params;
2127fe2b986aSSunil Kumar Kori 	cmd_params->tc_id = tc_id;
2128fe2b986aSSunil Kumar Kori 	cmd_params->key_size = cfg->key_size;
2129fe2b986aSSunil Kumar Kori 	cmd_params->key_iova = cpu_to_le64(cfg->key_iova);
2130fe2b986aSSunil Kumar Kori 	cmd_params->mask_iova = cpu_to_le64(cfg->mask_iova);
2131fe2b986aSSunil Kumar Kori 
2132fe2b986aSSunil Kumar Kori 	/* send command to mc*/
2133fe2b986aSSunil Kumar Kori 	return mc_send_command(mc_io, &cmd);
2134fe2b986aSSunil Kumar Kori }
2135fe2b986aSSunil Kumar Kori 
2136fe2b986aSSunil Kumar Kori /**
2137fe2b986aSSunil Kumar Kori  * dpni_clear_fs_entries() - Clear all Flow Steering entries of a specific
2138fe2b986aSSunil Kumar Kori  *			traffic class
2139fe2b986aSSunil Kumar Kori  * @mc_io:	Pointer to MC portal's I/O object
2140fe2b986aSSunil Kumar Kori  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
2141fe2b986aSSunil Kumar Kori  * @token:	Token of DPNI object
2142fe2b986aSSunil Kumar Kori  * @tc_id:	Traffic class selection (0-7)
2143fe2b986aSSunil Kumar Kori  *
2144fe2b986aSSunil Kumar Kori  * Return:	'0' on Success; Error code otherwise.
2145fe2b986aSSunil Kumar Kori  */
2146fe2b986aSSunil Kumar Kori int dpni_clear_fs_entries(struct fsl_mc_io *mc_io,
2147fe2b986aSSunil Kumar Kori 			  uint32_t cmd_flags,
2148fe2b986aSSunil Kumar Kori 			  uint16_t token,
2149fe2b986aSSunil Kumar Kori 			  uint8_t tc_id)
2150fe2b986aSSunil Kumar Kori {
2151fe2b986aSSunil Kumar Kori 	struct dpni_cmd_clear_fs_entries *cmd_params;
2152fe2b986aSSunil Kumar Kori 	struct mc_command cmd = { 0 };
2153fe2b986aSSunil Kumar Kori 
2154fe2b986aSSunil Kumar Kori 	/* prepare command */
2155fe2b986aSSunil Kumar Kori 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_CLR_FS_ENT,
2156fe2b986aSSunil Kumar Kori 					  cmd_flags,
2157fe2b986aSSunil Kumar Kori 					  token);
2158fe2b986aSSunil Kumar Kori 	cmd_params = (struct dpni_cmd_clear_fs_entries *)cmd.params;
2159fe2b986aSSunil Kumar Kori 	cmd_params->tc_id = tc_id;
2160fe2b986aSSunil Kumar Kori 
2161fe2b986aSSunil Kumar Kori 	/* send command to mc*/
2162fe2b986aSSunil Kumar Kori 	return mc_send_command(mc_io, &cmd);
2163fe2b986aSSunil Kumar Kori }
2164fe2b986aSSunil Kumar Kori 
2165fe2b986aSSunil Kumar Kori /**
2166ac624068SGagandeep Singh  * dpni_set_rx_tc_policing() - Set Rx traffic class policing configuration
2167ac624068SGagandeep Singh  * @mc_io:	Pointer to MC portal's I/O object
2168ac624068SGagandeep Singh  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
2169ac624068SGagandeep Singh  * @token:	Token of DPNI object
2170ac624068SGagandeep Singh  * @tc_id:	Traffic class selection (0-7)
2171ac624068SGagandeep Singh  * @cfg:	Traffic class policing configuration
2172ac624068SGagandeep Singh  *
2173ac624068SGagandeep Singh  * Return:	'0' on Success; error code otherwise.
2174ac624068SGagandeep Singh  */
2175ac624068SGagandeep Singh int dpni_set_rx_tc_policing(struct fsl_mc_io *mc_io,
2176ac624068SGagandeep Singh 			    uint32_t cmd_flags,
2177ac624068SGagandeep Singh 			    uint16_t token,
2178ac624068SGagandeep Singh 			    uint8_t tc_id,
2179ac624068SGagandeep Singh 			    const struct dpni_rx_tc_policing_cfg *cfg)
2180ac624068SGagandeep Singh {
2181ac624068SGagandeep Singh 	struct dpni_cmd_set_rx_tc_policing *cmd_params;
2182ac624068SGagandeep Singh 	struct mc_command cmd = { 0 };
2183ac624068SGagandeep Singh 
2184ac624068SGagandeep Singh 	/* prepare command */
2185ac624068SGagandeep Singh 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_RX_TC_POLICING,
2186ac624068SGagandeep Singh 					  cmd_flags,
2187ac624068SGagandeep Singh 					  token);
2188ac624068SGagandeep Singh 	cmd_params = (struct dpni_cmd_set_rx_tc_policing *)cmd.params;
2189ac624068SGagandeep Singh 	dpni_set_field(cmd_params->mode_color, COLOR, cfg->default_color);
2190ac624068SGagandeep Singh 	dpni_set_field(cmd_params->mode_color, MODE, cfg->mode);
2191ac624068SGagandeep Singh 	dpni_set_field(cmd_params->units, UNITS, cfg->units);
2192ac624068SGagandeep Singh 	cmd_params->options = cpu_to_le32(cfg->options);
2193ac624068SGagandeep Singh 	cmd_params->cir = cpu_to_le32(cfg->cir);
2194ac624068SGagandeep Singh 	cmd_params->cbs = cpu_to_le32(cfg->cbs);
2195ac624068SGagandeep Singh 	cmd_params->eir = cpu_to_le32(cfg->eir);
2196ac624068SGagandeep Singh 	cmd_params->ebs = cpu_to_le32(cfg->ebs);
2197ac624068SGagandeep Singh 	cmd_params->tc_id = tc_id;
2198ac624068SGagandeep Singh 
2199ac624068SGagandeep Singh 	/* send command to mc*/
2200ac624068SGagandeep Singh 	return mc_send_command(mc_io, &cmd);
2201ac624068SGagandeep Singh }
2202ac624068SGagandeep Singh 
2203ac624068SGagandeep Singh /**
2204ac624068SGagandeep Singh  * dpni_get_rx_tc_policing() - Get Rx traffic class policing configuration
2205ac624068SGagandeep Singh  * @mc_io:	Pointer to MC portal's I/O object
2206ac624068SGagandeep Singh  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
2207ac624068SGagandeep Singh  * @token:	Token of DPNI object
2208ac624068SGagandeep Singh  * @tc_id:	Traffic class selection (0-7)
2209ac624068SGagandeep Singh  * @cfg:	Traffic class policing configuration
2210ac624068SGagandeep Singh  *
2211ac624068SGagandeep Singh  * Return:	'0' on Success; error code otherwise.
2212ac624068SGagandeep Singh  */
2213ac624068SGagandeep Singh int dpni_get_rx_tc_policing(struct fsl_mc_io *mc_io,
2214ac624068SGagandeep Singh 			    uint32_t cmd_flags,
2215ac624068SGagandeep Singh 			    uint16_t token,
2216ac624068SGagandeep Singh 			    uint8_t tc_id,
2217ac624068SGagandeep Singh 			    struct dpni_rx_tc_policing_cfg *cfg)
2218ac624068SGagandeep Singh {
2219ac624068SGagandeep Singh 	struct dpni_rsp_get_rx_tc_policing *rsp_params;
2220ac624068SGagandeep Singh 	struct dpni_cmd_get_rx_tc_policing *cmd_params;
2221ac624068SGagandeep Singh 	struct mc_command cmd = { 0 };
2222ac624068SGagandeep Singh 	int err;
2223ac624068SGagandeep Singh 
2224ac624068SGagandeep Singh 	/* prepare command */
2225ac624068SGagandeep Singh 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_RX_TC_POLICING,
2226ac624068SGagandeep Singh 					  cmd_flags,
2227ac624068SGagandeep Singh 					  token);
2228ac624068SGagandeep Singh 	cmd_params = (struct dpni_cmd_get_rx_tc_policing *)cmd.params;
2229ac624068SGagandeep Singh 	cmd_params->tc_id = tc_id;
2230ac624068SGagandeep Singh 
2231ac624068SGagandeep Singh 
2232ac624068SGagandeep Singh 	/* send command to mc*/
2233ac624068SGagandeep Singh 	err =  mc_send_command(mc_io, &cmd);
2234ac624068SGagandeep Singh 	if (err)
2235ac624068SGagandeep Singh 		return err;
2236ac624068SGagandeep Singh 
2237ac624068SGagandeep Singh 	rsp_params =  (struct dpni_rsp_get_rx_tc_policing *)cmd.params;
2238ac624068SGagandeep Singh 	cfg->options = le32_to_cpu(rsp_params->options);
2239ac624068SGagandeep Singh 	cfg->cir = le32_to_cpu(rsp_params->cir);
2240ac624068SGagandeep Singh 	cfg->cbs = le32_to_cpu(rsp_params->cbs);
2241ac624068SGagandeep Singh 	cfg->eir = le32_to_cpu(rsp_params->eir);
2242ac624068SGagandeep Singh 	cfg->ebs = le32_to_cpu(rsp_params->ebs);
2243ac624068SGagandeep Singh 	cfg->units = dpni_get_field(rsp_params->units, UNITS);
2244ac624068SGagandeep Singh 	cfg->mode = dpni_get_field(rsp_params->mode_color, MODE);
2245ac624068SGagandeep Singh 	cfg->default_color = dpni_get_field(rsp_params->mode_color, COLOR);
2246ac624068SGagandeep Singh 
2247ac624068SGagandeep Singh 	return 0;
2248ac624068SGagandeep Singh }
2249ac624068SGagandeep Singh 
2250ac624068SGagandeep Singh /**
2251ac624068SGagandeep Singh  * dpni_prepare_early_drop() - prepare an early drop.
2252ac624068SGagandeep Singh  * @cfg:		Early-drop configuration
2253ac624068SGagandeep Singh  * @early_drop_buf:	Zeroed 256 bytes of memory before mapping it to DMA
2254ac624068SGagandeep Singh  *
2255ac624068SGagandeep Singh  * This function has to be called before dpni_set_rx_tc_early_drop or
2256ac624068SGagandeep Singh  * dpni_set_tx_tc_early_drop
2257ac624068SGagandeep Singh  *
2258ac624068SGagandeep Singh  */
2259ac624068SGagandeep Singh void dpni_prepare_early_drop(const struct dpni_early_drop_cfg *cfg,
2260ac624068SGagandeep Singh 			     uint8_t *early_drop_buf)
2261ac624068SGagandeep Singh {
2262ac624068SGagandeep Singh 	struct dpni_early_drop *ext_params;
2263ac624068SGagandeep Singh 
2264ac624068SGagandeep Singh 	ext_params = (struct dpni_early_drop *)early_drop_buf;
2265ac624068SGagandeep Singh 
2266ac624068SGagandeep Singh 	dpni_set_field(ext_params->flags, DROP_ENABLE, cfg->enable);
2267ac624068SGagandeep Singh 	dpni_set_field(ext_params->flags, DROP_UNITS, cfg->units);
2268ac624068SGagandeep Singh 	ext_params->green_drop_probability = cfg->green.drop_probability;
2269ac624068SGagandeep Singh 	ext_params->green_max_threshold = cpu_to_le64(cfg->green.max_threshold);
2270ac624068SGagandeep Singh 	ext_params->green_min_threshold = cpu_to_le64(cfg->green.min_threshold);
2271ac624068SGagandeep Singh 	ext_params->yellow_drop_probability = cfg->yellow.drop_probability;
2272ac624068SGagandeep Singh 	ext_params->yellow_max_threshold =
2273ac624068SGagandeep Singh 		cpu_to_le64(cfg->yellow.max_threshold);
2274ac624068SGagandeep Singh 	ext_params->yellow_min_threshold =
2275ac624068SGagandeep Singh 		cpu_to_le64(cfg->yellow.min_threshold);
2276ac624068SGagandeep Singh 	ext_params->red_drop_probability = cfg->red.drop_probability;
2277ac624068SGagandeep Singh 	ext_params->red_max_threshold = cpu_to_le64(cfg->red.max_threshold);
2278ac624068SGagandeep Singh 	ext_params->red_min_threshold = cpu_to_le64(cfg->red.min_threshold);
2279ac624068SGagandeep Singh }
2280ac624068SGagandeep Singh 
2281ac624068SGagandeep Singh /**
2282ac624068SGagandeep Singh  * dpni_extract_early_drop() - extract the early drop configuration.
2283ac624068SGagandeep Singh  * @cfg:		Early-drop configuration
2284ac624068SGagandeep Singh  * @early_drop_buf:	Zeroed 256 bytes of memory before mapping it to DMA
2285ac624068SGagandeep Singh  *
2286ac624068SGagandeep Singh  * This function has to be called after dpni_get_rx_tc_early_drop or
2287ac624068SGagandeep Singh  * dpni_get_tx_tc_early_drop
2288ac624068SGagandeep Singh  *
2289ac624068SGagandeep Singh  */
2290ac624068SGagandeep Singh void dpni_extract_early_drop(struct dpni_early_drop_cfg *cfg,
2291ac624068SGagandeep Singh 			     const uint8_t *early_drop_buf)
2292ac624068SGagandeep Singh {
2293ac624068SGagandeep Singh 	const struct dpni_early_drop *ext_params;
2294ac624068SGagandeep Singh 
2295ac624068SGagandeep Singh 	ext_params = (const struct dpni_early_drop *)early_drop_buf;
2296ac624068SGagandeep Singh 
2297ac624068SGagandeep Singh 	cfg->enable = dpni_get_field(ext_params->flags, DROP_ENABLE);
2298ac624068SGagandeep Singh 	cfg->units = dpni_get_field(ext_params->flags, DROP_UNITS);
2299ac624068SGagandeep Singh 	cfg->green.drop_probability = ext_params->green_drop_probability;
2300ac624068SGagandeep Singh 	cfg->green.max_threshold = le64_to_cpu(ext_params->green_max_threshold);
2301ac624068SGagandeep Singh 	cfg->green.min_threshold = le64_to_cpu(ext_params->green_min_threshold);
2302ac624068SGagandeep Singh 	cfg->yellow.drop_probability = ext_params->yellow_drop_probability;
2303ac624068SGagandeep Singh 	cfg->yellow.max_threshold =
2304ac624068SGagandeep Singh 		le64_to_cpu(ext_params->yellow_max_threshold);
2305ac624068SGagandeep Singh 	cfg->yellow.min_threshold =
2306ac624068SGagandeep Singh 		le64_to_cpu(ext_params->yellow_min_threshold);
2307ac624068SGagandeep Singh 	cfg->red.drop_probability = ext_params->red_drop_probability;
2308ac624068SGagandeep Singh 	cfg->red.max_threshold = le64_to_cpu(ext_params->red_max_threshold);
2309ac624068SGagandeep Singh 	cfg->red.min_threshold = le64_to_cpu(ext_params->red_min_threshold);
2310ac624068SGagandeep Singh }
2311ac624068SGagandeep Singh 
2312ac624068SGagandeep Singh /**
2313ac624068SGagandeep Singh  * dpni_set_early_drop() - Set traffic class early-drop configuration
2314ac624068SGagandeep Singh  * @mc_io:	Pointer to MC portal's I/O object
2315ac624068SGagandeep Singh  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
2316ac624068SGagandeep Singh  * @token:	Token of DPNI object
2317ac624068SGagandeep Singh  * @qtype:	Type of queue - only Rx and Tx types are supported
2318f48cd6c6SNipun Gupta  * @param:	Traffic class and channel ID.
2319f48cd6c6SNipun Gupta  *		MSB - channel id; used only for DPNI_QUEUE_TX and DPNI_QUEUE_TX_CONFIRM,
2320f48cd6c6SNipun Gupta  *		ignored for the rest
2321f48cd6c6SNipun Gupta  *		LSB - traffic class
2322f48cd6c6SNipun Gupta  *		Use macro DPNI_BUILD_PARAM() to build correct value.
2323f48cd6c6SNipun Gupta  *		If dpni uses a single channel (uses only channel zero) the parameter can receive
2324f48cd6c6SNipun Gupta  *		traffic class directly.
2325ac624068SGagandeep Singh  * @early_drop_iova:  I/O virtual address of 256 bytes DMA-able memory filled
2326ac624068SGagandeep Singh  *	with the early-drop configuration by calling dpni_prepare_early_drop()
2327ac624068SGagandeep Singh  *
2328ac624068SGagandeep Singh  * warning: Before calling this function, call dpni_prepare_early_drop() to
2329ac624068SGagandeep Singh  *			prepare the early_drop_iova parameter
2330ac624068SGagandeep Singh  *
2331ac624068SGagandeep Singh  * Return:	'0' on Success; error code otherwise.
2332ac624068SGagandeep Singh  */
2333ac624068SGagandeep Singh int dpni_set_early_drop(struct fsl_mc_io *mc_io,
2334ac624068SGagandeep Singh 			uint32_t cmd_flags,
2335ac624068SGagandeep Singh 			uint16_t token,
2336ac624068SGagandeep Singh 			enum dpni_queue_type qtype,
2337f48cd6c6SNipun Gupta 			uint16_t param,
2338ac624068SGagandeep Singh 			uint64_t early_drop_iova)
2339ac624068SGagandeep Singh {
2340ac624068SGagandeep Singh 	struct dpni_cmd_early_drop *cmd_params;
2341ac624068SGagandeep Singh 	struct mc_command cmd = { 0 };
2342ac624068SGagandeep Singh 
2343ac624068SGagandeep Singh 	/* prepare command */
2344ac624068SGagandeep Singh 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_EARLY_DROP,
2345ac624068SGagandeep Singh 					  cmd_flags,
2346ac624068SGagandeep Singh 					  token);
2347ac624068SGagandeep Singh 	cmd_params = (struct dpni_cmd_early_drop *)cmd.params;
2348ac624068SGagandeep Singh 	cmd_params->qtype = qtype;
2349f48cd6c6SNipun Gupta 	cmd_params->tc = (uint8_t)(param & 0xff);
2350f48cd6c6SNipun Gupta 	cmd_params->channel_id = (uint8_t)((param >> 8) & 0xff);
2351ac624068SGagandeep Singh 	cmd_params->early_drop_iova = cpu_to_le64(early_drop_iova);
2352ac624068SGagandeep Singh 
2353ac624068SGagandeep Singh 	/* send command to mc*/
2354ac624068SGagandeep Singh 	return mc_send_command(mc_io, &cmd);
2355ac624068SGagandeep Singh }
2356ac624068SGagandeep Singh 
2357ac624068SGagandeep Singh /**
2358ac624068SGagandeep Singh  * dpni_get_early_drop() - Get Rx traffic class early-drop configuration
2359ac624068SGagandeep Singh  * @mc_io:	Pointer to MC portal's I/O object
2360ac624068SGagandeep Singh  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
2361ac624068SGagandeep Singh  * @token:	Token of DPNI object
2362ac624068SGagandeep Singh  * @qtype:	Type of queue - only Rx and Tx types are supported
2363f48cd6c6SNipun Gupta  * @param:	Traffic class and channel ID.
2364f48cd6c6SNipun Gupta  *		MSB - channel id; used only for DPNI_QUEUE_TX and DPNI_QUEUE_TX_CONFIRM,
2365f48cd6c6SNipun Gupta  *		ignored for the rest
2366f48cd6c6SNipun Gupta  *		LSB - traffic class
2367f48cd6c6SNipun Gupta  *		Use macro DPNI_BUILD_PARAM() to build correct value.
2368f48cd6c6SNipun Gupta  *		If dpni uses a single channel (uses only channel zero) the parameter can receive
2369f48cd6c6SNipun Gupta  *		traffic class directly.
2370ac624068SGagandeep Singh  * @early_drop_iova:  I/O virtual address of 256 bytes DMA-able memory
2371ac624068SGagandeep Singh  *
2372ac624068SGagandeep Singh  * warning: After calling this function, call dpni_extract_early_drop() to
2373ac624068SGagandeep Singh  *	get the early drop configuration
2374ac624068SGagandeep Singh  *
2375ac624068SGagandeep Singh  * Return:	'0' on Success; error code otherwise.
2376ac624068SGagandeep Singh  */
2377ac624068SGagandeep Singh int dpni_get_early_drop(struct fsl_mc_io *mc_io,
2378ac624068SGagandeep Singh 			uint32_t cmd_flags,
2379ac624068SGagandeep Singh 			uint16_t token,
2380ac624068SGagandeep Singh 			enum dpni_queue_type qtype,
2381f48cd6c6SNipun Gupta 			uint16_t param,
2382ac624068SGagandeep Singh 			uint64_t early_drop_iova)
2383ac624068SGagandeep Singh {
2384ac624068SGagandeep Singh 	struct dpni_cmd_early_drop *cmd_params;
2385ac624068SGagandeep Singh 	struct mc_command cmd = { 0 };
2386ac624068SGagandeep Singh 
2387ac624068SGagandeep Singh 	/* prepare command */
2388ac624068SGagandeep Singh 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_EARLY_DROP,
2389ac624068SGagandeep Singh 					  cmd_flags,
2390ac624068SGagandeep Singh 					  token);
2391ac624068SGagandeep Singh 	cmd_params = (struct dpni_cmd_early_drop *)cmd.params;
2392ac624068SGagandeep Singh 	cmd_params->qtype = qtype;
2393f48cd6c6SNipun Gupta 	cmd_params->tc = (uint8_t)(param & 0xff);
2394f48cd6c6SNipun Gupta 	cmd_params->channel_id = (uint8_t)((param >> 8) & 0xff);
2395ac624068SGagandeep Singh 	cmd_params->early_drop_iova = cpu_to_le64(early_drop_iova);
2396ac624068SGagandeep Singh 
2397ac624068SGagandeep Singh 	/* send command to mc*/
2398ac624068SGagandeep Singh 	return mc_send_command(mc_io, &cmd);
2399ac624068SGagandeep Singh }
2400ac624068SGagandeep Singh 
2401ac624068SGagandeep Singh /**
240216bbc98aSShreyansh Jain  * dpni_set_congestion_notification() - Set traffic class congestion
240316bbc98aSShreyansh Jain  *	notification configuration
240416bbc98aSShreyansh Jain  * @mc_io:	Pointer to MC portal's I/O object
240516bbc98aSShreyansh Jain  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
240616bbc98aSShreyansh Jain  * @token:	Token of DPNI object
240716bbc98aSShreyansh Jain  * @qtype:	Type of queue - Rx, Tx and Tx confirm types are supported
240801690f8fSRohit Raj  * @param:	Traffic class and channel. Bits[0-7] contain traaffic class,
240901690f8fSRohit Raj  *		bite[8-15] contains channel id
241016bbc98aSShreyansh Jain  * @cfg:	congestion notification configuration
241116bbc98aSShreyansh Jain  *
241216bbc98aSShreyansh Jain  * Return:	'0' on Success; error code otherwise.
241316bbc98aSShreyansh Jain  */
241416bbc98aSShreyansh Jain int dpni_set_congestion_notification(struct fsl_mc_io *mc_io,
24157ae777d0SHemant Agrawal 				     uint32_t cmd_flags,
24167ae777d0SHemant Agrawal 				     uint16_t token,
24177ae777d0SHemant Agrawal 				     enum dpni_queue_type qtype,
2418f48cd6c6SNipun Gupta 				     uint16_t param,
24197ae777d0SHemant Agrawal 				     const struct dpni_congestion_notification_cfg *cfg)
24207ae777d0SHemant Agrawal {
242116bbc98aSShreyansh Jain 	struct dpni_cmd_set_congestion_notification *cmd_params;
24227ae777d0SHemant Agrawal 	struct mc_command cmd = { 0 };
24237ae777d0SHemant Agrawal 
24247ae777d0SHemant Agrawal 	/* prepare command */
24257ae777d0SHemant Agrawal 	cmd.header = mc_encode_cmd_header(
24267ae777d0SHemant Agrawal 					DPNI_CMDID_SET_CONGESTION_NOTIFICATION,
24277ae777d0SHemant Agrawal 					cmd_flags,
24287ae777d0SHemant Agrawal 					token);
242916bbc98aSShreyansh Jain 	cmd_params = (struct dpni_cmd_set_congestion_notification *)cmd.params;
243016bbc98aSShreyansh Jain 	cmd_params->qtype = qtype;
2431f48cd6c6SNipun Gupta 	cmd_params->tc = (uint8_t)(param & 0xff);
2432f48cd6c6SNipun Gupta 	cmd_params->channel_id = (uint8_t)((param >> 8) & 0xff);
243355984a9bSShreyansh Jain 	cmd_params->congestion_point = cfg->cg_point;
243455984a9bSShreyansh Jain 	cmd_params->cgid = (uint8_t)cfg->cgid;
243516bbc98aSShreyansh Jain 	cmd_params->dest_id = cpu_to_le32(cfg->dest_cfg.dest_id);
243616bbc98aSShreyansh Jain 	cmd_params->notification_mode = cpu_to_le16(cfg->notification_mode);
243716bbc98aSShreyansh Jain 	cmd_params->dest_priority = cfg->dest_cfg.priority;
243816bbc98aSShreyansh Jain 	cmd_params->message_iova = cpu_to_le64(cfg->message_iova);
243916bbc98aSShreyansh Jain 	cmd_params->message_ctx = cpu_to_le64(cfg->message_ctx);
244016bbc98aSShreyansh Jain 	cmd_params->threshold_entry = cpu_to_le32(cfg->threshold_entry);
244116bbc98aSShreyansh Jain 	cmd_params->threshold_exit = cpu_to_le32(cfg->threshold_exit);
244216bbc98aSShreyansh Jain 	dpni_set_field(cmd_params->type_units,
244316bbc98aSShreyansh Jain 		       DEST_TYPE,
244416bbc98aSShreyansh Jain 		       cfg->dest_cfg.dest_type);
244516bbc98aSShreyansh Jain 	dpni_set_field(cmd_params->type_units,
244616bbc98aSShreyansh Jain 		       CONG_UNITS,
244716bbc98aSShreyansh Jain 		       cfg->units);
24487ae777d0SHemant Agrawal 
24497ae777d0SHemant Agrawal 	/* send command to mc*/
24507ae777d0SHemant Agrawal 	return mc_send_command(mc_io, &cmd);
24517ae777d0SHemant Agrawal }
24527ae777d0SHemant Agrawal 
245316bbc98aSShreyansh Jain /**
245416bbc98aSShreyansh Jain  * dpni_get_congestion_notification() - Get traffic class congestion
245516bbc98aSShreyansh Jain  *	notification configuration
245616bbc98aSShreyansh Jain  * @mc_io:	Pointer to MC portal's I/O object
245716bbc98aSShreyansh Jain  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
245816bbc98aSShreyansh Jain  * @token:	Token of DPNI object
245916bbc98aSShreyansh Jain  * @qtype:	Type of queue - Rx, Tx and Tx confirm types are supported
2460*591200efSGagandeep Singh  * @tc_id:	Traffic class selection (0-7)
246116bbc98aSShreyansh Jain  * @cfg:	congestion notification configuration
246216bbc98aSShreyansh Jain  *
246316bbc98aSShreyansh Jain  * Return:	'0' on Success; error code otherwise.
246416bbc98aSShreyansh Jain  */
24657ae777d0SHemant Agrawal int dpni_get_congestion_notification(struct fsl_mc_io *mc_io,
24667ae777d0SHemant Agrawal 				     uint32_t cmd_flags,
24677ae777d0SHemant Agrawal 				     uint16_t token,
24687ae777d0SHemant Agrawal 				     enum dpni_queue_type qtype,
2469f48cd6c6SNipun Gupta 				     uint16_t param,
24707ae777d0SHemant Agrawal 				     struct dpni_congestion_notification_cfg *cfg)
24717ae777d0SHemant Agrawal {
247216bbc98aSShreyansh Jain 	struct dpni_rsp_get_congestion_notification *rsp_params;
247316bbc98aSShreyansh Jain 	struct dpni_cmd_get_congestion_notification *cmd_params;
24747ae777d0SHemant Agrawal 	struct mc_command cmd = { 0 };
24757ae777d0SHemant Agrawal 	int err;
24767ae777d0SHemant Agrawal 
24777ae777d0SHemant Agrawal 	/* prepare command */
24787ae777d0SHemant Agrawal 	cmd.header = mc_encode_cmd_header(
24797ae777d0SHemant Agrawal 					DPNI_CMDID_GET_CONGESTION_NOTIFICATION,
24807ae777d0SHemant Agrawal 					cmd_flags,
24817ae777d0SHemant Agrawal 					token);
248216bbc98aSShreyansh Jain 	cmd_params = (struct dpni_cmd_get_congestion_notification *)cmd.params;
248316bbc98aSShreyansh Jain 	cmd_params->qtype = qtype;
2484f48cd6c6SNipun Gupta 	cmd_params->tc = (uint8_t)(param & 0xff);
2485f48cd6c6SNipun Gupta 	cmd_params->channel_id = (uint8_t)((param >> 8) & 0xff);
248655984a9bSShreyansh Jain 	cmd_params->congestion_point = cfg->cg_point;
248755984a9bSShreyansh Jain 	cmd_params->cgid = cfg->cgid;
24887ae777d0SHemant Agrawal 
24897ae777d0SHemant Agrawal 	/* send command to mc*/
24907ae777d0SHemant Agrawal 	err = mc_send_command(mc_io, &cmd);
24917ae777d0SHemant Agrawal 	if (err)
24927ae777d0SHemant Agrawal 		return err;
24937ae777d0SHemant Agrawal 
249416bbc98aSShreyansh Jain 	rsp_params = (struct dpni_rsp_get_congestion_notification *)cmd.params;
249516bbc98aSShreyansh Jain 	cfg->units = dpni_get_field(rsp_params->type_units, CONG_UNITS);
249616bbc98aSShreyansh Jain 	cfg->threshold_entry = le32_to_cpu(rsp_params->threshold_entry);
249716bbc98aSShreyansh Jain 	cfg->threshold_exit = le32_to_cpu(rsp_params->threshold_exit);
249816bbc98aSShreyansh Jain 	cfg->message_ctx = le64_to_cpu(rsp_params->message_ctx);
249916bbc98aSShreyansh Jain 	cfg->message_iova = le64_to_cpu(rsp_params->message_iova);
250016bbc98aSShreyansh Jain 	cfg->notification_mode = le16_to_cpu(rsp_params->notification_mode);
250116bbc98aSShreyansh Jain 	cfg->dest_cfg.dest_id = le32_to_cpu(rsp_params->dest_id);
250216bbc98aSShreyansh Jain 	cfg->dest_cfg.priority = rsp_params->dest_priority;
250316bbc98aSShreyansh Jain 	cfg->dest_cfg.dest_type = dpni_get_field(rsp_params->type_units,
250416bbc98aSShreyansh Jain 						 DEST_TYPE);
25057ae777d0SHemant Agrawal 
25067ae777d0SHemant Agrawal 	return 0;
25077ae777d0SHemant Agrawal }
25087ae777d0SHemant Agrawal 
250916bbc98aSShreyansh Jain /**
251016bbc98aSShreyansh Jain  * dpni_get_api_version() - Get Data Path Network Interface API version
251116bbc98aSShreyansh Jain  * @mc_io:  Pointer to MC portal's I/O object
251216bbc98aSShreyansh Jain  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
251316bbc98aSShreyansh Jain  * @major_ver:	Major version of data path network interface API
251416bbc98aSShreyansh Jain  * @minor_ver:	Minor version of data path network interface API
251516bbc98aSShreyansh Jain  *
251616bbc98aSShreyansh Jain  * Return:  '0' on Success; Error code otherwise.
251716bbc98aSShreyansh Jain  */
2518e6b82573SHemant Agrawal int dpni_get_api_version(struct fsl_mc_io *mc_io,
2519e6b82573SHemant Agrawal 			 uint32_t cmd_flags,
2520e6b82573SHemant Agrawal 			 uint16_t *major_ver,
2521e6b82573SHemant Agrawal 			 uint16_t *minor_ver)
2522e6b82573SHemant Agrawal {
252316bbc98aSShreyansh Jain 	struct dpni_rsp_get_api_version *rsp_params;
2524e6b82573SHemant Agrawal 	struct mc_command cmd = { 0 };
2525e6b82573SHemant Agrawal 	int err;
2526e6b82573SHemant Agrawal 
2527e6b82573SHemant Agrawal 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_API_VERSION,
2528e6b82573SHemant Agrawal 					cmd_flags,
2529e6b82573SHemant Agrawal 					0);
2530e6b82573SHemant Agrawal 
2531e6b82573SHemant Agrawal 	err = mc_send_command(mc_io, &cmd);
2532e6b82573SHemant Agrawal 	if (err)
2533e6b82573SHemant Agrawal 		return err;
2534e6b82573SHemant Agrawal 
253516bbc98aSShreyansh Jain 	rsp_params = (struct dpni_rsp_get_api_version *)cmd.params;
253616bbc98aSShreyansh Jain 	*major_ver = le16_to_cpu(rsp_params->major);
253716bbc98aSShreyansh Jain 	*minor_ver = le16_to_cpu(rsp_params->minor);
2538e6b82573SHemant Agrawal 
2539e6b82573SHemant Agrawal 	return 0;
2540e6b82573SHemant Agrawal }
2541e6b82573SHemant Agrawal 
254216bbc98aSShreyansh Jain /**
254316bbc98aSShreyansh Jain  * dpni_set_queue() - Set queue parameters
254416bbc98aSShreyansh Jain  * @mc_io:	Pointer to MC portal's I/O object
254516bbc98aSShreyansh Jain  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
254616bbc98aSShreyansh Jain  * @token:	Token of DPNI object
254716bbc98aSShreyansh Jain  * @qtype:	Type of queue - all queue types are supported, although
254816bbc98aSShreyansh Jain  *		the command is ignored for Tx
254916bbc98aSShreyansh Jain  * @tc:		Traffic class, in range 0 to NUM_TCS - 1
255016bbc98aSShreyansh Jain  * @index:	Selects the specific queue out of the set allocated for the
255116bbc98aSShreyansh Jain  *		same TC. Value must be in range 0 to NUM_QUEUES - 1
255216bbc98aSShreyansh Jain  * @options:	A combination of DPNI_QUEUE_OPT_ values that control what
255316bbc98aSShreyansh Jain  *		configuration options are set on the queue
255416bbc98aSShreyansh Jain  * @queue:	Queue structure
255516bbc98aSShreyansh Jain  *
255616bbc98aSShreyansh Jain  * Return:	'0' on Success; Error code otherwise.
255716bbc98aSShreyansh Jain  */
2558e6b82573SHemant Agrawal int dpni_set_queue(struct fsl_mc_io *mc_io,
2559e6b82573SHemant Agrawal 		   uint32_t cmd_flags,
2560e6b82573SHemant Agrawal 		   uint16_t token,
2561e6b82573SHemant Agrawal 		   enum dpni_queue_type qtype,
2562f48cd6c6SNipun Gupta 		   uint16_t param,
2563e6b82573SHemant Agrawal 		   uint8_t index,
2564e6b82573SHemant Agrawal 		   uint8_t options,
2565e6b82573SHemant Agrawal 		   const struct dpni_queue *queue)
2566e6b82573SHemant Agrawal {
2567e6b82573SHemant Agrawal 	struct mc_command cmd = { 0 };
256816bbc98aSShreyansh Jain 	struct dpni_cmd_set_queue *cmd_params;
2569e6b82573SHemant Agrawal 
2570e6b82573SHemant Agrawal 	/* prepare command */
2571e6b82573SHemant Agrawal 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_QUEUE,
2572e6b82573SHemant Agrawal 					  cmd_flags,
2573e6b82573SHemant Agrawal 					  token);
257416bbc98aSShreyansh Jain 	cmd_params = (struct dpni_cmd_set_queue *)cmd.params;
257516bbc98aSShreyansh Jain 	cmd_params->qtype = qtype;
2576f48cd6c6SNipun Gupta 	cmd_params->tc = (uint8_t)(param & 0xff);
2577f48cd6c6SNipun Gupta 	cmd_params->channel_id = (uint8_t)((param >> 8) & 0xff);
257816bbc98aSShreyansh Jain 	cmd_params->index = index;
257916bbc98aSShreyansh Jain 	cmd_params->options = options;
258016bbc98aSShreyansh Jain 	cmd_params->dest_id = cpu_to_le32(queue->destination.id);
258116bbc98aSShreyansh Jain 	cmd_params->dest_prio = queue->destination.priority;
258216bbc98aSShreyansh Jain 	dpni_set_field(cmd_params->flags, DEST_TYPE, queue->destination.type);
258316bbc98aSShreyansh Jain 	dpni_set_field(cmd_params->flags, STASH_CTRL, queue->flc.stash_control);
258416bbc98aSShreyansh Jain 	dpni_set_field(cmd_params->flags, HOLD_ACTIVE,
258516bbc98aSShreyansh Jain 		       queue->destination.hold_active);
258616bbc98aSShreyansh Jain 	cmd_params->flc = cpu_to_le64(queue->flc.value);
258716bbc98aSShreyansh Jain 	cmd_params->user_context = cpu_to_le64(queue->user_context);
258855984a9bSShreyansh Jain 	cmd_params->cgid = queue->cgid;
2589e6b82573SHemant Agrawal 
2590e6b82573SHemant Agrawal 	/* send command to mc */
2591e6b82573SHemant Agrawal 	return mc_send_command(mc_io, &cmd);
2592e6b82573SHemant Agrawal }
2593e6b82573SHemant Agrawal 
259416bbc98aSShreyansh Jain /**
259516bbc98aSShreyansh Jain  * dpni_get_queue() - Get queue parameters
259616bbc98aSShreyansh Jain  * @mc_io:	Pointer to MC portal's I/O object
259716bbc98aSShreyansh Jain  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
259816bbc98aSShreyansh Jain  * @token:	Token of DPNI object
259916bbc98aSShreyansh Jain  * @qtype:	Type of queue - all queue types are supported
2600f48cd6c6SNipun Gupta  * @param:	Traffic class and channel ID.
2601f48cd6c6SNipun Gupta  *		MSB - channel id; used only for DPNI_QUEUE_TX and DPNI_QUEUE_TX_CONFIRM,
2602f48cd6c6SNipun Gupta  *		ignored for the rest
2603f48cd6c6SNipun Gupta  *		LSB - traffic class
2604f48cd6c6SNipun Gupta  *		Use macro DPNI_BUILD_PARAM() to build correct value.
2605f48cd6c6SNipun Gupta  *		If dpni uses a single channel (uses only channel zero) the parameter can receive
2606f48cd6c6SNipun Gupta  *		traffic class directly.
260716bbc98aSShreyansh Jain  * @index:	Selects the specific queue out of the set allocated for the
260816bbc98aSShreyansh Jain  *		same TC. Value must be in range 0 to NUM_QUEUES - 1
260916bbc98aSShreyansh Jain  * @queue:	Queue configuration structure
261016bbc98aSShreyansh Jain  * @qid:	Queue identification
261116bbc98aSShreyansh Jain  *
261216bbc98aSShreyansh Jain  * Return:	'0' on Success; Error code otherwise.
261316bbc98aSShreyansh Jain  */
2614e6b82573SHemant Agrawal int dpni_get_queue(struct fsl_mc_io *mc_io,
2615e6b82573SHemant Agrawal 		   uint32_t cmd_flags,
2616e6b82573SHemant Agrawal 		   uint16_t token,
2617e6b82573SHemant Agrawal 		   enum dpni_queue_type qtype,
2618f48cd6c6SNipun Gupta 		   uint16_t param,
2619e6b82573SHemant Agrawal 		   uint8_t index,
2620e6b82573SHemant Agrawal 		   struct dpni_queue *queue,
2621e6b82573SHemant Agrawal 		   struct dpni_queue_id *qid)
2622e6b82573SHemant Agrawal {
2623e6b82573SHemant Agrawal 	struct mc_command cmd = { 0 };
262416bbc98aSShreyansh Jain 	struct dpni_cmd_get_queue *cmd_params;
262516bbc98aSShreyansh Jain 	struct dpni_rsp_get_queue *rsp_params;
2626e6b82573SHemant Agrawal 	int err;
2627e6b82573SHemant Agrawal 
2628e6b82573SHemant Agrawal 	/* prepare command */
2629e6b82573SHemant Agrawal 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_QUEUE,
2630e6b82573SHemant Agrawal 					  cmd_flags,
2631e6b82573SHemant Agrawal 					  token);
263216bbc98aSShreyansh Jain 	cmd_params = (struct dpni_cmd_get_queue *)cmd.params;
263316bbc98aSShreyansh Jain 	cmd_params->qtype = qtype;
2634f48cd6c6SNipun Gupta 	cmd_params->tc = (uint8_t)(param & 0xff);
263516bbc98aSShreyansh Jain 	cmd_params->index = index;
2636f48cd6c6SNipun Gupta 	cmd_params->channel_id = (uint8_t)((param >> 8) & 0xff);
2637e6b82573SHemant Agrawal 
2638e6b82573SHemant Agrawal 	/* send command to mc */
2639e6b82573SHemant Agrawal 	err = mc_send_command(mc_io, &cmd);
2640e6b82573SHemant Agrawal 	if (err)
2641e6b82573SHemant Agrawal 		return err;
2642e6b82573SHemant Agrawal 
2643e6b82573SHemant Agrawal 	/* retrieve response parameters */
264416bbc98aSShreyansh Jain 	rsp_params = (struct dpni_rsp_get_queue *)cmd.params;
264516bbc98aSShreyansh Jain 	queue->destination.id = le32_to_cpu(rsp_params->dest_id);
264616bbc98aSShreyansh Jain 	queue->destination.priority = rsp_params->dest_prio;
264716bbc98aSShreyansh Jain 	queue->destination.type = dpni_get_field(rsp_params->flags,
264816bbc98aSShreyansh Jain 						     DEST_TYPE);
264916bbc98aSShreyansh Jain 	queue->flc.stash_control = dpni_get_field(rsp_params->flags,
265016bbc98aSShreyansh Jain 						  STASH_CTRL);
265116bbc98aSShreyansh Jain 	queue->destination.hold_active = dpni_get_field(rsp_params->flags,
265216bbc98aSShreyansh Jain 							HOLD_ACTIVE);
265316bbc98aSShreyansh Jain 	queue->flc.value = le64_to_cpu(rsp_params->flc);
265416bbc98aSShreyansh Jain 	queue->user_context = le64_to_cpu(rsp_params->user_context);
265516bbc98aSShreyansh Jain 	qid->fqid = le32_to_cpu(rsp_params->fqid);
265616bbc98aSShreyansh Jain 	qid->qdbin = le16_to_cpu(rsp_params->qdbin);
265755984a9bSShreyansh Jain 	if (dpni_get_field(rsp_params->flags, CGID_VALID))
265855984a9bSShreyansh Jain 		queue->cgid = rsp_params->cgid;
265955984a9bSShreyansh Jain 	else
266055984a9bSShreyansh Jain 		queue->cgid = -1;
2661e6b82573SHemant Agrawal 
2662e6b82573SHemant Agrawal 	return 0;
2663e6b82573SHemant Agrawal }
2664e6b82573SHemant Agrawal 
266516bbc98aSShreyansh Jain /**
266616bbc98aSShreyansh Jain  * dpni_get_statistics() - Get DPNI statistics
266716bbc98aSShreyansh Jain  * @mc_io:	Pointer to MC portal's I/O object
266816bbc98aSShreyansh Jain  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
266916bbc98aSShreyansh Jain  * @token:	Token of DPNI object
267016bbc98aSShreyansh Jain  * @page:	Selects the statistics page to retrieve, see
267196f7bfe8SSachin Saxena  *		DPNI_GET_STATISTICS output. Pages are numbered 0 to 6.
267216bbc98aSShreyansh Jain  * @param:  Custom parameter for some pages used to select
267316bbc98aSShreyansh Jain  *		 a certain statistic source, for example the TC.
2674f48cd6c6SNipun Gupta  *		 - page_0: not used
2675f48cd6c6SNipun Gupta  *		 - page_1: not used
2676f48cd6c6SNipun Gupta  *		 - page_2: not used
2677f48cd6c6SNipun Gupta  *		 - page_3: high_byte - channel_id, low_byte - traffic class
2678f48cd6c6SNipun Gupta  *		 - page_4: high_byte - queue_index have meaning only if dpni is
2679f48cd6c6SNipun Gupta  *		 created using option DPNI_OPT_CUSTOM_CG, low_byte - traffic class
2680f48cd6c6SNipun Gupta  *		 - page_5: not used
2681f48cd6c6SNipun Gupta  *		 - page_6: not used
268216bbc98aSShreyansh Jain  * @stat:	Structure containing the statistics
268316bbc98aSShreyansh Jain  *
268416bbc98aSShreyansh Jain  * Return:	'0' on Success; Error code otherwise.
268516bbc98aSShreyansh Jain  */
2686e6b82573SHemant Agrawal int dpni_get_statistics(struct fsl_mc_io *mc_io,
2687e6b82573SHemant Agrawal 			uint32_t cmd_flags,
2688e6b82573SHemant Agrawal 			uint16_t token,
2689e6b82573SHemant Agrawal 			uint8_t page,
269055984a9bSShreyansh Jain 			uint16_t param,
2691e6b82573SHemant Agrawal 			union dpni_statistics *stat)
2692e6b82573SHemant Agrawal {
2693e6b82573SHemant Agrawal 	struct mc_command cmd = { 0 };
269416bbc98aSShreyansh Jain 	struct dpni_cmd_get_statistics *cmd_params;
269516bbc98aSShreyansh Jain 	struct dpni_rsp_get_statistics *rsp_params;
269616bbc98aSShreyansh Jain 	int i, err;
2697e6b82573SHemant Agrawal 
2698e6b82573SHemant Agrawal 	/* prepare command */
2699e6b82573SHemant Agrawal 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_STATISTICS,
2700e6b82573SHemant Agrawal 					  cmd_flags,
2701e6b82573SHemant Agrawal 					  token);
270216bbc98aSShreyansh Jain 	cmd_params = (struct dpni_cmd_get_statistics *)cmd.params;
270316bbc98aSShreyansh Jain 	cmd_params->page_number = page;
270416bbc98aSShreyansh Jain 	cmd_params->param = param;
2705e6b82573SHemant Agrawal 
2706e6b82573SHemant Agrawal 	/* send command to mc */
2707e6b82573SHemant Agrawal 	err = mc_send_command(mc_io, &cmd);
2708e6b82573SHemant Agrawal 	if (err)
2709e6b82573SHemant Agrawal 		return err;
2710e6b82573SHemant Agrawal 
2711e6b82573SHemant Agrawal 	/* retrieve response parameters */
271216bbc98aSShreyansh Jain 	rsp_params = (struct dpni_rsp_get_statistics *)cmd.params;
271316bbc98aSShreyansh Jain 	for (i = 0; i < DPNI_STATISTICS_CNT; i++)
271416bbc98aSShreyansh Jain 		stat->raw.counter[i] = le64_to_cpu(rsp_params->counter[i]);
2715e6b82573SHemant Agrawal 
2716e6b82573SHemant Agrawal 	return 0;
2717e6b82573SHemant Agrawal }
2718e6b82573SHemant Agrawal 
271916bbc98aSShreyansh Jain /**
272016bbc98aSShreyansh Jain  * dpni_reset_statistics() - Clears DPNI statistics
272116bbc98aSShreyansh Jain  * @mc_io:		Pointer to MC portal's I/O object
272216bbc98aSShreyansh Jain  * @cmd_flags:		Command flags; one or more of 'MC_CMD_FLAG_'
272316bbc98aSShreyansh Jain  * @token:		Token of DPNI object
272416bbc98aSShreyansh Jain  *
272516bbc98aSShreyansh Jain  * Return:  '0' on Success; Error code otherwise.
272616bbc98aSShreyansh Jain  */
2727e6b82573SHemant Agrawal int dpni_reset_statistics(struct fsl_mc_io *mc_io,
2728e6b82573SHemant Agrawal 			  uint32_t cmd_flags,
2729e6b82573SHemant Agrawal 		     uint16_t token)
2730e6b82573SHemant Agrawal {
2731e6b82573SHemant Agrawal 	struct mc_command cmd = { 0 };
2732e6b82573SHemant Agrawal 
2733e6b82573SHemant Agrawal 	/* prepare command */
2734e6b82573SHemant Agrawal 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_RESET_STATISTICS,
2735e6b82573SHemant Agrawal 					  cmd_flags,
2736e6b82573SHemant Agrawal 					  token);
2737e6b82573SHemant Agrawal 
2738e6b82573SHemant Agrawal 	/* send command to mc*/
2739e6b82573SHemant Agrawal 	return mc_send_command(mc_io, &cmd);
2740e6b82573SHemant Agrawal }
274123d6a87eSHemant Agrawal 
274216bbc98aSShreyansh Jain /**
27432cb2abf3SHemant Agrawal  * dpni_set_taildrop() - Set taildrop per congestion group
274416bbc98aSShreyansh Jain  *
274516bbc98aSShreyansh Jain  * Setting a per-TC taildrop (cg_point = DPNI_CP_GROUP) will reset any current
274616bbc98aSShreyansh Jain  * congestion notification or early drop (WRED) configuration previously applied
274716bbc98aSShreyansh Jain  * to the same TC.
274816bbc98aSShreyansh Jain  *
274916bbc98aSShreyansh Jain  * @mc_io:	Pointer to MC portal's I/O object
275016bbc98aSShreyansh Jain  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
275116bbc98aSShreyansh Jain  * @token:	Token of DPNI object
27522cb2abf3SHemant Agrawal  * @cg_point:	Congestion group identifier DPNI_CP_QUEUE is only supported in
275316bbc98aSShreyansh Jain  *		combination with DPNI_QUEUE_RX.
275416bbc98aSShreyansh Jain  * @q_type:	Queue type, can be DPNI_QUEUE_RX or DPNI_QUEUE_TX.
275516bbc98aSShreyansh Jain  * @tc:		Traffic class to apply this taildrop to
27562cb2abf3SHemant Agrawal  * @index/cgid:	Index of the queue if the DPNI supports multiple queues for
275716bbc98aSShreyansh Jain  *		traffic distribution.
27582cb2abf3SHemant Agrawal  *		If CONGESTION_POINT is DPNI_CP_CONGESTION_GROUP then it
27592cb2abf3SHemant Agrawal  *		represent the cgid of the congestion point
276016bbc98aSShreyansh Jain  * @taildrop:	Taildrop structure
276116bbc98aSShreyansh Jain  *
276216bbc98aSShreyansh Jain  * Return:	'0' on Success; Error code otherwise.
276316bbc98aSShreyansh Jain  */
276423d6a87eSHemant Agrawal int dpni_set_taildrop(struct fsl_mc_io *mc_io,
276523d6a87eSHemant Agrawal 		      uint32_t cmd_flags,
276623d6a87eSHemant Agrawal 		      uint16_t token,
276723d6a87eSHemant Agrawal 		      enum dpni_congestion_point cg_point,
276816bbc98aSShreyansh Jain 		      enum dpni_queue_type qtype,
2769f48cd6c6SNipun Gupta 		      uint16_t param,
277016bbc98aSShreyansh Jain 		      uint8_t index,
277123d6a87eSHemant Agrawal 		      struct dpni_taildrop *taildrop)
277223d6a87eSHemant Agrawal {
277323d6a87eSHemant Agrawal 	struct mc_command cmd = { 0 };
277416bbc98aSShreyansh Jain 	struct dpni_cmd_set_taildrop *cmd_params;
277523d6a87eSHemant Agrawal 
277623d6a87eSHemant Agrawal 	/* prepare command */
277723d6a87eSHemant Agrawal 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_TAILDROP,
277823d6a87eSHemant Agrawal 					  cmd_flags,
277923d6a87eSHemant Agrawal 					  token);
278016bbc98aSShreyansh Jain 	cmd_params = (struct dpni_cmd_set_taildrop *)cmd.params;
278116bbc98aSShreyansh Jain 	cmd_params->congestion_point = cg_point;
278216bbc98aSShreyansh Jain 	cmd_params->qtype = qtype;
2783f48cd6c6SNipun Gupta 	cmd_params->tc = (uint8_t)(param & 0xff);
2784f48cd6c6SNipun Gupta 	cmd_params->channel_id = (uint8_t)((param >> 8) & 0xff);
278516bbc98aSShreyansh Jain 	cmd_params->index = index;
278616bbc98aSShreyansh Jain 	cmd_params->units = taildrop->units;
278716bbc98aSShreyansh Jain 	cmd_params->threshold = cpu_to_le32(taildrop->threshold);
278816bbc98aSShreyansh Jain 	dpni_set_field(cmd_params->enable_oal_lo, ENABLE, taildrop->enable);
278916bbc98aSShreyansh Jain 	dpni_set_field(cmd_params->enable_oal_lo, OAL_LO, taildrop->oal);
279016bbc98aSShreyansh Jain 	dpni_set_field(cmd_params->oal_hi,
279116bbc98aSShreyansh Jain 		       OAL_HI,
279216bbc98aSShreyansh Jain 		       taildrop->oal >> DPNI_OAL_LO_SIZE);
279323d6a87eSHemant Agrawal 
279423d6a87eSHemant Agrawal 	/* send command to mc */
279523d6a87eSHemant Agrawal 	return mc_send_command(mc_io, &cmd);
279623d6a87eSHemant Agrawal }
279723d6a87eSHemant Agrawal 
279816bbc98aSShreyansh Jain /**
279916bbc98aSShreyansh Jain  * dpni_get_taildrop() - Get taildrop information
280016bbc98aSShreyansh Jain  * @mc_io:	Pointer to MC portal's I/O object
280116bbc98aSShreyansh Jain  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
280216bbc98aSShreyansh Jain  * @token:	Token of DPNI object
280316bbc98aSShreyansh Jain  * @cg_point:	Congestion point
280416bbc98aSShreyansh Jain  * @q_type:	Queue type on which the taildrop is configured.
280516bbc98aSShreyansh Jain  *		Only Rx queues are supported for now
280616bbc98aSShreyansh Jain  * @tc:		Traffic class to apply this taildrop to
280716bbc98aSShreyansh Jain  * @q_index:	Index of the queue if the DPNI supports multiple queues for
280816bbc98aSShreyansh Jain  *		traffic distribution. Ignored if CONGESTION_POINT is not 0.
280916bbc98aSShreyansh Jain  * @taildrop:	Taildrop structure
281016bbc98aSShreyansh Jain  *
281116bbc98aSShreyansh Jain  * Return:	'0' on Success; Error code otherwise.
281216bbc98aSShreyansh Jain  */
281323d6a87eSHemant Agrawal int dpni_get_taildrop(struct fsl_mc_io *mc_io,
281423d6a87eSHemant Agrawal 		      uint32_t cmd_flags,
281523d6a87eSHemant Agrawal 		      uint16_t token,
281623d6a87eSHemant Agrawal 		      enum dpni_congestion_point cg_point,
281716bbc98aSShreyansh Jain 		      enum dpni_queue_type qtype,
281823d6a87eSHemant Agrawal 		      uint8_t tc,
281916bbc98aSShreyansh Jain 		      uint8_t index,
282023d6a87eSHemant Agrawal 		      struct dpni_taildrop *taildrop)
282123d6a87eSHemant Agrawal {
282223d6a87eSHemant Agrawal 	struct mc_command cmd = { 0 };
282316bbc98aSShreyansh Jain 	struct dpni_cmd_get_taildrop *cmd_params;
282416bbc98aSShreyansh Jain 	struct dpni_rsp_get_taildrop *rsp_params;
282516bbc98aSShreyansh Jain 	uint8_t oal_lo, oal_hi;
282623d6a87eSHemant Agrawal 	int err;
282723d6a87eSHemant Agrawal 
282823d6a87eSHemant Agrawal 	/* prepare command */
282923d6a87eSHemant Agrawal 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_TAILDROP,
283023d6a87eSHemant Agrawal 					  cmd_flags,
283123d6a87eSHemant Agrawal 					  token);
283216bbc98aSShreyansh Jain 	cmd_params = (struct dpni_cmd_get_taildrop *)cmd.params;
283316bbc98aSShreyansh Jain 	cmd_params->congestion_point = cg_point;
283416bbc98aSShreyansh Jain 	cmd_params->qtype = qtype;
283516bbc98aSShreyansh Jain 	cmd_params->tc = tc;
283616bbc98aSShreyansh Jain 	cmd_params->index = index;
283723d6a87eSHemant Agrawal 
283823d6a87eSHemant Agrawal 	/* send command to mc */
283923d6a87eSHemant Agrawal 	err = mc_send_command(mc_io, &cmd);
284023d6a87eSHemant Agrawal 	if (err)
284123d6a87eSHemant Agrawal 		return err;
284223d6a87eSHemant Agrawal 
284323d6a87eSHemant Agrawal 	/* retrieve response parameters */
284416bbc98aSShreyansh Jain 	rsp_params = (struct dpni_rsp_get_taildrop *)cmd.params;
284516bbc98aSShreyansh Jain 	taildrop->enable = dpni_get_field(rsp_params->enable_oal_lo, ENABLE);
284616bbc98aSShreyansh Jain 	taildrop->units = rsp_params->units;
284716bbc98aSShreyansh Jain 	taildrop->threshold = le32_to_cpu(rsp_params->threshold);
284816bbc98aSShreyansh Jain 	oal_lo = dpni_get_field(rsp_params->enable_oal_lo, OAL_LO);
284916bbc98aSShreyansh Jain 	oal_hi = dpni_get_field(rsp_params->oal_hi, OAL_HI);
285016bbc98aSShreyansh Jain 	taildrop->oal = oal_hi << DPNI_OAL_LO_SIZE | oal_lo;
285116bbc98aSShreyansh Jain 
285216bbc98aSShreyansh Jain 	/* Fill the first 4 bits, 'oal' is a 2's complement value of 12 bits */
285316bbc98aSShreyansh Jain 	if (taildrop->oal >= 0x0800)
285416bbc98aSShreyansh Jain 		taildrop->oal |= 0xF000;
285523d6a87eSHemant Agrawal 
285623d6a87eSHemant Agrawal 	return 0;
285723d6a87eSHemant Agrawal }
285825fea082SHemant Agrawal 
285925fea082SHemant Agrawal /**
286025fea082SHemant Agrawal  * dpni_set_opr() - Set Order Restoration configuration.
286125fea082SHemant Agrawal  * @mc_io:	Pointer to MC portal's I/O object
286225fea082SHemant Agrawal  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
286325fea082SHemant Agrawal  * @token:	Token of DPNI object
286425fea082SHemant Agrawal  * @tc:		Traffic class, in range 0 to NUM_TCS - 1
286525fea082SHemant Agrawal  * @index:	Selects the specific queue out of the set allocated
286625fea082SHemant Agrawal  *			for the same TC. Value must be in range 0 to
286725fea082SHemant Agrawal  *			NUM_QUEUES - 1
286825fea082SHemant Agrawal  * @options:	Configuration mode options
286925fea082SHemant Agrawal  *			can be OPR_OPT_CREATE or OPR_OPT_RETIRE
287025fea082SHemant Agrawal  * @cfg:	Configuration options for the OPR
287125fea082SHemant Agrawal  *
287225fea082SHemant Agrawal  * Return:	'0' on Success; Error code otherwise.
287325fea082SHemant Agrawal  */
287425fea082SHemant Agrawal int dpni_set_opr(struct fsl_mc_io *mc_io,
287525fea082SHemant Agrawal 		 uint32_t cmd_flags,
287625fea082SHemant Agrawal 		 uint16_t token,
287725fea082SHemant Agrawal 		 uint8_t tc,
287825fea082SHemant Agrawal 		 uint8_t index,
287925fea082SHemant Agrawal 		 uint8_t options,
28802cb2abf3SHemant Agrawal 		 struct opr_cfg *cfg,
28812cb2abf3SHemant Agrawal 		 uint8_t opr_id)
288225fea082SHemant Agrawal {
288325fea082SHemant Agrawal 	struct dpni_cmd_set_opr *cmd_params;
288425fea082SHemant Agrawal 	struct mc_command cmd = { 0 };
288525fea082SHemant Agrawal 
288625fea082SHemant Agrawal 	/* prepare command */
288725fea082SHemant Agrawal 	cmd.header = mc_encode_cmd_header(
288825fea082SHemant Agrawal 			DPNI_CMDID_SET_OPR,
288925fea082SHemant Agrawal 			cmd_flags,
289025fea082SHemant Agrawal 			token);
289125fea082SHemant Agrawal 	cmd_params = (struct dpni_cmd_set_opr *)cmd.params;
289225fea082SHemant Agrawal 	cmd_params->tc_id = tc;
289325fea082SHemant Agrawal 	cmd_params->index = index;
289425fea082SHemant Agrawal 	cmd_params->options = options;
28952cb2abf3SHemant Agrawal 	cmd_params->opr_id = opr_id;
289625fea082SHemant Agrawal 	cmd_params->oloe = cfg->oloe;
289725fea082SHemant Agrawal 	cmd_params->oeane = cfg->oeane;
289825fea082SHemant Agrawal 	cmd_params->olws = cfg->olws;
289925fea082SHemant Agrawal 	cmd_params->oa = cfg->oa;
290025fea082SHemant Agrawal 	cmd_params->oprrws = cfg->oprrws;
290125fea082SHemant Agrawal 
290225fea082SHemant Agrawal 	/* send command to mc*/
290325fea082SHemant Agrawal 	return mc_send_command(mc_io, &cmd);
290425fea082SHemant Agrawal }
290525fea082SHemant Agrawal 
290625fea082SHemant Agrawal /**
290725fea082SHemant Agrawal  * dpni_get_opr() - Retrieve Order Restoration config and query.
290825fea082SHemant Agrawal  * @mc_io:	Pointer to MC portal's I/O object
290925fea082SHemant Agrawal  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
291025fea082SHemant Agrawal  * @token:	Token of DPNI object
291125fea082SHemant Agrawal  * @tc:		Traffic class, in range 0 to NUM_TCS - 1
291225fea082SHemant Agrawal  * @index:	Selects the specific queue out of the set allocated
291325fea082SHemant Agrawal  *			for the same TC. Value must be in range 0 to
291425fea082SHemant Agrawal  *			NUM_QUEUES - 1
291525fea082SHemant Agrawal  * @cfg:	Returned OPR configuration
291625fea082SHemant Agrawal  * @qry:	Returned OPR query
291725fea082SHemant Agrawal  *
291825fea082SHemant Agrawal  * Return:	'0' on Success; Error code otherwise.
291925fea082SHemant Agrawal  */
292025fea082SHemant Agrawal int dpni_get_opr(struct fsl_mc_io *mc_io,
292125fea082SHemant Agrawal 		 uint32_t cmd_flags,
292225fea082SHemant Agrawal 		 uint16_t token,
292325fea082SHemant Agrawal 		 uint8_t tc,
292425fea082SHemant Agrawal 		 uint8_t index,
292525fea082SHemant Agrawal 		 struct opr_cfg *cfg,
29262cb2abf3SHemant Agrawal 		 struct opr_qry *qry,
29272cb2abf3SHemant Agrawal 		 uint8_t flags,
29282cb2abf3SHemant Agrawal 		 uint8_t opr_id)
292925fea082SHemant Agrawal {
293025fea082SHemant Agrawal 	struct dpni_rsp_get_opr *rsp_params;
293125fea082SHemant Agrawal 	struct dpni_cmd_get_opr *cmd_params;
293225fea082SHemant Agrawal 	struct mc_command cmd = { 0 };
293325fea082SHemant Agrawal 	int err;
293425fea082SHemant Agrawal 
293525fea082SHemant Agrawal 	/* prepare command */
293625fea082SHemant Agrawal 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_OPR,
293725fea082SHemant Agrawal 					  cmd_flags,
293825fea082SHemant Agrawal 					  token);
293925fea082SHemant Agrawal 	cmd_params = (struct dpni_cmd_get_opr *)cmd.params;
294025fea082SHemant Agrawal 	cmd_params->index = index;
294125fea082SHemant Agrawal 	cmd_params->tc_id = tc;
29422cb2abf3SHemant Agrawal 	cmd_params->flags = flags;
29432cb2abf3SHemant Agrawal 	cmd_params->opr_id = opr_id;
294425fea082SHemant Agrawal 
294525fea082SHemant Agrawal 	/* send command to mc*/
294625fea082SHemant Agrawal 	err = mc_send_command(mc_io, &cmd);
294725fea082SHemant Agrawal 	if (err)
294825fea082SHemant Agrawal 		return err;
294925fea082SHemant Agrawal 
295025fea082SHemant Agrawal 	/* retrieve response parameters */
295125fea082SHemant Agrawal 	rsp_params = (struct dpni_rsp_get_opr *)cmd.params;
295225fea082SHemant Agrawal 	cfg->oloe = rsp_params->oloe;
295325fea082SHemant Agrawal 	cfg->oeane = rsp_params->oeane;
295425fea082SHemant Agrawal 	cfg->olws = rsp_params->olws;
295525fea082SHemant Agrawal 	cfg->oa = rsp_params->oa;
295625fea082SHemant Agrawal 	cfg->oprrws = rsp_params->oprrws;
295725fea082SHemant Agrawal 	qry->rip = dpni_get_field(rsp_params->flags, RIP);
295825fea082SHemant Agrawal 	qry->enable = dpni_get_field(rsp_params->flags, OPR_ENABLE);
295925fea082SHemant Agrawal 	qry->nesn = le16_to_cpu(rsp_params->nesn);
296025fea082SHemant Agrawal 	qry->ndsn = le16_to_cpu(rsp_params->ndsn);
296125fea082SHemant Agrawal 	qry->ea_tseq = le16_to_cpu(rsp_params->ea_tseq);
296225fea082SHemant Agrawal 	qry->tseq_nlis = dpni_get_field(rsp_params->tseq_nlis, TSEQ_NLIS);
296325fea082SHemant Agrawal 	qry->ea_hseq = le16_to_cpu(rsp_params->ea_hseq);
296425fea082SHemant Agrawal 	qry->hseq_nlis = dpni_get_field(rsp_params->hseq_nlis, HSEQ_NLIS);
296525fea082SHemant Agrawal 	qry->ea_hptr = le16_to_cpu(rsp_params->ea_hptr);
296625fea082SHemant Agrawal 	qry->ea_tptr = le16_to_cpu(rsp_params->ea_tptr);
296725fea082SHemant Agrawal 	qry->opr_vid = le16_to_cpu(rsp_params->opr_vid);
296825fea082SHemant Agrawal 	qry->opr_id = le16_to_cpu(rsp_params->opr_id);
296925fea082SHemant Agrawal 
297025fea082SHemant Agrawal 	return 0;
297125fea082SHemant Agrawal }
2972e59b75ffSHemant Agrawal 
297372100f0dSGagandeep Singh int dpni_load_sw_sequence(struct fsl_mc_io *mc_io,
297472100f0dSGagandeep Singh 	      uint32_t cmd_flags,
297572100f0dSGagandeep Singh 	      uint16_t token,
297672100f0dSGagandeep Singh 		  struct dpni_load_ss_cfg *cfg)
297772100f0dSGagandeep Singh {
297872100f0dSGagandeep Singh 	struct dpni_load_sw_sequence *cmd_params;
297972100f0dSGagandeep Singh 	struct mc_command cmd = { 0 };
298072100f0dSGagandeep Singh 
298172100f0dSGagandeep Singh 	/* prepare command */
298272100f0dSGagandeep Singh 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_LOAD_SW_SEQUENCE,
298372100f0dSGagandeep Singh 					  cmd_flags,
298472100f0dSGagandeep Singh 					  token);
298572100f0dSGagandeep Singh 	cmd_params = (struct dpni_load_sw_sequence *)cmd.params;
298672100f0dSGagandeep Singh 	cmd_params->dest = cfg->dest;
298772100f0dSGagandeep Singh 	cmd_params->ss_offset = cpu_to_le16(cfg->ss_offset);
298872100f0dSGagandeep Singh 	cmd_params->ss_size = cpu_to_le16(cfg->ss_size);
298972100f0dSGagandeep Singh 	cmd_params->ss_iova = cpu_to_le64(cfg->ss_iova);
299072100f0dSGagandeep Singh 
299172100f0dSGagandeep Singh 	/* send command to mc*/
299272100f0dSGagandeep Singh 	return mc_send_command(mc_io, &cmd);
299372100f0dSGagandeep Singh }
299472100f0dSGagandeep Singh 
299572100f0dSGagandeep Singh int dpni_enable_sw_sequence(struct fsl_mc_io *mc_io,
299672100f0dSGagandeep Singh 	      uint32_t cmd_flags,
299772100f0dSGagandeep Singh 	      uint16_t token,
299872100f0dSGagandeep Singh 		  struct dpni_enable_ss_cfg *cfg)
299972100f0dSGagandeep Singh {
300072100f0dSGagandeep Singh 	struct dpni_enable_sw_sequence *cmd_params;
300172100f0dSGagandeep Singh 	struct mc_command cmd = { 0 };
300272100f0dSGagandeep Singh 
300372100f0dSGagandeep Singh 	/* prepare command */
300472100f0dSGagandeep Singh 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_ENABLE_SW_SEQUENCE,
300572100f0dSGagandeep Singh 					  cmd_flags,
300672100f0dSGagandeep Singh 					  token);
300772100f0dSGagandeep Singh 	cmd_params = (struct dpni_enable_sw_sequence *)cmd.params;
300872100f0dSGagandeep Singh 	cmd_params->dest = cfg->dest;
300972100f0dSGagandeep Singh 	cmd_params->set_start = cfg->set_start;
301072100f0dSGagandeep Singh 	cmd_params->hxs = cpu_to_le16(cfg->hxs);
301172100f0dSGagandeep Singh 	cmd_params->ss_offset = cpu_to_le16(cfg->ss_offset);
301272100f0dSGagandeep Singh 	cmd_params->param_offset = cfg->param_offset;
301372100f0dSGagandeep Singh 	cmd_params->param_size = cfg->param_size;
301472100f0dSGagandeep Singh 	cmd_params->param_iova = cpu_to_le64(cfg->param_iova);
301572100f0dSGagandeep Singh 
301672100f0dSGagandeep Singh 	/* send command to mc*/
301772100f0dSGagandeep Singh 	return mc_send_command(mc_io, &cmd);
301872100f0dSGagandeep Singh }
301972100f0dSGagandeep Singh 
302072100f0dSGagandeep Singh /**
302172100f0dSGagandeep Singh  * dpni_get_sw_sequence_layout() - Get the soft sequence layout
302272100f0dSGagandeep Singh  * @mc_io:	Pointer to MC portal's I/O object
302372100f0dSGagandeep Singh  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
302472100f0dSGagandeep Singh  * @token:	Token of DPNI object
302572100f0dSGagandeep Singh  * @src:	Source of the layout (WRIOP Rx or Tx)
302672100f0dSGagandeep Singh  * @ss_layout_iova:  I/O virtual address of 264 bytes DMA-able memory
302772100f0dSGagandeep Singh  *
302872100f0dSGagandeep Singh  * warning: After calling this function, call dpni_extract_sw_sequence_layout()
302972100f0dSGagandeep Singh  *		to get the layout.
303072100f0dSGagandeep Singh  *
303172100f0dSGagandeep Singh  * Return:	'0' on Success; error code otherwise.
303272100f0dSGagandeep Singh  */
303372100f0dSGagandeep Singh int dpni_get_sw_sequence_layout(struct fsl_mc_io *mc_io,
303472100f0dSGagandeep Singh 	      uint32_t cmd_flags,
303572100f0dSGagandeep Singh 	      uint16_t token,
303672100f0dSGagandeep Singh 		  enum dpni_soft_sequence_dest src,
303772100f0dSGagandeep Singh 		  uint64_t ss_layout_iova)
303872100f0dSGagandeep Singh {
303972100f0dSGagandeep Singh 	struct dpni_get_sw_sequence_layout *cmd_params;
304072100f0dSGagandeep Singh 	struct mc_command cmd = { 0 };
304172100f0dSGagandeep Singh 
304272100f0dSGagandeep Singh 	/* prepare command */
304372100f0dSGagandeep Singh 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_SW_SEQUENCE_LAYOUT,
304472100f0dSGagandeep Singh 					  cmd_flags,
304572100f0dSGagandeep Singh 					  token);
304672100f0dSGagandeep Singh 
304772100f0dSGagandeep Singh 	cmd_params = (struct dpni_get_sw_sequence_layout *)cmd.params;
304872100f0dSGagandeep Singh 	cmd_params->src = src;
304972100f0dSGagandeep Singh 	cmd_params->layout_iova = cpu_to_le64(ss_layout_iova);
305072100f0dSGagandeep Singh 
305172100f0dSGagandeep Singh 	/* send command to mc*/
305272100f0dSGagandeep Singh 	return mc_send_command(mc_io, &cmd);
305372100f0dSGagandeep Singh }
305472100f0dSGagandeep Singh 
305572100f0dSGagandeep Singh /**
305672100f0dSGagandeep Singh  * dpni_extract_sw_sequence_layout() - extract the software sequence layout
305772100f0dSGagandeep Singh  * @layout:		software sequence layout
305872100f0dSGagandeep Singh  * @sw_sequence_layout_buf:	Zeroed 264 bytes of memory before mapping it
305972100f0dSGagandeep Singh  *				to DMA
306072100f0dSGagandeep Singh  *
306172100f0dSGagandeep Singh  * This function has to be called after dpni_get_sw_sequence_layout
306272100f0dSGagandeep Singh  *
306372100f0dSGagandeep Singh  */
306472100f0dSGagandeep Singh void dpni_extract_sw_sequence_layout(struct dpni_sw_sequence_layout *layout,
306572100f0dSGagandeep Singh 			     const uint8_t *sw_sequence_layout_buf)
306672100f0dSGagandeep Singh {
306772100f0dSGagandeep Singh 	const struct dpni_sw_sequence_layout_entry *ext_params;
306872100f0dSGagandeep Singh 	int i;
306972100f0dSGagandeep Singh 	uint16_t ss_size, ss_offset;
307072100f0dSGagandeep Singh 
307172100f0dSGagandeep Singh 	ext_params = (const struct dpni_sw_sequence_layout_entry *)
307272100f0dSGagandeep Singh 						sw_sequence_layout_buf;
307372100f0dSGagandeep Singh 
307472100f0dSGagandeep Singh 	for (i = 0; i < DPNI_SW_SEQUENCE_LAYOUT_SIZE; i++) {
307572100f0dSGagandeep Singh 		ss_offset = le16_to_cpu(ext_params[i].ss_offset);
307672100f0dSGagandeep Singh 		ss_size = le16_to_cpu(ext_params[i].ss_size);
307772100f0dSGagandeep Singh 
307872100f0dSGagandeep Singh 		if (ss_offset == 0 && ss_size == 0) {
307972100f0dSGagandeep Singh 			layout->num_ss = i;
308072100f0dSGagandeep Singh 			return;
308172100f0dSGagandeep Singh 		}
308272100f0dSGagandeep Singh 
308372100f0dSGagandeep Singh 		layout->ss[i].ss_offset = ss_offset;
308472100f0dSGagandeep Singh 		layout->ss[i].ss_size = ss_size;
308572100f0dSGagandeep Singh 		layout->ss[i].param_offset = ext_params[i].param_offset;
308672100f0dSGagandeep Singh 		layout->ss[i].param_size = ext_params[i].param_size;
308772100f0dSGagandeep Singh 	}
308872100f0dSGagandeep Singh }
3089e59b75ffSHemant Agrawal /**
3090fe2b986aSSunil Kumar Kori  * dpni_set_rx_fs_dist() - Set Rx traffic class FS distribution
3091fe2b986aSSunil Kumar Kori  * @mc_io:	Pointer to MC portal's I/O object
3092fe2b986aSSunil Kumar Kori  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
3093fe2b986aSSunil Kumar Kori  * @token:	Token of DPNI object
3094fe2b986aSSunil Kumar Kori  * @cfg: Distribution configuration
3095fe2b986aSSunil Kumar Kori  * If the FS is already enabled with a previous call the classification
3096fe2b986aSSunil Kumar Kori  *		key will be changed but all the table rules are kept. If the
3097fe2b986aSSunil Kumar Kori  *		existing rules do not match the key the results will not be
30982cb2abf3SHemant Agrawal  *		predictable. It is the user responsibility to keep keyintegrity.
3099fe2b986aSSunil Kumar Kori  * If cfg.enable is set to 1 the command will create a flow steering table
3100fe2b986aSSunil Kumar Kori  *		and will classify packets according to this table. The packets
3101fe2b986aSSunil Kumar Kori  *		that miss all the table rules will be classified according to
3102fe2b986aSSunil Kumar Kori  *		settings made in dpni_set_rx_hash_dist()
3103fe2b986aSSunil Kumar Kori  * If cfg.enable is set to 0 the command will clear flow steering table. The
3104fe2b986aSSunil Kumar Kori  *		packets will be classified according to settings made in
3105fe2b986aSSunil Kumar Kori  *		dpni_set_rx_hash_dist()
3106fe2b986aSSunil Kumar Kori  */
3107fe2b986aSSunil Kumar Kori int dpni_set_rx_fs_dist(struct fsl_mc_io *mc_io, uint32_t cmd_flags,
3108fe2b986aSSunil Kumar Kori 		uint16_t token, const struct dpni_rx_dist_cfg *cfg)
3109fe2b986aSSunil Kumar Kori {
3110fe2b986aSSunil Kumar Kori 	struct dpni_cmd_set_rx_fs_dist *cmd_params;
3111fe2b986aSSunil Kumar Kori 	struct mc_command cmd = { 0 };
3112fe2b986aSSunil Kumar Kori 
3113fe2b986aSSunil Kumar Kori 	/* prepare command */
3114fe2b986aSSunil Kumar Kori 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_RX_FS_DIST,
3115fe2b986aSSunil Kumar Kori 					  cmd_flags,
3116fe2b986aSSunil Kumar Kori 					  token);
3117fe2b986aSSunil Kumar Kori 	cmd_params = (struct dpni_cmd_set_rx_fs_dist *)cmd.params;
3118fe2b986aSSunil Kumar Kori 	cmd_params->dist_size	= cpu_to_le16(cfg->dist_size);
3119fe2b986aSSunil Kumar Kori 	dpni_set_field(cmd_params->enable, RX_FS_DIST_ENABLE, cfg->enable);
3120fe2b986aSSunil Kumar Kori 	cmd_params->tc			= cfg->tc;
3121fe2b986aSSunil Kumar Kori 	cmd_params->miss_flow_id = cpu_to_le16(cfg->fs_miss_flow_id);
3122fe2b986aSSunil Kumar Kori 	cmd_params->key_cfg_iova = cpu_to_le64(cfg->key_cfg_iova);
3123fe2b986aSSunil Kumar Kori 
3124fe2b986aSSunil Kumar Kori 	/* send command to mc*/
3125fe2b986aSSunil Kumar Kori 	return mc_send_command(mc_io, &cmd);
3126fe2b986aSSunil Kumar Kori }
3127fe2b986aSSunil Kumar Kori 
3128fe2b986aSSunil Kumar Kori /**
3129fe2b986aSSunil Kumar Kori  * dpni_set_rx_hash_dist() - Set Rx traffic class HASH distribution
3130fe2b986aSSunil Kumar Kori  * @mc_io:	Pointer to MC portal's I/O object
3131fe2b986aSSunil Kumar Kori  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
3132fe2b986aSSunil Kumar Kori  * @token:	Token of DPNI object
3133fe2b986aSSunil Kumar Kori  * @cfg: Distribution configuration
3134fe2b986aSSunil Kumar Kori  * If cfg.enable is set to 1 the packets will be classified using a hash
31352cb2abf3SHemant Agrawal  *	function based on the key received in cfg.key_cfg_iova parameter.
3136fe2b986aSSunil Kumar Kori  * If cfg.enable is set to 0 the packets will be sent to the queue configured in
3137fe2b986aSSunil Kumar Kori  *	dpni_set_rx_dist_default_queue() call
3138fe2b986aSSunil Kumar Kori  */
3139fe2b986aSSunil Kumar Kori int dpni_set_rx_hash_dist(struct fsl_mc_io *mc_io, uint32_t cmd_flags,
3140fe2b986aSSunil Kumar Kori 		uint16_t token, const struct dpni_rx_dist_cfg *cfg)
3141fe2b986aSSunil Kumar Kori {
3142fe2b986aSSunil Kumar Kori 	struct dpni_cmd_set_rx_hash_dist *cmd_params;
3143fe2b986aSSunil Kumar Kori 	struct mc_command cmd = { 0 };
3144fe2b986aSSunil Kumar Kori 
3145fe2b986aSSunil Kumar Kori 	/* prepare command */
3146fe2b986aSSunil Kumar Kori 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_RX_HASH_DIST,
3147fe2b986aSSunil Kumar Kori 					  cmd_flags,
3148fe2b986aSSunil Kumar Kori 					  token);
3149fe2b986aSSunil Kumar Kori 	cmd_params = (struct dpni_cmd_set_rx_hash_dist *)cmd.params;
3150fe2b986aSSunil Kumar Kori 	cmd_params->dist_size	= cpu_to_le16(cfg->dist_size);
3151fe2b986aSSunil Kumar Kori 	dpni_set_field(cmd_params->enable, RX_FS_DIST_ENABLE, cfg->enable);
3152fe2b986aSSunil Kumar Kori 	cmd_params->tc_id		= cfg->tc;
3153fe2b986aSSunil Kumar Kori 	cmd_params->key_cfg_iova = cpu_to_le64(cfg->key_cfg_iova);
3154fe2b986aSSunil Kumar Kori 
3155fe2b986aSSunil Kumar Kori 	/* send command to mc*/
3156fe2b986aSSunil Kumar Kori 	return mc_send_command(mc_io, &cmd);
3157fe2b986aSSunil Kumar Kori }
3158fe2b986aSSunil Kumar Kori 
3159fe2b986aSSunil Kumar Kori /**
31602cb2abf3SHemant Agrawal  * dpni_add_custom_tpid() - Configures a distinct Ethertype value (or TPID
31612cb2abf3SHemant Agrawal  *		value) to indicate VLAN tag in adition to the common TPID values
31622cb2abf3SHemant Agrawal  *		0x81000 and 0x88A8
3163e59b75ffSHemant Agrawal  * @mc_io:	Pointer to MC portal's I/O object
3164e59b75ffSHemant Agrawal  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
3165e59b75ffSHemant Agrawal  * @token:	Token of DPNI object
3166e59b75ffSHemant Agrawal  * @tpid:	New value for TPID
3167e59b75ffSHemant Agrawal  *
3168e59b75ffSHemant Agrawal  * Only two custom values are accepted. If the function is called for the third
3169e59b75ffSHemant Agrawal  * time it will return error.
31702cb2abf3SHemant Agrawal  * To replace an existing value use dpni_remove_custom_tpid() to remove a
31712cb2abf3SHemant Agrawal  * previous TPID and after that use again the function.
3172e59b75ffSHemant Agrawal  *
3173e59b75ffSHemant Agrawal  * Return:	'0' on Success; Error code otherwise.
3174e59b75ffSHemant Agrawal  */
3175e59b75ffSHemant Agrawal int dpni_add_custom_tpid(struct fsl_mc_io *mc_io, uint32_t cmd_flags,
3176e59b75ffSHemant Agrawal 		uint16_t token, uint16_t tpid)
3177e59b75ffSHemant Agrawal {
3178e59b75ffSHemant Agrawal 	struct dpni_cmd_add_custom_tpid *cmd_params;
3179e59b75ffSHemant Agrawal 	struct mc_command cmd = { 0 };
3180e59b75ffSHemant Agrawal 
3181e59b75ffSHemant Agrawal 	/* prepare command */
3182e59b75ffSHemant Agrawal 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_ADD_CUSTOM_TPID,
3183e59b75ffSHemant Agrawal 					  cmd_flags,
3184e59b75ffSHemant Agrawal 					  token);
3185e59b75ffSHemant Agrawal 	cmd_params = (struct dpni_cmd_add_custom_tpid *)cmd.params;
3186e59b75ffSHemant Agrawal 	cmd_params->tpid = cpu_to_le16(tpid);
3187e59b75ffSHemant Agrawal 
3188e59b75ffSHemant Agrawal 	/* send command to mc*/
3189e59b75ffSHemant Agrawal 	return mc_send_command(mc_io, &cmd);
3190e59b75ffSHemant Agrawal }
3191e59b75ffSHemant Agrawal 
3192e59b75ffSHemant Agrawal /**
3193e59b75ffSHemant Agrawal  * dpni_remove_custom_tpid() - Removes a distinct Ethertype value added
3194e59b75ffSHemant Agrawal  * previously with dpni_add_custom_tpid()
3195e59b75ffSHemant Agrawal  * @mc_io:	Pointer to MC portal's I/O object
3196e59b75ffSHemant Agrawal  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
3197e59b75ffSHemant Agrawal  * @token:	Token of DPNI object
3198e59b75ffSHemant Agrawal  * @tpid:	New value for TPID
3199e59b75ffSHemant Agrawal  *
3200e59b75ffSHemant Agrawal  * Use this function when a TPID value added with dpni_add_custom_tpid() needs
3201e59b75ffSHemant Agrawal  * to be replaced.
3202e59b75ffSHemant Agrawal  *
3203e59b75ffSHemant Agrawal  * Return:	'0' on Success; Error code otherwise.
3204e59b75ffSHemant Agrawal  */
3205e59b75ffSHemant Agrawal int dpni_remove_custom_tpid(struct fsl_mc_io *mc_io, uint32_t cmd_flags,
3206e59b75ffSHemant Agrawal 		uint16_t token, uint16_t tpid)
3207e59b75ffSHemant Agrawal {
3208e59b75ffSHemant Agrawal 	struct dpni_cmd_remove_custom_tpid *cmd_params;
3209e59b75ffSHemant Agrawal 	struct mc_command cmd = { 0 };
3210e59b75ffSHemant Agrawal 
3211e59b75ffSHemant Agrawal 	/* prepare command */
3212e59b75ffSHemant Agrawal 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_REMOVE_CUSTOM_TPID,
3213e59b75ffSHemant Agrawal 					  cmd_flags,
3214e59b75ffSHemant Agrawal 					  token);
3215e59b75ffSHemant Agrawal 	cmd_params = (struct dpni_cmd_remove_custom_tpid *)cmd.params;
3216e59b75ffSHemant Agrawal 	cmd_params->tpid = cpu_to_le16(tpid);
3217e59b75ffSHemant Agrawal 
3218e59b75ffSHemant Agrawal 	/* send command to mc*/
3219e59b75ffSHemant Agrawal 	return mc_send_command(mc_io, &cmd);
3220e59b75ffSHemant Agrawal }
3221e59b75ffSHemant Agrawal 
3222e59b75ffSHemant Agrawal /**
32232cb2abf3SHemant Agrawal  * dpni_get_custom_tpid() - Returns custom TPID (vlan tags) values configured to
32242cb2abf3SHemant Agrawal  * detect 802.1q frames
3225e59b75ffSHemant Agrawal  * @mc_io:	Pointer to MC portal's I/O object
3226e59b75ffSHemant Agrawal  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
3227e59b75ffSHemant Agrawal  * @token:	Token of DPNI object
3228e59b75ffSHemant Agrawal  * @tpid:	TPID values. Only nonzero members of the structure are valid.
3229e59b75ffSHemant Agrawal  *
3230e59b75ffSHemant Agrawal  * Return:	'0' on Success; Error code otherwise.
3231e59b75ffSHemant Agrawal  */
3232e59b75ffSHemant Agrawal int dpni_get_custom_tpid(struct fsl_mc_io *mc_io, uint32_t cmd_flags,
3233e59b75ffSHemant Agrawal 		uint16_t token, struct dpni_custom_tpid_cfg *tpid)
3234e59b75ffSHemant Agrawal {
3235e59b75ffSHemant Agrawal 	struct dpni_rsp_get_custom_tpid *rsp_params;
3236e59b75ffSHemant Agrawal 	struct mc_command cmd = { 0 };
3237e59b75ffSHemant Agrawal 	int err;
3238e59b75ffSHemant Agrawal 
3239e59b75ffSHemant Agrawal 	/* prepare command */
3240e59b75ffSHemant Agrawal 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_CUSTOM_TPID,
3241e59b75ffSHemant Agrawal 					  cmd_flags,
3242e59b75ffSHemant Agrawal 					  token);
3243e59b75ffSHemant Agrawal 
3244e59b75ffSHemant Agrawal 	/* send command to mc*/
3245e59b75ffSHemant Agrawal 	err = mc_send_command(mc_io, &cmd);
3246e59b75ffSHemant Agrawal 	if (err)
3247e59b75ffSHemant Agrawal 		return err;
3248e59b75ffSHemant Agrawal 
3249e59b75ffSHemant Agrawal 	/* read command response */
3250e59b75ffSHemant Agrawal 	rsp_params = (struct dpni_rsp_get_custom_tpid *)cmd.params;
3251e59b75ffSHemant Agrawal 	tpid->tpid1 = le16_to_cpu(rsp_params->tpid1);
3252e59b75ffSHemant Agrawal 	tpid->tpid2 = le16_to_cpu(rsp_params->tpid2);
3253e59b75ffSHemant Agrawal 
3254e59b75ffSHemant Agrawal 	return err;
3255e59b75ffSHemant Agrawal }
3256a712067dSSunil Kumar Kori 
3257f023d059SJun Yang /**
3258f023d059SJun Yang  * dpni_set_port_cfg() - performs configurations at physical port connected on
3259f023d059SJun Yang  *		this dpni. The command have effect only if dpni is connected to
3260f023d059SJun Yang  *		another dpni object
3261f023d059SJun Yang  * @mc_io:	Pointer to MC portal's I/O object
3262f023d059SJun Yang  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
3263f023d059SJun Yang  * @token:	Token of DPNI object
3264f023d059SJun Yang  * @flags:	Valid fields from port_cfg structure
3265f023d059SJun Yang  * @port_cfg: Configuration data; one or more of DPNI_PORT_CFG_
3266f023d059SJun Yang  * The command can be called only when dpni is connected to a dpmac object. If
3267f023d059SJun Yang  * the dpni is unconnected or the endpoint is not a dpni it will return error.
3268f023d059SJun Yang  * If dpmac endpoint is disconnected the settings will be lost
3269f023d059SJun Yang  */
3270f023d059SJun Yang int dpni_set_port_cfg(struct fsl_mc_io *mc_io, uint32_t cmd_flags,
3271f023d059SJun Yang 		uint16_t token, uint32_t flags, struct dpni_port_cfg *port_cfg)
3272f023d059SJun Yang {
3273f023d059SJun Yang 	struct dpni_cmd_set_port_cfg *cmd_params;
3274f023d059SJun Yang 	struct mc_command cmd = { 0 };
3275f023d059SJun Yang 
3276f023d059SJun Yang 	/* prepare command */
3277f023d059SJun Yang 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_PORT_CFG,
3278f023d059SJun Yang 			cmd_flags, token);
3279f023d059SJun Yang 
3280f023d059SJun Yang 	cmd_params = (struct dpni_cmd_set_port_cfg *)cmd.params;
3281f023d059SJun Yang 	cmd_params->flags = cpu_to_le32(flags);
3282*591200efSGagandeep Singh 	dpni_set_field(cmd_params->bit_params, PORT_LOOPBACK_EN, !!port_cfg->loopback_en);
3283*591200efSGagandeep Singh 
3284*591200efSGagandeep Singh 	/* send command to MC */
3285*591200efSGagandeep Singh 	return mc_send_command(mc_io, &cmd);
3286*591200efSGagandeep Singh }
3287*591200efSGagandeep Singh 
3288*591200efSGagandeep Singh /**
3289*591200efSGagandeep Singh  * dpni_get_single_step_cfg() - return current configuration for single step PTP
3290*591200efSGagandeep Singh  * @mc_io: Pointer to MC portal's I/O object
3291*591200efSGagandeep Singh  * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
3292*591200efSGagandeep Singh  * @token: Token of DPNI object
3293*591200efSGagandeep Singh  * @ptp_cfg: ptp single step configuration
3294*591200efSGagandeep Singh  *
3295*591200efSGagandeep Singh  * Return:	'0' on Success; Error code otherwise.
3296*591200efSGagandeep Singh  *
3297*591200efSGagandeep Singh  */
3298*591200efSGagandeep Singh int dpni_get_single_step_cfg(struct fsl_mc_io *mc_io, uint32_t cmd_flags, uint16_t token,
3299*591200efSGagandeep Singh 		struct dpni_single_step_cfg *ptp_cfg)
3300*591200efSGagandeep Singh {
3301*591200efSGagandeep Singh 	struct dpni_rsp_single_step_cfg *rsp_params;
3302*591200efSGagandeep Singh 	struct mc_command cmd = { 0 };
3303*591200efSGagandeep Singh 	int err;
3304*591200efSGagandeep Singh 
3305*591200efSGagandeep Singh 	/* prepare command */
3306*591200efSGagandeep Singh 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_SINGLE_STEP_CFG,
3307*591200efSGagandeep Singh 						cmd_flags,
3308*591200efSGagandeep Singh 						token);
3309*591200efSGagandeep Singh 	/* send command to mc*/
3310*591200efSGagandeep Singh 	err =  mc_send_command(mc_io, &cmd);
3311*591200efSGagandeep Singh 	if (err)
3312*591200efSGagandeep Singh 		return err;
3313*591200efSGagandeep Singh 
3314*591200efSGagandeep Singh 	/* read command response */
3315*591200efSGagandeep Singh 	rsp_params = (struct dpni_rsp_single_step_cfg *)cmd.params;
3316*591200efSGagandeep Singh 	ptp_cfg->offset = le16_to_cpu(rsp_params->offset);
3317*591200efSGagandeep Singh 	ptp_cfg->en = dpni_get_field(rsp_params->flags, PTP_ENABLE);
3318*591200efSGagandeep Singh 	ptp_cfg->ch_update = dpni_get_field(rsp_params->flags, PTP_CH_UPDATE);
3319*591200efSGagandeep Singh 	ptp_cfg->peer_delay = le32_to_cpu(rsp_params->peer_delay);
3320*591200efSGagandeep Singh 	ptp_cfg->ptp_onestep_reg_base =
3321*591200efSGagandeep Singh 				  le32_to_cpu(rsp_params->ptp_onestep_reg_base);
3322*591200efSGagandeep Singh 
3323*591200efSGagandeep Singh 	return err;
3324*591200efSGagandeep Singh }
3325*591200efSGagandeep Singh 
3326*591200efSGagandeep Singh /**
3327*591200efSGagandeep Singh  * dpni_get_port_cfg() - return configuration from physical port. The command has effect only if
3328*591200efSGagandeep Singh  *			dpni is connected to a mac object
3329*591200efSGagandeep Singh  * @mc_io:	Pointer to MC portal's I/O object
3330*591200efSGagandeep Singh  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
3331*591200efSGagandeep Singh  * @token:	Token of DPNI object
3332*591200efSGagandeep Singh  * @port_cfg: Configuration data
3333*591200efSGagandeep Singh  * The command can be called only when dpni is connected to a dpmac object.
3334*591200efSGagandeep Singh  * If the dpni is unconnected or the endpoint is not a dpni it will return error;
3335*591200efSGagandeep Singh  */
3336*591200efSGagandeep Singh int dpni_get_port_cfg(struct fsl_mc_io *mc_io, uint32_t cmd_flags, uint16_t token,
3337*591200efSGagandeep Singh 		struct dpni_port_cfg *port_cfg)
3338*591200efSGagandeep Singh {
3339*591200efSGagandeep Singh 	struct dpni_rsp_get_port_cfg *rsp_params;
3340*591200efSGagandeep Singh 	struct mc_command cmd = { 0 };
3341*591200efSGagandeep Singh 	int err;
3342*591200efSGagandeep Singh 
3343*591200efSGagandeep Singh 	/* prepare command */
3344*591200efSGagandeep Singh 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_PORT_CFG,
3345*591200efSGagandeep Singh 			cmd_flags, token);
3346*591200efSGagandeep Singh 
3347*591200efSGagandeep Singh 	/* send command to MC */
3348*591200efSGagandeep Singh 	err = mc_send_command(mc_io, &cmd);
3349*591200efSGagandeep Singh 	if (err)
3350*591200efSGagandeep Singh 		return err;
3351*591200efSGagandeep Singh 
3352*591200efSGagandeep Singh 	/* read command response */
3353*591200efSGagandeep Singh 	rsp_params = (struct dpni_rsp_get_port_cfg *)cmd.params;
3354*591200efSGagandeep Singh 	port_cfg->loopback_en = dpni_get_field(rsp_params->bit_params, PORT_LOOPBACK_EN);
3355*591200efSGagandeep Singh 
3356*591200efSGagandeep Singh 	return 0;
3357*591200efSGagandeep Singh }
3358*591200efSGagandeep Singh 
3359*591200efSGagandeep Singh /**
3360*591200efSGagandeep Singh  * dpni_set_single_step_cfg() - enable/disable and configure single step PTP
3361*591200efSGagandeep Singh  * @mc_io: Pointer to MC portal's I/O object
3362*591200efSGagandeep Singh  * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
3363*591200efSGagandeep Singh  * @token: Token of DPNI object
3364*591200efSGagandeep Singh  * @ptp_cfg: ptp single step configuration
3365*591200efSGagandeep Singh  *
3366*591200efSGagandeep Singh  * Return:	'0' on Success; Error code otherwise.
3367*591200efSGagandeep Singh  *
3368*591200efSGagandeep Singh  * The function has effect only when dpni object is connected to a dpmac object. If the
3369*591200efSGagandeep Singh  * dpni is not connected to a dpmac the configuration will be stored inside and applied
3370*591200efSGagandeep Singh  * when connection is made.
3371*591200efSGagandeep Singh  */
3372*591200efSGagandeep Singh int dpni_set_single_step_cfg(struct fsl_mc_io *mc_io, uint32_t cmd_flags, uint16_t token,
3373*591200efSGagandeep Singh 		struct dpni_single_step_cfg *ptp_cfg)
3374*591200efSGagandeep Singh {
3375*591200efSGagandeep Singh 	struct dpni_cmd_single_step_cfg *cmd_params;
3376*591200efSGagandeep Singh 	struct mc_command cmd = { 0 };
3377*591200efSGagandeep Singh 
3378*591200efSGagandeep Singh 	/* prepare command */
3379*591200efSGagandeep Singh 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_SINGLE_STEP_CFG,
3380*591200efSGagandeep Singh 						cmd_flags,
3381*591200efSGagandeep Singh 						token);
3382*591200efSGagandeep Singh 	cmd_params = (struct dpni_cmd_single_step_cfg *)cmd.params;
3383*591200efSGagandeep Singh 	cmd_params->offset = cpu_to_le16(ptp_cfg->offset);
3384*591200efSGagandeep Singh 	cmd_params->peer_delay = cpu_to_le32(ptp_cfg->peer_delay);
3385*591200efSGagandeep Singh 	dpni_set_field(cmd_params->flags, PTP_ENABLE, !!ptp_cfg->en);
3386*591200efSGagandeep Singh 	dpni_set_field(cmd_params->flags, PTP_CH_UPDATE, !!ptp_cfg->ch_update);
3387*591200efSGagandeep Singh 
3388*591200efSGagandeep Singh 	/* send command to mc*/
3389*591200efSGagandeep Singh 	return mc_send_command(mc_io, &cmd);
3390*591200efSGagandeep Singh }
3391*591200efSGagandeep Singh 
3392*591200efSGagandeep Singh /**
3393*591200efSGagandeep Singh  * dpni_dump_table() - Dump the content of table_type table into memory.
3394*591200efSGagandeep Singh  * @mc_io: Pointer to MC portal's I/O object
3395*591200efSGagandeep Singh  * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
3396*591200efSGagandeep Singh  * @token: Token of DPSW object
3397*591200efSGagandeep Singh  * @table_type: The type of the table to dump
3398*591200efSGagandeep Singh  * @table_index: The index of the table to dump in case of more than one table
3399*591200efSGagandeep Singh  * @iova_addr: The snapshot will be stored in this variable as an header of struct dump_table_header
3400*591200efSGagandeep Singh  *             followed by an array of struct dump_table_entry
3401*591200efSGagandeep Singh  * @iova_size: Memory size allocated for iova_addr
3402*591200efSGagandeep Singh  * @num_entries: Number of entries written in iova_addr
3403*591200efSGagandeep Singh  *
3404*591200efSGagandeep Singh  * Return: Completion status. '0' on Success; Error code otherwise.
3405*591200efSGagandeep Singh  *
3406*591200efSGagandeep Singh  * The memory allocated at iova_addr must be zeroed before command execution.
3407*591200efSGagandeep Singh  * If the table content exceeds the memory size provided the dump will be truncated.
3408*591200efSGagandeep Singh  */
3409*591200efSGagandeep Singh int dpni_dump_table(struct fsl_mc_io *mc_io,
3410*591200efSGagandeep Singh 			 uint32_t cmd_flags,
3411*591200efSGagandeep Singh 			 uint16_t token,
3412*591200efSGagandeep Singh 			 uint16_t table_type,
3413*591200efSGagandeep Singh 			 uint16_t table_index,
3414*591200efSGagandeep Singh 			 uint64_t iova_addr,
3415*591200efSGagandeep Singh 			 uint32_t iova_size,
3416*591200efSGagandeep Singh 			 uint16_t *num_entries)
3417*591200efSGagandeep Singh {
3418*591200efSGagandeep Singh 	struct mc_command cmd = { 0 };
3419*591200efSGagandeep Singh 	int err;
3420*591200efSGagandeep Singh 	struct dpni_cmd_dump_table *cmd_params;
3421*591200efSGagandeep Singh 	struct dpni_rsp_dump_table *rsp_params;
3422*591200efSGagandeep Singh 
3423*591200efSGagandeep Singh 	/* prepare command */
3424*591200efSGagandeep Singh 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_DUMP_TABLE, cmd_flags, token);
3425*591200efSGagandeep Singh 	cmd_params = (struct dpni_cmd_dump_table *)cmd.params;
3426*591200efSGagandeep Singh 	cmd_params->table_type = cpu_to_le16(table_type);
3427*591200efSGagandeep Singh 	cmd_params->table_index = cpu_to_le16(table_index);
3428*591200efSGagandeep Singh 	cmd_params->iova_addr = cpu_to_le64(iova_addr);
3429*591200efSGagandeep Singh 	cmd_params->iova_size = cpu_to_le32(iova_size);
3430*591200efSGagandeep Singh 
3431*591200efSGagandeep Singh 	/* send command to mc*/
3432*591200efSGagandeep Singh 	err = mc_send_command(mc_io, &cmd);
3433*591200efSGagandeep Singh 	if (err)
3434*591200efSGagandeep Singh 		return err;
3435*591200efSGagandeep Singh 
3436*591200efSGagandeep Singh 	rsp_params = (struct dpni_rsp_dump_table *)cmd.params;
3437*591200efSGagandeep Singh 	*num_entries = le16_to_cpu(rsp_params->num_entries);
3438*591200efSGagandeep Singh 
3439*591200efSGagandeep Singh 	return 0;
3440*591200efSGagandeep Singh }
3441*591200efSGagandeep Singh 
3442*591200efSGagandeep Singh /* Sets up a Soft Parser Profile on this DPNI
3443*591200efSGagandeep Singh  * @mc_io:	Pointer to MC portal's I/O object
3444*591200efSGagandeep Singh  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
3445*591200efSGagandeep Singh  * @token:	Token of DPNI object
3446*591200efSGagandeep Singh  * @sp_profile: Soft Parser Profile name (must a valid name for a defined profile)
3447*591200efSGagandeep Singh  *			Maximum allowed length for this string is 8 characters long
3448*591200efSGagandeep Singh  *			If this parameter is empty string (all zeros)
3449*591200efSGagandeep Singh  *			then the Default SP Profile is set on this dpni
3450*591200efSGagandeep Singh  * @type: one of the SP Profile types defined above: Ingress or Egress (or both using bitwise OR)
3451*591200efSGagandeep Singh  */
3452*591200efSGagandeep Singh int dpni_set_sp_profile(struct fsl_mc_io *mc_io, uint32_t cmd_flags, uint16_t token,
3453*591200efSGagandeep Singh 		uint8_t sp_profile[], uint8_t type)
3454*591200efSGagandeep Singh {
3455*591200efSGagandeep Singh 	struct dpni_cmd_set_sp_profile *cmd_params;
3456*591200efSGagandeep Singh 	struct mc_command cmd = { 0 };
3457*591200efSGagandeep Singh 	int i;
3458*591200efSGagandeep Singh 
3459*591200efSGagandeep Singh 	/* prepare command */
3460*591200efSGagandeep Singh 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_SP_PROFILE,
3461*591200efSGagandeep Singh 			cmd_flags, token);
3462*591200efSGagandeep Singh 
3463*591200efSGagandeep Singh 	cmd_params = (struct dpni_cmd_set_sp_profile *)cmd.params;
3464*591200efSGagandeep Singh 	for (i = 0; i < MAX_SP_PROFILE_ID_SIZE && sp_profile[i]; i++)
3465*591200efSGagandeep Singh 		cmd_params->sp_profile[i] = sp_profile[i];
3466*591200efSGagandeep Singh 	cmd_params->type = type;
3467*591200efSGagandeep Singh 
3468*591200efSGagandeep Singh 	/* send command to MC */
3469*591200efSGagandeep Singh 	return mc_send_command(mc_io, &cmd);
3470*591200efSGagandeep Singh }
3471*591200efSGagandeep Singh 
3472*591200efSGagandeep Singh /* Enable/Disable Soft Parser on this DPNI
3473*591200efSGagandeep Singh  * @mc_io:	Pointer to MC portal's I/O object
3474*591200efSGagandeep Singh  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
3475*591200efSGagandeep Singh  * @token:	Token of DPNI object
3476*591200efSGagandeep Singh  * @type: one of the SP Profile types defined above: Ingress or Egress (or both using bitwise OR)
3477*591200efSGagandeep Singh  * @en: 1 to enable or 0 to disable
3478*591200efSGagandeep Singh  */
3479*591200efSGagandeep Singh int dpni_sp_enable(struct fsl_mc_io *mc_io, uint32_t cmd_flags, uint16_t token,
3480*591200efSGagandeep Singh 		uint8_t type, uint8_t en)
3481*591200efSGagandeep Singh {
3482*591200efSGagandeep Singh 	struct dpni_cmd_sp_enable *cmd_params;
3483*591200efSGagandeep Singh 	struct mc_command cmd = { 0 };
3484*591200efSGagandeep Singh 
3485*591200efSGagandeep Singh 	/* prepare command */
3486*591200efSGagandeep Singh 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SP_ENABLE,
3487*591200efSGagandeep Singh 			cmd_flags, token);
3488*591200efSGagandeep Singh 
3489*591200efSGagandeep Singh 	cmd_params = (struct dpni_cmd_sp_enable *)cmd.params;
3490*591200efSGagandeep Singh 	cmd_params->type = type;
3491*591200efSGagandeep Singh 	cmd_params->en = en;
3492f023d059SJun Yang 
3493f023d059SJun Yang 	/* send command to MC */
3494f023d059SJun Yang 	return mc_send_command(mc_io, &cmd);
3495f023d059SJun Yang }
3496