xref: /openbmc/linux/drivers/bus/fsl-mc/dpbp.c (revision 754cac3f)
19c692d5aSBogdan Purcareata // SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
29c692d5aSBogdan Purcareata /*
39c692d5aSBogdan Purcareata  * Copyright 2013-2016 Freescale Semiconductor Inc.
49c692d5aSBogdan Purcareata  *
59c692d5aSBogdan Purcareata  */
69c692d5aSBogdan Purcareata #include <linux/kernel.h>
79c692d5aSBogdan Purcareata #include <linux/fsl/mc.h>
89c692d5aSBogdan Purcareata 
99c692d5aSBogdan Purcareata #include "fsl-mc-private.h"
109c692d5aSBogdan Purcareata 
119c692d5aSBogdan Purcareata /**
129c692d5aSBogdan Purcareata  * dpbp_open() - Open a control session for the specified object.
139c692d5aSBogdan Purcareata  * @mc_io:	Pointer to MC portal's I/O object
149c692d5aSBogdan Purcareata  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
159c692d5aSBogdan Purcareata  * @dpbp_id:	DPBP unique ID
169c692d5aSBogdan Purcareata  * @token:	Returned token; use in subsequent API calls
179c692d5aSBogdan Purcareata  *
189c692d5aSBogdan Purcareata  * This function can be used to open a control session for an
199c692d5aSBogdan Purcareata  * already created object; an object may have been declared in
209c692d5aSBogdan Purcareata  * the DPL or by calling the dpbp_create function.
219c692d5aSBogdan Purcareata  * This function returns a unique authentication token,
229c692d5aSBogdan Purcareata  * associated with the specific object ID and the specific MC
239c692d5aSBogdan Purcareata  * portal; this token must be used in all subsequent commands for
249c692d5aSBogdan Purcareata  * this specific object
259c692d5aSBogdan Purcareata  *
269c692d5aSBogdan Purcareata  * Return:	'0' on Success; Error code otherwise.
279c692d5aSBogdan Purcareata  */
dpbp_open(struct fsl_mc_io * mc_io,u32 cmd_flags,int dpbp_id,u16 * token)289c692d5aSBogdan Purcareata int dpbp_open(struct fsl_mc_io *mc_io,
299c692d5aSBogdan Purcareata 	      u32 cmd_flags,
309c692d5aSBogdan Purcareata 	      int dpbp_id,
319c692d5aSBogdan Purcareata 	      u16 *token)
329c692d5aSBogdan Purcareata {
335b04cedeSIoana Ciornei 	struct fsl_mc_command cmd = { 0 };
349c692d5aSBogdan Purcareata 	struct dpbp_cmd_open *cmd_params;
359c692d5aSBogdan Purcareata 	int err;
369c692d5aSBogdan Purcareata 
379c692d5aSBogdan Purcareata 	/* prepare command */
389c692d5aSBogdan Purcareata 	cmd.header = mc_encode_cmd_header(DPBP_CMDID_OPEN,
399c692d5aSBogdan Purcareata 					  cmd_flags, 0);
409c692d5aSBogdan Purcareata 	cmd_params = (struct dpbp_cmd_open *)cmd.params;
419c692d5aSBogdan Purcareata 	cmd_params->dpbp_id = cpu_to_le32(dpbp_id);
429c692d5aSBogdan Purcareata 
439c692d5aSBogdan Purcareata 	/* send command to mc*/
449c692d5aSBogdan Purcareata 	err = mc_send_command(mc_io, &cmd);
459c692d5aSBogdan Purcareata 	if (err)
469c692d5aSBogdan Purcareata 		return err;
479c692d5aSBogdan Purcareata 
489c692d5aSBogdan Purcareata 	/* retrieve response parameters */
499c692d5aSBogdan Purcareata 	*token = mc_cmd_hdr_read_token(&cmd);
509c692d5aSBogdan Purcareata 
519c692d5aSBogdan Purcareata 	return err;
529c692d5aSBogdan Purcareata }
539c692d5aSBogdan Purcareata EXPORT_SYMBOL_GPL(dpbp_open);
549c692d5aSBogdan Purcareata 
559c692d5aSBogdan Purcareata /**
569c692d5aSBogdan Purcareata  * dpbp_close() - Close the control session of the object
579c692d5aSBogdan Purcareata  * @mc_io:	Pointer to MC portal's I/O object
589c692d5aSBogdan Purcareata  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
599c692d5aSBogdan Purcareata  * @token:	Token of DPBP object
609c692d5aSBogdan Purcareata  *
619c692d5aSBogdan Purcareata  * After this function is called, no further operations are
629c692d5aSBogdan Purcareata  * allowed on the object without opening a new control session.
639c692d5aSBogdan Purcareata  *
649c692d5aSBogdan Purcareata  * Return:	'0' on Success; Error code otherwise.
659c692d5aSBogdan Purcareata  */
dpbp_close(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token)669c692d5aSBogdan Purcareata int dpbp_close(struct fsl_mc_io *mc_io,
679c692d5aSBogdan Purcareata 	       u32 cmd_flags,
689c692d5aSBogdan Purcareata 	       u16 token)
699c692d5aSBogdan Purcareata {
705b04cedeSIoana Ciornei 	struct fsl_mc_command cmd = { 0 };
719c692d5aSBogdan Purcareata 
729c692d5aSBogdan Purcareata 	/* prepare command */
739c692d5aSBogdan Purcareata 	cmd.header = mc_encode_cmd_header(DPBP_CMDID_CLOSE, cmd_flags,
749c692d5aSBogdan Purcareata 					  token);
759c692d5aSBogdan Purcareata 
769c692d5aSBogdan Purcareata 	/* send command to mc*/
779c692d5aSBogdan Purcareata 	return mc_send_command(mc_io, &cmd);
789c692d5aSBogdan Purcareata }
799c692d5aSBogdan Purcareata EXPORT_SYMBOL_GPL(dpbp_close);
809c692d5aSBogdan Purcareata 
819c692d5aSBogdan Purcareata /**
829c692d5aSBogdan Purcareata  * dpbp_enable() - Enable the DPBP.
839c692d5aSBogdan Purcareata  * @mc_io:	Pointer to MC portal's I/O object
849c692d5aSBogdan Purcareata  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
859c692d5aSBogdan Purcareata  * @token:	Token of DPBP object
869c692d5aSBogdan Purcareata  *
879c692d5aSBogdan Purcareata  * Return:	'0' on Success; Error code otherwise.
889c692d5aSBogdan Purcareata  */
dpbp_enable(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token)899c692d5aSBogdan Purcareata int dpbp_enable(struct fsl_mc_io *mc_io,
909c692d5aSBogdan Purcareata 		u32 cmd_flags,
919c692d5aSBogdan Purcareata 		u16 token)
929c692d5aSBogdan Purcareata {
935b04cedeSIoana Ciornei 	struct fsl_mc_command cmd = { 0 };
949c692d5aSBogdan Purcareata 
959c692d5aSBogdan Purcareata 	/* prepare command */
969c692d5aSBogdan Purcareata 	cmd.header = mc_encode_cmd_header(DPBP_CMDID_ENABLE, cmd_flags,
979c692d5aSBogdan Purcareata 					  token);
989c692d5aSBogdan Purcareata 
999c692d5aSBogdan Purcareata 	/* send command to mc*/
1009c692d5aSBogdan Purcareata 	return mc_send_command(mc_io, &cmd);
1019c692d5aSBogdan Purcareata }
1029c692d5aSBogdan Purcareata EXPORT_SYMBOL_GPL(dpbp_enable);
1039c692d5aSBogdan Purcareata 
1049c692d5aSBogdan Purcareata /**
1059c692d5aSBogdan Purcareata  * dpbp_disable() - Disable the DPBP.
1069c692d5aSBogdan Purcareata  * @mc_io:	Pointer to MC portal's I/O object
1079c692d5aSBogdan Purcareata  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1089c692d5aSBogdan Purcareata  * @token:	Token of DPBP object
1099c692d5aSBogdan Purcareata  *
1109c692d5aSBogdan Purcareata  * Return:	'0' on Success; Error code otherwise.
1119c692d5aSBogdan Purcareata  */
dpbp_disable(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token)1129c692d5aSBogdan Purcareata int dpbp_disable(struct fsl_mc_io *mc_io,
1139c692d5aSBogdan Purcareata 		 u32 cmd_flags,
1149c692d5aSBogdan Purcareata 		 u16 token)
1159c692d5aSBogdan Purcareata {
1165b04cedeSIoana Ciornei 	struct fsl_mc_command cmd = { 0 };
1179c692d5aSBogdan Purcareata 
1189c692d5aSBogdan Purcareata 	/* prepare command */
1199c692d5aSBogdan Purcareata 	cmd.header = mc_encode_cmd_header(DPBP_CMDID_DISABLE,
1209c692d5aSBogdan Purcareata 					  cmd_flags, token);
1219c692d5aSBogdan Purcareata 
1229c692d5aSBogdan Purcareata 	/* send command to mc*/
1239c692d5aSBogdan Purcareata 	return mc_send_command(mc_io, &cmd);
1249c692d5aSBogdan Purcareata }
1259c692d5aSBogdan Purcareata EXPORT_SYMBOL_GPL(dpbp_disable);
1269c692d5aSBogdan Purcareata 
1279c692d5aSBogdan Purcareata /**
1289c692d5aSBogdan Purcareata  * dpbp_reset() - Reset the DPBP, returns the object to initial state.
1299c692d5aSBogdan Purcareata  * @mc_io:	Pointer to MC portal's I/O object
1309c692d5aSBogdan Purcareata  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1319c692d5aSBogdan Purcareata  * @token:	Token of DPBP object
1329c692d5aSBogdan Purcareata  *
1339c692d5aSBogdan Purcareata  * Return:	'0' on Success; Error code otherwise.
1349c692d5aSBogdan Purcareata  */
dpbp_reset(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token)1359c692d5aSBogdan Purcareata int dpbp_reset(struct fsl_mc_io *mc_io,
1369c692d5aSBogdan Purcareata 	       u32 cmd_flags,
1379c692d5aSBogdan Purcareata 	       u16 token)
1389c692d5aSBogdan Purcareata {
1395b04cedeSIoana Ciornei 	struct fsl_mc_command cmd = { 0 };
1409c692d5aSBogdan Purcareata 
1419c692d5aSBogdan Purcareata 	/* prepare command */
1429c692d5aSBogdan Purcareata 	cmd.header = mc_encode_cmd_header(DPBP_CMDID_RESET,
1439c692d5aSBogdan Purcareata 					  cmd_flags, token);
1449c692d5aSBogdan Purcareata 
1459c692d5aSBogdan Purcareata 	/* send command to mc*/
1469c692d5aSBogdan Purcareata 	return mc_send_command(mc_io, &cmd);
1479c692d5aSBogdan Purcareata }
1489c692d5aSBogdan Purcareata EXPORT_SYMBOL_GPL(dpbp_reset);
1499c692d5aSBogdan Purcareata 
1509c692d5aSBogdan Purcareata /**
1519c692d5aSBogdan Purcareata  * dpbp_get_attributes - Retrieve DPBP attributes.
1529c692d5aSBogdan Purcareata  *
1539c692d5aSBogdan Purcareata  * @mc_io:	Pointer to MC portal's I/O object
1549c692d5aSBogdan Purcareata  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1559c692d5aSBogdan Purcareata  * @token:	Token of DPBP object
1569c692d5aSBogdan Purcareata  * @attr:	Returned object's attributes
1579c692d5aSBogdan Purcareata  *
1589c692d5aSBogdan Purcareata  * Return:	'0' on Success; Error code otherwise.
1599c692d5aSBogdan Purcareata  */
dpbp_get_attributes(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,struct dpbp_attr * attr)1609c692d5aSBogdan Purcareata int dpbp_get_attributes(struct fsl_mc_io *mc_io,
1619c692d5aSBogdan Purcareata 			u32 cmd_flags,
1629c692d5aSBogdan Purcareata 			u16 token,
1639c692d5aSBogdan Purcareata 			struct dpbp_attr *attr)
1649c692d5aSBogdan Purcareata {
1655b04cedeSIoana Ciornei 	struct fsl_mc_command cmd = { 0 };
1669c692d5aSBogdan Purcareata 	struct dpbp_rsp_get_attributes *rsp_params;
1679c692d5aSBogdan Purcareata 	int err;
1689c692d5aSBogdan Purcareata 
1699c692d5aSBogdan Purcareata 	/* prepare command */
1709c692d5aSBogdan Purcareata 	cmd.header = mc_encode_cmd_header(DPBP_CMDID_GET_ATTR,
1719c692d5aSBogdan Purcareata 					  cmd_flags, token);
1729c692d5aSBogdan Purcareata 
1739c692d5aSBogdan Purcareata 	/* send command to mc*/
1749c692d5aSBogdan Purcareata 	err = mc_send_command(mc_io, &cmd);
1759c692d5aSBogdan Purcareata 	if (err)
1769c692d5aSBogdan Purcareata 		return err;
1779c692d5aSBogdan Purcareata 
1789c692d5aSBogdan Purcareata 	/* retrieve response parameters */
1799c692d5aSBogdan Purcareata 	rsp_params = (struct dpbp_rsp_get_attributes *)cmd.params;
1809c692d5aSBogdan Purcareata 	attr->bpid = le16_to_cpu(rsp_params->bpid);
1819c692d5aSBogdan Purcareata 	attr->id = le32_to_cpu(rsp_params->id);
1829c692d5aSBogdan Purcareata 
1839c692d5aSBogdan Purcareata 	return 0;
1849c692d5aSBogdan Purcareata }
1859c692d5aSBogdan Purcareata EXPORT_SYMBOL_GPL(dpbp_get_attributes);
186