1131a75b6SHemant Agrawal /* SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0)
292c28aa4SNipun Gupta *
3131a75b6SHemant Agrawal * Copyright 2013-2016 Freescale Semiconductor Inc.
4*f513f620SSachin Saxena * Copyright 2017-2019 NXP
592c28aa4SNipun Gupta *
692c28aa4SNipun Gupta */
792c28aa4SNipun Gupta #include <fsl_mc_sys.h>
892c28aa4SNipun Gupta #include <fsl_mc_cmd.h>
992c28aa4SNipun Gupta #include <fsl_dpcon.h>
1092c28aa4SNipun Gupta #include <fsl_dpcon_cmd.h>
1192c28aa4SNipun Gupta
1216bbc98aSShreyansh Jain /**
1316bbc98aSShreyansh Jain * dpcon_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 * @dpcon_id: DPCON 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 dpcon_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 */
dpcon_open(struct fsl_mc_io * mc_io,uint32_t cmd_flags,int dpcon_id,uint16_t * token)2992c28aa4SNipun Gupta int dpcon_open(struct fsl_mc_io *mc_io,
3092c28aa4SNipun Gupta uint32_t cmd_flags,
3192c28aa4SNipun Gupta int dpcon_id,
3292c28aa4SNipun Gupta uint16_t *token)
3392c28aa4SNipun Gupta {
3492c28aa4SNipun Gupta struct mc_command cmd = { 0 };
3516bbc98aSShreyansh Jain struct dpcon_cmd_open *dpcon_cmd;
3692c28aa4SNipun Gupta int err;
3792c28aa4SNipun Gupta
3892c28aa4SNipun Gupta /* prepare command */
3992c28aa4SNipun Gupta cmd.header = mc_encode_cmd_header(DPCON_CMDID_OPEN,
4092c28aa4SNipun Gupta cmd_flags,
4192c28aa4SNipun Gupta 0);
4216bbc98aSShreyansh Jain dpcon_cmd = (struct dpcon_cmd_open *)cmd.params;
4316bbc98aSShreyansh Jain dpcon_cmd->dpcon_id = cpu_to_le32(dpcon_id);
4492c28aa4SNipun Gupta
4592c28aa4SNipun Gupta /* send command to mc*/
4692c28aa4SNipun Gupta err = mc_send_command(mc_io, &cmd);
4792c28aa4SNipun Gupta if (err)
4892c28aa4SNipun Gupta return err;
4992c28aa4SNipun Gupta
5092c28aa4SNipun Gupta /* retrieve response parameters */
5116bbc98aSShreyansh Jain *token = mc_cmd_hdr_read_token(&cmd);
5292c28aa4SNipun Gupta
5392c28aa4SNipun Gupta return 0;
5492c28aa4SNipun Gupta }
5592c28aa4SNipun Gupta
5616bbc98aSShreyansh Jain /**
5716bbc98aSShreyansh Jain * dpcon_close() - Close the control session of the object
5816bbc98aSShreyansh Jain * @mc_io: Pointer to MC portal's I/O object
5916bbc98aSShreyansh Jain * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
6016bbc98aSShreyansh Jain * @token: Token of DPCON object
6116bbc98aSShreyansh Jain *
6216bbc98aSShreyansh Jain * After this function is called, no further operations are
6316bbc98aSShreyansh Jain * allowed on the object without opening a new control session.
6416bbc98aSShreyansh Jain *
6516bbc98aSShreyansh Jain * Return: '0' on Success; Error code otherwise.
6616bbc98aSShreyansh Jain */
dpcon_close(struct fsl_mc_io * mc_io,uint32_t cmd_flags,uint16_t token)6792c28aa4SNipun Gupta int dpcon_close(struct fsl_mc_io *mc_io,
6892c28aa4SNipun Gupta uint32_t cmd_flags,
6992c28aa4SNipun Gupta uint16_t token)
7092c28aa4SNipun Gupta {
7192c28aa4SNipun Gupta struct mc_command cmd = { 0 };
7292c28aa4SNipun Gupta
7392c28aa4SNipun Gupta /* prepare command */
7492c28aa4SNipun Gupta cmd.header = mc_encode_cmd_header(DPCON_CMDID_CLOSE,
7592c28aa4SNipun Gupta cmd_flags,
7692c28aa4SNipun Gupta token);
7792c28aa4SNipun Gupta
7892c28aa4SNipun Gupta /* send command to mc*/
7992c28aa4SNipun Gupta return mc_send_command(mc_io, &cmd);
8092c28aa4SNipun Gupta }
8192c28aa4SNipun Gupta
8216bbc98aSShreyansh Jain /**
8316bbc98aSShreyansh Jain * dpcon_create() - Create the DPCON object.
8416bbc98aSShreyansh Jain * @mc_io: Pointer to MC portal's I/O object
8516bbc98aSShreyansh Jain * @dprc_token: Parent container token; '0' for default container
8616bbc98aSShreyansh Jain * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
8716bbc98aSShreyansh Jain * @cfg: Configuration structure
8816bbc98aSShreyansh Jain * @obj_id: Returned object id; use in subsequent API calls
8916bbc98aSShreyansh Jain *
9016bbc98aSShreyansh Jain * Create the DPCON object, allocate required resources and
9116bbc98aSShreyansh Jain * perform required initialization.
9216bbc98aSShreyansh Jain *
9316bbc98aSShreyansh Jain * The object can be created either by declaring it in the
9416bbc98aSShreyansh Jain * DPL file, or by calling this function.
9516bbc98aSShreyansh Jain *
9616bbc98aSShreyansh Jain * This function accepts an authentication token of a parent
9716bbc98aSShreyansh Jain * container that this object should be assigned to and returns
9816bbc98aSShreyansh Jain * an object id. This object_id will be used in all subsequent calls to
9916bbc98aSShreyansh Jain * this specific object.
10016bbc98aSShreyansh Jain *
10116bbc98aSShreyansh Jain * Return: '0' on Success; Error code otherwise.
10216bbc98aSShreyansh Jain */
dpcon_create(struct fsl_mc_io * mc_io,uint16_t dprc_token,uint32_t cmd_flags,const struct dpcon_cfg * cfg,uint32_t * obj_id)10392c28aa4SNipun Gupta int dpcon_create(struct fsl_mc_io *mc_io,
10492c28aa4SNipun Gupta uint16_t dprc_token,
10592c28aa4SNipun Gupta uint32_t cmd_flags,
10692c28aa4SNipun Gupta const struct dpcon_cfg *cfg,
10792c28aa4SNipun Gupta uint32_t *obj_id)
10892c28aa4SNipun Gupta {
10916bbc98aSShreyansh Jain struct dpcon_cmd_create *dpcon_cmd;
11092c28aa4SNipun Gupta struct mc_command cmd = { 0 };
11192c28aa4SNipun Gupta int err;
11292c28aa4SNipun Gupta
11392c28aa4SNipun Gupta /* prepare command */
11492c28aa4SNipun Gupta cmd.header = mc_encode_cmd_header(DPCON_CMDID_CREATE,
11592c28aa4SNipun Gupta cmd_flags,
11692c28aa4SNipun Gupta dprc_token);
11716bbc98aSShreyansh Jain dpcon_cmd = (struct dpcon_cmd_create *)cmd.params;
11816bbc98aSShreyansh Jain dpcon_cmd->num_priorities = cfg->num_priorities;
11992c28aa4SNipun Gupta
12092c28aa4SNipun Gupta /* send command to mc*/
12192c28aa4SNipun Gupta err = mc_send_command(mc_io, &cmd);
12292c28aa4SNipun Gupta if (err)
12392c28aa4SNipun Gupta return err;
12492c28aa4SNipun Gupta
12592c28aa4SNipun Gupta /* retrieve response parameters */
12616bbc98aSShreyansh Jain *obj_id = mc_cmd_read_object_id(&cmd);
12792c28aa4SNipun Gupta
12892c28aa4SNipun Gupta return 0;
12992c28aa4SNipun Gupta }
13092c28aa4SNipun Gupta
13116bbc98aSShreyansh Jain /**
13216bbc98aSShreyansh Jain * dpcon_destroy() - Destroy the DPCON object and release all its resources.
13316bbc98aSShreyansh Jain * @mc_io: Pointer to MC portal's I/O object
13416bbc98aSShreyansh Jain * @dprc_token: Parent container token; '0' for default container
13516bbc98aSShreyansh Jain * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
13616bbc98aSShreyansh Jain * @obj_id: ID of DPCON object
13716bbc98aSShreyansh Jain *
13816bbc98aSShreyansh Jain * Return: '0' on Success; error code otherwise.
13916bbc98aSShreyansh Jain */
dpcon_destroy(struct fsl_mc_io * mc_io,uint16_t dprc_token,uint32_t cmd_flags,uint32_t obj_id)14092c28aa4SNipun Gupta int dpcon_destroy(struct fsl_mc_io *mc_io,
14192c28aa4SNipun Gupta uint16_t dprc_token,
14292c28aa4SNipun Gupta uint32_t cmd_flags,
14316bbc98aSShreyansh Jain uint32_t obj_id)
14492c28aa4SNipun Gupta {
14516bbc98aSShreyansh Jain struct dpcon_cmd_destroy *cmd_params;
14692c28aa4SNipun Gupta struct mc_command cmd = { 0 };
14792c28aa4SNipun Gupta
14892c28aa4SNipun Gupta /* prepare command */
14992c28aa4SNipun Gupta cmd.header = mc_encode_cmd_header(DPCON_CMDID_DESTROY,
15092c28aa4SNipun Gupta cmd_flags,
15192c28aa4SNipun Gupta dprc_token);
15216bbc98aSShreyansh Jain cmd_params = (struct dpcon_cmd_destroy *)cmd.params;
15316bbc98aSShreyansh Jain cmd_params->object_id = cpu_to_le32(obj_id);
15416bbc98aSShreyansh Jain
15592c28aa4SNipun Gupta /* send command to mc*/
15692c28aa4SNipun Gupta return mc_send_command(mc_io, &cmd);
15792c28aa4SNipun Gupta }
15892c28aa4SNipun Gupta
15916bbc98aSShreyansh Jain /**
16016bbc98aSShreyansh Jain * dpcon_enable() - Enable the DPCON
16116bbc98aSShreyansh Jain * @mc_io: Pointer to MC portal's I/O object
16216bbc98aSShreyansh Jain * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
16316bbc98aSShreyansh Jain * @token: Token of DPCON object
16416bbc98aSShreyansh Jain *
16516bbc98aSShreyansh Jain * Return: '0' on Success; Error code otherwise
16616bbc98aSShreyansh Jain */
dpcon_enable(struct fsl_mc_io * mc_io,uint32_t cmd_flags,uint16_t token)16792c28aa4SNipun Gupta int dpcon_enable(struct fsl_mc_io *mc_io,
16892c28aa4SNipun Gupta uint32_t cmd_flags,
16992c28aa4SNipun Gupta uint16_t token)
17092c28aa4SNipun Gupta {
17192c28aa4SNipun Gupta struct mc_command cmd = { 0 };
17292c28aa4SNipun Gupta
17392c28aa4SNipun Gupta /* prepare command */
17492c28aa4SNipun Gupta cmd.header = mc_encode_cmd_header(DPCON_CMDID_ENABLE,
17592c28aa4SNipun Gupta cmd_flags,
17692c28aa4SNipun Gupta token);
17792c28aa4SNipun Gupta
17892c28aa4SNipun Gupta /* send command to mc*/
17992c28aa4SNipun Gupta return mc_send_command(mc_io, &cmd);
18092c28aa4SNipun Gupta }
18192c28aa4SNipun Gupta
18216bbc98aSShreyansh Jain /**
18316bbc98aSShreyansh Jain * dpcon_disable() - Disable the DPCON
18416bbc98aSShreyansh Jain * @mc_io: Pointer to MC portal's I/O object
18516bbc98aSShreyansh Jain * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
18616bbc98aSShreyansh Jain * @token: Token of DPCON object
18716bbc98aSShreyansh Jain *
18816bbc98aSShreyansh Jain * Return: '0' on Success; Error code otherwise
18916bbc98aSShreyansh Jain */
dpcon_disable(struct fsl_mc_io * mc_io,uint32_t cmd_flags,uint16_t token)19092c28aa4SNipun Gupta int dpcon_disable(struct fsl_mc_io *mc_io,
19192c28aa4SNipun Gupta uint32_t cmd_flags,
19292c28aa4SNipun Gupta uint16_t token)
19392c28aa4SNipun Gupta {
19492c28aa4SNipun Gupta struct mc_command cmd = { 0 };
19592c28aa4SNipun Gupta
19692c28aa4SNipun Gupta /* prepare command */
19792c28aa4SNipun Gupta cmd.header = mc_encode_cmd_header(DPCON_CMDID_DISABLE,
19892c28aa4SNipun Gupta cmd_flags,
19992c28aa4SNipun Gupta token);
20092c28aa4SNipun Gupta
20192c28aa4SNipun Gupta /* send command to mc*/
20292c28aa4SNipun Gupta return mc_send_command(mc_io, &cmd);
20392c28aa4SNipun Gupta }
20492c28aa4SNipun Gupta
20516bbc98aSShreyansh Jain /**
20616bbc98aSShreyansh Jain * dpcon_is_enabled() - Check if the DPCON is enabled.
20716bbc98aSShreyansh Jain * @mc_io: Pointer to MC portal's I/O object
20816bbc98aSShreyansh Jain * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
20916bbc98aSShreyansh Jain * @token: Token of DPCON object
21016bbc98aSShreyansh Jain * @en: Returns '1' if object is enabled; '0' otherwise
21116bbc98aSShreyansh Jain *
21216bbc98aSShreyansh Jain * Return: '0' on Success; Error code otherwise.
21316bbc98aSShreyansh Jain */
dpcon_is_enabled(struct fsl_mc_io * mc_io,uint32_t cmd_flags,uint16_t token,int * en)21492c28aa4SNipun Gupta int dpcon_is_enabled(struct fsl_mc_io *mc_io,
21592c28aa4SNipun Gupta uint32_t cmd_flags,
21692c28aa4SNipun Gupta uint16_t token,
21792c28aa4SNipun Gupta int *en)
21892c28aa4SNipun Gupta {
21916bbc98aSShreyansh Jain struct dpcon_rsp_is_enabled *dpcon_rsp;
22092c28aa4SNipun Gupta struct mc_command cmd = { 0 };
22192c28aa4SNipun Gupta int err;
22216bbc98aSShreyansh Jain
22392c28aa4SNipun Gupta /* prepare command */
22492c28aa4SNipun Gupta cmd.header = mc_encode_cmd_header(DPCON_CMDID_IS_ENABLED,
22592c28aa4SNipun Gupta cmd_flags,
22692c28aa4SNipun Gupta token);
22792c28aa4SNipun Gupta
22892c28aa4SNipun Gupta /* send command to mc*/
22992c28aa4SNipun Gupta err = mc_send_command(mc_io, &cmd);
23092c28aa4SNipun Gupta if (err)
23192c28aa4SNipun Gupta return err;
23292c28aa4SNipun Gupta
23392c28aa4SNipun Gupta /* retrieve response parameters */
23416bbc98aSShreyansh Jain dpcon_rsp = (struct dpcon_rsp_is_enabled *)cmd.params;
23516bbc98aSShreyansh Jain *en = dpcon_rsp->enabled & DPCON_ENABLE;
23692c28aa4SNipun Gupta
23792c28aa4SNipun Gupta return 0;
23892c28aa4SNipun Gupta }
23992c28aa4SNipun Gupta
24016bbc98aSShreyansh Jain /**
24116bbc98aSShreyansh Jain * dpcon_reset() - Reset the DPCON, returns the object to initial state.
24216bbc98aSShreyansh Jain * @mc_io: Pointer to MC portal's I/O object
24316bbc98aSShreyansh Jain * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
24416bbc98aSShreyansh Jain * @token: Token of DPCON object
24516bbc98aSShreyansh Jain *
24616bbc98aSShreyansh Jain * Return: '0' on Success; Error code otherwise.
24716bbc98aSShreyansh Jain */
dpcon_reset(struct fsl_mc_io * mc_io,uint32_t cmd_flags,uint16_t token)24892c28aa4SNipun Gupta int dpcon_reset(struct fsl_mc_io *mc_io,
24992c28aa4SNipun Gupta uint32_t cmd_flags,
25092c28aa4SNipun Gupta uint16_t token)
25192c28aa4SNipun Gupta {
25292c28aa4SNipun Gupta struct mc_command cmd = { 0 };
25392c28aa4SNipun Gupta
25492c28aa4SNipun Gupta /* prepare command */
25592c28aa4SNipun Gupta cmd.header = mc_encode_cmd_header(DPCON_CMDID_RESET,
25692c28aa4SNipun Gupta cmd_flags, token);
25792c28aa4SNipun Gupta
25892c28aa4SNipun Gupta /* send command to mc*/
25992c28aa4SNipun Gupta return mc_send_command(mc_io, &cmd);
26092c28aa4SNipun Gupta }
26192c28aa4SNipun Gupta
26216bbc98aSShreyansh Jain /**
26316bbc98aSShreyansh Jain * dpcon_get_attributes() - Retrieve DPCON attributes.
26416bbc98aSShreyansh Jain * @mc_io: Pointer to MC portal's I/O object
26516bbc98aSShreyansh Jain * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
26616bbc98aSShreyansh Jain * @token: Token of DPCON object
26716bbc98aSShreyansh Jain * @attr: Object's attributes
26816bbc98aSShreyansh Jain *
26916bbc98aSShreyansh Jain * Return: '0' on Success; Error code otherwise.
27016bbc98aSShreyansh Jain */
dpcon_get_attributes(struct fsl_mc_io * mc_io,uint32_t cmd_flags,uint16_t token,struct dpcon_attr * attr)27192c28aa4SNipun Gupta int dpcon_get_attributes(struct fsl_mc_io *mc_io,
27292c28aa4SNipun Gupta uint32_t cmd_flags,
27392c28aa4SNipun Gupta uint16_t token,
27492c28aa4SNipun Gupta struct dpcon_attr *attr)
27592c28aa4SNipun Gupta {
27616bbc98aSShreyansh Jain struct dpcon_rsp_get_attr *dpcon_rsp;
27792c28aa4SNipun Gupta struct mc_command cmd = { 0 };
27892c28aa4SNipun Gupta int err;
27992c28aa4SNipun Gupta
28092c28aa4SNipun Gupta /* prepare command */
28192c28aa4SNipun Gupta cmd.header = mc_encode_cmd_header(DPCON_CMDID_GET_ATTR,
28292c28aa4SNipun Gupta cmd_flags,
28392c28aa4SNipun Gupta token);
28492c28aa4SNipun Gupta
28592c28aa4SNipun Gupta /* send command to mc*/
28692c28aa4SNipun Gupta err = mc_send_command(mc_io, &cmd);
28792c28aa4SNipun Gupta if (err)
28892c28aa4SNipun Gupta return err;
28992c28aa4SNipun Gupta
29092c28aa4SNipun Gupta /* retrieve response parameters */
29116bbc98aSShreyansh Jain dpcon_rsp = (struct dpcon_rsp_get_attr *)cmd.params;
29216bbc98aSShreyansh Jain attr->id = le32_to_cpu(dpcon_rsp->id);
29316bbc98aSShreyansh Jain attr->qbman_ch_id = le16_to_cpu(dpcon_rsp->qbman_ch_id);
29416bbc98aSShreyansh Jain attr->num_priorities = dpcon_rsp->num_priorities;
29592c28aa4SNipun Gupta
29692c28aa4SNipun Gupta return 0;
29792c28aa4SNipun Gupta }
29892c28aa4SNipun Gupta
29916bbc98aSShreyansh Jain /**
30016bbc98aSShreyansh Jain * dpcon_get_api_version - Get Data Path Concentrator API version
30116bbc98aSShreyansh Jain * @mc_io: Pointer to MC portal's DPCON object
30216bbc98aSShreyansh Jain * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
30316bbc98aSShreyansh Jain * @major_ver: Major version of DPCON API
30416bbc98aSShreyansh Jain * @minor_ver: Minor version of DPCON API
30516bbc98aSShreyansh Jain *
30616bbc98aSShreyansh Jain * Return: '0' on Success; Error code otherwise
30716bbc98aSShreyansh Jain */
dpcon_get_api_version(struct fsl_mc_io * mc_io,uint32_t cmd_flags,uint16_t * major_ver,uint16_t * minor_ver)30892c28aa4SNipun Gupta int dpcon_get_api_version(struct fsl_mc_io *mc_io,
30992c28aa4SNipun Gupta uint32_t cmd_flags,
31092c28aa4SNipun Gupta uint16_t *major_ver,
31192c28aa4SNipun Gupta uint16_t *minor_ver)
31292c28aa4SNipun Gupta {
31316bbc98aSShreyansh Jain struct dpcon_rsp_get_api_version *rsp_params;
31492c28aa4SNipun Gupta struct mc_command cmd = { 0 };
31592c28aa4SNipun Gupta int err;
31692c28aa4SNipun Gupta
31716bbc98aSShreyansh Jain /* prepare command */
31892c28aa4SNipun Gupta cmd.header = mc_encode_cmd_header(DPCON_CMDID_GET_API_VERSION,
31916bbc98aSShreyansh Jain cmd_flags, 0);
32092c28aa4SNipun Gupta
32116bbc98aSShreyansh Jain /* send command to mc */
32292c28aa4SNipun Gupta err = mc_send_command(mc_io, &cmd);
32392c28aa4SNipun Gupta if (err)
32492c28aa4SNipun Gupta return err;
32592c28aa4SNipun Gupta
32616bbc98aSShreyansh Jain /* retrieve response parameters */
32716bbc98aSShreyansh Jain rsp_params = (struct dpcon_rsp_get_api_version *)cmd.params;
32816bbc98aSShreyansh Jain *major_ver = le16_to_cpu(rsp_params->major);
32916bbc98aSShreyansh Jain *minor_ver = le16_to_cpu(rsp_params->minor);
33092c28aa4SNipun Gupta
33192c28aa4SNipun Gupta return 0;
33292c28aa4SNipun Gupta }
333