1 /* Copyright 2013-2015 Freescale Semiconductor Inc. 2 * 3 * Redistribution and use in source and binary forms, with or without 4 * modification, are permitted provided that the following conditions are met: 5 * * Redistributions of source code must retain the above copyright 6 * notice, this list of conditions and the following disclaimer. 7 * * Redistributions in binary form must reproduce the above copyright 8 * notice, this list of conditions and the following disclaimer in the 9 * documentation and/or other materials provided with the distribution. 10 * * Neither the name of the above-listed copyright holders nor the 11 * names of any contributors may be used to endorse or promote products 12 * derived from this software without specific prior written permission. 13 * 14 * 15 * ALTERNATIVELY, this software may be distributed under the terms of the 16 * GNU General Public License ("GPL") as published by the Free Software 17 * Foundation, either version 2 of that License or (at your option) any 18 * later version. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 21 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 23 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE 24 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 25 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 26 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 30 * POSSIBILITY OF SUCH DAMAGE. 31 */ 32 #ifndef _FSL_DPRC_H 33 #define _FSL_DPRC_H 34 35 #include "mc-cmd.h" 36 37 /* Data Path Resource Container API 38 * Contains DPRC API for managing and querying DPAA resources 39 */ 40 41 struct fsl_mc_io; 42 43 /** 44 * Set this value as the icid value in dprc_cfg structure when creating a 45 * container, in case the ICID is not selected by the user and should be 46 * allocated by the DPRC from the pool of ICIDs. 47 */ 48 #define DPRC_GET_ICID_FROM_POOL (u16)(~(0)) 49 50 /** 51 * Set this value as the portal_id value in dprc_cfg structure when creating a 52 * container, in case the portal ID is not specifically selected by the 53 * user and should be allocated by the DPRC from the pool of portal ids. 54 */ 55 #define DPRC_GET_PORTAL_ID_FROM_POOL (int)(~(0)) 56 57 int dprc_open(struct fsl_mc_io *mc_io, 58 u32 cmd_flags, 59 int container_id, 60 u16 *token); 61 62 int dprc_close(struct fsl_mc_io *mc_io, 63 u32 cmd_flags, 64 u16 token); 65 66 /** 67 * Container general options 68 * 69 * These options may be selected at container creation by the container creator 70 * and can be retrieved using dprc_get_attributes() 71 */ 72 73 /* Spawn Policy Option allowed - Indicates that the new container is allowed 74 * to spawn and have its own child containers. 75 */ 76 #define DPRC_CFG_OPT_SPAWN_ALLOWED 0x00000001 77 78 /* General Container allocation policy - Indicates that the new container is 79 * allowed to allocate requested resources from its parent container; if not 80 * set, the container is only allowed to use resources in its own pools; Note 81 * that this is a container's global policy, but the parent container may 82 * override it and set specific quota per resource type. 83 */ 84 #define DPRC_CFG_OPT_ALLOC_ALLOWED 0x00000002 85 86 /* Object initialization allowed - software context associated with this 87 * container is allowed to invoke object initialization operations. 88 */ 89 #define DPRC_CFG_OPT_OBJ_CREATE_ALLOWED 0x00000004 90 91 /* Topology change allowed - software context associated with this 92 * container is allowed to invoke topology operations, such as attach/detach 93 * of network objects. 94 */ 95 #define DPRC_CFG_OPT_TOPOLOGY_CHANGES_ALLOWED 0x00000008 96 97 /* IOMMU bypass - indicates whether objects of this container are permitted 98 * to bypass the IOMMU. 99 */ 100 #define DPRC_CFG_OPT_IOMMU_BYPASS 0x00000010 101 102 /* AIOP - Indicates that container belongs to AIOP. */ 103 #define DPRC_CFG_OPT_AIOP 0x00000020 104 105 /* IRQ Config - Indicates that the container allowed to configure its IRQs. */ 106 #define DPRC_CFG_OPT_IRQ_CFG_ALLOWED 0x00000040 107 108 /** 109 * struct dprc_cfg - Container configuration options 110 * @icid: Container's ICID; if set to 'DPRC_GET_ICID_FROM_POOL', a free 111 * ICID value is allocated by the DPRC 112 * @portal_id: Portal ID; if set to 'DPRC_GET_PORTAL_ID_FROM_POOL', a free 113 * portal ID is allocated by the DPRC 114 * @options: Combination of 'DPRC_CFG_OPT_<X>' options 115 * @label: Object's label 116 */ 117 struct dprc_cfg { 118 u16 icid; 119 int portal_id; 120 u64 options; 121 char label[16]; 122 }; 123 124 int dprc_create_container(struct fsl_mc_io *mc_io, 125 u32 cmd_flags, 126 u16 token, 127 struct dprc_cfg *cfg, 128 int *child_container_id, 129 u64 *child_portal_offset); 130 131 int dprc_destroy_container(struct fsl_mc_io *mc_io, 132 u32 cmd_flags, 133 u16 token, 134 int child_container_id); 135 136 int dprc_reset_container(struct fsl_mc_io *mc_io, 137 u32 cmd_flags, 138 u16 token, 139 int child_container_id); 140 141 /* IRQ */ 142 143 /* IRQ index */ 144 #define DPRC_IRQ_INDEX 0 145 146 /* Number of dprc's IRQs */ 147 #define DPRC_NUM_OF_IRQS 1 148 149 /* DPRC IRQ events */ 150 151 /* IRQ event - Indicates that a new object added to the container */ 152 #define DPRC_IRQ_EVENT_OBJ_ADDED 0x00000001 153 /* IRQ event - Indicates that an object was removed from the container */ 154 #define DPRC_IRQ_EVENT_OBJ_REMOVED 0x00000002 155 /* IRQ event - Indicates that resources added to the container */ 156 #define DPRC_IRQ_EVENT_RES_ADDED 0x00000004 157 /* IRQ event - Indicates that resources removed from the container */ 158 #define DPRC_IRQ_EVENT_RES_REMOVED 0x00000008 159 /* IRQ event - Indicates that one of the descendant containers that opened by 160 * this container is destroyed 161 */ 162 #define DPRC_IRQ_EVENT_CONTAINER_DESTROYED 0x00000010 163 164 /* IRQ event - Indicates that on one of the container's opened object is 165 * destroyed 166 */ 167 #define DPRC_IRQ_EVENT_OBJ_DESTROYED 0x00000020 168 169 /* Irq event - Indicates that object is created at the container */ 170 #define DPRC_IRQ_EVENT_OBJ_CREATED 0x00000040 171 172 /** 173 * struct dprc_irq_cfg - IRQ configuration 174 * @paddr: Address that must be written to signal a message-based interrupt 175 * @val: Value to write into irq_addr address 176 * @user_irq_id: A user defined number associated with this IRQ 177 */ 178 struct dprc_irq_cfg { 179 u64 paddr; 180 u32 val; 181 int user_irq_id; 182 }; 183 184 int dprc_set_irq(struct fsl_mc_io *mc_io, 185 u32 cmd_flags, 186 u16 token, 187 u8 irq_index, 188 struct dprc_irq_cfg *irq_cfg); 189 190 int dprc_get_irq(struct fsl_mc_io *mc_io, 191 u32 cmd_flags, 192 u16 token, 193 u8 irq_index, 194 int *type, 195 struct dprc_irq_cfg *irq_cfg); 196 197 int dprc_set_irq_enable(struct fsl_mc_io *mc_io, 198 u32 cmd_flags, 199 u16 token, 200 u8 irq_index, 201 u8 en); 202 203 int dprc_get_irq_enable(struct fsl_mc_io *mc_io, 204 u32 cmd_flags, 205 u16 token, 206 u8 irq_index, 207 u8 *en); 208 209 int dprc_set_irq_mask(struct fsl_mc_io *mc_io, 210 u32 cmd_flags, 211 u16 token, 212 u8 irq_index, 213 u32 mask); 214 215 int dprc_get_irq_mask(struct fsl_mc_io *mc_io, 216 u32 cmd_flags, 217 u16 token, 218 u8 irq_index, 219 u32 *mask); 220 221 int dprc_get_irq_status(struct fsl_mc_io *mc_io, 222 u32 cmd_flags, 223 u16 token, 224 u8 irq_index, 225 u32 *status); 226 227 int dprc_clear_irq_status(struct fsl_mc_io *mc_io, 228 u32 cmd_flags, 229 u16 token, 230 u8 irq_index, 231 u32 status); 232 233 /** 234 * struct dprc_attributes - Container attributes 235 * @container_id: Container's ID 236 * @icid: Container's ICID 237 * @portal_id: Container's portal ID 238 * @options: Container's options as set at container's creation 239 * @version: DPRC version 240 */ 241 struct dprc_attributes { 242 int container_id; 243 u16 icid; 244 int portal_id; 245 u64 options; 246 /** 247 * struct version - DPRC version 248 * @major: DPRC major version 249 * @minor: DPRC minor version 250 */ 251 struct { 252 u16 major; 253 u16 minor; 254 } version; 255 }; 256 257 int dprc_get_attributes(struct fsl_mc_io *mc_io, 258 u32 cmd_flags, 259 u16 token, 260 struct dprc_attributes *attributes); 261 262 int dprc_set_res_quota(struct fsl_mc_io *mc_io, 263 u32 cmd_flags, 264 u16 token, 265 int child_container_id, 266 char *type, 267 u16 quota); 268 269 int dprc_get_res_quota(struct fsl_mc_io *mc_io, 270 u32 cmd_flags, 271 u16 token, 272 int child_container_id, 273 char *type, 274 u16 *quota); 275 276 /* Resource request options */ 277 278 /* Explicit resource ID request - The requested objects/resources 279 * are explicit and sequential (in case of resources). 280 * The base ID is given at res_req at base_align field 281 */ 282 #define DPRC_RES_REQ_OPT_EXPLICIT 0x00000001 283 284 /* Aligned resources request - Relevant only for resources 285 * request (and not objects). Indicates that resources base ID should be 286 * sequential and aligned to the value given at dprc_res_req base_align field 287 */ 288 #define DPRC_RES_REQ_OPT_ALIGNED 0x00000002 289 290 /* Plugged Flag - Relevant only for object assignment request. 291 * Indicates that after all objects assigned. An interrupt will be invoked at 292 * the relevant GPP. The assigned object will be marked as plugged. 293 * plugged objects can't be assigned from their container 294 */ 295 #define DPRC_RES_REQ_OPT_PLUGGED 0x00000004 296 297 /** 298 * struct dprc_res_req - Resource request descriptor, to be used in assignment 299 * or un-assignment of resources and objects. 300 * @type: Resource/object type: Represent as a NULL terminated string. 301 * This string may received by using dprc_get_pool() to get resource 302 * type and dprc_get_obj() to get object type; 303 * Note: it is not possible to assign/un-assign DPRC objects 304 * @num: Number of resources 305 * @options: Request options: combination of DPRC_RES_REQ_OPT_ options 306 * @id_base_align: In case of explicit assignment (DPRC_RES_REQ_OPT_EXPLICIT 307 * is set at option), this field represents the required base ID 308 * for resource allocation; In case of aligned assignment 309 * (DPRC_RES_REQ_OPT_ALIGNED is set at option), this field 310 * indicates the required alignment for the resource ID(s) - 311 * use 0 if there is no alignment or explicit ID requirements 312 */ 313 struct dprc_res_req { 314 char type[16]; 315 u32 num; 316 u32 options; 317 int id_base_align; 318 }; 319 320 int dprc_assign(struct fsl_mc_io *mc_io, 321 u32 cmd_flags, 322 u16 token, 323 int container_id, 324 struct dprc_res_req *res_req); 325 326 int dprc_unassign(struct fsl_mc_io *mc_io, 327 u32 cmd_flags, 328 u16 token, 329 int child_container_id, 330 struct dprc_res_req *res_req); 331 332 int dprc_get_pool_count(struct fsl_mc_io *mc_io, 333 u32 cmd_flags, 334 u16 token, 335 int *pool_count); 336 337 int dprc_get_pool(struct fsl_mc_io *mc_io, 338 u32 cmd_flags, 339 u16 token, 340 int pool_index, 341 char *type); 342 343 int dprc_get_obj_count(struct fsl_mc_io *mc_io, 344 u32 cmd_flags, 345 u16 token, 346 int *obj_count); 347 348 /* Objects Attributes Flags */ 349 350 /* Opened state - Indicates that an object is open by at least one owner */ 351 #define DPRC_OBJ_STATE_OPEN 0x00000001 352 /* Plugged state - Indicates that the object is plugged */ 353 #define DPRC_OBJ_STATE_PLUGGED 0x00000002 354 355 /** 356 * struct dprc_obj_desc - Object descriptor, returned from dprc_get_obj() 357 * @type: Type of object: NULL terminated string 358 * @id: ID of logical object resource 359 * @vendor: Object vendor identifier 360 * @ver_major: Major version number 361 * @ver_minor: Minor version number 362 * @irq_count: Number of interrupts supported by the object 363 * @region_count: Number of mappable regions supported by the object 364 * @state: Object state: combination of DPRC_OBJ_STATE_ states 365 * @label: Object label 366 */ 367 struct dprc_obj_desc { 368 char type[16]; 369 int id; 370 u16 vendor; 371 u16 ver_major; 372 u16 ver_minor; 373 u8 irq_count; 374 u8 region_count; 375 u32 state; 376 char label[16]; 377 }; 378 379 int dprc_get_obj(struct fsl_mc_io *mc_io, 380 u32 cmd_flags, 381 u16 token, 382 int obj_index, 383 struct dprc_obj_desc *obj_desc); 384 385 int dprc_get_obj_desc(struct fsl_mc_io *mc_io, 386 u32 cmd_flags, 387 u16 token, 388 char *obj_type, 389 int obj_id, 390 struct dprc_obj_desc *obj_desc); 391 392 int dprc_set_obj_irq(struct fsl_mc_io *mc_io, 393 u32 cmd_flags, 394 u16 token, 395 char *obj_type, 396 int obj_id, 397 u8 irq_index, 398 struct dprc_irq_cfg *irq_cfg); 399 400 int dprc_get_obj_irq(struct fsl_mc_io *mc_io, 401 u32 cmd_flags, 402 u16 token, 403 char *obj_type, 404 int obj_id, 405 u8 irq_index, 406 int *type, 407 struct dprc_irq_cfg *irq_cfg); 408 409 int dprc_get_res_count(struct fsl_mc_io *mc_io, 410 u32 cmd_flags, 411 u16 token, 412 char *type, 413 int *res_count); 414 415 /** 416 * enum dprc_iter_status - Iteration status 417 * @DPRC_ITER_STATUS_FIRST: Perform first iteration 418 * @DPRC_ITER_STATUS_MORE: Indicates more/next iteration is needed 419 * @DPRC_ITER_STATUS_LAST: Indicates last iteration 420 */ 421 enum dprc_iter_status { 422 DPRC_ITER_STATUS_FIRST = 0, 423 DPRC_ITER_STATUS_MORE = 1, 424 DPRC_ITER_STATUS_LAST = 2 425 }; 426 427 /** 428 * struct dprc_res_ids_range_desc - Resource ID range descriptor 429 * @base_id: Base resource ID of this range 430 * @last_id: Last resource ID of this range 431 * @iter_status: Iteration status - should be set to DPRC_ITER_STATUS_FIRST at 432 * first iteration; while the returned marker is DPRC_ITER_STATUS_MORE, 433 * additional iterations are needed, until the returned marker is 434 * DPRC_ITER_STATUS_LAST 435 */ 436 struct dprc_res_ids_range_desc { 437 int base_id; 438 int last_id; 439 enum dprc_iter_status iter_status; 440 }; 441 442 int dprc_get_res_ids(struct fsl_mc_io *mc_io, 443 u32 cmd_flags, 444 u16 token, 445 char *type, 446 struct dprc_res_ids_range_desc *range_desc); 447 448 /* Region flags */ 449 /* Cacheable - Indicates that region should be mapped as cacheable */ 450 #define DPRC_REGION_CACHEABLE 0x00000001 451 452 /** 453 * enum dprc_region_type - Region type 454 * @DPRC_REGION_TYPE_MC_PORTAL: MC portal region 455 * @DPRC_REGION_TYPE_QBMAN_PORTAL: Qbman portal region 456 */ 457 enum dprc_region_type { 458 DPRC_REGION_TYPE_MC_PORTAL, 459 DPRC_REGION_TYPE_QBMAN_PORTAL 460 }; 461 462 /** 463 * struct dprc_region_desc - Mappable region descriptor 464 * @base_offset: Region offset from region's base address. 465 * For DPMCP and DPRC objects, region base is offset from SoC MC portals 466 * base address; For DPIO, region base is offset from SoC QMan portals 467 * base address 468 * @size: Region size (in bytes) 469 * @flags: Region attributes 470 * @type: Portal region type 471 */ 472 struct dprc_region_desc { 473 u32 base_offset; 474 u32 size; 475 u32 flags; 476 enum dprc_region_type type; 477 }; 478 479 int dprc_get_obj_region(struct fsl_mc_io *mc_io, 480 u32 cmd_flags, 481 u16 token, 482 char *obj_type, 483 int obj_id, 484 u8 region_index, 485 struct dprc_region_desc *region_desc); 486 487 int dprc_set_obj_label(struct fsl_mc_io *mc_io, 488 u32 cmd_flags, 489 u16 token, 490 char *obj_type, 491 int obj_id, 492 char *label); 493 494 /** 495 * struct dprc_endpoint - Endpoint description for link connect/disconnect 496 * operations 497 * @type: Endpoint object type: NULL terminated string 498 * @id: Endpoint object ID 499 * @if_id: Interface ID; should be set for endpoints with multiple 500 * interfaces ("dpsw", "dpdmux"); for others, always set to 0 501 */ 502 struct dprc_endpoint { 503 char type[16]; 504 int id; 505 int if_id; 506 }; 507 508 /** 509 * struct dprc_connection_cfg - Connection configuration. 510 * Used for virtual connections only 511 * @committed_rate: Committed rate (Mbits/s) 512 * @max_rate: Maximum rate (Mbits/s) 513 */ 514 struct dprc_connection_cfg { 515 u32 committed_rate; 516 u32 max_rate; 517 }; 518 519 int dprc_connect(struct fsl_mc_io *mc_io, 520 u32 cmd_flags, 521 u16 token, 522 const struct dprc_endpoint *endpoint1, 523 const struct dprc_endpoint *endpoint2, 524 const struct dprc_connection_cfg *cfg); 525 526 int dprc_disconnect(struct fsl_mc_io *mc_io, 527 u32 cmd_flags, 528 u16 token, 529 const struct dprc_endpoint *endpoint); 530 531 int dprc_get_connection(struct fsl_mc_io *mc_io, 532 u32 cmd_flags, 533 u16 token, 534 const struct dprc_endpoint *endpoint1, 535 struct dprc_endpoint *endpoint2, 536 int *state); 537 538 #endif /* _FSL_DPRC_H */ 539 540