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