xref: /rk3399_rockchip-uboot/drivers/net/fsl-mc/dprc.c (revision a2a55e518f81900ab1538656e5df8d2759ccb1fb)
1*a2a55e51SPrabhakar Kushwaha /*
2*a2a55e51SPrabhakar Kushwaha  * Freescale Layerscape MC I/O wrapper
3*a2a55e51SPrabhakar Kushwaha  *
4*a2a55e51SPrabhakar Kushwaha  * Copyright (C) 2013-2015 Freescale Semiconductor, Inc.
5*a2a55e51SPrabhakar Kushwaha  * Author: German Rivera <German.Rivera@freescale.com>
6*a2a55e51SPrabhakar Kushwaha  *
7*a2a55e51SPrabhakar Kushwaha  * SPDX-License-Identifier:	GPL-2.0+
8*a2a55e51SPrabhakar Kushwaha  */
9*a2a55e51SPrabhakar Kushwaha 
10*a2a55e51SPrabhakar Kushwaha #include <fsl-mc/fsl_mc_sys.h>
11*a2a55e51SPrabhakar Kushwaha #include <fsl-mc/fsl_mc_cmd.h>
12*a2a55e51SPrabhakar Kushwaha #include <fsl-mc/fsl_dprc.h>
13*a2a55e51SPrabhakar Kushwaha 
14*a2a55e51SPrabhakar Kushwaha int dprc_get_container_id(struct fsl_mc_io *mc_io, int *container_id)
15*a2a55e51SPrabhakar Kushwaha {
16*a2a55e51SPrabhakar Kushwaha 	struct mc_command cmd = { 0 };
17*a2a55e51SPrabhakar Kushwaha 	int err;
18*a2a55e51SPrabhakar Kushwaha 
19*a2a55e51SPrabhakar Kushwaha 	/* prepare command */
20*a2a55e51SPrabhakar Kushwaha 	cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_CONT_ID,
21*a2a55e51SPrabhakar Kushwaha 					  MC_CMD_PRI_LOW, 0);
22*a2a55e51SPrabhakar Kushwaha 
23*a2a55e51SPrabhakar Kushwaha 	/* send command to mc*/
24*a2a55e51SPrabhakar Kushwaha 	err = mc_send_command(mc_io, &cmd);
25*a2a55e51SPrabhakar Kushwaha 	if (err)
26*a2a55e51SPrabhakar Kushwaha 		return err;
27*a2a55e51SPrabhakar Kushwaha 
28*a2a55e51SPrabhakar Kushwaha 	/* retrieve response parameters */
29*a2a55e51SPrabhakar Kushwaha 	DPRC_RSP_GET_CONTAINER_ID(cmd, *container_id);
30*a2a55e51SPrabhakar Kushwaha 
31*a2a55e51SPrabhakar Kushwaha 	return 0;
32*a2a55e51SPrabhakar Kushwaha }
33*a2a55e51SPrabhakar Kushwaha 
34*a2a55e51SPrabhakar Kushwaha int dprc_open(struct fsl_mc_io *mc_io, int container_id, uint16_t *token)
35*a2a55e51SPrabhakar Kushwaha {
36*a2a55e51SPrabhakar Kushwaha 	struct mc_command cmd = { 0 };
37*a2a55e51SPrabhakar Kushwaha 	int err;
38*a2a55e51SPrabhakar Kushwaha 
39*a2a55e51SPrabhakar Kushwaha 	/* prepare command */
40*a2a55e51SPrabhakar Kushwaha 	cmd.header = mc_encode_cmd_header(DPRC_CMDID_OPEN, MC_CMD_PRI_LOW,
41*a2a55e51SPrabhakar Kushwaha 					  0);
42*a2a55e51SPrabhakar Kushwaha 	DPRC_CMD_OPEN(cmd, container_id);
43*a2a55e51SPrabhakar Kushwaha 
44*a2a55e51SPrabhakar Kushwaha 	/* send command to mc*/
45*a2a55e51SPrabhakar Kushwaha 	err = mc_send_command(mc_io, &cmd);
46*a2a55e51SPrabhakar Kushwaha 	if (err)
47*a2a55e51SPrabhakar Kushwaha 		return err;
48*a2a55e51SPrabhakar Kushwaha 
49*a2a55e51SPrabhakar Kushwaha 	/* retrieve response parameters */
50*a2a55e51SPrabhakar Kushwaha 	*token = MC_CMD_HDR_READ_TOKEN(cmd.header);
51*a2a55e51SPrabhakar Kushwaha 
52*a2a55e51SPrabhakar Kushwaha 	return 0;
53*a2a55e51SPrabhakar Kushwaha }
54*a2a55e51SPrabhakar Kushwaha 
55*a2a55e51SPrabhakar Kushwaha int dprc_close(struct fsl_mc_io *mc_io, uint16_t token)
56*a2a55e51SPrabhakar Kushwaha {
57*a2a55e51SPrabhakar Kushwaha 	struct mc_command cmd = { 0 };
58*a2a55e51SPrabhakar Kushwaha 
59*a2a55e51SPrabhakar Kushwaha 	/* prepare command */
60*a2a55e51SPrabhakar Kushwaha 	cmd.header = mc_encode_cmd_header(DPRC_CMDID_CLOSE, MC_CMD_PRI_HIGH,
61*a2a55e51SPrabhakar Kushwaha 					  token);
62*a2a55e51SPrabhakar Kushwaha 
63*a2a55e51SPrabhakar Kushwaha 	/* send command to mc*/
64*a2a55e51SPrabhakar Kushwaha 	return mc_send_command(mc_io, &cmd);
65*a2a55e51SPrabhakar Kushwaha }
66*a2a55e51SPrabhakar Kushwaha 
67*a2a55e51SPrabhakar Kushwaha int dprc_reset_container(struct fsl_mc_io *mc_io,
68*a2a55e51SPrabhakar Kushwaha 			 uint16_t token,
69*a2a55e51SPrabhakar Kushwaha 			 int child_container_id)
70*a2a55e51SPrabhakar Kushwaha {
71*a2a55e51SPrabhakar Kushwaha 	struct mc_command cmd = { 0 };
72*a2a55e51SPrabhakar Kushwaha 
73*a2a55e51SPrabhakar Kushwaha 	/* prepare command */
74*a2a55e51SPrabhakar Kushwaha 	cmd.header = mc_encode_cmd_header(DPRC_CMDID_RESET_CONT,
75*a2a55e51SPrabhakar Kushwaha 					  MC_CMD_PRI_LOW, token);
76*a2a55e51SPrabhakar Kushwaha 	DPRC_CMD_RESET_CONTAINER(cmd, child_container_id);
77*a2a55e51SPrabhakar Kushwaha 
78*a2a55e51SPrabhakar Kushwaha 	/* send command to mc*/
79*a2a55e51SPrabhakar Kushwaha 	return mc_send_command(mc_io, &cmd);
80*a2a55e51SPrabhakar Kushwaha }
81*a2a55e51SPrabhakar Kushwaha 
82*a2a55e51SPrabhakar Kushwaha int dprc_get_attributes(struct fsl_mc_io *mc_io,
83*a2a55e51SPrabhakar Kushwaha 			uint16_t token,
84*a2a55e51SPrabhakar Kushwaha 			struct dprc_attributes *attr)
85*a2a55e51SPrabhakar Kushwaha {
86*a2a55e51SPrabhakar Kushwaha 	struct mc_command cmd = { 0 };
87*a2a55e51SPrabhakar Kushwaha 	int err;
88*a2a55e51SPrabhakar Kushwaha 
89*a2a55e51SPrabhakar Kushwaha 	/* prepare command */
90*a2a55e51SPrabhakar Kushwaha 	cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_ATTR,
91*a2a55e51SPrabhakar Kushwaha 					  MC_CMD_PRI_LOW,
92*a2a55e51SPrabhakar Kushwaha 					  token);
93*a2a55e51SPrabhakar Kushwaha 
94*a2a55e51SPrabhakar Kushwaha 	/* send command to mc*/
95*a2a55e51SPrabhakar Kushwaha 	err = mc_send_command(mc_io, &cmd);
96*a2a55e51SPrabhakar Kushwaha 	if (err)
97*a2a55e51SPrabhakar Kushwaha 		return err;
98*a2a55e51SPrabhakar Kushwaha 
99*a2a55e51SPrabhakar Kushwaha 	/* retrieve response parameters */
100*a2a55e51SPrabhakar Kushwaha 	DPRC_RSP_GET_ATTRIBUTES(cmd, attr);
101*a2a55e51SPrabhakar Kushwaha 
102*a2a55e51SPrabhakar Kushwaha 	return 0;
103*a2a55e51SPrabhakar Kushwaha }
104*a2a55e51SPrabhakar Kushwaha 
105*a2a55e51SPrabhakar Kushwaha int dprc_get_obj_count(struct fsl_mc_io *mc_io, uint16_t token, int *obj_count)
106*a2a55e51SPrabhakar Kushwaha {
107*a2a55e51SPrabhakar Kushwaha 	struct mc_command cmd = { 0 };
108*a2a55e51SPrabhakar Kushwaha 	int err;
109*a2a55e51SPrabhakar Kushwaha 
110*a2a55e51SPrabhakar Kushwaha 	/* prepare command */
111*a2a55e51SPrabhakar Kushwaha 	cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_OBJ_COUNT,
112*a2a55e51SPrabhakar Kushwaha 					  MC_CMD_PRI_LOW, token);
113*a2a55e51SPrabhakar Kushwaha 
114*a2a55e51SPrabhakar Kushwaha 	/* send command to mc*/
115*a2a55e51SPrabhakar Kushwaha 	err = mc_send_command(mc_io, &cmd);
116*a2a55e51SPrabhakar Kushwaha 	if (err)
117*a2a55e51SPrabhakar Kushwaha 		return err;
118*a2a55e51SPrabhakar Kushwaha 
119*a2a55e51SPrabhakar Kushwaha 	/* retrieve response parameters */
120*a2a55e51SPrabhakar Kushwaha 	DPRC_RSP_GET_OBJ_COUNT(cmd, *obj_count);
121*a2a55e51SPrabhakar Kushwaha 
122*a2a55e51SPrabhakar Kushwaha 	return 0;
123*a2a55e51SPrabhakar Kushwaha }
124*a2a55e51SPrabhakar Kushwaha 
125*a2a55e51SPrabhakar Kushwaha int dprc_get_obj(struct fsl_mc_io *mc_io,
126*a2a55e51SPrabhakar Kushwaha 		 uint16_t token,
127*a2a55e51SPrabhakar Kushwaha 		 int obj_index,
128*a2a55e51SPrabhakar Kushwaha 		 struct dprc_obj_desc *obj_desc)
129*a2a55e51SPrabhakar Kushwaha {
130*a2a55e51SPrabhakar Kushwaha 	struct mc_command cmd = { 0 };
131*a2a55e51SPrabhakar Kushwaha 	int err;
132*a2a55e51SPrabhakar Kushwaha 
133*a2a55e51SPrabhakar Kushwaha 	/* prepare command */
134*a2a55e51SPrabhakar Kushwaha 	cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_OBJ,
135*a2a55e51SPrabhakar Kushwaha 					  MC_CMD_PRI_LOW,
136*a2a55e51SPrabhakar Kushwaha 					  token);
137*a2a55e51SPrabhakar Kushwaha 	DPRC_CMD_GET_OBJ(cmd, obj_index);
138*a2a55e51SPrabhakar Kushwaha 
139*a2a55e51SPrabhakar Kushwaha 	/* send command to mc*/
140*a2a55e51SPrabhakar Kushwaha 	err = mc_send_command(mc_io, &cmd);
141*a2a55e51SPrabhakar Kushwaha 	if (err)
142*a2a55e51SPrabhakar Kushwaha 		return err;
143*a2a55e51SPrabhakar Kushwaha 
144*a2a55e51SPrabhakar Kushwaha 	/* retrieve response parameters */
145*a2a55e51SPrabhakar Kushwaha 	DPRC_RSP_GET_OBJ(cmd, obj_desc);
146*a2a55e51SPrabhakar Kushwaha 
147*a2a55e51SPrabhakar Kushwaha 	return 0;
148*a2a55e51SPrabhakar Kushwaha }
149*a2a55e51SPrabhakar Kushwaha 
150*a2a55e51SPrabhakar Kushwaha int dprc_get_res_count(struct fsl_mc_io *mc_io,
151*a2a55e51SPrabhakar Kushwaha 		       uint16_t token,
152*a2a55e51SPrabhakar Kushwaha 		       char *type,
153*a2a55e51SPrabhakar Kushwaha 		       int *res_count)
154*a2a55e51SPrabhakar Kushwaha {
155*a2a55e51SPrabhakar Kushwaha 	struct mc_command cmd = { 0 };
156*a2a55e51SPrabhakar Kushwaha 	int err;
157*a2a55e51SPrabhakar Kushwaha 
158*a2a55e51SPrabhakar Kushwaha 	*res_count = 0;
159*a2a55e51SPrabhakar Kushwaha 
160*a2a55e51SPrabhakar Kushwaha 	/* prepare command */
161*a2a55e51SPrabhakar Kushwaha 	cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_RES_COUNT,
162*a2a55e51SPrabhakar Kushwaha 					  MC_CMD_PRI_LOW, token);
163*a2a55e51SPrabhakar Kushwaha 	DPRC_CMD_GET_RES_COUNT(cmd, type);
164*a2a55e51SPrabhakar Kushwaha 
165*a2a55e51SPrabhakar Kushwaha 	/* send command to mc*/
166*a2a55e51SPrabhakar Kushwaha 	err = mc_send_command(mc_io, &cmd);
167*a2a55e51SPrabhakar Kushwaha 	if (err)
168*a2a55e51SPrabhakar Kushwaha 		return err;
169*a2a55e51SPrabhakar Kushwaha 
170*a2a55e51SPrabhakar Kushwaha 	/* retrieve response parameters */
171*a2a55e51SPrabhakar Kushwaha 	DPRC_RSP_GET_RES_COUNT(cmd, *res_count);
172*a2a55e51SPrabhakar Kushwaha 
173*a2a55e51SPrabhakar Kushwaha 	return 0;
174*a2a55e51SPrabhakar Kushwaha }
175*a2a55e51SPrabhakar Kushwaha 
176*a2a55e51SPrabhakar Kushwaha int dprc_get_res_ids(struct fsl_mc_io *mc_io,
177*a2a55e51SPrabhakar Kushwaha 		     uint16_t token,
178*a2a55e51SPrabhakar Kushwaha 		     char *type,
179*a2a55e51SPrabhakar Kushwaha 		     struct dprc_res_ids_range_desc *range_desc)
180*a2a55e51SPrabhakar Kushwaha {
181*a2a55e51SPrabhakar Kushwaha 	struct mc_command cmd = { 0 };
182*a2a55e51SPrabhakar Kushwaha 	int err;
183*a2a55e51SPrabhakar Kushwaha 
184*a2a55e51SPrabhakar Kushwaha 	/* prepare command */
185*a2a55e51SPrabhakar Kushwaha 	cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_RES_IDS,
186*a2a55e51SPrabhakar Kushwaha 					  MC_CMD_PRI_LOW, token);
187*a2a55e51SPrabhakar Kushwaha 	DPRC_CMD_GET_RES_IDS(cmd, range_desc, type);
188*a2a55e51SPrabhakar Kushwaha 
189*a2a55e51SPrabhakar Kushwaha 	/* send command to mc*/
190*a2a55e51SPrabhakar Kushwaha 	err = mc_send_command(mc_io, &cmd);
191*a2a55e51SPrabhakar Kushwaha 	if (err)
192*a2a55e51SPrabhakar Kushwaha 		return err;
193*a2a55e51SPrabhakar Kushwaha 
194*a2a55e51SPrabhakar Kushwaha 	/* retrieve response parameters */
195*a2a55e51SPrabhakar Kushwaha 	DPRC_RSP_GET_RES_IDS(cmd, range_desc);
196*a2a55e51SPrabhakar Kushwaha 
197*a2a55e51SPrabhakar Kushwaha 	return 0;
198*a2a55e51SPrabhakar Kushwaha }
199*a2a55e51SPrabhakar Kushwaha 
200*a2a55e51SPrabhakar Kushwaha int dprc_get_obj_region(struct fsl_mc_io *mc_io,
201*a2a55e51SPrabhakar Kushwaha 			uint16_t token,
202*a2a55e51SPrabhakar Kushwaha 			char *obj_type,
203*a2a55e51SPrabhakar Kushwaha 			int obj_id,
204*a2a55e51SPrabhakar Kushwaha 			uint8_t region_index,
205*a2a55e51SPrabhakar Kushwaha 			struct dprc_region_desc *region_desc)
206*a2a55e51SPrabhakar Kushwaha {
207*a2a55e51SPrabhakar Kushwaha 	struct mc_command cmd = { 0 };
208*a2a55e51SPrabhakar Kushwaha 	int err;
209*a2a55e51SPrabhakar Kushwaha 
210*a2a55e51SPrabhakar Kushwaha 	/* prepare command */
211*a2a55e51SPrabhakar Kushwaha 	cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_OBJ_REG,
212*a2a55e51SPrabhakar Kushwaha 					  MC_CMD_PRI_LOW, token);
213*a2a55e51SPrabhakar Kushwaha 	DPRC_CMD_GET_OBJ_REGION(cmd, obj_type, obj_id, region_index);
214*a2a55e51SPrabhakar Kushwaha 
215*a2a55e51SPrabhakar Kushwaha 	/* send command to mc*/
216*a2a55e51SPrabhakar Kushwaha 	err = mc_send_command(mc_io, &cmd);
217*a2a55e51SPrabhakar Kushwaha 	if (err)
218*a2a55e51SPrabhakar Kushwaha 		return err;
219*a2a55e51SPrabhakar Kushwaha 
220*a2a55e51SPrabhakar Kushwaha 	/* retrieve response parameters */
221*a2a55e51SPrabhakar Kushwaha 	DPRC_RSP_GET_OBJ_REGION(cmd, region_desc);
222*a2a55e51SPrabhakar Kushwaha 
223*a2a55e51SPrabhakar Kushwaha 	return 0;
224*a2a55e51SPrabhakar Kushwaha }
225*a2a55e51SPrabhakar Kushwaha 
226*a2a55e51SPrabhakar Kushwaha int dprc_connect(struct fsl_mc_io *mc_io,
227*a2a55e51SPrabhakar Kushwaha 		 uint16_t token,
228*a2a55e51SPrabhakar Kushwaha 		 const struct dprc_endpoint *endpoint1,
229*a2a55e51SPrabhakar Kushwaha 		 const struct dprc_endpoint *endpoint2)
230*a2a55e51SPrabhakar Kushwaha {
231*a2a55e51SPrabhakar Kushwaha 	struct mc_command cmd = { 0 };
232*a2a55e51SPrabhakar Kushwaha 
233*a2a55e51SPrabhakar Kushwaha 	/* prepare command */
234*a2a55e51SPrabhakar Kushwaha 	cmd.header = mc_encode_cmd_header(DPRC_CMDID_CONNECT,
235*a2a55e51SPrabhakar Kushwaha 					  MC_CMD_PRI_LOW,
236*a2a55e51SPrabhakar Kushwaha 					  token);
237*a2a55e51SPrabhakar Kushwaha 	DPRC_CMD_CONNECT(cmd, endpoint1, endpoint2);
238*a2a55e51SPrabhakar Kushwaha 
239*a2a55e51SPrabhakar Kushwaha 	/* send command to mc*/
240*a2a55e51SPrabhakar Kushwaha 	return mc_send_command(mc_io, &cmd);
241*a2a55e51SPrabhakar Kushwaha }
242*a2a55e51SPrabhakar Kushwaha 
243*a2a55e51SPrabhakar Kushwaha int dprc_disconnect(struct fsl_mc_io *mc_io,
244*a2a55e51SPrabhakar Kushwaha 		    uint16_t token,
245*a2a55e51SPrabhakar Kushwaha 		    const struct dprc_endpoint *endpoint)
246*a2a55e51SPrabhakar Kushwaha {
247*a2a55e51SPrabhakar Kushwaha 	struct mc_command cmd = { 0 };
248*a2a55e51SPrabhakar Kushwaha 
249*a2a55e51SPrabhakar Kushwaha 	/* prepare command */
250*a2a55e51SPrabhakar Kushwaha 	cmd.header = mc_encode_cmd_header(DPRC_CMDID_DISCONNECT,
251*a2a55e51SPrabhakar Kushwaha 					  MC_CMD_PRI_LOW,
252*a2a55e51SPrabhakar Kushwaha 					  token);
253*a2a55e51SPrabhakar Kushwaha 	DPRC_CMD_DISCONNECT(cmd, endpoint);
254*a2a55e51SPrabhakar Kushwaha 
255*a2a55e51SPrabhakar Kushwaha 	/* send command to mc*/
256*a2a55e51SPrabhakar Kushwaha 	return mc_send_command(mc_io, &cmd);
257*a2a55e51SPrabhakar Kushwaha }
258*a2a55e51SPrabhakar Kushwaha 
259*a2a55e51SPrabhakar Kushwaha int dprc_get_connection(struct fsl_mc_io *mc_io,
260*a2a55e51SPrabhakar Kushwaha 			uint16_t token,
261*a2a55e51SPrabhakar Kushwaha 					const struct dprc_endpoint *endpoint1,
262*a2a55e51SPrabhakar Kushwaha 					struct dprc_endpoint *endpoint2,
263*a2a55e51SPrabhakar Kushwaha 					int *state)
264*a2a55e51SPrabhakar Kushwaha {
265*a2a55e51SPrabhakar Kushwaha 	struct mc_command cmd = { 0 };
266*a2a55e51SPrabhakar Kushwaha 	int err;
267*a2a55e51SPrabhakar Kushwaha 
268*a2a55e51SPrabhakar Kushwaha 	/* prepare command */
269*a2a55e51SPrabhakar Kushwaha 	cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_CONNECTION,
270*a2a55e51SPrabhakar Kushwaha 					  MC_CMD_PRI_LOW,
271*a2a55e51SPrabhakar Kushwaha 					  token);
272*a2a55e51SPrabhakar Kushwaha 	DPRC_CMD_GET_CONNECTION(cmd, endpoint1);
273*a2a55e51SPrabhakar Kushwaha 
274*a2a55e51SPrabhakar Kushwaha 	/* send command to mc*/
275*a2a55e51SPrabhakar Kushwaha 	err = mc_send_command(mc_io, &cmd);
276*a2a55e51SPrabhakar Kushwaha 	if (err)
277*a2a55e51SPrabhakar Kushwaha 		return err;
278*a2a55e51SPrabhakar Kushwaha 
279*a2a55e51SPrabhakar Kushwaha 	/* retrieve response parameters */
280*a2a55e51SPrabhakar Kushwaha 	DPRC_RSP_GET_CONNECTION(cmd, endpoint2, *state);
281*a2a55e51SPrabhakar Kushwaha 
282*a2a55e51SPrabhakar Kushwaha 	return 0;
283*a2a55e51SPrabhakar Kushwaha }
284