xref: /dpdk/drivers/bus/fslmc/mc/dpbp.c (revision b4a63e605df40be963e11f1c2f23dfca4c5c4929)
1131a75b6SHemant Agrawal /* SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0)
27ee46864SHemant Agrawal  *
37ee46864SHemant Agrawal  * Copyright 2013-2016 Freescale Semiconductor Inc.
4131a75b6SHemant Agrawal  * Copyright 2016-2017 NXP
57ee46864SHemant Agrawal  *
67ee46864SHemant Agrawal  */
77ee46864SHemant Agrawal #include <fsl_mc_sys.h>
87ee46864SHemant Agrawal #include <fsl_mc_cmd.h>
97ee46864SHemant Agrawal #include <fsl_dpbp.h>
107ee46864SHemant Agrawal #include <fsl_dpbp_cmd.h>
117ee46864SHemant Agrawal 
1216bbc98aSShreyansh Jain /**
1316bbc98aSShreyansh Jain  * dpbp_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  * @dpbp_id:	DPBP 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 dpbp_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  */
dpbp_open(struct fsl_mc_io * mc_io,uint32_t cmd_flags,int dpbp_id,uint16_t * token)297ee46864SHemant Agrawal int dpbp_open(struct fsl_mc_io *mc_io,
307ee46864SHemant Agrawal 	      uint32_t cmd_flags,
317ee46864SHemant Agrawal 	      int dpbp_id,
327ee46864SHemant Agrawal 	      uint16_t *token)
337ee46864SHemant Agrawal {
3416bbc98aSShreyansh Jain 	struct dpbp_cmd_open *cmd_params;
357ee46864SHemant Agrawal 	struct mc_command cmd = { 0 };
367ee46864SHemant Agrawal 	int err;
377ee46864SHemant Agrawal 
387ee46864SHemant Agrawal 	/* prepare command */
397ee46864SHemant Agrawal 	cmd.header = mc_encode_cmd_header(DPBP_CMDID_OPEN,
4016bbc98aSShreyansh Jain 					  cmd_flags, 0);
4116bbc98aSShreyansh Jain 	cmd_params = (struct dpbp_cmd_open *)cmd.params;
4216bbc98aSShreyansh Jain 	cmd_params->dpbp_id = cpu_to_le32(dpbp_id);
437ee46864SHemant Agrawal 
447ee46864SHemant Agrawal 	/* send command to mc*/
457ee46864SHemant Agrawal 	err = mc_send_command(mc_io, &cmd);
467ee46864SHemant Agrawal 	if (err)
477ee46864SHemant Agrawal 		return err;
487ee46864SHemant Agrawal 
497ee46864SHemant Agrawal 	/* retrieve response parameters */
5016bbc98aSShreyansh Jain 	*token = mc_cmd_hdr_read_token(&cmd);
517ee46864SHemant Agrawal 
527ee46864SHemant Agrawal 	return err;
537ee46864SHemant Agrawal }
547ee46864SHemant Agrawal 
5516bbc98aSShreyansh Jain /**
5616bbc98aSShreyansh Jain  * dpbp_close() - Close the control session of the object
5716bbc98aSShreyansh Jain  * @mc_io:	Pointer to MC portal's I/O object
5816bbc98aSShreyansh Jain  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
5916bbc98aSShreyansh Jain  * @token:	Token of DPBP object
6016bbc98aSShreyansh Jain  *
6116bbc98aSShreyansh Jain  * After this function is called, no further operations are
6216bbc98aSShreyansh Jain  * allowed on the object without opening a new control session.
6316bbc98aSShreyansh Jain  *
6416bbc98aSShreyansh Jain  * Return:	'0' on Success; Error code otherwise.
6516bbc98aSShreyansh Jain  */
dpbp_close(struct fsl_mc_io * mc_io,uint32_t cmd_flags,uint16_t token)667ee46864SHemant Agrawal int dpbp_close(struct fsl_mc_io *mc_io,
677ee46864SHemant Agrawal 	       uint32_t cmd_flags,
687ee46864SHemant Agrawal 	       uint16_t token)
697ee46864SHemant Agrawal {
707ee46864SHemant Agrawal 	struct mc_command cmd = { 0 };
717ee46864SHemant Agrawal 
727ee46864SHemant Agrawal 	/* prepare command */
737ee46864SHemant Agrawal 	cmd.header = mc_encode_cmd_header(DPBP_CMDID_CLOSE, cmd_flags,
747ee46864SHemant Agrawal 					  token);
757ee46864SHemant Agrawal 
767ee46864SHemant Agrawal 	/* send command to mc*/
777ee46864SHemant Agrawal 	return mc_send_command(mc_io, &cmd);
787ee46864SHemant Agrawal }
797ee46864SHemant Agrawal 
8016bbc98aSShreyansh Jain /**
8116bbc98aSShreyansh Jain  * dpbp_create() - Create the DPBP object.
8216bbc98aSShreyansh Jain  * @mc_io:	Pointer to MC portal's I/O object
8316bbc98aSShreyansh Jain  * @dprc_token:	Parent container token; '0' for default container
8416bbc98aSShreyansh Jain  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
8516bbc98aSShreyansh Jain  * @cfg:	Configuration structure
8616bbc98aSShreyansh Jain  * @obj_id:	Returned object id; use in subsequent API calls
8716bbc98aSShreyansh Jain  *
8816bbc98aSShreyansh Jain  * Create the DPBP object, allocate required resources and
8916bbc98aSShreyansh Jain  * perform required initialization.
9016bbc98aSShreyansh Jain  *
9116bbc98aSShreyansh Jain  * This function accepts an authentication token of a parent
9216bbc98aSShreyansh Jain  * container that this object should be assigned to and returns
9316bbc98aSShreyansh Jain  * an object id. This object_id will be used in all subsequent calls to
9416bbc98aSShreyansh Jain  * this specific object.
9516bbc98aSShreyansh Jain  *
9616bbc98aSShreyansh Jain  * Return:	'0' on Success; Error code otherwise.
9716bbc98aSShreyansh Jain  */
dpbp_create(struct fsl_mc_io * mc_io,uint16_t dprc_token,uint32_t cmd_flags,const struct dpbp_cfg * cfg,uint32_t * obj_id)987ee46864SHemant Agrawal int dpbp_create(struct fsl_mc_io *mc_io,
997ee46864SHemant Agrawal 		uint16_t dprc_token,
1007ee46864SHemant Agrawal 		uint32_t cmd_flags,
1017ee46864SHemant Agrawal 		const struct dpbp_cfg *cfg,
1027ee46864SHemant Agrawal 		uint32_t *obj_id)
1037ee46864SHemant Agrawal {
1047ee46864SHemant Agrawal 	struct mc_command cmd = { 0 };
1057ee46864SHemant Agrawal 	int err;
1067ee46864SHemant Agrawal 
1077ee46864SHemant Agrawal 	(void)(cfg); /* unused */
1087ee46864SHemant Agrawal 
1097ee46864SHemant Agrawal 	/* prepare command */
1107ee46864SHemant Agrawal 	cmd.header = mc_encode_cmd_header(DPBP_CMDID_CREATE,
11116bbc98aSShreyansh Jain 					  cmd_flags, dprc_token);
1127ee46864SHemant Agrawal 
1137ee46864SHemant Agrawal 	/* send command to mc*/
1147ee46864SHemant Agrawal 	err = mc_send_command(mc_io, &cmd);
1157ee46864SHemant Agrawal 	if (err)
1167ee46864SHemant Agrawal 		return err;
1177ee46864SHemant Agrawal 
1187ee46864SHemant Agrawal 	/* retrieve response parameters */
11916bbc98aSShreyansh Jain 	*obj_id = mc_cmd_read_object_id(&cmd);
1207ee46864SHemant Agrawal 
1217ee46864SHemant Agrawal 	return 0;
1227ee46864SHemant Agrawal }
1237ee46864SHemant Agrawal 
12416bbc98aSShreyansh Jain /**
12516bbc98aSShreyansh Jain  * dpbp_destroy() - Destroy the DPBP object and release all its resources.
12616bbc98aSShreyansh Jain  * @mc_io:	Pointer to MC portal's I/O object
12716bbc98aSShreyansh Jain  * @dprc_token:	Parent container token; '0' for default container
12816bbc98aSShreyansh Jain  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
12916bbc98aSShreyansh Jain  * @obj_id:	ID of DPBP object
13016bbc98aSShreyansh Jain  *
13116bbc98aSShreyansh Jain  * Return:	'0' on Success; error code otherwise.
13216bbc98aSShreyansh Jain  */
dpbp_destroy(struct fsl_mc_io * mc_io,uint16_t dprc_token,uint32_t cmd_flags,uint32_t obj_id)1337ee46864SHemant Agrawal int dpbp_destroy(struct fsl_mc_io *mc_io,
1347ee46864SHemant Agrawal 		 uint16_t dprc_token,
1357ee46864SHemant Agrawal 		 uint32_t cmd_flags,
13616bbc98aSShreyansh Jain 		 uint32_t obj_id)
1377ee46864SHemant Agrawal {
13816bbc98aSShreyansh Jain 	struct dpbp_cmd_destroy *cmd_params;
1397ee46864SHemant Agrawal 	struct mc_command cmd = { 0 };
1407ee46864SHemant Agrawal 
1417ee46864SHemant Agrawal 	/* prepare command */
1427ee46864SHemant Agrawal 	cmd.header = mc_encode_cmd_header(DPBP_CMDID_DESTROY,
14316bbc98aSShreyansh Jain 					  cmd_flags, dprc_token);
14416bbc98aSShreyansh Jain 
14516bbc98aSShreyansh Jain 	cmd_params = (struct dpbp_cmd_destroy *)cmd.params;
14616bbc98aSShreyansh Jain 	cmd_params->object_id = cpu_to_le32(obj_id);
14716bbc98aSShreyansh Jain 
1487ee46864SHemant Agrawal 	/* send command to mc*/
1497ee46864SHemant Agrawal 	return mc_send_command(mc_io, &cmd);
1507ee46864SHemant Agrawal }
1517ee46864SHemant Agrawal 
15216bbc98aSShreyansh Jain /**
15316bbc98aSShreyansh Jain  * dpbp_enable() - Enable the DPBP.
15416bbc98aSShreyansh Jain  * @mc_io:	Pointer to MC portal's I/O object
15516bbc98aSShreyansh Jain  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
15616bbc98aSShreyansh Jain  * @token:	Token of DPBP object
15716bbc98aSShreyansh Jain  *
15816bbc98aSShreyansh Jain  * Return:	'0' on Success; Error code otherwise.
15916bbc98aSShreyansh Jain  */
dpbp_enable(struct fsl_mc_io * mc_io,uint32_t cmd_flags,uint16_t token)1607ee46864SHemant Agrawal int dpbp_enable(struct fsl_mc_io *mc_io,
1617ee46864SHemant Agrawal 		uint32_t cmd_flags,
1627ee46864SHemant Agrawal 		uint16_t token)
1637ee46864SHemant Agrawal {
1647ee46864SHemant Agrawal 	struct mc_command cmd = { 0 };
1657ee46864SHemant Agrawal 
1667ee46864SHemant Agrawal 	/* prepare command */
1677ee46864SHemant Agrawal 	cmd.header = mc_encode_cmd_header(DPBP_CMDID_ENABLE, cmd_flags,
1687ee46864SHemant Agrawal 					  token);
1697ee46864SHemant Agrawal 
1707ee46864SHemant Agrawal 	/* send command to mc*/
1717ee46864SHemant Agrawal 	return mc_send_command(mc_io, &cmd);
1727ee46864SHemant Agrawal }
1737ee46864SHemant Agrawal 
17416bbc98aSShreyansh Jain /**
17516bbc98aSShreyansh Jain  * dpbp_disable() - Disable the DPBP.
17616bbc98aSShreyansh Jain  * @mc_io:	Pointer to MC portal's I/O object
17716bbc98aSShreyansh Jain  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
17816bbc98aSShreyansh Jain  * @token:	Token of DPBP object
17916bbc98aSShreyansh Jain  *
18016bbc98aSShreyansh Jain  * Return:	'0' on Success; Error code otherwise.
18116bbc98aSShreyansh Jain  */
dpbp_disable(struct fsl_mc_io * mc_io,uint32_t cmd_flags,uint16_t token)1827ee46864SHemant Agrawal int dpbp_disable(struct fsl_mc_io *mc_io,
1837ee46864SHemant Agrawal 		 uint32_t cmd_flags,
1847ee46864SHemant Agrawal 		 uint16_t token)
1857ee46864SHemant Agrawal {
1867ee46864SHemant Agrawal 	struct mc_command cmd = { 0 };
1877ee46864SHemant Agrawal 
1887ee46864SHemant Agrawal 	/* prepare command */
1897ee46864SHemant Agrawal 	cmd.header = mc_encode_cmd_header(DPBP_CMDID_DISABLE,
19016bbc98aSShreyansh Jain 					  cmd_flags, token);
1917ee46864SHemant Agrawal 
1927ee46864SHemant Agrawal 	/* send command to mc*/
1937ee46864SHemant Agrawal 	return mc_send_command(mc_io, &cmd);
1947ee46864SHemant Agrawal }
1957ee46864SHemant Agrawal 
19616bbc98aSShreyansh Jain /**
19716bbc98aSShreyansh Jain  * dpbp_is_enabled() - Check if the DPBP is enabled.
19816bbc98aSShreyansh Jain  * @mc_io:	Pointer to MC portal's I/O object
19916bbc98aSShreyansh Jain  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
20016bbc98aSShreyansh Jain  * @token:	Token of DPBP object
20116bbc98aSShreyansh Jain  * @en:		Returns '1' if object is enabled; '0' otherwise
20216bbc98aSShreyansh Jain  *
20316bbc98aSShreyansh Jain  * Return:	'0' on Success; Error code otherwise.
20416bbc98aSShreyansh Jain  */
dpbp_is_enabled(struct fsl_mc_io * mc_io,uint32_t cmd_flags,uint16_t token,int * en)2057ee46864SHemant Agrawal int dpbp_is_enabled(struct fsl_mc_io *mc_io,
2067ee46864SHemant Agrawal 		    uint32_t cmd_flags,
2077ee46864SHemant Agrawal 		    uint16_t token,
2087ee46864SHemant Agrawal 		    int *en)
2097ee46864SHemant Agrawal {
21016bbc98aSShreyansh Jain 	struct dpbp_rsp_is_enabled *rsp_params;
2117ee46864SHemant Agrawal 	struct mc_command cmd = { 0 };
2127ee46864SHemant Agrawal 	int err;
21316bbc98aSShreyansh Jain 
2147ee46864SHemant Agrawal 	/* prepare command */
2157ee46864SHemant Agrawal 	cmd.header = mc_encode_cmd_header(DPBP_CMDID_IS_ENABLED, cmd_flags,
2167ee46864SHemant Agrawal 					  token);
2177ee46864SHemant Agrawal 
2187ee46864SHemant Agrawal 	/* send command to mc*/
2197ee46864SHemant Agrawal 	err = mc_send_command(mc_io, &cmd);
2207ee46864SHemant Agrawal 	if (err)
2217ee46864SHemant Agrawal 		return err;
2227ee46864SHemant Agrawal 
2237ee46864SHemant Agrawal 	/* retrieve response parameters */
22416bbc98aSShreyansh Jain 	rsp_params = (struct dpbp_rsp_is_enabled *)cmd.params;
22516bbc98aSShreyansh Jain 	*en = rsp_params->enabled & DPBP_ENABLE;
2267ee46864SHemant Agrawal 
2277ee46864SHemant Agrawal 	return 0;
2287ee46864SHemant Agrawal }
2297ee46864SHemant Agrawal 
23016bbc98aSShreyansh Jain /**
23116bbc98aSShreyansh Jain  * dpbp_reset() - Reset the DPBP, returns the object to initial state.
23216bbc98aSShreyansh Jain  * @mc_io:	Pointer to MC portal's I/O object
23316bbc98aSShreyansh Jain  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
23416bbc98aSShreyansh Jain  * @token:	Token of DPBP object
23516bbc98aSShreyansh Jain  *
23616bbc98aSShreyansh Jain  * Return:	'0' on Success; Error code otherwise.
23716bbc98aSShreyansh Jain  */
dpbp_reset(struct fsl_mc_io * mc_io,uint32_t cmd_flags,uint16_t token)2387ee46864SHemant Agrawal int dpbp_reset(struct fsl_mc_io *mc_io,
2397ee46864SHemant Agrawal 	       uint32_t cmd_flags,
2407ee46864SHemant Agrawal 	       uint16_t token)
2417ee46864SHemant Agrawal {
2427ee46864SHemant Agrawal 	struct mc_command cmd = { 0 };
2437ee46864SHemant Agrawal 
2447ee46864SHemant Agrawal 	/* prepare command */
2457ee46864SHemant Agrawal 	cmd.header = mc_encode_cmd_header(DPBP_CMDID_RESET,
24616bbc98aSShreyansh Jain 					  cmd_flags, token);
2477ee46864SHemant Agrawal 
2487ee46864SHemant Agrawal 	/* send command to mc*/
2497ee46864SHemant Agrawal 	return mc_send_command(mc_io, &cmd);
2507ee46864SHemant Agrawal }
251*b4a63e60SHemant Agrawal /**
252*b4a63e60SHemant Agrawal  * dpbp_get_attributes - Retrieve DPBP attributes.
253*b4a63e60SHemant Agrawal  *
254*b4a63e60SHemant Agrawal  * @mc_io:	Pointer to MC portal's I/O object
255*b4a63e60SHemant Agrawal  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
256*b4a63e60SHemant Agrawal  * @token:	Token of DPBP object
257*b4a63e60SHemant Agrawal  * @attr:	Returned object's attributes
258*b4a63e60SHemant Agrawal  *
259*b4a63e60SHemant Agrawal  * Return:	'0' on Success; Error code otherwise.
260*b4a63e60SHemant Agrawal  */
dpbp_get_attributes(struct fsl_mc_io * mc_io,uint32_t cmd_flags,uint16_t token,struct dpbp_attr * attr)2617ee46864SHemant Agrawal int dpbp_get_attributes(struct fsl_mc_io *mc_io,
2627ee46864SHemant Agrawal 			uint32_t cmd_flags,
2637ee46864SHemant Agrawal 			uint16_t token,
2647ee46864SHemant Agrawal 			struct dpbp_attr *attr)
2657ee46864SHemant Agrawal {
26616bbc98aSShreyansh Jain 	struct dpbp_rsp_get_attributes *rsp_params;
2677ee46864SHemant Agrawal 	struct mc_command cmd = { 0 };
2687ee46864SHemant Agrawal 	int err;
2697ee46864SHemant Agrawal 
2707ee46864SHemant Agrawal 	/* prepare command */
2717ee46864SHemant Agrawal 	cmd.header = mc_encode_cmd_header(DPBP_CMDID_GET_ATTR,
27216bbc98aSShreyansh Jain 					  cmd_flags, token);
2737ee46864SHemant Agrawal 
2747ee46864SHemant Agrawal 	/* send command to mc*/
2757ee46864SHemant Agrawal 	err = mc_send_command(mc_io, &cmd);
2767ee46864SHemant Agrawal 	if (err)
2777ee46864SHemant Agrawal 		return err;
2787ee46864SHemant Agrawal 
2797ee46864SHemant Agrawal 	/* retrieve response parameters */
28016bbc98aSShreyansh Jain 	rsp_params = (struct dpbp_rsp_get_attributes *)cmd.params;
28116bbc98aSShreyansh Jain 	attr->bpid = le16_to_cpu(rsp_params->bpid);
28216bbc98aSShreyansh Jain 	attr->id = le32_to_cpu(rsp_params->id);
2837ee46864SHemant Agrawal 
2847ee46864SHemant Agrawal 	return 0;
2857ee46864SHemant Agrawal }
2867ee46864SHemant Agrawal 
28716bbc98aSShreyansh Jain /**
28816bbc98aSShreyansh Jain  * dpbp_get_api_version - Get Data Path Buffer Pool API version
28916bbc98aSShreyansh Jain  * @mc_io:	Pointer to Mc portal's I/O object
29016bbc98aSShreyansh Jain  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
29116bbc98aSShreyansh Jain  * @major_ver:	Major version of Buffer Pool API
29216bbc98aSShreyansh Jain  * @minor_ver:	Minor version of Buffer Pool API
29316bbc98aSShreyansh Jain  *
29416bbc98aSShreyansh Jain  * Return:	'0' on Success; Error code otherwise.
29516bbc98aSShreyansh Jain  */
dpbp_get_api_version(struct fsl_mc_io * mc_io,uint32_t cmd_flags,uint16_t * major_ver,uint16_t * minor_ver)2967ee46864SHemant Agrawal int dpbp_get_api_version(struct fsl_mc_io *mc_io,
2977ee46864SHemant Agrawal 			 uint32_t cmd_flags,
2987ee46864SHemant Agrawal 			 uint16_t *major_ver,
2997ee46864SHemant Agrawal 			 uint16_t *minor_ver)
3007ee46864SHemant Agrawal {
30116bbc98aSShreyansh Jain 	struct dpbp_rsp_get_api_version *rsp_params;
3027ee46864SHemant Agrawal 	struct mc_command cmd = { 0 };
3037ee46864SHemant Agrawal 	int err;
3047ee46864SHemant Agrawal 
30516bbc98aSShreyansh Jain 	/* prepare command */
3067ee46864SHemant Agrawal 	cmd.header = mc_encode_cmd_header(DPBP_CMDID_GET_API_VERSION,
30716bbc98aSShreyansh Jain 					  cmd_flags, 0);
3087ee46864SHemant Agrawal 
30916bbc98aSShreyansh Jain 	/* send command to mc */
3107ee46864SHemant Agrawal 	err = mc_send_command(mc_io, &cmd);
3117ee46864SHemant Agrawal 	if (err)
3127ee46864SHemant Agrawal 		return err;
3137ee46864SHemant Agrawal 
31416bbc98aSShreyansh Jain 	/* retrieve response parameters */
31516bbc98aSShreyansh Jain 	rsp_params = (struct dpbp_rsp_get_api_version *)cmd.params;
31616bbc98aSShreyansh Jain 	*major_ver = le16_to_cpu(rsp_params->major);
31716bbc98aSShreyansh Jain 	*minor_ver = le16_to_cpu(rsp_params->minor);
3187ee46864SHemant Agrawal 
3197ee46864SHemant Agrawal 	return 0;
3207ee46864SHemant Agrawal }
3217ee46864SHemant Agrawal 
32216bbc98aSShreyansh Jain /**
32316bbc98aSShreyansh Jain  * dpbp_get_num_free_bufs() - Get number of free buffers in the buffer pool
32416bbc98aSShreyansh Jain  * @mc_io:  Pointer to MC portal's I/O object
32516bbc98aSShreyansh Jain  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
32616bbc98aSShreyansh Jain  * @token:	Token of DPBP object
32716bbc98aSShreyansh Jain  * @num_free_bufs:	Number of free buffers
32816bbc98aSShreyansh Jain  *
32916bbc98aSShreyansh Jain  * Return:  '0' on Success; Error code otherwise.
33016bbc98aSShreyansh Jain  */
33116bbc98aSShreyansh Jain 
dpbp_get_num_free_bufs(struct fsl_mc_io * mc_io,uint32_t cmd_flags,uint16_t token,uint32_t * num_free_bufs)3327ee46864SHemant Agrawal int dpbp_get_num_free_bufs(struct fsl_mc_io *mc_io,
3337ee46864SHemant Agrawal 			   uint32_t cmd_flags,
3347ee46864SHemant Agrawal 			   uint16_t token,
3357ee46864SHemant Agrawal 			   uint32_t *num_free_bufs)
3367ee46864SHemant Agrawal {
33716bbc98aSShreyansh Jain 	struct dpbp_rsp_get_num_free_bufs *rsp_params;
3387ee46864SHemant Agrawal 	struct mc_command cmd = { 0 };
3397ee46864SHemant Agrawal 	int err;
3407ee46864SHemant Agrawal 
3417ee46864SHemant Agrawal 	/* prepare command */
3427ee46864SHemant Agrawal 	cmd.header = mc_encode_cmd_header(DPBP_CMDID_GET_FREE_BUFFERS_NUM,
3437ee46864SHemant Agrawal 					  cmd_flags,
3447ee46864SHemant Agrawal 					  token);
3457ee46864SHemant Agrawal 
3467ee46864SHemant Agrawal 	/* send command to mc*/
3477ee46864SHemant Agrawal 	err = mc_send_command(mc_io, &cmd);
3487ee46864SHemant Agrawal 	if (err)
3497ee46864SHemant Agrawal 		return err;
3507ee46864SHemant Agrawal 
3517ee46864SHemant Agrawal 	/* retrieve response parameters */
35216bbc98aSShreyansh Jain 	rsp_params = (struct dpbp_rsp_get_num_free_bufs *)cmd.params;
35316bbc98aSShreyansh Jain 	*num_free_bufs =  le32_to_cpu(rsp_params->num_free_bufs);
3547ee46864SHemant Agrawal 
3557ee46864SHemant Agrawal 	return 0;
3567ee46864SHemant Agrawal }
357