1/* Copyright 2013-2014 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 "../include/dprc.h"
35#include "dprc-cmd.h"
36
37/**
38 * dprc_open() - Open DPRC object for use
39 * @mc_io:	Pointer to MC portal's I/O object
40 * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
41 * @container_id: Container ID to open
42 * @token:	Returned token of DPRC object
43 *
44 * Return:	'0' on Success; Error code otherwise.
45 *
46 * @warning	Required before any operation on the object.
47 */
48int dprc_open(struct fsl_mc_io *mc_io,
49	      u32 cmd_flags,
50	      int container_id,
51	      u16 *token)
52{
53	struct mc_command cmd = { 0 };
54	int err;
55
56	/* prepare command */
57	cmd.header = mc_encode_cmd_header(DPRC_CMDID_OPEN, cmd_flags,
58					  0);
59	cmd.params[0] |= mc_enc(0, 32, container_id);
60
61	/* send command to mc*/
62	err = mc_send_command(mc_io, &cmd);
63	if (err)
64		return err;
65
66	/* retrieve response parameters */
67	*token = MC_CMD_HDR_READ_TOKEN(cmd.header);
68
69	return 0;
70}
71EXPORT_SYMBOL(dprc_open);
72
73/**
74 * dprc_close() - Close the control session of the object
75 * @mc_io:	Pointer to MC portal's I/O object
76 * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
77 * @token:	Token of DPRC object
78 *
79 * After this function is called, no further operations are
80 * allowed on the object without opening a new control session.
81 *
82 * Return:	'0' on Success; Error code otherwise.
83 */
84int dprc_close(struct fsl_mc_io *mc_io,
85	       u32 cmd_flags,
86	       u16 token)
87{
88	struct mc_command cmd = { 0 };
89
90	/* prepare command */
91	cmd.header = mc_encode_cmd_header(DPRC_CMDID_CLOSE, cmd_flags,
92					  token);
93
94	/* send command to mc*/
95	return mc_send_command(mc_io, &cmd);
96}
97EXPORT_SYMBOL(dprc_close);
98
99/**
100 * dprc_create_container() - Create child container
101 * @mc_io:	Pointer to MC portal's I/O object
102 * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
103 * @token:	Token of DPRC object
104 * @cfg:	Child container configuration
105 * @child_container_id:	Returned child container ID
106 * @child_portal_offset: Returned child portal offset from MC portal base
107 *
108 * Return:	'0' on Success; Error code otherwise.
109 */
110int dprc_create_container(struct fsl_mc_io *mc_io,
111			  u32 cmd_flags,
112			  u16 token,
113			  struct dprc_cfg *cfg,
114			  int *child_container_id,
115			  u64 *child_portal_offset)
116{
117	struct mc_command cmd = { 0 };
118	int err;
119
120	/* prepare command */
121	cmd.params[0] |= mc_enc(32, 16, cfg->icid);
122	cmd.params[0] |= mc_enc(0, 32, cfg->options);
123	cmd.params[1] |= mc_enc(32, 32, cfg->portal_id);
124	cmd.params[2] |= mc_enc(0, 8, cfg->label[0]);
125	cmd.params[2] |= mc_enc(8, 8, cfg->label[1]);
126	cmd.params[2] |= mc_enc(16, 8, cfg->label[2]);
127	cmd.params[2] |= mc_enc(24, 8, cfg->label[3]);
128	cmd.params[2] |= mc_enc(32, 8, cfg->label[4]);
129	cmd.params[2] |= mc_enc(40, 8, cfg->label[5]);
130	cmd.params[2] |= mc_enc(48, 8, cfg->label[6]);
131	cmd.params[2] |= mc_enc(56, 8, cfg->label[7]);
132	cmd.params[3] |= mc_enc(0, 8, cfg->label[8]);
133	cmd.params[3] |= mc_enc(8, 8, cfg->label[9]);
134	cmd.params[3] |= mc_enc(16, 8, cfg->label[10]);
135	cmd.params[3] |= mc_enc(24, 8, cfg->label[11]);
136	cmd.params[3] |= mc_enc(32, 8, cfg->label[12]);
137	cmd.params[3] |= mc_enc(40, 8, cfg->label[13]);
138	cmd.params[3] |= mc_enc(48, 8, cfg->label[14]);
139	cmd.params[3] |= mc_enc(56, 8, cfg->label[15]);
140
141	cmd.header = mc_encode_cmd_header(DPRC_CMDID_CREATE_CONT,
142					  cmd_flags, token);
143
144	/* send command to mc*/
145	err = mc_send_command(mc_io, &cmd);
146	if (err)
147		return err;
148
149	/* retrieve response parameters */
150	*child_container_id = mc_dec(cmd.params[1], 0, 32);
151	*child_portal_offset = mc_dec(cmd.params[2], 0, 64);
152
153	return 0;
154}
155
156/**
157 * dprc_destroy_container() - Destroy child container.
158 * @mc_io:	Pointer to MC portal's I/O object
159 * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
160 * @token:	Token of DPRC object
161 * @child_container_id:	ID of the container to destroy
162 *
163 * This function terminates the child container, so following this call the
164 * child container ID becomes invalid.
165 *
166 * Notes:
167 * - All resources and objects of the destroyed container are returned to the
168 * parent container or destroyed if were created be the destroyed container.
169 * - This function destroy all the child containers of the specified
170 *   container prior to destroying the container itself.
171 *
172 * warning: Only the parent container is allowed to destroy a child policy
173 *		Container 0 can't be destroyed
174 *
175 * Return:	'0' on Success; Error code otherwise.
176 *
177 */
178int dprc_destroy_container(struct fsl_mc_io *mc_io,
179			   u32 cmd_flags,
180			   u16 token,
181			   int child_container_id)
182{
183	struct mc_command cmd = { 0 };
184
185	/* prepare command */
186	cmd.header = mc_encode_cmd_header(DPRC_CMDID_DESTROY_CONT,
187					  cmd_flags, token);
188	cmd.params[0] |= mc_enc(0, 32, child_container_id);
189
190	/* send command to mc*/
191	return mc_send_command(mc_io, &cmd);
192}
193
194/**
195 * dprc_reset_container - Reset child container.
196 * @mc_io:	Pointer to MC portal's I/O object
197 * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
198 * @token:	Token of DPRC object
199 * @child_container_id:	ID of the container to reset
200 *
201 * In case a software context crashes or becomes non-responsive, the parent
202 * may wish to reset its resources container before the software context is
203 * restarted.
204 *
205 * This routine informs all objects assigned to the child container that the
206 * container is being reset, so they may perform any cleanup operations that are
207 * needed. All objects handles that were owned by the child container shall be
208 * closed.
209 *
210 * Note that such request may be submitted even if the child software context
211 * has not crashed, but the resulting object cleanup operations will not be
212 * aware of that.
213 *
214 * Return:	'0' on Success; Error code otherwise.
215 */
216int dprc_reset_container(struct fsl_mc_io *mc_io,
217			 u32 cmd_flags,
218			 u16 token,
219			 int child_container_id)
220{
221	struct mc_command cmd = { 0 };
222
223	/* prepare command */
224	cmd.header = mc_encode_cmd_header(DPRC_CMDID_RESET_CONT,
225					  cmd_flags, token);
226	cmd.params[0] |= mc_enc(0, 32, child_container_id);
227
228	/* send command to mc*/
229	return mc_send_command(mc_io, &cmd);
230}
231
232/**
233 * dprc_get_irq() - Get IRQ information from the DPRC.
234 * @mc_io:	Pointer to MC portal's I/O object
235 * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
236 * @token:	Token of DPRC object
237 * @irq_index:	The interrupt index to configure
238 * @type:	Interrupt type: 0 represents message interrupt
239 *		type (both irq_addr and irq_val are valid)
240 * @irq_cfg:	IRQ attributes
241 *
242 * Return:	'0' on Success; Error code otherwise.
243 */
244int dprc_get_irq(struct fsl_mc_io *mc_io,
245		 u32 cmd_flags,
246		 u16 token,
247		 u8 irq_index,
248		 int *type,
249		 struct dprc_irq_cfg *irq_cfg)
250{
251	struct mc_command cmd = { 0 };
252	int err;
253
254	/* prepare command */
255	cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_IRQ,
256					  cmd_flags,
257					  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	irq_cfg->val = mc_dec(cmd.params[0], 0, 32);
267	irq_cfg->paddr = mc_dec(cmd.params[1], 0, 64);
268	irq_cfg->user_irq_id = mc_dec(cmd.params[2], 0, 32);
269	*type = mc_dec(cmd.params[2], 32, 32);
270
271	return 0;
272}
273
274/**
275 * dprc_set_irq() - Set IRQ information for the DPRC to trigger an interrupt.
276 * @mc_io:	Pointer to MC portal's I/O object
277 * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
278 * @token:	Token of DPRC object
279 * @irq_index:	Identifies the interrupt index to configure
280 * @irq_cfg:	IRQ configuration
281 *
282 * Return:	'0' on Success; Error code otherwise.
283 */
284int dprc_set_irq(struct fsl_mc_io *mc_io,
285		 u32 cmd_flags,
286		 u16 token,
287		 u8 irq_index,
288		 struct dprc_irq_cfg *irq_cfg)
289{
290	struct mc_command cmd = { 0 };
291
292	/* prepare command */
293	cmd.header = mc_encode_cmd_header(DPRC_CMDID_SET_IRQ,
294					  cmd_flags,
295					  token);
296	cmd.params[0] |= mc_enc(32, 8, irq_index);
297	cmd.params[0] |= mc_enc(0, 32, irq_cfg->val);
298	cmd.params[1] |= mc_enc(0, 64, irq_cfg->paddr);
299	cmd.params[2] |= mc_enc(0, 32, irq_cfg->user_irq_id);
300
301	/* send command to mc*/
302	return mc_send_command(mc_io, &cmd);
303}
304
305/**
306 * dprc_get_irq_enable() - Get overall interrupt state.
307 * @mc_io:	Pointer to MC portal's I/O object
308 * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
309 * @token:	Token of DPRC object
310 * @irq_index:  The interrupt index to configure
311 * @en:		Returned interrupt state - enable = 1, disable = 0
312 *
313 * Return:	'0' on Success; Error code otherwise.
314 */
315int dprc_get_irq_enable(struct fsl_mc_io *mc_io,
316			u32 cmd_flags,
317			u16 token,
318			u8 irq_index,
319			u8 *en)
320{
321	struct mc_command cmd = { 0 };
322	int err;
323
324	/* prepare command */
325	cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_IRQ_ENABLE,
326					  cmd_flags, token);
327	cmd.params[0] |= mc_enc(32, 8, irq_index);
328
329	/* send command to mc*/
330	err = mc_send_command(mc_io, &cmd);
331	if (err)
332		return err;
333
334	/* retrieve response parameters */
335	*en = mc_dec(cmd.params[0], 0, 8);
336
337	return 0;
338}
339
340/**
341 * dprc_set_irq_enable() - Set overall interrupt state.
342 * @mc_io:	Pointer to MC portal's I/O object
343 * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
344 * @token:	Token of DPRC object
345 * @irq_index:	The interrupt index to configure
346 * @en:		Interrupt state - enable = 1, disable = 0
347 *
348 * Allows GPP software to control when interrupts are generated.
349 * Each interrupt can have up to 32 causes.  The enable/disable control's the
350 * overall interrupt state. if the interrupt is disabled no causes will cause
351 * an interrupt.
352 *
353 * Return:	'0' on Success; Error code otherwise.
354 */
355int dprc_set_irq_enable(struct fsl_mc_io *mc_io,
356			u32 cmd_flags,
357			u16 token,
358			u8 irq_index,
359			u8 en)
360{
361	struct mc_command cmd = { 0 };
362
363	/* prepare command */
364	cmd.header = mc_encode_cmd_header(DPRC_CMDID_SET_IRQ_ENABLE,
365					  cmd_flags, token);
366	cmd.params[0] |= mc_enc(0, 8, en);
367	cmd.params[0] |= mc_enc(32, 8, irq_index);
368
369	/* send command to mc*/
370	return mc_send_command(mc_io, &cmd);
371}
372
373/**
374 * dprc_get_irq_mask() - Get interrupt mask.
375 * @mc_io:	Pointer to MC portal's I/O object
376 * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
377 * @token:	Token of DPRC object
378 * @irq_index:	The interrupt index to configure
379 * @mask:	Returned event mask to trigger interrupt
380 *
381 * Every interrupt can have up to 32 causes and the interrupt model supports
382 * masking/unmasking each cause independently
383 *
384 * Return:	'0' on Success; Error code otherwise.
385 */
386int dprc_get_irq_mask(struct fsl_mc_io *mc_io,
387		      u32 cmd_flags,
388		      u16 token,
389		      u8 irq_index,
390		      u32 *mask)
391{
392	struct mc_command cmd = { 0 };
393	int err;
394
395	/* prepare command */
396	cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_IRQ_MASK,
397					  cmd_flags, token);
398	cmd.params[0] |= mc_enc(32, 8, irq_index);
399
400	/* send command to mc*/
401	err = mc_send_command(mc_io, &cmd);
402	if (err)
403		return err;
404
405	/* retrieve response parameters */
406	*mask = mc_dec(cmd.params[0], 0, 32);
407
408	return 0;
409}
410
411/**
412 * dprc_set_irq_mask() - Set interrupt mask.
413 * @mc_io:	Pointer to MC portal's I/O object
414 * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
415 * @token:	Token of DPRC object
416 * @irq_index:	The interrupt index to configure
417 * @mask:	event mask to trigger interrupt;
418 *			each bit:
419 *				0 = ignore event
420 *				1 = consider event for asserting irq
421 *
422 * Every interrupt can have up to 32 causes and the interrupt model supports
423 * masking/unmasking each cause independently
424 *
425 * Return:	'0' on Success; Error code otherwise.
426 */
427int dprc_set_irq_mask(struct fsl_mc_io *mc_io,
428		      u32 cmd_flags,
429		      u16 token,
430		      u8 irq_index,
431		      u32 mask)
432{
433	struct mc_command cmd = { 0 };
434
435	/* prepare command */
436	cmd.header = mc_encode_cmd_header(DPRC_CMDID_SET_IRQ_MASK,
437					  cmd_flags, token);
438	cmd.params[0] |= mc_enc(0, 32, mask);
439	cmd.params[0] |= mc_enc(32, 8, irq_index);
440
441	/* send command to mc*/
442	return mc_send_command(mc_io, &cmd);
443}
444
445/**
446 * dprc_get_irq_status() - Get the current status of any pending interrupts.
447 * @mc_io:	Pointer to MC portal's I/O object
448 * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
449 * @token:	Token of DPRC object
450 * @irq_index:	The interrupt index to configure
451 * @status:	Returned interrupts status - one bit per cause:
452 *			0 = no interrupt pending
453 *			1 = interrupt pending
454 *
455 * Return:	'0' on Success; Error code otherwise.
456 */
457int dprc_get_irq_status(struct fsl_mc_io *mc_io,
458			u32 cmd_flags,
459			u16 token,
460			u8 irq_index,
461			u32 *status)
462{
463	struct mc_command cmd = { 0 };
464	int err;
465
466	/* prepare command */
467	cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_IRQ_STATUS,
468					  cmd_flags, token);
469	cmd.params[0] |= mc_enc(32, 8, irq_index);
470
471	/* send command to mc*/
472	err = mc_send_command(mc_io, &cmd);
473	if (err)
474		return err;
475
476	/* retrieve response parameters */
477	*status = mc_dec(cmd.params[0], 0, 32);
478
479	return 0;
480}
481
482/**
483 * dprc_clear_irq_status() - Clear a pending interrupt's status
484 * @mc_io:	Pointer to MC portal's I/O object
485 * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
486 * @token:	Token of DPRC object
487 * @irq_index:	The interrupt index to configure
488 * @status:	bits to clear (W1C) - one bit per cause:
489 *					0 = don't change
490 *					1 = clear status bit
491 *
492 * Return:	'0' on Success; Error code otherwise.
493 */
494int dprc_clear_irq_status(struct fsl_mc_io *mc_io,
495			  u32 cmd_flags,
496			  u16 token,
497			  u8 irq_index,
498			  u32 status)
499{
500	struct mc_command cmd = { 0 };
501
502	/* prepare command */
503	cmd.header = mc_encode_cmd_header(DPRC_CMDID_CLEAR_IRQ_STATUS,
504					  cmd_flags, token);
505	cmd.params[0] |= mc_enc(0, 32, status);
506	cmd.params[0] |= mc_enc(32, 8, irq_index);
507
508	/* send command to mc*/
509	return mc_send_command(mc_io, &cmd);
510}
511
512/**
513 * dprc_get_attributes() - Obtains container attributes
514 * @mc_io:	Pointer to MC portal's I/O object
515 * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
516 * @token:	Token of DPRC object
517 * @attributes	Returned container attributes
518 *
519 * Return:     '0' on Success; Error code otherwise.
520 */
521int dprc_get_attributes(struct fsl_mc_io *mc_io,
522			u32 cmd_flags,
523			u16 token,
524			struct dprc_attributes *attr)
525{
526	struct mc_command cmd = { 0 };
527	int err;
528
529	/* prepare command */
530	cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_ATTR,
531					  cmd_flags,
532					  token);
533
534	/* send command to mc*/
535	err = mc_send_command(mc_io, &cmd);
536	if (err)
537		return err;
538
539	/* retrieve response parameters */
540	attr->container_id = mc_dec(cmd.params[0], 0, 32);
541	attr->icid = mc_dec(cmd.params[0], 32, 16);
542	attr->options = mc_dec(cmd.params[1], 0, 32);
543	attr->portal_id = mc_dec(cmd.params[1], 32, 32);
544	attr->version.major = mc_dec(cmd.params[2], 0, 16);
545	attr->version.minor = mc_dec(cmd.params[2], 16, 16);
546
547	return 0;
548}
549
550/**
551 * dprc_set_res_quota() - Set allocation policy for a specific resource/object
552 *		type in a child container
553 * @mc_io:	Pointer to MC portal's I/O object
554 * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
555 * @token:	Token of DPRC object
556 * @child_container_id:	ID of the child container
557 * @type:	Resource/object type
558 * @quota:	Sets the maximum number of resources of	the selected type
559 *		that the child container is allowed to allocate from its parent;
560 *		when quota is set to -1, the policy is the same as container's
561 *		general policy.
562 *
563 * Allocation policy determines whether or not a container may allocate
564 * resources from its parent. Each container has a 'global' allocation policy
565 * that is set when the container is created.
566 *
567 * This function sets allocation policy for a specific resource type.
568 * The default policy for all resource types matches the container's 'global'
569 * allocation policy.
570 *
571 * Return:	'0' on Success; Error code otherwise.
572 *
573 * @warning	Only the parent container is allowed to change a child policy.
574 */
575int dprc_set_res_quota(struct fsl_mc_io *mc_io,
576		       u32 cmd_flags,
577		       u16 token,
578		       int child_container_id,
579		       char *type,
580		       u16 quota)
581{
582	struct mc_command cmd = { 0 };
583
584	/* prepare command */
585	cmd.header = mc_encode_cmd_header(DPRC_CMDID_SET_RES_QUOTA,
586					  cmd_flags, token);
587	cmd.params[0] |= mc_enc(0, 32, child_container_id);
588	cmd.params[0] |= mc_enc(32, 16, quota);
589	cmd.params[1] |= mc_enc(0, 8, type[0]);
590	cmd.params[1] |= mc_enc(8, 8, type[1]);
591	cmd.params[1] |= mc_enc(16, 8, type[2]);
592	cmd.params[1] |= mc_enc(24, 8, type[3]);
593	cmd.params[1] |= mc_enc(32, 8, type[4]);
594	cmd.params[1] |= mc_enc(40, 8, type[5]);
595	cmd.params[1] |= mc_enc(48, 8, type[6]);
596	cmd.params[1] |= mc_enc(56, 8, type[7]);
597	cmd.params[2] |= mc_enc(0, 8, type[8]);
598	cmd.params[2] |= mc_enc(8, 8, type[9]);
599	cmd.params[2] |= mc_enc(16, 8, type[10]);
600	cmd.params[2] |= mc_enc(24, 8, type[11]);
601	cmd.params[2] |= mc_enc(32, 8, type[12]);
602	cmd.params[2] |= mc_enc(40, 8, type[13]);
603	cmd.params[2] |= mc_enc(48, 8, type[14]);
604	cmd.params[2] |= mc_enc(56, 8, '\0');
605
606	/* send command to mc*/
607	return mc_send_command(mc_io, &cmd);
608}
609
610/**
611 * dprc_get_res_quota() - Gets the allocation policy of a specific
612 *		resource/object type in a child container
613 * @mc_io:	Pointer to MC portal's I/O object
614 * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
615 * @token:	Token of DPRC object
616 * @child_container_id;	ID of the child container
617 * @type:	resource/object type
618 * @quota:	Returnes the maximum number of resources of the selected type
619 *		that the child container is allowed to allocate from the parent;
620 *		when quota is set to -1, the policy is the same as container's
621 *		general policy.
622 *
623 * Return:	'0' on Success; Error code otherwise.
624 */
625int dprc_get_res_quota(struct fsl_mc_io *mc_io,
626		       u32 cmd_flags,
627		       u16 token,
628		       int child_container_id,
629		       char *type,
630		       u16 *quota)
631{
632	struct mc_command cmd = { 0 };
633	int err;
634
635	/* prepare command */
636	cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_RES_QUOTA,
637					  cmd_flags, token);
638	cmd.params[0] |= mc_enc(0, 32, child_container_id);
639	cmd.params[1] |= mc_enc(0, 8, type[0]);
640	cmd.params[1] |= mc_enc(8, 8, type[1]);
641	cmd.params[1] |= mc_enc(16, 8, type[2]);
642	cmd.params[1] |= mc_enc(24, 8, type[3]);
643	cmd.params[1] |= mc_enc(32, 8, type[4]);
644	cmd.params[1] |= mc_enc(40, 8, type[5]);
645	cmd.params[1] |= mc_enc(48, 8, type[6]);
646	cmd.params[1] |= mc_enc(56, 8, type[7]);
647	cmd.params[2] |= mc_enc(0, 8, type[8]);
648	cmd.params[2] |= mc_enc(8, 8, type[9]);
649	cmd.params[2] |= mc_enc(16, 8, type[10]);
650	cmd.params[2] |= mc_enc(24, 8, type[11]);
651	cmd.params[2] |= mc_enc(32, 8, type[12]);
652	cmd.params[2] |= mc_enc(40, 8, type[13]);
653	cmd.params[2] |= mc_enc(48, 8, type[14]);
654	cmd.params[2] |= mc_enc(56, 8, '\0');
655
656	/* send command to mc*/
657	err = mc_send_command(mc_io, &cmd);
658	if (err)
659		return err;
660
661	/* retrieve response parameters */
662	*quota = mc_dec(cmd.params[0], 32, 16);
663
664	return 0;
665}
666
667/**
668 * dprc_assign() - Assigns objects or resource to a child container.
669 * @mc_io:	Pointer to MC portal's I/O object
670 * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
671 * @token:	Token of DPRC object
672 * @container_id: ID of the child container
673 * @res_req:	Describes the type and amount of resources to
674 *			assign to the given container
675 *
676 * Assignment is usually done by a parent (this DPRC) to one of its child
677 * containers.
678 *
679 * According to the DPRC allocation policy, the assigned resources may be taken
680 * (allocated) from the container's ancestors, if not enough resources are
681 * available in the container itself.
682 *
683 * The type of assignment depends on the dprc_res_req options, as follows:
684 * - DPRC_RES_REQ_OPT_EXPLICIT: indicates that assigned resources should have
685 *   the explicit base ID specified at the id_base_align field of res_req.
686 * - DPRC_RES_REQ_OPT_ALIGNED: indicates that the assigned resources should be
687 *   aligned to the value given at id_base_align field of res_req.
688 * - DPRC_RES_REQ_OPT_PLUGGED: Relevant only for object assignment,
689 *   and indicates that the object must be set to the plugged state.
690 *
691 * A container may use this function with its own ID in order to change a
692 * object state to plugged or unplugged.
693 *
694 * If IRQ information has been set in the child DPRC, it will signal an
695 * interrupt following every change in its object assignment.
696 *
697 * Return:	'0' on Success; Error code otherwise.
698 */
699int dprc_assign(struct fsl_mc_io *mc_io,
700		u32 cmd_flags,
701		u16 token,
702		int container_id,
703		struct dprc_res_req *res_req)
704{
705	struct mc_command cmd = { 0 };
706
707	/* prepare command */
708	cmd.header = mc_encode_cmd_header(DPRC_CMDID_ASSIGN,
709					  cmd_flags, token);
710	cmd.params[0] |= mc_enc(0, 32, container_id);
711	cmd.params[0] |= mc_enc(32, 32, res_req->options);
712	cmd.params[1] |= mc_enc(0, 32, res_req->num);
713	cmd.params[1] |= mc_enc(32, 32, res_req->id_base_align);
714	cmd.params[2] |= mc_enc(0, 8, res_req->type[0]);
715	cmd.params[2] |= mc_enc(8, 8, res_req->type[1]);
716	cmd.params[2] |= mc_enc(16, 8, res_req->type[2]);
717	cmd.params[2] |= mc_enc(24, 8, res_req->type[3]);
718	cmd.params[2] |= mc_enc(32, 8, res_req->type[4]);
719	cmd.params[2] |= mc_enc(40, 8, res_req->type[5]);
720	cmd.params[2] |= mc_enc(48, 8, res_req->type[6]);
721	cmd.params[2] |= mc_enc(56, 8, res_req->type[7]);
722	cmd.params[3] |= mc_enc(0, 8, res_req->type[8]);
723	cmd.params[3] |= mc_enc(8, 8, res_req->type[9]);
724	cmd.params[3] |= mc_enc(16, 8, res_req->type[10]);
725	cmd.params[3] |= mc_enc(24, 8, res_req->type[11]);
726	cmd.params[3] |= mc_enc(32, 8, res_req->type[12]);
727	cmd.params[3] |= mc_enc(40, 8, res_req->type[13]);
728	cmd.params[3] |= mc_enc(48, 8, res_req->type[14]);
729	cmd.params[3] |= mc_enc(56, 8, res_req->type[15]);
730
731	/* send command to mc*/
732	return mc_send_command(mc_io, &cmd);
733}
734
735/**
736 * dprc_unassign() - Un-assigns objects or resources from a child container
737 *		and moves them into this (parent) DPRC.
738 * @mc_io:	Pointer to MC portal's I/O object
739 * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
740 * @token:	Token of DPRC object
741 * @child_container_id:	ID of the child container
742 * @res_req:	Describes the type and amount of resources to un-assign from
743 *		the child container
744 *
745 * Un-assignment of objects can succeed only if the object is not in the
746 * plugged or opened state.
747 *
748 * Return:	'0' on Success; Error code otherwise.
749 */
750int dprc_unassign(struct fsl_mc_io *mc_io,
751		  u32 cmd_flags,
752		  u16 token,
753		  int child_container_id,
754		  struct dprc_res_req *res_req)
755{
756	struct mc_command cmd = { 0 };
757
758	/* prepare command */
759	cmd.header = mc_encode_cmd_header(DPRC_CMDID_UNASSIGN,
760					  cmd_flags,
761					  token);
762	cmd.params[0] |= mc_enc(0, 32, child_container_id);
763	cmd.params[0] |= mc_enc(32, 32, res_req->options);
764	cmd.params[1] |= mc_enc(0, 32, res_req->num);
765	cmd.params[1] |= mc_enc(32, 32, res_req->id_base_align);
766	cmd.params[2] |= mc_enc(0, 8, res_req->type[0]);
767	cmd.params[2] |= mc_enc(8, 8, res_req->type[1]);
768	cmd.params[2] |= mc_enc(16, 8, res_req->type[2]);
769	cmd.params[2] |= mc_enc(24, 8, res_req->type[3]);
770	cmd.params[2] |= mc_enc(32, 8, res_req->type[4]);
771	cmd.params[2] |= mc_enc(40, 8, res_req->type[5]);
772	cmd.params[2] |= mc_enc(48, 8, res_req->type[6]);
773	cmd.params[2] |= mc_enc(56, 8, res_req->type[7]);
774	cmd.params[3] |= mc_enc(0, 8, res_req->type[8]);
775	cmd.params[3] |= mc_enc(8, 8, res_req->type[9]);
776	cmd.params[3] |= mc_enc(16, 8, res_req->type[10]);
777	cmd.params[3] |= mc_enc(24, 8, res_req->type[11]);
778	cmd.params[3] |= mc_enc(32, 8, res_req->type[12]);
779	cmd.params[3] |= mc_enc(40, 8, res_req->type[13]);
780	cmd.params[3] |= mc_enc(48, 8, res_req->type[14]);
781	cmd.params[3] |= mc_enc(56, 8, res_req->type[15]);
782
783	/* send command to mc*/
784	return mc_send_command(mc_io, &cmd);
785}
786
787/**
788 * dprc_get_pool_count() - Get the number of dprc's pools
789 * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
790 * @mc_io:	Pointer to MC portal's I/O object
791 * @token:	Token of DPRC object
792 * @pool_count:	Returned number of resource pools in the dprc
793 *
794 * Return:	'0' on Success; Error code otherwise.
795 */
796int dprc_get_pool_count(struct fsl_mc_io *mc_io,
797			u32 cmd_flags,
798			u16 token,
799			int *pool_count)
800{
801	struct mc_command cmd = { 0 };
802	int err;
803
804	/* prepare command */
805	cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_POOL_COUNT,
806					  cmd_flags, token);
807
808	/* send command to mc*/
809	err = mc_send_command(mc_io, &cmd);
810	if (err)
811		return err;
812
813	/* retrieve response parameters */
814	*pool_count = mc_dec(cmd.params[0], 0, 32);
815
816	return 0;
817}
818
819/**
820 * dprc_get_pool() - Get the type (string) of a certain dprc's pool
821 * @mc_io:	Pointer to MC portal's I/O object
822 * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
823 * @token:	Token of DPRC object
824 * @pool_index;	Index of the pool to be queried (< pool_count)
825 * @type:	The type of the pool
826 *
827 * The pool types retrieved one by one by incrementing
828 * pool_index up to (not including) the value of pool_count returned
829 * from dprc_get_pool_count(). dprc_get_pool_count() must
830 * be called prior to dprc_get_pool().
831 *
832 * Return:	'0' on Success; Error code otherwise.
833 */
834int dprc_get_pool(struct fsl_mc_io *mc_io,
835		  u32 cmd_flags,
836		  u16 token,
837		  int pool_index,
838		  char *type)
839{
840	struct mc_command cmd = { 0 };
841	int err;
842
843	/* prepare command */
844	cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_POOL,
845					  cmd_flags,
846					  token);
847	cmd.params[0] |= mc_enc(0, 32, pool_index);
848
849	/* send command to mc*/
850	err = mc_send_command(mc_io, &cmd);
851	if (err)
852		return err;
853
854	/* retrieve response parameters */
855	type[0] = mc_dec(cmd.params[1], 0, 8);
856	type[1] = mc_dec(cmd.params[1], 8, 8);
857	type[2] = mc_dec(cmd.params[1], 16, 8);
858	type[3] = mc_dec(cmd.params[1], 24, 8);
859	type[4] = mc_dec(cmd.params[1], 32, 8);
860	type[5] = mc_dec(cmd.params[1], 40, 8);
861	type[6] = mc_dec(cmd.params[1], 48, 8);
862	type[7] = mc_dec(cmd.params[1], 56, 8);
863	type[8] = mc_dec(cmd.params[2], 0, 8);
864	type[9] = mc_dec(cmd.params[2], 8, 8);
865	type[10] = mc_dec(cmd.params[2], 16, 8);
866	type[11] = mc_dec(cmd.params[2], 24, 8);
867	type[12] = mc_dec(cmd.params[2], 32, 8);
868	type[13] = mc_dec(cmd.params[2], 40, 8);
869	type[14] = mc_dec(cmd.params[2], 48, 8);
870	type[15] = '\0';
871
872	return 0;
873}
874
875/**
876 * dprc_get_obj_count() - Obtains the number of objects in the DPRC
877 * @mc_io:	Pointer to MC portal's I/O object
878 * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
879 * @token:	Token of DPRC object
880 * @obj_count:	Number of objects assigned to the DPRC
881 *
882 * Return:	'0' on Success; Error code otherwise.
883 */
884int dprc_get_obj_count(struct fsl_mc_io *mc_io,
885		       u32 cmd_flags,
886		       u16 token,
887		       int *obj_count)
888{
889	struct mc_command cmd = { 0 };
890	int err;
891
892	/* prepare command */
893	cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_OBJ_COUNT,
894					  cmd_flags, token);
895
896	/* send command to mc*/
897	err = mc_send_command(mc_io, &cmd);
898	if (err)
899		return err;
900
901	/* retrieve response parameters */
902	*obj_count = mc_dec(cmd.params[0], 32, 32);
903
904	return 0;
905}
906EXPORT_SYMBOL(dprc_get_obj_count);
907
908/**
909 * dprc_get_obj() - Get general information on an object
910 * @mc_io:	Pointer to MC portal's I/O object
911 * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
912 * @token:	Token of DPRC object
913 * @obj_index:	Index of the object to be queried (< obj_count)
914 * @obj_desc:	Returns the requested object descriptor
915 *
916 * The object descriptors are retrieved one by one by incrementing
917 * obj_index up to (not including) the value of obj_count returned
918 * from dprc_get_obj_count(). dprc_get_obj_count() must
919 * be called prior to dprc_get_obj().
920 *
921 * Return:	'0' on Success; Error code otherwise.
922 */
923int dprc_get_obj(struct fsl_mc_io *mc_io,
924		 u32 cmd_flags,
925		 u16 token,
926		 int obj_index,
927		 struct dprc_obj_desc *obj_desc)
928{
929	struct mc_command cmd = { 0 };
930	int err;
931
932	/* prepare command */
933	cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_OBJ,
934					  cmd_flags,
935					  token);
936	cmd.params[0] |= mc_enc(0, 32, obj_index);
937
938	/* send command to mc*/
939	err = mc_send_command(mc_io, &cmd);
940	if (err)
941		return err;
942
943	/* retrieve response parameters */
944	obj_desc->id = mc_dec(cmd.params[0], 32, 32);
945	obj_desc->vendor = mc_dec(cmd.params[1], 0, 16);
946	obj_desc->irq_count = mc_dec(cmd.params[1], 16, 8);
947	obj_desc->region_count = mc_dec(cmd.params[1], 24, 8);
948	obj_desc->state = mc_dec(cmd.params[1], 32, 32);
949	obj_desc->ver_major = mc_dec(cmd.params[2], 0, 16);
950	obj_desc->ver_minor = mc_dec(cmd.params[2], 16, 16);
951	obj_desc->type[0] = mc_dec(cmd.params[3], 0, 8);
952	obj_desc->type[1] = mc_dec(cmd.params[3], 8, 8);
953	obj_desc->type[2] = mc_dec(cmd.params[3], 16, 8);
954	obj_desc->type[3] = mc_dec(cmd.params[3], 24, 8);
955	obj_desc->type[4] = mc_dec(cmd.params[3], 32, 8);
956	obj_desc->type[5] = mc_dec(cmd.params[3], 40, 8);
957	obj_desc->type[6] = mc_dec(cmd.params[3], 48, 8);
958	obj_desc->type[7] = mc_dec(cmd.params[3], 56, 8);
959	obj_desc->type[8] = mc_dec(cmd.params[4], 0, 8);
960	obj_desc->type[9] = mc_dec(cmd.params[4], 8, 8);
961	obj_desc->type[10] = mc_dec(cmd.params[4], 16, 8);
962	obj_desc->type[11] = mc_dec(cmd.params[4], 24, 8);
963	obj_desc->type[12] = mc_dec(cmd.params[4], 32, 8);
964	obj_desc->type[13] = mc_dec(cmd.params[4], 40, 8);
965	obj_desc->type[14] = mc_dec(cmd.params[4], 48, 8);
966	obj_desc->type[15] = '\0';
967	obj_desc->label[0] = mc_dec(cmd.params[5], 0, 8);
968	obj_desc->label[1] = mc_dec(cmd.params[5], 8, 8);
969	obj_desc->label[2] = mc_dec(cmd.params[5], 16, 8);
970	obj_desc->label[3] = mc_dec(cmd.params[5], 24, 8);
971	obj_desc->label[4] = mc_dec(cmd.params[5], 32, 8);
972	obj_desc->label[5] = mc_dec(cmd.params[5], 40, 8);
973	obj_desc->label[6] = mc_dec(cmd.params[5], 48, 8);
974	obj_desc->label[7] = mc_dec(cmd.params[5], 56, 8);
975	obj_desc->label[8] = mc_dec(cmd.params[6], 0, 8);
976	obj_desc->label[9] = mc_dec(cmd.params[6], 8, 8);
977	obj_desc->label[10] = mc_dec(cmd.params[6], 16, 8);
978	obj_desc->label[11] = mc_dec(cmd.params[6], 24, 8);
979	obj_desc->label[12] = mc_dec(cmd.params[6], 32, 8);
980	obj_desc->label[13] = mc_dec(cmd.params[6], 40, 8);
981	obj_desc->label[14] = mc_dec(cmd.params[6], 48, 8);
982	obj_desc->label[15] = '\0';
983	return 0;
984}
985EXPORT_SYMBOL(dprc_get_obj);
986
987/**
988 * dprc_get_obj_desc() - Get object descriptor.
989 *
990 * @mc_io:	Pointer to MC portal's I/O object
991 * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
992 * @token:	Token of DPRC object
993 * @obj_type:	The type of the object to get its descriptor.
994 * @obj_id:	The id of the object to get its descriptor
995 * @obj_desc:	The returned descriptor to fill and return to the user
996 *
997 * Return:	'0' on Success; Error code otherwise.
998 *
999 */
1000int dprc_get_obj_desc(struct fsl_mc_io *mc_io,
1001		      u32 cmd_flags,
1002		      u16 token,
1003		      char *obj_type,
1004		      int obj_id,
1005		      struct dprc_obj_desc *obj_desc)
1006{
1007	struct mc_command cmd = { 0 };
1008	int err;
1009
1010	/* prepare command */
1011	cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_OBJ_DESC,
1012					  cmd_flags,
1013					  token);
1014	cmd.params[0] |= mc_enc(0, 32, obj_id);
1015	cmd.params[1] |= mc_enc(0, 8, obj_type[0]);
1016	cmd.params[1] |= mc_enc(8, 8, obj_type[1]);
1017	cmd.params[1] |= mc_enc(16, 8, obj_type[2]);
1018	cmd.params[1] |= mc_enc(24, 8, obj_type[3]);
1019	cmd.params[1] |= mc_enc(32, 8, obj_type[4]);
1020	cmd.params[1] |= mc_enc(40, 8, obj_type[5]);
1021	cmd.params[1] |= mc_enc(48, 8, obj_type[6]);
1022	cmd.params[1] |= mc_enc(56, 8, obj_type[7]);
1023	cmd.params[2] |= mc_enc(0, 8, obj_type[8]);
1024	cmd.params[2] |= mc_enc(8, 8, obj_type[9]);
1025	cmd.params[2] |= mc_enc(16, 8, obj_type[10]);
1026	cmd.params[2] |= mc_enc(24, 8, obj_type[11]);
1027	cmd.params[2] |= mc_enc(32, 8, obj_type[12]);
1028	cmd.params[2] |= mc_enc(40, 8, obj_type[13]);
1029	cmd.params[2] |= mc_enc(48, 8, obj_type[14]);
1030	cmd.params[2] |= mc_enc(56, 8, obj_type[15]);
1031
1032	/* send command to mc*/
1033	err = mc_send_command(mc_io, &cmd);
1034	if (err)
1035		return err;
1036
1037	/* retrieve response parameters */
1038	obj_desc->id = (int)mc_dec(cmd.params[0], 32, 32);
1039	obj_desc->vendor = (u16)mc_dec(cmd.params[1], 0, 16);
1040	obj_desc->vendor = (u8)mc_dec(cmd.params[1], 16, 8);
1041	obj_desc->region_count = (u8)mc_dec(cmd.params[1], 24, 8);
1042	obj_desc->state = (u32)mc_dec(cmd.params[1], 32, 32);
1043	obj_desc->ver_major = (u16)mc_dec(cmd.params[2], 0, 16);
1044	obj_desc->ver_minor = (u16)mc_dec(cmd.params[2], 16, 16);
1045	obj_desc->type[0] = (char)mc_dec(cmd.params[3], 0, 8);
1046	obj_desc->type[1] = (char)mc_dec(cmd.params[3], 8, 8);
1047	obj_desc->type[2] = (char)mc_dec(cmd.params[3], 16, 8);
1048	obj_desc->type[3] = (char)mc_dec(cmd.params[3], 24, 8);
1049	obj_desc->type[4] = (char)mc_dec(cmd.params[3], 32, 8);
1050	obj_desc->type[5] = (char)mc_dec(cmd.params[3], 40, 8);
1051	obj_desc->type[6] = (char)mc_dec(cmd.params[3], 48, 8);
1052	obj_desc->type[7] = (char)mc_dec(cmd.params[3], 56, 8);
1053	obj_desc->type[8] = (char)mc_dec(cmd.params[4], 0, 8);
1054	obj_desc->type[9] = (char)mc_dec(cmd.params[4], 8, 8);
1055	obj_desc->type[10] = (char)mc_dec(cmd.params[4], 16, 8);
1056	obj_desc->type[11] = (char)mc_dec(cmd.params[4], 24, 8);
1057	obj_desc->type[12] = (char)mc_dec(cmd.params[4], 32, 8);
1058	obj_desc->type[13] = (char)mc_dec(cmd.params[4], 40, 8);
1059	obj_desc->type[14] = (char)mc_dec(cmd.params[4], 48, 8);
1060	obj_desc->type[15] = (char)mc_dec(cmd.params[4], 56, 8);
1061	obj_desc->label[0] = (char)mc_dec(cmd.params[5], 0, 8);
1062	obj_desc->label[1] = (char)mc_dec(cmd.params[5], 8, 8);
1063	obj_desc->label[2] = (char)mc_dec(cmd.params[5], 16, 8);
1064	obj_desc->label[3] = (char)mc_dec(cmd.params[5], 24, 8);
1065	obj_desc->label[4] = (char)mc_dec(cmd.params[5], 32, 8);
1066	obj_desc->label[5] = (char)mc_dec(cmd.params[5], 40, 8);
1067	obj_desc->label[6] = (char)mc_dec(cmd.params[5], 48, 8);
1068	obj_desc->label[7] = (char)mc_dec(cmd.params[5], 56, 8);
1069	obj_desc->label[8] = (char)mc_dec(cmd.params[6], 0, 8);
1070	obj_desc->label[9] = (char)mc_dec(cmd.params[6], 8, 8);
1071	obj_desc->label[10] = (char)mc_dec(cmd.params[6], 16, 8);
1072	obj_desc->label[11] = (char)mc_dec(cmd.params[6], 24, 8);
1073	obj_desc->label[12] = (char)mc_dec(cmd.params[6], 32, 8);
1074	obj_desc->label[13] = (char)mc_dec(cmd.params[6], 40, 8);
1075	obj_desc->label[14] = (char)mc_dec(cmd.params[6], 48, 8);
1076	obj_desc->label[15] = (char)mc_dec(cmd.params[6], 56, 8);
1077
1078	return 0;
1079}
1080EXPORT_SYMBOL(dprc_get_obj_desc);
1081
1082/**
1083 * dprc_set_obj_irq() - Set IRQ information for object to trigger an interrupt.
1084 * @mc_io:	Pointer to MC portal's I/O object
1085 * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1086 * @token:	Token of DPRC object
1087 * @obj_type:	Type of the object to set its IRQ
1088 * @obj_id:	ID of the object to set its IRQ
1089 * @irq_index:	The interrupt index to configure
1090 * @irq_cfg:	IRQ configuration
1091 *
1092 * Return:	'0' on Success; Error code otherwise.
1093 */
1094int dprc_set_obj_irq(struct fsl_mc_io *mc_io,
1095		     u32 cmd_flags,
1096		     u16 token,
1097		     char *obj_type,
1098		     int obj_id,
1099		     u8 irq_index,
1100		     struct dprc_irq_cfg *irq_cfg)
1101{
1102	struct mc_command cmd = { 0 };
1103
1104	/* prepare command */
1105	cmd.header = mc_encode_cmd_header(DPRC_CMDID_SET_OBJ_IRQ,
1106					  cmd_flags,
1107					  token);
1108	cmd.params[0] |= mc_enc(32, 8, irq_index);
1109	cmd.params[0] |= mc_enc(0, 32, irq_cfg->val);
1110	cmd.params[1] |= mc_enc(0, 64, irq_cfg->paddr);
1111	cmd.params[2] |= mc_enc(0, 32, irq_cfg->user_irq_id);
1112	cmd.params[2] |= mc_enc(32, 32, obj_id);
1113	cmd.params[3] |= mc_enc(0, 8, obj_type[0]);
1114	cmd.params[3] |= mc_enc(8, 8, obj_type[1]);
1115	cmd.params[3] |= mc_enc(16, 8, obj_type[2]);
1116	cmd.params[3] |= mc_enc(24, 8, obj_type[3]);
1117	cmd.params[3] |= mc_enc(32, 8, obj_type[4]);
1118	cmd.params[3] |= mc_enc(40, 8, obj_type[5]);
1119	cmd.params[3] |= mc_enc(48, 8, obj_type[6]);
1120	cmd.params[3] |= mc_enc(56, 8, obj_type[7]);
1121	cmd.params[4] |= mc_enc(0, 8, obj_type[8]);
1122	cmd.params[4] |= mc_enc(8, 8, obj_type[9]);
1123	cmd.params[4] |= mc_enc(16, 8, obj_type[10]);
1124	cmd.params[4] |= mc_enc(24, 8, obj_type[11]);
1125	cmd.params[4] |= mc_enc(32, 8, obj_type[12]);
1126	cmd.params[4] |= mc_enc(40, 8, obj_type[13]);
1127	cmd.params[4] |= mc_enc(48, 8, obj_type[14]);
1128	cmd.params[4] |= mc_enc(56, 8, obj_type[15]);
1129
1130	/* send command to mc*/
1131	return mc_send_command(mc_io, &cmd);
1132}
1133EXPORT_SYMBOL(dprc_set_obj_irq);
1134
1135/**
1136 * dprc_get_obj_irq() - Get IRQ information from object.
1137 * @mc_io:	Pointer to MC portal's I/O object
1138 * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1139 * @token:	Token of DPRC object
1140 * @obj_type:	Type od the object to get its IRQ
1141 * @obj_id:	ID of the object to get its IRQ
1142 * @irq_index:	The interrupt index to configure
1143 * @type:	Interrupt type: 0 represents message interrupt
1144 *		type (both irq_addr and irq_val are valid)
1145 * @irq_cfg:	The returned IRQ attributes
1146 *
1147 * Return:	'0' on Success; Error code otherwise.
1148 */
1149int dprc_get_obj_irq(struct fsl_mc_io *mc_io,
1150		     u32 cmd_flags,
1151		     u16 token,
1152		     char *obj_type,
1153		     int obj_id,
1154		     u8 irq_index,
1155		     int *type,
1156		     struct dprc_irq_cfg *irq_cfg)
1157{
1158	struct mc_command cmd = { 0 };
1159	int err;
1160
1161	/* prepare command */
1162	cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_OBJ_IRQ,
1163					  cmd_flags,
1164					  token);
1165	cmd.params[0] |= mc_enc(0, 32, obj_id);
1166	cmd.params[0] |= mc_enc(32, 8, irq_index);
1167	cmd.params[1] |= mc_enc(0, 8, obj_type[0]);
1168	cmd.params[1] |= mc_enc(8, 8, obj_type[1]);
1169	cmd.params[1] |= mc_enc(16, 8, obj_type[2]);
1170	cmd.params[1] |= mc_enc(24, 8, obj_type[3]);
1171	cmd.params[1] |= mc_enc(32, 8, obj_type[4]);
1172	cmd.params[1] |= mc_enc(40, 8, obj_type[5]);
1173	cmd.params[1] |= mc_enc(48, 8, obj_type[6]);
1174	cmd.params[1] |= mc_enc(56, 8, obj_type[7]);
1175	cmd.params[2] |= mc_enc(0, 8, obj_type[8]);
1176	cmd.params[2] |= mc_enc(8, 8, obj_type[9]);
1177	cmd.params[2] |= mc_enc(16, 8, obj_type[10]);
1178	cmd.params[2] |= mc_enc(24, 8, obj_type[11]);
1179	cmd.params[2] |= mc_enc(32, 8, obj_type[12]);
1180	cmd.params[2] |= mc_enc(40, 8, obj_type[13]);
1181	cmd.params[2] |= mc_enc(48, 8, obj_type[14]);
1182	cmd.params[2] |= mc_enc(56, 8, obj_type[15]);
1183
1184	/* send command to mc*/
1185	err = mc_send_command(mc_io, &cmd);
1186	if (err)
1187		return err;
1188
1189	/* retrieve response parameters */
1190	irq_cfg->val = (u32)mc_dec(cmd.params[0], 0, 32);
1191	irq_cfg->paddr = (u64)mc_dec(cmd.params[1], 0, 64);
1192	irq_cfg->user_irq_id = (int)mc_dec(cmd.params[2], 0, 32);
1193	*type = (int)mc_dec(cmd.params[2], 32, 32);
1194
1195	return 0;
1196}
1197EXPORT_SYMBOL(dprc_get_obj_irq);
1198
1199/**
1200 * dprc_get_res_count() - Obtains the number of free resources that are assigned
1201 *		to this container, by pool type
1202 * @mc_io:	Pointer to MC portal's I/O object
1203 * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1204 * @token:	Token of DPRC object
1205 * @type:	pool type
1206 * @res_count:	Returned number of free resources of the given
1207 *			resource type that are assigned to this DPRC
1208 *
1209 * Return:	'0' on Success; Error code otherwise.
1210 */
1211int dprc_get_res_count(struct fsl_mc_io *mc_io,
1212		       u32 cmd_flags,
1213		       u16 token,
1214		       char *type,
1215		       int *res_count)
1216{
1217	struct mc_command cmd = { 0 };
1218	int err;
1219
1220	*res_count = 0;
1221
1222	/* prepare command */
1223	cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_RES_COUNT,
1224					  cmd_flags, token);
1225	cmd.params[1] |= mc_enc(0, 8, type[0]);
1226	cmd.params[1] |= mc_enc(8, 8, type[1]);
1227	cmd.params[1] |= mc_enc(16, 8, type[2]);
1228	cmd.params[1] |= mc_enc(24, 8, type[3]);
1229	cmd.params[1] |= mc_enc(32, 8, type[4]);
1230	cmd.params[1] |= mc_enc(40, 8, type[5]);
1231	cmd.params[1] |= mc_enc(48, 8, type[6]);
1232	cmd.params[1] |= mc_enc(56, 8, type[7]);
1233	cmd.params[2] |= mc_enc(0, 8, type[8]);
1234	cmd.params[2] |= mc_enc(8, 8, type[9]);
1235	cmd.params[2] |= mc_enc(16, 8, type[10]);
1236	cmd.params[2] |= mc_enc(24, 8, type[11]);
1237	cmd.params[2] |= mc_enc(32, 8, type[12]);
1238	cmd.params[2] |= mc_enc(40, 8, type[13]);
1239	cmd.params[2] |= mc_enc(48, 8, type[14]);
1240	cmd.params[2] |= mc_enc(56, 8, '\0');
1241
1242	/* send command to mc*/
1243	err = mc_send_command(mc_io, &cmd);
1244	if (err)
1245		return err;
1246
1247	/* retrieve response parameters */
1248	*res_count = mc_dec(cmd.params[0], 0, 32);
1249
1250	return 0;
1251}
1252EXPORT_SYMBOL(dprc_get_res_count);
1253
1254/**
1255 * dprc_get_res_ids() - Obtains IDs of free resources in the container
1256 * @mc_io:	Pointer to MC portal's I/O object
1257 * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1258 * @token:	Token of DPRC object
1259 * @type:	pool type
1260 * @range_desc:	range descriptor
1261 *
1262 * Return:	'0' on Success; Error code otherwise.
1263 */
1264int dprc_get_res_ids(struct fsl_mc_io *mc_io,
1265		     u32 cmd_flags,
1266		     u16 token,
1267		     char *type,
1268		     struct dprc_res_ids_range_desc *range_desc)
1269{
1270	struct mc_command cmd = { 0 };
1271	int err;
1272
1273	/* prepare command */
1274	cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_RES_IDS,
1275					  cmd_flags, token);
1276	cmd.params[0] |= mc_enc(42, 7, range_desc->iter_status);
1277	cmd.params[1] |= mc_enc(0, 32, range_desc->base_id);
1278	cmd.params[1] |= mc_enc(32, 32, range_desc->last_id);
1279	cmd.params[2] |= mc_enc(0, 8, type[0]);
1280	cmd.params[2] |= mc_enc(8, 8, type[1]);
1281	cmd.params[2] |= mc_enc(16, 8, type[2]);
1282	cmd.params[2] |= mc_enc(24, 8, type[3]);
1283	cmd.params[2] |= mc_enc(32, 8, type[4]);
1284	cmd.params[2] |= mc_enc(40, 8, type[5]);
1285	cmd.params[2] |= mc_enc(48, 8, type[6]);
1286	cmd.params[2] |= mc_enc(56, 8, type[7]);
1287	cmd.params[3] |= mc_enc(0, 8, type[8]);
1288	cmd.params[3] |= mc_enc(8, 8, type[9]);
1289	cmd.params[3] |= mc_enc(16, 8, type[10]);
1290	cmd.params[3] |= mc_enc(24, 8, type[11]);
1291	cmd.params[3] |= mc_enc(32, 8, type[12]);
1292	cmd.params[3] |= mc_enc(40, 8, type[13]);
1293	cmd.params[3] |= mc_enc(48, 8, type[14]);
1294	cmd.params[3] |= mc_enc(56, 8, '\0');
1295
1296	/* send command to mc*/
1297	err = mc_send_command(mc_io, &cmd);
1298	if (err)
1299		return err;
1300
1301	/* retrieve response parameters */
1302	range_desc->iter_status = mc_dec(cmd.params[0], 42, 7);
1303	range_desc->base_id = mc_dec(cmd.params[1], 0, 32);
1304	range_desc->last_id = mc_dec(cmd.params[1], 32, 32);
1305
1306	return 0;
1307}
1308EXPORT_SYMBOL(dprc_get_res_ids);
1309
1310/**
1311 * dprc_get_obj_region() - Get region information for a specified object.
1312 * @mc_io:	Pointer to MC portal's I/O object
1313 * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1314 * @token:	Token of DPRC object
1315 * @obj_type;	Object type as returned in dprc_get_obj()
1316 * @obj_id:	Unique object instance as returned in dprc_get_obj()
1317 * @region_index: The specific region to query
1318 * @region_desc:  Returns the requested region descriptor
1319 *
1320 * Return:	'0' on Success; Error code otherwise.
1321 */
1322int dprc_get_obj_region(struct fsl_mc_io *mc_io,
1323			u32 cmd_flags,
1324			u16 token,
1325			char *obj_type,
1326			int obj_id,
1327			u8 region_index,
1328			struct dprc_region_desc *region_desc)
1329{
1330	struct mc_command cmd = { 0 };
1331	int err;
1332
1333	/* prepare command */
1334	cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_OBJ_REG,
1335					  cmd_flags, token);
1336	cmd.params[0] |= mc_enc(0, 32, obj_id);
1337	cmd.params[0] |= mc_enc(48, 8, region_index);
1338	cmd.params[3] |= mc_enc(0, 8, obj_type[0]);
1339	cmd.params[3] |= mc_enc(8, 8, obj_type[1]);
1340	cmd.params[3] |= mc_enc(16, 8, obj_type[2]);
1341	cmd.params[3] |= mc_enc(24, 8, obj_type[3]);
1342	cmd.params[3] |= mc_enc(32, 8, obj_type[4]);
1343	cmd.params[3] |= mc_enc(40, 8, obj_type[5]);
1344	cmd.params[3] |= mc_enc(48, 8, obj_type[6]);
1345	cmd.params[3] |= mc_enc(56, 8, obj_type[7]);
1346	cmd.params[4] |= mc_enc(0, 8, obj_type[8]);
1347	cmd.params[4] |= mc_enc(8, 8, obj_type[9]);
1348	cmd.params[4] |= mc_enc(16, 8, obj_type[10]);
1349	cmd.params[4] |= mc_enc(24, 8, obj_type[11]);
1350	cmd.params[4] |= mc_enc(32, 8, obj_type[12]);
1351	cmd.params[4] |= mc_enc(40, 8, obj_type[13]);
1352	cmd.params[4] |= mc_enc(48, 8, obj_type[14]);
1353	cmd.params[4] |= mc_enc(56, 8, '\0');
1354
1355	/* send command to mc*/
1356	err = mc_send_command(mc_io, &cmd);
1357	if (err)
1358		return err;
1359
1360	/* retrieve response parameters */
1361	region_desc->base_offset = mc_dec(cmd.params[1], 0, 64);
1362	region_desc->size = mc_dec(cmd.params[2], 0, 32);
1363
1364	return 0;
1365}
1366EXPORT_SYMBOL(dprc_get_obj_region);
1367
1368/**
1369 * dprc_set_obj_label() - Set object label.
1370 * @mc_io:	Pointer to MC portal's I/O object
1371 * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1372 * @token:	Token of DPRC object
1373 * @obj_type:	Object's type
1374 * @obj_id:	Object's ID
1375 * @label:	The required label. The maximum length is 16 chars.
1376 *
1377 * Return:	'0' on Success; Error code otherwise.
1378 */
1379int dprc_set_obj_label(struct fsl_mc_io *mc_io,
1380		       u32 cmd_flags,
1381		       u16  token,
1382		       char *obj_type,
1383		       int  obj_id,
1384		       char *label)
1385{
1386	struct mc_command cmd = { 0 };
1387
1388	/* prepare command */
1389	cmd.header = mc_encode_cmd_header(DPRC_CMDID_SET_OBJ_LABEL,
1390					  cmd_flags,
1391					  token);
1392
1393	cmd.params[0] |= mc_enc(0, 32, obj_id);
1394	cmd.params[1] |= mc_enc(0, 8, label[0]);
1395	cmd.params[1] |= mc_enc(8, 8, label[1]);
1396	cmd.params[1] |= mc_enc(16, 8, label[2]);
1397	cmd.params[1] |= mc_enc(24, 8, label[3]);
1398	cmd.params[1] |= mc_enc(32, 8, label[4]);
1399	cmd.params[1] |= mc_enc(40, 8, label[5]);
1400	cmd.params[1] |= mc_enc(48, 8, label[6]);
1401	cmd.params[1] |= mc_enc(56, 8, label[7]);
1402	cmd.params[2] |= mc_enc(0, 8, label[8]);
1403	cmd.params[2] |= mc_enc(8, 8, label[9]);
1404	cmd.params[2] |= mc_enc(16, 8, label[10]);
1405	cmd.params[2] |= mc_enc(24, 8, label[11]);
1406	cmd.params[2] |= mc_enc(32, 8, label[12]);
1407	cmd.params[2] |= mc_enc(40, 8, label[13]);
1408	cmd.params[2] |= mc_enc(48, 8, label[14]);
1409	cmd.params[2] |= mc_enc(56, 8, label[15]);
1410	cmd.params[3] |= mc_enc(0, 8, obj_type[0]);
1411	cmd.params[3] |= mc_enc(8, 8, obj_type[1]);
1412	cmd.params[3] |= mc_enc(16, 8, obj_type[2]);
1413	cmd.params[3] |= mc_enc(24, 8, obj_type[3]);
1414	cmd.params[3] |= mc_enc(32, 8, obj_type[4]);
1415	cmd.params[3] |= mc_enc(40, 8, obj_type[5]);
1416	cmd.params[3] |= mc_enc(48, 8, obj_type[6]);
1417	cmd.params[3] |= mc_enc(56, 8, obj_type[7]);
1418	cmd.params[4] |= mc_enc(0, 8, obj_type[8]);
1419	cmd.params[4] |= mc_enc(8, 8, obj_type[9]);
1420	cmd.params[4] |= mc_enc(16, 8, obj_type[10]);
1421	cmd.params[4] |= mc_enc(24, 8, obj_type[11]);
1422	cmd.params[4] |= mc_enc(32, 8, obj_type[12]);
1423	cmd.params[4] |= mc_enc(40, 8, obj_type[13]);
1424	cmd.params[4] |= mc_enc(48, 8, obj_type[14]);
1425	cmd.params[4] |= mc_enc(56, 8, obj_type[15]);
1426
1427	/* send command to mc*/
1428	return mc_send_command(mc_io, &cmd);
1429}
1430EXPORT_SYMBOL(dprc_set_obj_label);
1431
1432/**
1433 * dprc_connect() - Connect two endpoints to create a network link between them
1434 * @mc_io:	Pointer to MC portal's I/O object
1435 * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1436 * @token:	Token of DPRC object
1437 * @endpoint1:	Endpoint 1 configuration parameters
1438 * @endpoint2:	Endpoint 2 configuration parameters
1439 * @cfg: Connection configuration. The connection configuration is ignored for
1440 *	connections made to DPMAC objects, where rate is set according to
1441 *	MAC configuration.
1442 *	The committed rate is the guaranteed rate for the connection.
1443 *	The maximum rate is an upper limit allowed for the connection; it is
1444 *	expected to be equal or higher than the committed rate.
1445 *	When committed and maximum rates are both zero, the connection is set
1446 *	to "best effort" mode, having lower priority compared to connections
1447 *	with committed or maximum rates.
1448 *
1449 * Return:	'0' on Success; Error code otherwise.
1450 */
1451int dprc_connect(struct fsl_mc_io *mc_io,
1452		 u32 cmd_flags,
1453		 u16 token,
1454		 const struct dprc_endpoint *endpoint1,
1455		 const struct dprc_endpoint *endpoint2,
1456		 const struct dprc_connection_cfg *cfg)
1457{
1458	struct mc_command cmd = { 0 };
1459
1460	/* prepare command */
1461	cmd.header = mc_encode_cmd_header(DPRC_CMDID_CONNECT,
1462					  cmd_flags,
1463					  token);
1464	cmd.params[0] |= mc_enc(0, 32, endpoint1->id);
1465	cmd.params[0] |= mc_enc(32, 32, endpoint1->if_id);
1466	cmd.params[1] |= mc_enc(0, 32, endpoint2->id);
1467	cmd.params[1] |= mc_enc(32, 32, endpoint2->if_id);
1468	cmd.params[2] |= mc_enc(0, 8, endpoint1->type[0]);
1469	cmd.params[2] |= mc_enc(8, 8, endpoint1->type[1]);
1470	cmd.params[2] |= mc_enc(16, 8, endpoint1->type[2]);
1471	cmd.params[2] |= mc_enc(24, 8, endpoint1->type[3]);
1472	cmd.params[2] |= mc_enc(32, 8, endpoint1->type[4]);
1473	cmd.params[2] |= mc_enc(40, 8, endpoint1->type[5]);
1474	cmd.params[2] |= mc_enc(48, 8, endpoint1->type[6]);
1475	cmd.params[2] |= mc_enc(56, 8, endpoint1->type[7]);
1476	cmd.params[3] |= mc_enc(0, 8, endpoint1->type[8]);
1477	cmd.params[3] |= mc_enc(8, 8, endpoint1->type[9]);
1478	cmd.params[3] |= mc_enc(16, 8, endpoint1->type[10]);
1479	cmd.params[3] |= mc_enc(24, 8, endpoint1->type[11]);
1480	cmd.params[3] |= mc_enc(32, 8, endpoint1->type[12]);
1481	cmd.params[3] |= mc_enc(40, 8, endpoint1->type[13]);
1482	cmd.params[3] |= mc_enc(48, 8, endpoint1->type[14]);
1483	cmd.params[3] |= mc_enc(56, 8, endpoint1->type[15]);
1484	cmd.params[4] |= mc_enc(0, 32, cfg->max_rate);
1485	cmd.params[4] |= mc_enc(32, 32, cfg->committed_rate);
1486	cmd.params[5] |= mc_enc(0, 8, endpoint2->type[0]);
1487	cmd.params[5] |= mc_enc(8, 8, endpoint2->type[1]);
1488	cmd.params[5] |= mc_enc(16, 8, endpoint2->type[2]);
1489	cmd.params[5] |= mc_enc(24, 8, endpoint2->type[3]);
1490	cmd.params[5] |= mc_enc(32, 8, endpoint2->type[4]);
1491	cmd.params[5] |= mc_enc(40, 8, endpoint2->type[5]);
1492	cmd.params[5] |= mc_enc(48, 8, endpoint2->type[6]);
1493	cmd.params[5] |= mc_enc(56, 8, endpoint2->type[7]);
1494	cmd.params[6] |= mc_enc(0, 8, endpoint2->type[8]);
1495	cmd.params[6] |= mc_enc(8, 8, endpoint2->type[9]);
1496	cmd.params[6] |= mc_enc(16, 8, endpoint2->type[10]);
1497	cmd.params[6] |= mc_enc(24, 8, endpoint2->type[11]);
1498	cmd.params[6] |= mc_enc(32, 8, endpoint2->type[12]);
1499	cmd.params[6] |= mc_enc(40, 8, endpoint2->type[13]);
1500	cmd.params[6] |= mc_enc(48, 8, endpoint2->type[14]);
1501	cmd.params[6] |= mc_enc(56, 8, endpoint2->type[15]);
1502
1503	/* send command to mc*/
1504	return mc_send_command(mc_io, &cmd);
1505}
1506
1507/**
1508 * dprc_disconnect() - Disconnect one endpoint to remove its network connection
1509 * @mc_io:	Pointer to MC portal's I/O object
1510 * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1511 * @token:	Token of DPRC object
1512 * @endpoint:	Endpoint configuration parameters
1513 *
1514 * Return:	'0' on Success; Error code otherwise.
1515 */
1516int dprc_disconnect(struct fsl_mc_io *mc_io,
1517		    u32 cmd_flags,
1518		    u16 token,
1519		    const struct dprc_endpoint *endpoint)
1520{
1521	struct mc_command cmd = { 0 };
1522
1523	/* prepare command */
1524	cmd.header = mc_encode_cmd_header(DPRC_CMDID_DISCONNECT,
1525					  cmd_flags,
1526					  token);
1527	cmd.params[0] |= mc_enc(0, 32, endpoint->id);
1528	cmd.params[0] |= mc_enc(32, 32, endpoint->if_id);
1529	cmd.params[1] |= mc_enc(0, 8, endpoint->type[0]);
1530	cmd.params[1] |= mc_enc(8, 8, endpoint->type[1]);
1531	cmd.params[1] |= mc_enc(16, 8, endpoint->type[2]);
1532	cmd.params[1] |= mc_enc(24, 8, endpoint->type[3]);
1533	cmd.params[1] |= mc_enc(32, 8, endpoint->type[4]);
1534	cmd.params[1] |= mc_enc(40, 8, endpoint->type[5]);
1535	cmd.params[1] |= mc_enc(48, 8, endpoint->type[6]);
1536	cmd.params[1] |= mc_enc(56, 8, endpoint->type[7]);
1537	cmd.params[2] |= mc_enc(0, 8, endpoint->type[8]);
1538	cmd.params[2] |= mc_enc(8, 8, endpoint->type[9]);
1539	cmd.params[2] |= mc_enc(16, 8, endpoint->type[10]);
1540	cmd.params[2] |= mc_enc(24, 8, endpoint->type[11]);
1541	cmd.params[2] |= mc_enc(32, 8, endpoint->type[12]);
1542	cmd.params[2] |= mc_enc(40, 8, endpoint->type[13]);
1543	cmd.params[2] |= mc_enc(48, 8, endpoint->type[14]);
1544	cmd.params[2] |= mc_enc(56, 8, endpoint->type[15]);
1545
1546	/* send command to mc*/
1547	return mc_send_command(mc_io, &cmd);
1548}
1549
1550/**
1551* dprc_get_connection() - Get connected endpoint and link status if connection
1552*			exists.
1553* @mc_io:	Pointer to MC portal's I/O object
1554* @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1555* @token:	Token of DPRC object
1556* @endpoint1:	Endpoint 1 configuration parameters
1557* @endpoint2:	Returned endpoint 2 configuration parameters
1558* @state:	Returned link state: 1 - link is up, 0 - link is down
1559*
1560* Return:     '0' on Success; -ENAVAIL if connection does not exist.
1561*/
1562int dprc_get_connection(struct fsl_mc_io *mc_io,
1563			u32 cmd_flags,
1564			u16 token,
1565			const struct dprc_endpoint *endpoint1,
1566			struct dprc_endpoint *endpoint2,
1567			int *state)
1568{
1569	struct mc_command cmd = { 0 };
1570	int err;
1571
1572	/* prepare command */
1573	cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_CONNECTION,
1574					  cmd_flags,
1575					  token);
1576	cmd.params[0] |= mc_enc(0, 32, endpoint1->id);
1577	cmd.params[0] |= mc_enc(32, 32, endpoint1->if_id);
1578	cmd.params[1] |= mc_enc(0, 8, endpoint1->type[0]);
1579	cmd.params[1] |= mc_enc(8, 8, endpoint1->type[1]);
1580	cmd.params[1] |= mc_enc(16, 8, endpoint1->type[2]);
1581	cmd.params[1] |= mc_enc(24, 8, endpoint1->type[3]);
1582	cmd.params[1] |= mc_enc(32, 8, endpoint1->type[4]);
1583	cmd.params[1] |= mc_enc(40, 8, endpoint1->type[5]);
1584	cmd.params[1] |= mc_enc(48, 8, endpoint1->type[6]);
1585	cmd.params[1] |= mc_enc(56, 8, endpoint1->type[7]);
1586	cmd.params[2] |= mc_enc(0, 8, endpoint1->type[8]);
1587	cmd.params[2] |= mc_enc(8, 8, endpoint1->type[9]);
1588	cmd.params[2] |= mc_enc(16, 8, endpoint1->type[10]);
1589	cmd.params[2] |= mc_enc(24, 8, endpoint1->type[11]);
1590	cmd.params[2] |= mc_enc(32, 8, endpoint1->type[12]);
1591	cmd.params[2] |= mc_enc(40, 8, endpoint1->type[13]);
1592	cmd.params[2] |= mc_enc(48, 8, endpoint1->type[14]);
1593	cmd.params[2] |= mc_enc(56, 8, endpoint1->type[15]);
1594
1595	/* send command to mc*/
1596	err = mc_send_command(mc_io, &cmd);
1597	if (err)
1598		return err;
1599
1600	/* retrieve response parameters */
1601	endpoint2->id = mc_dec(cmd.params[3], 0, 32);
1602	endpoint2->if_id = mc_dec(cmd.params[3], 32, 32);
1603	endpoint2->type[0] = mc_dec(cmd.params[4], 0, 8);
1604	endpoint2->type[1] = mc_dec(cmd.params[4], 8, 8);
1605	endpoint2->type[2] = mc_dec(cmd.params[4], 16, 8);
1606	endpoint2->type[3] = mc_dec(cmd.params[4], 24, 8);
1607	endpoint2->type[4] = mc_dec(cmd.params[4], 32, 8);
1608	endpoint2->type[5] = mc_dec(cmd.params[4], 40, 8);
1609	endpoint2->type[6] = mc_dec(cmd.params[4], 48, 8);
1610	endpoint2->type[7] = mc_dec(cmd.params[4], 56, 8);
1611	endpoint2->type[8] = mc_dec(cmd.params[5], 0, 8);
1612	endpoint2->type[9] = mc_dec(cmd.params[5], 8, 8);
1613	endpoint2->type[10] = mc_dec(cmd.params[5], 16, 8);
1614	endpoint2->type[11] = mc_dec(cmd.params[5], 24, 8);
1615	endpoint2->type[12] = mc_dec(cmd.params[5], 32, 8);
1616	endpoint2->type[13] = mc_dec(cmd.params[5], 40, 8);
1617	endpoint2->type[14] = mc_dec(cmd.params[5], 48, 8);
1618	endpoint2->type[15] = mc_dec(cmd.params[5], 56, 8);
1619	*state = mc_dec(cmd.params[6], 0, 32);
1620
1621	return 0;
1622}
1623