/* SPDX-License-Identifier: GPL-2.0+ */ /* * Freescale Layerscape MC I/O wrapper * * Copyright 2013-2016 Freescale Semiconductor, Inc. * Copyright 2017, 2023 NXP */ #ifndef _FSL_DPRC_H #define _FSL_DPRC_H /* DPRC Version */ #define DPRC_VER_MAJOR 6 #define DPRC_VER_MINOR 1 /* Command IDs */ #define DPRC_CMDID_CLOSE 0x8001 #define DPRC_CMDID_OPEN 0x8051 #define DPRC_CMDID_GET_API_VERSION 0xa051 #define DPRC_CMDID_CREATE_CONT 0x1511 #define DPRC_CMDID_DESTROY_CONT 0x1521 #define DPRC_CMDID_GET_CONT_ID 0x8301 #define DPRC_CMDID_CONNECT 0x1671 #define DPRC_CMDID_DISCONNECT 0x1681 #define DPRC_CMDID_GET_CONNECTION 0x16C1 #pragma pack(push, 1) struct dprc_cmd_open { __le32 container_id; }; struct dprc_cmd_create_container { __le32 options; __le32 icid; __le32 pad1; __le32 portal_id; u8 label[16]; }; struct dprc_rsp_create_container { __le64 pad0; __le32 child_container_id; __le32 pad1; __le64 child_portal_addr; }; struct dprc_cmd_destroy_container { __le32 child_container_id; }; struct dprc_cmd_connect { __le32 ep1_id; __le16 ep1_interface_id; __le16 pad0; __le32 ep2_id; __le16 ep2_interface_id; __le16 pad1; u8 ep1_type[16]; __le32 max_rate; __le32 committed_rate; u8 ep2_type[16]; }; struct dprc_cmd_disconnect { __le32 id; __le32 interface_id; u8 type[16]; }; struct dprc_cmd_get_connection { __le32 ep1_id; __le16 ep1_interface_id; __le16 pad; u8 ep1_type[16]; }; struct dprc_rsp_get_connection { __le64 pad[3]; __le32 ep2_id; __le16 ep2_interface_id; __le16 pad1; u8 ep2_type[16]; __le32 state; }; #pragma pack(pop) /* Data Path Resource Container API * Contains DPRC API for managing and querying DPAA resources */ struct fsl_mc_io; /** * Set this value as the icid value in dprc_cfg structure when creating a * container, in case the ICID is not selected by the user and should be * allocated by the DPRC from the pool of ICIDs. */ #define DPRC_GET_ICID_FROM_POOL (u16)(~(0)) /** * Set this value as the portal_id value in dprc_cfg structure when creating a * container, in case the portal ID is not specifically selected by the * user and should be allocated by the DPRC from the pool of portal ids. */ #define DPRC_GET_PORTAL_ID_FROM_POOL (int)(~(0)) int dprc_get_container_id(struct fsl_mc_io *mc_io, u32 cmd_flags, int *container_id); int dprc_open(struct fsl_mc_io *mc_io, u32 cmd_flags, int container_id, u16 *token); int dprc_close(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token); /** * Container general options * * These options may be selected at container creation by the container creator * and can be retrieved using dprc_get_attributes() */ /* Spawn Policy Option allowed - Indicates that the new container is allowed * to spawn and have its own child containers. */ #define DPRC_CFG_OPT_SPAWN_ALLOWED 0x00000001 /* General Container allocation policy - Indicates that the new container is * allowed to allocate requested resources from its parent container; if not * set, the container is only allowed to use resources in its own pools; Note * that this is a container's global policy, but the parent container may * override it and set specific quota per resource type. */ #define DPRC_CFG_OPT_ALLOC_ALLOWED 0x00000002 /* Object initialization allowed - software context associated with this * container is allowed to invoke object initialization operations. */ #define DPRC_CFG_OPT_OBJ_CREATE_ALLOWED 0x00000004 /* Topology change allowed - software context associated with this * container is allowed to invoke topology operations, such as attach/detach * of network objects. */ #define DPRC_CFG_OPT_TOPOLOGY_CHANGES_ALLOWED 0x00000008 /* AIOP - Indicates that container belongs to AIOP. */ #define DPRC_CFG_OPT_AIOP 0x00000020 /* IRQ Config - Indicates that the container allowed to configure its IRQs.*/ #define DPRC_CFG_OPT_IRQ_CFG_ALLOWED 0x00000040 /** * struct dprc_cfg - Container configuration options * @icid: Container's ICID; if set to 'DPRC_GET_ICID_FROM_POOL', a free * ICID value is allocated by the DPRC * @portal_id: Portal ID; if set to 'DPRC_GET_PORTAL_ID_FROM_POOL', a free * portal ID is allocated by the DPRC * @options: Combination of 'DPRC_CFG_OPT_' options * @label: Object's label */ struct dprc_cfg { u16 icid; int portal_id; uint64_t options; char label[16]; }; int dprc_create_container(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, struct dprc_cfg *cfg, int *child_container_id, uint64_t *child_portal_offset); int dprc_destroy_container(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, int child_container_id); /** * struct dprc_connection_cfg - Connection configuration. * Used for virtual connections only * @committed_rate: Committed rate (Mbits/s) * @max_rate: Maximum rate (Mbits/s) */ struct dprc_connection_cfg { u32 committed_rate; u32 max_rate; }; /** * struct dprc_endpoint - Endpoint description for link connect/disconnect * operations * @type: Endpoint object type: NULL terminated string * @id: Endpoint object ID * @if_id: Interface ID; should be set for endpoints with multiple * interfaces ("dpsw", "dpdmux"); for others, always set to 0 */ struct dprc_endpoint { char type[16]; int id; u16 if_id; }; int dprc_connect(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, const struct dprc_endpoint *endpoint1, const struct dprc_endpoint *endpoint2, const struct dprc_connection_cfg *cfg); int dprc_disconnect(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, const struct dprc_endpoint *endpoint); int dprc_get_connection(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, const struct dprc_endpoint *endpoint1, struct dprc_endpoint *endpoint2, int *state); int dprc_get_api_version(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 *major_ver, u16 *minor_ver); #endif /* _FSL_DPRC_H */