xref: /dpdk/drivers/bus/fslmc/mc/dprc.c (revision f5145e1d4aa4c1aea3bb6580ba1b3b1b694d81bd)
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