xref: /openbmc/linux/drivers/bus/fsl-mc/dpmcp.c (revision c13aca79ff3c4af5fd31a5b2743a90eba6e36a26)
16bd067c4SBogdan Purcareata // SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
26bd067c4SBogdan Purcareata /*
36bd067c4SBogdan Purcareata  * Copyright 2013-2016 Freescale Semiconductor Inc.
46bd067c4SBogdan Purcareata  *
56bd067c4SBogdan Purcareata  */
66bd067c4SBogdan Purcareata #include <linux/kernel.h>
76bd067c4SBogdan Purcareata #include <linux/fsl/mc.h>
86bd067c4SBogdan Purcareata 
96bd067c4SBogdan Purcareata #include "fsl-mc-private.h"
106bd067c4SBogdan Purcareata 
116bd067c4SBogdan Purcareata /**
126bd067c4SBogdan Purcareata  * dpmcp_open() - Open a control session for the specified object.
136bd067c4SBogdan Purcareata  * @mc_io:	Pointer to MC portal's I/O object
146bd067c4SBogdan Purcareata  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
156bd067c4SBogdan Purcareata  * @dpmcp_id:	DPMCP unique ID
166bd067c4SBogdan Purcareata  * @token:	Returned token; use in subsequent API calls
176bd067c4SBogdan Purcareata  *
186bd067c4SBogdan Purcareata  * This function can be used to open a control session for an
196bd067c4SBogdan Purcareata  * already created object; an object may have been declared in
206bd067c4SBogdan Purcareata  * the DPL or by calling the dpmcp_create function.
216bd067c4SBogdan Purcareata  * This function returns a unique authentication token,
226bd067c4SBogdan Purcareata  * associated with the specific object ID and the specific MC
236bd067c4SBogdan Purcareata  * portal; this token must be used in all subsequent commands for
246bd067c4SBogdan Purcareata  * this specific object
256bd067c4SBogdan Purcareata  *
266bd067c4SBogdan Purcareata  * Return:	'0' on Success; Error code otherwise.
276bd067c4SBogdan Purcareata  */
dpmcp_open(struct fsl_mc_io * mc_io,u32 cmd_flags,int dpmcp_id,u16 * token)286bd067c4SBogdan Purcareata int dpmcp_open(struct fsl_mc_io *mc_io,
296bd067c4SBogdan Purcareata 	       u32 cmd_flags,
306bd067c4SBogdan Purcareata 	       int dpmcp_id,
316bd067c4SBogdan Purcareata 	       u16 *token)
326bd067c4SBogdan Purcareata {
33*5b04cedeSIoana Ciornei 	struct fsl_mc_command cmd = { 0 };
346bd067c4SBogdan Purcareata 	struct dpmcp_cmd_open *cmd_params;
356bd067c4SBogdan Purcareata 	int err;
366bd067c4SBogdan Purcareata 
376bd067c4SBogdan Purcareata 	/* prepare command */
386bd067c4SBogdan Purcareata 	cmd.header = mc_encode_cmd_header(DPMCP_CMDID_OPEN,
396bd067c4SBogdan Purcareata 					  cmd_flags, 0);
406bd067c4SBogdan Purcareata 	cmd_params = (struct dpmcp_cmd_open *)cmd.params;
416bd067c4SBogdan Purcareata 	cmd_params->dpmcp_id = cpu_to_le32(dpmcp_id);
426bd067c4SBogdan Purcareata 
436bd067c4SBogdan Purcareata 	/* send command to mc*/
446bd067c4SBogdan Purcareata 	err = mc_send_command(mc_io, &cmd);
456bd067c4SBogdan Purcareata 	if (err)
466bd067c4SBogdan Purcareata 		return err;
476bd067c4SBogdan Purcareata 
486bd067c4SBogdan Purcareata 	/* retrieve response parameters */
496bd067c4SBogdan Purcareata 	*token = mc_cmd_hdr_read_token(&cmd);
506bd067c4SBogdan Purcareata 
516bd067c4SBogdan Purcareata 	return err;
526bd067c4SBogdan Purcareata }
536bd067c4SBogdan Purcareata 
546bd067c4SBogdan Purcareata /**
556bd067c4SBogdan Purcareata  * dpmcp_close() - Close the control session of the object
566bd067c4SBogdan Purcareata  * @mc_io:	Pointer to MC portal's I/O object
576bd067c4SBogdan Purcareata  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
586bd067c4SBogdan Purcareata  * @token:	Token of DPMCP object
596bd067c4SBogdan Purcareata  *
606bd067c4SBogdan Purcareata  * After this function is called, no further operations are
616bd067c4SBogdan Purcareata  * allowed on the object without opening a new control session.
626bd067c4SBogdan Purcareata  *
636bd067c4SBogdan Purcareata  * Return:	'0' on Success; Error code otherwise.
646bd067c4SBogdan Purcareata  */
dpmcp_close(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token)656bd067c4SBogdan Purcareata int dpmcp_close(struct fsl_mc_io *mc_io,
666bd067c4SBogdan Purcareata 		u32 cmd_flags,
676bd067c4SBogdan Purcareata 		u16 token)
686bd067c4SBogdan Purcareata {
69*5b04cedeSIoana Ciornei 	struct fsl_mc_command cmd = { 0 };
706bd067c4SBogdan Purcareata 
716bd067c4SBogdan Purcareata 	/* prepare command */
726bd067c4SBogdan Purcareata 	cmd.header = mc_encode_cmd_header(DPMCP_CMDID_CLOSE,
736bd067c4SBogdan Purcareata 					  cmd_flags, token);
746bd067c4SBogdan Purcareata 
756bd067c4SBogdan Purcareata 	/* send command to mc*/
766bd067c4SBogdan Purcareata 	return mc_send_command(mc_io, &cmd);
776bd067c4SBogdan Purcareata }
786bd067c4SBogdan Purcareata 
796bd067c4SBogdan Purcareata /**
806bd067c4SBogdan Purcareata  * dpmcp_reset() - Reset the DPMCP, returns the object to initial state.
816bd067c4SBogdan Purcareata  * @mc_io:	Pointer to MC portal's I/O object
826bd067c4SBogdan Purcareata  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
836bd067c4SBogdan Purcareata  * @token:	Token of DPMCP object
846bd067c4SBogdan Purcareata  *
856bd067c4SBogdan Purcareata  * Return:	'0' on Success; Error code otherwise.
866bd067c4SBogdan Purcareata  */
dpmcp_reset(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token)876bd067c4SBogdan Purcareata int dpmcp_reset(struct fsl_mc_io *mc_io,
886bd067c4SBogdan Purcareata 		u32 cmd_flags,
896bd067c4SBogdan Purcareata 		u16 token)
906bd067c4SBogdan Purcareata {
91*5b04cedeSIoana Ciornei 	struct fsl_mc_command cmd = { 0 };
926bd067c4SBogdan Purcareata 
936bd067c4SBogdan Purcareata 	/* prepare command */
946bd067c4SBogdan Purcareata 	cmd.header = mc_encode_cmd_header(DPMCP_CMDID_RESET,
956bd067c4SBogdan Purcareata 					  cmd_flags, token);
966bd067c4SBogdan Purcareata 
976bd067c4SBogdan Purcareata 	/* send command to mc*/
986bd067c4SBogdan Purcareata 	return mc_send_command(mc_io, &cmd);
996bd067c4SBogdan Purcareata }
100