xref: /dpdk/drivers/bus/fslmc/mc/dpio.c (revision 591200ef6f32b56adc367ebe3647cc3dbe9362db)
1131a75b6SHemant Agrawal /* SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0)
22c63db04SHemant Agrawal  *
32c63db04SHemant Agrawal  * Copyright 2013-2016 Freescale Semiconductor Inc.
4*591200efSGagandeep Singh  * Copyright 2016-2023 NXP
52c63db04SHemant Agrawal  *
62c63db04SHemant Agrawal  */
72c63db04SHemant Agrawal #include <fsl_mc_sys.h>
82c63db04SHemant Agrawal #include <fsl_mc_cmd.h>
92c63db04SHemant Agrawal #include <fsl_dpio.h>
102c63db04SHemant Agrawal #include <fsl_dpio_cmd.h>
112c63db04SHemant Agrawal 
1216bbc98aSShreyansh Jain /**
1316bbc98aSShreyansh Jain  * dpio_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  * @dpio_id:	DPIO 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 dpio_create() function.
2216bbc98aSShreyansh Jain  * This function returns a unique authentication token,
2316bbc98aSShreyansh Jain  * associated with the specific object ID and any MC portals
2416bbc98aSShreyansh Jain  * assigned to the parent container; this token must be used in
2516bbc98aSShreyansh Jain  * all subsequent commands for this specific object.
2616bbc98aSShreyansh Jain  *
2716bbc98aSShreyansh Jain  * Return:	'0' on Success; Error code otherwise.
2816bbc98aSShreyansh Jain  */
292c63db04SHemant Agrawal int dpio_open(struct fsl_mc_io *mc_io,
302c63db04SHemant Agrawal 	      uint32_t cmd_flags,
312c63db04SHemant Agrawal 	      int dpio_id,
322c63db04SHemant Agrawal 	      uint16_t *token)
332c63db04SHemant Agrawal {
3416bbc98aSShreyansh Jain 	struct dpio_cmd_open *cmd_params;
352c63db04SHemant Agrawal 	struct mc_command cmd = { 0 };
362c63db04SHemant Agrawal 	int err;
372c63db04SHemant Agrawal 
382c63db04SHemant Agrawal 	/* prepare command */
392c63db04SHemant Agrawal 	cmd.header = mc_encode_cmd_header(DPIO_CMDID_OPEN,
402c63db04SHemant Agrawal 					  cmd_flags,
412c63db04SHemant Agrawal 					  0);
4216bbc98aSShreyansh Jain 	cmd_params = (struct dpio_cmd_open *)cmd.params;
4316bbc98aSShreyansh Jain 	cmd_params->dpio_id = cpu_to_le32(dpio_id);
442c63db04SHemant Agrawal 
452c63db04SHemant Agrawal 	/* send command to mc*/
462c63db04SHemant Agrawal 	err = mc_send_command(mc_io, &cmd);
472c63db04SHemant Agrawal 	if (err)
482c63db04SHemant Agrawal 		return err;
492c63db04SHemant Agrawal 
502c63db04SHemant Agrawal 	/* retrieve response parameters */
5116bbc98aSShreyansh Jain 	*token = mc_cmd_hdr_read_token(&cmd);
522c63db04SHemant Agrawal 
532c63db04SHemant Agrawal 	return 0;
542c63db04SHemant Agrawal }
552c63db04SHemant Agrawal 
5616bbc98aSShreyansh Jain /**
5716bbc98aSShreyansh Jain  * dpio_close() - Close the control session of the object
5816bbc98aSShreyansh Jain  * @mc_io:	Pointer to MC portal's I/O object
5916bbc98aSShreyansh Jain  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
6016bbc98aSShreyansh Jain  * @token:	Token of DPIO object
6116bbc98aSShreyansh Jain  *
6216bbc98aSShreyansh Jain  * Return:	'0' on Success; Error code otherwise.
6316bbc98aSShreyansh Jain  */
642c63db04SHemant Agrawal int dpio_close(struct fsl_mc_io *mc_io,
652c63db04SHemant Agrawal 	       uint32_t cmd_flags,
662c63db04SHemant Agrawal 	       uint16_t token)
672c63db04SHemant Agrawal {
682c63db04SHemant Agrawal 	struct mc_command cmd = { 0 };
692c63db04SHemant Agrawal 
702c63db04SHemant Agrawal 	/* prepare command */
712c63db04SHemant Agrawal 	cmd.header = mc_encode_cmd_header(DPIO_CMDID_CLOSE,
722c63db04SHemant Agrawal 					  cmd_flags,
732c63db04SHemant Agrawal 					  token);
742c63db04SHemant Agrawal 
752c63db04SHemant Agrawal 	/* send command to mc*/
762c63db04SHemant Agrawal 	return mc_send_command(mc_io, &cmd);
772c63db04SHemant Agrawal }
782c63db04SHemant Agrawal 
7916bbc98aSShreyansh Jain /**
8016bbc98aSShreyansh Jain  * dpio_create() - Create the DPIO object.
8116bbc98aSShreyansh Jain  * @mc_io:	Pointer to MC portal's I/O object
8216bbc98aSShreyansh Jain  * @dprc_token:	Parent container token; '0' for default container
8316bbc98aSShreyansh Jain  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
8416bbc98aSShreyansh Jain  * @cfg:	Configuration structure
8516bbc98aSShreyansh Jain  * @obj_id:	Returned object id
8616bbc98aSShreyansh Jain  *
8716bbc98aSShreyansh Jain  * Create the DPIO object, allocate required resources and
8816bbc98aSShreyansh Jain  * perform required initialization.
8916bbc98aSShreyansh Jain  *
9016bbc98aSShreyansh Jain  * The object can be created either by declaring it in the
9116bbc98aSShreyansh Jain  * DPL file, or by calling this function.
9216bbc98aSShreyansh Jain  *
9316bbc98aSShreyansh Jain  * The function accepts an authentication token of a parent
9416bbc98aSShreyansh Jain  * container that this object should be assigned to. The token
9516bbc98aSShreyansh Jain  * can be '0' so the object will be assigned to the default container.
9616bbc98aSShreyansh Jain  * The newly created object can be opened with the returned
9716bbc98aSShreyansh Jain  * object id and using the container's associated tokens and MC portals.
9816bbc98aSShreyansh Jain  *
9916bbc98aSShreyansh Jain  * Return:	'0' on Success; Error code otherwise.
10016bbc98aSShreyansh Jain  */
1012c63db04SHemant Agrawal int dpio_create(struct fsl_mc_io *mc_io,
1022c63db04SHemant Agrawal 		uint16_t dprc_token,
1032c63db04SHemant Agrawal 		uint32_t cmd_flags,
1042c63db04SHemant Agrawal 		const struct dpio_cfg *cfg,
1052c63db04SHemant Agrawal 		uint32_t *obj_id)
1062c63db04SHemant Agrawal {
10716bbc98aSShreyansh Jain 	struct dpio_cmd_create *cmd_params;
1082c63db04SHemant Agrawal 	struct mc_command cmd = { 0 };
1092c63db04SHemant Agrawal 	int err;
1102c63db04SHemant Agrawal 
1112c63db04SHemant Agrawal 	/* prepare command */
1122c63db04SHemant Agrawal 	cmd.header = mc_encode_cmd_header(DPIO_CMDID_CREATE,
1132c63db04SHemant Agrawal 					  cmd_flags,
1142c63db04SHemant Agrawal 					  dprc_token);
11516bbc98aSShreyansh Jain 	cmd_params = (struct dpio_cmd_create *)cmd.params;
11616bbc98aSShreyansh Jain 	cmd_params->num_priorities = cfg->num_priorities;
11716bbc98aSShreyansh Jain 	dpio_set_field(cmd_params->channel_mode,
11816bbc98aSShreyansh Jain 		       CHANNEL_MODE,
11916bbc98aSShreyansh Jain 		       cfg->channel_mode);
1202c63db04SHemant Agrawal 
1212c63db04SHemant Agrawal 	/* send command to mc*/
1222c63db04SHemant Agrawal 	err = mc_send_command(mc_io, &cmd);
1232c63db04SHemant Agrawal 	if (err)
1242c63db04SHemant Agrawal 		return err;
1252c63db04SHemant Agrawal 
1262c63db04SHemant Agrawal 	/* retrieve response parameters */
12716bbc98aSShreyansh Jain 	*obj_id = mc_cmd_read_object_id(&cmd);
1282c63db04SHemant Agrawal 
1292c63db04SHemant Agrawal 	return 0;
1302c63db04SHemant Agrawal }
1312c63db04SHemant Agrawal 
13216bbc98aSShreyansh Jain /**
13316bbc98aSShreyansh Jain  * dpio_destroy() - Destroy the DPIO object and release all its resources.
13416bbc98aSShreyansh Jain  * @mc_io:	Pointer to MC portal's I/O object
13516bbc98aSShreyansh Jain  * @dprc_token: Parent container token; '0' for default container
13616bbc98aSShreyansh Jain  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
13716bbc98aSShreyansh Jain  * @object_id:	The object id; it must be a valid id within the container that
13816bbc98aSShreyansh Jain  *		created this object;
13916bbc98aSShreyansh Jain  *
14016bbc98aSShreyansh Jain  * The function accepts the authentication token of the parent container that
14116bbc98aSShreyansh Jain  * created the object (not the one that currently owns the object). The object
14216bbc98aSShreyansh Jain  * is searched within parent using the provided 'object_id'.
14316bbc98aSShreyansh Jain  * All tokens to the object must be closed before calling destroy.
14416bbc98aSShreyansh Jain  *
14516bbc98aSShreyansh Jain  * Return:	'0' on Success; Error code otherwise
14616bbc98aSShreyansh Jain  */
1472c63db04SHemant Agrawal int dpio_destroy(struct fsl_mc_io *mc_io,
1482c63db04SHemant Agrawal 		 uint16_t dprc_token,
1492c63db04SHemant Agrawal 		 uint32_t cmd_flags,
1502c63db04SHemant Agrawal 		 uint32_t object_id)
1512c63db04SHemant Agrawal {
15216bbc98aSShreyansh Jain 	struct dpio_cmd_destroy *cmd_params;
1532c63db04SHemant Agrawal 	struct mc_command cmd = { 0 };
1542c63db04SHemant Agrawal 
1552c63db04SHemant Agrawal 	/* prepare command */
1562c63db04SHemant Agrawal 	cmd.header = mc_encode_cmd_header(DPIO_CMDID_DESTROY,
1572c63db04SHemant Agrawal 			cmd_flags,
1582c63db04SHemant Agrawal 			dprc_token);
15916bbc98aSShreyansh Jain 
1602c63db04SHemant Agrawal 	/* set object id to destroy */
16116bbc98aSShreyansh Jain 	cmd_params = (struct dpio_cmd_destroy *)cmd.params;
16216bbc98aSShreyansh Jain 	cmd_params->dpio_id = cpu_to_le32(object_id);
16316bbc98aSShreyansh Jain 
1642c63db04SHemant Agrawal 	/* send command to mc*/
1652c63db04SHemant Agrawal 	return mc_send_command(mc_io, &cmd);
1662c63db04SHemant Agrawal }
1672c63db04SHemant Agrawal 
16816bbc98aSShreyansh Jain /**
16916bbc98aSShreyansh Jain  * dpio_enable() - Enable the DPIO, allow I/O portal operations.
17016bbc98aSShreyansh Jain  * @mc_io:	Pointer to MC portal's I/O object
17116bbc98aSShreyansh Jain  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
17216bbc98aSShreyansh Jain  * @token:	Token of DPIO object
17316bbc98aSShreyansh Jain  *
17416bbc98aSShreyansh Jain  * Return:	'0' on Success; Error code otherwise
17516bbc98aSShreyansh Jain  */
1762c63db04SHemant Agrawal int dpio_enable(struct fsl_mc_io *mc_io,
1772c63db04SHemant Agrawal 		uint32_t cmd_flags,
1782c63db04SHemant Agrawal 		uint16_t token)
1792c63db04SHemant Agrawal {
1802c63db04SHemant Agrawal 	struct mc_command cmd = { 0 };
1812c63db04SHemant Agrawal 
1822c63db04SHemant Agrawal 	/* prepare command */
1832c63db04SHemant Agrawal 	cmd.header = mc_encode_cmd_header(DPIO_CMDID_ENABLE,
1842c63db04SHemant Agrawal 					  cmd_flags,
1852c63db04SHemant Agrawal 					  token);
1862c63db04SHemant Agrawal 
1872c63db04SHemant Agrawal 	/* send command to mc*/
1882c63db04SHemant Agrawal 	return mc_send_command(mc_io, &cmd);
1892c63db04SHemant Agrawal }
1902c63db04SHemant Agrawal 
19116bbc98aSShreyansh Jain /**
19216bbc98aSShreyansh Jain  * dpio_disable() - Disable the DPIO, stop any I/O portal operation.
19316bbc98aSShreyansh Jain  * @mc_io:	Pointer to MC portal's I/O object
19416bbc98aSShreyansh Jain  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
19516bbc98aSShreyansh Jain  * @token:	Token of DPIO object
19616bbc98aSShreyansh Jain  *
19716bbc98aSShreyansh Jain  * Return:	'0' on Success; Error code otherwise
19816bbc98aSShreyansh Jain  */
1992c63db04SHemant Agrawal int dpio_disable(struct fsl_mc_io *mc_io,
2002c63db04SHemant Agrawal 		 uint32_t cmd_flags,
2012c63db04SHemant Agrawal 		 uint16_t token)
2022c63db04SHemant Agrawal {
2032c63db04SHemant Agrawal 	struct mc_command cmd = { 0 };
2042c63db04SHemant Agrawal 
2052c63db04SHemant Agrawal 	/* prepare command */
2062c63db04SHemant Agrawal 	cmd.header = mc_encode_cmd_header(DPIO_CMDID_DISABLE,
2072c63db04SHemant Agrawal 					  cmd_flags,
2082c63db04SHemant Agrawal 					  token);
2092c63db04SHemant Agrawal 
2102c63db04SHemant Agrawal 	/* send command to mc*/
2112c63db04SHemant Agrawal 	return mc_send_command(mc_io, &cmd);
2122c63db04SHemant Agrawal }
2132c63db04SHemant Agrawal 
21416bbc98aSShreyansh Jain /**
21516bbc98aSShreyansh Jain  * dpio_is_enabled() - Check if the DPIO is enabled.
21616bbc98aSShreyansh Jain  * @mc_io:	Pointer to MC portal's I/O object
21716bbc98aSShreyansh Jain  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
21816bbc98aSShreyansh Jain  * @token:	Token of DPIO object
21916bbc98aSShreyansh Jain  * @en:		Returns '1' if object is enabled; '0' otherwise
22016bbc98aSShreyansh Jain  *
22116bbc98aSShreyansh Jain  * Return:	'0' on Success; Error code otherwise.
22216bbc98aSShreyansh Jain  */
2232c63db04SHemant Agrawal int dpio_is_enabled(struct fsl_mc_io *mc_io,
2242c63db04SHemant Agrawal 		    uint32_t cmd_flags,
2252c63db04SHemant Agrawal 		    uint16_t token,
2262c63db04SHemant Agrawal 		    int *en)
2272c63db04SHemant Agrawal {
22816bbc98aSShreyansh Jain 	struct dpio_rsp_is_enabled *rsp_params;
2292c63db04SHemant Agrawal 	struct mc_command cmd = { 0 };
2302c63db04SHemant Agrawal 	int err;
23116bbc98aSShreyansh Jain 
2322c63db04SHemant Agrawal 	/* prepare command */
2332c63db04SHemant Agrawal 	cmd.header = mc_encode_cmd_header(DPIO_CMDID_IS_ENABLED, cmd_flags,
2342c63db04SHemant Agrawal 					  token);
2352c63db04SHemant Agrawal 
2362c63db04SHemant Agrawal 	/* send command to mc*/
2372c63db04SHemant Agrawal 	err = mc_send_command(mc_io, &cmd);
2382c63db04SHemant Agrawal 	if (err)
2392c63db04SHemant Agrawal 		return err;
2402c63db04SHemant Agrawal 
2412c63db04SHemant Agrawal 	/* retrieve response parameters */
24216bbc98aSShreyansh Jain 	rsp_params = (struct dpio_rsp_is_enabled *)cmd.params;
24316bbc98aSShreyansh Jain 	*en = dpio_get_field(rsp_params->en, ENABLE);
2442c63db04SHemant Agrawal 
2452c63db04SHemant Agrawal 	return 0;
2462c63db04SHemant Agrawal }
2472c63db04SHemant Agrawal 
24816bbc98aSShreyansh Jain /**
24916bbc98aSShreyansh Jain  * dpio_reset() - Reset the DPIO, returns the object to initial state.
25016bbc98aSShreyansh Jain  * @mc_io:	Pointer to MC portal's I/O object
25116bbc98aSShreyansh Jain  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
25216bbc98aSShreyansh Jain  * @token:	Token of DPIO object
25316bbc98aSShreyansh Jain  *
25416bbc98aSShreyansh Jain  * Return:	'0' on Success; Error code otherwise.
25516bbc98aSShreyansh Jain  */
2562c63db04SHemant Agrawal int dpio_reset(struct fsl_mc_io *mc_io,
2572c63db04SHemant Agrawal 	       uint32_t cmd_flags,
2582c63db04SHemant Agrawal 	       uint16_t token)
2592c63db04SHemant Agrawal {
2602c63db04SHemant Agrawal 	struct mc_command cmd = { 0 };
2612c63db04SHemant Agrawal 
2622c63db04SHemant Agrawal 	/* prepare command */
2632c63db04SHemant Agrawal 	cmd.header = mc_encode_cmd_header(DPIO_CMDID_RESET,
2642c63db04SHemant Agrawal 					  cmd_flags,
2652c63db04SHemant Agrawal 					  token);
2662c63db04SHemant Agrawal 
2672c63db04SHemant Agrawal 	/* send command to mc*/
2682c63db04SHemant Agrawal 	return mc_send_command(mc_io, &cmd);
2692c63db04SHemant Agrawal }
2702c63db04SHemant Agrawal 
271b4a63e60SHemant Agrawal /**
272b4a63e60SHemant Agrawal  * dpio_get_attributes() - Retrieve DPIO attributes
273b4a63e60SHemant Agrawal  * @mc_io:	Pointer to MC portal's I/O object
274b4a63e60SHemant Agrawal  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
275b4a63e60SHemant Agrawal  * @token:	Token of DPIO object
276b4a63e60SHemant Agrawal  * @attr:	Returned object's attributes
277b4a63e60SHemant Agrawal  *
278b4a63e60SHemant Agrawal  * Return:	'0' on Success; Error code otherwise
279b4a63e60SHemant Agrawal  */
2802c63db04SHemant Agrawal int dpio_get_attributes(struct fsl_mc_io *mc_io,
2812c63db04SHemant Agrawal 			uint32_t cmd_flags,
2822c63db04SHemant Agrawal 			uint16_t token,
2832c63db04SHemant Agrawal 			struct dpio_attr *attr)
2842c63db04SHemant Agrawal {
28516bbc98aSShreyansh Jain 	struct dpio_rsp_get_attr *rsp_params;
2862c63db04SHemant Agrawal 	struct mc_command cmd = { 0 };
2872c63db04SHemant Agrawal 	int err;
2882c63db04SHemant Agrawal 
2892c63db04SHemant Agrawal 	/* prepare command */
2902c63db04SHemant Agrawal 	cmd.header = mc_encode_cmd_header(DPIO_CMDID_GET_ATTR,
2912c63db04SHemant Agrawal 					  cmd_flags,
2922c63db04SHemant Agrawal 					  token);
2932c63db04SHemant Agrawal 
2942c63db04SHemant Agrawal 	/* send command to mc*/
2952c63db04SHemant Agrawal 	err = mc_send_command(mc_io, &cmd);
2962c63db04SHemant Agrawal 	if (err)
2972c63db04SHemant Agrawal 		return err;
2982c63db04SHemant Agrawal 
2992c63db04SHemant Agrawal 	/* retrieve response parameters */
30016bbc98aSShreyansh Jain 	rsp_params = (struct dpio_rsp_get_attr *)cmd.params;
30116bbc98aSShreyansh Jain 	attr->id = le32_to_cpu(rsp_params->id);
30216bbc98aSShreyansh Jain 	attr->qbman_portal_id = le16_to_cpu(rsp_params->qbman_portal_id);
30316bbc98aSShreyansh Jain 	attr->num_priorities = rsp_params->num_priorities;
30416bbc98aSShreyansh Jain 	attr->qbman_portal_ce_offset =
30516bbc98aSShreyansh Jain 				le64_to_cpu(rsp_params->qbman_portal_ce_offset);
30616bbc98aSShreyansh Jain 	attr->qbman_portal_ci_offset =
30716bbc98aSShreyansh Jain 				le64_to_cpu(rsp_params->qbman_portal_ci_offset);
30816bbc98aSShreyansh Jain 	attr->qbman_version = le32_to_cpu(rsp_params->qbman_version);
30916bbc98aSShreyansh Jain 	attr->clk = le32_to_cpu(rsp_params->clk);
31016bbc98aSShreyansh Jain 	attr->channel_mode = dpio_get_field(rsp_params->channel_mode,
31116bbc98aSShreyansh Jain 					    ATTR_CHANNEL_MODE);
3122c63db04SHemant Agrawal 
3132c63db04SHemant Agrawal 	return 0;
3142c63db04SHemant Agrawal }
3152c63db04SHemant Agrawal 
31616bbc98aSShreyansh Jain /**
31716bbc98aSShreyansh Jain  * dpio_set_stashing_destination() - Set the stashing destination.
31816bbc98aSShreyansh Jain  * @mc_io:	Pointer to MC portal's I/O object
31916bbc98aSShreyansh Jain  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
32016bbc98aSShreyansh Jain  * @token:	Token of DPIO object
32116bbc98aSShreyansh Jain  * @sdest:	Stashing destination value
32216bbc98aSShreyansh Jain  *
32316bbc98aSShreyansh Jain  * Return:	'0' on Success; Error code otherwise.
32416bbc98aSShreyansh Jain  */
3252c63db04SHemant Agrawal int dpio_set_stashing_destination(struct fsl_mc_io *mc_io,
3262c63db04SHemant Agrawal 				  uint32_t cmd_flags,
3272c63db04SHemant Agrawal 				  uint16_t token,
3282c63db04SHemant Agrawal 				  uint8_t sdest)
3292c63db04SHemant Agrawal {
33016bbc98aSShreyansh Jain 	struct dpio_stashing_dest *cmd_params;
3312c63db04SHemant Agrawal 	struct mc_command cmd = { 0 };
3322c63db04SHemant Agrawal 
3332c63db04SHemant Agrawal 	/* prepare command */
3342c63db04SHemant Agrawal 	cmd.header = mc_encode_cmd_header(DPIO_CMDID_SET_STASHING_DEST,
3352c63db04SHemant Agrawal 					  cmd_flags,
3362c63db04SHemant Agrawal 					  token);
33716bbc98aSShreyansh Jain 	cmd_params = (struct dpio_stashing_dest *)cmd.params;
33816bbc98aSShreyansh Jain 	cmd_params->sdest = sdest;
3392c63db04SHemant Agrawal 
3402c63db04SHemant Agrawal 	/* send command to mc*/
3412c63db04SHemant Agrawal 	return mc_send_command(mc_io, &cmd);
3422c63db04SHemant Agrawal }
3432c63db04SHemant Agrawal 
34416bbc98aSShreyansh Jain /**
34516bbc98aSShreyansh Jain  * dpio_get_stashing_destination() - Get the stashing destination..
34616bbc98aSShreyansh Jain  * @mc_io:	Pointer to MC portal's I/O object
34716bbc98aSShreyansh Jain  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
34816bbc98aSShreyansh Jain  * @token:	Token of DPIO object
34916bbc98aSShreyansh Jain  * @sdest:	Returns the stashing destination value
35016bbc98aSShreyansh Jain  *
35116bbc98aSShreyansh Jain  * Return:	'0' on Success; Error code otherwise.
35216bbc98aSShreyansh Jain  */
3532c63db04SHemant Agrawal int dpio_get_stashing_destination(struct fsl_mc_io *mc_io,
3542c63db04SHemant Agrawal 				  uint32_t cmd_flags,
3552c63db04SHemant Agrawal 				  uint16_t token,
3562c63db04SHemant Agrawal 				  uint8_t *sdest)
3572c63db04SHemant Agrawal {
35816bbc98aSShreyansh Jain 	struct dpio_stashing_dest *rsp_params;
3592c63db04SHemant Agrawal 	struct mc_command cmd = { 0 };
3602c63db04SHemant Agrawal 	int err;
3612c63db04SHemant Agrawal 
3622c63db04SHemant Agrawal 	/* prepare command */
3632c63db04SHemant Agrawal 	cmd.header = mc_encode_cmd_header(DPIO_CMDID_GET_STASHING_DEST,
3642c63db04SHemant Agrawal 					  cmd_flags,
3652c63db04SHemant Agrawal 					  token);
3662c63db04SHemant Agrawal 
3672c63db04SHemant Agrawal 	/* send command to mc*/
3682c63db04SHemant Agrawal 	err = mc_send_command(mc_io, &cmd);
3692c63db04SHemant Agrawal 	if (err)
3702c63db04SHemant Agrawal 		return err;
3712c63db04SHemant Agrawal 
3722c63db04SHemant Agrawal 	/* retrieve response parameters */
37316bbc98aSShreyansh Jain 	rsp_params = (struct dpio_stashing_dest *)cmd.params;
37416bbc98aSShreyansh Jain 	*sdest = rsp_params->sdest;
3752c63db04SHemant Agrawal 
3762c63db04SHemant Agrawal 	return 0;
3772c63db04SHemant Agrawal }
3782c63db04SHemant Agrawal 
37916bbc98aSShreyansh Jain /**
380*591200efSGagandeep Singh  * dpio_set_stashing_destination_by_core_id() - Set the stashing destination source
381*591200efSGagandeep Singh  * using the core id.
382*591200efSGagandeep Singh  * @mc_io:	Pointer to MC portal's I/O object
383*591200efSGagandeep Singh  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
384*591200efSGagandeep Singh  * @token:	Token of DPIO object
385*591200efSGagandeep Singh  * @core_id:	Core id stashing destination
386*591200efSGagandeep Singh  *
387*591200efSGagandeep Singh  * Return:	'0' on Success; Error code otherwise.
388*591200efSGagandeep Singh  */
389*591200efSGagandeep Singh int dpio_set_stashing_destination_by_core_id(struct fsl_mc_io *mc_io,
390*591200efSGagandeep Singh 					uint32_t cmd_flags,
391*591200efSGagandeep Singh 					uint16_t token,
392*591200efSGagandeep Singh 					uint8_t core_id)
393*591200efSGagandeep Singh {
394*591200efSGagandeep Singh 	struct dpio_stashing_dest_by_core_id *cmd_params;
395*591200efSGagandeep Singh 	struct mc_command cmd = { 0 };
396*591200efSGagandeep Singh 
397*591200efSGagandeep Singh 	/* prepare command */
398*591200efSGagandeep Singh 	cmd.header = mc_encode_cmd_header(DPIO_CMDID_SET_STASHING_DEST_BY_CORE_ID,
399*591200efSGagandeep Singh 										cmd_flags,
400*591200efSGagandeep Singh 										token);
401*591200efSGagandeep Singh 	cmd_params = (struct dpio_stashing_dest_by_core_id  *)cmd.params;
402*591200efSGagandeep Singh 	cmd_params->core_id = core_id;
403*591200efSGagandeep Singh 
404*591200efSGagandeep Singh 	/* send command to mc*/
405*591200efSGagandeep Singh 	return mc_send_command(mc_io, &cmd);
406*591200efSGagandeep Singh }
407*591200efSGagandeep Singh 
408*591200efSGagandeep Singh /**
409*591200efSGagandeep Singh  * dpio_set_stashing_destination_source() - Set the stashing destination source.
410*591200efSGagandeep Singh  * @mc_io:	Pointer to MC portal's I/O object
411*591200efSGagandeep Singh  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
412*591200efSGagandeep Singh  * @token:	Token of DPIO object
413*591200efSGagandeep Singh  * @ss:		Stashing destination source (0 manual/1 automatic)
414*591200efSGagandeep Singh  *
415*591200efSGagandeep Singh  * Return:	'0' on Success; Error code otherwise.
416*591200efSGagandeep Singh  */
417*591200efSGagandeep Singh int dpio_set_stashing_destination_source(struct fsl_mc_io *mc_io,
418*591200efSGagandeep Singh 				  uint32_t cmd_flags,
419*591200efSGagandeep Singh 				  uint16_t token,
420*591200efSGagandeep Singh 				  uint8_t ss)
421*591200efSGagandeep Singh {
422*591200efSGagandeep Singh 	struct dpio_stashing_dest_source *cmd_params;
423*591200efSGagandeep Singh 	struct mc_command cmd = { 0 };
424*591200efSGagandeep Singh 
425*591200efSGagandeep Singh 	/* prepare command */
426*591200efSGagandeep Singh 	cmd.header = mc_encode_cmd_header(DPIO_CMDID_SET_STASHING_DEST_SOURCE,
427*591200efSGagandeep Singh 					  cmd_flags,
428*591200efSGagandeep Singh 					  token);
429*591200efSGagandeep Singh 	cmd_params = (struct dpio_stashing_dest_source *)cmd.params;
430*591200efSGagandeep Singh 	cmd_params->ss = ss;
431*591200efSGagandeep Singh 
432*591200efSGagandeep Singh 	/* send command to mc*/
433*591200efSGagandeep Singh 	return mc_send_command(mc_io, &cmd);
434*591200efSGagandeep Singh }
435*591200efSGagandeep Singh 
436*591200efSGagandeep Singh /**
437*591200efSGagandeep Singh  * dpio_get_stashing_destination_source() - Get the stashing destination source.
438*591200efSGagandeep Singh  * @mc_io:	Pointer to MC portal's I/O object
439*591200efSGagandeep Singh  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
440*591200efSGagandeep Singh  * @token:	Token of DPIO object
441*591200efSGagandeep Singh  * @ss:		Returns the stashing destination source (0 manual/1 automatic)
442*591200efSGagandeep Singh  *
443*591200efSGagandeep Singh  * Return:	'0' on Success; Error code otherwise.
444*591200efSGagandeep Singh  */
445*591200efSGagandeep Singh int dpio_get_stashing_destination_source(struct fsl_mc_io *mc_io,
446*591200efSGagandeep Singh 				  uint32_t cmd_flags,
447*591200efSGagandeep Singh 				  uint16_t token,
448*591200efSGagandeep Singh 				  uint8_t *ss)
449*591200efSGagandeep Singh {
450*591200efSGagandeep Singh 	struct dpio_stashing_dest_source *rsp_params;
451*591200efSGagandeep Singh 	struct mc_command cmd = { 0 };
452*591200efSGagandeep Singh 	int err;
453*591200efSGagandeep Singh 
454*591200efSGagandeep Singh 	/* prepare command */
455*591200efSGagandeep Singh 	cmd.header = mc_encode_cmd_header(DPIO_CMDID_GET_STASHING_DEST_SOURCE,
456*591200efSGagandeep Singh 					  cmd_flags,
457*591200efSGagandeep Singh 					  token);
458*591200efSGagandeep Singh 
459*591200efSGagandeep Singh 	/* send command to mc*/
460*591200efSGagandeep Singh 	err = mc_send_command(mc_io, &cmd);
461*591200efSGagandeep Singh 	if (err)
462*591200efSGagandeep Singh 		return err;
463*591200efSGagandeep Singh 
464*591200efSGagandeep Singh 	/* retrieve response parameters */
465*591200efSGagandeep Singh 	rsp_params = (struct dpio_stashing_dest_source *)cmd.params;
466*591200efSGagandeep Singh 	*ss = rsp_params->ss;
467*591200efSGagandeep Singh 
468*591200efSGagandeep Singh 	return 0;
469*591200efSGagandeep Singh }
470*591200efSGagandeep Singh 
471*591200efSGagandeep Singh /**
47216bbc98aSShreyansh Jain  * dpio_add_static_dequeue_channel() - Add a static dequeue channel.
47316bbc98aSShreyansh Jain  * @mc_io:		Pointer to MC portal's I/O object
47416bbc98aSShreyansh Jain  * @cmd_flags:		Command flags; one or more of 'MC_CMD_FLAG_'
47516bbc98aSShreyansh Jain  * @token:		Token of DPIO object
47616bbc98aSShreyansh Jain  * @dpcon_id:		DPCON object ID
47716bbc98aSShreyansh Jain  * @channel_index:	Returned channel index to be used in qbman API
47816bbc98aSShreyansh Jain  *
47916bbc98aSShreyansh Jain  * Return:	'0' on Success; Error code otherwise.
48016bbc98aSShreyansh Jain  */
4813844bdd1SNipun Gupta int dpio_add_static_dequeue_channel(struct fsl_mc_io *mc_io,
4823844bdd1SNipun Gupta 				    uint32_t cmd_flags,
4833844bdd1SNipun Gupta 				    uint16_t token,
4843844bdd1SNipun Gupta 				    int dpcon_id,
4853844bdd1SNipun Gupta 				    uint8_t *channel_index)
4863844bdd1SNipun Gupta {
48716bbc98aSShreyansh Jain 	struct dpio_rsp_add_static_dequeue_channel *rsp_params;
48816bbc98aSShreyansh Jain 	struct dpio_cmd_static_dequeue_channel *cmd_params;
4893844bdd1SNipun Gupta 	struct mc_command cmd = { 0 };
4903844bdd1SNipun Gupta 	int err;
4913844bdd1SNipun Gupta 
4923844bdd1SNipun Gupta 	/* prepare command */
4933844bdd1SNipun Gupta 	cmd.header = mc_encode_cmd_header(DPIO_CMDID_ADD_STATIC_DEQUEUE_CHANNEL,
4943844bdd1SNipun Gupta 					  cmd_flags,
4953844bdd1SNipun Gupta 					  token);
49616bbc98aSShreyansh Jain 	cmd_params = (struct dpio_cmd_static_dequeue_channel *)cmd.params;
49716bbc98aSShreyansh Jain 	cmd_params->dpcon_id = cpu_to_le32(dpcon_id);
4983844bdd1SNipun Gupta 
4993844bdd1SNipun Gupta 	/* send command to mc*/
5003844bdd1SNipun Gupta 	err = mc_send_command(mc_io, &cmd);
5013844bdd1SNipun Gupta 	if (err)
5023844bdd1SNipun Gupta 		return err;
5033844bdd1SNipun Gupta 
5043844bdd1SNipun Gupta 	/* retrieve response parameters */
50516bbc98aSShreyansh Jain 	rsp_params = (struct dpio_rsp_add_static_dequeue_channel *)cmd.params;
50616bbc98aSShreyansh Jain 	*channel_index = rsp_params->channel_index;
5073844bdd1SNipun Gupta 
5083844bdd1SNipun Gupta 	return 0;
5093844bdd1SNipun Gupta }
5103844bdd1SNipun Gupta 
51116bbc98aSShreyansh Jain /**
51216bbc98aSShreyansh Jain  * dpio_remove_static_dequeue_channel() - Remove a static dequeue channel.
51316bbc98aSShreyansh Jain  * @mc_io:	Pointer to MC portal's I/O object
51416bbc98aSShreyansh Jain  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
51516bbc98aSShreyansh Jain  * @token:	Token of DPIO object
51616bbc98aSShreyansh Jain  * @dpcon_id:	DPCON object ID
51716bbc98aSShreyansh Jain  *
51816bbc98aSShreyansh Jain  * Return:	'0' on Success; Error code otherwise.
51916bbc98aSShreyansh Jain  */
5203844bdd1SNipun Gupta int dpio_remove_static_dequeue_channel(struct fsl_mc_io *mc_io,
5213844bdd1SNipun Gupta 				       uint32_t cmd_flags,
5223844bdd1SNipun Gupta 				       uint16_t token,
5233844bdd1SNipun Gupta 				       int dpcon_id)
5243844bdd1SNipun Gupta {
52516bbc98aSShreyansh Jain 	struct dpio_cmd_static_dequeue_channel *cmd_params;
5263844bdd1SNipun Gupta 	struct mc_command cmd = { 0 };
5273844bdd1SNipun Gupta 
5283844bdd1SNipun Gupta 	/* prepare command */
5293844bdd1SNipun Gupta 	cmd.header = mc_encode_cmd_header(
5303844bdd1SNipun Gupta 				DPIO_CMDID_REMOVE_STATIC_DEQUEUE_CHANNEL,
5313844bdd1SNipun Gupta 				cmd_flags,
5323844bdd1SNipun Gupta 				token);
53316bbc98aSShreyansh Jain 	cmd_params = (struct dpio_cmd_static_dequeue_channel *)cmd.params;
53416bbc98aSShreyansh Jain 	cmd_params->dpcon_id = cpu_to_le32(dpcon_id);
5353844bdd1SNipun Gupta 
5363844bdd1SNipun Gupta 	/* send command to mc*/
5373844bdd1SNipun Gupta 	return mc_send_command(mc_io, &cmd);
5383844bdd1SNipun Gupta }
5393844bdd1SNipun Gupta 
54016bbc98aSShreyansh Jain /**
54116bbc98aSShreyansh Jain  * dpio_get_api_version() - Get Data Path I/O API version
54216bbc98aSShreyansh Jain  * @mc_io:	Pointer to MC portal's I/O object
54316bbc98aSShreyansh Jain  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
54416bbc98aSShreyansh Jain  * @major_ver:	Major version of data path i/o API
54516bbc98aSShreyansh Jain  * @minor_ver:	Minor version of data path i/o API
54616bbc98aSShreyansh Jain  *
54716bbc98aSShreyansh Jain  * Return:  '0' on Success; Error code otherwise.
54816bbc98aSShreyansh Jain  */
5492c63db04SHemant Agrawal int dpio_get_api_version(struct fsl_mc_io *mc_io,
5502c63db04SHemant Agrawal 			 uint32_t cmd_flags,
5512c63db04SHemant Agrawal 			 uint16_t *major_ver,
5522c63db04SHemant Agrawal 			 uint16_t *minor_ver)
5532c63db04SHemant Agrawal {
55416bbc98aSShreyansh Jain 	struct dpio_rsp_get_api_version *rsp_params;
5552c63db04SHemant Agrawal 	struct mc_command cmd = { 0 };
5562c63db04SHemant Agrawal 	int err;
5572c63db04SHemant Agrawal 
5582c63db04SHemant Agrawal 	cmd.header = mc_encode_cmd_header(DPIO_CMDID_GET_API_VERSION,
5592c63db04SHemant Agrawal 					cmd_flags,
5602c63db04SHemant Agrawal 					0);
5612c63db04SHemant Agrawal 
5622c63db04SHemant Agrawal 	err = mc_send_command(mc_io, &cmd);
5632c63db04SHemant Agrawal 	if (err)
5642c63db04SHemant Agrawal 		return err;
5652c63db04SHemant Agrawal 
56616bbc98aSShreyansh Jain 	rsp_params = (struct dpio_rsp_get_api_version *)cmd.params;
56716bbc98aSShreyansh Jain 	*major_ver = le16_to_cpu(rsp_params->major);
56816bbc98aSShreyansh Jain 	*minor_ver = le16_to_cpu(rsp_params->minor);
5692c63db04SHemant Agrawal 
5702c63db04SHemant Agrawal 	return 0;
5712c63db04SHemant Agrawal }
572