xref: /OK3568_Linux_fs/u-boot/include/fsl-mc/fsl_dprc.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Freescale Layerscape MC I/O wrapper
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * Copyright (C) 2013-2015 Freescale Semiconductor, Inc.
5*4882a593Smuzhiyun  * Author: German Rivera <German.Rivera@freescale.com>
6*4882a593Smuzhiyun  *
7*4882a593Smuzhiyun  * SPDX-License-Identifier:	GPL-2.0+
8*4882a593Smuzhiyun  */
9*4882a593Smuzhiyun #ifndef _FSL_DPRC_H
10*4882a593Smuzhiyun #define _FSL_DPRC_H
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun /* DPRC Version */
13*4882a593Smuzhiyun #define DPRC_VER_MAJOR				5
14*4882a593Smuzhiyun #define DPRC_VER_MINOR				1
15*4882a593Smuzhiyun 
16*4882a593Smuzhiyun /* Command IDs */
17*4882a593Smuzhiyun #define DPRC_CMDID_CLOSE			0x800
18*4882a593Smuzhiyun #define DPRC_CMDID_OPEN				0x805
19*4882a593Smuzhiyun #define DPRC_CMDID_CREATE			0x905
20*4882a593Smuzhiyun 
21*4882a593Smuzhiyun #define DPRC_CMDID_GET_ATTR			0x004
22*4882a593Smuzhiyun #define DPRC_CMDID_RESET_CONT			0x005
23*4882a593Smuzhiyun 
24*4882a593Smuzhiyun #define DPRC_CMDID_CREATE_CONT			0x151
25*4882a593Smuzhiyun #define DPRC_CMDID_DESTROY_CONT			0x152
26*4882a593Smuzhiyun #define DPRC_CMDID_GET_CONT_ID			0x830
27*4882a593Smuzhiyun #define DPRC_CMDID_GET_OBJ_COUNT		0x159
28*4882a593Smuzhiyun #define DPRC_CMDID_GET_OBJ			0x15A
29*4882a593Smuzhiyun #define DPRC_CMDID_GET_RES_COUNT		0x15B
30*4882a593Smuzhiyun #define DPRC_CMDID_GET_RES_IDS			0x15C
31*4882a593Smuzhiyun #define DPRC_CMDID_GET_OBJ_REG			0x15E
32*4882a593Smuzhiyun 
33*4882a593Smuzhiyun #define DPRC_CMDID_CONNECT			0x167
34*4882a593Smuzhiyun #define DPRC_CMDID_DISCONNECT			0x168
35*4882a593Smuzhiyun #define DPRC_CMDID_GET_CONNECTION		0x16C
36*4882a593Smuzhiyun 
37*4882a593Smuzhiyun /*                cmd, param, offset, width, type, arg_name */
38*4882a593Smuzhiyun #define DPRC_RSP_GET_CONTAINER_ID(cmd, container_id) \
39*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 0, 0,  32,  int,	    container_id)
40*4882a593Smuzhiyun 
41*4882a593Smuzhiyun /*                cmd, param, offset, width, type, arg_name */
42*4882a593Smuzhiyun #define DPRC_CMD_OPEN(cmd, container_id) \
43*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 0, 0,  32, int,	    container_id)
44*4882a593Smuzhiyun 
45*4882a593Smuzhiyun /*                cmd, param, offset, width, type, arg_name */
46*4882a593Smuzhiyun #define DPRC_CMD_CREATE_CONTAINER(cmd, cfg) \
47*4882a593Smuzhiyun do { \
48*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 0, 32, 16, uint16_t, cfg->icid); \
49*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 0, 0,  32, uint32_t, cfg->options); \
50*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 1, 32, 32, int,	    cfg->portal_id); \
51*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 2, 0,  8,  char,	    cfg->label[0]);\
52*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 2, 8,  8,  char,	    cfg->label[1]);\
53*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 2, 16, 8,  char,	    cfg->label[2]);\
54*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 2, 24, 8,  char,	    cfg->label[3]);\
55*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 2, 32, 8,  char,	    cfg->label[4]);\
56*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 2, 40, 8,  char,	    cfg->label[5]);\
57*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 2, 48, 8,  char,	    cfg->label[6]);\
58*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 2, 56, 8,  char,	    cfg->label[7]);\
59*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 3, 0,  8,  char,	    cfg->label[8]);\
60*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 3, 8,  8,  char,	    cfg->label[9]);\
61*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 3, 16, 8,  char,	    cfg->label[10]);\
62*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 3, 24, 8,  char,	    cfg->label[11]);\
63*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 3, 32, 8,  char,	    cfg->label[12]);\
64*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 3, 40, 8,  char,	    cfg->label[13]);\
65*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 3, 48, 8,  char,	    cfg->label[14]);\
66*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 3, 56, 8,  char,	    cfg->label[15]);\
67*4882a593Smuzhiyun } while (0)
68*4882a593Smuzhiyun 
69*4882a593Smuzhiyun /*                cmd, param, offset, width, type, arg_name */
70*4882a593Smuzhiyun #define DPRC_RSP_CREATE_CONTAINER(cmd, child_container_id, child_portal_offset)\
71*4882a593Smuzhiyun do { \
72*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 1, 0,  32, int,	   child_container_id); \
73*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 2, 0,  64, uint64_t, child_portal_offset);\
74*4882a593Smuzhiyun } while (0)
75*4882a593Smuzhiyun 
76*4882a593Smuzhiyun /*                cmd, param, offset, width, type, arg_name */
77*4882a593Smuzhiyun #define DPRC_CMD_DESTROY_CONTAINER(cmd, child_container_id) \
78*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 0, 0,  32, int,	    child_container_id)
79*4882a593Smuzhiyun 
80*4882a593Smuzhiyun /*                cmd, param, offset, width, type, arg_name */
81*4882a593Smuzhiyun #define DPRC_CMD_RESET_CONTAINER(cmd, child_container_id) \
82*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 0, 0,  32, int,	    child_container_id)
83*4882a593Smuzhiyun 
84*4882a593Smuzhiyun /*                cmd, param, offset, width, type, arg_name */
85*4882a593Smuzhiyun #define DPRC_RSP_GET_ATTRIBUTES(cmd, attr) \
86*4882a593Smuzhiyun do { \
87*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 0, 0,  32, int,	    attr->container_id); \
88*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 0, 32, 16, uint16_t, attr->icid); \
89*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 1, 0,  32, uint32_t, attr->options);\
90*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 1, 32, 32, int,      attr->portal_id); \
91*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 2, 0,  16, uint16_t, attr->version.major);\
92*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 2, 16, 16, uint16_t, attr->version.minor);\
93*4882a593Smuzhiyun } while (0)
94*4882a593Smuzhiyun 
95*4882a593Smuzhiyun /*                cmd, param, offset, width, type, arg_name */
96*4882a593Smuzhiyun #define DPRC_RSP_GET_OBJ_COUNT(cmd, obj_count) \
97*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 0, 32, 32, int,      obj_count)
98*4882a593Smuzhiyun 
99*4882a593Smuzhiyun /*                cmd, param, offset, width, type, arg_name */
100*4882a593Smuzhiyun #define DPRC_CMD_GET_OBJ(cmd, obj_index) \
101*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 0, 0,  32, int,	    obj_index)
102*4882a593Smuzhiyun 
103*4882a593Smuzhiyun /*                cmd, param, offset, width, type, arg_name */
104*4882a593Smuzhiyun #define DPRC_RSP_GET_OBJ(cmd, obj_desc) \
105*4882a593Smuzhiyun do { \
106*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 0, 32, 32, int,	    obj_desc->id); \
107*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 1, 0,  16, uint16_t, obj_desc->vendor); \
108*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 1, 16, 8,  uint8_t,  obj_desc->irq_count); \
109*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 1, 24, 8,  uint8_t,  obj_desc->region_count); \
110*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 1, 32, 32, uint32_t, obj_desc->state);\
111*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 2, 0,  16, uint16_t, obj_desc->ver_major);\
112*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 2, 16, 16, uint16_t, obj_desc->ver_minor);\
113*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 2, 32, 16, uint16_t, obj_desc->flags); \
114*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 3, 0,  8,  char,	    obj_desc->type[0]);\
115*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 3, 8,  8,  char,	    obj_desc->type[1]);\
116*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 3, 16, 8,  char,	    obj_desc->type[2]);\
117*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 3, 24, 8,  char,	    obj_desc->type[3]);\
118*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 3, 32, 8,  char,	    obj_desc->type[4]);\
119*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 3, 40, 8,  char,	    obj_desc->type[5]);\
120*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 3, 48, 8,  char,	    obj_desc->type[6]);\
121*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 3, 56, 8,  char,	    obj_desc->type[7]);\
122*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 4, 0,  8,  char,	    obj_desc->type[8]);\
123*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 4, 8,  8,  char,	    obj_desc->type[9]);\
124*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 4, 16, 8,  char,	    obj_desc->type[10]);\
125*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 4, 24, 8,  char,	    obj_desc->type[11]);\
126*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 4, 32, 8,  char,	    obj_desc->type[12]);\
127*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 4, 40, 8,  char,	    obj_desc->type[13]);\
128*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 4, 48, 8,  char,	    obj_desc->type[14]);\
129*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 4, 56, 8,  char,	    obj_desc->type[15]);\
130*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 5, 0,  8,  char,	    obj_desc->label[0]);\
131*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 5, 8,  8,  char,	    obj_desc->label[1]);\
132*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 5, 16, 8,  char,	    obj_desc->label[2]);\
133*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 5, 24, 8,  char,	    obj_desc->label[3]);\
134*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 5, 32, 8,  char,	    obj_desc->label[4]);\
135*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 5, 40, 8,  char,	    obj_desc->label[5]);\
136*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 5, 48, 8,  char,	    obj_desc->label[6]);\
137*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 5, 56, 8,  char,	    obj_desc->label[7]);\
138*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 6, 0,  8,  char,	    obj_desc->label[8]);\
139*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 6, 8,  8,  char,	    obj_desc->label[9]);\
140*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 6, 16, 8,  char,	    obj_desc->label[10]);\
141*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 6, 24, 8,  char,	    obj_desc->label[11]);\
142*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 6, 32, 8,  char,	    obj_desc->label[12]);\
143*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 6, 40, 8,  char,	    obj_desc->label[13]);\
144*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 6, 48, 8,  char,	    obj_desc->label[14]);\
145*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 6, 56, 8,  char,	    obj_desc->label[15]);\
146*4882a593Smuzhiyun } while (0)
147*4882a593Smuzhiyun 
148*4882a593Smuzhiyun /*                cmd, param, offset, width, type, arg_name */
149*4882a593Smuzhiyun #define DPRC_CMD_GET_OBJ_DESC(cmd, obj_type, obj_id) \
150*4882a593Smuzhiyun do { \
151*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 0, 0,  32, int,	    obj_id);\
152*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 1, 0,  8,  char,     obj_type[0]);\
153*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 1, 8,  8,  char,	    obj_type[1]);\
154*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 1, 16, 8,  char,	    obj_type[2]);\
155*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 1, 24, 8,  char,	    obj_type[3]);\
156*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 1, 32, 8,  char,	    obj_type[4]);\
157*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 1, 40, 8,  char,	    obj_type[5]);\
158*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 1, 48, 8,  char,	    obj_type[6]);\
159*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 1, 56, 8,  char,	    obj_type[7]);\
160*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 2, 0,  8,  char,	    obj_type[8]);\
161*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 2, 8,  8,  char,	    obj_type[9]);\
162*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 2, 16, 8,  char,	    obj_type[10]);\
163*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 2, 24, 8,  char,	    obj_type[11]);\
164*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 2, 32, 8,  char,	    obj_type[12]);\
165*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 2, 40, 8,  char,	    obj_type[13]);\
166*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 2, 48, 8,  char,     obj_type[14]);\
167*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 2, 56, 8,  char,	    obj_type[15]);\
168*4882a593Smuzhiyun } while (0)
169*4882a593Smuzhiyun 
170*4882a593Smuzhiyun /*                cmd, param, offset, width, type, arg_name */
171*4882a593Smuzhiyun #define DPRC_RSP_GET_OBJ_DESC(cmd, obj_desc) \
172*4882a593Smuzhiyun do { \
173*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 0, 32, 32, int,	    obj_desc->id); \
174*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 1, 0,  16, uint16_t, obj_desc->vendor); \
175*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 1, 16, 8,  uint8_t,  obj_desc->irq_count); \
176*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 1, 24, 8,  uint8_t,  obj_desc->region_count); \
177*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 1, 32, 32, uint32_t, obj_desc->state);\
178*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 2, 0,  16, uint16_t, obj_desc->ver_major);\
179*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 2, 16, 16, uint16_t, obj_desc->ver_minor);\
180*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 2, 32, 16, uint16_t, obj_desc->flags); \
181*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 3, 0,  8,  char,	    obj_desc->type[0]);\
182*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 3, 8,  8,  char,	    obj_desc->type[1]);\
183*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 3, 16, 8,  char,	    obj_desc->type[2]);\
184*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 3, 24, 8,  char,	    obj_desc->type[3]);\
185*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 3, 32, 8,  char,	    obj_desc->type[4]);\
186*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 3, 40, 8,  char,	    obj_desc->type[5]);\
187*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 3, 48, 8,  char,	    obj_desc->type[6]);\
188*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 3, 56, 8,  char,	    obj_desc->type[7]);\
189*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 4, 0,  8,  char,	    obj_desc->type[8]);\
190*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 4, 8,  8,  char,	    obj_desc->type[9]);\
191*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 4, 16, 8,  char,	    obj_desc->type[10]);\
192*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 4, 24, 8,  char,	    obj_desc->type[11]);\
193*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 4, 32, 8,  char,	    obj_desc->type[12]);\
194*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 4, 40, 8,  char,	    obj_desc->type[13]);\
195*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 4, 48, 8,  char,	    obj_desc->type[14]);\
196*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 4, 56, 8,  char,	    obj_desc->type[15]);\
197*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 5, 0,  8,  char,	    obj_desc->label[0]);\
198*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 5, 8,  8,  char,	    obj_desc->label[1]);\
199*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 5, 16, 8,  char,	    obj_desc->label[2]);\
200*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 5, 24, 8,  char,	    obj_desc->label[3]);\
201*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 5, 32, 8,  char,	    obj_desc->label[4]);\
202*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 5, 40, 8,  char,	    obj_desc->label[5]);\
203*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 5, 48, 8,  char,	    obj_desc->label[6]);\
204*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 5, 56, 8,  char,	    obj_desc->label[7]);\
205*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 6, 0,  8,  char,	    obj_desc->label[8]);\
206*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 6, 8,  8,  char,	    obj_desc->label[9]);\
207*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 6, 16, 8,  char,	    obj_desc->label[10]);\
208*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 6, 24, 8,  char,	    obj_desc->label[11]);\
209*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 6, 32, 8,  char,	    obj_desc->label[12]);\
210*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 6, 40, 8,  char,	    obj_desc->label[13]);\
211*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 6, 48, 8,  char,	    obj_desc->label[14]);\
212*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 6, 56, 8,  char,	    obj_desc->label[15]);\
213*4882a593Smuzhiyun } while (0)
214*4882a593Smuzhiyun 
215*4882a593Smuzhiyun /*                cmd, param, offset, width, type, arg_name */
216*4882a593Smuzhiyun #define DPRC_CMD_GET_RES_COUNT(cmd, type) \
217*4882a593Smuzhiyun do { \
218*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 1, 0,  8,  char,	    type[0]);\
219*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 1, 8,  8,  char,	    type[1]);\
220*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 1, 16, 8,  char,	    type[2]);\
221*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 1, 24, 8,  char,	    type[3]);\
222*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 1, 32, 8,  char,	    type[4]);\
223*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 1, 40, 8,  char,	    type[5]);\
224*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 1, 48, 8,  char,	    type[6]);\
225*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 1, 56, 8,  char,	    type[7]);\
226*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 2, 0,  8,  char,	    type[8]);\
227*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 2, 8,  8,  char,	    type[9]);\
228*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 2, 16, 8,  char,	    type[10]);\
229*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 2, 24, 8,  char,	    type[11]);\
230*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 2, 32, 8,  char,	    type[12]);\
231*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 2, 40, 8,  char,	    type[13]);\
232*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 2, 48, 8,  char,	    type[14]);\
233*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 2, 56, 8,  char,	    type[15]);\
234*4882a593Smuzhiyun } while (0)
235*4882a593Smuzhiyun 
236*4882a593Smuzhiyun /*                cmd, param, offset, width, type, arg_name */
237*4882a593Smuzhiyun #define DPRC_RSP_GET_RES_COUNT(cmd, res_count) \
238*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 0, 0,  32, int,	    res_count)
239*4882a593Smuzhiyun 
240*4882a593Smuzhiyun /*                cmd, param, offset, width, type, arg_name */
241*4882a593Smuzhiyun #define DPRC_CMD_GET_RES_IDS(cmd, range_desc, type) \
242*4882a593Smuzhiyun do { \
243*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 0, 42, 7,  enum dprc_iter_status, \
244*4882a593Smuzhiyun 					    range_desc->iter_status); \
245*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 1, 0,  32, int,	    range_desc->base_id); \
246*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 1, 32, 32, int,	    range_desc->last_id);\
247*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 2, 0,  8,  char,	    type[0]);\
248*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 2, 8,  8,  char,	    type[1]);\
249*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 2, 16, 8,  char,	    type[2]);\
250*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 2, 24, 8,  char,	    type[3]);\
251*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 2, 32, 8,  char,	    type[4]);\
252*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 2, 40, 8,  char,     type[5]);\
253*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 2, 48, 8,  char,	    type[6]);\
254*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 2, 56, 8,  char,	    type[7]);\
255*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 3, 0,  8,  char,	    type[8]);\
256*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 3, 8,  8,  char,	    type[9]);\
257*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 3, 16, 8,  char,	    type[10]);\
258*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 3, 24, 8,  char,	    type[11]);\
259*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 3, 32, 8,  char,	    type[12]);\
260*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 3, 40, 8,  char,	    type[13]);\
261*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 3, 48, 8,  char,	    type[14]);\
262*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 3, 56, 8,  char,	    type[15]);\
263*4882a593Smuzhiyun } while (0)
264*4882a593Smuzhiyun 
265*4882a593Smuzhiyun /*                cmd, param, offset, width, type, arg_name */
266*4882a593Smuzhiyun #define DPRC_RSP_GET_RES_IDS(cmd, range_desc) \
267*4882a593Smuzhiyun do { \
268*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 0, 42, 7,  enum dprc_iter_status, \
269*4882a593Smuzhiyun 					    range_desc->iter_status);\
270*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 1, 0,  32, int,	    range_desc->base_id); \
271*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 1, 32, 32, int,	    range_desc->last_id);\
272*4882a593Smuzhiyun } while (0)
273*4882a593Smuzhiyun 
274*4882a593Smuzhiyun /*                cmd, param, offset, width, type, arg_name */
275*4882a593Smuzhiyun #define DPRC_CMD_GET_OBJ_REGION(cmd, obj_type, obj_id, region_index) \
276*4882a593Smuzhiyun do { \
277*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 0, 0,  32, int,	    obj_id); \
278*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 0, 48, 8,  uint8_t,  region_index);\
279*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 3, 0,  8,  char,	    obj_type[0]);\
280*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 3, 8,  8,  char,	    obj_type[1]);\
281*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 3, 16, 8,  char,	    obj_type[2]);\
282*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 3, 24, 8,  char,	    obj_type[3]);\
283*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 3, 32, 8,  char,	    obj_type[4]);\
284*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 3, 40, 8,  char,	    obj_type[5]);\
285*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 3, 48, 8,  char,	    obj_type[6]);\
286*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 3, 56, 8,  char,	    obj_type[7]);\
287*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 4, 0,  8,  char,	    obj_type[8]);\
288*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 4, 8,  8,  char,	    obj_type[9]);\
289*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 4, 16, 8,  char,	    obj_type[10]);\
290*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 4, 24, 8,  char,	    obj_type[11]);\
291*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 4, 32, 8,  char,	    obj_type[12]);\
292*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 4, 40, 8,  char,	    obj_type[13]);\
293*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 4, 48, 8,  char,	    obj_type[14]);\
294*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 4, 56, 8,  char,	    obj_type[15]);\
295*4882a593Smuzhiyun } while (0)
296*4882a593Smuzhiyun 
297*4882a593Smuzhiyun /*	param, offset, width,	type,		arg_name */
298*4882a593Smuzhiyun #define DPRC_RSP_GET_OBJ_REGION(cmd, region_desc) \
299*4882a593Smuzhiyun do { \
300*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 1, 0,  32, uint32_t, region_desc->base_offset);\
301*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 2, 0,  32, uint32_t, region_desc->size); \
302*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 2, 32, 4,  enum dprc_region_type, region_desc->type);\
303*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 3, 0,  32, uint32_t, region_desc->flags);\
304*4882a593Smuzhiyun } while (0)
305*4882a593Smuzhiyun 
306*4882a593Smuzhiyun /*                cmd, param, offset, width, type, arg_name */
307*4882a593Smuzhiyun #define DPRC_CMD_SET_OBJ_LABEL(cmd, obj_type, obj_id, label) \
308*4882a593Smuzhiyun do { \
309*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 0, 0,  32, int,      obj_id); \
310*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 1, 0,  8,  char,	    label[0]);\
311*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 1, 8,  8,  char,	    label[1]);\
312*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 1, 16, 8,  char,	    label[2]);\
313*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 1, 24, 8,  char,	    label[3]);\
314*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 1, 32, 8,  char,	    label[4]);\
315*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 1, 40, 8,  char,	    label[5]);\
316*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 1, 48, 8,  char,	    label[6]);\
317*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 1, 56, 8,  char,	    label[7]);\
318*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 2, 0,  8,  char,	    label[8]);\
319*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 2, 8,  8,  char,	    label[9]);\
320*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 2, 16, 8,  char,	    label[10]);\
321*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 2, 24, 8,  char,	    label[11]);\
322*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 2, 32, 8,  char,	    label[12]);\
323*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 2, 40, 8,  char,	    label[13]);\
324*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 2, 48, 8,  char,	    label[14]);\
325*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 2, 56, 8,  char,	    label[15]);\
326*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 3, 0,  8,  char,	    obj_type[0]);\
327*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 3, 8,  8,  char,	    obj_type[1]);\
328*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 3, 16, 8,  char,	    obj_type[2]);\
329*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 3, 24, 8,  char,	    obj_type[3]);\
330*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 3, 32, 8,  char,	    obj_type[4]);\
331*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 3, 40, 8,  char,	    obj_type[5]);\
332*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 3, 48, 8,  char,	    obj_type[6]);\
333*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 3, 56, 8,  char,	    obj_type[7]);\
334*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 4, 0,  8,  char,	    obj_type[8]);\
335*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 4, 8,  8,  char,	    obj_type[9]);\
336*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 4, 16, 8,  char,	    obj_type[10]);\
337*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 4, 24, 8,  char,	    obj_type[11]);\
338*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 4, 32, 8,  char,	    obj_type[12]);\
339*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 4, 40, 8,  char,	    obj_type[13]);\
340*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 4, 48, 8,  char,	    obj_type[14]);\
341*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 4, 56, 8,  char,	    obj_type[15]);\
342*4882a593Smuzhiyun } while (0)
343*4882a593Smuzhiyun 
344*4882a593Smuzhiyun /*                cmd, param, offset, width, type, arg_name */
345*4882a593Smuzhiyun #define DPRC_CMD_CONNECT(cmd, endpoint1, endpoint2, cfg) \
346*4882a593Smuzhiyun do { \
347*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 0, 0,  32, int,      endpoint1->id); \
348*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 0, 32, 16, uint16_t, endpoint1->if_id); \
349*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 1, 0,  32, int,	    endpoint2->id); \
350*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 1, 32, 16, uint16_t, endpoint2->if_id); \
351*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 2, 0,  8,  char,     endpoint1->type[0]); \
352*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 2, 8,  8,  char,	    endpoint1->type[1]); \
353*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 2, 16, 8,  char,	    endpoint1->type[2]); \
354*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 2, 24, 8,  char,	    endpoint1->type[3]); \
355*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 2, 32, 8,  char,	    endpoint1->type[4]); \
356*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 2, 40, 8,  char,	    endpoint1->type[5]); \
357*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 2, 48, 8,  char,	    endpoint1->type[6]); \
358*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 2, 56, 8,  char,	    endpoint1->type[7]); \
359*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 3, 0,  8,  char,	    endpoint1->type[8]); \
360*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 3, 8,  8,  char,	    endpoint1->type[9]); \
361*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 3, 16, 8,  char,	    endpoint1->type[10]); \
362*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 3, 24, 8,  char,	    endpoint1->type[11]); \
363*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 3, 32, 8,  char,     endpoint1->type[12]); \
364*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 3, 40, 8,  char,	    endpoint1->type[13]); \
365*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 3, 48, 8,  char,	    endpoint1->type[14]); \
366*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 3, 56, 8,  char,	    endpoint1->type[15]); \
367*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 4, 0,  32, uint32_t, cfg->max_rate); \
368*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 4, 32, 32, uint32_t, cfg->committed_rate); \
369*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 5, 0,  8,  char,	    endpoint2->type[0]); \
370*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 5, 8,  8,  char,	    endpoint2->type[1]); \
371*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 5, 16, 8,  char,	    endpoint2->type[2]); \
372*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 5, 24, 8,  char,	    endpoint2->type[3]); \
373*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 5, 32, 8,  char,	    endpoint2->type[4]); \
374*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 5, 40, 8,  char,	    endpoint2->type[5]); \
375*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 5, 48, 8,  char,	    endpoint2->type[6]); \
376*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 5, 56, 8,  char,	    endpoint2->type[7]); \
377*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 6, 0,  8,  char,	    endpoint2->type[8]); \
378*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 6, 8,  8,  char,	    endpoint2->type[9]); \
379*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 6, 16, 8,  char,	    endpoint2->type[10]); \
380*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 6, 24, 8,  char,	    endpoint2->type[11]); \
381*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 6, 32, 8,  char,	    endpoint2->type[12]); \
382*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 6, 40, 8,  char,	    endpoint2->type[13]); \
383*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 6, 48, 8,  char,	    endpoint2->type[14]); \
384*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 6, 56, 8,  char,	    endpoint2->type[15]); \
385*4882a593Smuzhiyun } while (0)
386*4882a593Smuzhiyun 
387*4882a593Smuzhiyun /*                cmd, param, offset, width, type, arg_name */
388*4882a593Smuzhiyun #define DPRC_CMD_DISCONNECT(cmd, endpoint) \
389*4882a593Smuzhiyun do { \
390*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 0, 0,  32, int,	    endpoint->id); \
391*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 0, 32, 16, uint16_t, endpoint->if_id); \
392*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 1, 0,  8,  char,	    endpoint->type[0]); \
393*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 1, 8,  8,  char,	    endpoint->type[1]); \
394*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 1, 16, 8,  char,	    endpoint->type[2]); \
395*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 1, 24, 8,  char,	    endpoint->type[3]); \
396*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 1, 32, 8,  char,	    endpoint->type[4]); \
397*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 1, 40, 8,  char,	    endpoint->type[5]); \
398*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 1, 48, 8,  char,	    endpoint->type[6]); \
399*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 1, 56, 8,  char,	    endpoint->type[7]); \
400*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 2, 0,  8,  char,	    endpoint->type[8]); \
401*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 2, 8,  8,  char,	    endpoint->type[9]); \
402*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 2, 16, 8,  char,	    endpoint->type[10]); \
403*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 2, 24, 8,  char,	    endpoint->type[11]); \
404*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 2, 32, 8,  char,	    endpoint->type[12]); \
405*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 2, 40, 8,  char,	    endpoint->type[13]); \
406*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 2, 48, 8,  char,	    endpoint->type[14]); \
407*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 2, 56, 8,  char,	    endpoint->type[15]); \
408*4882a593Smuzhiyun } while (0)
409*4882a593Smuzhiyun 
410*4882a593Smuzhiyun /*                cmd, param, offset, width, type, arg_name */
411*4882a593Smuzhiyun #define DPRC_CMD_GET_CONNECTION(cmd, endpoint1) \
412*4882a593Smuzhiyun do { \
413*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 0, 0,  32, int,      endpoint1->id); \
414*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 0, 32, 16, uint16_t, endpoint1->if_id); \
415*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 1, 0,  8,  char,     endpoint1->type[0]); \
416*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 1, 8,  8,  char,	    endpoint1->type[1]); \
417*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 1, 16, 8,  char,	    endpoint1->type[2]); \
418*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 1, 24, 8,  char,	    endpoint1->type[3]); \
419*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 1, 32, 8,  char,	    endpoint1->type[4]); \
420*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 1, 40, 8,  char,	    endpoint1->type[5]); \
421*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 1, 48, 8,  char,	    endpoint1->type[6]); \
422*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 1, 56, 8,  char,	    endpoint1->type[7]); \
423*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 2, 0,  8,  char,	    endpoint1->type[8]); \
424*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 2, 8,  8,  char,	    endpoint1->type[9]); \
425*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 2, 16, 8,  char,	    endpoint1->type[10]); \
426*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 2, 24, 8,  char,	    endpoint1->type[11]); \
427*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 2, 32, 8,  char,     endpoint1->type[12]); \
428*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 2, 40, 8,  char,	    endpoint1->type[13]); \
429*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 2, 48, 8,  char,	    endpoint1->type[14]); \
430*4882a593Smuzhiyun 	MC_CMD_OP(cmd, 2, 56, 8,  char,	    endpoint1->type[15]); \
431*4882a593Smuzhiyun } while (0)
432*4882a593Smuzhiyun 
433*4882a593Smuzhiyun /*                cmd, param, offset, width, type, arg_name */
434*4882a593Smuzhiyun #define DPRC_RSP_GET_CONNECTION(cmd, endpoint2, state) \
435*4882a593Smuzhiyun do { \
436*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 3, 0,  32, int,	    endpoint2->id); \
437*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 3, 32, 16, uint16_t, endpoint2->if_id); \
438*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 4, 0,  8,  char,	    endpoint2->type[0]); \
439*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 4, 8,  8,  char,	    endpoint2->type[1]); \
440*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 4, 16, 8,  char,	    endpoint2->type[2]); \
441*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 4, 24, 8,  char,	    endpoint2->type[3]); \
442*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 4, 32, 8,  char,	    endpoint2->type[4]); \
443*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 4, 40, 8,  char,	    endpoint2->type[5]); \
444*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 4, 48, 8,  char,	    endpoint2->type[6]); \
445*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 4, 56, 8,  char,	    endpoint2->type[7]); \
446*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 5, 0,  8,  char,	    endpoint2->type[8]); \
447*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 5, 8,  8,  char,	    endpoint2->type[9]); \
448*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 5, 16, 8,  char,	    endpoint2->type[10]); \
449*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 5, 24, 8,  char,	    endpoint2->type[11]); \
450*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 5, 32, 8,  char,	    endpoint2->type[12]); \
451*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 5, 40, 8,  char,	    endpoint2->type[13]); \
452*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 5, 48, 8,  char,	    endpoint2->type[14]); \
453*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 5, 56, 8,  char,	    endpoint2->type[15]); \
454*4882a593Smuzhiyun 	MC_RSP_OP(cmd, 6, 0,  32, int,	    state); \
455*4882a593Smuzhiyun } while (0)
456*4882a593Smuzhiyun 
457*4882a593Smuzhiyun /* Data Path Resource Container API
458*4882a593Smuzhiyun  * Contains DPRC API for managing and querying DPAA resources
459*4882a593Smuzhiyun  */
460*4882a593Smuzhiyun 
461*4882a593Smuzhiyun struct fsl_mc_io;
462*4882a593Smuzhiyun 
463*4882a593Smuzhiyun /**
464*4882a593Smuzhiyun  * Set this value as the icid value in dprc_cfg structure when creating a
465*4882a593Smuzhiyun  * container, in case the ICID is not selected by the user and should be
466*4882a593Smuzhiyun  * allocated by the DPRC from the pool of ICIDs.
467*4882a593Smuzhiyun  */
468*4882a593Smuzhiyun #define DPRC_GET_ICID_FROM_POOL			(uint16_t)(~(0))
469*4882a593Smuzhiyun 
470*4882a593Smuzhiyun /**
471*4882a593Smuzhiyun  * Set this value as the portal_id value in dprc_cfg structure when creating a
472*4882a593Smuzhiyun  * container, in case the portal ID is not specifically selected by the
473*4882a593Smuzhiyun  * user and should be allocated by the DPRC from the pool of portal ids.
474*4882a593Smuzhiyun  */
475*4882a593Smuzhiyun #define DPRC_GET_PORTAL_ID_FROM_POOL	(int)(~(0))
476*4882a593Smuzhiyun 
477*4882a593Smuzhiyun /**
478*4882a593Smuzhiyun  * dprc_get_container_id() - Get container ID associated with a given portal.
479*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
480*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
481*4882a593Smuzhiyun  * @container_id:	Requested container ID
482*4882a593Smuzhiyun  *
483*4882a593Smuzhiyun  * Return:	'0' on Success; Error code otherwise.
484*4882a593Smuzhiyun  */
485*4882a593Smuzhiyun int dprc_get_container_id(struct fsl_mc_io	*mc_io,
486*4882a593Smuzhiyun 			  uint32_t		cmd_flags,
487*4882a593Smuzhiyun 			  int			*container_id);
488*4882a593Smuzhiyun 
489*4882a593Smuzhiyun /**
490*4882a593Smuzhiyun  * dprc_open() - Open DPRC object for use
491*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
492*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
493*4882a593Smuzhiyun  * @container_id: Container ID to open
494*4882a593Smuzhiyun  * @token:	Returned token of DPRC object
495*4882a593Smuzhiyun  *
496*4882a593Smuzhiyun  * Return:	'0' on Success; Error code otherwise.
497*4882a593Smuzhiyun  *
498*4882a593Smuzhiyun  * @warning	Required before any operation on the object.
499*4882a593Smuzhiyun  */
500*4882a593Smuzhiyun int dprc_open(struct fsl_mc_io	*mc_io,
501*4882a593Smuzhiyun 	      uint32_t		cmd_flags,
502*4882a593Smuzhiyun 	      int		container_id,
503*4882a593Smuzhiyun 	      uint16_t		*token);
504*4882a593Smuzhiyun 
505*4882a593Smuzhiyun /**
506*4882a593Smuzhiyun  * dprc_close() - Close the control session of the object
507*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
508*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
509*4882a593Smuzhiyun  * @token:	Token of DPRC object
510*4882a593Smuzhiyun  *
511*4882a593Smuzhiyun  * After this function is called, no further operations are
512*4882a593Smuzhiyun  * allowed on the object without opening a new control session.
513*4882a593Smuzhiyun  *
514*4882a593Smuzhiyun  * Return:	'0' on Success; Error code otherwise.
515*4882a593Smuzhiyun  */
516*4882a593Smuzhiyun int dprc_close(struct fsl_mc_io	*mc_io,
517*4882a593Smuzhiyun 	       uint32_t		cmd_flags,
518*4882a593Smuzhiyun 	       uint16_t		token);
519*4882a593Smuzhiyun 
520*4882a593Smuzhiyun /**
521*4882a593Smuzhiyun  * Container general options
522*4882a593Smuzhiyun  *
523*4882a593Smuzhiyun  * These options may be selected at container creation by the container creator
524*4882a593Smuzhiyun  * and can be retrieved using dprc_get_attributes()
525*4882a593Smuzhiyun  */
526*4882a593Smuzhiyun 
527*4882a593Smuzhiyun /* Spawn Policy Option allowed - Indicates that the new container is allowed
528*4882a593Smuzhiyun  * to spawn and have its own child containers.
529*4882a593Smuzhiyun  */
530*4882a593Smuzhiyun #define DPRC_CFG_OPT_SPAWN_ALLOWED		0x00000001
531*4882a593Smuzhiyun 
532*4882a593Smuzhiyun /* General Container allocation policy - Indicates that the new container is
533*4882a593Smuzhiyun  * allowed to allocate requested resources from its parent container; if not
534*4882a593Smuzhiyun  * set, the container is only allowed to use resources in its own pools; Note
535*4882a593Smuzhiyun  * that this is a container's global policy, but the parent container may
536*4882a593Smuzhiyun  * override it and set specific quota per resource type.
537*4882a593Smuzhiyun  */
538*4882a593Smuzhiyun #define DPRC_CFG_OPT_ALLOC_ALLOWED		0x00000002
539*4882a593Smuzhiyun 
540*4882a593Smuzhiyun /* Object initialization allowed - software context associated with this
541*4882a593Smuzhiyun  * container is allowed to invoke object initialization operations.
542*4882a593Smuzhiyun  */
543*4882a593Smuzhiyun #define DPRC_CFG_OPT_OBJ_CREATE_ALLOWED		0x00000004
544*4882a593Smuzhiyun 
545*4882a593Smuzhiyun /* Topology change allowed - software context associated with this
546*4882a593Smuzhiyun  * container is allowed to invoke topology operations, such as attach/detach
547*4882a593Smuzhiyun  * of network objects.
548*4882a593Smuzhiyun  */
549*4882a593Smuzhiyun #define DPRC_CFG_OPT_TOPOLOGY_CHANGES_ALLOWED	0x00000008
550*4882a593Smuzhiyun 
551*4882a593Smuzhiyun 
552*4882a593Smuzhiyun /* AIOP - Indicates that container belongs to AIOP. */
553*4882a593Smuzhiyun #define DPRC_CFG_OPT_AIOP			0x00000020
554*4882a593Smuzhiyun 
555*4882a593Smuzhiyun /* IRQ Config - Indicates that the container allowed to configure its IRQs.*/
556*4882a593Smuzhiyun #define DPRC_CFG_OPT_IRQ_CFG_ALLOWED		0x00000040
557*4882a593Smuzhiyun 
558*4882a593Smuzhiyun /**
559*4882a593Smuzhiyun  * struct dprc_cfg - Container configuration options
560*4882a593Smuzhiyun  * @icid: Container's ICID; if set to 'DPRC_GET_ICID_FROM_POOL', a free
561*4882a593Smuzhiyun  *		ICID value is allocated by the DPRC
562*4882a593Smuzhiyun  * @portal_id: Portal ID; if set to 'DPRC_GET_PORTAL_ID_FROM_POOL', a free
563*4882a593Smuzhiyun  *		portal ID is allocated by the DPRC
564*4882a593Smuzhiyun  * @options: Combination of 'DPRC_CFG_OPT_<X>' options
565*4882a593Smuzhiyun  * @label: Object's label
566*4882a593Smuzhiyun  */
567*4882a593Smuzhiyun struct dprc_cfg {
568*4882a593Smuzhiyun 	uint16_t icid;
569*4882a593Smuzhiyun 	int portal_id;
570*4882a593Smuzhiyun 	uint64_t options;
571*4882a593Smuzhiyun 	char label[16];
572*4882a593Smuzhiyun };
573*4882a593Smuzhiyun 
574*4882a593Smuzhiyun /**
575*4882a593Smuzhiyun  * dprc_create_container() - Create child container
576*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
577*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
578*4882a593Smuzhiyun  * @token:	Token of DPRC object
579*4882a593Smuzhiyun  * @cfg:	Child container configuration
580*4882a593Smuzhiyun  * @child_container_id:	Returned child container ID
581*4882a593Smuzhiyun  * @child_portal_offset: Returned child portal offset from MC portal base
582*4882a593Smuzhiyun  *
583*4882a593Smuzhiyun  *
584*4882a593Smuzhiyun  * Return:	'0' on Success; Error code otherwise.
585*4882a593Smuzhiyun  */
586*4882a593Smuzhiyun int dprc_create_container(struct fsl_mc_io	*mc_io,
587*4882a593Smuzhiyun 			  uint32_t		cmd_flags,
588*4882a593Smuzhiyun 			  uint16_t		token,
589*4882a593Smuzhiyun 			  struct dprc_cfg	*cfg,
590*4882a593Smuzhiyun 			  int			*child_container_id,
591*4882a593Smuzhiyun 			  uint64_t		*child_portal_offset);
592*4882a593Smuzhiyun 
593*4882a593Smuzhiyun /**
594*4882a593Smuzhiyun  * dprc_destroy_container() - Destroy child container.
595*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
596*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
597*4882a593Smuzhiyun  * @token:	Token of DPRC object
598*4882a593Smuzhiyun  * @child_container_id:	ID of the container to destroy
599*4882a593Smuzhiyun  *
600*4882a593Smuzhiyun  * This function terminates the child container, so following this call the
601*4882a593Smuzhiyun  * child container ID becomes invalid.
602*4882a593Smuzhiyun  *
603*4882a593Smuzhiyun  * Notes:
604*4882a593Smuzhiyun  * - All resources and objects of the destroyed container are returned to the
605*4882a593Smuzhiyun  * parent container or destroyed if were created be the destroyed container.
606*4882a593Smuzhiyun  * - This function destroy all the child containers of the specified
607*4882a593Smuzhiyun  *   container prior to destroying the container itself.
608*4882a593Smuzhiyun  *
609*4882a593Smuzhiyun  * warning: Only the parent container is allowed to destroy a child policy
610*4882a593Smuzhiyun  *		Container 0 can't be destroyed
611*4882a593Smuzhiyun  *
612*4882a593Smuzhiyun  * Return:	'0' on Success; Error code otherwise.
613*4882a593Smuzhiyun  *
614*4882a593Smuzhiyun  */
615*4882a593Smuzhiyun int dprc_destroy_container(struct fsl_mc_io	*mc_io,
616*4882a593Smuzhiyun 			   uint32_t		cmd_flags,
617*4882a593Smuzhiyun 			   uint16_t		token,
618*4882a593Smuzhiyun 			   int			child_container_id);
619*4882a593Smuzhiyun 
620*4882a593Smuzhiyun /**
621*4882a593Smuzhiyun  * dprc_reset_container - Reset child container.
622*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
623*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
624*4882a593Smuzhiyun  * @token:	Token of DPRC object
625*4882a593Smuzhiyun  * @child_container_id:	ID of the container to reset
626*4882a593Smuzhiyun  *
627*4882a593Smuzhiyun  * In case a software context crashes or becomes non-responsive, the parent
628*4882a593Smuzhiyun  * may wish to reset its resources container before the software context is
629*4882a593Smuzhiyun  * restarted.
630*4882a593Smuzhiyun  *
631*4882a593Smuzhiyun  * This routine informs all objects assigned to the child container that the
632*4882a593Smuzhiyun  * container is being reset, so they may perform any cleanup operations that are
633*4882a593Smuzhiyun  * needed. All objects handles that were owned by the child container shall be
634*4882a593Smuzhiyun  * closed.
635*4882a593Smuzhiyun  *
636*4882a593Smuzhiyun  * Note that such request may be submitted even if the child software context
637*4882a593Smuzhiyun  * has not crashed, but the resulting object cleanup operations will not be
638*4882a593Smuzhiyun  * aware of that.
639*4882a593Smuzhiyun  *
640*4882a593Smuzhiyun  * Return:	'0' on Success; Error code otherwise.
641*4882a593Smuzhiyun  */
642*4882a593Smuzhiyun int dprc_reset_container(struct fsl_mc_io	*mc_io,
643*4882a593Smuzhiyun 			 uint32_t		cmd_flags,
644*4882a593Smuzhiyun 			 uint16_t		token,
645*4882a593Smuzhiyun 			 int			child_container_id);
646*4882a593Smuzhiyun 
647*4882a593Smuzhiyun /**
648*4882a593Smuzhiyun  * struct dprc_attributes - Container attributes
649*4882a593Smuzhiyun  * @container_id: Container's ID
650*4882a593Smuzhiyun  * @icid: Container's ICID
651*4882a593Smuzhiyun  * @portal_id: Container's portal ID
652*4882a593Smuzhiyun  * @options: Container's options as set at container's creation
653*4882a593Smuzhiyun  * @version: DPRC version
654*4882a593Smuzhiyun  */
655*4882a593Smuzhiyun struct dprc_attributes {
656*4882a593Smuzhiyun 	int container_id;
657*4882a593Smuzhiyun 	uint16_t icid;
658*4882a593Smuzhiyun 	int portal_id;
659*4882a593Smuzhiyun 	uint64_t options;
660*4882a593Smuzhiyun 	/**
661*4882a593Smuzhiyun 	 * struct version - DPRC version
662*4882a593Smuzhiyun 	 * @major: DPRC major version
663*4882a593Smuzhiyun 	 * @minor: DPRC minor version
664*4882a593Smuzhiyun 	 */
665*4882a593Smuzhiyun 	struct {
666*4882a593Smuzhiyun 		uint16_t major;
667*4882a593Smuzhiyun 		uint16_t minor;
668*4882a593Smuzhiyun 	} version;
669*4882a593Smuzhiyun };
670*4882a593Smuzhiyun 
671*4882a593Smuzhiyun /**
672*4882a593Smuzhiyun  * dprc_get_attributes() - Obtains container attributes
673*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
674*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
675*4882a593Smuzhiyun  * @token:	Token of DPRC object
676*4882a593Smuzhiyun  * @attributes:	Returned container attributes
677*4882a593Smuzhiyun  *
678*4882a593Smuzhiyun  * Return:     '0' on Success; Error code otherwise.
679*4882a593Smuzhiyun  */
680*4882a593Smuzhiyun int dprc_get_attributes(struct fsl_mc_io	*mc_io,
681*4882a593Smuzhiyun 			uint32_t		cmd_flags,
682*4882a593Smuzhiyun 			uint16_t		token,
683*4882a593Smuzhiyun 			struct dprc_attributes	*attributes);
684*4882a593Smuzhiyun 
685*4882a593Smuzhiyun /**
686*4882a593Smuzhiyun  * dprc_get_obj_count() - Obtains the number of objects in the DPRC
687*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
688*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
689*4882a593Smuzhiyun  * @token:	Token of DPRC object
690*4882a593Smuzhiyun  * @obj_count:	Number of objects assigned to the DPRC
691*4882a593Smuzhiyun  *
692*4882a593Smuzhiyun  * Return:	'0' on Success; Error code otherwise.
693*4882a593Smuzhiyun  */
694*4882a593Smuzhiyun int dprc_get_obj_count(struct fsl_mc_io	*mc_io,
695*4882a593Smuzhiyun 		       uint32_t		cmd_flags,
696*4882a593Smuzhiyun 		       uint16_t		token,
697*4882a593Smuzhiyun 		       int			*obj_count);
698*4882a593Smuzhiyun 
699*4882a593Smuzhiyun /* Objects Attributes Flags */
700*4882a593Smuzhiyun 
701*4882a593Smuzhiyun /* Opened state - Indicates that an object is open by at least one owner */
702*4882a593Smuzhiyun #define DPRC_OBJ_STATE_OPEN		0x00000001
703*4882a593Smuzhiyun /* Plugged state - Indicates that the object is plugged */
704*4882a593Smuzhiyun #define DPRC_OBJ_STATE_PLUGGED		0x00000002
705*4882a593Smuzhiyun 
706*4882a593Smuzhiyun /**
707*4882a593Smuzhiyun  * Shareability flag - Object flag indicating no memory shareability.
708*4882a593Smuzhiyun  *  the object generates memory accesses that are non coherent with other
709*4882a593Smuzhiyun  *  masters;
710*4882a593Smuzhiyun  *  user is responsible for proper memory handling through IOMMU configuration.
711*4882a593Smuzhiyun  */
712*4882a593Smuzhiyun #define DPRC_OBJ_FLAG_NO_MEM_SHAREABILITY		0x0001
713*4882a593Smuzhiyun 
714*4882a593Smuzhiyun /**
715*4882a593Smuzhiyun  * struct dprc_obj_desc - Object descriptor, returned from dprc_get_obj()
716*4882a593Smuzhiyun  * @type: Type of object: NULL terminated string
717*4882a593Smuzhiyun  * @id: ID of logical object resource
718*4882a593Smuzhiyun  * @vendor: Object vendor identifier
719*4882a593Smuzhiyun  * @ver_major: Major version number
720*4882a593Smuzhiyun  * @ver_minor:  Minor version number
721*4882a593Smuzhiyun  * @irq_count: Number of interrupts supported by the object
722*4882a593Smuzhiyun  * @region_count: Number of mappable regions supported by the object
723*4882a593Smuzhiyun  * @state: Object state: combination of DPRC_OBJ_STATE_ states
724*4882a593Smuzhiyun  * @label: Object label
725*4882a593Smuzhiyun  * @flags: Object's flags
726*4882a593Smuzhiyun  */
727*4882a593Smuzhiyun struct dprc_obj_desc {
728*4882a593Smuzhiyun 	char type[16];
729*4882a593Smuzhiyun 	int id;
730*4882a593Smuzhiyun 	uint16_t vendor;
731*4882a593Smuzhiyun 	uint16_t ver_major;
732*4882a593Smuzhiyun 	uint16_t ver_minor;
733*4882a593Smuzhiyun 	uint8_t irq_count;
734*4882a593Smuzhiyun 	uint8_t region_count;
735*4882a593Smuzhiyun 	uint32_t state;
736*4882a593Smuzhiyun 	char label[16];
737*4882a593Smuzhiyun 	uint16_t	flags;
738*4882a593Smuzhiyun };
739*4882a593Smuzhiyun 
740*4882a593Smuzhiyun /**
741*4882a593Smuzhiyun  * dprc_get_obj() - Get general information on an object
742*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
743*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
744*4882a593Smuzhiyun  * @token:	Token of DPRC object
745*4882a593Smuzhiyun  * @obj_index:	Index of the object to be queried (< obj_count)
746*4882a593Smuzhiyun  * @obj_desc:	Returns the requested object descriptor
747*4882a593Smuzhiyun  *
748*4882a593Smuzhiyun  * The object descriptors are retrieved one by one by incrementing
749*4882a593Smuzhiyun  * obj_index up to (not including) the value of obj_count returned
750*4882a593Smuzhiyun  * from dprc_get_obj_count(). dprc_get_obj_count() must
751*4882a593Smuzhiyun  * be called prior to dprc_get_obj().
752*4882a593Smuzhiyun  *
753*4882a593Smuzhiyun  * Return:	'0' on Success; Error code otherwise.
754*4882a593Smuzhiyun  */
755*4882a593Smuzhiyun int dprc_get_obj(struct fsl_mc_io	*mc_io,
756*4882a593Smuzhiyun 		 uint32_t		cmd_flags,
757*4882a593Smuzhiyun 		 uint16_t		token,
758*4882a593Smuzhiyun 		 int			obj_index,
759*4882a593Smuzhiyun 		 struct dprc_obj_desc	*obj_desc);
760*4882a593Smuzhiyun 
761*4882a593Smuzhiyun /**
762*4882a593Smuzhiyun  * dprc_get_res_count() - Obtains the number of free resources that are
763*4882a593Smuzhiyun  *		assigned to this container, by pool type
764*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
765*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
766*4882a593Smuzhiyun  * @token:	Token of DPRC object
767*4882a593Smuzhiyun  * @type:	pool type
768*4882a593Smuzhiyun  * @res_count:	Returned number of free resources of the given
769*4882a593Smuzhiyun  *			resource type that are assigned to this DPRC
770*4882a593Smuzhiyun  *
771*4882a593Smuzhiyun  * Return:	'0' on Success; Error code otherwise.
772*4882a593Smuzhiyun  */
773*4882a593Smuzhiyun int dprc_get_res_count(struct fsl_mc_io *mc_io,
774*4882a593Smuzhiyun 		       uint32_t	cmd_flags,
775*4882a593Smuzhiyun 		       uint16_t		token,
776*4882a593Smuzhiyun 		       char		*type,
777*4882a593Smuzhiyun 		       int		*res_count);
778*4882a593Smuzhiyun 
779*4882a593Smuzhiyun /**
780*4882a593Smuzhiyun  * enum dprc_iter_status - Iteration status
781*4882a593Smuzhiyun  * @DPRC_ITER_STATUS_FIRST: Perform first iteration
782*4882a593Smuzhiyun  * @DPRC_ITER_STATUS_MORE: Indicates more/next iteration is needed
783*4882a593Smuzhiyun  * @DPRC_ITER_STATUS_LAST: Indicates last iteration
784*4882a593Smuzhiyun  */
785*4882a593Smuzhiyun enum dprc_iter_status {
786*4882a593Smuzhiyun 	DPRC_ITER_STATUS_FIRST = 0,
787*4882a593Smuzhiyun 	DPRC_ITER_STATUS_MORE = 1,
788*4882a593Smuzhiyun 	DPRC_ITER_STATUS_LAST = 2
789*4882a593Smuzhiyun };
790*4882a593Smuzhiyun 
791*4882a593Smuzhiyun /**
792*4882a593Smuzhiyun  * struct dprc_res_ids_range_desc - Resource ID range descriptor
793*4882a593Smuzhiyun  * @base_id: Base resource ID of this range
794*4882a593Smuzhiyun  * @last_id: Last resource ID of this range
795*4882a593Smuzhiyun  * @iter_status: Iteration status - should be set to DPRC_ITER_STATUS_FIRST at
796*4882a593Smuzhiyun  *	first iteration; while the returned marker is DPRC_ITER_STATUS_MORE,
797*4882a593Smuzhiyun  *	additional iterations are needed, until the returned marker is
798*4882a593Smuzhiyun  *	DPRC_ITER_STATUS_LAST
799*4882a593Smuzhiyun  */
800*4882a593Smuzhiyun struct dprc_res_ids_range_desc {
801*4882a593Smuzhiyun 	int base_id;
802*4882a593Smuzhiyun 	int last_id;
803*4882a593Smuzhiyun 	enum dprc_iter_status iter_status;
804*4882a593Smuzhiyun };
805*4882a593Smuzhiyun 
806*4882a593Smuzhiyun /**
807*4882a593Smuzhiyun  * dprc_get_res_ids() - Obtains IDs of free resources in the container
808*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
809*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
810*4882a593Smuzhiyun  * @token:	Token of DPRC object
811*4882a593Smuzhiyun  * @type:	pool type
812*4882a593Smuzhiyun  * @range_desc:	range descriptor
813*4882a593Smuzhiyun  *
814*4882a593Smuzhiyun  * Return:	'0' on Success; Error code otherwise.
815*4882a593Smuzhiyun  */
816*4882a593Smuzhiyun int dprc_get_res_ids(struct fsl_mc_io			*mc_io,
817*4882a593Smuzhiyun 		     uint32_t				cmd_flags,
818*4882a593Smuzhiyun 		     uint16_t				token,
819*4882a593Smuzhiyun 		     char				*type,
820*4882a593Smuzhiyun 		     struct dprc_res_ids_range_desc	*range_desc);
821*4882a593Smuzhiyun 
822*4882a593Smuzhiyun /* Region flags */
823*4882a593Smuzhiyun /* Cacheable - Indicates that region should be mapped as cacheable */
824*4882a593Smuzhiyun #define DPRC_REGION_CACHEABLE	0x00000001
825*4882a593Smuzhiyun 
826*4882a593Smuzhiyun /**
827*4882a593Smuzhiyun  * enum dprc_region_type - Region type
828*4882a593Smuzhiyun  * @DPRC_REGION_TYPE_MC_PORTAL: MC portal region
829*4882a593Smuzhiyun  * @DPRC_REGION_TYPE_QBMAN_PORTAL: Qbman portal region
830*4882a593Smuzhiyun  */
831*4882a593Smuzhiyun enum dprc_region_type {
832*4882a593Smuzhiyun 	DPRC_REGION_TYPE_MC_PORTAL,
833*4882a593Smuzhiyun 	DPRC_REGION_TYPE_QBMAN_PORTAL
834*4882a593Smuzhiyun };
835*4882a593Smuzhiyun 
836*4882a593Smuzhiyun /**
837*4882a593Smuzhiyun  * struct dprc_region_desc - Mappable region descriptor
838*4882a593Smuzhiyun  * @base_offset: Region offset from region's base address.
839*4882a593Smuzhiyun  *	For DPMCP and DPRC objects, region base is offset from SoC MC portals
840*4882a593Smuzhiyun  *	base address; For DPIO, region base is offset from SoC QMan portals
841*4882a593Smuzhiyun  *	base address
842*4882a593Smuzhiyun  * @size: Region size (in bytes)
843*4882a593Smuzhiyun  * @flags: Region attributes
844*4882a593Smuzhiyun  * @type: Portal region type
845*4882a593Smuzhiyun  */
846*4882a593Smuzhiyun struct dprc_region_desc {
847*4882a593Smuzhiyun 	uint32_t base_offset;
848*4882a593Smuzhiyun 	uint32_t size;
849*4882a593Smuzhiyun 	uint32_t flags;
850*4882a593Smuzhiyun 	enum dprc_region_type type;
851*4882a593Smuzhiyun };
852*4882a593Smuzhiyun 
853*4882a593Smuzhiyun /**
854*4882a593Smuzhiyun  * dprc_get_obj_region() - Get region information for a specified object.
855*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
856*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
857*4882a593Smuzhiyun  * @token:	Token of DPRC object
858*4882a593Smuzhiyun  * @obj_type:	Object type as returned in dprc_get_obj()
859*4882a593Smuzhiyun  * @obj_id:	Unique object instance as returned in dprc_get_obj()
860*4882a593Smuzhiyun  * @region_index: The specific region to query
861*4882a593Smuzhiyun  * @region_desc:  Returns the requested region descriptor
862*4882a593Smuzhiyun  *
863*4882a593Smuzhiyun  * Return:	'0' on Success; Error code otherwise.
864*4882a593Smuzhiyun  */
865*4882a593Smuzhiyun int dprc_get_obj_region(struct fsl_mc_io	*mc_io,
866*4882a593Smuzhiyun 			uint32_t		cmd_flags,
867*4882a593Smuzhiyun 			uint16_t		token,
868*4882a593Smuzhiyun 			char			*obj_type,
869*4882a593Smuzhiyun 			int			obj_id,
870*4882a593Smuzhiyun 			uint8_t			region_index,
871*4882a593Smuzhiyun 			struct dprc_region_desc	*region_desc);
872*4882a593Smuzhiyun /**
873*4882a593Smuzhiyun  * struct dprc_endpoint - Endpoint description for link connect/disconnect
874*4882a593Smuzhiyun  *			operations
875*4882a593Smuzhiyun  * @type: Endpoint object type: NULL terminated string
876*4882a593Smuzhiyun  * @id: Endpoint object ID
877*4882a593Smuzhiyun  * @if_id: Interface ID; should be set for endpoints with multiple
878*4882a593Smuzhiyun  *		interfaces ("dpsw", "dpdmux"); for others, always set to 0
879*4882a593Smuzhiyun  */
880*4882a593Smuzhiyun struct dprc_endpoint {
881*4882a593Smuzhiyun 	char		type[16];
882*4882a593Smuzhiyun 	int		id;
883*4882a593Smuzhiyun 	uint16_t	if_id;
884*4882a593Smuzhiyun };
885*4882a593Smuzhiyun 
886*4882a593Smuzhiyun /**
887*4882a593Smuzhiyun  * struct dprc_connection_cfg - Connection configuration.
888*4882a593Smuzhiyun  *				Used for virtual connections only
889*4882a593Smuzhiyun  * @committed_rate: Committed rate (Mbits/s)
890*4882a593Smuzhiyun  * @max_rate: Maximum rate (Mbits/s)
891*4882a593Smuzhiyun  */
892*4882a593Smuzhiyun struct dprc_connection_cfg {
893*4882a593Smuzhiyun 	uint32_t committed_rate;
894*4882a593Smuzhiyun 	uint32_t max_rate;
895*4882a593Smuzhiyun };
896*4882a593Smuzhiyun 
897*4882a593Smuzhiyun /**
898*4882a593Smuzhiyun  * dprc_connect() - Connect two endpoints to create a network link between them
899*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
900*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
901*4882a593Smuzhiyun  * @token:	Token of DPRC object
902*4882a593Smuzhiyun  * @endpoint1:	Endpoint 1 configuration parameters
903*4882a593Smuzhiyun  * @endpoint2:	Endpoint 2 configuration parameters
904*4882a593Smuzhiyun  * @cfg: Connection configuration. The connection configuration is ignored for
905*4882a593Smuzhiyun  *	connections made to DPMAC objects, where rate is retrieved from the
906*4882a593Smuzhiyun  *	MAC configuration.
907*4882a593Smuzhiyun  *
908*4882a593Smuzhiyun  * Return:	'0' on Success; Error code otherwise.
909*4882a593Smuzhiyun  */
910*4882a593Smuzhiyun int dprc_connect(struct fsl_mc_io			*mc_io,
911*4882a593Smuzhiyun 		 uint32_t				cmd_flags,
912*4882a593Smuzhiyun 		 uint16_t				token,
913*4882a593Smuzhiyun 		 const struct dprc_endpoint		*endpoint1,
914*4882a593Smuzhiyun 		 const struct dprc_endpoint		*endpoint2,
915*4882a593Smuzhiyun 		 const struct dprc_connection_cfg	*cfg);
916*4882a593Smuzhiyun 
917*4882a593Smuzhiyun /**
918*4882a593Smuzhiyun  * dprc_disconnect() - Disconnect one endpoint to remove its network connection
919*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
920*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
921*4882a593Smuzhiyun  * @token:	Token of DPRC object
922*4882a593Smuzhiyun  * @endpoint:	Endpoint configuration parameters
923*4882a593Smuzhiyun  *
924*4882a593Smuzhiyun  * Return:	'0' on Success; Error code otherwise.
925*4882a593Smuzhiyun  */
926*4882a593Smuzhiyun int dprc_disconnect(struct fsl_mc_io		*mc_io,
927*4882a593Smuzhiyun 		    uint32_t			cmd_flags,
928*4882a593Smuzhiyun 		    uint16_t			token,
929*4882a593Smuzhiyun 		    const struct dprc_endpoint	*endpoint);
930*4882a593Smuzhiyun 
931*4882a593Smuzhiyun /**
932*4882a593Smuzhiyun * dprc_get_connection() - Get connected endpoint and link status if connection
933*4882a593Smuzhiyun *			exists.
934*4882a593Smuzhiyun * @mc_io:	Pointer to MC portal's I/O object
935*4882a593Smuzhiyun * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
936*4882a593Smuzhiyun * @token:	Token of DPRC object
937*4882a593Smuzhiyun * @endpoint1:	Endpoint 1 configuration parameters
938*4882a593Smuzhiyun * @endpoint2:	Returned endpoint 2 configuration parameters
939*4882a593Smuzhiyun * @state:	Returned link state:
940*4882a593Smuzhiyun *           1 - link is up;
941*4882a593Smuzhiyun *           0 - link is down;
942*4882a593Smuzhiyun *           -1 - no connection (endpoint2 information is irrelevant)
943*4882a593Smuzhiyun *
944*4882a593Smuzhiyun * Return:     '0' on Success; -ENAVAIL if connection does not exist.
945*4882a593Smuzhiyun */
946*4882a593Smuzhiyun int dprc_get_connection(struct fsl_mc_io		*mc_io,
947*4882a593Smuzhiyun 			uint32_t			cmd_flags,
948*4882a593Smuzhiyun 			uint16_t			token,
949*4882a593Smuzhiyun 			const struct dprc_endpoint	*endpoint1,
950*4882a593Smuzhiyun 			struct dprc_endpoint		*endpoint2,
951*4882a593Smuzhiyun 			int				*state);
952*4882a593Smuzhiyun 
953*4882a593Smuzhiyun #endif /* _FSL_DPRC_H */
954