blob: f837e8926ca34dda8c0b54ce057d0039982e7c15 [file] [log] [blame]
Prabhakar Kushwahaa2a55e52015-03-19 09:20:45 -07001/*
2 * Freescale Layerscape MC I/O wrapper
3 *
4 * Copyright (C) 2013-2015 Freescale Semiconductor, Inc.
5 * Author: German Rivera <German.Rivera@freescale.com>
6 *
7 * SPDX-License-Identifier: GPL-2.0+
8 */
9#ifndef _FSL_DPRC_H
10#define _FSL_DPRC_H
11
12/* DPRC Version */
13#define DPRC_VER_MAJOR 2
14#define DPRC_VER_MINOR 0
15
16/* Command IDs */
17#define DPRC_CMDID_CLOSE 0x800
18#define DPRC_CMDID_OPEN 0x805
19
20#define DPRC_CMDID_GET_ATTR 0x004
21#define DPRC_CMDID_RESET_CONT 0x005
22
23#define DPRC_CMDID_GET_CONT_ID 0x830
24#define DPRC_CMDID_GET_OBJ_COUNT 0x159
25#define DPRC_CMDID_GET_OBJ 0x15A
26#define DPRC_CMDID_GET_RES_COUNT 0x15B
27#define DPRC_CMDID_GET_RES_IDS 0x15C
28#define DPRC_CMDID_GET_OBJ_REG 0x15E
29
30#define DPRC_CMDID_CONNECT 0x167
31#define DPRC_CMDID_DISCONNECT 0x168
32#define DPRC_CMDID_GET_CONNECTION 0x16C
33
34/* cmd, param, offset, width, type, arg_name */
35#define DPRC_RSP_GET_CONTAINER_ID(cmd, container_id) \
36 MC_RSP_OP(cmd, 0, 0, 32, int, container_id)
37
38/* cmd, param, offset, width, type, arg_name */
39#define DPRC_CMD_OPEN(cmd, container_id) \
40 MC_CMD_OP(cmd, 0, 0, 32, int, container_id)
41
42/* cmd, param, offset, width, type, arg_name */
43#define DPRC_CMD_RESET_CONTAINER(cmd, child_container_id) \
44 MC_CMD_OP(cmd, 0, 0, 32, int, child_container_id)
45
46/* cmd, param, offset, width, type, arg_name */
47#define DPRC_RSP_GET_ATTRIBUTES(cmd, attr) \
48do { \
49 MC_RSP_OP(cmd, 0, 0, 32, int, attr->container_id); \
50 MC_RSP_OP(cmd, 0, 32, 16, uint16_t, attr->icid); \
51 MC_RSP_OP(cmd, 1, 0, 32, uint32_t, attr->options);\
52 MC_RSP_OP(cmd, 1, 32, 32, int, attr->portal_id); \
53 MC_RSP_OP(cmd, 2, 0, 16, uint16_t, attr->version.major);\
54 MC_RSP_OP(cmd, 2, 16, 16, uint16_t, attr->version.minor);\
55} while (0)
56
57/* cmd, param, offset, width, type, arg_name */
58#define DPRC_RSP_GET_OBJ_COUNT(cmd, obj_count) \
59 MC_RSP_OP(cmd, 0, 32, 32, int, obj_count)
60
61/* cmd, param, offset, width, type, arg_name */
62#define DPRC_CMD_GET_OBJ(cmd, obj_index) \
63 MC_CMD_OP(cmd, 0, 0, 32, int, obj_index)
64
65/* cmd, param, offset, width, type, arg_name */
66#define DPRC_RSP_GET_OBJ(cmd, obj_desc) \
67do { \
68 MC_RSP_OP(cmd, 0, 32, 32, int, obj_desc->id); \
69 MC_RSP_OP(cmd, 1, 0, 16, uint16_t, obj_desc->vendor); \
70 MC_RSP_OP(cmd, 1, 16, 8, uint8_t, obj_desc->irq_count); \
71 MC_RSP_OP(cmd, 1, 24, 8, uint8_t, obj_desc->region_count); \
72 MC_RSP_OP(cmd, 1, 32, 32, uint32_t, obj_desc->state);\
73 MC_RSP_OP(cmd, 2, 0, 16, uint16_t, obj_desc->ver_major);\
74 MC_RSP_OP(cmd, 2, 16, 16, uint16_t, obj_desc->ver_minor);\
75 MC_RSP_OP(cmd, 3, 0, 8, char, obj_desc->type[0]);\
76 MC_RSP_OP(cmd, 3, 8, 8, char, obj_desc->type[1]);\
77 MC_RSP_OP(cmd, 3, 16, 8, char, obj_desc->type[2]);\
78 MC_RSP_OP(cmd, 3, 24, 8, char, obj_desc->type[3]);\
79 MC_RSP_OP(cmd, 3, 32, 8, char, obj_desc->type[4]);\
80 MC_RSP_OP(cmd, 3, 40, 8, char, obj_desc->type[5]);\
81 MC_RSP_OP(cmd, 3, 48, 8, char, obj_desc->type[6]);\
82 MC_RSP_OP(cmd, 3, 56, 8, char, obj_desc->type[7]);\
83 MC_RSP_OP(cmd, 4, 0, 8, char, obj_desc->type[8]);\
84 MC_RSP_OP(cmd, 4, 8, 8, char, obj_desc->type[9]);\
85 MC_RSP_OP(cmd, 4, 16, 8, char, obj_desc->type[10]);\
86 MC_RSP_OP(cmd, 4, 24, 8, char, obj_desc->type[11]);\
87 MC_RSP_OP(cmd, 4, 32, 8, char, obj_desc->type[12]);\
88 MC_RSP_OP(cmd, 4, 40, 8, char, obj_desc->type[13]);\
89 MC_RSP_OP(cmd, 4, 48, 8, char, obj_desc->type[14]);\
90 MC_RSP_OP(cmd, 4, 56, 8, char, obj_desc->type[15]);\
91} while (0)
92
93/* cmd, param, offset, width, type, arg_name */
94#define DPRC_CMD_GET_RES_COUNT(cmd, type) \
95do { \
96 MC_CMD_OP(cmd, 1, 0, 8, char, type[0]);\
97 MC_CMD_OP(cmd, 1, 8, 8, char, type[1]);\
98 MC_CMD_OP(cmd, 1, 16, 8, char, type[2]);\
99 MC_CMD_OP(cmd, 1, 24, 8, char, type[3]);\
100 MC_CMD_OP(cmd, 1, 32, 8, char, type[4]);\
101 MC_CMD_OP(cmd, 1, 40, 8, char, type[5]);\
102 MC_CMD_OP(cmd, 1, 48, 8, char, type[6]);\
103 MC_CMD_OP(cmd, 1, 56, 8, char, type[7]);\
104 MC_CMD_OP(cmd, 2, 0, 8, char, type[8]);\
105 MC_CMD_OP(cmd, 2, 8, 8, char, type[9]);\
106 MC_CMD_OP(cmd, 2, 16, 8, char, type[10]);\
107 MC_CMD_OP(cmd, 2, 24, 8, char, type[11]);\
108 MC_CMD_OP(cmd, 2, 32, 8, char, type[12]);\
109 MC_CMD_OP(cmd, 2, 40, 8, char, type[13]);\
110 MC_CMD_OP(cmd, 2, 48, 8, char, type[14]);\
111 MC_CMD_OP(cmd, 2, 56, 8, char, type[15]);\
112} while (0)
113
114/* cmd, param, offset, width, type, arg_name */
115#define DPRC_RSP_GET_RES_COUNT(cmd, res_count) \
116 MC_RSP_OP(cmd, 0, 0, 32, int, res_count)
117
118/* cmd, param, offset, width, type, arg_name */
119#define DPRC_CMD_GET_RES_IDS(cmd, range_desc, type) \
120do { \
121 MC_CMD_OP(cmd, 0, 42, 7, enum dprc_iter_status, \
122 range_desc->iter_status); \
123 MC_CMD_OP(cmd, 1, 0, 32, int, range_desc->base_id); \
124 MC_CMD_OP(cmd, 1, 32, 32, int, range_desc->last_id);\
125 MC_CMD_OP(cmd, 2, 0, 8, char, type[0]);\
126 MC_CMD_OP(cmd, 2, 8, 8, char, type[1]);\
127 MC_CMD_OP(cmd, 2, 16, 8, char, type[2]);\
128 MC_CMD_OP(cmd, 2, 24, 8, char, type[3]);\
129 MC_CMD_OP(cmd, 2, 32, 8, char, type[4]);\
130 MC_CMD_OP(cmd, 2, 40, 8, char, type[5]);\
131 MC_CMD_OP(cmd, 2, 48, 8, char, type[6]);\
132 MC_CMD_OP(cmd, 2, 56, 8, char, type[7]);\
133 MC_CMD_OP(cmd, 3, 0, 8, char, type[8]);\
134 MC_CMD_OP(cmd, 3, 8, 8, char, type[9]);\
135 MC_CMD_OP(cmd, 3, 16, 8, char, type[10]);\
136 MC_CMD_OP(cmd, 3, 24, 8, char, type[11]);\
137 MC_CMD_OP(cmd, 3, 32, 8, char, type[12]);\
138 MC_CMD_OP(cmd, 3, 40, 8, char, type[13]);\
139 MC_CMD_OP(cmd, 3, 48, 8, char, type[14]);\
140 MC_CMD_OP(cmd, 3, 56, 8, char, type[15]);\
141} while (0)
142
143/* cmd, param, offset, width, type, arg_name */
144#define DPRC_RSP_GET_RES_IDS(cmd, range_desc) \
145do { \
146 MC_RSP_OP(cmd, 0, 42, 7, enum dprc_iter_status, \
147 range_desc->iter_status);\
148 MC_RSP_OP(cmd, 1, 0, 32, int, range_desc->base_id); \
149 MC_RSP_OP(cmd, 1, 32, 32, int, range_desc->last_id);\
150} while (0)
151
152/* cmd, param, offset, width, type, arg_name */
153#define DPRC_CMD_GET_OBJ_REGION(cmd, obj_type, obj_id, region_index) \
154do { \
155 MC_CMD_OP(cmd, 0, 0, 32, int, obj_id); \
156 MC_CMD_OP(cmd, 0, 48, 8, uint8_t, region_index);\
157 MC_CMD_OP(cmd, 3, 0, 8, char, obj_type[0]);\
158 MC_CMD_OP(cmd, 3, 8, 8, char, obj_type[1]);\
159 MC_CMD_OP(cmd, 3, 16, 8, char, obj_type[2]);\
160 MC_CMD_OP(cmd, 3, 24, 8, char, obj_type[3]);\
161 MC_CMD_OP(cmd, 3, 32, 8, char, obj_type[4]);\
162 MC_CMD_OP(cmd, 3, 40, 8, char, obj_type[5]);\
163 MC_CMD_OP(cmd, 3, 48, 8, char, obj_type[6]);\
164 MC_CMD_OP(cmd, 3, 56, 8, char, obj_type[7]);\
165 MC_CMD_OP(cmd, 4, 0, 8, char, obj_type[8]);\
166 MC_CMD_OP(cmd, 4, 8, 8, char, obj_type[9]);\
167 MC_CMD_OP(cmd, 4, 16, 8, char, obj_type[10]);\
168 MC_CMD_OP(cmd, 4, 24, 8, char, obj_type[11]);\
169 MC_CMD_OP(cmd, 4, 32, 8, char, obj_type[12]);\
170 MC_CMD_OP(cmd, 4, 40, 8, char, obj_type[13]);\
171 MC_CMD_OP(cmd, 4, 48, 8, char, obj_type[14]);\
172 MC_CMD_OP(cmd, 4, 56, 8, char, obj_type[15]);\
173} while (0)
174
175/* param, offset, width, type, arg_name */
176#define DPRC_RSP_GET_OBJ_REGION(cmd, region_desc) \
177do { \
178 MC_RSP_OP(cmd, 1, 0, 64, uint64_t, region_desc->base_paddr);\
179 MC_RSP_OP(cmd, 2, 0, 32, uint32_t, region_desc->size); \
180} while (0)
181
182/* cmd, param, offset, width, type, arg_name */
183#define DPRC_CMD_CONNECT(cmd, endpoint1, endpoint2) \
184do { \
185 MC_CMD_OP(cmd, 0, 0, 32, int, endpoint1->id); \
186 MC_CMD_OP(cmd, 0, 32, 32, int, endpoint1->interface_id); \
187 MC_CMD_OP(cmd, 1, 0, 32, int, endpoint2->id); \
188 MC_CMD_OP(cmd, 1, 32, 32, int, endpoint2->interface_id); \
189 MC_CMD_OP(cmd, 2, 0, 8, char, endpoint1->type[0]); \
190 MC_CMD_OP(cmd, 2, 8, 8, char, endpoint1->type[1]); \
191 MC_CMD_OP(cmd, 2, 16, 8, char, endpoint1->type[2]); \
192 MC_CMD_OP(cmd, 2, 24, 8, char, endpoint1->type[3]); \
193 MC_CMD_OP(cmd, 2, 32, 8, char, endpoint1->type[4]); \
194 MC_CMD_OP(cmd, 2, 40, 8, char, endpoint1->type[5]); \
195 MC_CMD_OP(cmd, 2, 48, 8, char, endpoint1->type[6]); \
196 MC_CMD_OP(cmd, 2, 56, 8, char, endpoint1->type[7]); \
197 MC_CMD_OP(cmd, 3, 0, 8, char, endpoint1->type[8]); \
198 MC_CMD_OP(cmd, 3, 8, 8, char, endpoint1->type[9]); \
199 MC_CMD_OP(cmd, 3, 16, 8, char, endpoint1->type[10]); \
200 MC_CMD_OP(cmd, 3, 24, 8, char, endpoint1->type[11]); \
201 MC_CMD_OP(cmd, 3, 32, 8, char, endpoint1->type[12]); \
202 MC_CMD_OP(cmd, 3, 40, 8, char, endpoint1->type[13]); \
203 MC_CMD_OP(cmd, 3, 48, 8, char, endpoint1->type[14]); \
204 MC_CMD_OP(cmd, 3, 56, 8, char, endpoint1->type[15]); \
205 MC_CMD_OP(cmd, 5, 0, 8, char, endpoint2->type[0]); \
206 MC_CMD_OP(cmd, 5, 8, 8, char, endpoint2->type[1]); \
207 MC_CMD_OP(cmd, 5, 16, 8, char, endpoint2->type[2]); \
208 MC_CMD_OP(cmd, 5, 24, 8, char, endpoint2->type[3]); \
209 MC_CMD_OP(cmd, 5, 32, 8, char, endpoint2->type[4]); \
210 MC_CMD_OP(cmd, 5, 40, 8, char, endpoint2->type[5]); \
211 MC_CMD_OP(cmd, 5, 48, 8, char, endpoint2->type[6]); \
212 MC_CMD_OP(cmd, 5, 56, 8, char, endpoint2->type[7]); \
213 MC_CMD_OP(cmd, 6, 0, 8, char, endpoint2->type[8]); \
214 MC_CMD_OP(cmd, 6, 8, 8, char, endpoint2->type[9]); \
215 MC_CMD_OP(cmd, 6, 16, 8, char, endpoint2->type[10]); \
216 MC_CMD_OP(cmd, 6, 24, 8, char, endpoint2->type[11]); \
217 MC_CMD_OP(cmd, 6, 32, 8, char, endpoint2->type[12]); \
218 MC_CMD_OP(cmd, 6, 40, 8, char, endpoint2->type[13]); \
219 MC_CMD_OP(cmd, 6, 48, 8, char, endpoint2->type[14]); \
220 MC_CMD_OP(cmd, 6, 56, 8, char, endpoint2->type[15]); \
221} while (0)
222
223/* cmd, param, offset, width, type, arg_name */
224#define DPRC_CMD_DISCONNECT(cmd, endpoint) \
225do { \
226 MC_CMD_OP(cmd, 0, 0, 32, int, endpoint->id); \
227 MC_CMD_OP(cmd, 0, 32, 32, int, endpoint->interface_id); \
228 MC_CMD_OP(cmd, 1, 0, 8, char, endpoint->type[0]); \
229 MC_CMD_OP(cmd, 1, 8, 8, char, endpoint->type[1]); \
230 MC_CMD_OP(cmd, 1, 16, 8, char, endpoint->type[2]); \
231 MC_CMD_OP(cmd, 1, 24, 8, char, endpoint->type[3]); \
232 MC_CMD_OP(cmd, 1, 32, 8, char, endpoint->type[4]); \
233 MC_CMD_OP(cmd, 1, 40, 8, char, endpoint->type[5]); \
234 MC_CMD_OP(cmd, 1, 48, 8, char, endpoint->type[6]); \
235 MC_CMD_OP(cmd, 1, 56, 8, char, endpoint->type[7]); \
236 MC_CMD_OP(cmd, 2, 0, 8, char, endpoint->type[8]); \
237 MC_CMD_OP(cmd, 2, 8, 8, char, endpoint->type[9]); \
238 MC_CMD_OP(cmd, 2, 16, 8, char, endpoint->type[10]); \
239 MC_CMD_OP(cmd, 2, 24, 8, char, endpoint->type[11]); \
240 MC_CMD_OP(cmd, 2, 32, 8, char, endpoint->type[12]); \
241 MC_CMD_OP(cmd, 2, 40, 8, char, endpoint->type[13]); \
242 MC_CMD_OP(cmd, 2, 48, 8, char, endpoint->type[14]); \
243 MC_CMD_OP(cmd, 2, 56, 8, char, endpoint->type[15]); \
244} while (0)
245
246/* cmd, param, offset, width, type, arg_name */
247#define DPRC_CMD_GET_CONNECTION(cmd, endpoint1) \
248do { \
249 MC_CMD_OP(cmd, 0, 0, 32, int, endpoint1->id); \
250 MC_CMD_OP(cmd, 0, 32, 32, int, endpoint1->interface_id); \
251 MC_CMD_OP(cmd, 1, 0, 8, char, endpoint1->type[0]); \
252 MC_CMD_OP(cmd, 1, 8, 8, char, endpoint1->type[1]); \
253 MC_CMD_OP(cmd, 1, 16, 8, char, endpoint1->type[2]); \
254 MC_CMD_OP(cmd, 1, 24, 8, char, endpoint1->type[3]); \
255 MC_CMD_OP(cmd, 1, 32, 8, char, endpoint1->type[4]); \
256 MC_CMD_OP(cmd, 1, 40, 8, char, endpoint1->type[5]); \
257 MC_CMD_OP(cmd, 1, 48, 8, char, endpoint1->type[6]); \
258 MC_CMD_OP(cmd, 1, 56, 8, char, endpoint1->type[7]); \
259 MC_CMD_OP(cmd, 2, 0, 8, char, endpoint1->type[8]); \
260 MC_CMD_OP(cmd, 2, 8, 8, char, endpoint1->type[9]); \
261 MC_CMD_OP(cmd, 2, 16, 8, char, endpoint1->type[10]); \
262 MC_CMD_OP(cmd, 2, 24, 8, char, endpoint1->type[11]); \
263 MC_CMD_OP(cmd, 2, 32, 8, char, endpoint1->type[12]); \
264 MC_CMD_OP(cmd, 2, 40, 8, char, endpoint1->type[13]); \
265 MC_CMD_OP(cmd, 2, 48, 8, char, endpoint1->type[14]); \
266 MC_CMD_OP(cmd, 2, 56, 8, char, endpoint1->type[15]); \
267} while (0)
268
269
270/* cmd, param, offset, width, type, arg_name */
271#define DPRC_RSP_GET_CONNECTION(cmd, endpoint2, state) \
272do { \
273 MC_RSP_OP(cmd, 3, 0, 32, int, endpoint2->id); \
274 MC_RSP_OP(cmd, 3, 32, 32, int, endpoint2->interface_id); \
275 MC_RSP_OP(cmd, 4, 0, 8, char, endpoint2->type[0]); \
276 MC_RSP_OP(cmd, 4, 8, 8, char, endpoint2->type[1]); \
277 MC_RSP_OP(cmd, 4, 16, 8, char, endpoint2->type[2]); \
278 MC_RSP_OP(cmd, 4, 24, 8, char, endpoint2->type[3]); \
279 MC_RSP_OP(cmd, 4, 32, 8, char, endpoint2->type[4]); \
280 MC_RSP_OP(cmd, 4, 40, 8, char, endpoint2->type[5]); \
281 MC_RSP_OP(cmd, 4, 48, 8, char, endpoint2->type[6]); \
282 MC_RSP_OP(cmd, 4, 56, 8, char, endpoint2->type[7]); \
283 MC_RSP_OP(cmd, 5, 0, 8, char, endpoint2->type[8]); \
284 MC_RSP_OP(cmd, 5, 8, 8, char, endpoint2->type[9]); \
285 MC_RSP_OP(cmd, 5, 16, 8, char, endpoint2->type[10]); \
286 MC_RSP_OP(cmd, 5, 24, 8, char, endpoint2->type[11]); \
287 MC_RSP_OP(cmd, 5, 32, 8, char, endpoint2->type[12]); \
288 MC_RSP_OP(cmd, 5, 40, 8, char, endpoint2->type[13]); \
289 MC_RSP_OP(cmd, 5, 48, 8, char, endpoint2->type[14]); \
290 MC_RSP_OP(cmd, 5, 56, 8, char, endpoint2->type[15]); \
291 MC_RSP_OP(cmd, 6, 0, 32, int, state); \
292} while (0)
293
294/* Data Path Resource Container API
295 * Contains DPRC API for managing and querying DPAA resources
296 */
297struct fsl_mc_io;
298
299/**
300 * Set this value as the icid value in dprc_cfg structure when creating a
301 * container, in case the ICID is not selected by the user and should be
302 * allocated by the DPRC from the pool of ICIDs.
303 */
304#define DPRC_GET_ICID_FROM_POOL (uint16_t)(~(0))
305
306/**
307 * Set this value as the portal_id value in dprc_cfg structure when creating a
308 * container, in case the portal ID is not specifically selected by the
309 * user and should be allocated by the DPRC from the pool of portal ids.
310 */
311#define DPRC_GET_PORTAL_ID_FROM_POOL (int)(~(0))
312
313/**
314 * dprc_get_container_id() - Get container ID associated with a given portal.
315 * @mc_io: Pointer to MC portal's I/O object
316 * @container_id: Requested container ID
317 *
318 * Return: '0' on Success; Error code otherwise.
319 */
320int dprc_get_container_id(struct fsl_mc_io *mc_io, int *container_id);
321
322/**
323 * dprc_open() - Open DPRC object for use
324 * @mc_io: Pointer to MC portal's I/O object
325 * @container_id: Container ID to open
326 * @token: Returned token of DPRC object
327 *
328 * Return: '0' on Success; Error code otherwise.
329 *
330 * @warning Required before any operation on the object.
331 */
332int dprc_open(struct fsl_mc_io *mc_io, int container_id, uint16_t *token);
333
334/**
335 * dprc_close() - Close the control session of the object
336 * @mc_io: Pointer to MC portal's I/O object
337 * @token: Token of DPRC object
338 *
339 * After this function is called, no further operations are
340 * allowed on the object without opening a new control session.
341 *
342 * Return: '0' on Success; Error code otherwise.
343 */
344int dprc_close(struct fsl_mc_io *mc_io, uint16_t token);
345
346/**
347 * Container general options
348 *
349 * These options may be selected at container creation by the container creator
350 * and can be retrieved using dprc_get_attributes()
351 */
352
353/* Spawn Policy Option allowed - Indicates that the new container is allowed
354 * to spawn and have its own child containers.
355 */
356#define DPRC_CFG_OPT_SPAWN_ALLOWED 0x00000001
357
358/* General Container allocation policy - Indicates that the new container is
359 * allowed to allocate requested resources from its parent container; if not
360 * set, the container is only allowed to use resources in its own pools; Note
361 * that this is a container's global policy, but the parent container may
362 * override it and set specific quota per resource type.
363 */
364#define DPRC_CFG_OPT_ALLOC_ALLOWED 0x00000002
365
366/* Object initialization allowed - software context associated with this
367 * container is allowed to invoke object initialization operations.
368 */
369#define DPRC_CFG_OPT_OBJ_CREATE_ALLOWED 0x00000004
370
371/* Topology change allowed - software context associated with this
372 * container is allowed to invoke topology operations, such as attach/detach
373 * of network objects.
374 */
375#define DPRC_CFG_OPT_TOPOLOGY_CHANGES_ALLOWED 0x00000008
376
377/* IOMMU bypass - indicates whether objects of this container are permitted
378 * to bypass the IOMMU.
379 */
380#define DPRC_CFG_OPT_IOMMU_BYPASS 0x00000010
381
382/* AIOP - Indicates that container belongs to AIOP. */
383#define DPRC_CFG_OPT_AIOP 0x00000020
384
385/**
386 * struct dprc_cfg - Container configuration options
387 * @icid: Container's ICID; if set to 'DPRC_GET_ICID_FROM_POOL', a free
388 * ICID value is allocated by the DPRC
389 * @portal_id: Portal ID; if set to 'DPRC_GET_PORTAL_ID_FROM_POOL', a free
390 * portal ID is allocated by the DPRC
391 * @options: Combination of 'DPRC_CFG_OPT_<X>' options
392 */
393struct dprc_cfg {
394 uint16_t icid;
395 int portal_id;
396 uint64_t options;
397};
398
399/**
400 * dprc_reset_container - Reset child container.
401 * @mc_io: Pointer to MC portal's I/O object
402 * @token: Token of DPRC object
403 * @child_container_id: ID of the container to reset
404 *
405 * In case a software context crashes or becomes non-responsive, the parent
406 * may wish to reset its resources container before the software context is
407 * restarted.
408 *
409 * This routine informs all objects assigned to the child container that the
410 * container is being reset, so they may perform any cleanup operations that are
411 * needed. All objects handles that were owned by the child container shall be
412 * closed.
413 *
414 * Note that such request may be submitted even if the child software context
415 * has not crashed, but the resulting object cleanup operations will not be
416 * aware of that.
417 *
418 * Return: '0' on Success; Error code otherwise.
419 */
420int dprc_reset_container(struct fsl_mc_io *mc_io,
421 uint16_t token,
422 int child_container_id);
423
424/**
425 * struct dprc_attributes - Container attributes
426 * @container_id: Container's ID
427 * @icid: Container's ICID
428 * @portal_id: Container's portal ID
429 * @options: Container's options as set at container's creation
430 * @version: DPRC version
431 */
432struct dprc_attributes {
433 int container_id;
434 uint16_t icid;
435 int portal_id;
436 uint64_t options;
437 /**
438 * struct version - DPRC version
439 * @major: DPRC major version
440 * @minor: DPRC minor version
441 */
442 struct {
443 uint16_t major;
444 uint16_t minor;
445 } version;
446};
447
448/**
449 * dprc_get_attributes() - Obtains container attributes
450 * @mc_io: Pointer to MC portal's I/O object
451 * @token: Token of DPRC object
452 * @attributes Returned container attributes
453 *
454 * Return: '0' on Success; Error code otherwise.
455 */
456int dprc_get_attributes(struct fsl_mc_io *mc_io,
457 uint16_t token,
458 struct dprc_attributes *attributes);
459
460/**
461 * dprc_get_obj_count() - Obtains the number of objects in the DPRC
462 * @mc_io: Pointer to MC portal's I/O object
463 * @token: Token of DPRC object
464 * @obj_count: Number of objects assigned to the DPRC
465 *
466 * Return: '0' on Success; Error code otherwise.
467 */
468int dprc_get_obj_count(struct fsl_mc_io *mc_io, uint16_t token, int *obj_count);
469
470/* Objects Attributes Flags */
471
472/* Opened state - Indicates that an object is open by at least one owner */
473#define DPRC_OBJ_STATE_OPEN 0x00000001
474/* Plugged state - Indicates that the object is plugged */
475#define DPRC_OBJ_STATE_PLUGGED 0x00000002
476
477/**
478 * struct dprc_obj_desc - Object descriptor, returned from dprc_get_obj()
479 * @type: Type of object: NULL terminated string
480 * @id: ID of logical object resource
481 * @vendor: Object vendor identifier
482 * @ver_major: Major version number
483 * @ver_minor: Minor version number
484 * @irq_count: Number of interrupts supported by the object
485 * @region_count: Number of mappable regions supported by the object
486 * @state: Object state: combination of DPRC_OBJ_STATE_ states
487 */
488struct dprc_obj_desc {
489 char type[16];
490 int id;
491 uint16_t vendor;
492 uint16_t ver_major;
493 uint16_t ver_minor;
494 uint8_t irq_count;
495 uint8_t region_count;
496 uint32_t state;
497};
498
499/**
500 * dprc_get_obj() - Get general information on an object
501 * @mc_io: Pointer to MC portal's I/O object
502 * @token: Token of DPRC object
503 * @obj_index: Index of the object to be queried (< obj_count)
504 * @obj_desc: Returns the requested object descriptor
505 *
506 * The object descriptors are retrieved one by one by incrementing
507 * obj_index up to (not including) the value of obj_count returned
508 * from dprc_get_obj_count(). dprc_get_obj_count() must
509 * be called prior to dprc_get_obj().
510 *
511 * Return: '0' on Success; Error code otherwise.
512 */
513int dprc_get_obj(struct fsl_mc_io *mc_io,
514 uint16_t token,
515 int obj_index,
516 struct dprc_obj_desc *obj_desc);
517
518/**
519 * dprc_get_res_count() - Obtains the number of free resources that are assigned
520 * to this container, by pool type
521 * @mc_io: Pointer to MC portal's I/O object
522 * @token: Token of DPRC object
523 * @type: pool type
524 * @res_count: Returned number of free resources of the given
525 * resource type that are assigned to this DPRC
526 *
527 * Return: '0' on Success; Error code otherwise.
528 */
529int dprc_get_res_count(struct fsl_mc_io *mc_io,
530 uint16_t token,
531 char *type,
532 int *res_count);
533
534/**
535 * enum dprc_iter_status - Iteration status
536 * @DPRC_ITER_STATUS_FIRST: Perform first iteration
537 * @DPRC_ITER_STATUS_MORE: Indicates more/next iteration is needed
538 * @DPRC_ITER_STATUS_LAST: Indicates last iteration
539 */
540enum dprc_iter_status {
541 DPRC_ITER_STATUS_FIRST = 0,
542 DPRC_ITER_STATUS_MORE = 1,
543 DPRC_ITER_STATUS_LAST = 2
544};
545
546/**
547 * struct dprc_res_ids_range_desc - Resource ID range descriptor
548 * @base_id: Base resource ID of this range
549 * @last_id: Last resource ID of this range
550 * @iter_status: Iteration status - should be set to DPRC_ITER_STATUS_FIRST at
551 * first iteration; while the returned marker is DPRC_ITER_STATUS_MORE,
552 * additional iterations are needed, until the returned marker is
553 * DPRC_ITER_STATUS_LAST
554 */
555struct dprc_res_ids_range_desc {
556 int base_id;
557 int last_id;
558 enum dprc_iter_status iter_status;
559};
560
561/**
562 * dprc_get_res_ids() - Obtains IDs of free resources in the container
563 * @mc_io: Pointer to MC portal's I/O object
564 * @token: Token of DPRC object
565 * @type: pool type
566 * @range_desc: range descriptor
567 *
568 * Return: '0' on Success; Error code otherwise.
569 */
570int dprc_get_res_ids(struct fsl_mc_io *mc_io,
571 uint16_t token,
572 char *type,
573 struct dprc_res_ids_range_desc *range_desc);
574
575/**
576 * struct dprc_region_desc - Mappable region descriptor
577 * @base_paddr: Region base physical address
578 * @size: Region size (in bytes)
579 */
580struct dprc_region_desc {
581 uint64_t base_paddr;
582 uint32_t size;
583};
584
585/**
586 * dprc_get_obj_region() - Get region information for a specified object.
587 * @mc_io: Pointer to MC portal's I/O object
588 * @token: Token of DPRC object
589 * @obj_type; Object type as returned in dprc_get_obj()
590 * @obj_id: Unique object instance as returned in dprc_get_obj()
591 * @region_index: The specific region to query
592 * @region_desc: Returns the requested region descriptor
593 *
594 * Return: '0' on Success; Error code otherwise.
595 */
596int dprc_get_obj_region(struct fsl_mc_io *mc_io,
597 uint16_t token,
598 char *obj_type,
599 int obj_id,
600 uint8_t region_index,
601 struct dprc_region_desc *region_desc);
602/**
603 * struct dprc_endpoint - Endpoint description for link connect/disconnect
604 * operations
605 * @type: Endpoint object type: NULL terminated string
606 * @id: Endpoint object ID
607 * @interface_id: Interface ID; should be set for endpoints with multiple
608 * interfaces ("dpsw", "dpdmux"); for others, always set to 0
609 */
610struct dprc_endpoint {
611 char type[16];
612 int id;
613 int interface_id;
614};
615
616/**
617 * dprc_connect() - Connect two endpoints to create a network link between them
618 * @mc_io: Pointer to MC portal's I/O object
619 * @token: Token of DPRC object
620 * @endpoint1: Endpoint 1 configuration parameters
621 * @endpoint2: Endpoint 2 configuration parameters
622 *
623 * Return: '0' on Success; Error code otherwise.
624 */
625int dprc_connect(struct fsl_mc_io *mc_io,
626 uint16_t token,
627 const struct dprc_endpoint *endpoint1,
628 const struct dprc_endpoint *endpoint2);
629
630/**
631 * dprc_disconnect() - Disconnect one endpoint to remove its network connection
632 * @mc_io: Pointer to MC portal's I/O object
633 * @token: Token of DPRC object
634 * @endpoint: Endpoint configuration parameters
635 *
636 * Return: '0' on Success; Error code otherwise.
637 */
638int dprc_disconnect(struct fsl_mc_io *mc_io,
639 uint16_t token,
640 const struct dprc_endpoint *endpoint);
641
642/**
643* dprc_get_connection() - Get connected endpoint and link status if connection
644* exists.
645* @mc_io Pointer to MC portal's I/O object
646* @token Token of DPRC object
647* @endpoint1 Endpoint 1 configuration parameters
648* @endpoint2 Returned endpoint 2 configuration parameters
649* @state: Returned link state: 1 - link is up, 0 - link is down
650*
651* Return: '0' on Success; -ENAVAIL if connection does not exist.
652*/
653int dprc_get_connection(struct fsl_mc_io *mc_io,
654 uint16_t token,
655 const struct dprc_endpoint *endpoint1,
656 struct dprc_endpoint *endpoint2,
657 int *state);
658
659#endif /* _FSL_DPRC_H */