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#ifndef _FSL_DPRC_H
33#define _FSL_DPRC_H
34
35/* Data Path Resource Container API
36 * Contains DPRC API for managing and querying DPAA resources
37 */
38
39struct fsl_mc_io;
40
41/**
42 * Set this value as the icid value in dprc_cfg structure when creating a
43 * container, in case the ICID is not selected by the user and should be
44 * allocated by the DPRC from the pool of ICIDs.
45 */
46#define DPRC_GET_ICID_FROM_POOL			(uint16_t)(~(0))
47
48/**
49 * Set this value as the portal_id value in dprc_cfg structure when creating a
50 * container, in case the portal ID is not specifically selected by the
51 * user and should be allocated by the DPRC from the pool of portal ids.
52 */
53#define DPRC_GET_PORTAL_ID_FROM_POOL	(int)(~(0))
54
55/**
56 * dprc_open() - Open DPRC object for use
57 * @mc_io:	Pointer to MC portal's I/O object
58 * @container_id: Container ID to open
59 * @token:	Returned token of DPRC object
60 *
61 * Return:	'0' on Success; Error code otherwise.
62 *
63 * @warning	Required before any operation on the object.
64 */
65int dprc_open(struct fsl_mc_io *mc_io, int container_id, uint16_t *token);
66
67/**
68 * dprc_close() - Close the control session of the object
69 * @mc_io:	Pointer to MC portal's I/O object
70 * @token:	Token of DPRC object
71 *
72 * After this function is called, no further operations are
73 * allowed on the object without opening a new control session.
74 *
75 * Return:	'0' on Success; Error code otherwise.
76 */
77int dprc_close(struct fsl_mc_io *mc_io, uint16_t token);
78
79/**
80 * Container general options
81 *
82 * These options may be selected at container creation by the container creator
83 * and can be retrieved using dprc_get_attributes()
84 */
85
86/* Spawn Policy Option allowed - Indicates that the new container is allowed
87 * to spawn and have its own child containers.
88 */
89#define DPRC_CFG_OPT_SPAWN_ALLOWED		0x00000001
90
91/* General Container allocation policy - Indicates that the new container is
92 * allowed to allocate requested resources from its parent container; if not
93 * set, the container is only allowed to use resources in its own pools; Note
94 * that this is a container's global policy, but the parent container may
95 * override it and set specific quota per resource type.
96 */
97#define DPRC_CFG_OPT_ALLOC_ALLOWED		0x00000002
98
99/* Object initialization allowed - software context associated with this
100 * container is allowed to invoke object initialization operations.
101 */
102#define DPRC_CFG_OPT_OBJ_CREATE_ALLOWED	0x00000004
103
104/* Topology change allowed - software context associated with this
105 * container is allowed to invoke topology operations, such as attach/detach
106 * of network objects.
107 */
108#define DPRC_CFG_OPT_TOPOLOGY_CHANGES_ALLOWED	0x00000008
109
110/* IOMMU bypass - indicates whether objects of this container are permitted
111 * to bypass the IOMMU.
112 */
113#define DPRC_CFG_OPT_IOMMU_BYPASS		0x00000010
114
115/* AIOP - Indicates that container belongs to AIOP.  */
116#define DPRC_CFG_OPT_AIOP			0x00000020
117
118/**
119 * struct dprc_cfg - Container configuration options
120 * @icid: Container's ICID; if set to 'DPRC_GET_ICID_FROM_POOL', a free
121 *		ICID value is allocated by the DPRC
122 * @portal_id: Portal ID; if set to 'DPRC_GET_PORTAL_ID_FROM_POOL', a free
123 *		portal ID is allocated by the DPRC
124 * @options: Combination of 'DPRC_CFG_OPT_<X>' options
125 */
126struct dprc_cfg {
127	uint16_t icid;
128	int portal_id;
129	uint64_t options;
130};
131
132/**
133 * dprc_create_container() - Create child container
134 * @mc_io:	Pointer to MC portal's I/O object
135 * @token:	Token of DPRC object
136 * @cfg:	Child container configuration
137 * @child_container_id:	Returned child container ID
138 * @child_portal_paddr:	Returned base physical address of the
139 *					child portal
140 *
141 * Return:	'0' on Success; Error code otherwise.
142 */
143int dprc_create_container(struct fsl_mc_io	*mc_io,
144			  uint16_t		token,
145			  struct dprc_cfg	*cfg,
146			  int			*child_container_id,
147			  uint64_t		*child_portal_paddr);
148
149/**
150 * dprc_destroy_container() - Destroy child container.
151 * @mc_io:	Pointer to MC portal's I/O object
152 * @token:	Token of DPRC object
153 * @child_container_id:	ID of the container to destroy
154 *
155 * This function terminates the child container, so following this call the
156 * child container ID becomes invalid.
157 *
158 * Notes:
159 * - All resources and objects of the destroyed container are returned to the
160 * parent container or destroyed if were created be the destroyed container.
161 * - This function destroy all the child containers of the specified
162 *   container prior to destroying the container itself.
163 *
164 * warning: Only the parent container is allowed to destroy a child policy
165 *		Container 0 can't be destroyed
166 *
167 * Return:	'0' on Success; Error code otherwise.
168 *
169 */
170int dprc_destroy_container(struct fsl_mc_io	*mc_io,
171			   uint16_t		token,
172			   int			child_container_id);
173
174/**
175 * dprc_reset_container - Reset child container.
176 * @mc_io:	Pointer to MC portal's I/O object
177 * @token:	Token of DPRC object
178 * @child_container_id:	ID of the container to reset
179 *
180 * In case a software context crashes or becomes non-responsive, the parent
181 * may wish to reset its resources container before the software context is
182 * restarted.
183 *
184 * This routine informs all objects assigned to the child container that the
185 * container is being reset, so they may perform any cleanup operations that are
186 * needed. All objects handles that were owned by the child container shall be
187 * closed.
188 *
189 * Note that such request may be submitted even if the child software context
190 * has not crashed, but the resulting object cleanup operations will not be
191 * aware of that.
192 *
193 * Return:	'0' on Success; Error code otherwise.
194 */
195int dprc_reset_container(struct fsl_mc_io *mc_io,
196			 uint16_t token,
197			 int child_container_id);
198
199/* IRQ */
200
201/* Number of dprc's IRQs */
202#define DPRC_NUM_OF_IRQS		1
203
204/* Object irq events */
205
206/* IRQ event - Indicates that a new object assigned to the container */
207#define DPRC_IRQ_EVENT_OBJ_ADDED		0x00000001
208/* IRQ event - Indicates that an object was unassigned from the container */
209#define DPRC_IRQ_EVENT_OBJ_REMOVED		0x00000002
210/* IRQ event - Indicates that resources assigned to the container */
211#define DPRC_IRQ_EVENT_RES_ADDED		0x00000004
212/* IRQ event - Indicates that resources unassigned from the container */
213#define DPRC_IRQ_EVENT_RES_REMOVED		0x00000008
214/* IRQ event - Indicates that one of the descendant containers that opened by
215 * this container is destroyed
216 */
217#define DPRC_IRQ_EVENT_CONTAINER_DESTROYED	0x00000010
218
219/* IRQ event - Indicates that on one of the container's opened object is
220 * destroyed
221 */
222#define DPRC_IRQ_EVENT_OBJ_DESTROYED		0x00000020
223
224/* Irq event - Indicates that object is created at the container */
225#define DPRC_IRQ_EVENT_OBJ_CREATED		0x00000040
226
227/**
228 * dprc_set_irq() - Set IRQ information for the DPRC to trigger an interrupt.
229 * @mc_io:	Pointer to MC portal's I/O object
230 * @token:	Token of DPRC object
231 * @irq_index:	Identifies the interrupt index to configure
232 * @irq_addr:	Address that must be written to
233 *			signal a message-based interrupt
234 * @irq_val:	Value to write into irq_addr address
235 * @user_irq_id: Returned a user defined number associated with this IRQ
236 *
237 * Return:	'0' on Success; Error code otherwise.
238 */
239int dprc_set_irq(struct fsl_mc_io	*mc_io,
240		 uint16_t		token,
241		 uint8_t		irq_index,
242		 uint64_t		irq_addr,
243		 uint32_t		irq_val,
244		 int			user_irq_id);
245
246/**
247 * dprc_get_irq() - Get IRQ information from the DPRC.
248 * @mc_io:	Pointer to MC portal's I/O object
249 * @token:	Token of DPRC object
250 * @irq_index:	The interrupt index to configure
251 * @type:	Returned interrupt type: 0 represents message interrupt
252 *			type (both irq_addr and irq_val are valid)
253 * @irq_addr:	Returned address that must be written to
254 *			signal the message-based interrupt
255 * @irq_val:	Value to write into irq_addr address
256 * @user_irq_id: A user defined number associated with this IRQ
257 *
258 * Return:	'0' on Success; Error code otherwise.
259 */
260int dprc_get_irq(struct fsl_mc_io	*mc_io,
261		 uint16_t		token,
262		 uint8_t		irq_index,
263		 int			*type,
264		 uint64_t		*irq_addr,
265		 uint32_t		*irq_val,
266		 int			*user_irq_id);
267
268/**
269 * dprc_set_irq_enable() - Set overall interrupt state.
270 * @mc_io:	Pointer to MC portal's I/O object
271 * @token:	Token of DPRC object
272 * @irq_index:	The interrupt index to configure
273 * @en:		Interrupt state - enable = 1, disable = 0
274 *
275 * Allows GPP software to control when interrupts are generated.
276 * Each interrupt can have up to 32 causes.  The enable/disable control's the
277 * overall interrupt state. if the interrupt is disabled no causes will cause
278 * an interrupt.
279 *
280 * Return:	'0' on Success; Error code otherwise.
281 */
282int dprc_set_irq_enable(struct fsl_mc_io	*mc_io,
283			uint16_t		token,
284			uint8_t			irq_index,
285			uint8_t			en);
286
287/**
288 * dprc_get_irq_enable() - Get overall interrupt state.
289 * @mc_io:	Pointer to MC portal's I/O object
290 * @token:	Token of DPRC object
291 * @irq_index:  The interrupt index to configure
292 * @en:		Returned interrupt state - enable = 1, disable = 0
293 *
294 * Return:	'0' on Success; Error code otherwise.
295 */
296int dprc_get_irq_enable(struct fsl_mc_io	*mc_io,
297			uint16_t		token,
298			uint8_t			irq_index,
299			uint8_t			*en);
300
301/**
302 * dprc_set_irq_mask() - Set interrupt mask.
303 * @mc_io:	Pointer to MC portal's I/O object
304 * @token:	Token of DPRC object
305 * @irq_index:	The interrupt index to configure
306 * @mask:	event mask to trigger interrupt;
307 *			each bit:
308 *				0 = ignore event
309 *				1 = consider event for asserting irq
310 *
311 * Every interrupt can have up to 32 causes and the interrupt model supports
312 * masking/unmasking each cause independently
313 *
314 * Return:	'0' on Success; Error code otherwise.
315 */
316int dprc_set_irq_mask(struct fsl_mc_io	*mc_io,
317		      uint16_t		token,
318		      uint8_t		irq_index,
319		      uint32_t		mask);
320
321/**
322 * dprc_get_irq_mask() - Get interrupt mask.
323 * @mc_io:	Pointer to MC portal's I/O object
324 * @token:	Token of DPRC object
325 * @irq_index:	The interrupt index to configure
326 * @mask:	Returned event mask to trigger interrupt
327 *
328 * Every interrupt can have up to 32 causes and the interrupt model supports
329 * masking/unmasking each cause independently
330 *
331 * Return:	'0' on Success; Error code otherwise.
332 */
333int dprc_get_irq_mask(struct fsl_mc_io	*mc_io,
334		      uint16_t		token,
335		      uint8_t		irq_index,
336		      uint32_t		*mask);
337
338/**
339 * dprc_get_irq_status() - Get the current status of any pending interrupts.
340 * @mc_io:	Pointer to MC portal's I/O object
341 * @token:	Token of DPRC object
342 * @irq_index:	The interrupt index to configure
343 * @status:	Returned interrupts status - one bit per cause:
344 *			0 = no interrupt pending
345 *			1 = interrupt pending
346 *
347 * Return:	'0' on Success; Error code otherwise.
348 */
349int dprc_get_irq_status(struct fsl_mc_io	*mc_io,
350			uint16_t		token,
351			uint8_t			irq_index,
352			uint32_t		*status);
353
354/**
355 * dprc_clear_irq_status() - Clear a pending interrupt's status
356 * @mc_io:	Pointer to MC portal's I/O object
357 * @token:	Token of DPRC object
358 * @irq_index:	The interrupt index to configure
359 * @status:	bits to clear (W1C) - one bit per cause:
360 *					0 = don't change
361 *					1 = clear status bit
362 *
363 * Return:	'0' on Success; Error code otherwise.
364 */
365int dprc_clear_irq_status(struct fsl_mc_io	*mc_io,
366			  uint16_t		token,
367			  uint8_t		irq_index,
368			  uint32_t		status);
369
370/**
371 * struct dprc_attributes - Container attributes
372 * @container_id: Container's ID
373 * @icid: Container's ICID
374 * @portal_id: Container's portal ID
375 * @options: Container's options as set at container's creation
376 * @version: DPRC version
377 */
378struct dprc_attributes {
379	int container_id;
380	uint16_t icid;
381	int portal_id;
382	uint64_t options;
383	/**
384	 * struct version - DPRC version
385	 * @major: DPRC major version
386	 * @minor: DPRC minor version
387	 */
388	struct {
389		uint16_t major;
390		uint16_t minor;
391	} version;
392};
393
394/**
395 * dprc_get_attributes() - Obtains container attributes
396 * @mc_io:	Pointer to MC portal's I/O object
397 * @token:	Token of DPRC object
398 * @attributes	Returned container attributes
399 *
400 * Return:     '0' on Success; Error code otherwise.
401 */
402int dprc_get_attributes(struct fsl_mc_io	*mc_io,
403			uint16_t		token,
404			struct dprc_attributes	*attributes);
405
406/**
407 * dprc_set_res_quota() - Set allocation policy for a specific resource/object
408 *		type in a child container
409 * @mc_io:	Pointer to MC portal's I/O object
410 * @token:	Token of DPRC object
411 * @child_container_id:	ID of the child container
412 * @type:	Resource/object type
413 * @quota:	Sets the maximum number of resources of	the selected type
414 *		that the child container is allowed to allocate from its parent;
415 *		when quota is set to -1, the policy is the same as container's
416 *		general policy.
417 *
418 * Allocation policy determines whether or not a container may allocate
419 * resources from its parent. Each container has a 'global' allocation policy
420 * that is set when the container is created.
421 *
422 * This function sets allocation policy for a specific resource type.
423 * The default policy for all resource types matches the container's 'global'
424 * allocation policy.
425 *
426 * Return:	'0' on Success; Error code otherwise.
427 *
428 * @warning	Only the parent container is allowed to change a child policy.
429 */
430int dprc_set_res_quota(struct fsl_mc_io	*mc_io,
431		       uint16_t		token,
432		       int		child_container_id,
433		       char		*type,
434		       uint16_t		quota);
435
436/**
437 * dprc_get_res_quota() - Gets the allocation policy of a specific
438 *		resource/object type in a child container
439 * @mc_io:	Pointer to MC portal's I/O object
440 * @token:	Token of DPRC object
441 * @child_container_id;	ID of the child container
442 * @type:	resource/object type
443 * @quota:	Returnes the maximum number of resources of the selected type
444 *		that the child container is allowed to allocate from the parent;
445 *		when quota is set to -1, the policy is the same as container's
446 *		general policy.
447 *
448 * Return:	'0' on Success; Error code otherwise.
449 */
450int dprc_get_res_quota(struct fsl_mc_io	*mc_io,
451		       uint16_t		token,
452		       int		child_container_id,
453		       char		*type,
454		       uint16_t		*quota);
455
456/* Resource request options */
457
458/* Explicit resource ID request - The requested objects/resources
459 * are explicit and sequential (in case of resources).
460 * The base ID is given at res_req at base_align field
461 */
462#define DPRC_RES_REQ_OPT_EXPLICIT		0x00000001
463
464/* Aligned resources request - Relevant only for resources
465 * request (and not objects). Indicates that resources base ID should be
466 * sequential and aligned to the value given at dprc_res_req base_align field
467 */
468#define DPRC_RES_REQ_OPT_ALIGNED		0x00000002
469
470/* Plugged Flag - Relevant only for object assignment request.
471 * Indicates that after all objects assigned. An interrupt will be invoked at
472 * the relevant GPP. The assigned object will be marked as plugged.
473 * plugged objects can't be assigned from their container
474 */
475#define DPRC_RES_REQ_OPT_PLUGGED		0x00000004
476
477/**
478 * struct dprc_res_req - Resource request descriptor, to be used in assignment
479 *			or un-assignment of resources and objects.
480 * @type: Resource/object type: Represent as a NULL terminated string.
481 *	This string may received by using dprc_get_pool() to get resource
482 *	type and dprc_get_obj() to get object type;
483 *	Note: it is not possible to assign/un-assign DPRC objects
484 * @num: Number of resources
485 * @options: Request options: combination of DPRC_RES_REQ_OPT_ options
486 * @id_base_align: In case of explicit assignment (DPRC_RES_REQ_OPT_EXPLICIT
487 *		is set at option), this field represents the required base ID
488 *		for resource allocation; In case of aligned assignment
489 *		(DPRC_RES_REQ_OPT_ALIGNED is set at option), this field
490 *		indicates the required alignment for the resource ID(s) -
491 *		use 0 if there is no alignment or explicit ID requirements
492 */
493struct dprc_res_req {
494	char type[16];
495	uint32_t num;
496	uint32_t options;
497	int id_base_align;
498};
499
500/**
501 * dprc_assign() - Assigns objects or resource to a child container.
502 * @mc_io:	Pointer to MC portal's I/O object
503 * @token:	Token of DPRC object
504 * @container_id: ID of the child container
505 * @res_req:	Describes the type and amount of resources to
506 *			assign to the given container
507 *
508 * Assignment is usually done by a parent (this DPRC) to one of its child
509 * containers.
510 *
511 * According to the DPRC allocation policy, the assigned resources may be taken
512 * (allocated) from the container's ancestors, if not enough resources are
513 * available in the container itself.
514 *
515 * The type of assignment depends on the dprc_res_req options, as follows:
516 * - DPRC_RES_REQ_OPT_EXPLICIT: indicates that assigned resources should have
517 *   the explicit base ID specified at the id_base_align field of res_req.
518 * - DPRC_RES_REQ_OPT_ALIGNED: indicates that the assigned resources should be
519 *   aligned to the value given at id_base_align field of res_req.
520 * - DPRC_RES_REQ_OPT_PLUGGED: Relevant only for object assignment,
521 *   and indicates that the object must be set to the plugged state.
522 *
523 * A container may use this function with its own ID in order to change a
524 * object state to plugged or unplugged.
525 *
526 * If IRQ information has been set in the child DPRC, it will signal an
527 * interrupt following every change in its object assignment.
528 *
529 * Return:	'0' on Success; Error code otherwise.
530 */
531int dprc_assign(struct fsl_mc_io	*mc_io,
532		uint16_t		token,
533		int			container_id,
534		struct dprc_res_req	*res_req);
535
536/**
537 * dprc_unassign() - Un-assigns objects or resources from a child container
538 *		and moves them into this (parent) DPRC.
539 * @mc_io:	Pointer to MC portal's I/O object
540 * @token:	Token of DPRC object
541 * @child_container_id:	ID of the child container
542 * @res_req:	Describes the type and amount of resources to un-assign from
543 *		the child container
544 *
545 * Un-assignment of objects can succeed only if the object is not in the
546 * plugged or opened state.
547 *
548 * Return:	'0' on Success; Error code otherwise.
549 */
550int dprc_unassign(struct fsl_mc_io	*mc_io,
551		  uint16_t		token,
552		  int			child_container_id,
553		  struct dprc_res_req	*res_req);
554
555/**
556 * dprc_get_pool_count() - Get the number of dprc's pools
557 * @mc_io:	Pointer to MC portal's I/O object
558 * @token:	Token of DPRC object
559 * @pool_count:	Returned number of resource pools in the dprc
560 *
561 * Return:	'0' on Success; Error code otherwise.
562 */
563int dprc_get_pool_count(struct fsl_mc_io	*mc_io,
564			uint16_t		token,
565			int			*pool_count);
566
567/**
568 * dprc_get_pool() - Get the type (string) of a certain dprc's pool
569 * @mc_io:	Pointer to MC portal's I/O object
570 * @token:	Token of DPRC object
571 * @pool_index;	Index of the pool to be queried (< pool_count)
572 * @type:	The type of the pool
573 *
574 * The pool types retrieved one by one by incrementing
575 * pool_index up to (not including) the value of pool_count returned
576 * from dprc_get_pool_count(). dprc_get_pool_count() must
577 * be called prior to dprc_get_pool().
578 *
579 * Return:	'0' on Success; Error code otherwise.
580 */
581int dprc_get_pool(struct fsl_mc_io	*mc_io,
582		  uint16_t		token,
583		  int			pool_index,
584		  char			*type);
585
586/**
587 * dprc_get_obj_count() - Obtains the number of objects in the DPRC
588 * @mc_io:	Pointer to MC portal's I/O object
589 * @token:	Token of DPRC object
590 * @obj_count:	Number of objects assigned to the DPRC
591 *
592 * Return:	'0' on Success; Error code otherwise.
593 */
594int dprc_get_obj_count(struct fsl_mc_io *mc_io, uint16_t token, int *obj_count);
595
596/* Objects Attributes Flags */
597
598/* Opened state - Indicates that an object is open by at least one owner */
599#define DPRC_OBJ_STATE_OPEN		0x00000001
600/* Plugged state - Indicates that the object is plugged */
601#define DPRC_OBJ_STATE_PLUGGED		0x00000002
602
603/**
604 * struct dprc_obj_desc - Object descriptor, returned from dprc_get_obj()
605 * @type: Type of object: NULL terminated string
606 * @id: ID of logical object resource
607 * @vendor: Object vendor identifier
608 * @ver_major: Major version number
609 * @ver_minor:  Minor version number
610 * @irq_count: Number of interrupts supported by the object
611 * @region_count: Number of mappable regions supported by the object
612 * @state: Object state: combination of DPRC_OBJ_STATE_ states
613 */
614struct dprc_obj_desc {
615	char type[16];
616	int id;
617	uint16_t vendor;
618	uint16_t ver_major;
619	uint16_t ver_minor;
620	uint8_t irq_count;
621	uint8_t region_count;
622	uint32_t state;
623};
624
625/**
626 * dprc_get_obj() - Get general information on an object
627 * @mc_io:	Pointer to MC portal's I/O object
628 * @token:	Token of DPRC object
629 * @obj_index:	Index of the object to be queried (< obj_count)
630 * @obj_desc:	Returns the requested object descriptor
631 *
632 * The object descriptors are retrieved one by one by incrementing
633 * obj_index up to (not including) the value of obj_count returned
634 * from dprc_get_obj_count(). dprc_get_obj_count() must
635 * be called prior to dprc_get_obj().
636 *
637 * Return:	'0' on Success; Error code otherwise.
638 */
639int dprc_get_obj(struct fsl_mc_io	*mc_io,
640		 uint16_t		token,
641		 int			obj_index,
642		 struct dprc_obj_desc	*obj_desc);
643
644/**
645 * dprc_get_res_count() - Obtains the number of free resources that are assigned
646 *		to this container, by pool type
647 * @mc_io:	Pointer to MC portal's I/O object
648 * @token:	Token of DPRC object
649 * @type:	pool type
650 * @res_count:	Returned number of free resources of the given
651 *			resource type that are assigned to this DPRC
652 *
653 * Return:	'0' on Success; Error code otherwise.
654 */
655int dprc_get_res_count(struct fsl_mc_io	*mc_io,
656		       uint16_t		token,
657		       char		*type,
658		       int		*res_count);
659
660/**
661 * enum dprc_iter_status - Iteration status
662 * @DPRC_ITER_STATUS_FIRST: Perform first iteration
663 * @DPRC_ITER_STATUS_MORE: Indicates more/next iteration is needed
664 * @DPRC_ITER_STATUS_LAST: Indicates last iteration
665 */
666enum dprc_iter_status {
667	DPRC_ITER_STATUS_FIRST = 0,
668	DPRC_ITER_STATUS_MORE = 1,
669	DPRC_ITER_STATUS_LAST = 2
670};
671
672/**
673 * struct dprc_res_ids_range_desc - Resource ID range descriptor
674 * @base_id: Base resource ID of this range
675 * @last_id: Last resource ID of this range
676 * @iter_status: Iteration status - should be set to DPRC_ITER_STATUS_FIRST at
677 *	first iteration; while the returned marker is DPRC_ITER_STATUS_MORE,
678 *	additional iterations are needed, until the returned marker is
679 *	DPRC_ITER_STATUS_LAST
680 */
681struct dprc_res_ids_range_desc {
682	int base_id;
683	int last_id;
684	enum dprc_iter_status iter_status;
685};
686
687/**
688 * dprc_get_res_ids() - Obtains IDs of free resources in the container
689 * @mc_io:	Pointer to MC portal's I/O object
690 * @token:	Token of DPRC object
691 * @type:	pool type
692 * @range_desc:	range descriptor
693 *
694 * Return:	'0' on Success; Error code otherwise.
695 */
696int dprc_get_res_ids(struct fsl_mc_io			*mc_io,
697		     uint16_t				token,
698		     char				*type,
699		     struct dprc_res_ids_range_desc	*range_desc);
700
701/**
702 * dprc_get_portal_paddr() - Get the physical address of MC portals
703 * @mc_io:	Pointer to MC portal's I/O object
704 * @token:	Token of DPRC object
705 * @portal_id:	MC portal ID
706 * @portal_addr: The physical address of the MC portal ID
707 *
708 * Return:	'0' on Success; Error code otherwise.
709 */
710int dprc_get_portal_paddr(struct fsl_mc_io	*mc_io,
711			  uint16_t		token,
712			  int			portal_id,
713			  uint64_t		*portal_addr);
714
715/**
716 * struct dprc_region_desc - Mappable region descriptor
717 * @base_paddr: Region base physical address
718 * @size: Region size (in bytes)
719 */
720struct dprc_region_desc {
721	uint64_t base_paddr;
722	uint32_t size;
723};
724
725/**
726 * dprc_get_obj_region() - Get region information for a specified object.
727 * @mc_io:	Pointer to MC portal's I/O object
728 * @token:	Token of DPRC object
729 * @obj_type;	Object type as returned in dprc_get_obj()
730 * @obj_id:	Unique object instance as returned in dprc_get_obj()
731 * @region_index: The specific region to query
732 * @region_desc:  Returns the requested region descriptor
733 *
734 * Return:	'0' on Success; Error code otherwise.
735 */
736int dprc_get_obj_region(struct fsl_mc_io	*mc_io,
737			uint16_t		token,
738			char			*obj_type,
739			int			obj_id,
740			uint8_t			region_index,
741			struct dprc_region_desc	*region_desc);
742
743/**
744 * struct dprc_endpoint - Endpoint description for link connect/disconnect
745 *			operations
746 * @type: Endpoint object type: NULL terminated string
747 * @id: Endpoint object ID
748 * @interface_id: Interface ID; should be set for endpoints with multiple
749 *		interfaces ("dpsw", "dpdmux"); for others, always set to 0
750 */
751struct dprc_endpoint {
752	char type[16];
753	int id;
754	int interface_id;
755};
756
757/**
758 * dprc_connect() - Connect two endpoints to create a network link between them
759 * @mc_io:	Pointer to MC portal's I/O object
760 * @token:	Token of DPRC object
761 * @endpoint1:	Endpoint 1 configuration parameters
762 * @endpoint2:	Endpoint 2 configuration parameters
763 *
764 * Return:	'0' on Success; Error code otherwise.
765 */
766int dprc_connect(struct fsl_mc_io		*mc_io,
767		 uint16_t			token,
768		 const struct dprc_endpoint	*endpoint1,
769		 const struct dprc_endpoint	*endpoint2);
770
771/**
772 * dprc_disconnect() - Disconnect one endpoint to remove its network connection
773 * @mc_io:	Pointer to MC portal's I/O object
774 * @token:	Token of DPRC object
775 * @endpoint:	Endpoint configuration parameters
776 *
777 * Return:	'0' on Success; Error code otherwise.
778 */
779int dprc_disconnect(struct fsl_mc_io		*mc_io,
780		    uint16_t			token,
781		    const struct dprc_endpoint	*endpoint);
782
783/**
784* dprc_get_connection() - Get connected endpoint and link status if connection
785*			exists.
786* @mc_io		Pointer to MC portal's I/O object
787* @token		Token of DPRC object
788* @endpoint1	Endpoint 1 configuration parameters
789* @endpoint2	Returned endpoint 2 configuration parameters
790* @state:	Returned link state: 1 - link is up, 0 - link is down
791*
792* Return:     '0' on Success; -ENAVAIL if connection does not exist.
793*/
794int dprc_get_connection(struct fsl_mc_io		*mc_io,
795			uint16_t			token,
796			const struct dprc_endpoint	*endpoint1,
797			struct dprc_endpoint		*endpoint2,
798			int				*state);
799
800#endif /* _FSL_DPRC_H */
801
802