1 /* Copyright 2013-2015 Freescale Semiconductor Inc.
2  *
3  * Redistribution and use in source and binary forms, with or without
4  * modification, are permitted provided that the following conditions are met:
5  * * Redistributions of source code must retain the above copyright
6  * notice, this list of conditions and the following disclaimer.
7  * * Redistributions in binary form must reproduce the above copyright
8  * notice, this list of conditions and the following disclaimer in the
9  * documentation and/or other materials provided with the distribution.
10  * * Neither the name of the above-listed copyright holders nor the
11  * names of any contributors may be used to endorse or promote products
12  * derived from this software without specific prior written permission.
13  *
14  *
15  * ALTERNATIVELY, this software may be distributed under the terms of the
16  * GNU General Public License ("GPL") as published by the Free Software
17  * Foundation, either version 2 of that License or (at your option) any
18  * later version.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
24  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30  * POSSIBILITY OF SUCH DAMAGE.
31  */
32 #include "../include/mc-sys.h"
33 #include "../include/mc-cmd.h"
34 #include "dpmcp.h"
35 #include "dpmcp-cmd.h"
36 
dpmcp_open(struct fsl_mc_io * mc_io,int dpmcp_id,uint16_t * token)37 int dpmcp_open(struct fsl_mc_io *mc_io, int dpmcp_id, uint16_t *token)
38 {
39 	struct mc_command cmd = { 0 };
40 	int err;
41 
42 	/* prepare command */
43 	cmd.header = mc_encode_cmd_header(DPMCP_CMDID_OPEN,
44 					  MC_CMD_PRI_LOW, 0);
45 	cmd.params[0] |= mc_enc(0, 32, dpmcp_id);
46 
47 	/* send command to mc*/
48 	err = mc_send_command(mc_io, &cmd);
49 	if (err)
50 		return err;
51 
52 	/* retrieve response parameters */
53 	*token = MC_CMD_HDR_READ_TOKEN(cmd.header);
54 
55 	return err;
56 }
57 
dpmcp_close(struct fsl_mc_io * mc_io,uint16_t token)58 int dpmcp_close(struct fsl_mc_io *mc_io, uint16_t token)
59 {
60 	struct mc_command cmd = { 0 };
61 
62 	/* prepare command */
63 	cmd.header = mc_encode_cmd_header(DPMCP_CMDID_CLOSE, MC_CMD_PRI_HIGH,
64 					  token);
65 
66 	/* send command to mc*/
67 	return mc_send_command(mc_io, &cmd);
68 }
69 
dpmcp_create(struct fsl_mc_io * mc_io,const struct dpmcp_cfg * cfg,uint16_t * token)70 int dpmcp_create(struct fsl_mc_io *mc_io,
71 		 const struct dpmcp_cfg *cfg,
72 		uint16_t *token)
73 {
74 	struct mc_command cmd = { 0 };
75 	int err;
76 
77 	/* prepare command */
78 	cmd.header = mc_encode_cmd_header(DPMCP_CMDID_CREATE,
79 					  MC_CMD_PRI_LOW, 0);
80 	cmd.params[0] |= mc_enc(0, 32, cfg->portal_id);
81 
82 	/* send command to mc*/
83 	err = mc_send_command(mc_io, &cmd);
84 	if (err)
85 		return err;
86 
87 	/* retrieve response parameters */
88 	*token = MC_CMD_HDR_READ_TOKEN(cmd.header);
89 
90 	return 0;
91 }
92 
dpmcp_destroy(struct fsl_mc_io * mc_io,uint16_t token)93 int dpmcp_destroy(struct fsl_mc_io *mc_io, uint16_t token)
94 {
95 	struct mc_command cmd = { 0 };
96 
97 	/* prepare command */
98 	cmd.header = mc_encode_cmd_header(DPMCP_CMDID_DESTROY,
99 					  MC_CMD_PRI_LOW, token);
100 
101 	/* send command to mc*/
102 	return mc_send_command(mc_io, &cmd);
103 }
104 
dpmcp_reset(struct fsl_mc_io * mc_io,uint16_t token)105 int dpmcp_reset(struct fsl_mc_io *mc_io, uint16_t token)
106 {
107 	struct mc_command cmd = { 0 };
108 
109 	/* prepare command */
110 	cmd.header = mc_encode_cmd_header(DPMCP_CMDID_RESET,
111 					  MC_CMD_PRI_LOW, token);
112 
113 	/* send command to mc*/
114 	return mc_send_command(mc_io, &cmd);
115 }
116 
dpmcp_set_irq(struct fsl_mc_io * mc_io,uint16_t token,uint8_t irq_index,uint64_t irq_addr,uint32_t irq_val,int user_irq_id)117 int dpmcp_set_irq(struct fsl_mc_io *mc_io,
118 		  uint16_t token,
119 		 uint8_t irq_index,
120 		 uint64_t irq_addr,
121 		 uint32_t irq_val,
122 		 int user_irq_id)
123 {
124 	struct mc_command cmd = { 0 };
125 
126 	/* prepare command */
127 	cmd.header = mc_encode_cmd_header(DPMCP_CMDID_SET_IRQ,
128 					  MC_CMD_PRI_LOW, token);
129 	cmd.params[0] |= mc_enc(0, 8, irq_index);
130 	cmd.params[0] |= mc_enc(32, 32, irq_val);
131 	cmd.params[1] |= mc_enc(0, 64, irq_addr);
132 	cmd.params[2] |= mc_enc(0, 32, user_irq_id);
133 
134 	/* send command to mc*/
135 	return mc_send_command(mc_io, &cmd);
136 }
137 
dpmcp_get_irq(struct fsl_mc_io * mc_io,uint16_t token,uint8_t irq_index,int * type,uint64_t * irq_addr,uint32_t * irq_val,int * user_irq_id)138 int dpmcp_get_irq(struct fsl_mc_io *mc_io,
139 		  uint16_t token,
140 		 uint8_t irq_index,
141 		 int *type,
142 		 uint64_t *irq_addr,
143 		 uint32_t *irq_val,
144 		 int *user_irq_id)
145 {
146 	struct mc_command cmd = { 0 };
147 	int err;
148 
149 	/* prepare command */
150 	cmd.header = mc_encode_cmd_header(DPMCP_CMDID_GET_IRQ,
151 					  MC_CMD_PRI_LOW, token);
152 	cmd.params[0] |= mc_enc(32, 8, irq_index);
153 
154 	/* send command to mc*/
155 	err = mc_send_command(mc_io, &cmd);
156 	if (err)
157 		return err;
158 
159 	/* retrieve response parameters */
160 	*irq_val = (uint32_t)mc_dec(cmd.params[0], 0, 32);
161 	*irq_addr = (uint64_t)mc_dec(cmd.params[1], 0, 64);
162 	*user_irq_id = (int)mc_dec(cmd.params[2], 0, 32);
163 	*type = (int)mc_dec(cmd.params[2], 32, 32);
164 	return 0;
165 }
166 
dpmcp_set_irq_enable(struct fsl_mc_io * mc_io,uint16_t token,uint8_t irq_index,uint8_t en)167 int dpmcp_set_irq_enable(struct fsl_mc_io *mc_io,
168 			 uint16_t token,
169 			uint8_t irq_index,
170 			uint8_t en)
171 {
172 	struct mc_command cmd = { 0 };
173 
174 	/* prepare command */
175 	cmd.header = mc_encode_cmd_header(DPMCP_CMDID_SET_IRQ_ENABLE,
176 					  MC_CMD_PRI_LOW, token);
177 	cmd.params[0] |= mc_enc(0, 8, en);
178 	cmd.params[0] |= mc_enc(32, 8, irq_index);
179 
180 	/* send command to mc*/
181 	return mc_send_command(mc_io, &cmd);
182 }
183 
dpmcp_get_irq_enable(struct fsl_mc_io * mc_io,uint16_t token,uint8_t irq_index,uint8_t * en)184 int dpmcp_get_irq_enable(struct fsl_mc_io *mc_io,
185 			 uint16_t token,
186 			uint8_t irq_index,
187 			uint8_t *en)
188 {
189 	struct mc_command cmd = { 0 };
190 	int err;
191 
192 	/* prepare command */
193 	cmd.header = mc_encode_cmd_header(DPMCP_CMDID_GET_IRQ_ENABLE,
194 					  MC_CMD_PRI_LOW, token);
195 	cmd.params[0] |= mc_enc(32, 8, irq_index);
196 
197 	/* send command to mc*/
198 	err = mc_send_command(mc_io, &cmd);
199 	if (err)
200 		return err;
201 
202 	/* retrieve response parameters */
203 	*en = (uint8_t)mc_dec(cmd.params[0], 0, 8);
204 	return 0;
205 }
206 
dpmcp_set_irq_mask(struct fsl_mc_io * mc_io,uint16_t token,uint8_t irq_index,uint32_t mask)207 int dpmcp_set_irq_mask(struct fsl_mc_io *mc_io,
208 		       uint16_t token,
209 		      uint8_t irq_index,
210 		      uint32_t mask)
211 {
212 	struct mc_command cmd = { 0 };
213 
214 	/* prepare command */
215 	cmd.header = mc_encode_cmd_header(DPMCP_CMDID_SET_IRQ_MASK,
216 					  MC_CMD_PRI_LOW, token);
217 	cmd.params[0] |= mc_enc(0, 32, mask);
218 	cmd.params[0] |= mc_enc(32, 8, irq_index);
219 
220 	/* send command to mc*/
221 	return mc_send_command(mc_io, &cmd);
222 }
223 
dpmcp_get_irq_mask(struct fsl_mc_io * mc_io,uint16_t token,uint8_t irq_index,uint32_t * mask)224 int dpmcp_get_irq_mask(struct fsl_mc_io *mc_io,
225 		       uint16_t token,
226 		      uint8_t irq_index,
227 		      uint32_t *mask)
228 {
229 	struct mc_command cmd = { 0 };
230 	int err;
231 
232 	/* prepare command */
233 	cmd.header = mc_encode_cmd_header(DPMCP_CMDID_GET_IRQ_MASK,
234 					  MC_CMD_PRI_LOW, token);
235 	cmd.params[0] |= mc_enc(32, 8, irq_index);
236 
237 	/* send command to mc*/
238 	err = mc_send_command(mc_io, &cmd);
239 	if (err)
240 		return err;
241 
242 	/* retrieve response parameters */
243 	*mask = (uint32_t)mc_dec(cmd.params[0], 0, 32);
244 	return 0;
245 }
246 
dpmcp_get_irq_status(struct fsl_mc_io * mc_io,uint16_t token,uint8_t irq_index,uint32_t * status)247 int dpmcp_get_irq_status(struct fsl_mc_io *mc_io,
248 			 uint16_t token,
249 			uint8_t irq_index,
250 			uint32_t *status)
251 {
252 	struct mc_command cmd = { 0 };
253 	int err;
254 
255 	/* prepare command */
256 	cmd.header = mc_encode_cmd_header(DPMCP_CMDID_GET_IRQ_STATUS,
257 					  MC_CMD_PRI_LOW, token);
258 	cmd.params[0] |= mc_enc(32, 8, irq_index);
259 
260 	/* send command to mc*/
261 	err = mc_send_command(mc_io, &cmd);
262 	if (err)
263 		return err;
264 
265 	/* retrieve response parameters */
266 	*status = (uint32_t)mc_dec(cmd.params[0], 0, 32);
267 	return 0;
268 }
269 
dpmcp_clear_irq_status(struct fsl_mc_io * mc_io,uint16_t token,uint8_t irq_index,uint32_t status)270 int dpmcp_clear_irq_status(struct fsl_mc_io *mc_io,
271 			   uint16_t token,
272 			  uint8_t irq_index,
273 			  uint32_t status)
274 {
275 	struct mc_command cmd = { 0 };
276 
277 	/* prepare command */
278 	cmd.header = mc_encode_cmd_header(DPMCP_CMDID_CLEAR_IRQ_STATUS,
279 					  MC_CMD_PRI_LOW, token);
280 	cmd.params[0] |= mc_enc(0, 32, status);
281 	cmd.params[0] |= mc_enc(32, 8, irq_index);
282 
283 	/* send command to mc*/
284 	return mc_send_command(mc_io, &cmd);
285 }
286 
dpmcp_get_attributes(struct fsl_mc_io * mc_io,uint16_t token,struct dpmcp_attr * attr)287 int dpmcp_get_attributes(struct fsl_mc_io *mc_io,
288 			 uint16_t token,
289 			struct dpmcp_attr *attr)
290 {
291 	struct mc_command cmd = { 0 };
292 	int err;
293 
294 	/* prepare command */
295 	cmd.header = mc_encode_cmd_header(DPMCP_CMDID_GET_ATTR,
296 					  MC_CMD_PRI_LOW, token);
297 
298 	/* send command to mc*/
299 	err = mc_send_command(mc_io, &cmd);
300 	if (err)
301 		return err;
302 
303 	/* retrieve response parameters */
304 	attr->id = (int)mc_dec(cmd.params[0], 32, 32);
305 	attr->version.major = (uint16_t)mc_dec(cmd.params[1], 0, 16);
306 	attr->version.minor = (uint16_t)mc_dec(cmd.params[1], 16, 16);
307 	return 0;
308 }
309