1*f5145e1dSJun Yang /* SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0)
2*f5145e1dSJun Yang *
3*f5145e1dSJun Yang * Copyright 2013-2016 Freescale Semiconductor Inc.
4*f5145e1dSJun Yang * Copyright 2016-2021 NXP
5*f5145e1dSJun Yang *
6*f5145e1dSJun Yang */
7*f5145e1dSJun Yang #include <fsl_mc_sys.h>
8*f5145e1dSJun Yang #include <fsl_mc_cmd.h>
9*f5145e1dSJun Yang #include <fsl_dprc.h>
10*f5145e1dSJun Yang #include <fsl_dprc_cmd.h>
11*f5145e1dSJun Yang
12*f5145e1dSJun Yang /** @addtogroup dprc
13*f5145e1dSJun Yang * @{
14*f5145e1dSJun Yang */
15*f5145e1dSJun Yang
16*f5145e1dSJun Yang /**
17*f5145e1dSJun Yang * dprc_open() - Open DPRC object for use
18*f5145e1dSJun Yang * @mc_io: Pointer to MC portal's I/O object
19*f5145e1dSJun Yang * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
20*f5145e1dSJun Yang * @container_id: Container ID to open
21*f5145e1dSJun Yang * @token: Returned token of DPRC object
22*f5145e1dSJun Yang *
23*f5145e1dSJun Yang * Return: '0' on Success; Error code otherwise.
24*f5145e1dSJun Yang *
25*f5145e1dSJun Yang * @warning Required before any operation on the object.
26*f5145e1dSJun Yang */
dprc_open(struct fsl_mc_io * mc_io,uint32_t cmd_flags,int container_id,uint16_t * token)27*f5145e1dSJun Yang int dprc_open(struct fsl_mc_io *mc_io,
28*f5145e1dSJun Yang uint32_t cmd_flags,
29*f5145e1dSJun Yang int container_id,
30*f5145e1dSJun Yang uint16_t *token)
31*f5145e1dSJun Yang {
32*f5145e1dSJun Yang struct mc_command cmd = { 0 };
33*f5145e1dSJun Yang struct dprc_cmd_open *cmd_params;
34*f5145e1dSJun Yang int err;
35*f5145e1dSJun Yang
36*f5145e1dSJun Yang /* prepare command */
37*f5145e1dSJun Yang cmd.header = mc_encode_cmd_header(DPRC_CMDID_OPEN, cmd_flags,
38*f5145e1dSJun Yang 0);
39*f5145e1dSJun Yang cmd_params = (struct dprc_cmd_open *)cmd.params;
40*f5145e1dSJun Yang cmd_params->container_id = cpu_to_le32(container_id);
41*f5145e1dSJun Yang
42*f5145e1dSJun Yang /* send command to mc*/
43*f5145e1dSJun Yang err = mc_send_command(mc_io, &cmd);
44*f5145e1dSJun Yang if (err)
45*f5145e1dSJun Yang return err;
46*f5145e1dSJun Yang
47*f5145e1dSJun Yang /* retrieve response parameters */
48*f5145e1dSJun Yang *token = mc_cmd_hdr_read_token(&cmd);
49*f5145e1dSJun Yang
50*f5145e1dSJun Yang return 0;
51*f5145e1dSJun Yang }
52*f5145e1dSJun Yang
53*f5145e1dSJun Yang /**
54*f5145e1dSJun Yang * dprc_close() - Close the control session of the object
55*f5145e1dSJun Yang * @mc_io: Pointer to MC portal's I/O object
56*f5145e1dSJun Yang * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
57*f5145e1dSJun Yang * @token: Token of DPRC object
58*f5145e1dSJun Yang *
59*f5145e1dSJun Yang * After this function is called, no further operations are
60*f5145e1dSJun Yang * allowed on the object without opening a new control session.
61*f5145e1dSJun Yang *
62*f5145e1dSJun Yang * Return: '0' on Success; Error code otherwise.
63*f5145e1dSJun Yang */
dprc_close(struct fsl_mc_io * mc_io,uint32_t cmd_flags,uint16_t token)64*f5145e1dSJun Yang int dprc_close(struct fsl_mc_io *mc_io,
65*f5145e1dSJun Yang uint32_t cmd_flags,
66*f5145e1dSJun Yang uint16_t token)
67*f5145e1dSJun Yang {
68*f5145e1dSJun Yang struct mc_command cmd = { 0 };
69*f5145e1dSJun Yang
70*f5145e1dSJun Yang /* prepare command */
71*f5145e1dSJun Yang cmd.header = mc_encode_cmd_header(DPRC_CMDID_CLOSE, cmd_flags,
72*f5145e1dSJun Yang token);
73*f5145e1dSJun Yang
74*f5145e1dSJun Yang /* send command to mc*/
75*f5145e1dSJun Yang return mc_send_command(mc_io, &cmd);
76*f5145e1dSJun Yang }
77*f5145e1dSJun Yang
78*f5145e1dSJun Yang /**
79*f5145e1dSJun Yang * dprc_get_connection() - Get connected endpoint and link status if connection
80*f5145e1dSJun Yang * exists.
81*f5145e1dSJun Yang * @mc_io: Pointer to MC portal's I/O object
82*f5145e1dSJun Yang * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
83*f5145e1dSJun Yang * @token: Token of DPRC object
84*f5145e1dSJun Yang * @endpoint1: Endpoint 1 configuration parameters
85*f5145e1dSJun Yang * @endpoint2: Returned endpoint 2 configuration parameters
86*f5145e1dSJun Yang * @state: Returned link state:
87*f5145e1dSJun Yang * 1 - link is up;
88*f5145e1dSJun Yang * 0 - link is down;
89*f5145e1dSJun Yang * -1 - no connection (endpoint2 information is irrelevant)
90*f5145e1dSJun Yang *
91*f5145e1dSJun Yang * Return: '0' on Success; -ENAVAIL if connection does not exist.
92*f5145e1dSJun Yang */
dprc_get_connection(struct fsl_mc_io * mc_io,uint32_t cmd_flags,uint16_t token,const struct dprc_endpoint * endpoint1,struct dprc_endpoint * endpoint2,int * state)93*f5145e1dSJun Yang int dprc_get_connection(struct fsl_mc_io *mc_io,
94*f5145e1dSJun Yang uint32_t cmd_flags,
95*f5145e1dSJun Yang uint16_t token,
96*f5145e1dSJun Yang const struct dprc_endpoint *endpoint1,
97*f5145e1dSJun Yang struct dprc_endpoint *endpoint2,
98*f5145e1dSJun Yang int *state)
99*f5145e1dSJun Yang {
100*f5145e1dSJun Yang struct mc_command cmd = { 0 };
101*f5145e1dSJun Yang struct dprc_cmd_get_connection *cmd_params;
102*f5145e1dSJun Yang struct dprc_rsp_get_connection *rsp_params;
103*f5145e1dSJun Yang int err, i;
104*f5145e1dSJun Yang
105*f5145e1dSJun Yang /* prepare command */
106*f5145e1dSJun Yang cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_CONNECTION,
107*f5145e1dSJun Yang cmd_flags,
108*f5145e1dSJun Yang token);
109*f5145e1dSJun Yang cmd_params = (struct dprc_cmd_get_connection *)cmd.params;
110*f5145e1dSJun Yang cmd_params->ep1_id = cpu_to_le32(endpoint1->id);
111*f5145e1dSJun Yang cmd_params->ep1_interface_id = cpu_to_le16(endpoint1->if_id);
112*f5145e1dSJun Yang for (i = 0; i < 16; i++)
113*f5145e1dSJun Yang cmd_params->ep1_type[i] = endpoint1->type[i];
114*f5145e1dSJun Yang
115*f5145e1dSJun Yang /* send command to mc*/
116*f5145e1dSJun Yang err = mc_send_command(mc_io, &cmd);
117*f5145e1dSJun Yang if (err)
118*f5145e1dSJun Yang return err;
119*f5145e1dSJun Yang
120*f5145e1dSJun Yang /* retrieve response parameters */
121*f5145e1dSJun Yang rsp_params = (struct dprc_rsp_get_connection *)cmd.params;
122*f5145e1dSJun Yang endpoint2->id = le32_to_cpu(rsp_params->ep2_id);
123*f5145e1dSJun Yang endpoint2->if_id = le16_to_cpu(rsp_params->ep2_interface_id);
124*f5145e1dSJun Yang *state = le32_to_cpu(rsp_params->state);
125*f5145e1dSJun Yang for (i = 0; i < 16; i++)
126*f5145e1dSJun Yang endpoint2->type[i] = rsp_params->ep2_type[i];
127*f5145e1dSJun Yang
128*f5145e1dSJun Yang return 0;
129*f5145e1dSJun Yang }
130