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