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