1f2835adfSPeng Ma /* SPDX-License-Identifier: GPL-2.0 */ 2f2835adfSPeng Ma /* Copyright 2019 NXP */ 3f2835adfSPeng Ma 4f2835adfSPeng Ma #ifndef __FSL_DPDMAI_H 5f2835adfSPeng Ma #define __FSL_DPDMAI_H 6f2835adfSPeng Ma 7f2835adfSPeng Ma /* DPDMAI Version */ 8f2835adfSPeng Ma #define DPDMAI_VER_MAJOR 2 9f2835adfSPeng Ma #define DPDMAI_VER_MINOR 2 10f2835adfSPeng Ma 11f2835adfSPeng Ma #define DPDMAI_CMD_BASE_VERSION 0 12f2835adfSPeng Ma #define DPDMAI_CMD_ID_OFFSET 4 13f2835adfSPeng Ma 14f2835adfSPeng Ma #define DPDMAI_CMDID_FORMAT(x) (((x) << DPDMAI_CMD_ID_OFFSET) | \ 15f2835adfSPeng Ma DPDMAI_CMD_BASE_VERSION) 16f2835adfSPeng Ma 17f2835adfSPeng Ma /* Command IDs */ 18f2835adfSPeng Ma #define DPDMAI_CMDID_CLOSE DPDMAI_CMDID_FORMAT(0x800) 19f2835adfSPeng Ma #define DPDMAI_CMDID_OPEN DPDMAI_CMDID_FORMAT(0x80E) 20f2835adfSPeng Ma #define DPDMAI_CMDID_CREATE DPDMAI_CMDID_FORMAT(0x90E) 21*3e0ca3c3SPeng Ma #define DPDMAI_CMDID_DESTROY DPDMAI_CMDID_FORMAT(0x900) 22f2835adfSPeng Ma 23f2835adfSPeng Ma #define DPDMAI_CMDID_ENABLE DPDMAI_CMDID_FORMAT(0x002) 24f2835adfSPeng Ma #define DPDMAI_CMDID_DISABLE DPDMAI_CMDID_FORMAT(0x003) 25f2835adfSPeng Ma #define DPDMAI_CMDID_GET_ATTR DPDMAI_CMDID_FORMAT(0x004) 26f2835adfSPeng Ma #define DPDMAI_CMDID_RESET DPDMAI_CMDID_FORMAT(0x005) 27f2835adfSPeng Ma #define DPDMAI_CMDID_IS_ENABLED DPDMAI_CMDID_FORMAT(0x006) 28f2835adfSPeng Ma 29f2835adfSPeng Ma #define DPDMAI_CMDID_SET_IRQ DPDMAI_CMDID_FORMAT(0x010) 30f2835adfSPeng Ma #define DPDMAI_CMDID_GET_IRQ DPDMAI_CMDID_FORMAT(0x011) 31f2835adfSPeng Ma #define DPDMAI_CMDID_SET_IRQ_ENABLE DPDMAI_CMDID_FORMAT(0x012) 32f2835adfSPeng Ma #define DPDMAI_CMDID_GET_IRQ_ENABLE DPDMAI_CMDID_FORMAT(0x013) 33f2835adfSPeng Ma #define DPDMAI_CMDID_SET_IRQ_MASK DPDMAI_CMDID_FORMAT(0x014) 34f2835adfSPeng Ma #define DPDMAI_CMDID_GET_IRQ_MASK DPDMAI_CMDID_FORMAT(0x015) 35f2835adfSPeng Ma #define DPDMAI_CMDID_GET_IRQ_STATUS DPDMAI_CMDID_FORMAT(0x016) 36f2835adfSPeng Ma #define DPDMAI_CMDID_CLEAR_IRQ_STATUS DPDMAI_CMDID_FORMAT(0x017) 37f2835adfSPeng Ma 38f2835adfSPeng Ma #define DPDMAI_CMDID_SET_RX_QUEUE DPDMAI_CMDID_FORMAT(0x1A0) 39f2835adfSPeng Ma #define DPDMAI_CMDID_GET_RX_QUEUE DPDMAI_CMDID_FORMAT(0x1A1) 40f2835adfSPeng Ma #define DPDMAI_CMDID_GET_TX_QUEUE DPDMAI_CMDID_FORMAT(0x1A2) 41f2835adfSPeng Ma 42f2835adfSPeng Ma #define MC_CMD_HDR_TOKEN_O 32 /* Token field offset */ 43f2835adfSPeng Ma #define MC_CMD_HDR_TOKEN_S 16 /* Token field size */ 44f2835adfSPeng Ma 45f2835adfSPeng Ma #define MAKE_UMASK64(_width) \ 46f2835adfSPeng Ma ((u64)((_width) < 64 ? ((u64)1 << (_width)) - 1 : (u64)-1)) 47f2835adfSPeng Ma 48f2835adfSPeng Ma /* Data Path DMA Interface API 49f2835adfSPeng Ma * Contains initialization APIs and runtime control APIs for DPDMAI 50f2835adfSPeng Ma */ 51f2835adfSPeng Ma 52f2835adfSPeng Ma /** 53f2835adfSPeng Ma * Maximum number of Tx/Rx priorities per DPDMAI object 54f2835adfSPeng Ma */ 55f2835adfSPeng Ma #define DPDMAI_PRIO_NUM 2 56f2835adfSPeng Ma 57f2835adfSPeng Ma /* DPDMAI queue modification options */ 58f2835adfSPeng Ma 59f2835adfSPeng Ma /** 60f2835adfSPeng Ma * Select to modify the user's context associated with the queue 61f2835adfSPeng Ma */ 62f2835adfSPeng Ma #define DPDMAI_QUEUE_OPT_USER_CTX 0x1 63f2835adfSPeng Ma 64f2835adfSPeng Ma /** 65f2835adfSPeng Ma * Select to modify the queue's destination 66f2835adfSPeng Ma */ 67f2835adfSPeng Ma #define DPDMAI_QUEUE_OPT_DEST 0x2 68f2835adfSPeng Ma 69f2835adfSPeng Ma /** 70f2835adfSPeng Ma * struct dpdmai_cfg - Structure representing DPDMAI configuration 71f2835adfSPeng Ma * @priorities: Priorities for the DMA hardware processing; valid priorities are 72f2835adfSPeng Ma * configured with values 1-8; the entry following last valid entry 73f2835adfSPeng Ma * should be configured with 0 74f2835adfSPeng Ma */ 75f2835adfSPeng Ma struct dpdmai_cfg { 76f2835adfSPeng Ma u8 priorities[DPDMAI_PRIO_NUM]; 77f2835adfSPeng Ma }; 78f2835adfSPeng Ma 79f2835adfSPeng Ma /** 80f2835adfSPeng Ma * struct dpdmai_attr - Structure representing DPDMAI attributes 81f2835adfSPeng Ma * @id: DPDMAI object ID 82f2835adfSPeng Ma * @version: DPDMAI version 83f2835adfSPeng Ma * @num_of_priorities: number of priorities 84f2835adfSPeng Ma */ 85f2835adfSPeng Ma struct dpdmai_attr { 86f2835adfSPeng Ma int id; 87f2835adfSPeng Ma /** 88f2835adfSPeng Ma * struct version - DPDMAI version 89f2835adfSPeng Ma * @major: DPDMAI major version 90f2835adfSPeng Ma * @minor: DPDMAI minor version 91f2835adfSPeng Ma */ 92f2835adfSPeng Ma struct { 93f2835adfSPeng Ma u16 major; 94f2835adfSPeng Ma u16 minor; 95f2835adfSPeng Ma } version; 96f2835adfSPeng Ma u8 num_of_priorities; 97f2835adfSPeng Ma }; 98f2835adfSPeng Ma 99f2835adfSPeng Ma /** 100f2835adfSPeng Ma * enum dpdmai_dest - DPDMAI destination types 101f2835adfSPeng Ma * @DPDMAI_DEST_NONE: Unassigned destination; The queue is set in parked mode 102f2835adfSPeng Ma * and does not generate FQDAN notifications; user is expected to dequeue 103f2835adfSPeng Ma * from the queue based on polling or other user-defined method 104f2835adfSPeng Ma * @DPDMAI_DEST_DPIO: The queue is set in schedule mode and generates FQDAN 105f2835adfSPeng Ma * notifications to the specified DPIO; user is expected to dequeue 106f2835adfSPeng Ma * from the queue only after notification is received 107f2835adfSPeng Ma * @DPDMAI_DEST_DPCON: The queue is set in schedule mode and does not generate 108f2835adfSPeng Ma * FQDAN notifications, but is connected to the specified DPCON object; 109f2835adfSPeng Ma * user is expected to dequeue from the DPCON channel 110f2835adfSPeng Ma */ 111f2835adfSPeng Ma enum dpdmai_dest { 112f2835adfSPeng Ma DPDMAI_DEST_NONE = 0, 113f2835adfSPeng Ma DPDMAI_DEST_DPIO = 1, 114f2835adfSPeng Ma DPDMAI_DEST_DPCON = 2 115f2835adfSPeng Ma }; 116f2835adfSPeng Ma 117f2835adfSPeng Ma /** 118f2835adfSPeng Ma * struct dpdmai_dest_cfg - Structure representing DPDMAI destination parameters 119f2835adfSPeng Ma * @dest_type: Destination type 120f2835adfSPeng Ma * @dest_id: Either DPIO ID or DPCON ID, depending on the destination type 121f2835adfSPeng Ma * @priority: Priority selection within the DPIO or DPCON channel; valid values 122f2835adfSPeng Ma * are 0-1 or 0-7, depending on the number of priorities in that 123f2835adfSPeng Ma * channel; not relevant for 'DPDMAI_DEST_NONE' option 124f2835adfSPeng Ma */ 125f2835adfSPeng Ma struct dpdmai_dest_cfg { 126f2835adfSPeng Ma enum dpdmai_dest dest_type; 127f2835adfSPeng Ma int dest_id; 128f2835adfSPeng Ma u8 priority; 129f2835adfSPeng Ma }; 130f2835adfSPeng Ma 131f2835adfSPeng Ma /** 132f2835adfSPeng Ma * struct dpdmai_rx_queue_cfg - DPDMAI RX queue configuration 133f2835adfSPeng Ma * @options: Flags representing the suggested modifications to the queue; 134f2835adfSPeng Ma * Use any combination of 'DPDMAI_QUEUE_OPT_<X>' flags 135f2835adfSPeng Ma * @user_ctx: User context value provided in the frame descriptor of each 136f2835adfSPeng Ma * dequeued frame; 137f2835adfSPeng Ma * valid only if 'DPDMAI_QUEUE_OPT_USER_CTX' is contained in 'options' 138f2835adfSPeng Ma * @dest_cfg: Queue destination parameters; 139f2835adfSPeng Ma * valid only if 'DPDMAI_QUEUE_OPT_DEST' is contained in 'options' 140f2835adfSPeng Ma */ 141f2835adfSPeng Ma struct dpdmai_rx_queue_cfg { 142f2835adfSPeng Ma struct dpdmai_dest_cfg dest_cfg; 143f2835adfSPeng Ma u32 options; 144f2835adfSPeng Ma u64 user_ctx; 145f2835adfSPeng Ma 146f2835adfSPeng Ma }; 147f2835adfSPeng Ma 148f2835adfSPeng Ma /** 149f2835adfSPeng Ma * struct dpdmai_rx_queue_attr - Structure representing attributes of Rx queues 150f2835adfSPeng Ma * @user_ctx: User context value provided in the frame descriptor of each 151f2835adfSPeng Ma * dequeued frame 152f2835adfSPeng Ma * @dest_cfg: Queue destination configuration 153f2835adfSPeng Ma * @fqid: Virtual FQID value to be used for dequeue operations 154f2835adfSPeng Ma */ 155f2835adfSPeng Ma struct dpdmai_rx_queue_attr { 156f2835adfSPeng Ma struct dpdmai_dest_cfg dest_cfg; 157f2835adfSPeng Ma u64 user_ctx; 158f2835adfSPeng Ma u32 fqid; 159f2835adfSPeng Ma }; 160f2835adfSPeng Ma 161f2835adfSPeng Ma int dpdmai_open(struct fsl_mc_io *mc_io, u32 cmd_flags, 162f2835adfSPeng Ma int dpdmai_id, u16 *token); 163f2835adfSPeng Ma int dpdmai_close(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token); 164*3e0ca3c3SPeng Ma int dpdmai_destroy(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token); 165f2835adfSPeng Ma int dpdmai_create(struct fsl_mc_io *mc_io, u32 cmd_flags, 166f2835adfSPeng Ma const struct dpdmai_cfg *cfg, u16 *token); 167f2835adfSPeng Ma int dpdmai_enable(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token); 168f2835adfSPeng Ma int dpdmai_disable(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token); 169f2835adfSPeng Ma int dpdmai_reset(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token); 170f2835adfSPeng Ma int dpdmai_get_attributes(struct fsl_mc_io *mc_io, u32 cmd_flags, 171f2835adfSPeng Ma u16 token, struct dpdmai_attr *attr); 172f2835adfSPeng Ma int dpdmai_set_rx_queue(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 173f2835adfSPeng Ma u8 priority, const struct dpdmai_rx_queue_cfg *cfg); 174f2835adfSPeng Ma int dpdmai_get_rx_queue(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 175f2835adfSPeng Ma u8 priority, struct dpdmai_rx_queue_attr *attr); 176f2835adfSPeng Ma int dpdmai_get_tx_queue(struct fsl_mc_io *mc_io, u32 cmd_flags, 177f2835adfSPeng Ma u16 token, u8 priority, u32 *fqid); 178f2835adfSPeng Ma 179f2835adfSPeng Ma #endif /* __FSL_DPDMAI_H */ 180