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 {
33*5b04cedeSIoana 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 {
70*5b04cedeSIoana 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 {
93*5b04cedeSIoana 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 {
116*5b04cedeSIoana 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 {
139*5b04cedeSIoana 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 {
165*5b04cedeSIoana 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