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