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